From e0fed946ec39298a2388f4a4bd9c22446d10d86d Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 26 Jun 2026 09:24:14 +0200 Subject: [PATCH 1/7] all except VarManager --- Common/Core/fwdtrackUtilities.h | 16 +- PWGDQ/Core/MixingHandler.cxx | 2 +- PWGDQ/Core/MixingHandler.h | 1 - PWGEM/Dilepton/Core/EMEventCut.h | 2 +- PWGEM/Dilepton/DataModel/EvSelFlags.h | 40 +++++ PWGEM/Dilepton/DataModel/dileptonTables.h | 31 +--- PWGEM/PhotonMeson/Core/DalitzEECut.h | 16 +- PWGEM/PhotonMeson/Core/EMCPhotonCut.cxx | 47 ++++++ PWGEM/PhotonMeson/Core/EMCPhotonCut.h | 82 ++-------- PWGEM/PhotonMeson/Core/PHOSPhotonCut.h | 8 +- PWGEM/PhotonMeson/Core/V0PhotonCut.h | 23 +-- PWGEM/PhotonMeson/Tasks/photonhbt.cxx | 2 +- PWGEM/PhotonMeson/Utils/ClusterHistograms.h | 2 +- PWGEM/PhotonMeson/Utils/TrackSelection.h | 61 +++++--- PWGJE/Core/CMakeLists.txt | 1 - PWGUD/Core/decayTree.cxx | 158 +++++++++++++++++++ PWGUD/Core/decayTree.h | 165 +------------------- Tutorials/src/histogramRegistry.cxx | 58 +++---- 18 files changed, 386 insertions(+), 329 deletions(-) create mode 100644 PWGEM/Dilepton/DataModel/EvSelFlags.h diff --git a/Common/Core/fwdtrackUtilities.h b/Common/Core/fwdtrackUtilities.h index 53d5f74f931..a178f4fc831 100644 --- a/Common/Core/fwdtrackUtilities.h +++ b/Common/Core/fwdtrackUtilities.h @@ -18,7 +18,6 @@ #ifndef COMMON_CORE_FWDTRACKUTILITIES_H_ #define COMMON_CORE_FWDTRACKUTILITIES_H_ -#include #include #include #include @@ -48,6 +47,17 @@ using SMatrix55 = ROOT::Math::SMatrix; using SMatrix5 = ROOT::Math::SVector; +template +concept is_fwd_track = requires (T t) { + { t.rAtAbsorberEnd() } -> std::same_as; +}; + +template +concept is_fwd_cov = requires (T t) +{ + { t.sigmaX() } -> std::same_as; +}; + /// Produce TrackParCovFwds for MFT and FwdTracks, w/ or w/o cov, with z shift template o2::track::TrackParCovFwd getTrackParCovFwdShift(TFwdTrack const& track, float zshift, TCovariance const&... covOpt) @@ -55,7 +65,7 @@ o2::track::TrackParCovFwd getTrackParCovFwdShift(TFwdTrack const& track, float z double chi2 = track.chi2(); if constexpr (sizeof...(covOpt) == 0) { // No covariance passed - if constexpr (std::is_same_v, aod::FwdTracks::iterator>) { + if constexpr (is_fwd_track) { if (track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { chi2 = track.chi2() * (2.f * track.nClusters() - 5.f); } @@ -63,7 +73,7 @@ o2::track::TrackParCovFwd getTrackParCovFwdShift(TFwdTrack const& track, float z } else { // Covariance passed using TCov = std::decay_t; - if constexpr (std::is_same_v) { + if constexpr (is_fwd_cov) { if (track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { chi2 = track.chi2() * (2.f * track.nClusters() - 5.f); } diff --git a/PWGDQ/Core/MixingHandler.cxx b/PWGDQ/Core/MixingHandler.cxx index 5b769fed65d..26ebad8d50c 100644 --- a/PWGDQ/Core/MixingHandler.cxx +++ b/PWGDQ/Core/MixingHandler.cxx @@ -11,7 +11,7 @@ #include "PWGDQ/Core/MixingHandler.h" -#include "PWGDQ/Core/VarManager.h" +#include "PWGDQ/Core/VarManagerCore.h" #include #include diff --git a/PWGDQ/Core/MixingHandler.h b/PWGDQ/Core/MixingHandler.h index d7a16ef122d..1b0cedaea5c 100644 --- a/PWGDQ/Core/MixingHandler.h +++ b/PWGDQ/Core/MixingHandler.h @@ -24,7 +24,6 @@ #include -#include #include #include #include diff --git a/PWGEM/Dilepton/Core/EMEventCut.h b/PWGEM/Dilepton/Core/EMEventCut.h index b0450f5b575..d9671356e24 100644 --- a/PWGEM/Dilepton/Core/EMEventCut.h +++ b/PWGEM/Dilepton/Core/EMEventCut.h @@ -16,7 +16,7 @@ #ifndef PWGEM_DILEPTON_CORE_EMEVENTCUT_H_ #define PWGEM_DILEPTON_CORE_EMEVENTCUT_H_ -#include "PWGEM/Dilepton/DataModel/dileptonTables.h" +#include "PWGEM/Dilepton/DataModel/EvSelFlags.h" #include diff --git a/PWGEM/Dilepton/DataModel/EvSelFlags.h b/PWGEM/Dilepton/DataModel/EvSelFlags.h new file mode 100644 index 00000000000..0b05ff288eb --- /dev/null +++ b/PWGEM/Dilepton/DataModel/EvSelFlags.h @@ -0,0 +1,40 @@ +// Copyright 2019-2026 CERN and copyright holders 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 PWGEM_DILEPTON_CORE_EVSELFLAGS_H +#define PWGEM_DILEPTON_CORE_EVSELFLAGS_H + +namespace o2::aod::emevsel +{ +// Event selection criteria. See O2Physics/Common/CCDB/EventSelectionParams.h +enum EventSelectionFlags { + kIsTriggerTVX = 0, // FT0 vertex (acceptable FT0C-FT0A time difference) at trigger level + 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 +}; +} // namespace o2::aod::emevsel + +#endif // PWGEM_DILEPTON_CORE_EVSELFLAGS_H diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index aa65acc3893..2e4c94c3a49 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -9,14 +9,16 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +#include "EvSelFlags.h" + #include "Common/CCDB/EventSelectionParams.h" #include "Common/Core/RecoDecay.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponseTOF.h" #include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/TrackSelectionTables.h" +#include +#include +#include #include #include @@ -66,28 +68,6 @@ namespace o2::aod namespace emevsel { -// Event selection criteria. See O2Physics/Common/CCDB/EventSelectionParams.h -enum EventSelectionFlags { - kIsTriggerTVX = 0, // FT0 vertex (acceptable FT0C-FT0A time difference) at trigger level - 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 -}; - DECLARE_SOA_BITMAP_COLUMN(Selection, selection, 32); //! Bitmask of selection flags DECLARE_SOA_DYNAMIC_COLUMN(Sel8, sel8, [](uint32_t selection_bit) -> bool { return (selection_bit & BIT(o2::aod::emevsel::kIsTriggerTVX)) && (selection_bit & BIT(o2::aod::emevsel::kNoTimeFrameBorder)) && (selection_bit & BIT(o2::aod::emevsel::kNoITSROFrameBorder)); }); @@ -149,7 +129,6 @@ uint32_t reduceSelectionBit(TBC const& bc) } return bitMap; } - } // namespace emevsel namespace emevent diff --git a/PWGEM/PhotonMeson/Core/DalitzEECut.h b/PWGEM/PhotonMeson/Core/DalitzEECut.h index 293a52424c0..94b13b32612 100644 --- a/PWGEM/PhotonMeson/Core/DalitzEECut.h +++ b/PWGEM/PhotonMeson/Core/DalitzEECut.h @@ -18,9 +18,9 @@ #include "PWGEM/Dilepton/Utils/EMTrackUtilities.h" #include "PWGEM/Dilepton/Utils/PairUtilities.h" +#include "PWGEM/PhotonMeson/Utils/TrackSelection.h" #include -#include #include // IWYU pragma: keep (do not replace with Math/Vector4Dfwd.h) #include @@ -71,7 +71,7 @@ class DalitzEECut : public TNamed kTPConly = 1, }; - template + template bool IsSelected(TTrack1 const& t1, TTrack2 const& t2, float bz) const { if (!IsSelectedTrack(t1) || !IsSelectedTrack(t2)) { @@ -85,7 +85,7 @@ class DalitzEECut : public TNamed return true; } - template + template bool IsSelectedPair(TTrack1 const& t1, TTrack2 const& t2, const float bz) const { ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassElectron); @@ -107,7 +107,7 @@ class DalitzEECut : public TNamed return true; } - template + template bool IsSelectedTrack(TTrack const& track, TCollision const& = 0) const { if (!track.hasITS()) { @@ -193,7 +193,7 @@ class DalitzEECut : public TNamed return true; } - template + template bool PassPID(T const& track) const { switch (mPIDScheme) { @@ -211,7 +211,7 @@ class DalitzEECut : public TNamed } } - template + template bool PassTPConly(T const& track) const { bool is_el_included_TPC = mMinTPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < mMaxTPCNsigmaEl; @@ -219,7 +219,7 @@ class DalitzEECut : public TNamed return is_el_included_TPC && is_pi_excluded_TPC; } - template + template bool PassTOFif(T const& track) const { bool is_el_included_TPC = mMinTPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < mMaxTPCNsigmaEl; @@ -228,7 +228,7 @@ class DalitzEECut : public TNamed return is_el_included_TPC && is_pi_excluded_TPC && is_el_included_TOF; } - template + template bool IsSelectedTrack(T const& track, const DalitzEECuts& cut) const { switch (cut) { diff --git a/PWGEM/PhotonMeson/Core/EMCPhotonCut.cxx b/PWGEM/PhotonMeson/Core/EMCPhotonCut.cxx index 9e75d9e558e..e10d0398c7a 100644 --- a/PWGEM/PhotonMeson/Core/EMCPhotonCut.cxx +++ b/PWGEM/PhotonMeson/Core/EMCPhotonCut.cxx @@ -17,6 +17,7 @@ #include "PWGJE/DataModel/EMCALClusters.h" +#include #include #include @@ -27,6 +28,52 @@ ClassImp(EMCPhotonCut); const char* EMCPhotonCut::mCutNames[static_cast(EMCPhotonCut::EMCPhotonCuts::kNCuts)] = {"Definition", "Energy", "NCell", "M02", "Timing", "TrackMatching", "SecTrackMatching", "Exotic"}; +void EMCPhotonCut::addQAHistograms(o2::framework::HistogramRegistry* fRegistry) const +{ + if (mDoQA && fRegistry != nullptr) { + const o2::framework::AxisSpec thAxisClusterEnergy{500, 0, 50, "#it{E}_{cls} (GeV)"}; + const o2::framework::AxisSpec thAxisMomentum{250, 0., 25., "#it{p}_{T} (GeV/#it{c})"}; + const o2::framework::AxisSpec thAxisDEta{200, -0.1, 0.1, "#Delta#eta"}; + const o2::framework::AxisSpec thAxisDPhi{200, -0.1, 0.1, "#Delta#varphi (rad)"}; + const o2::framework::AxisSpec thAxisEnergy{500, 0., 50., "#it{E} (GeV)"}; + const o2::framework::AxisSpec thAxisEta{320, -0.8, 0.8, "#eta"}; + const o2::framework::AxisSpec thAxisPhi{500, 0, o2::constants::math::TwoPI, "#varphi (rad)"}; + const o2::framework::AxisSpec thAxisNCell{51, -0.5, 50.5, "#it{N}_{cell}"}; + const o2::framework::AxisSpec thAxisM02{200, 0, 2.0, "#it{M}_{02}"}; + const o2::framework::AxisSpec thAxisTime{300, -150, +150, "#it{t}_{cls} (ns)"}; + const o2::framework::AxisSpec thAxisEoverP{400, 0, 10., "#it{E}_{cls}/#it{p}_{track} (#it{c})"}; + + fRegistry->add("QA/Cluster/before/hE", "E_{cluster};#it{E}_{cluster} (GeV);#it{N}_{cluster}", o2::framework::HistType::kTH1D, {thAxisClusterEnergy}, true); + fRegistry->add("QA/Cluster/before/hPt", "Transverse momenta of clusters;#it{p}_{T} (GeV/c);#it{N}_{cluster}", o2::framework::HistType::kTH1D, {thAxisClusterEnergy}, true); + fRegistry->add("QA/Cluster/before/hNgamma", "Number of #gamma candidates per collision;#it{N}_{#gamma} per collision;#it{N}_{collisions}", o2::framework::HistType::kTH1D, {{1001, -0.5f, 1000.5f}}, true); + fRegistry->add("QA/Cluster/before/hEtaPhi", "#eta vs #varphi;#eta;#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisEta, thAxisPhi}, true); + fRegistry->add("QA/Cluster/before/hNCell", "#it{N}_{cells};N_{cells} (GeV);#it{E}_{cluster} (GeV)", o2::framework::HistType::kTH2F, {thAxisNCell, thAxisClusterEnergy}, true); + fRegistry->add("QA/Cluster/before/hM02", "Long ellipse axis;#it{M}_{02} (cm);#it{E}_{cluster} (GeV)", o2::framework::HistType::kTH2F, {thAxisM02, thAxisClusterEnergy}, true); + fRegistry->add("QA/Cluster/before/hTime", "Cluster time;#it{t}_{cls} (ns);#it{E}_{cluster} (GeV)", o2::framework::HistType::kTH2F, {thAxisTime, thAxisClusterEnergy}, true); + + fRegistry->addClone("QA/Cluster/before/", "QA/Cluster/after/"); + + auto hClusterQualityCuts = fRegistry->add("QA/Cluster/hClusterQualityCuts", "Energy at which clusters are removed by a given cut;;#it{E} (GeV)", o2::framework::HistType::kTH2F, {{static_cast(EMCPhotonCut::EMCPhotonCuts::kNCuts) + 2, -0.5, static_cast(EMCPhotonCut::EMCPhotonCuts::kNCuts) + 1.5}, thAxisClusterEnergy}, true); + hClusterQualityCuts->GetXaxis()->SetBinLabel(1, "In"); + hClusterQualityCuts->GetXaxis()->SetBinLabel(2, "Definition"); + hClusterQualityCuts->GetXaxis()->SetBinLabel(3, "Energy"); + hClusterQualityCuts->GetXaxis()->SetBinLabel(4, "NCell"); + hClusterQualityCuts->GetXaxis()->SetBinLabel(5, "M02"); + hClusterQualityCuts->GetXaxis()->SetBinLabel(6, "Timing"); + hClusterQualityCuts->GetXaxis()->SetBinLabel(7, "TM"); + hClusterQualityCuts->GetXaxis()->SetBinLabel(8, "Sec. TM"); + hClusterQualityCuts->GetXaxis()->SetBinLabel(9, "Exotic"); + hClusterQualityCuts->GetXaxis()->SetBinLabel(10, "Out"); + + fRegistry->add("QA/Cluster/hTrackdEtadPhi", "d#eta vs. d#varphi of matched tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDEta, thAxisDPhi}, true); + fRegistry->add("QA/Cluster/hTrackdEtaPt", "d#eta vs. track pT of matched tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDEta, thAxisMomentum}, true); + fRegistry->add("QA/Cluster/hTrackdPhiPt", "d#varphi vs. track pT of matched tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDPhi, thAxisMomentum}, true); + fRegistry->add("QA/Cluster/hSecTrackdEtadPhi", "d#eta vs. d#varphi of matched secondary tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDEta, thAxisDPhi}, true); + fRegistry->add("QA/Cluster/hSecTrackdEtaPt", "d#eta vs. track pT of matched secondary tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDEta, thAxisMomentum}, true); + fRegistry->add("QA/Cluster/hSecTrackdPhiPt", "d#varphi vs. track pT of matched secondary tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDPhi, thAxisMomentum}, true); + } +} + void EMCPhotonCut::SetClusterizer(std::string clusterDefinitionString) { mDefinition = static_cast(o2::aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionString)); diff --git a/PWGEM/PhotonMeson/Core/EMCPhotonCut.h b/PWGEM/PhotonMeson/Core/EMCPhotonCut.h index bba559ed8cb..d22f19ef786 100644 --- a/PWGEM/PhotonMeson/Core/EMCPhotonCut.h +++ b/PWGEM/PhotonMeson/Core/EMCPhotonCut.h @@ -17,10 +17,9 @@ #define PWGEM_PHOTONMESON_CORE_EMCPHOTONCUT_H_ #include "PWGEM/PhotonMeson/Core/EMBitFlags.h" -#include "PWGEM/PhotonMeson/DataModel/gammaTables.h" +#include "PWGEM/PhotonMeson/Utils/TrackSelection.h" #include -#include #include #include @@ -39,9 +38,6 @@ #include #include -template -concept is_optional_table = o2::soa::is_table || std::is_same_v; - template static constexpr bool HasPrimaries = !std::is_same_v; @@ -49,21 +45,21 @@ template static constexpr bool HasSecondaries = !std::is_same_v; template -concept IsNonLinIterator = o2::soa::is_iterator && requires(T t) { +concept IsNonLinIterator = requires(T t) { // Check that the *elements* of the container have the required methods: { t.corrE() } -> std::same_as; { t.corrPt() } -> std::same_as; }; template -concept IsNonLinContainer = o2::soa::is_table && requires(T t) { +concept IsNonLinContainer = requires(T t) { // Check that the *elements* of the container have the required methods: { t.begin().corrE() } -> std::same_as; { t.begin().corrPt() } -> std::same_as; }; template -concept IsTrackIterator = o2::soa::is_iterator && requires(T t) { +concept IsTrackIterator = requires(T t) { // Check that the *elements* of the container have the required methods: { t.deltaEta() } -> std::same_as; { t.deltaPhi() } -> std::same_as; @@ -72,7 +68,7 @@ concept IsTrackIterator = o2::soa::is_iterator && requires(T t) { }; template -concept IsTrackContainer = o2::soa::is_table && requires(T t) { +concept IsTrackContainer = requires(T t) { // Check that the *elements* of the container have the required methods: { t.begin().deltaEta() } -> std::same_as; { t.begin().deltaPhi() } -> std::same_as; @@ -82,7 +78,6 @@ concept IsTrackContainer = o2::soa::is_table && requires(T t) { template concept HasTrackMatching = - o2::soa::is_iterator && requires(Cluster cluster) { // requires that the following are valid calls: { cluster.deltaEta() } -> std::convertible_to>; @@ -93,7 +88,6 @@ concept HasTrackMatching = template concept HasSecondaryMatching = - o2::soa::is_iterator && requires(Cluster cluster) { // requires that the following are valid calls: { cluster.deltaEtaSec() } -> std::convertible_to>; @@ -135,7 +129,7 @@ class EMCPhotonCut : public TNamed static const char* mCutNames[static_cast(EMCPhotonCuts::kNCuts)]; - static constexpr auto getClusterId(o2::soa::is_iterator auto const& t) + static constexpr auto getClusterId(IsTrackIterator auto const& t) { if constexpr (requires { t.emEmcClusterId(); }) { return t.emEmcClusterId(); @@ -148,51 +142,7 @@ class EMCPhotonCut : public TNamed /// \brief add histograms to registry /// \param fRegistry pointer to histogram registry - void addQAHistograms(o2::framework::HistogramRegistry* fRegistry = nullptr) const - { - if (mDoQA && fRegistry != nullptr) { - const o2::framework::AxisSpec thAxisClusterEnergy{500, 0, 50, "#it{E}_{cls} (GeV)"}; - const o2::framework::AxisSpec thAxisMomentum{250, 0., 25., "#it{p}_{T} (GeV/#it{c})"}; - const o2::framework::AxisSpec thAxisDEta{200, -0.1, 0.1, "#Delta#eta"}; - const o2::framework::AxisSpec thAxisDPhi{200, -0.1, 0.1, "#Delta#varphi (rad)"}; - const o2::framework::AxisSpec thAxisEnergy{500, 0., 50., "#it{E} (GeV)"}; - const o2::framework::AxisSpec thAxisEta{320, -0.8, 0.8, "#eta"}; - const o2::framework::AxisSpec thAxisPhi{500, 0, o2::constants::math::TwoPI, "#varphi (rad)"}; - const o2::framework::AxisSpec thAxisNCell{51, -0.5, 50.5, "#it{N}_{cell}"}; - const o2::framework::AxisSpec thAxisM02{200, 0, 2.0, "#it{M}_{02}"}; - const o2::framework::AxisSpec thAxisTime{300, -150, +150, "#it{t}_{cls} (ns)"}; - const o2::framework::AxisSpec thAxisEoverP{400, 0, 10., "#it{E}_{cls}/#it{p}_{track} (#it{c})"}; - - fRegistry->add("QA/Cluster/before/hE", "E_{cluster};#it{E}_{cluster} (GeV);#it{N}_{cluster}", o2::framework::HistType::kTH1D, {thAxisClusterEnergy}, true); - fRegistry->add("QA/Cluster/before/hPt", "Transverse momenta of clusters;#it{p}_{T} (GeV/c);#it{N}_{cluster}", o2::framework::HistType::kTH1D, {thAxisClusterEnergy}, true); - fRegistry->add("QA/Cluster/before/hNgamma", "Number of #gamma candidates per collision;#it{N}_{#gamma} per collision;#it{N}_{collisions}", o2::framework::HistType::kTH1D, {{1001, -0.5f, 1000.5f}}, true); - fRegistry->add("QA/Cluster/before/hEtaPhi", "#eta vs #varphi;#eta;#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisEta, thAxisPhi}, true); - fRegistry->add("QA/Cluster/before/hNCell", "#it{N}_{cells};N_{cells} (GeV);#it{E}_{cluster} (GeV)", o2::framework::HistType::kTH2F, {thAxisNCell, thAxisClusterEnergy}, true); - fRegistry->add("QA/Cluster/before/hM02", "Long ellipse axis;#it{M}_{02} (cm);#it{E}_{cluster} (GeV)", o2::framework::HistType::kTH2F, {thAxisM02, thAxisClusterEnergy}, true); - fRegistry->add("QA/Cluster/before/hTime", "Cluster time;#it{t}_{cls} (ns);#it{E}_{cluster} (GeV)", o2::framework::HistType::kTH2F, {thAxisTime, thAxisClusterEnergy}, true); - - fRegistry->addClone("QA/Cluster/before/", "QA/Cluster/after/"); - - auto hClusterQualityCuts = fRegistry->add("QA/Cluster/hClusterQualityCuts", "Energy at which clusters are removed by a given cut;;#it{E} (GeV)", o2::framework::HistType::kTH2F, {{static_cast(EMCPhotonCut::EMCPhotonCuts::kNCuts) + 2, -0.5, static_cast(EMCPhotonCut::EMCPhotonCuts::kNCuts) + 1.5}, thAxisClusterEnergy}, true); - hClusterQualityCuts->GetXaxis()->SetBinLabel(1, "In"); - hClusterQualityCuts->GetXaxis()->SetBinLabel(2, "Definition"); - hClusterQualityCuts->GetXaxis()->SetBinLabel(3, "Energy"); - hClusterQualityCuts->GetXaxis()->SetBinLabel(4, "NCell"); - hClusterQualityCuts->GetXaxis()->SetBinLabel(5, "M02"); - hClusterQualityCuts->GetXaxis()->SetBinLabel(6, "Timing"); - hClusterQualityCuts->GetXaxis()->SetBinLabel(7, "TM"); - hClusterQualityCuts->GetXaxis()->SetBinLabel(8, "Sec. TM"); - hClusterQualityCuts->GetXaxis()->SetBinLabel(9, "Exotic"); - hClusterQualityCuts->GetXaxis()->SetBinLabel(10, "Out"); - - fRegistry->add("QA/Cluster/hTrackdEtadPhi", "d#eta vs. d#varphi of matched tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDEta, thAxisDPhi}, true); - fRegistry->add("QA/Cluster/hTrackdEtaPt", "d#eta vs. track pT of matched tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDEta, thAxisMomentum}, true); - fRegistry->add("QA/Cluster/hTrackdPhiPt", "d#varphi vs. track pT of matched tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDPhi, thAxisMomentum}, true); - fRegistry->add("QA/Cluster/hSecTrackdEtadPhi", "d#eta vs. d#varphi of matched secondary tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDEta, thAxisDPhi}, true); - fRegistry->add("QA/Cluster/hSecTrackdEtaPt", "d#eta vs. track pT of matched secondary tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDEta, thAxisMomentum}, true); - fRegistry->add("QA/Cluster/hSecTrackdPhiPt", "d#varphi vs. track pT of matched secondary tracks;d#eta;d#varphi (rad.)", o2::framework::HistType::kTH2F, {thAxisDPhi, thAxisMomentum}, true); - } - } + void addQAHistograms(o2::framework::HistogramRegistry* fRegistry = nullptr) const; /// \brief performs check if track is matched with given cluster /// \param cluster cluster to be checked @@ -201,7 +151,7 @@ class EMCPhotonCut : public TNamed /// \param GetEtaCut lambda to get the eta cut value /// \param GetPhiCut lambda to get the phi cut value /// \param applyEoverP bool to check if E/p should be checked (for secondaries we do not check this!) - bool checkTrackMatching(o2::soa::is_iterator auto const& cluster, IsTrackIterator auto& emcmatchedtrack, o2::soa::RowViewSentinel const emcmatchedtrackEnd, bool applyEoverP, auto GetEtaCut, auto GetPhiCut, o2::framework::HistogramRegistry* fRegistry = nullptr, TrackType trackType = TrackType::kPrimary) const + bool checkTrackMatching(is_iterator auto const& cluster, IsTrackIterator auto& emcmatchedtrack, is_sentinel auto const emcmatchedtrackEnd, bool applyEoverP, auto GetEtaCut, auto GetPhiCut, o2::framework::HistogramRegistry* fRegistry = nullptr, TrackType trackType = TrackType::kPrimary) const { // advance to cluster while (emcmatchedtrack != emcmatchedtrackEnd && getClusterId(emcmatchedtrack) < cluster.globalIndex()) { @@ -250,7 +200,7 @@ class EMCPhotonCut : public TNamed return true; // all tracks checked, cluster survives } - void fillBeforeClusterHistogram(o2::soa::is_iterator auto const& cluster, o2::framework::HistogramRegistry* fRegistry = nullptr) const + void fillBeforeClusterHistogram(is_iterator auto const& cluster, o2::framework::HistogramRegistry* fRegistry = nullptr) const { if (mDoQA == false || fRegistry == nullptr) { @@ -266,7 +216,7 @@ class EMCPhotonCut : public TNamed fRegistry->fill(HIST("QA/Cluster/before/hTime"), cluster.time(), cluster.e()); } - void fillAfterClusterHistogram(o2::soa::is_iterator auto const& cluster, o2::framework::HistogramRegistry* fRegistry = nullptr) const + void fillAfterClusterHistogram(is_iterator auto const& cluster, o2::framework::HistogramRegistry* fRegistry = nullptr) const { if (mDoQA == false || fRegistry == nullptr) { @@ -288,7 +238,7 @@ class EMCPhotonCut : public TNamed /// \param matchedTracks matched primary tracks table /// \param matchedSecondaries matched secondary tracks table /// \param fRegistry o2::framework::HistogramRegistry pointer of the main task - void AreSelectedRunning(EMBitFlags& flags, o2::soa::is_table auto const& clusters, IsTrackContainer auto const& emcmatchedtracks, IsTrackContainer auto const& secondaries, o2::framework::HistogramRegistry* fRegistry = nullptr) const + void AreSelectedRunning(EMBitFlags& flags, auto const& clusters, IsTrackContainer auto const& emcmatchedtracks, IsTrackContainer auto const& secondaries, o2::framework::HistogramRegistry* fRegistry = nullptr) const { if (clusters.size() <= 0) { return; @@ -332,7 +282,7 @@ class EMCPhotonCut : public TNamed /// \param secondaryIter current iterator of matched secondary tracks /// \param secondaryEnd end iterator of matched secondary tracks /// \return true if cluster survives all cuts else false - bool IsSelectedRunning(o2::soa::is_iterator auto const& cluster, IsTrackIterator auto& emcmatchedtrackIter, o2::soa::RowViewSentinel const emcmatchedtrackEnd, IsTrackIterator auto& secondaryIter, o2::soa::RowViewSentinel const secondaryEnd, o2::framework::HistogramRegistry* fRegistry = nullptr) const + bool IsSelectedRunning(is_iterator auto const& cluster, IsTrackIterator auto& emcmatchedtrackIter, is_sentinel auto const emcmatchedtrackEnd, IsTrackIterator auto& secondaryIter, is_sentinel auto const secondaryEnd, o2::framework::HistogramRegistry* fRegistry = nullptr) const { const bool doQA = mDoQA && fRegistry != nullptr; if (!IsSelectedEMCalRunning(EMCPhotonCuts::kDefinition, cluster)) { @@ -398,7 +348,7 @@ class EMCPhotonCut : public TNamed /// \param cut enum of the cluster cut to check /// \param cluster cluster to check /// \return true if cluster survives cut else false - bool IsSelectedEMCalRunning(const EMCPhotonCuts& cut, o2::soa::is_iterator auto const& cluster) const + bool IsSelectedEMCalRunning(const EMCPhotonCuts& cut, is_iterator auto const& cluster) const { switch (cut) { case EMCPhotonCuts::kDefinition: @@ -440,7 +390,7 @@ class EMCPhotonCut : public TNamed /// \param matchedTrackIter current iterator of matched primary or secondary tracks /// \param matchedTrackEnd end iterator of matched primary or secondary tracks /// \return true if cluster survives cut else false - bool IsSelectedEMCalRunning(const EMCPhotonCuts& cut, o2::soa::is_iterator auto const& cluster, IsTrackIterator auto& matchedTrackIter, o2::soa::RowViewSentinel const matchedTrackEnd, o2::framework::HistogramRegistry* fRegistry = nullptr) const + bool IsSelectedEMCalRunning(const EMCPhotonCuts& cut, is_iterator auto const& cluster, IsTrackIterator auto& matchedTrackIter, is_sentinel auto const matchedTrackEnd, o2::framework::HistogramRegistry* fRegistry = nullptr) const { switch (cut) { case EMCPhotonCuts::kTM: @@ -459,7 +409,7 @@ class EMCPhotonCut : public TNamed /// \param matchedTracks subtable of the matched primary tracks (optional) /// \param matchedSecondaries subtable of the matched secondary tracks (optional) /// \return true if cluster survives all cuts else false - template + template bool IsSelected(Cluster const& cluster, TMatchedTracks const& emcmatchedtracks = nullptr, TMatchedSecondaries const& secondaries = nullptr) const { if (!IsSelectedEMCal(EMCPhotonCuts::kDefinition, cluster)) { @@ -495,7 +445,7 @@ class EMCPhotonCut : public TNamed /// \param matchedTracks subtable of the matched primary tracks (optional) /// \param matchedSecondaries subtable of the matched secondary tracks (optional) /// \return true if cluster survives cut else false - template + template bool IsSelectedEMCal(const EMCPhotonCuts& cut, Cluster const& cluster, TMatchedTracks const& emcmatchedtracks = nullptr) const { switch (cut) { diff --git a/PWGEM/PhotonMeson/Core/PHOSPhotonCut.h b/PWGEM/PhotonMeson/Core/PHOSPhotonCut.h index ea7fd3440ab..73569263ec2 100644 --- a/PWGEM/PhotonMeson/Core/PHOSPhotonCut.h +++ b/PWGEM/PhotonMeson/Core/PHOSPhotonCut.h @@ -16,10 +16,8 @@ #ifndef PWGEM_PHOTONMESON_CORE_PHOSPHOTONCUT_H_ #define PWGEM_PHOTONMESON_CORE_PHOSPHOTONCUT_H_ -#include - +#include "PWGEM/PhotonMeson/Utils/TrackSelection.h" #include - #include class PHOSPhotonCut : public TNamed @@ -38,7 +36,7 @@ class PHOSPhotonCut : public TNamed static const char* mCutNames[static_cast(PHOSPhotonCuts::kNCuts)]; // Temporary function to check if track passes selection criteria. To be replaced by framework filters. - template + template bool IsSelected(Cluster const& cluster) const { // auto track = cluster.template MatchedTrack_as(); //please implement a column to point matched track index (DECLARE_SOA_ARRAY_INDEX_COLUMN) in SkimPHOSClusters table. @@ -71,7 +69,7 @@ class PHOSPhotonCut : public TNamed } // Temporary function to check if track passes a given selection criteria. To be replaced by framework filters. - template + template bool IsSelectedCluster(Cluster const& cls, const PHOSPhotonCuts& cut) const { switch (cut) { diff --git a/PWGEM/PhotonMeson/Core/V0PhotonCut.h b/PWGEM/PhotonMeson/Core/V0PhotonCut.h index 741f72f8df9..5668815d7a6 100644 --- a/PWGEM/PhotonMeson/Core/V0PhotonCut.h +++ b/PWGEM/PhotonMeson/Core/V0PhotonCut.h @@ -23,7 +23,6 @@ #include #include -#include #include #include #include @@ -158,12 +157,18 @@ namespace o2::analysis::em::v0 { template -concept IsNonLinIterator = o2::soa::is_iterator && requires(T t) { +concept IsNonLinIterator = requires(T t) { // Check that the *elements* of the container have the required methods: { t.corrPt() } -> std::same_as; }; } // namespace o2::analysis::em::v0 +template +concept is_table = requires(T t) +{ + { t.begin() } ->std::same_as::iterator>; +}; + class V0PhotonCut : public TNamed { public: @@ -302,7 +307,7 @@ class V0PhotonCut : public TNamed } } - template + template void fillBeforePhotonHistogram(TV0 const& v0, TLeg1 const& pos, TLeg2 const& ele, o2::framework::HistogramRegistry* fRegistry = nullptr) const { @@ -332,7 +337,7 @@ class V0PhotonCut : public TNamed fRegistry->fill(HIST("QA/V0Photon/before/Neg/hTPCHits"), ele.tpcNClsFound(), ele.tpcNClsCrossedRows()); } - template + template void fillAfterPhotonHistogram(TV0 const& v0, TLeg1 const& pos, TLeg2 const& ele, o2::framework::HistogramRegistry* fRegistry = nullptr) const { @@ -364,7 +369,7 @@ class V0PhotonCut : public TNamed /// \brief creates a mask for the V0s if they are too close to another V0 and have higher chi^2 /// \param v0s V0 table - template + template void createCloseV0CutMask(TV0 const& v0s) const { const bool useDistance3D = (mTooCloseType == TooCloseCuts::kDistance3D); @@ -478,7 +483,7 @@ class V0PhotonCut : public TNamed /// \brief check if given v0 photon survives all cuts /// \param flags EMBitFlags where results will be stored /// \param v0s v0 photon table to check - template + template void AreSelectedRunning(EMBitFlags& flags, TV0 const& v0s, o2::framework::HistogramRegistry* fRegistry = nullptr) const { if (v0s.size() <= 0) { @@ -512,7 +517,7 @@ class V0PhotonCut : public TNamed } } - template + template bool IsSelected(TV0 const& v0, o2::framework::HistogramRegistry* fRegistry = nullptr) const { auto pos = v0.template posTrack_as(); @@ -820,7 +825,7 @@ class V0PhotonCut : public TNamed return true; } - template + template bool IsSelectedV0(T const& v0, const V0PhotonCuts& cut) const { switch (cut) { @@ -1064,7 +1069,7 @@ class V0PhotonCut : public TNamed return mMlBDTScores; } - template + template bool IsConversionPointInAcceptance(TMCPhoton const& mcphoton, float convRadius) const { // eta cut diff --git a/PWGEM/PhotonMeson/Tasks/photonhbt.cxx b/PWGEM/PhotonMeson/Tasks/photonhbt.cxx index d8f2c5c7da8..7bdf150f66b 100644 --- a/PWGEM/PhotonMeson/Tasks/photonhbt.cxx +++ b/PWGEM/PhotonMeson/Tasks/photonhbt.cxx @@ -133,7 +133,7 @@ static constexpr float kMinSigma = 1e-9; struct Photonhbt { - template + template static inline V0Combo classifyV0Combo(TGamma const& g) { const auto pos = g.template posTrack_as(); diff --git a/PWGEM/PhotonMeson/Utils/ClusterHistograms.h b/PWGEM/PhotonMeson/Utils/ClusterHistograms.h index 6e51d09ab40..57703d5b229 100644 --- a/PWGEM/PhotonMeson/Utils/ClusterHistograms.h +++ b/PWGEM/PhotonMeson/Utils/ClusterHistograms.h @@ -105,7 +105,7 @@ inline void fillTrackQA2D( reg->fill(histbase + HIST("hTrackdPhiPt"), dPhi, pt, w); } -template +template inline void fillClusterHistograms(o2::framework::HistogramRegistry* fRegistry, TCluster cluster, bool do2DQA, float weight = 1.f, TMatchedTracks const& primTracks = nullptr, TMatchedSecondaries const& secTracks = nullptr) { const auto e = cluster.e(); diff --git a/PWGEM/PhotonMeson/Utils/TrackSelection.h b/PWGEM/PhotonMeson/Utils/TrackSelection.h index 941a7ea2bc0..93f6ad911e4 100644 --- a/PWGEM/PhotonMeson/Utils/TrackSelection.h +++ b/PWGEM/PhotonMeson/Utils/TrackSelection.h @@ -16,12 +16,37 @@ #ifndef PWGEM_PHOTONMESON_UTILS_TRACKSELECTION_H_ #define PWGEM_PHOTONMESON_UTILS_TRACKSELECTION_H_ -#include - #include - +#include #include +template +concept is_iterator = requires (T t) +{ + typename std::decay_t::policy_t; + typename std::decay_t::all_columns; + t.getIndexBindings(); +}; + +template +concept is_sentinel = requires (T t) +{ + std::same_as; +}; + +template +concept is_track_with_extra = requires (T t) +{ + { t.hasITS() } -> std::same_as; + { t.hasTPC() } -> std::same_as; +}; + +template +concept is_mc_particle = requires (T t) +{ + { t.pdgCode() } -> std::same_as; +}; + namespace o2::pwgem::photonmeson { @@ -32,7 +57,7 @@ namespace o2::pwgem::photonmeson * @param track track * @return true if has both */ -template +template inline bool isITSTPCTrack(TTrack const& track) { return track.hasITS() && track.hasTPC(); @@ -45,7 +70,7 @@ inline bool isITSTPCTrack(TTrack const& track) * @param track track * @return true if has both */ -template +template inline bool isTPCTRDTrack(TTrack const& track) { return !track.hasITS() && track.hasTPC() && track.hasTRD() && !track.hasTOF(); @@ -58,7 +83,7 @@ inline bool isTPCTRDTrack(TTrack const& track) * @param track track * @return true if has all */ -template +template inline bool isITSTPCTRDTrack(TTrack const& track) { return track.hasITS() && track.hasTPC() && track.hasTRD() && !track.hasTOF(); @@ -70,7 +95,7 @@ inline bool isITSTPCTRDTrack(TTrack const& track) * @param track track * @return true if has both */ -template +template inline bool isTPCTOFTrack(TTrack const& track) { return !track.hasITS() && track.hasTPC() && !track.hasTRD() && track.hasTOF(); @@ -82,7 +107,7 @@ inline bool isTPCTOFTrack(TTrack const& track) * @param track track * @return true if has all */ -template +template inline bool isTPCTRDTOFTrack(TTrack const& track) { return !track.hasITS() && track.hasTPC() && track.hasTRD() && track.hasTOF(); @@ -94,7 +119,7 @@ inline bool isTPCTRDTOFTrack(TTrack const& track) * @param track track * @return true if has all */ -template +template inline bool isITSTPCTRDTOFTrack(TTrack const& track) { return track.hasITS() && track.hasTPC() && track.hasTRD() && track.hasTOF(); @@ -107,7 +132,7 @@ inline bool isITSTPCTRDTOFTrack(TTrack const& track) * @param track track * @return true if tracks is TPC-only */ -template +template inline bool isTPConlyTrack(TTrack const& track) { return !track.hasITS() && track.hasTPC() && !track.hasTRD() && !track.hasTOF(); @@ -120,7 +145,7 @@ inline bool isTPConlyTrack(TTrack const& track) * @param track track * @return true if tracks is ITS-only */ -template +template inline bool isITSonlyTrack(TTrack const& track) { return track.hasITS() && !track.hasTPC() && !track.hasTRD() && !track.hasTOF(); @@ -134,7 +159,7 @@ inline bool isITSonlyTrack(TTrack const& track) * @param track1 track from daughter 1 * @return true if V0 pairs are ITSTPC-tracks */ -template +template inline bool isITSTPC_ITSTPC(TTrack const& track0, TTrack const& track1) { return isITSTPCTrack(track0) && isITSTPCTrack(track1); @@ -148,7 +173,7 @@ inline bool isITSTPC_ITSTPC(TTrack const& track0, TTrack const& track1) * @param track1 track from daughter 1 * @return true if one is TPC-only and the other ITSTPC */ -template +template inline bool isITSTPC_TPConly(TTrack const& track0, TTrack const& track1) { return (isITSTPCTrack(track0) && isTPConlyTrack(track1)) || (isITSTPCTrack(track1) && isTPConlyTrack(track0)); @@ -162,7 +187,7 @@ inline bool isITSTPC_TPConly(TTrack const& track0, TTrack const& track1) * @param track1 track from daughter 1 * @return true if one is ITS-only and the other ITSTPC */ -template +template inline bool isITSTPC_ITSonly(TTrack const& track0, TTrack const& track1) { return (isITSTPCTrack(track0) && isITSonlyTrack(track1)) || (isITSTPCTrack(track1) && isITSonlyTrack(track0)); @@ -176,7 +201,7 @@ inline bool isITSTPC_ITSonly(TTrack const& track0, TTrack const& track1) * @param track1 track from daughter 1 * @return true if both are TPC-only tracks */ -template +template inline bool isTPConly_TPConly(TTrack const& track0, TTrack const& track1) { return isTPConlyTrack(track0) && isTPConlyTrack(track1); @@ -190,7 +215,7 @@ inline bool isTPConly_TPConly(TTrack const& track0, TTrack const& track1) * @param track1 track from daughter 1 * @return true if both are ITS-only tracks */ -template +template inline bool isITSonly_ITSonly(TTrack const& track0, TTrack const& track1) { return isITSonlyTrack(track0) && isITSonlyTrack(track1); @@ -204,7 +229,7 @@ inline bool isITSonly_ITSonly(TTrack const& track0, TTrack const& track1) * @param track1 track from daughter 1 * @return true if either one is ITS-only while the other one is TPC-only */ -template +template inline bool isTPConly_ITSonly(TTrack const& track0, TTrack const& track1) { return (isTPConlyTrack(track0) && isITSonlyTrack(track1)) || (isTPConlyTrack(track1) && isITSonlyTrack(track0)); @@ -217,7 +242,7 @@ inline bool isTPConly_ITSonly(TTrack const& track0, TTrack const& track1) * @param mc2 MCParticle 1 * @return true if the mother particle is the expected type and the same for both */ -template +template inline bool checkMCParticles(T const& mc1, T const& mc2) { if (std::abs(mc1.pdgCode()) != kElectron || std::abs(mc2.pdgCode()) != kElectron) { diff --git a/PWGJE/Core/CMakeLists.txt b/PWGJE/Core/CMakeLists.txt index b6ccafb2be2..a7713c9900d 100644 --- a/PWGJE/Core/CMakeLists.txt +++ b/PWGJE/Core/CMakeLists.txt @@ -23,7 +23,6 @@ o2physics_target_root_dictionary(PWGJECore FastJetUtilities.h JetTaggingUtilities.h JetBkgSubUtils.h - JetDerivedDataUtilities.h emcalCrossTalkEmulation.h utilsTrackMatchingEMC.h LINKDEF PWGJECoreLinkDef.h) diff --git a/PWGUD/Core/decayTree.cxx b/PWGUD/Core/decayTree.cxx index ded7c2fa329..3c730320a35 100644 --- a/PWGUD/Core/decayTree.cxx +++ b/PWGUD/Core/decayTree.cxx @@ -1228,4 +1228,162 @@ std::vector> decayTree::combinations(int nPool) return copes; } +void decayTree::createHistograms(o2::framework::HistogramRegistry& registry) +{ + // definitions + auto etax = o2::framework::AxisSpec(100, -1.5, 1.5); + auto nSax = o2::framework::AxisSpec(300, -15.0, 15.0); + auto chi2ax = o2::framework::AxisSpec(100, 0.0, 5.0); + auto nClax = o2::framework::AxisSpec(170, 0.0, 170.0); + auto angax = o2::framework::AxisSpec(315, 0.0, 3.15); + auto dcaxyax = o2::framework::AxisSpec(400, -0.2, 0.2); + auto dcazax = o2::framework::AxisSpec(600, -0.3, 0.3); + auto sTPCax = o2::framework::AxisSpec(1000, 0., 1000.); + + std::string base; + std::string hname; + std::string annot; + fhistPointers.clear(); + for (const auto& res : getResonances()) { + auto max = o2::framework::AxisSpec(res->nmassBins(), res->massHistRange()[0], res->massHistRange()[1]); + auto momax = o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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 = o2::framework::AxisSpec(d1->nmomBins(), d1->momHistRange()[0], d1->momHistRange()[1]); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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 = o2::framework::AxisSpec(res->nmassBins(), d1->massHistRange()[0], d1->massHistRange()[1]); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {o2::framework::HistType::kTH2F, {max, max1}})}); + } + } + + // daughters vs daughters + for (auto i = 0; i < static_cast(ndaughs - 1); i++) { + auto d1 = getResonance(daughs[i]); + auto max1 = o2::framework::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 = o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::HistType::kTH1F, {{4, 0.5, 4.5}}})}); + } + } + } +} // ----------------------------------------------------------------------------- diff --git a/PWGUD/Core/decayTree.h b/PWGUD/Core/decayTree.h index 162a1859181..05cd97968c0 100644 --- a/PWGUD/Core/decayTree.h +++ b/PWGUD/Core/decayTree.h @@ -12,7 +12,6 @@ #ifndef PWGUD_CORE_DECAYTREE_H_ #define PWGUD_CORE_DECAYTREE_H_ -#include #include #include @@ -29,6 +28,11 @@ #include #include +namespace o2::framework +{ +class HistogramRegistry; +} + // ----------------------------------------------------------------------------- class pidSelector { @@ -835,164 +839,7 @@ class decayTree } // create histograms - void createHistograms(o2::framework::HistogramRegistry& registry) - { - // definitions - auto etax = o2::framework::AxisSpec(100, -1.5, 1.5); - auto nSax = o2::framework::AxisSpec(300, -15.0, 15.0); - auto chi2ax = o2::framework::AxisSpec(100, 0.0, 5.0); - auto nClax = o2::framework::AxisSpec(170, 0.0, 170.0); - auto angax = o2::framework::AxisSpec(315, 0.0, 3.15); - auto dcaxyax = o2::framework::AxisSpec(400, -0.2, 0.2); - auto dcazax = o2::framework::AxisSpec(600, -0.3, 0.3); - auto sTPCax = o2::framework::AxisSpec(1000, 0., 1000.); - - std::string base; - std::string hname; - std::string annot; - fhistPointers.clear(); - for (const auto& res : getResonances()) { - auto max = o2::framework::AxisSpec(res->nmassBins(), res->massHistRange()[0], res->massHistRange()[1]); - auto momax = o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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 = o2::framework::AxisSpec(d1->nmomBins(), d1->momHistRange()[0], d1->momHistRange()[1]); - fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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 = o2::framework::AxisSpec(res->nmassBins(), d1->massHistRange()[0], d1->massHistRange()[1]); - fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {o2::framework::HistType::kTH2F, {max, max1}})}); - } - } - - // daughters vs daughters - for (auto i = 0; i < static_cast(ndaughs - 1); i++) { - auto d1 = getResonance(daughs[i]); - auto max1 = o2::framework::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 = o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::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(), {o2::framework::HistType::kTH1F, {{4, 0.5, 4.5}}})}); - } - } - } - } + void createHistograms(o2::framework::HistogramRegistry& registry); // ClassDefNV(decayTree, 1); }; diff --git a/Tutorials/src/histogramRegistry.cxx b/Tutorials/src/histogramRegistry.cxx index 9e61566af5b..620bc91ab60 100644 --- a/Tutorials/src/histogramRegistry.cxx +++ b/Tutorials/src/histogramRegistry.cxx @@ -59,22 +59,22 @@ struct EtaPhiHistograms { } }; -struct FilteredHistograms { - /// Construct a registry object with direct declaration - HistogramRegistry registry{ - "registry", - { - {"eta", "#eta", {HistType::kTH1F, {{102, -2.01, 2.01}}}}, // - {"ptToPt", "#ptToPt", {HistType::kTH2F, {{100, -0.01, 10.01}, {100, -0.01, 10.01}}}} // - } // - }; - - void process(aod::Tracks const& tracks) - { - registry.fill(HIST("eta"), tracks, aod::track::eta > 0.0f); - registry.fill(HIST("ptToPt"), tracks, aod::track::pt < 5.0f); - } -}; +// struct FilteredHistograms { +// /// Construct a registry object with direct declaration +// HistogramRegistry registry{ +// "registry", +// { +// {"eta", "#eta", {HistType::kTH1F, {{102, -2.01, 2.01}}}}, // +// {"ptToPt", "#ptToPt", {HistType::kTH2F, {{100, -0.01, 10.01}, {100, -0.01, 10.01}}}} // +// } // +// }; + +// void process(aod::Tracks const& tracks) +// { +// registry.fill(HIST("eta"), tracks, aod::track::eta > 0.0f); +// registry.fill(HIST("ptToPt"), tracks, aod::track::pt < 5.0f); +// } +// }; struct DimensionTest { @@ -118,19 +118,19 @@ struct DimensionTest { void process(aod::Tracks const& tracks) { using namespace aod::track; - // does not work with dynamic columns (e.g. Charge, NormalizedPhi) - registry.fill(HIST("1d"), tracks, eta > -0.7f); - registry.fill(HIST("3d"), tracks, eta > 0.f); - registry.fill(HIST("5d"), tracks, pt > 0.15f); - registry.fill(HIST("7d"), tracks, pt > 0.15f); - registry.fill(HIST("2d-profile"), tracks, eta > -0.5f); + // // does not work with dynamic columns (e.g. Charge, NormalizedPhi) + // registry.fill(HIST("1d"), tracks, eta > -0.7f); + // registry.fill(HIST("3d"), tracks, eta > 0.f); + // registry.fill(HIST("5d"), tracks, pt > 0.15f); + // registry.fill(HIST("7d"), tracks, pt > 0.15f); + // registry.fill(HIST("2d-profile"), tracks, eta > -0.5f); - // fill 4d histogram with weight (column X) - registry.fill(HIST("4d-weight"), tracks, eta > 0.f); + // // fill 4d histogram with weight (column X) + // registry.fill(HIST("4d-weight"), tracks, eta > 0.f); - registry.fill(HIST("2d-weight"), tracks, eta > 0.f); + // registry.fill(HIST("2d-weight"), tracks, eta > 0.f); - registry.fill(HIST("1d-profile-weight"), tracks, eta > 0.f); + // registry.fill(HIST("1d-profile-weight"), tracks, eta > 0.f); for (auto& track : tracks) { registry.fill(HIST("2d"), track.eta(), track.pt()); @@ -218,8 +218,8 @@ struct RealisticExample { { using namespace aod::track; - etaStudy.fill(HIST("positive"), tracks, eta > 0.f); - etaStudy.fill(HIST("negative"), tracks, eta < 0.f); + // etaStudy.fill(HIST("positive"), tracks, eta > 0.f); + // etaStudy.fill(HIST("negative"), tracks, eta < 0.f); for (auto& track : tracks) { spectra.fill(HIST("myControlHist"), track.pt(), track.eta()); @@ -329,7 +329,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) return WorkflowSpec{ adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), + // adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), From f8f4d8b945239039f886962f26e4c2079645f4a2 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 26 Jun 2026 10:57:49 +0200 Subject: [PATCH 2/7] split VarManager.h to hide ASoA.h inclusion chain from rootcling --- PWGDQ/Core/CMakeLists.txt | 2 +- PWGDQ/Core/CutsLibrary.cxx | 2 +- PWGDQ/Core/DQMlResponse.h | 2 +- PWGDQ/Core/HistogramsLibrary.cxx | 2 +- PWGDQ/Core/MixingHandler.h | 2 +- PWGDQ/Core/MixingLibrary.cxx | 2 +- PWGDQ/Core/VarManager.cxx | 227 +++++ PWGDQ/Core/VarManager.h | 1503 +----------------------------- 8 files changed, 235 insertions(+), 1507 deletions(-) diff --git a/PWGDQ/Core/CMakeLists.txt b/PWGDQ/Core/CMakeLists.txt index 41ceb661bf9..f7fa0d99f3a 100644 --- a/PWGDQ/Core/CMakeLists.txt +++ b/PWGDQ/Core/CMakeLists.txt @@ -26,7 +26,7 @@ o2physics_add_library(PWGDQCore o2physics_target_root_dictionary(PWGDQCore HEADERS AnalysisCut.h AnalysisCompositeCut.h - VarManager.h + VarManagerCore.h HistogramManager.h CutsLibrary.h MixingHandler.h diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index 92cbaf7b7bc..a4bbd69fb2d 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -17,7 +17,7 @@ #include "AnalysisCompositeCut.h" #include "AnalysisCut.h" -#include "VarManager.h" +#include "VarManagerCore.h" #include #include diff --git a/PWGDQ/Core/DQMlResponse.h b/PWGDQ/Core/DQMlResponse.h index 9b72e1257b7..9f7af79dd44 100644 --- a/PWGDQ/Core/DQMlResponse.h +++ b/PWGDQ/Core/DQMlResponse.h @@ -17,7 +17,7 @@ #ifndef PWGDQ_CORE_DQMLRESPONSE_H_ #define PWGDQ_CORE_DQMLRESPONSE_H_ -#include "PWGDQ/Core/VarManager.h" +#include "PWGDQ/Core/VarManagerCore.h" #include "Tools/ML/MlResponse.h" diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index edfcf3d4985..2a69ec32350 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -14,7 +14,7 @@ #include "PWGDQ/Core/HistogramsLibrary.h" #include "HistogramManager.h" -#include "VarManager.h" +#include "VarManagerCore.h" #include #include diff --git a/PWGDQ/Core/MixingHandler.h b/PWGDQ/Core/MixingHandler.h index 1b0cedaea5c..1f9c340e4ac 100644 --- a/PWGDQ/Core/MixingHandler.h +++ b/PWGDQ/Core/MixingHandler.h @@ -17,7 +17,7 @@ #ifndef PWGDQ_CORE_MIXINGHANDLER_H_ #define PWGDQ_CORE_MIXINGHANDLER_H_ -#include "PWGDQ/Core/VarManager.h" +#include "PWGDQ/Core/VarManagerCore.h" #include #include diff --git a/PWGDQ/Core/MixingLibrary.cxx b/PWGDQ/Core/MixingLibrary.cxx index b152de7d27c..6fcd2d32ed9 100644 --- a/PWGDQ/Core/MixingLibrary.cxx +++ b/PWGDQ/Core/MixingLibrary.cxx @@ -14,7 +14,7 @@ #include "PWGDQ/Core/MixingLibrary.h" #include "PWGDQ/Core/MixingHandler.h" -#include "PWGDQ/Core/VarManager.h" +#include "PWGDQ/Core/VarManagerCore.h" #include diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 097fe8296f7..35b3d464a8c 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -641,6 +641,233 @@ std::tuple VarManager::BimodalityCoeffic return std::make_tuple((skewness * skewness + 1.0) / kurtosis, mean, stddev, skewness, kurtosis, nPeaks); } +void VarManager::SetUseVariable(int var) +{ + if (var >= 0 && var < kNVars) { + fgUsedVars[var] = kTRUE; + } + SetVariableDependencies(); +} + +void VarManager::SetUseVars(const bool* usedVars) +{ + for (int i = 0; i < kNVars; ++i) { + if (usedVars[i]) { + fgUsedVars[i] = true; // overwrite only the variables that are being used since there are more channels to modify the used variables array, independently + } + } + SetVariableDependencies(); +} + +void VarManager::SetUseVars(const std::vector usedVars) +{ + for (auto& var : usedVars) { + fgUsedVars[var] = true; + } +} +bool VarManager::GetUsedVar(int var) +{ + if (var >= 0 && var < kNVars) { + return fgUsedVars[var]; + } + return false; +} + + // Flag to set PV recalculation via KF +void VarManager::SetPVrecalculationKF(const bool pvRecalKF) +{ + fgPVrecalKF = pvRecalKF; +} + +void VarManager::SetMagneticField(float magField) +{ + fgMagField = magField; +} + + // Setup plane position for MFT-MCH matching +void VarManager::SetMatchingPlane(float z) +{ + fgzMatching = z; +} + +float VarManager::GetMatchingPlane() +{ + return fgzMatching; +} + + // Set z shift for forward tracks +void VarManager::SetZShift(float z) +{ + fgzShiftFwd = z; +} + + // Setup the 2 prong KFParticle +void VarManager::SetupTwoProngKFParticle(float magField) +{ + KFParticle::SetField(magField); + fgUsedKF = true; +} +// Setup magnetic field for muon propagation +void VarManager::SetupMuonMagField() +{ + o2::mch::TrackExtrap::setField(); +} + + // Setup the 2 prong DCAFitterN +void VarManager::SetupTwoProngDCAFitter(float magField, bool propagateToPCA, float maxR, float maxDZIni, float minParamChange, float minRelChi2Change, bool useAbsDCA) +{ + fgFitterTwoProngBarrel.setBz(magField); + fgFitterTwoProngBarrel.setPropagateToPCA(propagateToPCA); + fgFitterTwoProngBarrel.setMaxR(maxR); + fgFitterTwoProngBarrel.setMaxDZIni(maxDZIni); + fgFitterTwoProngBarrel.setMinParamChange(minParamChange); + fgFitterTwoProngBarrel.setMinRelChi2Change(minRelChi2Change); + fgFitterTwoProngBarrel.setUseAbsDCA(useAbsDCA); + fgUsedKF = false; +} + + // Setup the 2 prong FwdDCAFitterN +void VarManager::SetupTwoProngFwdDCAFitter(float magField, bool propagateToPCA, float maxR, float minParamChange, float minRelChi2Change, bool useAbsDCA) +{ + fgFitterTwoProngFwd.setBz(magField); + fgFitterTwoProngFwd.setPropagateToPCA(propagateToPCA); + fgFitterTwoProngFwd.setMaxR(maxR); + fgFitterTwoProngFwd.setMinParamChange(minParamChange); + fgFitterTwoProngFwd.setMinRelChi2Change(minRelChi2Change); + fgFitterTwoProngFwd.setUseAbsDCA(useAbsDCA); + fgUsedKF = false; +} +// Use MatLayerCylSet to correct MCS in fwdtrack propagation +void VarManager::SetupMatLUTFwdDCAFitter(o2::base::MatLayerCylSet* m) +{ + fgFitterTwoProngFwd.setTGeoMat(false); + fgFitterTwoProngFwd.setMatLUT(m); +} +// Use GeometryManager to correct MCS in fwdtrack propagation +void VarManager::SetupTGeoFwdDCAFitter() +{ + fgFitterTwoProngFwd.setTGeoMat(true); +} +// No material budget in fwdtrack propagation +void VarManager::SetupFwdDCAFitterNoCorr() +{ + fgFitterTwoProngFwd.setTGeoMat(false); +} +// Setup the 3 prong KFParticle +void VarManager::SetupThreeProngKFParticle(float magField) +{ + KFParticle::SetField(magField); + fgUsedKF = true; +} + + // Setup the 3 prong DCAFitterN +void VarManager::SetupThreeProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA) +{ + fgFitterThreeProngBarrel.setBz(magField); + fgFitterThreeProngBarrel.setPropagateToPCA(propagateToPCA); + fgFitterThreeProngBarrel.setMaxR(maxR); + fgFitterThreeProngBarrel.setMinParamChange(minParamChange); + fgFitterThreeProngBarrel.setMinRelChi2Change(minRelChi2Change); + fgFitterThreeProngBarrel.setUseAbsDCA(useAbsDCA); + fgUsedKF = false; +} + + // Setup the 4 prong KFParticle +void VarManager::SetupFourProngKFParticle(float magField) +{ + KFParticle::SetField(magField); + fgUsedKF = true; +} + + // Setup the 4 prong DCAFitterN +void VarManager::SetupFourProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA) +{ + fgFitterFourProngBarrel.setBz(magField); + fgFitterFourProngBarrel.setPropagateToPCA(propagateToPCA); + fgFitterFourProngBarrel.setMaxR(maxR); + fgFitterFourProngBarrel.setMinParamChange(minParamChange); + fgFitterFourProngBarrel.setMinRelChi2Change(minRelChi2Change); + fgFitterFourProngBarrel.setUseAbsDCA(useAbsDCA); + fgUsedKF = false; +} + +auto VarManager::getEventPlane(int harm, float qnxa, float qnya) +{ + // Compute event plane angle from qn vector components for the sub-event A + return (1.0 / harm) * TMath::ATan2(qnya, qnxa); +}; + +float VarManager::getDeltaPsiInRange(float psi1, float psi2, float harmonic) +{ + float deltaPsi = psi1 - psi2; + if (std::abs(deltaPsi) > o2::constants::math::PI / harmonic) { + if (deltaPsi > 0.) { + deltaPsi -= o2::constants::math::TwoPI / harmonic; + } else { + deltaPsi += o2::constants::math::TwoPI / harmonic; + } + } + return deltaPsi; +} + +void VarManager::SetCalibrationObject(CalibObjects calib, TObject* obj) +{ + fgCalibs[calib] = obj; + // 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; + } +} + +void VarManager::SetCalibrationType(int type, bool useInterpolation) +{ + if (type < 0 || type > 2) { + LOG(fatal) << "Invalid calibration type. Must be 0, 1, or 2."; + } + fgCalibrationType = type; + fgUseInterpolatedCalibration = useInterpolation; +} + +TObject* VarManager::GetCalibrationObject(CalibObjects calib) +{ + auto obj = fgCalibs.find(calib); + if (obj == fgCalibs.end()) { + return 0x0; + } else { + return obj->second; + } +} +void VarManager::SetTPCInterSectorBoundary(float boundarySize) +{ + fgTPCInterSectorBoundary = boundarySize; +} +void VarManager::SetITSROFBorderselection(int bias, int length, int marginLow, int marginHigh) +{ + fgITSROFbias = bias; + fgITSROFlength = length; + fgITSROFBorderMarginLow = marginLow; + fgITSROFBorderMarginHigh = marginHigh; +} + +void VarManager::SetSORandEOR(uint64_t sor, uint64_t eor) +{ + fgSOR = sor; + fgEOR = eor; +} + //__________________________________________________________________ void VarManager::SetDefaultVarNames() { diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index cc872d95e96..2d2f562633b 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -21,6 +21,8 @@ #define HomogeneousField #endif +#include "VarManagerCore.h" + #include "PWGUD/Core/UDHelpers.h" #include "PWGUD/Core/UPCHelpers.h" @@ -78,9 +80,7 @@ #include #include #include -#include #include -#include #include #include @@ -90,1505 +90,6 @@ using SMatrix55 = ROOT::Math::SMatrix; using Vec3D = ROOT::Math::SVector; -//_________________________________________________________________________ -class VarManager : public TObject -{ - public: - // map the information contained in the objects passed to the Fill functions - enum ObjTypes { - // NOTE: Elements containing "Reduced" in their name refer strictly to skimmed data tables - // and the ones that don't refer to tables from the Framework data model or both models - BC = BIT(0), - Collision = BIT(1), - CollisionCentRun2 = BIT(2), - CollisionTimestamp = BIT(3), - ReducedEvent = BIT(4), - ReducedEventExtended = BIT(5), - ReducedEventVtxCov = BIT(6), - CollisionMC = BIT(7), - ReducedEventMC = BIT(8), - ReducedEventQvector = BIT(9), - CollisionCent = BIT(10), - CollisionMult = BIT(11), - EventFilter = BIT(12), - CollisionQvect = BIT(13), - ReducedEventQvectorExtra = BIT(14), - ReducedEventRefFlow = BIT(15), - Zdc = BIT(16), - ReducedZdc = BIT(17), - CollisionMultExtra = BIT(18), - ReducedEventMultExtra = BIT(19), - CollisionQvectCentr = BIT(20), - RapidityGapFilter = BIT(21), - Fit = BIT(22), - ReducedFit = BIT(23), - Track = BIT(0), - TrackCov = BIT(1), - TrackExtra = BIT(2), - TrackPID = BIT(3), // used for basic PID properties (needed such that we can subscribe to a minimal set of PID tables): e,pi,K,p for TPC and TOF - TrackPIDExtra = BIT(4), // extra PID information - TrackDCA = BIT(5), - TrackSelection = BIT(6), - TrackV0Bits = BIT(7), - ReducedTrack = BIT(8), - ReducedTrackBarrel = BIT(9), - ReducedTrackBarrelCov = BIT(10), - ReducedTrackBarrelPID = BIT(11), - Muon = BIT(12), - MuonCov = BIT(13), - ReducedMuon = BIT(14), - ReducedMuonExtra = BIT(15), - ReducedMuonCov = BIT(16), - Pair = BIT(17), // TODO: check whether we really need the Pair member here - AmbiTrack = BIT(18), - AmbiMuon = BIT(19), - DalitzBits = BIT(20), - TrackTPCPID = BIT(21), - TrackMFT = BIT(22), - ReducedTrackCollInfo = BIT(23), // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo - ReducedMuonCollInfo = BIT(24), // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo - MuonRealign = BIT(25), - MuonCovRealign = BIT(26), - MFTCov = BIT(27), - TrackTOFService = BIT(28), - ParticleMC = BIT(29), - MuonDca = BIT(30) - }; - - enum PairCandidateType { - // TODO: need to agree on a scheme to incorporate all various hypotheses (e.g. e - mu, jpsi - K+, Jpsi - pipi,...) - kDecayToEE = 0, // e.g. J/psi -> e+ e- - kDecayToMuMu, // e.g. J/psi -> mu+ mu- - kDecayToPiPi, - 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- - kPsi2StoJpsiPiPi, // e.g. Psi(2S) -> J/psi pi+ pi- - kChictoJpsiEE, // e.g. Chi_c1 -> J/psi e+ e- - kDstarToD0KPiPi, // e.g. D*+ -> D0 pi+ -> K- pi+ pi+ - kTripleCandidateToEEPhoton, // e.g. chi_c -> e+ e- photon or pi0 -> e+ e- photon - kDecayToKPi, // e.g. D0 -> K+ pi- or cc. - kTripleCandidateToKPiPi, // e.g. D+ -> K- pi+ pi+ - kTripleCandidateToPKPi, // e.g. Lambda_c -> p K- pi+ - kJpsiHadronMass, // using the real hadron mass - kJpsiPionMass, // treat the hadron as pion - kNMaxCandidateTypes - }; - - enum BarrelTrackFilteringBits { - kIsConversionLeg = 0, // electron from conversions - kIsK0sLeg, // pion from K0s - kIsLambdaLeg, // proton or pion from Lambda - kIsALambdaLeg, // proton or pion from anti-Lambda - kIsOmegaLeg, // kaon from Omega baryon decay - kDalitzBits = 5, // first bit for Dalitz tagged tracks - kBarrelUserCutsBits = 13, // first bit for user track cuts - kIsTPCPostcalibrated = 63 // tracks were postcalibrated for the TPC PID - }; - - enum MuonTrackFilteringBits { - kMuonUserCutsBits = 0, // first bit for user muon cuts - kMuonIsPropagated = 7 // whether the muon was propagated already - }; - - public: - enum Variables { - kNothing = -1, - // Run wise variables - kRunNo = 0, - kNRunWiseVariables, - - // Timeframe wise variables - kTFNBCs = kNRunWiseVariables, - kTFNCollisions, - kTFNMCCollisions, - kTFNTracks, - kTFNMuons, - kTFNMFTs, - kNTFWiseVariables, - - // Event wise variables - kTimestamp = kNTFWiseVariables, - kTimeFromSOR, // Time since Start of Run (SOR) in minutes - kCollisionTime, - kCollisionTimeRes, - kBC, - kBCOrbit, - kCollisionRandom, // random number generated per collision (if required, can be used to perform random selections at the collision level) - kIsPhysicsSelection, - kIsTVXTriggered, // Is trigger TVX - kIsNoTFBorder, // No time frame border - kIsNoITSROFBorder, // No ITS read out frame border (from event selection) - kIsNoITSROFBorderRecomputed, // No ITS read out frame border, computed here - kIsNoSameBunch, // No collisions with same T0 BC - kIsGoodZvtxFT0vsPV, // No collisions w/ difference between z_ {PV, tracks} and z_{PV FT0A-C} - kIsVertexITSTPC, // At least one ITS-TPC track - kIsVertexTOFmatched, // At least one TOF-matched track - kIsSel8, // TVX in Run3 && No time frame border && No ITS read out frame border (from event selection) - 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 - kIsTriggerZNAZNC, // trigger ZNA && ZNC - kIsINT7, - kIsEMC7, - kIsINT7inMUON, - kIsMuonSingleLowPt7, - kIsMuonSingleHighPt7, - kIsMuonUnlikeLowPt7, - kIsMuonLikeLowPt7, - kIsCUP8, - kIsCUP9, - kIsMUP10, - kIsMUP11, - kVtxX, - kVtxY, - kVtxZ, - kVtxNcontrib, - kVtxNcontribReal, - kVtxCovXX, - kVtxCovXY, - kVtxCovXZ, - kVtxCovYY, - kVtxCovYZ, - kVtxCovZZ, - kVtxChi2, - kCentVZERO, - kCentFT0C, - kCentFT0A, - kCentFT0M, - kMultTPC, - kMultFV0A, - kMultFV0C, - kMultFT0A, - kMultFT0C, - kMultFDDA, - kMultFDDC, - kMultZNA, - kMultZNC, - kMultTracklets, - kMultDimuons, - kMultAntiMuons, - kMultMuons, - kMultSingleMuons, - kMultNTracksHasITS, - kMultNTracksHasTPC, - kMultNTracksHasTOF, - kMultNTracksHasTRD, - kMultNTracksITSOnly, - kMultNTracksTPCOnly, - kMultNTracksITSTPC, - kMultNTracksPVeta1, - kMultNTracksPVetaHalf, - kTrackOccupancyInTimeRange, - kFT0COccupancyInTimeRange, - kNoCollInTimeRangeStandard, - kMultAllTracksTPCOnly, - kMultAllTracksITSTPC, - kNTPCpileupContribA, - kNTPCpileupContribC, - kNTPCpileupZA, - kNTPCpileupZC, - kNTPCtracksInPast, - kNTPCtracksInFuture, - kNTPCcontribLongA, - kNTPCcontribLongC, - kNTPCmeanTimeLongA, - kNTPCmeanTimeLongC, - kNTPCmedianTimeLongA, - kNTPCmedianTimeLongC, - kNTPCcontribShortA, - kNTPCcontribShortC, - kNTPCmeanTimeShortA, - kNTPCmeanTimeShortC, - kNTPCmedianTimeShortA, - kNTPCmedianTimeShortC, - kDCAzBimodalityCoefficient, - kDCAzMean, - kDCAzRMS, - kDCAzSkewness, - kDCAzKurtosis, - kDCAzBimodalityCoefficientBinned, - kDCAzBimodalityCoefficientBinnedTrimmed1, - kDCAzBimodalityCoefficientBinnedTrimmed2, - kDCAzBimodalityCoefficientBinnedTrimmed3, - kDCAzMeanBinnedTrimmed1, - kDCAzMeanBinnedTrimmed2, - kDCAzMeanBinnedTrimmed3, - kDCAzRMSBinnedTrimmed1, - kDCAzRMSBinnedTrimmed2, - kDCAzRMSBinnedTrimmed3, - kDCAzFracAbove100um, - kDCAzFracAbove200um, - kDCAzFracAbove500um, - kDCAzFracAbove1mm, - kDCAzFracAbove2mm, - kDCAzFracAbove5mm, - kDCAzFracAbove10mm, - kDCAzNPeaks, - kDCAzNPeaksTrimmed1, - kDCAzNPeaksTrimmed2, - kDCAzNPeaksTrimmed3, - kMCEventGeneratorId, - kMCEventSubGeneratorId, - kMCVtxX, - kMCVtxY, - kMCVtxZ, - kMCEventTime, - kMCEventWeight, - kMCEventImpParam, - kMCEventCentrFT0C, - kMCEventPlaneAngle, - kMultMCNParticlesEta10, - kMultMCNParticlesEta08, - kMultMCNParticlesEta05, - kQ1ZNAX, - kQ1ZNAY, - kQ1ZNCX, - kQ1ZNCY, - KIntercalibZNA, - KIntercalibZNC, - kQ1ZNACXX, - kQ1ZNACYY, - kQ1ZNACYX, - kQ1ZNACXY, - kQ1X0A, // q-vector (e.g. from TPC) with x component (harmonic 1 and power 0), sub-event A - kQ1Y0A, // q-vector (e.g. from TPC) with y component (harmonic 1 and power 0), sub-event A - kQ1X0B, - kQ1Y0B, - kQ1X0C, - kQ1Y0C, - kQ2X0A, // q-vector (e.g. from TPC) with x component (harmonic 2 and power 0), sub-event A - kQ2Y0A, // q-vector (e.g. from TPC) with y component (harmonic 2 and power 0), sub-event A - kQ2X0APOS, // q-vector (e.g. from TPC) with x component (harmonic 2 and power 1), Pos. TPC - kQ2Y0APOS, // q-vector (e.g. from TPC) with y component (harmonic 2 and power 1), Pos. TPC - kQ2X0ANEG, // q-vector (e.g. from TPC) with x component (harmonic 2 and power 1), Neg. TPC - kQ2Y0ANEG, // q-vector (e.g. from TPC) with y component (harmonic 2 and power 1), Neg. TPC - kQ2X0B, - kQ2Y0B, - kQ2X0C, - kQ2Y0C, - kQ2YYAB, - kQ2XXAB, - kQ2XYAB, - kQ2YXAB, - kQ2YYAC, - kQ2XXAC, - kQ2XYAC, - kQ2YXAC, - kQ2YYBC, - kQ2XXBC, - kQ2XYBC, - kQ2YXBC, - kMultA, // Multiplicity of the sub-event A - kMultAPOS, // Multiplicity of the sub-event A - kMultANEG, // Multiplicity of the sub-event A - kMultB, - kMultC, - kQ3X0A, // q-vector (e.g. from TPC) with x component (harmonic 3 and power 0), sub-event A - kQ3Y0A, // q-vector (e.g. from TPC) with y component (harmonic 3 and power 0), sub-event A - kQ3X0B, - kQ3Y0B, - kQ3X0C, - kQ3Y0C, - kQ4X0A, // q-vector (e.g. from TPC) with x component (harmonic 4 and power 0), sub-event A - kQ4Y0A, // q-vector (e.g. from TPC) with y component (harmonic 4 and power 0), sub-event A - kQ4X0B, - kQ4Y0B, - kQ4X0C, - kQ4Y0C, - kR2SP_AB, - kR2SP_AC, - kR2SP_BC, - kWR2SP_AB, - kWR2SP_AC, - kWR2SP_BC, - kR2SP_AB_Im, - kR2SP_AC_Im, - kR2SP_BC_Im, - kWR2SP_AB_Im, - kWR2SP_AC_Im, - kWR2SP_BC_Im, - kR2SP_FT0CTPCPOS, - kR2SP_FT0CTPCNEG, - kR2SP_FT0ATPCPOS, - kR2SP_FT0ATPCNEG, - kR2SP_FT0MTPCPOS, - kR2SP_FT0MTPCNEG, - kR2SP_FV0ATPCPOS, - kR2SP_FV0ATPCNEG, - kR3SP, - kR2EP_AB, - kR2EP_AC, - kR2EP_BC, - kWR2EP_AB, - kWR2EP_AC, - kWR2EP_BC, - kR2EP_AB_Im, - kR2EP_AC_Im, - kR2EP_BC_Im, - kWR2EP_AB_Im, - kWR2EP_AC_Im, - kWR2EP_BC_Im, - kR2EP_FT0CTPCPOS, - kR2EP_FT0CTPCNEG, - kR2EP_FT0ATPCPOS, - kR2EP_FT0ATPCNEG, - kR2EP_FT0MTPCPOS, - kR2EP_FT0MTPCNEG, - kR2EP_FV0ATPCPOS, - kR2EP_FV0ATPCNEG, - kR3EP, - kIsDoubleGap, // Double rapidity gap - kIsSingleGapA, // Rapidity gap on side A - kIsSingleGapC, // Rapidity gap on side C - kIsSingleGap, // Rapidity gap on either side - kIsNoGap, // No rapidity gap - kIsITSUPCMode, // UPC mode used for event - kTwoEvPosZ1, // vtx-z for collision 1 in two events correlations - kTwoEvPosZ2, // vtx-z for collision 2 in two events correlations - kTwoEvPosR1, // vtx-R for collision 1 in two events correlations - kTwoEvPosR2, - kTwoEvCentFT0C1, - kTwoEvCentFT0C2, - kTwoEvPVcontrib1, // n-contributors for collision 1 in two events correlations - kTwoEvPVcontrib2, - kTwoEvDeltaZ, // distance in z between collisions - kTwoEvDeltaX, // distance in x between collisions - kTwoEvDeltaY, // distance in y between collisions - kTwoEvDeltaR, // distance in (x,y) plane between collisions - kEnergyCommonZNA, - kEnergyCommonZNC, - kEnergyCommonZPA, - kEnergyCommonZPC, - kEnergyZNA1, - kEnergyZNA2, - kEnergyZNA3, - kEnergyZNA4, - kEnergyZNC1, - kEnergyZNC2, - kEnergyZNC3, - kEnergyZNC4, - kTimeZNA, - kTimeZNC, - kTimeZPA, - kTimeZPC, - kQ2X0A1, - kQ2X0A2, - kQ2Y0A1, - kQ2Y0A2, - kU2Q2Ev1, - kU2Q2Ev2, - kCos2DeltaPhiEv1, - kCos2DeltaPhiEv2, - kV2SP1, - kV2SP2, - kV2EP1, - kV2EP2, - kV2ME_SP, - kV2ME_EP, - kWV2ME_SP, - kWV2ME_EP, - kTwoR2SP1, // Scalar product resolution of event1 for ME technique - kTwoR2SP2, // Scalar product resolution of event2 for ME technique - kTwoR2EP1, // Event plane resolution of event2 for ME technique - kTwoR2EP2, // Event plane resolution of event2 for ME technique - kNPairsPerEvent, // number of pairs per event in same-event or mixed-event pairing - kInteractionRate, - - // Variables for event mixing with cumulant - kV22m, - kV24m, - kV22p, - kV24p, - kV22ME, - kV24ME, - kWV22ME, - kWV24ME, - kNEventWiseVariables, - - // Basic track/muon/pair wise variables - kX = kNEventWiseVariables, - kY, - kZ, - kPt, - kSignedPt, - kInvPt, - kEta, - kTgl, - kPhi, - kP, - kPx, - kPy, - kPz, - kRap, - kMass, - kCharge, - kNBasicTrackVariables, - kUsedKF, - kKFMass, - kKFMassGeoTop, - - kPt1, - kEta1, - kPhi1, - kCharge1, - kDCAxy1, - kDCAz1, - kITSclusterMap1, - kTPCnSigmaEl1, - kPin_leg1, - kTPCnSigmaKa_leg1, - kPt2, - kEta2, - kPhi2, - kCharge2, - kDCAxy2, - kDCAz2, - kITSclusterMap2, - kTPCnSigmaEl2, - - // Barrel track variables - kPin, - kSignedPin, - kTOFExpMom, - kTrackTime, - kTrackTimeRes, - kTrackTimeResRelative, - kDetectorMap, - kHasITS, - kHasTRD, - kHasTOF, - kHasTPC, - kIsGlobalTrack, - kIsGlobalTrackSDD, - kIsITSrefit, - kIsSPDany, - kIsSPDfirst, - kIsSPDboth, - kIsITSibAny, - kIsITSibFirst, - kIsITSibAll, - kITSncls, - kITSchi2, - kITSlayerHit, - kITSmeanClsSize, - kIsTPCrefit, - kTPCncls, - kITSClusterMap, - kTPCnclsCR, - kTPCnCRoverFindCls, - kTPCchi2, - kTPCsignal, - kPhiTPCOuter, - kTrackIsInsideTPCModule, - kTRDsignal, - kTRDPattern, - kTOFbeta, - kTrackLength, - kTrackDCAxy, - kTrackDCAxyProng1, - kTrackDCAxyProng2, - kTrackDCAz, - kTrackDCAzProng1, - kTrackDCAzProng2, - kTrackDCAsigXY, - kTrackDCAsigZ, - kTrackDCAresXY, - kTrackDCAresZ, - kIsGoldenChi2, - kTrackCYY, - kTrackCZZ, - kTrackCSnpSnp, - kTrackCTglTgl, - kTrackC1Pt21Pt2, - kTPCnSigmaEl, - kTPCnSigmaMu, - kTPCnSigmaPi, - kTPCnSigmaKa, - kTPCnSigmaPr, - kTPCnSigmaEl_Corr, - kTPCnSigmaPi_Corr, - kTPCnSigmaKa_Corr, - kTPCnSigmaPr_Corr, - kTOFnSigmaEl, - kTOFnSigmaMu, - kTOFnSigmaPi, - kTOFnSigmaKa, - kTOFnSigmaPr, - kTrackTimeResIsRange, // Gaussian or range (see Framework/DataTypes) - kPVContributor, // This track has contributed to the collision vertex fit (see Framework/DataTypes) - kOrphanTrack, // Track has no association with any collision vertex (see Framework/DataTypes) - kIsAmbiguous, - kIsLegFromGamma, - kIsLegFromK0S, - kIsLegFromLambda, - kIsLegFromAntiLambda, - kIsLegFromOmega, - kIsProtonFromLambdaAndAntiLambda, - kIsDalitzLeg, // Up to 8 dalitz selections - kBarrelNAssocsInBunch = kIsDalitzLeg + 8, // number of in bunch collision associations - kBarrelNAssocsOutOfBunch, // number of out of bunch collision associations - kNBarrelTrackVariables, - - // Muon track variables - kMuonNClusters = kNBarrelTrackVariables, - kMuonPDca, - kMuonRAtAbsorberEnd, - kMCHBitMap, - kMuonChi2, - kMuonChi2MatchMCHMID, - kMuonChi2MatchMCHMFT, - kMuonMatchScoreMCHMFT, - kMuonCXX, - kMuonCXY, - kMuonCYY, - kMuonCPhiX, - kMuonCPhiY, - kMuonCPhiPhi, - kMuonCTglX, - kMuonCTglY, - kMuonCTglPhi, - kMuonCTglTgl, - kMuonC1Pt2X, - kMuonC1Pt2Y, - kMuonC1Pt2Phi, - kMuonC1Pt2Tgl, - kMuonC1Pt21Pt2, - kMuonTrackType, - kMuonDCAx, - kMuonDCAy, - kMuonTime, - kMuonTimeRes, - kMftNClusters, - kMftClusterSize, - kMftMeanClusterSize, - kMuonNAssocsInBunch, - kMuonNAssocsOutOfBunch, - kNMuonTrackVariables, - - // MC particle variables - kMCPdgCode, - kMCParticleWeight, - kMCPx, - kMCPy, - kMCPz, - kMCMass, - kMCE, - kMCVx, - kMCVy, - kMCVz, - kMCPt, - kMCPhi, - kMCEta, - kMCY, - kMCParticleGeneratorId, - kNMCParticleVariables, - kMCHadronPdgCode, - kMCCosTheta, - kMCJpsiPt, - kMCAccweight, - kMCCosChi, - kMCdeltaphi, - kMCdeltaeta, - kMCHadronPt, - kMCHadronEta, - kMCHadronPhi, - kMCWeight, - kMCCosChi_randomPhi_toward, - kMCWeight_randomPhi_toward, - kMCCosChi_randomPhi_away, - kMCWeight_randomPhi_away, - kMCCosChi_randomPhi_trans, - kMCWeight_randomPhi_trans, - kMCdeltaphi_randomPhi_toward, - kMCdeltaphi_randomPhi_away, - kMCdeltaphi_randomPhi_trans, - kMCHadronpt_randomPhi_trans, - kMCWeight_before, - kMCEWeight_before, - kMCCosChi_gen, - kMCWeight_gen, - kMCdeltaeta_gen, - kMCCosChi_rec, - kMCWeight_rec, - kMCdeltaeta_rec, - kMCCosChi_randomPhi_trans_rec, - kMCWeight_randomPhi_trans_rec, - kMCCosChi_randomPhi_trans_gen, - kMCWeight_randomPhi_trans_gen, - - // MC mother particle variables - kMCMotherPdgCode, - - // MC pair variables - kMCPt1, - kMCEta1, - kMCP1, - kMCPt2, - kMCEta2, - kMCP2, - kMCCosThetaHE, - kMCPhiHE, - kMCPhiTildeHE, - kMCCosThetaCS, - kMCPhiCS, - kMCPhiTildeCS, - kMCCosThetaPP, - kMCPhiPP, - kMCPhiTildePP, - kMCCosThetaRM, - kMCCosThetaStar, - - // Pair variables - kCandidateId, - kPairType, - kVertexingLxy, - kVertexingLxyErr, - kVertexingPseudoCTau, - kVertexingLxyz, - kVertexingLxyzErr, - kMCVertexingLxy, - kMCVertexingLxyz, - kMCLxyExpected, - kMCLxyzExpected, - kVertexingLz, - kVertexingLzErr, - kMCVertexingLz, - kVertexingTauxy, - kVertexingTauxyErr, - kMCVertexingTauxy, - kVertexingLzProjected, - kVertexingLxyProjected, - kVertexingLxyProjectedRecalculatePV, - kVertexingLxyzProjected, - kMCVertexingLzProjected, - kMCVertexingLxyProjected, - kMCVertexingLxyzProjected, - kVertexingTauzProjected, - kVertexingTauxyProjected, - kVertexingTauxyProjectedPoleJPsiMass, - kVertexingTauxyProjectedPoleJPsiMassRecalculatePV, - kVertexingTauxyProjectedNs, - kVertexingTauxyzProjected, - kMCVertexingTauzProjected, - kMCVertexingTauxyProjected, - kMCVertexingTauxyProjectedNs, - kMCVertexingTauxyzProjected, - kMCCosPointingAngle, - kVertexingTauz, - kMCVertexingTauz, - kVertexingTauzErr, - kVertexingPz, - kVertexingSV, - kVertexingProcCode, - kVertexingChi2PCA, - kCosThetaHE, - kPhiHE, - kPhiTildeHE, - kCosThetaCS, - kPhiCS, - kPhiTildeCS, - kCosThetaPP, - kPhiPP, - kPhiTildePP, - kCosThetaRM, - kCosThetaStarTPC, - kCosThetaStarFT0A, - kCosThetaStarFT0C, - kAbsCosThetaStarFT0C, - kCos2ThetaStarFT0C, - kCosThetaStarRandom, - kCos2ThetaStarRandom, - kCosPhiVP, - kPhiVP, - kDeltaPhiPair2, - kDeltaEtaPair2, - kPsiPair, - kDeltaPhiPair, - kOpeningAngle, - kQuadDCAabsXY, - kQuadDCAsigXY, - kQuadDCAabsZ, - kQuadDCAsigZ, - kQuadDCAsigXYZ, - kSignQuadDCAsigXY, - kCosPointingAngle, - kImpParXYJpsi, - kImpParXYK, - kDCATrackProd, - kDCATrackVtxProd, - kV2SP, - kV2EP, - kWV2SP, - kWV2EP, - kU2Q2, - kU2Q2POS, - kU2Q2NEG, - kU3Q3, - kQ42XA, - kQ42YA, - kQ23XA, - kQ23YA, - kS11A, - kS12A, - kS13A, - kS31A, - kM11REF, - kM11REFetagap, - kM01POI, - kM1111REF, - kM11M1111REF, - kM11M1111REFoverMp, - kM01M0111POIoverMp, - kM0111POI, - kCORR2REF, - kCORR2REFbydimuons, - kCORR2REFbysinglemu, - kCORR2REFetagap, - kCORR2POI, - kCORR2POICORR4POI, - kCORR2REFCORR4POI, - kCORR2REFCORR2POI, - kM01M0111overMp, - kM11M0111overMp, - kM11M01overMp, - kCORR2CORR4REF, - kCORR4REF, - kCORR4REFbydimuons, - kCORR4REFbysinglemu, - kCORR4POI, - kM11REFoverMp, - kM01POIoverMp, - kM1111REFoverMp, - kM0111POIoverMp, - kCORR2POIMp, - kCORR4POIMp, - kM01POIplus, - 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, - kCORR2POIME, - kCORR4POIME, - kM01POIoverMpME, - kM0111POIoverMpME, - kM11REFoverMpME, - kM1111REFoverMpME, - kCORR2REFbydimuonsME, - kCORR4REFbydimuonsME, - kR2SP, - kR2EP, - kPsi2A, - kPsi2APOS, - kPsi2ANEG, - kPsi2B, - kPsi2C, - kRandomPsi2, - kCos2DeltaPhi, - kCos2DeltaPhiPOS, - kCos2DeltaPhiNEG, - kCos2DeltaPhiMu1, // cos(phi - phi1) for muon1 - kCos2DeltaPhiMu2, ////cos(phi - phi2) for muon2 - kCos3DeltaPhi, - kDeltaPtotTracks, - kVertexingLxyOverErr, - kVertexingLzOverErr, - kVertexingLxyzOverErr, - kKFTrack0DCAxyz, - kKFTrack1DCAxyz, - kKFTracksDCAxyzMax, - kKFDCAxyzBetweenProngs, - kKFTrack0DCAxy, - kKFTrack1DCAxy, - kKFTracksDCAxyMax, - kKFDCAxyBetweenProngs, - kKFTrack0DeviationFromPV, - kKFTrack1DeviationFromPV, - kKFTrack0DeviationxyFromPV, - kKFTrack1DeviationxyFromPV, - kKFChi2OverNDFGeo, - kKFNContributorsPV, - kKFCosPA, - kKFChi2OverNDFGeoTop, - kKFJpsiDCAxyz, - kKFJpsiDCAxy, - kKFPairDeviationFromPV, - kKFPairDeviationxyFromPV, - kS12, - kS13, - kS23, - kPairEfficiency, - kPairWeight, - kNPairVariables, - - // Candidate-track correlation variables - kPairMass, - kPairMassDau, - kMassDau, - kPairPt, - kPairPtDau, - kPairEta, - kPairRap, - kPairPhi, - kPairPhiv, - kDeltaEta, - kDeltaPhi, - kDeltaPhiSym, - kNCorrelationVariables, - kDileptonHadronKstar, - kCosChi, - kEtaDau, - kPhiDau, - kWeight, - kECWeight, - kPtDau, - kCosTheta, - kEWeight_before, - kWeight_before, - kCosChi_randomPhi_trans, - kCosChi_randomPhi_toward, - kCosChi_randomPhi_away, - kWeight_randomPhi_trans, - kWeight_randomPhi_toward, - kWeight_randomPhi_away, - kdeltaphi_randomPhi_trans, - kdeltaphi_randomPhi_toward, - kdeltaphi_randomPhi_away, - kdileptonmass, - kPtDau_randomPhi_trans, - - // Dilepton-track-track variables - kQuadMass, - kQuadDefaultDileptonMass, - kQuadPt, - kQuadEta, - kQuadPhi, - kCosthetaDileptonDitrack, - kDitrackMass, - kDitrackPt, - kQ, - kDeltaR1, - kDeltaR2, - kDeltaR, - - // DQ-HF correlation variables - kMassCharmHadron, - kPtCharmHadron, - kRapCharmHadron, - kPhiCharmHadron, - kBdtCharmHadron, - - // Resolution variables - kDeltaPt, - kPtResolution, - kEtaResolution, - - // Index used to scan bit maps - kBitMapIndex, - - // deltaMass = kPairMass - kPairMassDau - kDeltaMass, - // deltaMass_jpsi = kPairMass - kPairMassDau +3.096900 - kDeltaMass_jpsi, - - // BDT score - kBdtBackground, - kBdtPrompt, - kBdtNonprompt, - - // FIT detector variables - kAmplitudeFT0A, - kAmplitudeFT0C, - kAmplitudeFT0M, - kTimeFT0A, - kTimeFT0C, - kTriggerMaskFT0, - kFT0OrA, - kFT0OrC, - kAmplitudeFDDA, - kAmplitudeFDDC, - kTimeFDDA, - kTimeFDDC, - kTriggerMaskFDD, - kAmplitudeFV0A, - kTimeFV0A, - kTriggerMaskFV0A, - kBBFT0Apf, - kBGFT0Apf, - kBBFT0Cpf, - kBGFT0Cpf, - kBBFV0Apf, - kBGFV0Apf, - kBBFDDApf, - kBGFDDApf, - kBBFDDCpf, - kBGFDDCpf, - kNFiredChannelsFT0A, - kNFiredChannelsFT0C, - kNFiredChannelsFV0A, - - // ALICE 3 Variables - kMultDensity, - kMultMCNParticlesEta40, - kMultMCNParticlesEta20, - kIsReconstructed, - kNSiliconHits, - kNTPCHits, - kOTTOTSignal, - kOTnSigmaEl, - kOTnSigmaMu, - kOTnSigmaPi, - kOTnSigmaKa, - kOTnSigmaPr, - kOTnSigmaDe, - kOTnSigmaTr, - kOTnSigmaHe3, - kOTnSigmaAl, - kHasRICHSig, - kHasRICHSigInGas, - kHasRICHSigEl, - kHasRICHSigMu, - kHasRICHSigPi, - kHasRICHSigKa, - kHasRICHSigPr, - kHasRICHSigDe, - kHasRICHSigTr, - kHasRICHSigHe3, - kHasRICHSigAl, - kRICHnSigmaEl, - kRICHnSigmaMu, - kRICHnSigmaPi, - kRICHnSigmaKa, - kRICHnSigmaPr, - kRICHnSigmaDe, - kRICHnSigmaTr, - kRICHnSigmaHe3, - kRICHnSigmaAl, - kTOFEventTime, - kTOFEventTimeErr, - kiTOFBeta, - koTOFBeta, - kOuterTOFnSigmaEl, - kOuterTOFnSigmaMu, - kOuterTOFnSigmaPi, - kOuterTOFnSigmaKa, - kOuterTOFnSigmaPr, - kOuterTOFnSigmaDe, - kOuterTOFnSigmaTr, - kOuterTOFnSigmaHe3, - kOuterTOFnSigmaAl, - kInnerTOFnSigmaEl, - kInnerTOFnSigmaMu, - kInnerTOFnSigmaPi, - kInnerTOFnSigmaKa, - kInnerTOFnSigmaPr, - kInnerTOFnSigmaDe, - kInnerTOFnSigmaTr, - kInnerTOFnSigmaHe3, - kInnerTOFnSigmaAl, - kA3Variables, - - kNVars - }; // end of Variables enumeration - - enum CalibObjects { - kTPCElectronMean = 0, - kTPCElectronSigma, - kTPCElectronStatus, - kTPCPionMean, - kTPCPionSigma, - kTPCPionStatus, - kTPCKaonMean, - kTPCKaonSigma, - kTPCKaonStatus, - kTPCProtonMean, - kTPCProtonSigma, - kTPCProtonStatus, - kNCalibObjects - }; - - enum EfficiencyType { - kNone = 0, - kPairPtCentFT0cCosThetaStarFT0c, - kPairPtCentFT0cCosThetaStarRandom, - // Add more efficiency types as needed - kNEfficiencyTypes - }; - - enum DileptonCharmHadronTypes { - kJPsi = 0, - kD0ToPiK, - kD0barToKPi - }; - - enum EventFilters { - kDoubleGap = 0, - kSingleGapA, - kSingleGapC, - kITSUPCMode - }; - - enum MuonExtrapolation { - // Index used to set different options for Muon propagation - kToVertex = 0, // propagtion to vertex by default - kToDCA, - kToRabs, - kToMatching - }; - - 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(); - - static void SetUseVariable(int var) - { - if (var >= 0 && var < kNVars) { - fgUsedVars[var] = kTRUE; - } - SetVariableDependencies(); - } - static void SetUseVars(const bool* usedVars) - { - for (int i = 0; i < kNVars; ++i) { - if (usedVars[i]) { - fgUsedVars[i] = true; // overwrite only the variables that are being used since there are more channels to modify the used variables array, independently - } - } - SetVariableDependencies(); - } - static void SetUseVars(const std::vector usedVars) - { - for (auto& var : usedVars) { - fgUsedVars[var] = true; - } - } - static bool GetUsedVar(int var) - { - if (var >= 0 && var < kNVars) { - return fgUsedVars[var]; - } - return false; - } - - // Flag to set PV recalculation via KF - static void SetPVrecalculationKF(const bool pvRecalKF) - { - fgPVrecalKF = pvRecalKF; - } - - // Setup the collision system - static void SetCollisionSystem(TString system, float energy); - static void SetCollisionSystem(o2::parameters::GRPLHCIFData* grplhcif); - - static void SetMagneticField(float magField) - { - fgMagField = magField; - } - - // Setup plane position for MFT-MCH matching - static void SetMatchingPlane(float z) - { - fgzMatching = z; - } - - static float GetMatchingPlane() - { - return fgzMatching; - } - - // Set z shift for forward tracks - static void SetZShift(float z) - { - fgzShiftFwd = z; - } - - // Setup the 2 prong KFParticle - static void SetupTwoProngKFParticle(float magField) - { - KFParticle::SetField(magField); - fgUsedKF = true; - } - // Setup magnetic field for muon propagation - static void SetupMuonMagField() - { - o2::mch::TrackExtrap::setField(); - } - - // Setup the 2 prong DCAFitterN - static void SetupTwoProngDCAFitter(float magField, bool propagateToPCA, float maxR, float maxDZIni, float minParamChange, float minRelChi2Change, bool useAbsDCA) - { - fgFitterTwoProngBarrel.setBz(magField); - fgFitterTwoProngBarrel.setPropagateToPCA(propagateToPCA); - fgFitterTwoProngBarrel.setMaxR(maxR); - fgFitterTwoProngBarrel.setMaxDZIni(maxDZIni); - fgFitterTwoProngBarrel.setMinParamChange(minParamChange); - fgFitterTwoProngBarrel.setMinRelChi2Change(minRelChi2Change); - fgFitterTwoProngBarrel.setUseAbsDCA(useAbsDCA); - fgUsedKF = false; - } - - // Setup the 2 prong FwdDCAFitterN - static void SetupTwoProngFwdDCAFitter(float magField, bool propagateToPCA, float maxR, float minParamChange, float minRelChi2Change, bool useAbsDCA) - { - fgFitterTwoProngFwd.setBz(magField); - fgFitterTwoProngFwd.setPropagateToPCA(propagateToPCA); - fgFitterTwoProngFwd.setMaxR(maxR); - fgFitterTwoProngFwd.setMinParamChange(minParamChange); - fgFitterTwoProngFwd.setMinRelChi2Change(minRelChi2Change); - fgFitterTwoProngFwd.setUseAbsDCA(useAbsDCA); - fgUsedKF = false; - } - // Use MatLayerCylSet to correct MCS in fwdtrack propagation - static void SetupMatLUTFwdDCAFitter(o2::base::MatLayerCylSet* m) - { - fgFitterTwoProngFwd.setTGeoMat(false); - fgFitterTwoProngFwd.setMatLUT(m); - } - // Use GeometryManager to correct MCS in fwdtrack propagation - static void SetupTGeoFwdDCAFitter() - { - fgFitterTwoProngFwd.setTGeoMat(true); - } - // No material budget in fwdtrack propagation - static void SetupFwdDCAFitterNoCorr() - { - fgFitterTwoProngFwd.setTGeoMat(false); - } - // Setup the 3 prong KFParticle - static void SetupThreeProngKFParticle(float magField) - { - KFParticle::SetField(magField); - fgUsedKF = true; - } - - // Setup the 3 prong DCAFitterN - static void SetupThreeProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA) - { - fgFitterThreeProngBarrel.setBz(magField); - fgFitterThreeProngBarrel.setPropagateToPCA(propagateToPCA); - fgFitterThreeProngBarrel.setMaxR(maxR); - fgFitterThreeProngBarrel.setMinParamChange(minParamChange); - fgFitterThreeProngBarrel.setMinRelChi2Change(minRelChi2Change); - fgFitterThreeProngBarrel.setUseAbsDCA(useAbsDCA); - fgUsedKF = false; - } - - // Setup the 4 prong KFParticle - static void SetupFourProngKFParticle(float magField) - { - KFParticle::SetField(magField); - fgUsedKF = true; - } - - // Setup the 4 prong DCAFitterN - static void SetupFourProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA) - { - fgFitterFourProngBarrel.setBz(magField); - fgFitterFourProngBarrel.setPropagateToPCA(propagateToPCA); - fgFitterFourProngBarrel.setMaxR(maxR); - fgFitterFourProngBarrel.setMinParamChange(minParamChange); - fgFitterFourProngBarrel.setMinRelChi2Change(minRelChi2Change); - fgFitterFourProngBarrel.setUseAbsDCA(useAbsDCA); - fgUsedKF = false; - } - - static auto getEventPlane(int harm, float qnxa, float qnya) - { - // Compute event plane angle from qn vector components for the sub-event A - return (1.0 / harm) * TMath::ATan2(qnya, qnxa); - }; - - static float getDeltaPsiInRange(float psi1, float psi2, float harmonic) - { - float deltaPsi = psi1 - psi2; - if (std::abs(deltaPsi) > o2::constants::math::PI / harmonic) { - if (deltaPsi > 0.) { - deltaPsi -= o2::constants::math::TwoPI / harmonic; - } else { - deltaPsi += o2::constants::math::TwoPI / harmonic; - } - } - return deltaPsi; - } - template - static o2::dataformats::VertexBase RecalculatePrimaryVertex(T const& track0, T const& track1, const T1& collision); - - static std::tuple BimodalityCoefficientUnbinned(const std::vector& data); - static std::tuple BimodalityCoefficientAndNPeaks(const std::vector& data, float binWidth, int trim = 0, float min = -15.0, float max = 15.0); - - template - static o2::track::TrackParCovFwd FwdToTrackPar(const T& track, const C& cov); - template - static o2::dataformats::GlobalFwdTrack PropagateMuon(const T& muon, const C& collision, int endPoint = kToVertex); - template - static o2::track::TrackParCovFwd PropagateFwd(const T& track, const C& cov, float z); - template - static void FillMuonPDca(const T& muon, const C& collision, float* values = nullptr); - template - static void FillPropagateMuon(const T& muon, const C& collision, float* values = nullptr); - template - static void FillBC(T const& bc, float* values = nullptr); - template - static void FillEvent(T const& event, float* values = nullptr); - template - static void FillEventTracks(T const& tracks, float* values = nullptr); - template - static void FillTimeFrame(T const& tfTable, float* values = nullptr); - template - static void FillEventFlowResoFactor(T const& hs_sp, T const& hs_ep, float* values = nullptr); - template - static void FillTwoEvents(T const& event1, T const& event2, float* values = nullptr); - template - 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 - static void FillPhoton(T const& photon, float* values = nullptr); - template - static void FillTrackCollision(T const& track, C const& collision, float* values = nullptr); - template - static void FillTrackCollisionMC(T1 const& track, T2 const& MotherTrack, C const& collision, float* values = nullptr); - template - static void FillTrackCollisionMC(T1 const& track, const std::array& collPos, float massHyp = -1., float* values = nullptr); - template - static void FillTrackCollisionMatCorr(T const& track, C const& collision, M const& materialCorr, P const& propagator, float* values = nullptr); - template - static void FillTrackMC(const U& mcStack, T const& track, float* values = nullptr); - template - static void FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3, float Accweight = 1.0f); - template - static void FillPairPropagateMuon(T1 const& muon1, T2 const& muon2, const C& collision, float* values = nullptr); - template - static void FillGlobalMuonRefit(T1 const& muontrack, T2 const& mfttrack, const C& collision, float* values = nullptr); - template - static void FillGlobalMuonRefitCov(T1 const& muontrack, T2 const& mfttrack, const C& collision, C2 const& mftcov, float* values = nullptr); - template - static void FillPair(T1 const& t1, T2 const& t2, float* values = nullptr); - template - static void FillPairRotation(T1 const& t1, T2 const& t2, float* values = nullptr); - template - static void FillPairCollision(C const& collision, T1 const& t1, T2 const& t2, float* values = nullptr); - template - static void FillPairCollisionMatCorr(C const& collision, T1 const& t1, T2 const& t2, M const& materialCorr, P const& propagator, float* values = nullptr); - template - 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 FillPairMEAcrossTFs(T const& t1, T const& t2, float* values = nullptr); - 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); - template - static void FillQuadMC(T1 const& t1, T2 const& t2, T2 const& t3, float* values = nullptr); - template - static void FillPairVertexing(C const& collision, T const& t1, T const& t2, bool propToSV = false, float* values = nullptr); - template - static void FillPairVertexingRecomputePV(C const& /*collision*/, T const& t1, T const& t2, o2::dataformats::VertexBase pvRefitted, float* values = nullptr); - template - static void FillTripletVertexing(C const& collision, T const& t1, T const& t2, T const& t3, PairCandidateType tripletType, float* values = nullptr); - template - static void FillDileptonTrackVertexing(C const& collision, T1 const& lepton1, T1 const& lepton2, T1 const& track, float* values); - template - static void FillDileptonHadron(T1 const& dilepton, T2 const& hadron, float* values = nullptr, float hadronMass = 0.0f); - template - static void FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3, bool applyFitMass = false, float sidebandMass = 0.0f, float weight = 1.0f); - template - static void FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values = nullptr, bool applyFitMass = false, float Effweight_rec = 1.f, float Accweight_gen = 1.f, float Translow = 1. / 3, float Transhigh = 2. / 3); - template - static void FillDileptonPhoton(T1 const& dilepton, T2 const& photon, float* values = nullptr); - template - static void FillHadron(T const& hadron, float* values = nullptr, float hadronMass = 0.0f); - template - static void FillSingleDileptonCharmHadron(Cand const& candidate, H hfHelper, T& bdtScoreCharmHad, float* values = nullptr); - template - static void FillDileptonCharmHadron(DQ const& dilepton, HF const& charmHadron, H hfHelper, T& bdtScoreCharmHad, float* values = nullptr); - template - static void FillQVectorFromGFW(C const& collision, A const& compA11, A const& compB11, A const& compC11, A const& compA21, A const& compB21, A const& compC21, A const& compA31, A const& compB31, A const& compC31, A const& compA41, A const& compB41, A const& compC41, A const& compA23, A const& compA42, float S10A = 1.0, float S10B = 1.0, float S10C = 1.0, float S11A = 1.0, float S11B = 1.0, float S11C = 1.0, float S12A = 1.0, float S13A = 1.0, float S14A = 1.0, float S21A = 1.0, float S22A = 1.0, float S31A = 1.0, float S41A = 1.0, float* values = nullptr); - template - static void FillQVectorFromCentralFW(C const& collision, float* values = nullptr); - template - static void FillNewQVectorFromCentralFW(C const& collision, float* values = nullptr); - template - static void FillSpectatorPlane(C const& collision, float* values = nullptr); - template - static void FillPairVn(T1 const& t1, T2 const& t2, float* values = nullptr); - template - static void FillDileptonTrackTrack(T1 const& dilepton, T2 const& hadron1, T3 const& hadron2, float* values = nullptr); - template - static void FillDileptonTrackTrackVertexing(C const& collision, T1 const& lepton1, T1 const& lepton2, T1 const& track1, T1 const& track2, float* values); - template - static void FillZDC(const T& zdc, float* values = nullptr); - template - static void FillBdtScore(const T& bdtScore, float* values = nullptr); - template - static void FillFIT(const T1& bc, const T2& bcs, const T3& ft0s, const T4& fv0as, const T5& fdds, float* values = nullptr); - template - static void FillPairAlice3(T1 const& t1, T2 const& t2, float* values = nullptr); - template - static void FillEventAlice3(T const& event, float* values = nullptr); - template - static void FillTrackAlice3(T const& track, float* values = nullptr); - template - static void FillResolutions(M const& mcTrack, T const& track, float* values = nullptr); - - static void SetCalibrationObject(CalibObjects calib, TObject* obj) - { - fgCalibs[calib] = obj; - // 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 void SetCalibrationType(int type, bool useInterpolation = true) - { - if (type < 0 || type > 2) { - LOG(fatal) << "Invalid calibration type. Must be 0, 1, or 2."; - } - fgCalibrationType = type; - fgUseInterpolatedCalibration = useInterpolation; - } - static double ComputePIDcalibration(int species, double nSigmaValue); - - static void SetEfficiencyObject(int type, TObject* obj); - static void FillEfficiency(float* values = nullptr); - static TObject* GetCalibrationObject(CalibObjects calib) - { - auto obj = fgCalibs.find(calib); - if (obj == fgCalibs.end()) { - return 0x0; - } else { - return obj->second; - } - } - static void SetTPCInterSectorBoundary(float boundarySize) - { - fgTPCInterSectorBoundary = boundarySize; - } - static void SetITSROFBorderselection(int bias, int length, int marginLow, int marginHigh) - { - fgITSROFbias = bias; - fgITSROFlength = length; - fgITSROFBorderMarginLow = marginLow; - fgITSROFBorderMarginHigh = marginHigh; - } - - static void SetSORandEOR(uint64_t sor, uint64_t eor) - { - fgSOR = sor; - fgEOR = eor; - } - - public: - VarManager(); - ~VarManager() override; - - static float fgValues[kNVars]; // array holding all variables computed during analysis - static void ResetValues(int startValue = 0, int endValue = kNVars, float* values = nullptr); - - private: - static bool fgUsedVars[kNVars]; // holds flags for when the corresponding variable is needed (e.g., in the histogram manager, in cuts, mixing handler, etc.) - static bool fgUsedKF; - static bool fgPVrecalKF; - static void SetVariableDependencies(); // toggle those variables on which other used variables might depend - - static float fgMagField; - static float fgzMatching; - static float fgzShiftFwd; - 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 - static int fgITSROFbias; // ITS ROF bias (from ALPIDE parameters) - static int fgITSROFlength; // ITS ROF length (from ALPIDE parameters) - static int fgITSROFBorderMarginLow; // ITS ROF border low margin - static int fgITSROFBorderMarginHigh; // ITS ROF border high margin - static uint64_t fgSOR; // Timestamp for start of run - static uint64_t fgEOR; // Timestamp for end of run - static ROOT::Math::PxPyPzEVector fgBeamA; // beam from A-side 4-momentum vector - static ROOT::Math::PxPyPzEVector fgBeamC; // beam from C-side 4-momentum vector - - // static void FillEventDerived(float* values = nullptr); - static void FillTrackDerived(float* values = nullptr); - template - static auto getRotatedCovMatrixXX(const T& matrix, U phi, V theta); - template - static KFPTrack createKFPTrackFromTrack(const T& track); - template - static KFPTrack createKFPFwdTrackFromFwdTrack(const T& muon); - template - static KFPVertex createKFPVertexFromCollision(const T& collision); - static float calculateCosPA(KFParticle kfp, KFParticle PV); - template - static float calculatePhiV(const T1& t1, const T2& t2); - template - static float LorentzTransformJpsihadroncosChi(TString Option, const T1& v1, const T2& v2); - - static o2::vertexing::DCAFitterN<2> fgFitterTwoProngBarrel; - static o2::vertexing::DCAFitterN<3> fgFitterThreeProngBarrel; - static o2::vertexing::DCAFitterN<4> fgFitterFourProngBarrel; - static o2::vertexing::FwdDCAFitterN<2> fgFitterTwoProngFwd; - static o2::vertexing::FwdDCAFitterN<3> fgFitterThreeProngFwd; - static o2::globaltracking::MatchGlobalFwd mMatching; - - static std::map fgCalibs; // map of calibration histograms - static bool fgRunTPCPostCalibration[4]; // 0-electron, 1-pion, 2-kaon, 3-proton - static int fgCalibrationType; // 0 - no calibration, 1 - calibration vs (TPCncls,pIN,eta) typically for pp, 2 - calibration vs (eta,nPV,nLong,tLong) typically for PbPb - static bool fgUseInterpolatedCalibration; // use interpolated calibration histograms (default: true) - - static int fgEfficiencyType; // type of efficiency correction to apply - static TObject* fgEfficiencyHist; // histogram for efficiency correction - - VarManager& operator=(const VarManager& c); - VarManager(const VarManager& c); - - ClassDef(VarManager, 6); -}; - template o2::track::TrackParCovFwd VarManager::FwdToTrackPar(const T& track, const C& cov) { From 4af40289d5ffd22b84837b05f18ec01bf278e2e2 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 26 Jun 2026 08:58:36 +0000 Subject: [PATCH 3/7] Please consider the following formatting changes --- Common/Core/fwdtrackUtilities.h | 5 ++-- PWGDQ/Core/VarManager.cxx | 18 +++++++------- PWGEM/Dilepton/DataModel/dileptonTables.h | 6 ++--- PWGEM/PhotonMeson/Core/PHOSPhotonCut.h | 2 ++ PWGEM/PhotonMeson/Core/V0PhotonCut.h | 5 ++-- PWGEM/PhotonMeson/Utils/TrackSelection.h | 15 +++++------- PWGUD/Core/decayTree.cxx | 30 +++++++++++------------ 7 files changed, 39 insertions(+), 42 deletions(-) diff --git a/Common/Core/fwdtrackUtilities.h b/Common/Core/fwdtrackUtilities.h index a178f4fc831..bc947d588f6 100644 --- a/Common/Core/fwdtrackUtilities.h +++ b/Common/Core/fwdtrackUtilities.h @@ -48,13 +48,12 @@ using SMatrix55Std = ROOT::Math::SMatrix; using SMatrix5 = ROOT::Math::SVector; template -concept is_fwd_track = requires (T t) { +concept is_fwd_track = requires(T t) { { t.rAtAbsorberEnd() } -> std::same_as; }; template -concept is_fwd_cov = requires (T t) -{ +concept is_fwd_cov = requires(T t) { { t.sigmaX() } -> std::same_as; }; diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 35b3d464a8c..e3940839166 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -673,7 +673,7 @@ bool VarManager::GetUsedVar(int var) return false; } - // Flag to set PV recalculation via KF +// Flag to set PV recalculation via KF void VarManager::SetPVrecalculationKF(const bool pvRecalKF) { fgPVrecalKF = pvRecalKF; @@ -684,7 +684,7 @@ void VarManager::SetMagneticField(float magField) fgMagField = magField; } - // Setup plane position for MFT-MCH matching +// Setup plane position for MFT-MCH matching void VarManager::SetMatchingPlane(float z) { fgzMatching = z; @@ -695,13 +695,13 @@ float VarManager::GetMatchingPlane() return fgzMatching; } - // Set z shift for forward tracks +// Set z shift for forward tracks void VarManager::SetZShift(float z) { fgzShiftFwd = z; } - // Setup the 2 prong KFParticle +// Setup the 2 prong KFParticle void VarManager::SetupTwoProngKFParticle(float magField) { KFParticle::SetField(magField); @@ -713,7 +713,7 @@ void VarManager::SetupMuonMagField() o2::mch::TrackExtrap::setField(); } - // Setup the 2 prong DCAFitterN +// Setup the 2 prong DCAFitterN void VarManager::SetupTwoProngDCAFitter(float magField, bool propagateToPCA, float maxR, float maxDZIni, float minParamChange, float minRelChi2Change, bool useAbsDCA) { fgFitterTwoProngBarrel.setBz(magField); @@ -726,7 +726,7 @@ void VarManager::SetupTwoProngDCAFitter(float magField, bool propagateToPCA, flo fgUsedKF = false; } - // Setup the 2 prong FwdDCAFitterN +// Setup the 2 prong FwdDCAFitterN void VarManager::SetupTwoProngFwdDCAFitter(float magField, bool propagateToPCA, float maxR, float minParamChange, float minRelChi2Change, bool useAbsDCA) { fgFitterTwoProngFwd.setBz(magField); @@ -760,7 +760,7 @@ void VarManager::SetupThreeProngKFParticle(float magField) fgUsedKF = true; } - // Setup the 3 prong DCAFitterN +// Setup the 3 prong DCAFitterN void VarManager::SetupThreeProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA) { fgFitterThreeProngBarrel.setBz(magField); @@ -772,14 +772,14 @@ void VarManager::SetupThreeProngDCAFitter(float magField, bool propagateToPCA, f fgUsedKF = false; } - // Setup the 4 prong KFParticle +// Setup the 4 prong KFParticle void VarManager::SetupFourProngKFParticle(float magField) { KFParticle::SetField(magField); fgUsedKF = true; } - // Setup the 4 prong DCAFitterN +// Setup the 4 prong DCAFitterN void VarManager::SetupFourProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA) { fgFitterFourProngBarrel.setBz(magField); diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index 2e4c94c3a49..b1c306f17fe 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -13,12 +13,12 @@ #include "Common/CCDB/EventSelectionParams.h" #include "Common/Core/RecoDecay.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponseTOF.h" #include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/TrackSelectionTables.h" -#include -#include -#include #include #include diff --git a/PWGEM/PhotonMeson/Core/PHOSPhotonCut.h b/PWGEM/PhotonMeson/Core/PHOSPhotonCut.h index 73569263ec2..8c0287bc71b 100644 --- a/PWGEM/PhotonMeson/Core/PHOSPhotonCut.h +++ b/PWGEM/PhotonMeson/Core/PHOSPhotonCut.h @@ -17,7 +17,9 @@ #define PWGEM_PHOTONMESON_CORE_PHOSPHOTONCUT_H_ #include "PWGEM/PhotonMeson/Utils/TrackSelection.h" + #include + #include class PHOSPhotonCut : public TNamed diff --git a/PWGEM/PhotonMeson/Core/V0PhotonCut.h b/PWGEM/PhotonMeson/Core/V0PhotonCut.h index 5668815d7a6..c371b2e0a71 100644 --- a/PWGEM/PhotonMeson/Core/V0PhotonCut.h +++ b/PWGEM/PhotonMeson/Core/V0PhotonCut.h @@ -164,9 +164,8 @@ concept IsNonLinIterator = requires(T t) { } // namespace o2::analysis::em::v0 template -concept is_table = requires(T t) -{ - { t.begin() } ->std::same_as::iterator>; +concept is_table = requires(T t) { + { t.begin() } -> std::same_as::iterator>; }; class V0PhotonCut : public TNamed diff --git a/PWGEM/PhotonMeson/Utils/TrackSelection.h b/PWGEM/PhotonMeson/Utils/TrackSelection.h index 93f6ad911e4..f1302cc9573 100644 --- a/PWGEM/PhotonMeson/Utils/TrackSelection.h +++ b/PWGEM/PhotonMeson/Utils/TrackSelection.h @@ -17,33 +17,30 @@ #define PWGEM_PHOTONMESON_UTILS_TRACKSELECTION_H_ #include -#include + #include +#include template -concept is_iterator = requires (T t) -{ +concept is_iterator = requires(T t) { typename std::decay_t::policy_t; typename std::decay_t::all_columns; t.getIndexBindings(); }; template -concept is_sentinel = requires (T t) -{ +concept is_sentinel = requires(T t) { std::same_as; }; template -concept is_track_with_extra = requires (T t) -{ +concept is_track_with_extra = requires(T t) { { t.hasITS() } -> std::same_as; { t.hasTPC() } -> std::same_as; }; template -concept is_mc_particle = requires (T t) -{ +concept is_mc_particle = requires(T t) { { t.pdgCode() } -> std::same_as; }; diff --git a/PWGUD/Core/decayTree.cxx b/PWGUD/Core/decayTree.cxx index 3c730320a35..058c85f4caf 100644 --- a/PWGUD/Core/decayTree.cxx +++ b/PWGUD/Core/decayTree.cxx @@ -1248,7 +1248,7 @@ void decayTree::createHistograms(o2::framework::HistogramRegistry& registry) auto max = o2::framework::AxisSpec(res->nmassBins(), res->massHistRange()[0], res->massHistRange()[1]); auto momax = o2::framework::AxisSpec(res->nmomBins(), res->momHistRange()[0], res->momHistRange()[1]); - // M-pT, M-eta, pT-eta + // M-pT, M-eta, pT-eta for (const auto& cc : fccs) { base = cc; base.append("/").append(res->name()).append("/"); @@ -1262,20 +1262,20 @@ void decayTree::createHistograms(o2::framework::HistogramRegistry& registry) annot = "pT versus eta; pT (" + res->name() + ") GeV/c; eta (" + res->name() + ")"; fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {o2::framework::HistType::kTH2F, {momax, etax}})}); - // M versus daughters + // 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 + // 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 = o2::framework::AxisSpec(d1->nmomBins(), d1->momHistRange()[0], d1->momHistRange()[1]); fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {o2::framework::HistType::kTH2F, {max, momax1}})}); - // M vs eta daughter + // 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() + ")"; @@ -1292,19 +1292,19 @@ void decayTree::createHistograms(o2::framework::HistogramRegistry& registry) 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(), {o2::framework::HistType::kTH2F, {max, dcazax}})}); - // M vs chi2 track + // 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(), {o2::framework::HistType::kTH2F, {max, chi2ax}})}); - // M vs nCl track + // 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(), {o2::framework::HistType::kTH2F, {max, nClax}})}); - // M versus detector hits + // 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() + ")"; @@ -1319,7 +1319,7 @@ void decayTree::createHistograms(o2::framework::HistogramRegistry& registry) } } - // daughters vs daughters + // daughters vs daughters for (auto i = 0; i < static_cast(ndaughs - 1); i++) { auto d1 = getResonance(daughs[i]); auto max1 = o2::framework::AxisSpec(d1->nmassBins(), d1->massHistRange()[0], d1->massHistRange()[1]); @@ -1327,25 +1327,25 @@ void decayTree::createHistograms(o2::framework::HistogramRegistry& registry) auto d2 = getResonance(daughs[j]); auto max2 = o2::framework::AxisSpec(d2->nmassBins(), d2->massHistRange()[0], d2->massHistRange()[1]); - // M1 vs M2 + // 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(), {o2::framework::HistType::kTH2F, {max1, max2}})}); - // angle(d1, d2) + // 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(), {o2::framework::HistType::kTH1F, {angax}})}); - // M vs angle(d1, d2) + // 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(), {o2::framework::HistType::kTH2F, {max, angax}})}); - // both daughters are finals + // both daughters are finals if (d1->isFinal() && d2->isFinal()) { hname = base; hname.append("TPCsignal_").append(d1->name()).append(d2->name()); @@ -1355,7 +1355,7 @@ void decayTree::createHistograms(o2::framework::HistogramRegistry& registry) } } - // for finals only + // for finals only if (res->isFinal()) { // dca hname = base; @@ -1367,7 +1367,7 @@ void decayTree::createHistograms(o2::framework::HistogramRegistry& registry) annot = std::string("dcaZ; dca_{Z}(").append(res->name()).append(")"); fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {o2::framework::HistType::kTH1F, {dcazax}})}); - // nSIgma[TPC, TOF] vs pT + // nSIgma[TPC, TOF] vs pT for (const auto& det : fdets) { for (const auto& part : fparts) { hname = base; @@ -1377,7 +1377,7 @@ void decayTree::createHistograms(o2::framework::HistogramRegistry& registry) } } - // detector hits + // detector hits hname = base; hname.append("detectorHits"); annot = std::string("detectorHits; Detector(").append(res->name()).append(")"); From cfd4120f722b3395cff70815273e4bd7d6605d7e Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 26 Jun 2026 11:14:52 +0200 Subject: [PATCH 4/7] missed a file --- PWGDQ/Core/VarManagerCore.h | 1383 +++++++++++++++++++++++++++++++++++ 1 file changed, 1383 insertions(+) create mode 100644 PWGDQ/Core/VarManagerCore.h diff --git a/PWGDQ/Core/VarManagerCore.h b/PWGDQ/Core/VarManagerCore.h new file mode 100644 index 00000000000..216b40572f5 --- /dev/null +++ b/PWGDQ/Core/VarManagerCore.h @@ -0,0 +1,1383 @@ +// 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 +// +// Class to handle analysis variables +// + +#ifndef PWGDQ_CORE_VARMANAGERCORE_H_ +#define PWGDQ_CORE_VARMANAGERCORE_H_ + +#ifndef HomogeneousField +#define HomogeneousField +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include + +using SMatrix55 = ROOT::Math::SMatrix>; +using SMatrix5 = ROOT::Math::SVector; +using Vec3D = ROOT::Math::SVector; + +//_________________________________________________________________________ +class VarManager : public TObject +{ + public: + // map the information contained in the objects passed to the Fill functions + enum ObjTypes { + // NOTE: Elements containing "Reduced" in their name refer strictly to skimmed data tables + // and the ones that don't refer to tables from the Framework data model or both models + BC = BIT(0), + Collision = BIT(1), + CollisionCentRun2 = BIT(2), + CollisionTimestamp = BIT(3), + ReducedEvent = BIT(4), + ReducedEventExtended = BIT(5), + ReducedEventVtxCov = BIT(6), + CollisionMC = BIT(7), + ReducedEventMC = BIT(8), + ReducedEventQvector = BIT(9), + CollisionCent = BIT(10), + CollisionMult = BIT(11), + EventFilter = BIT(12), + CollisionQvect = BIT(13), + ReducedEventQvectorExtra = BIT(14), + ReducedEventRefFlow = BIT(15), + Zdc = BIT(16), + ReducedZdc = BIT(17), + CollisionMultExtra = BIT(18), + ReducedEventMultExtra = BIT(19), + CollisionQvectCentr = BIT(20), + RapidityGapFilter = BIT(21), + Fit = BIT(22), + ReducedFit = BIT(23), + Track = BIT(0), + TrackCov = BIT(1), + TrackExtra = BIT(2), + TrackPID = BIT(3), // used for basic PID properties (needed such that we can subscribe to a minimal set of PID tables): e,pi,K,p for TPC and TOF + TrackPIDExtra = BIT(4), // extra PID information + TrackDCA = BIT(5), + TrackSelection = BIT(6), + TrackV0Bits = BIT(7), + ReducedTrack = BIT(8), + ReducedTrackBarrel = BIT(9), + ReducedTrackBarrelCov = BIT(10), + ReducedTrackBarrelPID = BIT(11), + Muon = BIT(12), + MuonCov = BIT(13), + ReducedMuon = BIT(14), + ReducedMuonExtra = BIT(15), + ReducedMuonCov = BIT(16), + Pair = BIT(17), // TODO: check whether we really need the Pair member here + AmbiTrack = BIT(18), + AmbiMuon = BIT(19), + DalitzBits = BIT(20), + TrackTPCPID = BIT(21), + TrackMFT = BIT(22), + ReducedTrackCollInfo = BIT(23), // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo + ReducedMuonCollInfo = BIT(24), // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo + MuonRealign = BIT(25), + MuonCovRealign = BIT(26), + MFTCov = BIT(27), + TrackTOFService = BIT(28), + ParticleMC = BIT(29), + MuonDca = BIT(30) + }; + + enum PairCandidateType { + // TODO: need to agree on a scheme to incorporate all various hypotheses (e.g. e - mu, jpsi - K+, Jpsi - pipi,...) + kDecayToEE = 0, // e.g. J/psi -> e+ e- + kDecayToMuMu, // e.g. J/psi -> mu+ mu- + kDecayToPiPi, + 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- + kPsi2StoJpsiPiPi, // e.g. Psi(2S) -> J/psi pi+ pi- + kChictoJpsiEE, // e.g. Chi_c1 -> J/psi e+ e- + kDstarToD0KPiPi, // e.g. D*+ -> D0 pi+ -> K- pi+ pi+ + kTripleCandidateToEEPhoton, // e.g. chi_c -> e+ e- photon or pi0 -> e+ e- photon + kDecayToKPi, // e.g. D0 -> K+ pi- or cc. + kTripleCandidateToKPiPi, // e.g. D+ -> K- pi+ pi+ + kTripleCandidateToPKPi, // e.g. Lambda_c -> p K- pi+ + kJpsiHadronMass, // using the real hadron mass + kJpsiPionMass, // treat the hadron as pion + kNMaxCandidateTypes + }; + + enum BarrelTrackFilteringBits { + kIsConversionLeg = 0, // electron from conversions + kIsK0sLeg, // pion from K0s + kIsLambdaLeg, // proton or pion from Lambda + kIsALambdaLeg, // proton or pion from anti-Lambda + kIsOmegaLeg, // kaon from Omega baryon decay + kDalitzBits = 5, // first bit for Dalitz tagged tracks + kBarrelUserCutsBits = 13, // first bit for user track cuts + kIsTPCPostcalibrated = 63 // tracks were postcalibrated for the TPC PID + }; + + enum MuonTrackFilteringBits { + kMuonUserCutsBits = 0, // first bit for user muon cuts + kMuonIsPropagated = 7 // whether the muon was propagated already + }; + + public: + enum Variables { + kNothing = -1, + // Run wise variables + kRunNo = 0, + kNRunWiseVariables, + + // Timeframe wise variables + kTFNBCs = kNRunWiseVariables, + kTFNCollisions, + kTFNMCCollisions, + kTFNTracks, + kTFNMuons, + kTFNMFTs, + kNTFWiseVariables, + + // Event wise variables + kTimestamp = kNTFWiseVariables, + kTimeFromSOR, // Time since Start of Run (SOR) in minutes + kCollisionTime, + kCollisionTimeRes, + kBC, + kBCOrbit, + kCollisionRandom, // random number generated per collision (if required, can be used to perform random selections at the collision level) + kIsPhysicsSelection, + kIsTVXTriggered, // Is trigger TVX + kIsNoTFBorder, // No time frame border + kIsNoITSROFBorder, // No ITS read out frame border (from event selection) + kIsNoITSROFBorderRecomputed, // No ITS read out frame border, computed here + kIsNoSameBunch, // No collisions with same T0 BC + kIsGoodZvtxFT0vsPV, // No collisions w/ difference between z_ {PV, tracks} and z_{PV FT0A-C} + kIsVertexITSTPC, // At least one ITS-TPC track + kIsVertexTOFmatched, // At least one TOF-matched track + kIsSel8, // TVX in Run3 && No time frame border && No ITS read out frame border (from event selection) + 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 + kIsTriggerZNAZNC, // trigger ZNA && ZNC + kIsINT7, + kIsEMC7, + kIsINT7inMUON, + kIsMuonSingleLowPt7, + kIsMuonSingleHighPt7, + kIsMuonUnlikeLowPt7, + kIsMuonLikeLowPt7, + kIsCUP8, + kIsCUP9, + kIsMUP10, + kIsMUP11, + kVtxX, + kVtxY, + kVtxZ, + kVtxNcontrib, + kVtxNcontribReal, + kVtxCovXX, + kVtxCovXY, + kVtxCovXZ, + kVtxCovYY, + kVtxCovYZ, + kVtxCovZZ, + kVtxChi2, + kCentVZERO, + kCentFT0C, + kCentFT0A, + kCentFT0M, + kMultTPC, + kMultFV0A, + kMultFV0C, + kMultFT0A, + kMultFT0C, + kMultFDDA, + kMultFDDC, + kMultZNA, + kMultZNC, + kMultTracklets, + kMultDimuons, + kMultAntiMuons, + kMultMuons, + kMultSingleMuons, + kMultNTracksHasITS, + kMultNTracksHasTPC, + kMultNTracksHasTOF, + kMultNTracksHasTRD, + kMultNTracksITSOnly, + kMultNTracksTPCOnly, + kMultNTracksITSTPC, + kMultNTracksPVeta1, + kMultNTracksPVetaHalf, + kTrackOccupancyInTimeRange, + kFT0COccupancyInTimeRange, + kNoCollInTimeRangeStandard, + kMultAllTracksTPCOnly, + kMultAllTracksITSTPC, + kNTPCpileupContribA, + kNTPCpileupContribC, + kNTPCpileupZA, + kNTPCpileupZC, + kNTPCtracksInPast, + kNTPCtracksInFuture, + kNTPCcontribLongA, + kNTPCcontribLongC, + kNTPCmeanTimeLongA, + kNTPCmeanTimeLongC, + kNTPCmedianTimeLongA, + kNTPCmedianTimeLongC, + kNTPCcontribShortA, + kNTPCcontribShortC, + kNTPCmeanTimeShortA, + kNTPCmeanTimeShortC, + kNTPCmedianTimeShortA, + kNTPCmedianTimeShortC, + kDCAzBimodalityCoefficient, + kDCAzMean, + kDCAzRMS, + kDCAzSkewness, + kDCAzKurtosis, + kDCAzBimodalityCoefficientBinned, + kDCAzBimodalityCoefficientBinnedTrimmed1, + kDCAzBimodalityCoefficientBinnedTrimmed2, + kDCAzBimodalityCoefficientBinnedTrimmed3, + kDCAzMeanBinnedTrimmed1, + kDCAzMeanBinnedTrimmed2, + kDCAzMeanBinnedTrimmed3, + kDCAzRMSBinnedTrimmed1, + kDCAzRMSBinnedTrimmed2, + kDCAzRMSBinnedTrimmed3, + kDCAzFracAbove100um, + kDCAzFracAbove200um, + kDCAzFracAbove500um, + kDCAzFracAbove1mm, + kDCAzFracAbove2mm, + kDCAzFracAbove5mm, + kDCAzFracAbove10mm, + kDCAzNPeaks, + kDCAzNPeaksTrimmed1, + kDCAzNPeaksTrimmed2, + kDCAzNPeaksTrimmed3, + kMCEventGeneratorId, + kMCEventSubGeneratorId, + kMCVtxX, + kMCVtxY, + kMCVtxZ, + kMCEventTime, + kMCEventWeight, + kMCEventImpParam, + kMCEventCentrFT0C, + kMCEventPlaneAngle, + kMultMCNParticlesEta10, + kMultMCNParticlesEta08, + kMultMCNParticlesEta05, + kQ1ZNAX, + kQ1ZNAY, + kQ1ZNCX, + kQ1ZNCY, + KIntercalibZNA, + KIntercalibZNC, + kQ1ZNACXX, + kQ1ZNACYY, + kQ1ZNACYX, + kQ1ZNACXY, + kQ1X0A, // q-vector (e.g. from TPC) with x component (harmonic 1 and power 0), sub-event A + kQ1Y0A, // q-vector (e.g. from TPC) with y component (harmonic 1 and power 0), sub-event A + kQ1X0B, + kQ1Y0B, + kQ1X0C, + kQ1Y0C, + kQ2X0A, // q-vector (e.g. from TPC) with x component (harmonic 2 and power 0), sub-event A + kQ2Y0A, // q-vector (e.g. from TPC) with y component (harmonic 2 and power 0), sub-event A + kQ2X0APOS, // q-vector (e.g. from TPC) with x component (harmonic 2 and power 1), Pos. TPC + kQ2Y0APOS, // q-vector (e.g. from TPC) with y component (harmonic 2 and power 1), Pos. TPC + kQ2X0ANEG, // q-vector (e.g. from TPC) with x component (harmonic 2 and power 1), Neg. TPC + kQ2Y0ANEG, // q-vector (e.g. from TPC) with y component (harmonic 2 and power 1), Neg. TPC + kQ2X0B, + kQ2Y0B, + kQ2X0C, + kQ2Y0C, + kQ2YYAB, + kQ2XXAB, + kQ2XYAB, + kQ2YXAB, + kQ2YYAC, + kQ2XXAC, + kQ2XYAC, + kQ2YXAC, + kQ2YYBC, + kQ2XXBC, + kQ2XYBC, + kQ2YXBC, + kMultA, // Multiplicity of the sub-event A + kMultAPOS, // Multiplicity of the sub-event A + kMultANEG, // Multiplicity of the sub-event A + kMultB, + kMultC, + kQ3X0A, // q-vector (e.g. from TPC) with x component (harmonic 3 and power 0), sub-event A + kQ3Y0A, // q-vector (e.g. from TPC) with y component (harmonic 3 and power 0), sub-event A + kQ3X0B, + kQ3Y0B, + kQ3X0C, + kQ3Y0C, + kQ4X0A, // q-vector (e.g. from TPC) with x component (harmonic 4 and power 0), sub-event A + kQ4Y0A, // q-vector (e.g. from TPC) with y component (harmonic 4 and power 0), sub-event A + kQ4X0B, + kQ4Y0B, + kQ4X0C, + kQ4Y0C, + kR2SP_AB, + kR2SP_AC, + kR2SP_BC, + kWR2SP_AB, + kWR2SP_AC, + kWR2SP_BC, + kR2SP_AB_Im, + kR2SP_AC_Im, + kR2SP_BC_Im, + kWR2SP_AB_Im, + kWR2SP_AC_Im, + kWR2SP_BC_Im, + kR2SP_FT0CTPCPOS, + kR2SP_FT0CTPCNEG, + kR2SP_FT0ATPCPOS, + kR2SP_FT0ATPCNEG, + kR2SP_FT0MTPCPOS, + kR2SP_FT0MTPCNEG, + kR2SP_FV0ATPCPOS, + kR2SP_FV0ATPCNEG, + kR3SP, + kR2EP_AB, + kR2EP_AC, + kR2EP_BC, + kWR2EP_AB, + kWR2EP_AC, + kWR2EP_BC, + kR2EP_AB_Im, + kR2EP_AC_Im, + kR2EP_BC_Im, + kWR2EP_AB_Im, + kWR2EP_AC_Im, + kWR2EP_BC_Im, + kR2EP_FT0CTPCPOS, + kR2EP_FT0CTPCNEG, + kR2EP_FT0ATPCPOS, + kR2EP_FT0ATPCNEG, + kR2EP_FT0MTPCPOS, + kR2EP_FT0MTPCNEG, + kR2EP_FV0ATPCPOS, + kR2EP_FV0ATPCNEG, + kR3EP, + kIsDoubleGap, // Double rapidity gap + kIsSingleGapA, // Rapidity gap on side A + kIsSingleGapC, // Rapidity gap on side C + kIsSingleGap, // Rapidity gap on either side + kIsNoGap, // No rapidity gap + kIsITSUPCMode, // UPC mode used for event + kTwoEvPosZ1, // vtx-z for collision 1 in two events correlations + kTwoEvPosZ2, // vtx-z for collision 2 in two events correlations + kTwoEvPosR1, // vtx-R for collision 1 in two events correlations + kTwoEvPosR2, + kTwoEvCentFT0C1, + kTwoEvCentFT0C2, + kTwoEvPVcontrib1, // n-contributors for collision 1 in two events correlations + kTwoEvPVcontrib2, + kTwoEvDeltaZ, // distance in z between collisions + kTwoEvDeltaX, // distance in x between collisions + kTwoEvDeltaY, // distance in y between collisions + kTwoEvDeltaR, // distance in (x,y) plane between collisions + kEnergyCommonZNA, + kEnergyCommonZNC, + kEnergyCommonZPA, + kEnergyCommonZPC, + kEnergyZNA1, + kEnergyZNA2, + kEnergyZNA3, + kEnergyZNA4, + kEnergyZNC1, + kEnergyZNC2, + kEnergyZNC3, + kEnergyZNC4, + kTimeZNA, + kTimeZNC, + kTimeZPA, + kTimeZPC, + kQ2X0A1, + kQ2X0A2, + kQ2Y0A1, + kQ2Y0A2, + kU2Q2Ev1, + kU2Q2Ev2, + kCos2DeltaPhiEv1, + kCos2DeltaPhiEv2, + kV2SP1, + kV2SP2, + kV2EP1, + kV2EP2, + kV2ME_SP, + kV2ME_EP, + kWV2ME_SP, + kWV2ME_EP, + kTwoR2SP1, // Scalar product resolution of event1 for ME technique + kTwoR2SP2, // Scalar product resolution of event2 for ME technique + kTwoR2EP1, // Event plane resolution of event2 for ME technique + kTwoR2EP2, // Event plane resolution of event2 for ME technique + kNPairsPerEvent, // number of pairs per event in same-event or mixed-event pairing + kInteractionRate, + + // Variables for event mixing with cumulant + kV22m, + kV24m, + kV22p, + kV24p, + kV22ME, + kV24ME, + kWV22ME, + kWV24ME, + kNEventWiseVariables, + + // Basic track/muon/pair wise variables + kX = kNEventWiseVariables, + kY, + kZ, + kPt, + kSignedPt, + kInvPt, + kEta, + kTgl, + kPhi, + kP, + kPx, + kPy, + kPz, + kRap, + kMass, + kCharge, + kNBasicTrackVariables, + kUsedKF, + kKFMass, + kKFMassGeoTop, + + kPt1, + kEta1, + kPhi1, + kCharge1, + kDCAxy1, + kDCAz1, + kITSclusterMap1, + kTPCnSigmaEl1, + kPin_leg1, + kTPCnSigmaKa_leg1, + kPt2, + kEta2, + kPhi2, + kCharge2, + kDCAxy2, + kDCAz2, + kITSclusterMap2, + kTPCnSigmaEl2, + + // Barrel track variables + kPin, + kSignedPin, + kTOFExpMom, + kTrackTime, + kTrackTimeRes, + kTrackTimeResRelative, + kDetectorMap, + kHasITS, + kHasTRD, + kHasTOF, + kHasTPC, + kIsGlobalTrack, + kIsGlobalTrackSDD, + kIsITSrefit, + kIsSPDany, + kIsSPDfirst, + kIsSPDboth, + kIsITSibAny, + kIsITSibFirst, + kIsITSibAll, + kITSncls, + kITSchi2, + kITSlayerHit, + kITSmeanClsSize, + kIsTPCrefit, + kTPCncls, + kITSClusterMap, + kTPCnclsCR, + kTPCnCRoverFindCls, + kTPCchi2, + kTPCsignal, + kPhiTPCOuter, + kTrackIsInsideTPCModule, + kTRDsignal, + kTRDPattern, + kTOFbeta, + kTrackLength, + kTrackDCAxy, + kTrackDCAxyProng1, + kTrackDCAxyProng2, + kTrackDCAz, + kTrackDCAzProng1, + kTrackDCAzProng2, + kTrackDCAsigXY, + kTrackDCAsigZ, + kTrackDCAresXY, + kTrackDCAresZ, + kIsGoldenChi2, + kTrackCYY, + kTrackCZZ, + kTrackCSnpSnp, + kTrackCTglTgl, + kTrackC1Pt21Pt2, + kTPCnSigmaEl, + kTPCnSigmaMu, + kTPCnSigmaPi, + kTPCnSigmaKa, + kTPCnSigmaPr, + kTPCnSigmaEl_Corr, + kTPCnSigmaPi_Corr, + kTPCnSigmaKa_Corr, + kTPCnSigmaPr_Corr, + kTOFnSigmaEl, + kTOFnSigmaMu, + kTOFnSigmaPi, + kTOFnSigmaKa, + kTOFnSigmaPr, + kTrackTimeResIsRange, // Gaussian or range (see Framework/DataTypes) + kPVContributor, // This track has contributed to the collision vertex fit (see Framework/DataTypes) + kOrphanTrack, // Track has no association with any collision vertex (see Framework/DataTypes) + kIsAmbiguous, + kIsLegFromGamma, + kIsLegFromK0S, + kIsLegFromLambda, + kIsLegFromAntiLambda, + kIsLegFromOmega, + kIsProtonFromLambdaAndAntiLambda, + kIsDalitzLeg, // Up to 8 dalitz selections + kBarrelNAssocsInBunch = kIsDalitzLeg + 8, // number of in bunch collision associations + kBarrelNAssocsOutOfBunch, // number of out of bunch collision associations + kNBarrelTrackVariables, + + // Muon track variables + kMuonNClusters = kNBarrelTrackVariables, + kMuonPDca, + kMuonRAtAbsorberEnd, + kMCHBitMap, + kMuonChi2, + kMuonChi2MatchMCHMID, + kMuonChi2MatchMCHMFT, + kMuonMatchScoreMCHMFT, + kMuonCXX, + kMuonCXY, + kMuonCYY, + kMuonCPhiX, + kMuonCPhiY, + kMuonCPhiPhi, + kMuonCTglX, + kMuonCTglY, + kMuonCTglPhi, + kMuonCTglTgl, + kMuonC1Pt2X, + kMuonC1Pt2Y, + kMuonC1Pt2Phi, + kMuonC1Pt2Tgl, + kMuonC1Pt21Pt2, + kMuonTrackType, + kMuonDCAx, + kMuonDCAy, + kMuonTime, + kMuonTimeRes, + kMftNClusters, + kMftClusterSize, + kMftMeanClusterSize, + kMuonNAssocsInBunch, + kMuonNAssocsOutOfBunch, + kNMuonTrackVariables, + + // MC particle variables + kMCPdgCode, + kMCParticleWeight, + kMCPx, + kMCPy, + kMCPz, + kMCMass, + kMCE, + kMCVx, + kMCVy, + kMCVz, + kMCPt, + kMCPhi, + kMCEta, + kMCY, + kMCParticleGeneratorId, + kNMCParticleVariables, + kMCHadronPdgCode, + kMCCosTheta, + kMCJpsiPt, + kMCAccweight, + kMCCosChi, + kMCdeltaphi, + kMCdeltaeta, + kMCHadronPt, + kMCHadronEta, + kMCHadronPhi, + kMCWeight, + kMCCosChi_randomPhi_toward, + kMCWeight_randomPhi_toward, + kMCCosChi_randomPhi_away, + kMCWeight_randomPhi_away, + kMCCosChi_randomPhi_trans, + kMCWeight_randomPhi_trans, + kMCdeltaphi_randomPhi_toward, + kMCdeltaphi_randomPhi_away, + kMCdeltaphi_randomPhi_trans, + kMCHadronpt_randomPhi_trans, + kMCWeight_before, + kMCEWeight_before, + kMCCosChi_gen, + kMCWeight_gen, + kMCdeltaeta_gen, + kMCCosChi_rec, + kMCWeight_rec, + kMCdeltaeta_rec, + kMCCosChi_randomPhi_trans_rec, + kMCWeight_randomPhi_trans_rec, + kMCCosChi_randomPhi_trans_gen, + kMCWeight_randomPhi_trans_gen, + + // MC mother particle variables + kMCMotherPdgCode, + + // MC pair variables + kMCPt1, + kMCEta1, + kMCP1, + kMCPt2, + kMCEta2, + kMCP2, + kMCCosThetaHE, + kMCPhiHE, + kMCPhiTildeHE, + kMCCosThetaCS, + kMCPhiCS, + kMCPhiTildeCS, + kMCCosThetaPP, + kMCPhiPP, + kMCPhiTildePP, + kMCCosThetaRM, + kMCCosThetaStar, + + // Pair variables + kCandidateId, + kPairType, + kVertexingLxy, + kVertexingLxyErr, + kVertexingPseudoCTau, + kVertexingLxyz, + kVertexingLxyzErr, + kMCVertexingLxy, + kMCVertexingLxyz, + kMCLxyExpected, + kMCLxyzExpected, + kVertexingLz, + kVertexingLzErr, + kMCVertexingLz, + kVertexingTauxy, + kVertexingTauxyErr, + kMCVertexingTauxy, + kVertexingLzProjected, + kVertexingLxyProjected, + kVertexingLxyProjectedRecalculatePV, + kVertexingLxyzProjected, + kMCVertexingLzProjected, + kMCVertexingLxyProjected, + kMCVertexingLxyzProjected, + kVertexingTauzProjected, + kVertexingTauxyProjected, + kVertexingTauxyProjectedPoleJPsiMass, + kVertexingTauxyProjectedPoleJPsiMassRecalculatePV, + kVertexingTauxyProjectedNs, + kVertexingTauxyzProjected, + kMCVertexingTauzProjected, + kMCVertexingTauxyProjected, + kMCVertexingTauxyProjectedNs, + kMCVertexingTauxyzProjected, + kMCCosPointingAngle, + kVertexingTauz, + kMCVertexingTauz, + kVertexingTauzErr, + kVertexingPz, + kVertexingSV, + kVertexingProcCode, + kVertexingChi2PCA, + kCosThetaHE, + kPhiHE, + kPhiTildeHE, + kCosThetaCS, + kPhiCS, + kPhiTildeCS, + kCosThetaPP, + kPhiPP, + kPhiTildePP, + kCosThetaRM, + kCosThetaStarTPC, + kCosThetaStarFT0A, + kCosThetaStarFT0C, + kAbsCosThetaStarFT0C, + kCos2ThetaStarFT0C, + kCosThetaStarRandom, + kCos2ThetaStarRandom, + kCosPhiVP, + kPhiVP, + kDeltaPhiPair2, + kDeltaEtaPair2, + kPsiPair, + kDeltaPhiPair, + kOpeningAngle, + kQuadDCAabsXY, + kQuadDCAsigXY, + kQuadDCAabsZ, + kQuadDCAsigZ, + kQuadDCAsigXYZ, + kSignQuadDCAsigXY, + kCosPointingAngle, + kImpParXYJpsi, + kImpParXYK, + kDCATrackProd, + kDCATrackVtxProd, + kV2SP, + kV2EP, + kWV2SP, + kWV2EP, + kU2Q2, + kU2Q2POS, + kU2Q2NEG, + kU3Q3, + kQ42XA, + kQ42YA, + kQ23XA, + kQ23YA, + kS11A, + kS12A, + kS13A, + kS31A, + kM11REF, + kM11REFetagap, + kM01POI, + kM1111REF, + kM11M1111REF, + kM11M1111REFoverMp, + kM01M0111POIoverMp, + kM0111POI, + kCORR2REF, + kCORR2REFbydimuons, + kCORR2REFbysinglemu, + kCORR2REFetagap, + kCORR2POI, + kCORR2POICORR4POI, + kCORR2REFCORR4POI, + kCORR2REFCORR2POI, + kM01M0111overMp, + kM11M0111overMp, + kM11M01overMp, + kCORR2CORR4REF, + kCORR4REF, + kCORR4REFbydimuons, + kCORR4REFbysinglemu, + kCORR4POI, + kM11REFoverMp, + kM01POIoverMp, + kM1111REFoverMp, + kM0111POIoverMp, + kCORR2POIMp, + kCORR4POIMp, + kM01POIplus, + 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, + kCORR2POIME, + kCORR4POIME, + kM01POIoverMpME, + kM0111POIoverMpME, + kM11REFoverMpME, + kM1111REFoverMpME, + kCORR2REFbydimuonsME, + kCORR4REFbydimuonsME, + kR2SP, + kR2EP, + kPsi2A, + kPsi2APOS, + kPsi2ANEG, + kPsi2B, + kPsi2C, + kRandomPsi2, + kCos2DeltaPhi, + kCos2DeltaPhiPOS, + kCos2DeltaPhiNEG, + kCos2DeltaPhiMu1, // cos(phi - phi1) for muon1 + kCos2DeltaPhiMu2, ////cos(phi - phi2) for muon2 + kCos3DeltaPhi, + kDeltaPtotTracks, + kVertexingLxyOverErr, + kVertexingLzOverErr, + kVertexingLxyzOverErr, + kKFTrack0DCAxyz, + kKFTrack1DCAxyz, + kKFTracksDCAxyzMax, + kKFDCAxyzBetweenProngs, + kKFTrack0DCAxy, + kKFTrack1DCAxy, + kKFTracksDCAxyMax, + kKFDCAxyBetweenProngs, + kKFTrack0DeviationFromPV, + kKFTrack1DeviationFromPV, + kKFTrack0DeviationxyFromPV, + kKFTrack1DeviationxyFromPV, + kKFChi2OverNDFGeo, + kKFNContributorsPV, + kKFCosPA, + kKFChi2OverNDFGeoTop, + kKFJpsiDCAxyz, + kKFJpsiDCAxy, + kKFPairDeviationFromPV, + kKFPairDeviationxyFromPV, + kS12, + kS13, + kS23, + kPairEfficiency, + kPairWeight, + kNPairVariables, + + // Candidate-track correlation variables + kPairMass, + kPairMassDau, + kMassDau, + kPairPt, + kPairPtDau, + kPairEta, + kPairRap, + kPairPhi, + kPairPhiv, + kDeltaEta, + kDeltaPhi, + kDeltaPhiSym, + kNCorrelationVariables, + kDileptonHadronKstar, + kCosChi, + kEtaDau, + kPhiDau, + kWeight, + kECWeight, + kPtDau, + kCosTheta, + kEWeight_before, + kWeight_before, + kCosChi_randomPhi_trans, + kCosChi_randomPhi_toward, + kCosChi_randomPhi_away, + kWeight_randomPhi_trans, + kWeight_randomPhi_toward, + kWeight_randomPhi_away, + kdeltaphi_randomPhi_trans, + kdeltaphi_randomPhi_toward, + kdeltaphi_randomPhi_away, + kdileptonmass, + kPtDau_randomPhi_trans, + + // Dilepton-track-track variables + kQuadMass, + kQuadDefaultDileptonMass, + kQuadPt, + kQuadEta, + kQuadPhi, + kCosthetaDileptonDitrack, + kDitrackMass, + kDitrackPt, + kQ, + kDeltaR1, + kDeltaR2, + kDeltaR, + + // DQ-HF correlation variables + kMassCharmHadron, + kPtCharmHadron, + kRapCharmHadron, + kPhiCharmHadron, + kBdtCharmHadron, + + // Resolution variables + kDeltaPt, + kPtResolution, + kEtaResolution, + + // Index used to scan bit maps + kBitMapIndex, + + // deltaMass = kPairMass - kPairMassDau + kDeltaMass, + // deltaMass_jpsi = kPairMass - kPairMassDau +3.096900 + kDeltaMass_jpsi, + + // BDT score + kBdtBackground, + kBdtPrompt, + kBdtNonprompt, + + // FIT detector variables + kAmplitudeFT0A, + kAmplitudeFT0C, + kAmplitudeFT0M, + kTimeFT0A, + kTimeFT0C, + kTriggerMaskFT0, + kFT0OrA, + kFT0OrC, + kAmplitudeFDDA, + kAmplitudeFDDC, + kTimeFDDA, + kTimeFDDC, + kTriggerMaskFDD, + kAmplitudeFV0A, + kTimeFV0A, + kTriggerMaskFV0A, + kBBFT0Apf, + kBGFT0Apf, + kBBFT0Cpf, + kBGFT0Cpf, + kBBFV0Apf, + kBGFV0Apf, + kBBFDDApf, + kBGFDDApf, + kBBFDDCpf, + kBGFDDCpf, + kNFiredChannelsFT0A, + kNFiredChannelsFT0C, + kNFiredChannelsFV0A, + + // ALICE 3 Variables + kMultDensity, + kMultMCNParticlesEta40, + kMultMCNParticlesEta20, + kIsReconstructed, + kNSiliconHits, + kNTPCHits, + kOTTOTSignal, + kOTnSigmaEl, + kOTnSigmaMu, + kOTnSigmaPi, + kOTnSigmaKa, + kOTnSigmaPr, + kOTnSigmaDe, + kOTnSigmaTr, + kOTnSigmaHe3, + kOTnSigmaAl, + kHasRICHSig, + kHasRICHSigInGas, + kHasRICHSigEl, + kHasRICHSigMu, + kHasRICHSigPi, + kHasRICHSigKa, + kHasRICHSigPr, + kHasRICHSigDe, + kHasRICHSigTr, + kHasRICHSigHe3, + kHasRICHSigAl, + kRICHnSigmaEl, + kRICHnSigmaMu, + kRICHnSigmaPi, + kRICHnSigmaKa, + kRICHnSigmaPr, + kRICHnSigmaDe, + kRICHnSigmaTr, + kRICHnSigmaHe3, + kRICHnSigmaAl, + kTOFEventTime, + kTOFEventTimeErr, + kiTOFBeta, + koTOFBeta, + kOuterTOFnSigmaEl, + kOuterTOFnSigmaMu, + kOuterTOFnSigmaPi, + kOuterTOFnSigmaKa, + kOuterTOFnSigmaPr, + kOuterTOFnSigmaDe, + kOuterTOFnSigmaTr, + kOuterTOFnSigmaHe3, + kOuterTOFnSigmaAl, + kInnerTOFnSigmaEl, + kInnerTOFnSigmaMu, + kInnerTOFnSigmaPi, + kInnerTOFnSigmaKa, + kInnerTOFnSigmaPr, + kInnerTOFnSigmaDe, + kInnerTOFnSigmaTr, + kInnerTOFnSigmaHe3, + kInnerTOFnSigmaAl, + kA3Variables, + + kNVars + }; // end of Variables enumeration + + enum CalibObjects { + kTPCElectronMean = 0, + kTPCElectronSigma, + kTPCElectronStatus, + kTPCPionMean, + kTPCPionSigma, + kTPCPionStatus, + kTPCKaonMean, + kTPCKaonSigma, + kTPCKaonStatus, + kTPCProtonMean, + kTPCProtonSigma, + kTPCProtonStatus, + kNCalibObjects + }; + + enum EfficiencyType { + kNone = 0, + kPairPtCentFT0cCosThetaStarFT0c, + kPairPtCentFT0cCosThetaStarRandom, + // Add more efficiency types as needed + kNEfficiencyTypes + }; + + enum DileptonCharmHadronTypes { + kJPsi = 0, + kD0ToPiK, + kD0barToKPi + }; + + enum EventFilters { + kDoubleGap = 0, + kSingleGapA, + kSingleGapC, + kITSUPCMode + }; + + enum MuonExtrapolation { + // Index used to set different options for Muon propagation + kToVertex = 0, // propagtion to vertex by default + kToDCA, + kToRabs, + kToMatching + }; + + 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(); + + static void SetUseVariable(int var); + static void SetUseVars(const bool* usedVars); + static void SetUseVars(const std::vector usedVars); + static bool GetUsedVar(int var); + + // Flag to set PV recalculation via KF + static void SetPVrecalculationKF(const bool pvRecalKF); + + // Setup the collision system + static void SetCollisionSystem(TString system, float energy); + static void SetCollisionSystem(o2::parameters::GRPLHCIFData* grplhcif); + + static void SetMagneticField(float magField); + + // Setup plane position for MFT-MCH matching + static void SetMatchingPlane(float z); + + static float GetMatchingPlane(); + + // Set z shift for forward tracks + static void SetZShift(float z); + + // Setup the 2 prong KFParticle + static void SetupTwoProngKFParticle(float magField); + // Setup magnetic field for muon propagation + static void SetupMuonMagField(); + + // Setup the 2 prong DCAFitterN + static void SetupTwoProngDCAFitter(float magField, bool propagateToPCA, float maxR, float maxDZIni, float minParamChange, float minRelChi2Change, bool useAbsDCA); + + // Setup the 2 prong FwdDCAFitterN + static void SetupTwoProngFwdDCAFitter(float magField, bool propagateToPCA, float maxR, float minParamChange, float minRelChi2Change, bool useAbsDCA); + // Use MatLayerCylSet to correct MCS in fwdtrack propagation + static void SetupMatLUTFwdDCAFitter(o2::base::MatLayerCylSet* m); + // Use GeometryManager to correct MCS in fwdtrack propagation + static void SetupTGeoFwdDCAFitter(); + // No material budget in fwdtrack propagation + static void SetupFwdDCAFitterNoCorr(); + // Setup the 3 prong KFParticle + static void SetupThreeProngKFParticle(float magField); + + // Setup the 3 prong DCAFitterN + static void SetupThreeProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA); + + // Setup the 4 prong KFParticle + static void SetupFourProngKFParticle(float magField); + + // Setup the 4 prong DCAFitterN + static void SetupFourProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA); + + static auto getEventPlane(int harm, float qnxa, float qnya); + + static float getDeltaPsiInRange(float psi1, float psi2, float harmonic); + template + static o2::dataformats::VertexBase RecalculatePrimaryVertex(T const& track0, T const& track1, const T1& collision); + + static std::tuple BimodalityCoefficientUnbinned(const std::vector& data); + static std::tuple BimodalityCoefficientAndNPeaks(const std::vector& data, float binWidth, int trim = 0, float min = -15.0, float max = 15.0); + + template + static o2::track::TrackParCovFwd FwdToTrackPar(const T& track, const C& cov); + template + static o2::dataformats::GlobalFwdTrack PropagateMuon(const T& muon, const C& collision, int endPoint = kToVertex); + template + static o2::track::TrackParCovFwd PropagateFwd(const T& track, const C& cov, float z); + template + static void FillMuonPDca(const T& muon, const C& collision, float* values = nullptr); + template + static void FillPropagateMuon(const T& muon, const C& collision, float* values = nullptr); + template + static void FillBC(T const& bc, float* values = nullptr); + template + static void FillEvent(T const& event, float* values = nullptr); + template + static void FillEventTracks(T const& tracks, float* values = nullptr); + template + static void FillTimeFrame(T const& tfTable, float* values = nullptr); + template + static void FillEventFlowResoFactor(T const& hs_sp, T const& hs_ep, float* values = nullptr); + template + static void FillTwoEvents(T const& event1, T const& event2, float* values = nullptr); + template + 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 + static void FillPhoton(T const& photon, float* values = nullptr); + template + static void FillTrackCollision(T const& track, C const& collision, float* values = nullptr); + template + static void FillTrackCollisionMC(T1 const& track, T2 const& MotherTrack, C const& collision, float* values = nullptr); + template + static void FillTrackCollisionMC(T1 const& track, const std::array& collPos, float massHyp = -1., float* values = nullptr); + template + static void FillTrackCollisionMatCorr(T const& track, C const& collision, M const& materialCorr, P const& propagator, float* values = nullptr); + template + static void FillTrackMC(const U& mcStack, T const& track, float* values = nullptr); + template + static void FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3, float Accweight = 1.0f); + template + static void FillPairPropagateMuon(T1 const& muon1, T2 const& muon2, const C& collision, float* values = nullptr); + template + static void FillGlobalMuonRefit(T1 const& muontrack, T2 const& mfttrack, const C& collision, float* values = nullptr); + template + static void FillGlobalMuonRefitCov(T1 const& muontrack, T2 const& mfttrack, const C& collision, C2 const& mftcov, float* values = nullptr); + template + static void FillPair(T1 const& t1, T2 const& t2, float* values = nullptr); + template + static void FillPairRotation(T1 const& t1, T2 const& t2, float* values = nullptr); + template + static void FillPairCollision(C const& collision, T1 const& t1, T2 const& t2, float* values = nullptr); + template + static void FillPairCollisionMatCorr(C const& collision, T1 const& t1, T2 const& t2, M const& materialCorr, P const& propagator, float* values = nullptr); + template + 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 FillPairMEAcrossTFs(T const& t1, T const& t2, float* values = nullptr); + 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); + template + static void FillQuadMC(T1 const& t1, T2 const& t2, T2 const& t3, float* values = nullptr); + template + static void FillPairVertexing(C const& collision, T const& t1, T const& t2, bool propToSV = false, float* values = nullptr); + template + static void FillPairVertexingRecomputePV(C const& /*collision*/, T const& t1, T const& t2, o2::dataformats::VertexBase pvRefitted, float* values = nullptr); + template + static void FillTripletVertexing(C const& collision, T const& t1, T const& t2, T const& t3, PairCandidateType tripletType, float* values = nullptr); + template + static void FillDileptonTrackVertexing(C const& collision, T1 const& lepton1, T1 const& lepton2, T1 const& track, float* values); + template + static void FillDileptonHadron(T1 const& dilepton, T2 const& hadron, float* values = nullptr, float hadronMass = 0.0f); + template + static void FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3, bool applyFitMass = false, float sidebandMass = 0.0f, float weight = 1.0f); + template + static void FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values = nullptr, bool applyFitMass = false, float Effweight_rec = 1.f, float Accweight_gen = 1.f, float Translow = 1. / 3, float Transhigh = 2. / 3); + template + static void FillDileptonPhoton(T1 const& dilepton, T2 const& photon, float* values = nullptr); + template + static void FillHadron(T const& hadron, float* values = nullptr, float hadronMass = 0.0f); + template + static void FillSingleDileptonCharmHadron(Cand const& candidate, H hfHelper, T& bdtScoreCharmHad, float* values = nullptr); + template + static void FillDileptonCharmHadron(DQ const& dilepton, HF const& charmHadron, H hfHelper, T& bdtScoreCharmHad, float* values = nullptr); + template + static void FillQVectorFromGFW(C const& collision, A const& compA11, A const& compB11, A const& compC11, A const& compA21, A const& compB21, A const& compC21, A const& compA31, A const& compB31, A const& compC31, A const& compA41, A const& compB41, A const& compC41, A const& compA23, A const& compA42, float S10A = 1.0, float S10B = 1.0, float S10C = 1.0, float S11A = 1.0, float S11B = 1.0, float S11C = 1.0, float S12A = 1.0, float S13A = 1.0, float S14A = 1.0, float S21A = 1.0, float S22A = 1.0, float S31A = 1.0, float S41A = 1.0, float* values = nullptr); + template + static void FillQVectorFromCentralFW(C const& collision, float* values = nullptr); + template + static void FillNewQVectorFromCentralFW(C const& collision, float* values = nullptr); + template + static void FillSpectatorPlane(C const& collision, float* values = nullptr); + template + static void FillPairVn(T1 const& t1, T2 const& t2, float* values = nullptr); + template + static void FillDileptonTrackTrack(T1 const& dilepton, T2 const& hadron1, T3 const& hadron2, float* values = nullptr); + template + static void FillDileptonTrackTrackVertexing(C const& collision, T1 const& lepton1, T1 const& lepton2, T1 const& track1, T1 const& track2, float* values); + template + static void FillZDC(const T& zdc, float* values = nullptr); + template + static void FillBdtScore(const T& bdtScore, float* values = nullptr); + template + static void FillFIT(const T1& bc, const T2& bcs, const T3& ft0s, const T4& fv0as, const T5& fdds, float* values = nullptr); + template + static void FillPairAlice3(T1 const& t1, T2 const& t2, float* values = nullptr); + template + static void FillEventAlice3(T const& event, float* values = nullptr); + template + static void FillTrackAlice3(T const& track, float* values = nullptr); + template + static void FillResolutions(M const& mcTrack, T const& track, float* values = nullptr); + + static void SetCalibrationObject(CalibObjects calib, TObject* obj); + + static void SetCalibrationType(int type, bool useInterpolation = true); + static double ComputePIDcalibration(int species, double nSigmaValue); + + static void SetEfficiencyObject(int type, TObject* obj); + static void FillEfficiency(float* values = nullptr); + static TObject* GetCalibrationObject(CalibObjects calib); + static void SetTPCInterSectorBoundary(float boundarySize); + static void SetITSROFBorderselection(int bias, int length, int marginLow, int marginHigh); + + static void SetSORandEOR(uint64_t sor, uint64_t eor); + + public: + VarManager(); + ~VarManager() override; + + static float fgValues[kNVars]; // array holding all variables computed during analysis + static void ResetValues(int startValue = 0, int endValue = kNVars, float* values = nullptr); + + private: + static bool fgUsedVars[kNVars]; // holds flags for when the corresponding variable is needed (e.g., in the histogram manager, in cuts, mixing handler, etc.) + static bool fgUsedKF; + static bool fgPVrecalKF; + static void SetVariableDependencies(); // toggle those variables on which other used variables might depend + + static float fgMagField; + static float fgzMatching; + static float fgzShiftFwd; + 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 + static int fgITSROFbias; // ITS ROF bias (from ALPIDE parameters) + static int fgITSROFlength; // ITS ROF length (from ALPIDE parameters) + static int fgITSROFBorderMarginLow; // ITS ROF border low margin + static int fgITSROFBorderMarginHigh; // ITS ROF border high margin + static uint64_t fgSOR; // Timestamp for start of run + static uint64_t fgEOR; // Timestamp for end of run + static ROOT::Math::PxPyPzEVector fgBeamA; // beam from A-side 4-momentum vector + static ROOT::Math::PxPyPzEVector fgBeamC; // beam from C-side 4-momentum vector + + // static void FillEventDerived(float* values = nullptr); + static void FillTrackDerived(float* values = nullptr); + template + static auto getRotatedCovMatrixXX(const T& matrix, U phi, V theta); + template + static KFPTrack createKFPTrackFromTrack(const T& track); + template + static KFPTrack createKFPFwdTrackFromFwdTrack(const T& muon); + template + static KFPVertex createKFPVertexFromCollision(const T& collision); + static float calculateCosPA(KFParticle kfp, KFParticle PV); + template + static float calculatePhiV(const T1& t1, const T2& t2); + template + static float LorentzTransformJpsihadroncosChi(TString Option, const T1& v1, const T2& v2); + + static o2::vertexing::DCAFitterN<2> fgFitterTwoProngBarrel; + static o2::vertexing::DCAFitterN<3> fgFitterThreeProngBarrel; + static o2::vertexing::DCAFitterN<4> fgFitterFourProngBarrel; + static o2::vertexing::FwdDCAFitterN<2> fgFitterTwoProngFwd; + static o2::vertexing::FwdDCAFitterN<3> fgFitterThreeProngFwd; + static o2::globaltracking::MatchGlobalFwd mMatching; + + static std::map fgCalibs; // map of calibration histograms + static bool fgRunTPCPostCalibration[4]; // 0-electron, 1-pion, 2-kaon, 3-proton + static int fgCalibrationType; // 0 - no calibration, 1 - calibration vs (TPCncls,pIN,eta) typically for pp, 2 - calibration vs (eta,nPV,nLong,tLong) typically for PbPb + static bool fgUseInterpolatedCalibration; // use interpolated calibration histograms (default: true) + + static int fgEfficiencyType; // type of efficiency correction to apply + static TObject* fgEfficiencyHist; // histogram for efficiency correction + + VarManager& operator=(const VarManager& c); + VarManager(const VarManager& c); + + ClassDef(VarManager, 6); +}; + +#endif // PWGDQ_CORE_VARMANAGERCORE_H_ From a5e2c38f291afc91bdf08b45d2514f13dc068573 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 26 Jun 2026 09:15:41 +0000 Subject: [PATCH 5/7] Please consider the following formatting changes --- PWGDQ/Core/VarManagerCore.h | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/PWGDQ/Core/VarManagerCore.h b/PWGDQ/Core/VarManagerCore.h index 216b40572f5..a67f5f7e5e3 100644 --- a/PWGDQ/Core/VarManagerCore.h +++ b/PWGDQ/Core/VarManagerCore.h @@ -21,25 +21,24 @@ #define HomogeneousField #endif -#include - #include #include +#include #include #include #include #include #include -#include + +#include +#include +#include +#include #include #include #include -#include -#include -#include - #include using SMatrix55 = ROOT::Math::SMatrix>; @@ -1127,32 +1126,32 @@ class VarManager : public TObject static void SetUseVars(const std::vector usedVars); static bool GetUsedVar(int var); - // Flag to set PV recalculation via KF + // Flag to set PV recalculation via KF static void SetPVrecalculationKF(const bool pvRecalKF); - // Setup the collision system + // Setup the collision system static void SetCollisionSystem(TString system, float energy); static void SetCollisionSystem(o2::parameters::GRPLHCIFData* grplhcif); static void SetMagneticField(float magField); - // Setup plane position for MFT-MCH matching + // Setup plane position for MFT-MCH matching static void SetMatchingPlane(float z); static float GetMatchingPlane(); - // Set z shift for forward tracks + // Set z shift for forward tracks static void SetZShift(float z); - // Setup the 2 prong KFParticle + // Setup the 2 prong KFParticle static void SetupTwoProngKFParticle(float magField); // Setup magnetic field for muon propagation static void SetupMuonMagField(); - // Setup the 2 prong DCAFitterN + // Setup the 2 prong DCAFitterN static void SetupTwoProngDCAFitter(float magField, bool propagateToPCA, float maxR, float maxDZIni, float minParamChange, float minRelChi2Change, bool useAbsDCA); - // Setup the 2 prong FwdDCAFitterN + // Setup the 2 prong FwdDCAFitterN static void SetupTwoProngFwdDCAFitter(float magField, bool propagateToPCA, float maxR, float minParamChange, float minRelChi2Change, bool useAbsDCA); // Use MatLayerCylSet to correct MCS in fwdtrack propagation static void SetupMatLUTFwdDCAFitter(o2::base::MatLayerCylSet* m); @@ -1163,13 +1162,13 @@ class VarManager : public TObject // Setup the 3 prong KFParticle static void SetupThreeProngKFParticle(float magField); - // Setup the 3 prong DCAFitterN + // Setup the 3 prong DCAFitterN static void SetupThreeProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA); - // Setup the 4 prong KFParticle + // Setup the 4 prong KFParticle static void SetupFourProngKFParticle(float magField); - // Setup the 4 prong DCAFitterN + // Setup the 4 prong DCAFitterN static void SetupFourProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA); static auto getEventPlane(int harm, float qnxa, float qnya); @@ -1343,7 +1342,7 @@ class VarManager : public TObject static ROOT::Math::PxPyPzEVector fgBeamA; // beam from A-side 4-momentum vector static ROOT::Math::PxPyPzEVector fgBeamC; // beam from C-side 4-momentum vector - // 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); From 9d8f0addc21f1dacf85ad8f43b1303aa33d5e006 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 26 Jun 2026 11:27:49 +0200 Subject: [PATCH 6/7] minor fix --- PWGDQ/Core/VarManager.cxx | 2 +- PWGDQ/Core/VarManagerCore.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index e3940839166..99094442d59 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -791,7 +791,7 @@ void VarManager::SetupFourProngDCAFitter(float magField, bool propagateToPCA, fl fgUsedKF = false; } -auto VarManager::getEventPlane(int harm, float qnxa, float qnya) +double VarManager::getEventPlane(int harm, float qnxa, float qnya) { // Compute event plane angle from qn vector components for the sub-event A return (1.0 / harm) * TMath::ATan2(qnya, qnxa); diff --git a/PWGDQ/Core/VarManagerCore.h b/PWGDQ/Core/VarManagerCore.h index a67f5f7e5e3..bcc798898eb 100644 --- a/PWGDQ/Core/VarManagerCore.h +++ b/PWGDQ/Core/VarManagerCore.h @@ -1171,7 +1171,7 @@ class VarManager : public TObject // Setup the 4 prong DCAFitterN static void SetupFourProngDCAFitter(float magField, bool propagateToPCA, float maxR, float /*maxDZIni*/, float minParamChange, float minRelChi2Change, bool useAbsDCA); - static auto getEventPlane(int harm, float qnxa, float qnya); + static double getEventPlane(int harm, float qnxa, float qnya); static float getDeltaPsiInRange(float psi1, float psi2, float harmonic); template From 933d52b00781d2de9844304a1cc05a166a801fdd Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 26 Jun 2026 12:12:01 +0200 Subject: [PATCH 7/7] minor fix 2 --- PWGEM/PhotonMeson/Utils/TrackSelection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGEM/PhotonMeson/Utils/TrackSelection.h b/PWGEM/PhotonMeson/Utils/TrackSelection.h index f1302cc9573..24edbee9868 100644 --- a/PWGEM/PhotonMeson/Utils/TrackSelection.h +++ b/PWGEM/PhotonMeson/Utils/TrackSelection.h @@ -30,7 +30,7 @@ concept is_iterator = requires(T t) { template concept is_sentinel = requires(T t) { - std::same_as; + requires(std::same_as); }; template