diff --git a/Common/Core/CollisionAssociation.h b/Common/Core/CollisionAssociation.h index 458ad6a3043..f2206846183 100644 --- a/Common/Core/CollisionAssociation.h +++ b/Common/Core/CollisionAssociation.h @@ -133,6 +133,10 @@ class CollisionAssociation for (const auto& ambTrack : ambiguousTracks) { if constexpr (isCentralBarrel) { // FIXME: to be removed as soon as it is possible to use getId() for joined tables if (ambTrack.trackId() == track.globalIndex()) { + if (!ambTrack.has_bc() || ambTrack.bc().size() == 0) { + globalBC.push_back(-1); + break; + } globalBC.push_back(ambTrack.bc().begin().globalBC()); break; } @@ -163,6 +167,9 @@ class CollisionAssociation } float trackTime = track.trackTime(); + if (globalBC[track.filteredIndex()] < 0) { + continue; + } const int64_t bcOffsetWindow = (int64_t)globalBC[track.filteredIndex()] + trackTime / o2::constants::lhc::LHCBunchSpacingNS - (int64_t)collBC; if (std::abs(bcOffsetWindow) > bOffsetMax) { continue; diff --git a/Common/DataModel/EvtPlanes.h b/Common/DataModel/EvtPlanes.h index a160c4c4714..4a5485e5abf 100644 --- a/Common/DataModel/EvtPlanes.h +++ b/Common/DataModel/EvtPlanes.h @@ -43,12 +43,15 @@ DECLARE_SOA_COLUMN(EvtPlBNegRectr, evtPlBNegRectr, float); DECLARE_SOA_COLUMN(EvtPlBNegTwist, evtPlBNegTwist, float); DECLARE_SOA_COLUMN(EvtPlBNegFinal, evtPlBNegFinal, float); +DECLARE_SOA_COLUMN(NTrkBPos, nTrkBPos, int); +DECLARE_SOA_COLUMN(NTrkBNeg, nTrkBNeg, int); } // namespace ep DECLARE_SOA_TABLE(EvtPlanes, "AOD", "EVTPLANES", //! Table with all event planes. ep::Cent, ep::EvtPlUncor, ep::EvtPlRectr, ep::EvtPlTwist, ep::EvtPlFinal, ep::EvtPlBPosUncor, ep::EvtPlBPosRectr, ep::EvtPlBPosTwist, ep::EvtPlBPosFinal, - ep::EvtPlBNegUncor, ep::EvtPlBNegRectr, ep::EvtPlBNegTwist, ep::EvtPlBNegFinal); + ep::EvtPlBNegUncor, ep::EvtPlBNegRectr, ep::EvtPlBNegTwist, ep::EvtPlBNegFinal, + ep::NTrkBPos, ep::NTrkBNeg); using EvtPlane = EvtPlanes::iterator; } // namespace o2::aod diff --git a/Common/DataModel/Qvectors.h b/Common/DataModel/Qvectors.h index 8c09c855f00..c1ca295c7c9 100644 --- a/Common/DataModel/Qvectors.h +++ b/Common/DataModel/Qvectors.h @@ -53,6 +53,8 @@ DECLARE_SOA_COLUMN(QvecBNegTwistRe, qvecBNegTwistRe, float); DECLARE_SOA_COLUMN(QvecBNegTwistIm, qvecBNegTwistIm, float); DECLARE_SOA_COLUMN(QvecBNegFinalRe, qvecBNegFinalRe, float); DECLARE_SOA_COLUMN(QvecBNegFinalIm, qvecBNegFinalIm, float); +DECLARE_SOA_COLUMN(NTrkBPos, nTrkBPos, int); +DECLARE_SOA_COLUMN(NTrkBNeg, nTrkBNeg, int); /// NOTE: Add here Qx,Qy for other systems. } // namespace qvec @@ -63,7 +65,8 @@ DECLARE_SOA_TABLE(Qvectors, "AOD", "QVECTORS", //! Table with all Qvectors. qvec::QvecBPosUncorRe, qvec::QvecBPosUncorIm, qvec::QvecBPosRectrRe, qvec::QvecBPosRectrIm, qvec::QvecBPosTwistRe, qvec::QvecBPosTwistIm, qvec::QvecBPosFinalRe, qvec::QvecBPosFinalIm, qvec::QvecBNegUncorRe, qvec::QvecBNegUncorIm, qvec::QvecBNegRectrRe, qvec::QvecBNegRectrIm, - qvec::QvecBNegTwistRe, qvec::QvecBNegTwistIm, qvec::QvecBNegFinalRe, qvec::QvecBNegFinalIm); + qvec::QvecBNegTwistRe, qvec::QvecBNegTwistIm, qvec::QvecBNegFinalRe, qvec::QvecBNegFinalIm, + qvec::NTrkBPos, qvec::NTrkBNeg); using Qvector = Qvectors::iterator; } // namespace o2::aod diff --git a/Common/TableProducer/evtPlanesTable.cxx b/Common/TableProducer/evtPlanesTable.cxx index 27b01439469..0440f1b17dc 100644 --- a/Common/TableProducer/evtPlanesTable.cxx +++ b/Common/TableProducer/evtPlanesTable.cxx @@ -96,7 +96,8 @@ struct evtPlanesTable { evPlane(qVec.cent(), evtPlane[0], evtPlane[1], evtPlane[2], evtPlane[3], evtPlaneBPos[0], evtPlaneBPos[1], evtPlaneBPos[2], evtPlaneBPos[3], - evtPlaneBNeg[0], evtPlaneBNeg[1], evtPlaneBNeg[2], evtPlaneBNeg[3]); + evtPlaneBNeg[0], evtPlaneBNeg[1], evtPlaneBNeg[2], evtPlaneBNeg[3], + qVec.nTrkBPos(), qVec.nTrkBNeg()); } // void process(aod::Qvector const& qVec) }; diff --git a/Common/TableProducer/qVectorsTable.cxx b/Common/TableProducer/qVectorsTable.cxx index a64522fa537..442739f4462 100644 --- a/Common/TableProducer/qVectorsTable.cxx +++ b/Common/TableProducer/qVectorsTable.cxx @@ -50,7 +50,7 @@ using namespace o2::framework; using MyCollisions = soa::Join; -using MyTracks = soa::Join; +using MyTracks = soa::Join; struct qVectorsTable { // Configurables. @@ -72,8 +72,11 @@ struct qVectorsTable { // FIXME: 6 correction factors for each centrality and 8 centrality intervals are hard-coded. Configurable> cfgCorr{"cfgCorr", std::vector{0.0}, "Correction constants for detector"}; - Configurable> cfgBPosCorr{"cfgBPosCent", std::vector{0.0}, "Correction constants for positive TPC tracks"}; - Configurable> cfgBNegCorr{"cfgBNegCent", std::vector{0.0}, "Correction constants for negative TPC tracks"}; + Configurable> cfgBPosCorr{"cfgBPosCorr", std::vector{0.0}, "Correction constants for positive TPC tracks"}; + Configurable> cfgBNegCorr{"cfgBNegCorr", std::vector{0.0}, "Correction constants for negative TPC tracks"}; + + Configurable cfgMinPtOnTPC{"cfgMinPtOnTPC", 0.15, "minimum transverse momentum selection for TPC tracks participating in Q-vector reconstruction"}; + Configurable cfgMaxPtOnTPC{"cfgMaxPtOnTPC", 5., "maximum transverse momentum selection for TPC tracks participating in Q-vector reconstruction"}; // Table. Produces qVector; @@ -148,6 +151,33 @@ struct qVectorsTable { histosQA.add("ChTracks", "", {HistType::kTHnSparseF, {axisPt, axisEta, axisPhi, axixCent}}); } + template + bool SelTrack(const TrackType track) + { + if (track.pt() < cfgMinPtOnTPC) + return false; + if (track.pt() > cfgMaxPtOnTPC) + return false; + if (!track.passedITSNCls()) + return false; + if (!track.passedITSChi2NDF()) + return false; + if (!track.passedITSHits()) + return false; + if (!track.passedITSNCls()) + return false; + if (!track.passedTPCCrossedRowsOverNCls()) + return false; + if (!track.passedTPCChi2NDF()) + return false; + if (!track.passedDCAxy()) + return false; + if (!track.passedDCAz()) + return false; + + return true; + } + void process(MyCollisions::iterator const& coll, aod::FT0s const& ft0s, aod::FV0As const& fv0s, MyTracks const& tracks) //, aod::FV0Cs const&) // void process(MyCollisions::iterator const& coll, aod::FT0s const& ft0s, aod::FV0As const& fv0s) { @@ -261,20 +291,24 @@ struct qVectorsTable { qVectBNeg[0] = 0.; qVectBNeg[1] = 0.; + int nTrkBPos = 0; + int nTrkBNeg = 0; for (auto& trk : tracks) { - if (!trk.isGlobalTrack()) + if (!SelTrack(trk)) continue; histosQA.fill(HIST("ChTracks"), trk.pt(), trk.eta(), trk.phi(), cent); if (abs(trk.eta()) < 0.1 || abs(trk.eta()) > 0.8) continue; if (trk.eta() > 0) { - qVectBPos[0] += trk.pt() * TMath::Cos(2. * trk.phi()); - qVectBPos[1] += trk.pt() * TMath::Sin(2. * trk.phi()); + qVectBPos[0] += trk.pt() * TMath::Cos(2. * trk.phi()) / 20.; + qVectBPos[1] += trk.pt() * TMath::Sin(2. * trk.phi()) / 20.; + nTrkBPos++; } else if (trk.eta() < 0) { - qVectBNeg[0] += trk.pt() * TMath::Cos(2. * trk.phi()); - qVectBNeg[1] += trk.pt() * TMath::Sin(2. * trk.phi()); + qVectBNeg[0] += trk.pt() * TMath::Cos(2. * trk.phi()) / 20.; + qVectBNeg[1] += trk.pt() * TMath::Sin(2. * trk.phi()) / 20.; + nTrkBNeg++; } - } + } // FIXME: ARBITRARY SCALE FACTOR OF 20 /// TODO: Repeat here the procedure for any other Qvector columns. /// Do not forget to add the configurable for the correction constants. @@ -329,8 +363,8 @@ struct qVectorsTable { helperEP.DoRecenter(qVector_rectr[0], qVector_rectr[1], cfgCorr->at(cBin * 6), cfgCorr->at(cBin * 6 + 1)); - helperEP.DoRecenter(qVector_twist[0], qVector_twist[1], cfgCorr->at(cBin * 6 + 2), cfgCorr->at(cBin * 6 + 3)); - helperEP.DoTwist(qVector_twist[0], qVector_twist[1], cfgCorr->at(cBin * 6 + 4), cfgCorr->at(cBin * 6 + 5)); + helperEP.DoRecenter(qVector_twist[0], qVector_twist[1], cfgCorr->at(cBin * 6), cfgCorr->at(cBin * 6 + 1)); + helperEP.DoTwist(qVector_twist[0], qVector_twist[1], cfgCorr->at(cBin * 6 + 2), cfgCorr->at(cBin * 6 + 3)); helperEP.DoRecenter(qVector_final[0], qVector_final[1], cfgCorr->at(cBin * 6), cfgCorr->at(cBin * 6 + 1)); helperEP.DoTwist(qVector_final[0], qVector_final[1], cfgCorr->at(cBin * 6 + 2), cfgCorr->at(cBin * 6 + 3)); @@ -361,7 +395,8 @@ struct qVectorsTable { qVectBPos_uncor[0], qVectBPos_uncor[1], qVectBPos_rectr[0], qVectBPos_rectr[1], qVectBPos_twist[0], qVectBPos_twist[1], qVectBPos_final[0], qVectBPos_final[1], qVectBNeg_uncor[0], qVectBNeg_uncor[1], qVectBNeg_rectr[0], qVectBNeg_rectr[1], - qVectBNeg_twist[0], qVectBNeg_twist[1], qVectBNeg_final[0], qVectBNeg_final[1]); + qVectBNeg_twist[0], qVectBNeg_twist[1], qVectBNeg_final[0], qVectBNeg_final[1], + nTrkBPos, nTrkBNeg); } // End process. }; diff --git a/Common/Tasks/evtPlanesResolution.cxx b/Common/Tasks/evtPlanesResolution.cxx index d098b11496e..358d4f8fb55 100644 --- a/Common/Tasks/evtPlanesResolution.cxx +++ b/Common/Tasks/evtPlanesResolution.cxx @@ -61,6 +61,8 @@ struct evtPlanesResolution { // Helper variables. EventPlaneHelper helperEP; + Configurable cfgMinTPCTracks{"cfgMinTPCTracks", 20, "minimum TPC tracks participating in Q-vector reconstruction"}; + void init(InitContext const&) { // Fill the registry with the needed objects. @@ -91,6 +93,9 @@ struct evtPlanesResolution { template void fillHistosEvtPl(const T& vec) { + if (vec.nTrkBPos() < cfgMinTPCTracks || vec.nTrkBNeg() < cfgMinTPCTracks) + return; + histosQA.fill(HIST(ep::centClasses[cBin]) + HIST("histEvtPlUncor"), vec.evtPlUncor()); histosQA.fill(HIST(ep::centClasses[cBin]) + HIST("histEvtPlRectr"), vec.evtPlRectr()); histosQA.fill(HIST(ep::centClasses[cBin]) + HIST("histEvtPlTwist"), vec.evtPlTwist()); diff --git a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx index 41b0aa72754..7131b919f6b 100644 --- a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx +++ b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx @@ -86,7 +86,7 @@ struct EventSelectionQaTask { const AxisSpec axisTimeSum{100, -10., 10., ""}; const AxisSpec axisGlobalBCs{nGlobalBCs, 0., static_cast(nGlobalBCs), ""}; const AxisSpec axisBCs{nBCsPerOrbit, 0., static_cast(nBCsPerOrbit), ""}; - const AxisSpec axisNcontrib{200, 0., isLowFlux ? 200. : 4500., "n contributors"}; + const AxisSpec axisNcontrib{200, 0., isLowFlux ? 200. : 7000., "n contributors"}; const AxisSpec axisEta{100, -1., 1., "track #eta"}; const AxisSpec axisColTimeRes{1500, 0., 1500., "collision time resolution (ns)"}; const AxisSpec axisBcDif{600, -300., 300., "collision bc difference"}; @@ -571,7 +571,7 @@ struct EventSelectionQaTask { double minSec = floor(tsSOR / 1000.); double maxSec = ceil(tsEOR / 1000.); const AxisSpec axisSeconds{static_cast(maxSec - minSec), minSec, maxSec, "seconds"}; - const AxisSpec axisBcDif{200, -100., 100., "collision bc difference"}; + const AxisSpec axisBcDif{600, -300., 300., "bc difference"}; histos.add("hSecondsTVXvsBcDif", "", kTH2F, {axisSeconds, axisBcDif}); histos.add("hSecondsTVXvsBcDifAll", "", kTH2F, {axisSeconds, axisBcDif}); } diff --git a/DPG/Tasks/AOTTrack/qaMatchEff.cxx b/DPG/Tasks/AOTTrack/qaMatchEff.cxx index 5301b9c17d4..c106f66e6af 100644 --- a/DPG/Tasks/AOTTrack/qaMatchEff.cxx +++ b/DPG/Tasks/AOTTrack/qaMatchEff.cxx @@ -21,6 +21,7 @@ #include "Common/DataModel/EventSelection.h" #include "Common/Core/TrackSelection.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/TrackSelectionDefaults.h" #include "Common/DataModel/PIDResponse.h" #include "CommonConstants/MathConstants.h" #include "CCDB/BasicCCDBManager.h" @@ -52,6 +53,7 @@ struct qaMatchEff { // // Track selections Configurable b_useTrackSelections{"b_useTrackSelections", false, "Boolean to switch the track selections on/off."}; + Configurable filterbitTrackSelections{"filterbitTrackSelections", 0, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; // kinematics Configurable ptMinCutInnerWallTPC{"ptMinCutInnerWallTPC", 0.1f, "Minimum transverse momentum calculated at the inner wall of TPC (GeV/c)"}; Configurable ptMinCut{"ptMinCut", 0.1f, "Minimum transverse momentum (GeV/c)"}; @@ -149,9 +151,6 @@ struct qaMatchEff { // Tracks selection object TrackSelection cutObject; // - // pt calculated at the inner wall of TPC - float trackPtInParamTPC = -1.; - // // do you want pt comparison 2d's ? Configurable makept2d{"makept2d", false, "choose if produce pt reco/TPC derived pt 2dims "}; // @@ -167,10 +166,16 @@ struct qaMatchEff { // ****** BE VERY CAREFUL! -- FILTERS !!! ***** // Filter zPrimVtxLim = nabs(aod::collision::posZ) < zPrimVtxMax; + Filter trackFilter = (filterbitTrackSelections.node() == 0) || + ((filterbitTrackSelections.node() == 1) && requireGlobalTrackInFilter()) || /// filterbit 4 track selections + tight DCA cuts + ((filterbitTrackSelections.node() == 2) && requireGlobalTrackWoPtEtaInFilter()) || + ((filterbitTrackSelections.node() == 3) && requireGlobalTrackWoDCAInFilter()) || + ((filterbitTrackSelections.node() == 4) && requireQualityTracksInFilter()) || + ((filterbitTrackSelections.node() == 5) && requireTrackCutInFilter(TrackSelectionFlags::kInAcceptanceTracks)); // // // - // Init function + // Init function // void init(o2::framework::InitContext&) { @@ -183,9 +188,9 @@ struct qaMatchEff { else initData(); - if ((!isitMC && (doprocessMC || doprocessMCNoColl || doprocessTrkIUMC)) || (isitMC && (doprocessData && doprocessDataNoColl && doprocessTrkIUMC))) + if ((!isitMC && (doprocessMCFilteredTracks || doprocessMC || doprocessMCNoColl || doprocessTrkIUMC)) || (isitMC && (doprocessDataFilteredTracks || doprocessData || doprocessDataNoColl || doprocessTrkIUMC))) LOGF(fatal, "Initialization set for MC and processData function flagged (or viceversa)! Fix the configuration."); - if ((doprocessMC && doprocessMCNoColl && doprocessTrkIUMC) || (doprocessData && doprocessDataNoColl && doprocessTrkIUData)) + if ((doprocessMCFilteredTracks && doprocessMC && doprocessMCNoColl && doprocessTrkIUMC) || (doprocessDataFilteredTracks && doprocessData && doprocessDataNoColl && doprocessTrkIUData)) LOGF(fatal, "Cannot process for both without collision tag and with collision tag at the same time! Fix the configuration."); if (doprocessTrkIUMC && makethn) { LOGF(fatal, "No DCA for IU tracks. Put makethn = false."); @@ -1896,6 +1901,13 @@ struct qaMatchEff { } PROCESS_SWITCH(qaMatchEff, processMC, "process MC", false); + void processMCFilteredTracks(soa::Filtered::iterator const& collision, soa::Filtered> const& tracks, aod::McParticles const& mcParticles) + { + fillHistograms(tracks, mcParticles, mcParticles); /// 3rd argument non-sense in this case + fillGeneralHistos(collision); + } + PROCESS_SWITCH(qaMatchEff, processMCFilteredTracks, "process MC with filtered tracks with filterbit selections", false); + //////////////////////////////////////////////////////////// /// Process MC with collision grouping and IU tracks /// //////////////////////////////////////////////////////////// @@ -1929,6 +1941,17 @@ struct qaMatchEff { } PROCESS_SWITCH(qaMatchEff, processData, "process data", true); + void processDataFilteredTracks(soa::Filtered::iterator const& collision, soa::Filtered> const& tracks, BCsWithTimeStamp const& bcs) + { + if (enableMonitorVsTime) { + // tracks.rawIteratorAt(0).collision().bc_as().timestamp(); /// NB: in ms + setUpTimeMonitoring(bcs); + } + fillHistograms(tracks, tracks, bcs); // 2nd argument not used in this case + fillGeneralHistos(collision); + } + PROCESS_SWITCH(qaMatchEff, processDataFilteredTracks, "process data with filtered tracks with filterbit selections", false); + ///////////////////////////////////////////////////////////// /// Process data with collision grouping and IU tracks /// ///////////////////////////////////////////////////////////// diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index c739a579ff8..c92e7bd7f4e 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -41,9 +41,10 @@ #include "EventFiltering/PWGHF/HFFilterHelpers.h" using namespace o2; +using namespace o2::analysis; +using namespace o2::aod::hffilters; using namespace o2::framework; using namespace o2::framework::expressions; -using namespace o2::aod::hffilters; struct HfFilter { // Main struct for HF triggers diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 28f589da34b..f8424fc33d5 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -209,8 +209,8 @@ static const std::vector labelsColumnsCharmBaryons = {"MinPtXiPi", // dummy array static const std::vector labelsEmpty{}; -static constexpr double cutsTrackDummy[hf_cuts_single_track::nBinsPtTrack][hf_cuts_single_track::nCutVarsTrack] = {{0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}}; -o2::framework::LabeledArray cutsSingleTrackDummy{cutsTrackDummy[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}; +static constexpr double cutsTrackDummy[o2::analysis::hf_cuts_single_track::nBinsPtTrack][o2::analysis::hf_cuts_single_track::nCutVarsTrack] = {{0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}}; +o2::framework::LabeledArray cutsSingleTrackDummy{cutsTrackDummy[0], o2::analysis::hf_cuts_single_track::nBinsPtTrack, o2::analysis::hf_cuts_single_track::nCutVarsTrack, o2::analysis::hf_cuts_single_track::labelsPtTrack, o2::analysis::hf_cuts_single_track::labelsCutVarTrack}; // Main helper class diff --git a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx index ec4d1cb0740..72a530c015c 100644 --- a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx +++ b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx @@ -37,9 +37,10 @@ #include "EventFiltering/PWGHF/HFFilterHelpers.h" using namespace o2; +using namespace o2::analysis; +using namespace o2::aod::hffilters; using namespace o2::framework; using namespace o2::framework::expressions; -using namespace o2::aod::hffilters; struct HfFilterPrepareMlSamples { // Main struct @@ -49,7 +50,7 @@ struct HfFilterPrepareMlSamples { // Main struct // parameters for production of training samples Configurable fillSignal{"fillSignal", true, "Flag to fill derived tables with signal for ML trainings"}; Configurable fillBackground{"fillBackground", true, "Flag to fill derived tables with background for ML trainings"}; - Configurable donwSampleBkgFactor{"donwSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; + Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; // CCDB configuration o2::ccdb::CcdbApi ccdbApi; @@ -131,7 +132,7 @@ struct HfFilterPrepareMlSamples { // Main struct } float pseudoRndm = trackPos.pt() * 1000. - (int64_t)(trackPos.pt() * 1000); - if ((fillSignal && indexRec > -1) || (fillBackground && indexRec < 0 && pseudoRndm < donwSampleBkgFactor)) { + if ((fillSignal && indexRec > -1) || (fillBackground && indexRec < 0 && pseudoRndm < downSampleBkgFactor)) { train2P(invMassD0, invMassD0bar, pt2Prong, trackParPos.getPt(), dcaPos[0], dcaPos[1], trackPos.tpcNSigmaPi(), trackPos.tpcNSigmaKa(), trackPos.tofNSigmaPi(), trackPos.tofNSigmaKa(), trackParNeg.getPt(), dcaNeg[0], dcaNeg[1], trackNeg.tpcNSigmaPi(), trackNeg.tpcNSigmaKa(), trackNeg.tofNSigmaPi(), trackNeg.tofNSigmaKa(), flag, isInCorrectColl); } @@ -238,7 +239,7 @@ struct HfFilterPrepareMlSamples { // Main struct } float pseudoRndm = trackFirst.pt() * 1000. - (int64_t)(trackFirst.pt() * 1000); - if ((fillSignal && indexRec > -1) || (fillBackground && indexRec < 0 && pseudoRndm < donwSampleBkgFactor)) { + if ((fillSignal && indexRec > -1) || (fillBackground && indexRec < 0 && pseudoRndm < downSampleBkgFactor)) { train3P(invMassDplus, invMassDsToKKPi, invMassDsToPiKK, invMassLcToPKPi, invMassLcToPiKP, invMassXicToPKPi, invMassXicToPiKP, pt3Prong, deltaMassKKFirst, deltaMassKKSecond, trackParFirst.getPt(), dcaFirst[0], dcaFirst[1], trackFirst.tpcNSigmaPi(), trackFirst.tpcNSigmaKa(), trackFirst.tpcNSigmaPr(), trackFirst.tofNSigmaPi(), trackFirst.tofNSigmaKa(), trackFirst.tofNSigmaPr(), trackParSecond.getPt(), dcaSecond[0], dcaSecond[1], trackSecond.tpcNSigmaPi(), trackSecond.tpcNSigmaKa(), trackSecond.tpcNSigmaPr(), trackSecond.tofNSigmaPi(), trackSecond.tofNSigmaKa(), trackSecond.tofNSigmaPr(), diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index acb4a2d96b5..b8fbdffbf80 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -794,6 +794,7 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) std::vector vecPIDcase; vecPIDcase.emplace_back(""); // without post calibration vecPIDcase.emplace_back("_Corr"); // case of using post calibrated PID spectra + vecPIDcase.emplace_back("_CorrWithKaon"); // case of using post calibrated PID spectra with also the kaons // loop to define PID cuts with and without post calibration for (int icase = 0; icase < vecPIDcase.size(); icase++) { @@ -1136,6 +1137,83 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) return cut; } + // 4 cuts to separate pos & neg tracks in pos & neg eta range applying electron PID for low B field + if (!nameStr.compare(Form("lmee_lowB_posNSigmaRun3_posEta%s_strongNSigE", vecPIDcase.at(icase).Data()))) { + cut->AddCut(GetAnalysisCut("posTrack")); + cut->AddCut(GetAnalysisCut("posEtaSel")); + cut->AddCut(GetAnalysisCut("TightGlobalTrackRun3")); + cut->AddCut(GetAnalysisCut("standardPrimaryTrackDCAz")); + + AnalysisCompositeCut* cut_tpc_nSigma = new AnalysisCompositeCut("pid_TPCnSigma", "pid_TPCnSigma", kTRUE); + cut_tpc_nSigma->AddCut(GetAnalysisCut(Form("electronPID_lowB_TPCnsigma%s_strongNSigE", vecPIDcase.at(icase).Data()))); + + AnalysisCompositeCut* cut_tof_nSigma = new AnalysisCompositeCut("pid_TOFnSigma", "pid_TOFnSigma", kTRUE); + cut_tof_nSigma->AddCut(GetAnalysisCut(Form("electronPID_lowB_TOFnsigma%s_strongNSigE", vecPIDcase.at(icase).Data()))); + + AnalysisCompositeCut* cut_pid_OR = new AnalysisCompositeCut("e_NSigma", "e_NSigma", kFALSE); + cut_pid_OR->AddCut(cut_tpc_nSigma); + cut_pid_OR->AddCut(cut_tof_nSigma); + cut->AddCut(cut_pid_OR); + return cut; + } + + if (!nameStr.compare(Form("lmee_lowB_negNSigmaRun3_posEta%s_strongNSigE", vecPIDcase.at(icase).Data()))) { + cut->AddCut(GetAnalysisCut("negTrack")); + cut->AddCut(GetAnalysisCut("posEtaSel")); + cut->AddCut(GetAnalysisCut("TightGlobalTrackRun3")); + cut->AddCut(GetAnalysisCut("standardPrimaryTrackDCAz")); + + AnalysisCompositeCut* cut_tpc_nSigma = new AnalysisCompositeCut("pid_TPCnSigma", "pid_TPCnSigma", kTRUE); + cut_tpc_nSigma->AddCut(GetAnalysisCut(Form("electronPID_lowB_TPCnsigma%s_strongNSigE", vecPIDcase.at(icase).Data()))); + + AnalysisCompositeCut* cut_tof_nSigma = new AnalysisCompositeCut("pid_TOFnSigma", "pid_TOFnSigma", kTRUE); + cut_tof_nSigma->AddCut(GetAnalysisCut(Form("electronPID_lowB_TOFnsigma%s_strongNSigE", vecPIDcase.at(icase).Data()))); + + AnalysisCompositeCut* cut_pid_OR = new AnalysisCompositeCut("e_NSigma", "e_NSigma", kFALSE); + cut_pid_OR->AddCut(cut_tpc_nSigma); + cut_pid_OR->AddCut(cut_tof_nSigma); + cut->AddCut(cut_pid_OR); + return cut; + } + + if (!nameStr.compare(Form("lmee_lowB_posNSigmaRun3_negEta%s_strongNSigE", vecPIDcase.at(icase).Data()))) { + cut->AddCut(GetAnalysisCut("posTrack")); + cut->AddCut(GetAnalysisCut("negEtaSel")); + cut->AddCut(GetAnalysisCut("TightGlobalTrackRun3")); + cut->AddCut(GetAnalysisCut("standardPrimaryTrackDCAz")); + + AnalysisCompositeCut* cut_tpc_nSigma = new AnalysisCompositeCut("pid_TPCnSigma", "pid_TPCnSigma", kTRUE); + cut_tpc_nSigma->AddCut(GetAnalysisCut(Form("electronPID_lowB_TPCnsigma%s_strongNSigE", vecPIDcase.at(icase).Data()))); + + AnalysisCompositeCut* cut_tof_nSigma = new AnalysisCompositeCut("pid_TOFnSigma", "pid_TOFnSigma", kTRUE); + cut_tof_nSigma->AddCut(GetAnalysisCut(Form("electronPID_lowB_TOFnsigma%s_strongNSigE", vecPIDcase.at(icase).Data()))); + + AnalysisCompositeCut* cut_pid_OR = new AnalysisCompositeCut("e_NSigma", "e_NSigma", kFALSE); + cut_pid_OR->AddCut(cut_tpc_nSigma); + cut_pid_OR->AddCut(cut_tof_nSigma); + cut->AddCut(cut_pid_OR); + return cut; + } + + if (!nameStr.compare(Form("lmee_lowB_negNSigmaRun3_negEta%s_strongNSigE", vecPIDcase.at(icase).Data()))) { + cut->AddCut(GetAnalysisCut("negTrack")); + cut->AddCut(GetAnalysisCut("negEtaSel")); + cut->AddCut(GetAnalysisCut("TightGlobalTrackRun3")); + cut->AddCut(GetAnalysisCut("standardPrimaryTrackDCAz")); + + AnalysisCompositeCut* cut_tpc_nSigma = new AnalysisCompositeCut("pid_TPCnSigma", "pid_TPCnSigma", kTRUE); + cut_tpc_nSigma->AddCut(GetAnalysisCut(Form("electronPID_lowB_TPCnsigma%s_strongNSigE", vecPIDcase.at(icase).Data()))); + + AnalysisCompositeCut* cut_tof_nSigma = new AnalysisCompositeCut("pid_TOFnSigma", "pid_TOFnSigma", kTRUE); + cut_tof_nSigma->AddCut(GetAnalysisCut(Form("electronPID_lowB_TOFnsigma%s_strongNSigE", vecPIDcase.at(icase).Data()))); + + AnalysisCompositeCut* cut_pid_OR = new AnalysisCompositeCut("e_NSigma", "e_NSigma", kFALSE); + cut_pid_OR->AddCut(cut_tpc_nSigma); + cut_pid_OR->AddCut(cut_tof_nSigma); + cut->AddCut(cut_pid_OR); + return cut; + } + if (!nameStr.compare(Form("lmee_skimmingtesta_PID%s", vecPIDcase.at(icase).Data()))) { cut->AddCut(GetAnalysisCut("lmeeStandardKine")); cut->AddCut(GetAnalysisCut("LooseGlobalTrackRun3")); @@ -2371,9 +2449,19 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) std::vector vecPIDcase; vecPIDcase.emplace_back(""); // without post calibration vecPIDcase.emplace_back("_Corr"); // case of using post calibrated PID spectra + vecPIDcase.emplace_back("_CorrWithKaon"); // case of using post calibrated PID spectra with also the kaons // loop to define TPC PID cuts with and without post calibration for (int icase = 0; icase < vecPIDcase.size(); icase++) { + if (!nameStr.compare(Form("electronPIDOnly%s", vecPIDcase.at(icase).Data()))) { + if (icase == 0) { + cut->AddCut(VarManager::kTPCnSigmaEl, -3.0, 3.0); + } else if (icase == 1 || icase == 2) { + cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3.0, 3.0); + } + return cut; + } + if (!nameStr.compare(Form("electronPID_TPCnsigma%s_loose", vecPIDcase.at(icase).Data()))) { if (icase == 0) { cut->AddCut(VarManager::kTPCnSigmaEl, -3., 2., false, VarManager::kPin, 0.0, 1e+10, false); @@ -2385,6 +2473,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaKa, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); + } else if (icase == 2) { + cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3., 2., false, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaKa_Corr, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); } return cut; } @@ -2400,6 +2493,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaKa, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + } else if (icase == 2) { + cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3., 2., false, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaKa_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); } return cut; } @@ -2415,6 +2513,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaKa, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + } else if (icase == 2) { + cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3., 2., false, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaKa_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); } return cut; } @@ -2430,6 +2533,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaKa, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + } else if (icase == 2) { + cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -2., 2., false, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaKa_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); } return cut; } @@ -2447,6 +2555,12 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaKa, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaMu, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + } else if (icase == 2) { + cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -2., 2., false, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaKa_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaMu, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); } return cut; } @@ -2462,6 +2576,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaKa, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + } else if (icase == 2) { + cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -2., 2., false, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaKa_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); } cut->AddCut(VarManager::kTOFbeta, 0.0, 0.9, true, VarManager::kPin, 0.0, 1e+10, false); return cut; @@ -2478,6 +2597,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -99., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaKa, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); + } else if (icase == 2) { + cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3., 3., false, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -99., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaKa_Corr, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); } return cut; } @@ -2495,6 +2619,12 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaKa, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaMu, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); + } else if (icase == 2) { + cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3., 3., false, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3.5, 3.5, true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaKa_Corr, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaMu, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -3., 3., true, VarManager::kPin, 0.0, 1e+10, false); } return cut; } @@ -2503,7 +2633,7 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) if (icase == 0) { cut->AddCut(VarManager::kTPCnSigmaEl, -4., 4., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi, -99., 2.5, true, VarManager::kPin, 0.0, 1e+10, false); - } else if (icase == 1) { + } else if (icase == 1 || icase == 2) { cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -4., 4., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -99., 2.5, true, VarManager::kPin, 0.0, 1e+10, false); } @@ -2521,6 +2651,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -99., 2.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaKa, -2., 2., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -2., 2., true, VarManager::kPin, 0.0, 1e+10, false); + } else if (icase == 2) { + cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -4., 4., false, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -99., 2.5, true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaKa_Corr, -2., 2., true, VarManager::kPin, 0.0, 1e+10, false); + cut->AddCut(VarManager::kTPCnSigmaPr_Corr, -2., 2., true, VarManager::kPin, 0.0, 1e+10, false); } return cut; } @@ -2596,16 +2731,6 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } - if (!nameStr.compare("electronPIDOnly")) { - cut->AddCut(VarManager::kTPCnSigmaEl, -3.0, 3.0); - return cut; - } - - if (!nameStr.compare("electronPIDOnly_Corr")) { - cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3.0, 3.0); - return cut; - } - if (!nameStr.compare("kaonPIDnsigma")) { cut->AddCut(VarManager::kTPCnSigmaKa, -3.0, 3.0); return cut; @@ -2714,7 +2839,7 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaEl, -3., 3., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -3., 3., false, VarManager::kPin, 0.3, 1e+10, false); - } else if (icase == 1) { + } else if (icase == 1 || icase == 2) { cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3., 3., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -3., 3., false, VarManager::kPin, 0.3, 1e+10, false); @@ -2727,7 +2852,7 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaEl, -3., 2., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -3., 3., false, VarManager::kPin, 0.3, 1e+10, false); - } else if (icase == 1) { + } else if (icase == 1 || icase == 2) { cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3., 2., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -3., 3., false, VarManager::kPin, 0.3, 1e+10, false); @@ -2740,7 +2865,7 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaEl, -3., 2., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -3., 3., false, VarManager::kPin, 0.3, 1e+10, false); - } else if (icase == 1) { + } else if (icase == 1 || icase == 2) { cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3., 2., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -3., 3., false, VarManager::kPin, 0.3, 1e+10, false); @@ -2753,7 +2878,7 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaEl, -2., 2., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -2., 2., false, VarManager::kPin, 0.3, 1e+10, false); - } else if (icase == 1) { + } else if (icase == 1 || icase == 2) { cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -2., 2., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -2., 2., false, VarManager::kPin, 0.3, 1e+10, false); @@ -2767,7 +2892,7 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaMu, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -2., 2., false, VarManager::kPin, 0.3, 1e+10, false); - } else if (icase == 1) { + } else if (icase == 1 || icase == 2) { cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -2., 2., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaMu, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); @@ -2782,7 +2907,7 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -2., 2., false, VarManager::kPin, 0.3, 1e+10, false); cut->AddCut(VarManager::kTOFbeta, 0.0, 0.9, true, VarManager::kPin, 0.0, 1e+10, false); - } else if (icase == 1) { + } else if (icase == 1 || icase == 2) { cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -2., 2., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 4., true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -2., 2., false, VarManager::kPin, 0.3, 1e+10, false); @@ -2796,7 +2921,7 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaEl, -3., 3., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi, -99., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -3., 3., false, VarManager::kPin, 0.3, 1e+10, false); - } else if (icase == 1) { + } else if (icase == 1 || icase == 2) { cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3., 3., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -99., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -3., 3., false, VarManager::kPin, 0.3, 1e+10, false); @@ -2810,7 +2935,7 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaMu, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -3., 3., false, VarManager::kPin, 0.3, 1e+10, false); - } else if (icase == 1) { + } else if (icase == 1 || icase == 2) { cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -3., 3., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaMu, -3., 3.5, true, VarManager::kPin, 0.0, 1e+10, false); @@ -2824,7 +2949,7 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaEl, -4., 4., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi, -99., 2.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -4., 4., false, VarManager::kPin, 0.3, 1e+10, false); - } else if (icase == 1) { + } else if (icase == 1 || icase == 2) { cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -4., 4., false, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -99., 2.5, true, VarManager::kPin, 0.0, 1e+10, false); cut->AddCut(VarManager::kTOFnSigmaEl, -4., 4., false, VarManager::kPin, 0.3, 1e+10, false); diff --git a/PWGDQ/TableProducer/tableMakerJpsiHf.cxx b/PWGDQ/TableProducer/tableMakerJpsiHf.cxx index 20ca817eaa5..b633ba80dcc 100644 --- a/PWGDQ/TableProducer/tableMakerJpsiHf.cxx +++ b/PWGDQ/TableProducer/tableMakerJpsiHf.cxx @@ -59,11 +59,6 @@ struct tableMakerJpsiHf { Produces redD0Masses; Produces redDileptons; - // TODO: For now this is only used to determine the position in the filter bit map for the hadron cut - Configurable fConfigTrackCuts{"cfgLeptonCuts", "jpsiO2MCdebugCuts2", "Comma separated list of barrel track cuts"}; - // comment: add list of subgroups (must define subgroups under ) - Configurable fConfigAddDileptonHadHistogram{"cfgAddDileptonHadHistogram", "", "Comma separated list of histograms"}; - // HF configurables // cuts on BDT output scores to be applied only for the histograms Configurable> bdtCutsForHistos{"bdtCutsForHistos", {cutsBdt[0], 1, 3, labelsEmpty, labelsBdt}, "Additional bdt cut values only for histograms"}; @@ -94,6 +89,8 @@ struct tableMakerJpsiHf { fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); fHistMan->SetUseDefaultVariableNames(true); fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); + fHistMan->AddHistClass("Dmeson"); + fHistMan->AddHistClass("JPsi"); fHistMan->AddHistClass("JPsiDmeson"); dqhistograms::DefineHistograms(fHistMan, "Dmeson", "dilepton-charmhadron", "dmeson"); dqhistograms::DefineHistograms(fHistMan, "JPsi", "dilepton-charmhadron", "jpsi"); diff --git a/PWGHF/ALICE3/TableProducer/candidateCreatorChic.cxx b/PWGHF/ALICE3/TableProducer/candidateCreatorChic.cxx index c710f8cead5..6fa35ef2e7d 100644 --- a/PWGHF/ALICE3/TableProducer/candidateCreatorChic.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateCreatorChic.cxx @@ -28,6 +28,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/ALICE3/TableProducer/candidateCreatorX.cxx b/PWGHF/ALICE3/TableProducer/candidateCreatorX.cxx index cd95885f448..db6bba712ee 100644 --- a/PWGHF/ALICE3/TableProducer/candidateCreatorX.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateCreatorX.cxx @@ -28,6 +28,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Barrel.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Barrel.cxx index 483bb814989..73a0904414f 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Barrel.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Barrel.cxx @@ -25,6 +25,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Forward.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Forward.cxx index ceff23578f4..782813029cf 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Forward.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Forward.cxx @@ -25,6 +25,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorD0ParametrizedPid.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorD0ParametrizedPid.cxx index 518df6b90b0..fe110affd66 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorD0ParametrizedPid.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorD0ParametrizedPid.cxx @@ -25,6 +25,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorJpsi.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorJpsi.cxx index 0446d03aeb9..d436ecd13e8 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorJpsi.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorJpsi.cxx @@ -27,6 +27,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; namespace o2::aod diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorLcAlice3.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorLcAlice3.cxx index 50bb79c9dfb..0121da597cc 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorLcAlice3.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorLcAlice3.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorLcParametrizedPid.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorLcParametrizedPid.cxx index 2a169b0f5cc..335008ef1e7 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorLcParametrizedPid.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorLcParametrizedPid.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/ALICE3/Tasks/taskJpsi.cxx b/PWGHF/ALICE3/Tasks/taskJpsi.cxx index 13c7f046a81..28d6e338766 100644 --- a/PWGHF/ALICE3/Tasks/taskJpsi.cxx +++ b/PWGHF/ALICE3/Tasks/taskJpsi.cxx @@ -24,6 +24,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/D2H/DataModel/ReducedDataModel.h b/PWGHF/D2H/DataModel/ReducedDataModel.h index e570b5cd9e0..7a0279e2417 100644 --- a/PWGHF/D2H/DataModel/ReducedDataModel.h +++ b/PWGHF/D2H/DataModel/ReducedDataModel.h @@ -30,10 +30,6 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - namespace o2 { namespace aod diff --git a/PWGHF/D2H/Macros/efficiency.py b/PWGHF/D2H/Macros/efficiency.py index b1910d57808..a4d7e811dd5 100644 --- a/PWGHF/D2H/Macros/efficiency.py +++ b/PWGHF/D2H/Macros/efficiency.py @@ -25,25 +25,33 @@ import numpy as np # pylint: disable=import-error import yaml # pylint: disable=import-error -#pylint: disable=import-error, no-name-in-module -from ROOT import (TH1, TH1F, TH2, TCanvas, TEfficiency, TFile, TLatex, TLegend, - kAzure, kBlack, kFullCircle, kFullSquare, kOpenSquare, kRed) + +# pylint: disable=import-error, no-name-in-module +from ROOT import ( + TH1, + TH1F, + TH2, + TCanvas, + TEfficiency, + TFile, + TLatex, + TLegend, + kAzure, + kBlack, + kFullCircle, + kFullSquare, + kOpenSquare, + kRed, +) from style_formatter import set_global_style, set_object_style # options for object style -COLOR = {'All': kBlack, - 'Prompt': kRed+1, - 'Nonprompt': kAzure+4} -MARKERSTYLE = {'All': kFullSquare, - 'Prompt': kFullCircle, - 'Nonprompt': kOpenSquare} -LINEWIDTH = {'All': 1, - 'Prompt': 1, - 'Nonprompt': 2} - -LINESTYLE = {'All': 1, - 'Prompt': 2, - 'Nonprompt': 7} +COLOR = {"All": kBlack, "Prompt": kRed + 1, "Nonprompt": kAzure + 4} +MARKERSTYLE = {"All": kFullSquare, "Prompt": kFullCircle, "Nonprompt": kOpenSquare} +LINEWIDTH = {"All": 1, "Prompt": 1, "Nonprompt": 2} + +LINESTYLE = {"All": 1, "Prompt": 2, "Nonprompt": 7} + def enforce_list(x: Union[str, List[str]]) -> List[str]: """ @@ -60,13 +68,14 @@ def enforce_list(x: Union[str, List[str]]) -> List[str]: if not isinstance(x, list): # handle possible whitespaces in config file entry - x_list = x.split(',') + x_list = x.split(",") for i, element in enumerate(x_list): - x_list[i] = element.strip() # remove possible whitespaces + x_list[i] = element.strip() # remove possible whitespaces return x_list return x + def enforce_trailing_slash(path: str) -> str: """ Helper method to enforce '/' at the and of directory name @@ -80,12 +89,13 @@ def enforce_trailing_slash(path: str) -> str: - path with a trailing slash at the end if it was not there yet """ - if path is not None and path[-1] != '/': - path += '/' + if path is not None and path[-1] != "/": + path += "/" return path -#pylint: disable=too-many-arguments + +# pylint: disable=too-many-arguments def configure_canvas( name_canvas: str, pt_min: Union[int, float], @@ -93,7 +103,8 @@ def configure_canvas( pt_max: Union[int, float], max_y_axis: Union[int, float], title: str, - log_y_axis: bool) -> TCanvas: + log_y_axis: bool, +) -> TCanvas: """ Helper method to configure canvas @@ -112,18 +123,15 @@ def configure_canvas( - c_eff: TCanvas instance """ - c_eff = TCanvas(name_canvas, '', 800, 800) + c_eff = TCanvas(name_canvas, "", 800, 800) c_eff.DrawFrame(pt_min, min_y_axis, pt_max, max_y_axis, title) if log_y_axis: c_eff.SetLogy() return c_eff -def save_canvas( - canvas: TCanvas, - out_dir: str, - name_file: str, - extension: List[str]) -> None: + +def save_canvas(canvas: TCanvas, out_dir: str, name_file: str, extension: List[str]) -> None: """ Save canvas in formats chosen by extension @@ -136,7 +144,8 @@ def save_canvas( """ for ext in extension: - canvas.SaveAs(out_dir + name_file + '.' + ext) + canvas.SaveAs(out_dir + name_file + "." + ext) + def __set_object_style(obj: Union[TEfficiency, TH1], key: str) -> None: """ @@ -149,18 +158,17 @@ def __set_object_style(obj: Union[TEfficiency, TH1], key: str) -> None: """ set_object_style( - obj, - color=COLOR[key], - markerstyle=MARKERSTYLE[key], - linewidth=LINEWIDTH[key], - linestyle=LINESTYLE[key]) + obj, color=COLOR[key], markerstyle=MARKERSTYLE[key], linewidth=LINEWIDTH[key], linestyle=LINESTYLE[key] + ) + def compute_efficiency( h_rec: Union[TH1, TH2], h_gen: Union[TH1, TH2], - axis_rapidity: str = 'Y', + axis_rapidity: str = "Y", rapidity_cut: Optional[float] = None, - pt_bins_limits: Optional[np.ndarray] = None) -> TEfficiency: + pt_bins_limits: Optional[np.ndarray] = None, +) -> TEfficiency: """ Helper method to compute the efficiency as function of the feature in axis. @@ -185,13 +193,13 @@ def compute_efficiency( is_gen_2d = True if is_reco_2d: - if axis_rapidity == 'Y': + if axis_rapidity == "Y": h_rec = h_rec.ProjectionX() else: h_rec = h_rec.ProjectionY() if is_gen_2d: - if axis_rapidity == 'Y': + if axis_rapidity == "Y": if rapidity_cut is not None: h_gen.GetYaxis().SetRangeUser(-1.0 * rapidity_cut + epsilon, rapidity_cut - epsilon) h_gen = h_gen.ProjectionX() @@ -203,16 +211,15 @@ def compute_efficiency( # rebin histograms, if enabled if pt_bins_limits is not None: n_bins = pt_bins_limits.shape[0] - 1 - h_rec = h_rec.Rebin(n_bins, 'hRec', pt_bins_limits) - h_gen = h_gen.Rebin(n_bins, 'hGen', pt_bins_limits) + h_rec = h_rec.Rebin(n_bins, "hRec", pt_bins_limits) + h_gen = h_gen.Rebin(n_bins, "hGen", pt_bins_limits) efficiency = TEfficiency(h_rec, h_gen) return efficiency -def get_th1_from_tefficiency( - teff: TEfficiency, - h_eff: TH1) -> TH1: + +def get_th1_from_tefficiency(teff: TEfficiency, h_eff: TH1) -> TH1: """ Helper method to convert TEfficiency object to TH1 @@ -227,12 +234,19 @@ def get_th1_from_tefficiency( """ n_bins = h_eff.GetXaxis().GetNbins() - for i_bin in range(1, n_bins+1): + for i_bin in range(1, n_bins + 1): h_eff.SetBinContent(i_bin, teff.GetEfficiency(i_bin)) - if abs(teff.GetEfficiencyErrorLow(i_bin) - teff.GetEfficiencyErrorUp(i_bin)) \ - / teff.GetEfficiencyErrorLow(i_bin) > 1e-02: - print((f'\033[93mWARNING: efficiency error is asymmetric in bin {i_bin},' \ - ' setting the maximum error in the histogram!\033[0m')) + if ( + abs(teff.GetEfficiencyErrorLow(i_bin) - teff.GetEfficiencyErrorUp(i_bin)) + / teff.GetEfficiencyErrorLow(i_bin) + > 1e-02 + ): + print( + ( + f"\033[93mWARNING: efficiency error is asymmetric in bin {i_bin}," + " setting the maximum error in the histogram!\033[0m" + ) + ) # TH1 can't handle asymmetric errors so we take the max err = max(teff.GetEfficiencyErrorLow(i_bin), teff.GetEfficiencyErrorUp(i_bin)) else: @@ -242,10 +256,9 @@ def get_th1_from_tefficiency( return h_eff -#pylint: disable=too-many-locals, too-many-branches, too-many-statements -def main( - cfg: Dict, - batch: bool) -> None: + +# pylint: disable=too-many-locals, too-many-branches, too-many-statements +def main(cfg: Dict, batch: bool) -> None: """ Main function @@ -258,20 +271,20 @@ def main( set_global_style(padleftmargin=0.14, padbottommargin=0.12, titlesize=0.045, labelsize=0.04) # input configuration - name_file = cfg['input']['filename'] - name_tree = cfg['input']['treename'] + name_file = cfg["input"]["filename"] + name_tree = cfg["input"]["treename"] file = TFile.Open(name_file) - name_tree = enforce_trailing_slash(name_tree) if name_tree is not None else '' + name_tree = enforce_trailing_slash(name_tree) if name_tree is not None else "" # fill dictionaries with histograms dic_rec: Dict[str, Optional[Union[TH1, TH2]]] = {} dic_gen: Dict[str, Optional[Union[TH1, TH2]]] = {} - for key, histoname in cfg['input']['histoname']['reconstructed'].items(): + for key, histoname in cfg["input"]["histoname"]["reconstructed"].items(): if histoname is None: dic_rec[key] = None else: dic_rec[key] = file.Get(name_tree + histoname) - for key, histoname in cfg['input']['histoname']['generated'].items(): + for key, histoname in cfg["input"]["histoname"]["generated"].items(): if histoname is None: dic_gen[key] = None else: @@ -279,10 +292,10 @@ def main( # configure pt binning pt_bins_limits: Optional[np.ndarray] = None - pt_min, pt_max = 0., 36. # default values + pt_min, pt_max = 0.0, 36.0 # default values is_retrieved_pt_interval = False - if cfg['pt_bins_limits'] is not None: - pt_bins_limits = np.array(enforce_list(cfg['pt_bins_limits']), 'd') + if cfg["pt_bins_limits"] is not None: + pt_bins_limits = np.array(enforce_list(cfg["pt_bins_limits"]), "d") if pt_bins_limits is not None: pt_min = pt_bins_limits[0] @@ -290,40 +303,41 @@ def main( is_retrieved_pt_interval = True # configure possible cut on rapidity - rapidity_cut = cfg['rapidity']['cut'] - axis_rapidity = cfg['rapidity']['axis'] + rapidity_cut = cfg["rapidity"]["cut"] + axis_rapidity = cfg["rapidity"]["axis"] # output configuration - out_dir = enforce_trailing_slash(cfg['output']['dir']) - out_label = cfg['output']['plots']['label'] - name_axis = cfg['output']['plots']['y_axis']['name'] - min_y_axis = cfg['output']['plots']['y_axis']['min'] - max_y_axis = cfg['output']['plots']['y_axis']['max'] - log_y_axis = cfg['output']['plots']['y_axis']['log_scale'] + out_dir = enforce_trailing_slash(cfg["output"]["dir"]) + out_label = cfg["output"]["plots"]["label"] + name_axis = cfg["output"]["plots"]["y_axis"]["name"] + min_y_axis = cfg["output"]["plots"]["y_axis"]["min"] + max_y_axis = cfg["output"]["plots"]["y_axis"]["max"] + log_y_axis = cfg["output"]["plots"]["y_axis"]["log_scale"] if name_axis is None: - name_axis = '#varepsilon' # default value - title = ';#it{p}_{T} (GeV/#it{c});' + name_axis + ';' + name_axis = "#varepsilon" # default value + title = ";#it{p}_{T} (GeV/#it{c});" + name_axis + ";" overlap: Union[str, List[str]] = str() - if cfg['output']['plots']['overlap'] is not None: - overlap = enforce_list(cfg['output']['plots']['overlap']) + if cfg["output"]["plots"]["overlap"] is not None: + overlap = enforce_list(cfg["output"]["plots"]["overlap"]) # output save options - save_tefficiency = cfg['output']['save']['TEfficiency'] - save_th1 = cfg['output']['save']['TH1'] - save_tcanvas_individual = cfg['output']['save']['TCanvas']['individual'] - save_tcanvas_overlap = cfg['output']['save']['TCanvas']['overlap'] - extension: List[str] = ['pdf'] # default value - if cfg['output']['save']['TCanvas']['extension'] is None: + save_tefficiency = cfg["output"]["save"]["TEfficiency"] + save_th1 = cfg["output"]["save"]["TH1"] + save_tcanvas_individual = cfg["output"]["save"]["TCanvas"]["individual"] + save_tcanvas_overlap = cfg["output"]["save"]["TCanvas"]["overlap"] + extension: List[str] = ["pdf"] # default value + if cfg["output"]["save"]["TCanvas"]["extension"] is None: if save_tcanvas_individual or save_tcanvas_overlap: - print('\033[93mWARNING: No extension provided for saving canvas in extra file,' \ - ' \'.pdf\' set as default.\033[0m') + print( + "\033[93mWARNING: No extension provided for saving canvas in extra file," + " '.pdf' set as default.\033[0m" + ) else: - extension = enforce_list(cfg['output']['save']['TCanvas']['extension']) + extension = enforce_list(cfg["output"]["save"]["TCanvas"]["extension"]) if os.path.isdir(out_dir): - print((f'\033[93mWARNING: Output directory \'{out_dir}\' already exists,' - ' overwrites possibly ongoing!\033[0m')) + print((f"\033[93mWARNING: Output directory '{out_dir}' already exists," " overwrites possibly ongoing!\033[0m")) else: os.makedirs(out_dir) @@ -333,20 +347,18 @@ def main( latex.SetTextSize(0.035) latex.SetTextAlign(13) # align at top latex.SetTextFont(42) - watermark = cfg['output']['plots']['watermark'] + watermark = cfg["output"]["plots"]["watermark"] # open output file - out_file = TFile(out_dir + out_label + '.root', 'recreate') + out_file = TFile(out_dir + out_label + ".root", "recreate") # compute efficiencies efficiencies = {} for (key, h_rec), (_, h_gen) in zip(dic_rec.items(), dic_gen.items()): if h_rec is not None and h_gen is not None: - # compute efficiency, store it in TEfficiency instance and configure it - efficiencies[key] = compute_efficiency( - h_rec, h_gen, axis_rapidity, rapidity_cut, pt_bins_limits) - efficiencies[key].SetName('TEfficiency_' + out_label + key) + efficiencies[key] = compute_efficiency(h_rec, h_gen, axis_rapidity, rapidity_cut, pt_bins_limits) + efficiencies[key].SetName("TEfficiency_" + out_label + key) efficiencies[key].SetTitle(title) __set_object_style(efficiencies[key], key) @@ -360,9 +372,8 @@ def main( is_retrieved_pt_interval = True # plot efficiency on canvas - c_eff = configure_canvas(f'c{out_label + key}', - pt_min, min_y_axis, pt_max, max_y_axis, title, log_y_axis) - efficiencies[key].Draw('same') # to draw TEfficiency in TCanvas + c_eff = configure_canvas(f"c{out_label + key}", pt_min, min_y_axis, pt_max, max_y_axis, title, log_y_axis) + efficiencies[key].Draw("same") # to draw TEfficiency in TCanvas latex.DrawLatex(0.18, 0.92, watermark) c_eff.Write() # save canvas in separate file, if enabled @@ -372,34 +383,29 @@ def main( # convert TEfficiency instance to TH1 histogram in output file, if save enabled if save_th1: if pt_bins_limits is not None: - h_eff = TH1F( - 'h' + out_label + key, title, len(pt_bins_limits)-1, pt_bins_limits) + h_eff = TH1F("h" + out_label + key, title, len(pt_bins_limits) - 1, pt_bins_limits) h_eff = get_th1_from_tefficiency(efficiencies[key], h_eff) else: - h_eff = get_th1_from_tefficiency( - efficiencies[key], h_rec.Clone('h' + out_label + key)) + h_eff = get_th1_from_tefficiency(efficiencies[key], h_rec.Clone("h" + out_label + key)) h_eff.SetTitle(title) __set_object_style(h_eff, key) h_eff.Write() - elif h_rec != h_gen: # one histogram name is None, the other is not - print(f'\033[91mERROR: efficiency for {key} could not be computed,' \ - ' one of the histogram names is None!\033[0m') + elif h_rec != h_gen: # one histogram name is None, the other is not + print( + f"\033[91mERROR: efficiency for {key} could not be computed," + " one of the histogram names is None!\033[0m" + ) sys.exit() - else: # both histogram names are None + else: # both histogram names are None efficiencies[key] = None - print(f'\033[94mEfficiency for {key} not computed.\033[0m') + print(f"\033[94mEfficiency for {key} not computed.\033[0m") # overlap plots, if enabled if overlap: c_overlap = configure_canvas( - f"cOverlap{''.join(overlap)}", - pt_min, - min_y_axis, - pt_max, - max_y_axis, - title, - log_y_axis) + f"cOverlap{''.join(overlap)}", pt_min, min_y_axis, pt_max, max_y_axis, title, log_y_axis + ) leg = TLegend(0.6, 0.2, 0.8, 0.4) leg.SetTextSize(0.045) @@ -408,36 +414,35 @@ def main( for key, teff in efficiencies.items(): if key in overlap: if teff is None: - print(f'\033[91mERROR: efficiency for {key} could not be computed,' \ - ' cannot overlap it!\033[0m') + print(f"\033[91mERROR: efficiency for {key} could not be computed," " cannot overlap it!\033[0m") sys.exit() - leg.AddEntry(teff, key, 'p') - teff.Draw('same') + leg.AddEntry(teff, key, "p") + teff.Draw("same") leg.Draw() latex.DrawLatex(0.18, 0.92, watermark) if save_tcanvas_overlap: - save_canvas(c_overlap, out_dir, out_label + 'Overlap', extension) + save_canvas(c_overlap, out_dir, out_label + "Overlap", extension) c_overlap.Write() # close output file out_file.Close() if not batch: - input('Press enter to exit') + input("Press enter to exit") + if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Arguments') - parser.add_argument('config', metavar='text', default='config.yml', - help='config file name for ml') - parser.add_argument('--batch', help='suppress video output', action='store_true') + parser = argparse.ArgumentParser(description="Arguments") + parser.add_argument("config", metavar="text", default="config.yml", help="config file name for ml") + parser.add_argument("--batch", help="suppress video output", action="store_true") args = parser.parse_args() - print('Loading analysis configuration: ...', end='\r') + print("Loading analysis configuration: ...", end="\r") with open(args.config, "r", encoding="utf-8") as yml_cfg: configuration = yaml.load(yml_cfg, yaml.FullLoader) - print('Loading analysis configuration: Done!') + print("Loading analysis configuration: Done!") main(configuration, args.batch) diff --git a/PWGHF/D2H/TableProducer/dataCreatorD0PiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorD0PiReduced.cxx index a34402fe88b..17b480699af 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorD0PiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorD0PiReduced.cxx @@ -33,6 +33,7 @@ #include "PWGHF/D2H/DataModel/ReducedDataModel.h" using namespace o2; +using namespace o2::analysis; using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/D2H/TableProducer/dataCreatorDplusPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorDplusPiReduced.cxx index c1a736744d6..359e9a8c86d 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorDplusPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorDplusPiReduced.cxx @@ -33,6 +33,7 @@ #include "PWGHF/D2H/DataModel/ReducedDataModel.h" using namespace o2; +using namespace o2::analysis; using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/D2H/Tasks/taskD0.cxx b/PWGHF/D2H/Tasks/taskD0.cxx index 56fc481dd51..35e8cc56beb 100644 --- a/PWGHF/D2H/Tasks/taskD0.cxx +++ b/PWGHF/D2H/Tasks/taskD0.cxx @@ -24,6 +24,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/D2H/Tasks/taskDplus.cxx b/PWGHF/D2H/Tasks/taskDplus.cxx index c6be66f771e..a72ee9070f2 100644 --- a/PWGHF/D2H/Tasks/taskDplus.cxx +++ b/PWGHF/D2H/Tasks/taskDplus.cxx @@ -25,6 +25,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/D2H/Tasks/taskDs.cxx b/PWGHF/D2H/Tasks/taskDs.cxx index b880640c2c9..25a865c1aa0 100644 --- a/PWGHF/D2H/Tasks/taskDs.cxx +++ b/PWGHF/D2H/Tasks/taskDs.cxx @@ -25,6 +25,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/D2H/Tasks/taskLc.cxx b/PWGHF/D2H/Tasks/taskLc.cxx index b36455ca391..3343ebf9663 100644 --- a/PWGHF/D2H/Tasks/taskLc.cxx +++ b/PWGHF/D2H/Tasks/taskLc.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/D2H/Tasks/taskLcToK0sP.cxx b/PWGHF/D2H/Tasks/taskLcToK0sP.cxx index 9ee68bcb32a..f1a305cf2ff 100644 --- a/PWGHF/D2H/Tasks/taskLcToK0sP.cxx +++ b/PWGHF/D2H/Tasks/taskLcToK0sP.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/D2H/Tasks/taskSigmac.cxx b/PWGHF/D2H/Tasks/taskSigmac.cxx index 7dabbedde5c..23c0a3ddde5 100644 --- a/PWGHF/D2H/Tasks/taskSigmac.cxx +++ b/PWGHF/D2H/Tasks/taskSigmac.cxx @@ -24,6 +24,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; struct HfTaskSigmac { diff --git a/PWGHF/D2H/Tasks/taskXic.cxx b/PWGHF/D2H/Tasks/taskXic.cxx index 586c7651c4c..b48c9a1436e 100644 --- a/PWGHF/D2H/Tasks/taskXic.cxx +++ b/PWGHF/D2H/Tasks/taskXic.cxx @@ -29,6 +29,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/D2H/Tasks/taskXicc.cxx b/PWGHF/D2H/Tasks/taskXicc.cxx index 023949f32a1..cbaeacbe541 100644 --- a/PWGHF/D2H/Tasks/taskXicc.cxx +++ b/PWGHF/D2H/Tasks/taskXicc.cxx @@ -24,6 +24,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 943af5f949f..3e0d41f52b1 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -33,8 +33,6 @@ #include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/Core/PDG.h" -using namespace o2::analysis; - namespace o2::aod { // Table aliases diff --git a/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx b/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx index 9be8e3edd6e..b36d3bdbf95 100644 --- a/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx +++ b/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx b/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx index 923b7199833..663992773e0 100644 --- a/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx +++ b/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx b/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx index 8e21d248eff..67475e82d20 100644 --- a/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx @@ -29,6 +29,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; @@ -199,7 +200,7 @@ struct HfCorrelatorD0Hadrons { (aod::track::dcaZ > static_cast(-dcaZTrackMax)) && (aod::track::dcaZ < static_cast(dcaZTrackMax)); Filter d0Filter = (aod::hf_sel_candidate_d0::isSelD0 >= 1) || (aod::hf_sel_candidate_d0::isSelD0bar >= 1); Filter collisionFilterGen = aod::hf_selection_dmeson_collision::dmesonSel == true; - Filter particlesFilter = nabs(aod::mcparticle::pdgCode) == pdg::Code::kD0 || ((aod::mcparticle::flags & (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary); + Filter particlesFilter = nabs(aod::mcparticle::pdgCode) == static_cast(pdg::Code::kD0) || ((aod::mcparticle::flags & (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary); HistogramRegistry registry{ "registry", diff --git a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx index d7946b9e0d1..16209d40c32 100644 --- a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx @@ -28,6 +28,7 @@ #include "PWGHF/HFC/DataModel/DMesonPairsTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx b/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx index b1e4bb94177..30166e4f0a3 100644 --- a/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx index 6489ecd0dd4..5c50b87993f 100644 --- a/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx @@ -27,6 +27,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; @@ -39,8 +40,7 @@ double getDeltaPhi(double phiD, double phiHadron) /// definition of variables for Dplus hadron pairs (in data-like, MC-reco and MC-kine tasks) const int npTBinsMassAndEfficiency = o2::analysis::hf_cuts_dplus_to_pi_k_pi::nBinsPt; -const double efficiencyDmesonDefault[npTBinsMassAndEfficiency] = {}; -auto efficiencyDmeson_v = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + npTBinsMassAndEfficiency}; +std::vector efficiencyDmeson(npTBinsMassAndEfficiency + 1); // histogram binning definition const int massAxisBins = 350; @@ -67,7 +67,7 @@ BinningType corrBinning{{zBins, multBins}, true}; struct HfDplusSelection { Produces dplusSel; - Configurable selectionFlagDplus{"selectionFlagDplus", 1, "Selection Flag for Dplus"}; + Configurable selectionFlagDplus{"selectionFlagDplus", 7, "Selection Flag for Dplus"}; // 7 corresponds to topo+PID cuts Configurable yCandMax{"yCandMax", 0.8, "max. cand. rapidity"}; Configurable ptCandMin{"ptCandMin", 1., "min. cand. pT"}; @@ -152,7 +152,7 @@ struct HfCorrelatorDplusHadrons { Produces entryDplusHadronPair; Produces entryDplusHadronRecoInfo; - Configurable selectionFlagDplus{"selectionFlagDplus", 1, "Selection Flag for Dplus"}; + Configurable selectionFlagDplus{"selectionFlagDplus", 7, "Selection Flag for Dplus"}; // 7 corresponds to topo+PID cuts Configurable applyEfficiency{"applyEfficiency", 1, "Flag for applying D-meson efficiency weights"}; Configurable yCandMax{"yCandMax", 0.8, "max. cand. rapidity"}; Configurable etaTrackMax{"etaTrackMax", 0.8, "max. eta of tracks"}; @@ -164,7 +164,7 @@ struct HfCorrelatorDplusHadrons { Configurable multMin{"multMin", 0., "minimum multiplicity accepted"}; Configurable multMax{"multMax", 10000., "maximum multiplicity accepted"}; Configurable> binsPt{"binsPt", std::vector{o2::analysis::hf_cuts_dplus_to_pi_k_pi::vecBinsPt}, "pT bin limits for candidate mass plots and efficiency"}; - Configurable> efficiencyD{"efficiencyD", std::vector{efficiencyDmeson_v}, "Efficiency values for Dplus meson"}; + Configurable> efficiencyD{"efficiencyD", std::vector{efficiencyDmeson}, "Efficiency values for Dplus meson"}; HfHelper hfHelper; SliceCache cache; diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx index 516337369a7..28e2bfee133 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx @@ -29,6 +29,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx index 48964863b1c..486ff886a1f 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx @@ -72,8 +72,7 @@ auto sidebandLeftOuter_v = std::vector{sidebandLeftOuterDefault, sideban auto sidebandRightInner_v = std::vector{sidebandRightInnerDefault, sidebandRightInnerDefault + npTBinsCorrelations}; auto sidebandRightOuter_v = std::vector{sidebandRightOuterDefault, sidebandRightOuterDefault + npTBinsCorrelations}; const int npTBinsEfficiency = o2::analysis::hf_cuts_dplus_to_pi_k_pi::nBinsPt; -const double efficiencyDmesonDefault[npTBinsEfficiency] = {}; -auto efficiencyDmeson_v = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + npTBinsEfficiency}; +std::vector efficiencyDmeson(npTBinsEfficiency + 1); /// Dplus-Hadron correlation pair filling task, from pair tables - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) struct HfTaskCorrelationDplusHadrons { @@ -88,7 +87,7 @@ struct HfTaskCorrelationDplusHadrons { Configurable> sidebandLeftOuter{"sidebandLeftOuter", std::vector{sidebandLeftOuter_v}, "Outer values of left sideband vs pT"}; Configurable> sidebandRightInner{"sidebandRightInner", std::vector{sidebandRightInner_v}, "Inner values of right sideband vs pT"}; Configurable> sidebandRightOuter{"sidebandRightOuter", std::vector{sidebandRightOuter_v}, "Outer values of right sideband vs pT"}; - Configurable> efficiencyD{"efficiencyD", std::vector{efficiencyDmeson_v}, "Efficiency values for D meson specie under study"}; + Configurable> efficiencyD{"efficiencyD", std::vector{efficiencyDmeson}, "Efficiency values for D meson specie under study"}; HistogramRegistry registry{ "registry", diff --git a/PWGHF/HFC/Tasks/taskFlow.cxx b/PWGHF/HFC/Tasks/taskFlow.cxx index 525359b8b36..6cb685f25ca 100644 --- a/PWGHF/HFC/Tasks/taskFlow.cxx +++ b/PWGHF/HFC/Tasks/taskFlow.cxx @@ -41,9 +41,10 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; +using namespace o2::constants::math; using namespace o2::framework; using namespace o2::framework::expressions; -using namespace o2::constants::math; struct HfTaskFlow { // configurables for processing options diff --git a/PWGHF/TableProducer/candidateCreator2Prong.cxx b/PWGHF/TableProducer/candidateCreator2Prong.cxx index eccf1b038ff..aa409749763 100644 --- a/PWGHF/TableProducer/candidateCreator2Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator2Prong.cxx @@ -38,8 +38,9 @@ #include "PWGHF/Utils/utilsBfieldCCDB.h" using namespace o2; -using namespace o2::framework; +using namespace o2::analysis; using namespace o2::aod::hf_cand_2prong; +using namespace o2::framework; /// Reconstruction of heavy-flavour 2-prong decay candidates struct HfCandidateCreator2Prong { diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index 13ee4a1094d..8b843ef67cd 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -26,8 +26,9 @@ #include "PWGHF/Utils/utilsBfieldCCDB.h" using namespace o2; -using namespace o2::framework; +using namespace o2::analysis; using namespace o2::aod::hf_cand_3prong; +using namespace o2::framework; /// Reconstruction of heavy-flavour 3-prong decay candidates struct HfCandidateCreator3Prong { diff --git a/PWGHF/TableProducer/candidateCreatorB0.cxx b/PWGHF/TableProducer/candidateCreatorB0.cxx index 1f9fecfc0a6..4177584d33d 100644 --- a/PWGHF/TableProducer/candidateCreatorB0.cxx +++ b/PWGHF/TableProducer/candidateCreatorB0.cxx @@ -30,6 +30,7 @@ #include "PWGHF/Utils/utilsBfieldCCDB.h" using namespace o2; +using namespace o2::analysis; using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/TableProducer/candidateCreatorBplus.cxx b/PWGHF/TableProducer/candidateCreatorBplus.cxx index 6afb33c4bc4..ced6eac6fcc 100644 --- a/PWGHF/TableProducer/candidateCreatorBplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorBplus.cxx @@ -33,9 +33,10 @@ #include "PWGHF/Utils/utilsBfieldCCDB.h" using namespace o2; +using namespace o2::analysis; +using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; -using namespace o2::aod; /// Reconstruction of B± → D0bar(D0) π± → (K± π∓) π± struct HfCandidateCreatorBplus { diff --git a/PWGHF/TableProducer/candidateCreatorBs.cxx b/PWGHF/TableProducer/candidateCreatorBs.cxx index b2e8b5912d3..6f7454d0ae0 100644 --- a/PWGHF/TableProducer/candidateCreatorBs.cxx +++ b/PWGHF/TableProducer/candidateCreatorBs.cxx @@ -30,6 +30,7 @@ #include "PWGHF/Utils/utilsBfieldCCDB.h" using namespace o2; +using namespace o2::analysis; using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/TableProducer/candidateCreatorCascade.cxx b/PWGHF/TableProducer/candidateCreatorCascade.cxx index 7e743a35de1..95a30d9344d 100644 --- a/PWGHF/TableProducer/candidateCreatorCascade.cxx +++ b/PWGHF/TableProducer/candidateCreatorCascade.cxx @@ -28,6 +28,7 @@ #include "PWGHF/Utils/utilsDebugLcToK0sP.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; // #define MY_DEBUG diff --git a/PWGHF/TableProducer/candidateCreatorLb.cxx b/PWGHF/TableProducer/candidateCreatorLb.cxx index 460f526a9d4..018608984ba 100644 --- a/PWGHF/TableProducer/candidateCreatorLb.cxx +++ b/PWGHF/TableProducer/candidateCreatorLb.cxx @@ -27,6 +27,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx index fe8c02e9cae..6537f76397d 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx @@ -34,6 +34,7 @@ #include "PWGHF/Utils/utilsBfieldCCDB.h" // for dca recalculation using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/TableProducer/candidateCreatorToXiPi.cxx b/PWGHF/TableProducer/candidateCreatorToXiPi.cxx index 00952a8783c..a100cb2c875 100644 --- a/PWGHF/TableProducer/candidateCreatorToXiPi.cxx +++ b/PWGHF/TableProducer/candidateCreatorToXiPi.cxx @@ -39,12 +39,13 @@ #include "PWGHF/Utils/utilsBfieldCCDB.h" using namespace o2; +using namespace o2::analysis; +// using namespace o2::analysis::pdg; using namespace o2::aod; +using namespace o2::aod::cascdata; +using namespace o2::aod::v0data; using namespace o2::framework; using namespace o2::framework::expressions; -using namespace o2::analysis::pdg; -using namespace o2::aod::v0data; -using namespace o2::aod::cascdata; // Reconstruction of omegac candidates struct HfCandidateCreatorToXiPi { diff --git a/PWGHF/TableProducer/candidateCreatorXicc.cxx b/PWGHF/TableProducer/candidateCreatorXicc.cxx index 31f89aba43b..a6a2c2305c0 100644 --- a/PWGHF/TableProducer/candidateCreatorXicc.cxx +++ b/PWGHF/TableProducer/candidateCreatorXicc.cxx @@ -29,8 +29,9 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; -using namespace o2::framework::expressions; // FIXME not sure if this is needed +using namespace o2::framework::expressions; void customize(std::vector& workflowOptions) { diff --git a/PWGHF/TableProducer/candidateSelectorD0.cxx b/PWGHF/TableProducer/candidateSelectorD0.cxx index 19cd5947294..c2906f6f2ce 100644 --- a/PWGHF/TableProducer/candidateSelectorD0.cxx +++ b/PWGHF/TableProducer/candidateSelectorD0.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; /// Struct for applying D0 selection cuts diff --git a/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx b/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx index da49580d738..4e278fdc355 100644 --- a/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; /// Struct to extend TracksPid tables diff --git a/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx b/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx index e34563e40bd..7cb9e5356a9 100644 --- a/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; /// Struct for applying Ds to KKpi selection cuts diff --git a/PWGHF/TableProducer/candidateSelectorLc.cxx b/PWGHF/TableProducer/candidateSelectorLc.cxx index f1ecf2ac6d8..7dc2f99f979 100644 --- a/PWGHF/TableProducer/candidateSelectorLc.cxx +++ b/PWGHF/TableProducer/candidateSelectorLc.cxx @@ -27,6 +27,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; /// Struct for applying Lc selection cuts diff --git a/PWGHF/TableProducer/candidateSelectorLcMl.cxx b/PWGHF/TableProducer/candidateSelectorLcMl.cxx index 11f535458c3..4cdd47caaab 100644 --- a/PWGHF/TableProducer/candidateSelectorLcMl.cxx +++ b/PWGHF/TableProducer/candidateSelectorLcMl.cxx @@ -30,6 +30,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::ml; diff --git a/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx b/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx index 4121a72793e..a387faaf05e 100644 --- a/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx +++ b/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx @@ -28,6 +28,7 @@ #include "PWGHF/Utils/utilsDebugLcToK0sP.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; // possible input features for ML diff --git a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx index 83d25b65f81..0b66480b35b 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; /// Struct for applying Xic selection cuts diff --git a/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx b/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx index 563d104bccd..f2d12003403 100644 --- a/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx @@ -24,6 +24,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; /// Struct for applying Xicc selection cuts diff --git a/PWGHF/TableProducer/trackIndexSkimCreator.cxx b/PWGHF/TableProducer/trackIndexSkimCreator.cxx index 5e8fffdf655..6380be9b194 100644 --- a/PWGHF/TableProducer/trackIndexSkimCreator.cxx +++ b/PWGHF/TableProducer/trackIndexSkimCreator.cxx @@ -49,9 +49,10 @@ #include "PWGHF/Utils/utilsDebugLcToK0sP.h" using namespace o2; +using namespace o2::analysis; +using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; -using namespace o2::aod; // enum for candidate type enum CandidateType { diff --git a/PWGHF/TableProducer/treeCreatorLcToK0sP.cxx b/PWGHF/TableProducer/treeCreatorLcToK0sP.cxx index 3d571ba6059..80f91610d86 100644 --- a/PWGHF/TableProducer/treeCreatorLcToK0sP.cxx +++ b/PWGHF/TableProducer/treeCreatorLcToK0sP.cxx @@ -75,6 +75,45 @@ DECLARE_SOA_COLUMN(IsEventReject, isEventReject, int); DECLARE_SOA_COLUMN(RunNumber, runNumber, int); } // namespace full +DECLARE_SOA_TABLE(HfCandCascLites, "AOD", "HFCANDCASCLITE", + hf_cand::Chi2PCA, + full::DecayLength, + full::DecayLengthXY, + full::DecayLengthNormalised, + full::DecayLengthXYNormalised, + full::PtProng0, + full::PtProng1, + hf_cand::ImpactParameter0, + hf_cand::ImpactParameter1, + full::ImpactParameterNormalised0, + full::ImpactParameterNormalised1, + full::V0Radius, + full::V0CosPA, + full::V0MLambda, + full::V0MAntiLambda, + full::V0MK0Short, + full::V0MGamma, + full::V0CtK0Short, + full::V0CtLambda, + v0data::DCAV0Daughters, + full::PtV0Pos, + full::PtV0Neg, + v0data::DCANegToPV, + v0data::DCAPosToPV, + full::NSigmaTPCPr0, + full::NSigmaTOFPr0, + full::M, + full::Pt, + full::CPA, + full::CPAXY, + full::Ct, + full::Eta, + full::Phi, + full::Y, + full::E, + full::FlagMc, + full::OriginMcRec); + DECLARE_SOA_TABLE(HfCandCascFulls, "AOD", "HFCANDCASCFULL", collision::BCId, collision::NumContrib, @@ -165,13 +204,16 @@ DECLARE_SOA_TABLE(HfCandCascFullPs, "AOD", "HFCANDCASCFULLP", /// Writes the full information in an output TTree struct HfTreeCreatorLcToK0sP { + Produces rowCandidateLite; Produces rowCandidateFull; Produces rowCandidateFullEvents; Produces rowCandidateFullParticles; - HfHelper hfHelper; - + Configurable fillCandidateLiteTable{"fillCandidateLiteTable", false, "Switch to fill lite table with candidate properties"}; Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of candidates to store in the tree"}; + Configurable ptMaxForDownSample{"ptMaxForDownSample", 24., "Maximum pt for the application of the downsampling factor"}; + + HfHelper hfHelper; using TracksWPid = soa::Join; @@ -182,77 +224,117 @@ struct HfTreeCreatorLcToK0sP { template void fillCandidate(const T& candidate, const U& bach, int8_t flagMc, int8_t originMcRec) { - rowCandidateFull( - bach.collision().bcId(), - bach.collision().numContrib(), - candidate.posX(), - candidate.posY(), - candidate.posZ(), - candidate.xSecondaryVertex(), - candidate.ySecondaryVertex(), - candidate.zSecondaryVertex(), - candidate.errorDecayLength(), - candidate.errorDecayLengthXY(), - candidate.chi2PCA(), - candidate.rSecondaryVertex(), - candidate.decayLength(), - candidate.decayLengthXY(), - candidate.decayLengthNormalised(), - candidate.decayLengthXYNormalised(), - candidate.impactParameterNormalised0(), - candidate.ptProng0(), - RecoDecay::p(candidate.pxProng0(), candidate.pyProng0(), candidate.pzProng0()), - candidate.impactParameterNormalised1(), - candidate.ptProng1(), - RecoDecay::p(candidate.pxProng1(), candidate.pyProng1(), candidate.pzProng1()), - candidate.pxProng0(), - candidate.pyProng0(), - candidate.pzProng0(), - candidate.pxProng1(), - candidate.pyProng1(), - candidate.pzProng1(), - candidate.impactParameter0(), - candidate.impactParameter1(), - candidate.errorImpactParameter0(), - candidate.errorImpactParameter1(), - candidate.v0x(), - candidate.v0y(), - candidate.v0z(), - candidate.v0radius(), - candidate.v0cosPA(), - candidate.mLambda(), - candidate.mAntiLambda(), - candidate.mK0Short(), - candidate.mGamma(), - hfHelper.ctV0K0s(candidate), - hfHelper.ctV0Lambda(candidate), - candidate.dcaV0daughters(), - candidate.pxpos(), - candidate.pypos(), - candidate.pzpos(), - candidate.ptV0Pos(), - candidate.dcapostopv(), - candidate.pxneg(), - candidate.pyneg(), - candidate.pzneg(), - candidate.ptV0Neg(), - candidate.dcanegtopv(), - bach.tpcNSigmaPr(), - bach.tofNSigmaPr(), - hfHelper.invMassLcToK0sP(candidate), - candidate.pt(), - candidate.p(), - candidate.cpa(), - candidate.cpaXY(), - hfHelper.ctLc(candidate), - candidate.eta(), - candidate.phi(), - hfHelper.yLc(candidate), - hfHelper.eLc(candidate), - flagMc, - originMcRec); + if (fillCandidateLiteTable) { + rowCandidateLite( + candidate.chi2PCA(), + candidate.decayLength(), + candidate.decayLengthXY(), + candidate.decayLengthNormalised(), + candidate.decayLengthXYNormalised(), + candidate.ptProng0(), + candidate.ptProng1(), + candidate.impactParameter0(), + candidate.impactParameter1(), + candidate.impactParameterNormalised0(), + candidate.impactParameterNormalised1(), + candidate.v0radius(), + candidate.v0cosPA(), + candidate.mLambda(), + candidate.mAntiLambda(), + candidate.mK0Short(), + candidate.mGamma(), + hfHelper.ctV0K0s(candidate), + hfHelper.ctV0Lambda(candidate), + candidate.dcaV0daughters(), + candidate.ptV0Pos(), + candidate.ptV0Neg(), + candidate.dcanegtopv(), + candidate.dcapostopv(), + bach.tpcNSigmaPr(), + bach.tofNSigmaPr(), + hfHelper.invMassLcToK0sP(candidate), + candidate.pt(), + candidate.cpa(), + candidate.cpaXY(), + hfHelper.ctLc(candidate), + candidate.eta(), + candidate.phi(), + hfHelper.yLc(candidate), + hfHelper.eLc(candidate), + flagMc, + originMcRec); + } else { + rowCandidateFull( + bach.collision().bcId(), + bach.collision().numContrib(), + candidate.posX(), + candidate.posY(), + candidate.posZ(), + candidate.xSecondaryVertex(), + candidate.ySecondaryVertex(), + candidate.zSecondaryVertex(), + candidate.errorDecayLength(), + candidate.errorDecayLengthXY(), + candidate.chi2PCA(), + candidate.rSecondaryVertex(), + candidate.decayLength(), + candidate.decayLengthXY(), + candidate.decayLengthNormalised(), + candidate.decayLengthXYNormalised(), + candidate.impactParameterNormalised0(), + candidate.ptProng0(), + RecoDecay::p(candidate.pxProng0(), candidate.pyProng0(), candidate.pzProng0()), + candidate.impactParameterNormalised1(), + candidate.ptProng1(), + RecoDecay::p(candidate.pxProng1(), candidate.pyProng1(), candidate.pzProng1()), + candidate.pxProng0(), + candidate.pyProng0(), + candidate.pzProng0(), + candidate.pxProng1(), + candidate.pyProng1(), + candidate.pzProng1(), + candidate.impactParameter0(), + candidate.impactParameter1(), + candidate.errorImpactParameter0(), + candidate.errorImpactParameter1(), + candidate.v0x(), + candidate.v0y(), + candidate.v0z(), + candidate.v0radius(), + candidate.v0cosPA(), + candidate.mLambda(), + candidate.mAntiLambda(), + candidate.mK0Short(), + candidate.mGamma(), + hfHelper.ctV0K0s(candidate), + hfHelper.ctV0Lambda(candidate), + candidate.dcaV0daughters(), + candidate.pxpos(), + candidate.pypos(), + candidate.pzpos(), + candidate.ptV0Pos(), + candidate.dcapostopv(), + candidate.pxneg(), + candidate.pyneg(), + candidate.pzneg(), + candidate.ptV0Neg(), + candidate.dcanegtopv(), + bach.tpcNSigmaPr(), + bach.tofNSigmaPr(), + hfHelper.invMassLcToK0sP(candidate), + candidate.pt(), + candidate.p(), + candidate.cpa(), + candidate.cpaXY(), + hfHelper.ctLc(candidate), + candidate.eta(), + candidate.phi(), + hfHelper.yLc(candidate), + hfHelper.eLc(candidate), + flagMc, + originMcRec); + } } - template void fillEvent(const T& collision) { @@ -278,11 +360,20 @@ struct HfTreeCreatorLcToK0sP { } // Filling candidate properties - rowCandidateFull.reserve(candidates.size()); + if (fillCandidateLiteTable) { + rowCandidateLite.reserve(candidates.size()); + } else { + rowCandidateFull.reserve(candidates.size()); + } for (const auto& candidate : candidates) { auto bach = candidate.prong0_as(); // bachelor - double pseudoRndm = bach.pt() * 1000. - (int16_t)(bach.pt() * 1000); - if (candidate.isSelLcToK0sP() >= 1 && pseudoRndm < downSampleBkgFactor) { + if (downSampleBkgFactor < 1.) { + double pseudoRndm = bach.pt() * 1000. - (int16_t)(bach.pt() * 1000); + if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { + continue; + } + } + if (candidate.isSelLcToK0sP() >= 1) { fillCandidate(candidate, bach, candidate.flagMcMatchRec(), candidate.originMcRec()); } } @@ -317,7 +408,11 @@ struct HfTreeCreatorLcToK0sP { } // Filling candidate properties - rowCandidateFull.reserve(candidates.size()); + if (fillCandidateLiteTable) { + rowCandidateLite.reserve(candidates.size()); + } else { + rowCandidateFull.reserve(candidates.size()); + } for (const auto& candidate : candidates) { auto bach = candidate.prong0_as(); // bachelor double pseudoRndm = bach.pt() * 1000. - (int16_t)(bach.pt() * 1000); diff --git a/PWGHF/Tasks/taskLcCentrality.cxx b/PWGHF/Tasks/taskLcCentrality.cxx index 2d2c4903fe9..149d33e738b 100644 --- a/PWGHF/Tasks/taskLcCentrality.cxx +++ b/PWGHF/Tasks/taskLcCentrality.cxx @@ -26,6 +26,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/Tasks/taskMcEfficiency.cxx b/PWGHF/Tasks/taskMcEfficiency.cxx index b92c20dc765..f6b67fb0ad1 100644 --- a/PWGHF/Tasks/taskMcEfficiency.cxx +++ b/PWGHF/Tasks/taskMcEfficiency.cxx @@ -27,6 +27,7 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGHF/Tasks/taskMcValidation.cxx b/PWGHF/Tasks/taskMcValidation.cxx index f8c463f7288..530d0c11108 100644 --- a/PWGHF/Tasks/taskMcValidation.cxx +++ b/PWGHF/Tasks/taskMcValidation.cxx @@ -27,9 +27,10 @@ #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; +using namespace o2::analysis; +using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; -using namespace o2::aod; namespace { diff --git a/PWGJE/TableProducer/jetfinderhf.cxx b/PWGJE/TableProducer/jetfinderhf.cxx index 1c5dc91f003..bbc7b2fc841 100644 --- a/PWGJE/TableProducer/jetfinderhf.cxx +++ b/PWGJE/TableProducer/jetfinderhf.cxx @@ -16,6 +16,7 @@ #include "PWGJE/TableProducer/jetfinder.h" using namespace o2; +using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGJE/Tasks/emctmmonitor.cxx b/PWGJE/Tasks/emctmmonitor.cxx index 615e47d65c7..138e15c6905 100644 --- a/PWGJE/Tasks/emctmmonitor.cxx +++ b/PWGJE/Tasks/emctmmonitor.cxx @@ -102,6 +102,7 @@ struct TrackMatchingMonitor { const o2Axis dPhiAxis{100, -0.4, 0.4, "d#it{#varphi} (rad)"}; const o2Axis dRAxis{100, 0.0, 0.4, "d#it{R}"}; const o2Axis eoverpAxis{500, 0, 10, "#it{E}_{cluster}/#it{p}_{track}"}; + const o2Axis nSigmaAxis{100, -5., 5., "N#sigma"}; const o2Axis trackptAxis{200, 0, 100, "#it{p}_{T,track}"}; const o2Axis trackpAxis{200, 0, 100, "#it{p}_{track}"}; const o2Axis clusterptAxis{200, 0, 100, "#it{p}_{T}"}; @@ -144,11 +145,15 @@ struct TrackMatchingMonitor { mHistManager.add("clusterTM_EoverP_E", "E/p ", o2HistType::kTH3F, {eoverpAxis, energyAxis, nmatchedtrack}); // E/p vs p for the Nth closest track mHistManager.add("clusterTM_EoverP_Pt", "E/p vs track pT", o2HistType::kTH3F, {eoverpAxis, trackptAxis, nmatchedtrack}); // E/p vs track pT for the Nth closest track mHistManager.add("clusterTM_EvsP", "cluster E/track p", o2HistType::kTH3F, {energyAxis, trackpAxis, nmatchedtrack}); // E vs p for the Nth closest track - mHistManager.add("clusterTM_EoverP_ep", "cluster E/electron p", o2HistType::kTH3F, {eoverpAxis, trackpAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest electron/positron track - mHistManager.add("clusterTM_EoverP_e", "cluster E/electron p", o2HistType::kTH3F, {eoverpAxis, trackpAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest electron track - mHistManager.add("clusterTM_EoverP_p", "cluster E/electron p", o2HistType::kTH3F, {eoverpAxis, trackpAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest positron track - mHistManager.add("clusterTM_EoverP_electron_ASide", "cluster E/electron p in A-Side", o2HistType::kTH3F, {eoverpAxis, trackpAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest electron/positron track in A-Side - mHistManager.add("clusterTM_EoverP_electron_CSide", "cluster E/electron p in C-Side", o2HistType::kTH3F, {eoverpAxis, trackpAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest electron/positron track in C-Side + mHistManager.add("clusterTM_EoverP_ep", "cluster E/electron p", o2HistType::kTH3F, {eoverpAxis, trackptAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest electron/positron track + mHistManager.add("clusterTM_EoverP_e", "cluster E/electron p", o2HistType::kTH3F, {eoverpAxis, trackptAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest electron track + mHistManager.add("clusterTM_EoverP_p", "cluster E/electron p", o2HistType::kTH3F, {eoverpAxis, trackptAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest positron track + mHistManager.add("clusterTM_EoverP_electron_ASide", "cluster E/electron p in A-Side", o2HistType::kTH3F, {eoverpAxis, trackptAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest electron/positron track in A-Side + mHistManager.add("clusterTM_EoverP_electron_CSide", "cluster E/electron p in C-Side", o2HistType::kTH3F, {eoverpAxis, trackptAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest electron/positron track in C-Side + mHistManager.add("clusterTM_NSigma_e", "NSigma electron", o2HistType::kTH3F, {nSigmaAxis, trackptAxis, nmatchedtrack}); // NSigma track pT for the Nth closest electron track + mHistManager.add("clusterTM_NSigma_p", "NSigma positron", o2HistType::kTH3F, {nSigmaAxis, trackptAxis, nmatchedtrack}); // NSigma vs track pT for the Nth closest positron track + mHistManager.add("clusterTM_NSigma_electron_ASide", "NSigma electron in A-Side", o2HistType::kTH3F, {nSigmaAxis, trackptAxis, nmatchedtrack}); // NSigma vs track pT for the Nth closest electron/positron track in A-Side + mHistManager.add("clusterTM_NSigma_electron_CSide", "NSigma positron in C-Side", o2HistType::kTH3F, {nSigmaAxis, trackptAxis, nmatchedtrack}); // NSigma vs track pT for the Nth closest electron/positron track in C-Side mHistManager.add("clusterTM_EoverP_hadron", "cluster E/hadron p", o2HistType::kTH3F, {eoverpAxis, trackpAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest hadron track mHistManager.add("clusterTM_EoverP_hn", "cluster E/hadron p", o2HistType::kTH3F, {eoverpAxis, trackpAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest negative hadron track mHistManager.add("clusterTM_EoverP_hp", "cluster E/hadron p", o2HistType::kTH3F, {eoverpAxis, trackpAxis, nmatchedtrack}); // E over p vs track pT for the Nth closest positive hadron track @@ -315,25 +320,33 @@ struct TrackMatchingMonitor { mHistManager.fill(HIST("clusterTM_EoverP_ep"), cluster.energy() / abs_p, match.track_as().pt(), t); if (match.track_as().eta() >= 0.) { mHistManager.fill(HIST("clusterTM_EoverP_electron_ASide"), cluster.energy() / abs_p, match.track_as().pt(), t); + mHistManager.fill(HIST("clusterTM_NSigma_electron_ASide"), match.track_as().tpcNSigmaEl(), match.track_as().pt(), t); } else { mHistManager.fill(HIST("clusterTM_EoverP_electron_CSide"), cluster.energy() / abs_p, match.track_as().pt(), t); + mHistManager.fill(HIST("clusterTM_NSigma_electron_CSide"), match.track_as().tpcNSigmaEl(), match.track_as().pt(), t); } if (match.track_as().sign() == -1) { mHistManager.fill(HIST("clusterTM_EoverP_e"), cluster.energy() / abs_p, match.track_as().pt(), t); + mHistManager.fill(HIST("clusterTM_NSigma_e"), match.track_as().tpcNSigmaEl(), match.track_as().pt(), t); } else if (match.track_as().sign() == +1) { mHistManager.fill(HIST("clusterTM_EoverP_p"), cluster.energy() / abs_p, match.track_as().pt(), t); + mHistManager.fill(HIST("clusterTM_NSigma_p"), match.track_as().tpcNSigmaEl(), match.track_as().pt(), t); } } else { // without pion rejection mHistManager.fill(HIST("clusterTM_EoverP_ep"), cluster.energy() / abs_p, match.track_as().pt(), t); if (match.track_as().eta() >= 0.) { mHistManager.fill(HIST("clusterTM_EoverP_electron_ASide"), cluster.energy() / abs_p, match.track_as().pt(), t); + mHistManager.fill(HIST("clusterTM_NSigma_electron_ASide"), match.track_as().tpcNSigmaEl(), match.track_as().pt(), t); } else { mHistManager.fill(HIST("clusterTM_EoverP_electron_CSide"), cluster.energy() / abs_p, match.track_as().pt(), t); + mHistManager.fill(HIST("clusterTM_NSigma_electron_CSide"), match.track_as().tpcNSigmaEl(), match.track_as().pt(), t); } if (match.track_as().sign() == -1) { mHistManager.fill(HIST("clusterTM_EoverP_e"), cluster.energy() / abs_p, match.track_as().pt(), t); + mHistManager.fill(HIST("clusterTM_NSigma_e"), match.track_as().tpcNSigmaEl(), match.track_as().pt(), t); } else if (match.track_as().sign() == +1) { mHistManager.fill(HIST("clusterTM_EoverP_p"), cluster.energy() / abs_p, match.track_as().pt(), t); + mHistManager.fill(HIST("clusterTM_NSigma_p"), match.track_as().tpcNSigmaEl(), match.track_as().pt(), t); } } } else if (tpcNsigmaBack->at(0) <= match.track_as().tpcNSigmaEl() && match.track_as().tpcNSigmaEl() <= tpcNsigmaBack->at(1)) { // E/p for hadrons / background diff --git a/PWGLF/Tasks/CMakeLists.txt b/PWGLF/Tasks/CMakeLists.txt index 6f20e98320a..fbb205c3889 100644 --- a/PWGLF/Tasks/CMakeLists.txt +++ b/PWGLF/Tasks/CMakeLists.txt @@ -182,7 +182,7 @@ o2physics_add_dpl_workflow(kinkanalysis COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(lambda1520spherocityanalysis - SOURCES lambda1520_spherocity_analysis.cxx + SOURCES lambda1520SpherocityAnalysis.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) @@ -210,3 +210,8 @@ o2physics_add_dpl_workflow(delta-analysis SOURCES rhoanalysis.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(rsn-analysis-thnsparse + SOURCES rsnanalysisTHnSparse.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/f0980analysis.cxx b/PWGLF/Tasks/f0980analysis.cxx index 4525820bad2..ce9ab58c621 100644 --- a/PWGLF/Tasks/f0980analysis.cxx +++ b/PWGLF/Tasks/f0980analysis.cxx @@ -92,7 +92,7 @@ struct f0980analysis { AxisSpec PIDqaAxis = {120, -6, 6}; AxisSpec pTqaAxis = {200, 0, 20}; - AxisSpec phiqaAxis = {72, -constants::math::PI, constants::math::PI}; + AxisSpec phiqaAxis = {72, 0., 2.0 * constants::math::PI}; histos.add("hInvMass_f0980_US", "unlike invariant mass", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, RTAxis, LptAxis}}); diff --git a/PWGLF/Tasks/lambda1520_spherocity_analysis.cxx b/PWGLF/Tasks/lambda1520SpherocityAnalysis.cxx similarity index 98% rename from PWGLF/Tasks/lambda1520_spherocity_analysis.cxx rename to PWGLF/Tasks/lambda1520SpherocityAnalysis.cxx index 9460ab6adac..ac105715d92 100644 --- a/PWGLF/Tasks/lambda1520_spherocity_analysis.cxx +++ b/PWGLF/Tasks/lambda1520SpherocityAnalysis.cxx @@ -359,10 +359,10 @@ struct lambdaAnalysis { continue; // Track selection check. - histos.fill(HIST("QAMCTrue/DcaXY_pr"), trkPr.dcaXY()); - histos.fill(HIST("QAMCTrue/DcaXY_ka"), trkKa.dcaXY()); - histos.fill(HIST("QAMCTrue/DcaZ_pr"), trkPr.dcaZ()); - histos.fill(HIST("QAMCTrue/DcaZ_ka"), trkKa.dcaZ()); + histos.fill(HIST("QAMCTrue/DcaXY_pr"), trkPr.pt(), trkPr.dcaXY()); + histos.fill(HIST("QAMCTrue/DcaXY_ka"), trkKa.pt(), trkKa.dcaXY()); + histos.fill(HIST("QAMCTrue/DcaZ_pr"), trkPr.pt(), trkPr.dcaZ()); + histos.fill(HIST("QAMCTrue/DcaZ_ka"), trkKa.pt(), trkKa.dcaZ()); // MC histograms if (trkPr.motherPDG() > 0) { diff --git a/PWGLF/Tasks/rsnanalysisTHnSparse.cxx b/PWGLF/Tasks/rsnanalysisTHnSparse.cxx new file mode 100644 index 00000000000..327772f0f42 --- /dev/null +++ b/PWGLF/Tasks/rsnanalysisTHnSparse.cxx @@ -0,0 +1,175 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \author Veronika Barbasova (veronika.barbasova@cern.ch) +/// \since October 12, 2023 + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" + +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" + +#include +#include "ReconstructionDataFormats/PID.h" +#include "Framework/ASoAHelpers.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct rsnanalysisTHnSparse { + + SliceCache cache; + + Configurable test{"test", false, "Running in test mode."}; + Configurable refresh{"print-refresh", 0, "Freqency of print event information."}; + Configurable refresh_index{"print-refresh-index", 1, "Freqency of print event information index."}; + Configurable tpcnSigma1{"tpcnSigma1", 3.0f, "TPC NSigma cut of the first particle."}; + Configurable tpcnSigma2{"tpcnSigma2", 3.0f, "TPC NSigma cut of the second particle."}; + Configurable dauther1{"dauther1", 3, "Particle type of the first dauther according to ReconstructionDataFormats/PID.h (Default = Kaon)"}; + Configurable dauther2{"dauther", 3, "Particle type of the second dauther according to ReconstructionDataFormats/PID.h (Default = Kaon)"}; + Configurable vertexfilter{"vertex-filter", 10.0f, "Z vertex range."}; + + ConfigurableAxis invaxis{"invAxis", {200, 0.97, 1.1}, "Invariant mass axis binning."}; + ConfigurableAxis ptaxis{"ptAxis", {20, 0., 20.}, "Pt axis binning."}; + ConfigurableAxis maxis{"mAxis", {200, 0., 2000.}, "Multiplicity axis binning."}; + ConfigurableAxis nsigmaaxis{"nsigma-axis", {300, -15., 15.}, "NSigma axis binning."}; + + HistogramRegistry registry{"registry", + {{"hNsigmaPos", "hNsigmaPos", {HistType::kTH1F, {nsigmaaxis}}}, + {"hNsigmaNeg", "hNsigmaNeg", {HistType::kTH1F, {nsigmaaxis}}}}}; + + // defined in DataFormats/Reconstruction/include/ReconstructionDataFormats/PID.h + float mass1 = o2::track::PID::getMass(dauther1); + float mass2 = o2::track::PID::getMass(dauther2); + + float multiplicity; + + Filter eventFilter = (o2::aod::evsel::sel8 == true); + Filter vtxFilter = (nabs(o2::aod::collision::posZ) < vertexfilter); + + using EventCandidates = soa::Filtered>; + using EventCandidate = EventCandidates::iterator; + using TrackCandidates = soa::Join; + + Partition positive = (aod::track::signed1Pt > 0.0f) && (nabs(o2::aod::pidtpc::tpcNSigmaKa) < tpcnSigma1); + Partition negative = (aod::track::signed1Pt < 0.0f) && (nabs(o2::aod::pidtpc::tpcNSigmaKa) < tpcnSigma2); + + TLorentzVector d1, d2, mother; + + void init(o2::framework::InitContext&) + { + if (test) + LOGF(info, "Running test"); + + AxisSpec invAxis = {invaxis, "Inv. mass (GeV/c^{2})", "im"}; + AxisSpec ptAxis = {ptaxis, "p_{T} (GeV/c)", "pt"}; + AxisSpec mAxis = {maxis, "N", "m"}; + HistogramConfigSpec Hist({HistType::kTHnSparseF, {invAxis, ptAxis, mAxis}}); + registry.add("unlike", "Unlike", Hist); + registry.add("likep", "Likep", Hist); + registry.add("liken", "Liken", Hist); + } + + template + bool selectedTrack(const T& track) + { + if (!track.isPrimaryTrack()) + return false; + return true; + } + + template + bool selectedPair(TLorentzVector& mother, const T& track1, const T& track2) + { + d1.SetXYZM(track1.px(), track1.py(), track1.pz(), mass1); + d2.SetXYZM(track2.px(), track2.py(), track2.pz(), mass2); + mother = d1 + d2; + + return true; + } + + void process(EventCandidate const& collision, TrackCandidates const& tracks) + { + if (test && collision.globalIndex() != 1) + return; + + auto posDauthers = positive->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto negDauthers = negative->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + + if (collision.globalIndex() == 0) { + if (test) { + LOGF(info, "BAD pos=%lld neg=%lld, Z vertex position: %f [cm], %d, mult:%f.0", posDauthers.size(), negDauthers.size(), collision.posZ(), + collision.globalIndex(), multiplicity); + } + return; + } + + multiplicity = collision.multFT0A() + collision.multFT0C(); + + if (refresh > 0 && collision.globalIndex() % refresh == refresh_index) + LOGF(info, "pos=%lld neg=%lld, Z vertex position: %f [cm], %d, mult:%f.0", posDauthers.size(), negDauthers.size(), collision.posZ(), + collision.globalIndex(), multiplicity); + + for (const auto& trk : posDauthers) { + registry.fill(HIST("hNsigmaPos"), trk.tpcNSigmaKa()); + } + + for (const auto& trk : negDauthers) { + registry.fill(HIST("hNsigmaNeg"), trk.tpcNSigmaKa()); + } + + for (auto& [track1, track2] : combinations(o2::soa::CombinationsUpperIndexPolicy(posDauthers, negDauthers))) { + + if (!selectedTrack(track1)) + continue; + if (!selectedTrack(track2)) + continue; + + if (!selectedPair(mother, track1, track2)) + continue; + registry.fill(HIST("unlike"), mother.Mag(), mother.Pt(), multiplicity); + } + + for (auto& [track1, track2] : combinations(o2::soa::CombinationsStrictlyUpperIndexPolicy(posDauthers, posDauthers))) { + + if (!selectedTrack(track1)) + continue; + if (!selectedTrack(track2)) + continue; + + if (!selectedPair(mother, track1, track2)) + continue; + registry.fill(HIST("likep"), mother.Mag(), mother.Pt(), multiplicity); + } + + for (auto& [track1, track2] : combinations(o2::soa::CombinationsStrictlyUpperIndexPolicy(negDauthers, negDauthers))) { + + if (!selectedTrack(track1)) + continue; + if (!selectedTrack(track2)) + continue; + + if (!selectedPair(mother, track1, track2)) + continue; + registry.fill(HIST("liken"), mother.Mag(), mother.Pt(), multiplicity); + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGMM/Mult/Tasks/dndeta.cxx b/PWGMM/Mult/Tasks/dndeta.cxx index f79e430d42d..8c963802c58 100644 --- a/PWGMM/Mult/Tasks/dndeta.cxx +++ b/PWGMM/Mult/Tasks/dndeta.cxx @@ -57,6 +57,9 @@ static constexpr TrackSelectionFlags::flagtype trackSelectionTPC = static constexpr TrackSelectionFlags::flagtype trackSelectionDCA = TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy; +static constexpr TrackSelectionFlags::flagtype trackSelectionDCAXYonly = + TrackSelectionFlags::kDCAxy; + using LabeledTracks = soa::Join; using ReTracks = soa::Join; @@ -363,14 +366,16 @@ struct MultiplicityCounter { // ncheckbit(aod::track::detectorMap, (uint8_t)o2::aod::track::TPC) && // ncheckbit(aod::track::trackCutFlag, trackSelectionITS) && // ncheckbit(aod::track::trackCutFlag, trackSelectionTPC) && - // ifnode(dcaZ.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ, ncheckbit(aod::track::trackCutFlag, trackSelectionDCA)); + // ifnode(dcaZ.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ && ncheckbit(aod::track::trackCutFlag, trackSelectionDCAXYonly), + // ncheckbit(aod::track::trackCutFlag, trackSelectionDCA)); // require a mix of ITS+TPC and ITS-only tracks expressions::Filter trackSelectionProperMixed = ncheckbit(aod::track::detectorMap, (uint8_t)o2::aod::track::ITS) && ncheckbit(aod::track::trackCutFlag, trackSelectionITS) && ifnode(ncheckbit(aod::track::detectorMap, (uint8_t)o2::aod::track::TPC), ncheckbit(aod::track::trackCutFlag, trackSelectionTPC), true) && - ifnode(dcaZ.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ, ncheckbit(aod::track::trackCutFlag, trackSelectionDCA)); + ifnode(dcaZ.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ && ncheckbit(aod::track::trackCutFlag, trackSelectionDCAXYonly), + ncheckbit(aod::track::trackCutFlag, trackSelectionDCA)); expressions::Filter atrackFilter = (aod::track::bestCollisionId >= 0) && (ifnode(dcaZ.node() > 0.f, nabs(aod::track::bestDCAZ) <= dcaZ, nabs(aod::track::bestDCAZ) <= 2.0f)) && diff --git a/PWGMM/Mult/Tasks/heavy-ion-mult.cxx b/PWGMM/Mult/Tasks/heavy-ion-mult.cxx index 150674994dc..d0598205f3b 100644 --- a/PWGMM/Mult/Tasks/heavy-ion-mult.cxx +++ b/PWGMM/Mult/Tasks/heavy-ion-mult.cxx @@ -15,7 +15,7 @@ /// \help: To develop this code, I took help from the following codes and O2 analysis tutorial // 1. https://github.com/AliceO2Group/O2Physics/blob/master/PWGMM/Mult/Tasks/dndeta.cxx // 2. https://github.com/AliceO2Group/O2Physics/blob/master/PWGMM/Mult/Tasks/dndeta-hi.cxx -// 3. https://github.com/AliceO2Group/O2Physics/blob/master/PWGLF/Mult/Tasks/puremc-dndeta.cxx +// 3. https://github.com/AliceO2Group/O2Physics/blob/master/PWGMM/Mult/Tasks/puremc-dndeta.cxx // 4. O2 analysis tutorial: https://indico.cern.ch/event/1267433/ #include @@ -41,10 +41,12 @@ #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/GlobalTrackID.h" #include "ReconstructionDataFormats/Track.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::aod::track; + using CollisionDataTable = soa::Join; using TrackDataTable = soa::Join; using FilTrackDataTable = soa::Filtered; @@ -53,6 +55,7 @@ using TrackMCTrueTable = aod::McParticles; using CollisionMCRecTable = soa::SmallGroups>; using TrackMCRecTable = soa::Join; using FilTrackMCRecTable = soa::Filtered; + static constexpr TrackSelectionFlags::flagtype trackSelectionITS = TrackSelectionFlags::kITSNCls | TrackSelectionFlags::kITSChi2NDF | TrackSelectionFlags::kITSHits; @@ -62,32 +65,46 @@ static constexpr TrackSelectionFlags::flagtype trackSelectionTPC = TrackSelectionFlags::kTPCChi2NDF; static constexpr TrackSelectionFlags::flagtype trackSelectionDCA = TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy; +static constexpr TrackSelectionFlags::flagtype trackSelectionDCAXYonly = + TrackSelectionFlags::kDCAxy; + AxisSpec axisEvent{4, -0.5, 3.5, "#Event"}; AxisSpec axisVtxZ{800, -20, 20, "Vertex Z"}; AxisSpec axisDCA = {601, -3.01, 3.01}; AxisSpec axisPT = {1000, -0.05, 49.95}; AxisSpec axisEta{200, -5, 5, "#eta"}; +AxisSpec axisPhi{629, 0, 2 * M_PI, "#phi"}; AxisSpec axisMCEvent_ambiguity{6, -0.5, 5.5, "reco collisions per true collision"}; + struct HeavyIonMultiplicity { + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; Service pdg; Preslice perCollision = aod::track::collisionId; + Configurable etaRange{"eta-range", 1.0f, "Eta range to consider"}; + Configurable VtxRange{"vertex-range", 10.0f, "Vertex Z range to consider"}; + Configurable dcaZ{"dcaZ", 0.2f, "Custom DCA Z cut (ignored if negative)"}; ConfigurableAxis multHistBin{"MultDistBinning", {501, -0.5, 500.5}, ""}; + void init(InitContext const&) { AxisSpec axisMult = {multHistBin}; histos.add("EventHist", "EventHist", kTH1D, {axisEvent}, false); histos.add("VtxZHist", "VtxZHist", kTH1D, {axisVtxZ}, false); + if (doprocessData) { histos.add("MultHist", "MultHist", kTH1D, {axisMult}, true); histos.add("MultHist_Inelgt0", "MultHist_Inelgt0", kTH1D, {axisMult}, true); histos.add("EtaHist", "EtaHist", kTH1D, {axisEta}, true); + histos.add("PhiHist", "PhiHist", kTH1D, {axisPhi}, true); + histos.add("EtaVsVtxZHist", "EtaVsVtxZHist", kTH2D, {axisEta, axisVtxZ}, false); + histos.add("PhiVsEtaHist", "PhiVsEtaHist", kTH2D, {axisPhi, axisEta}, false); histos.add("DCAXYHist", "DCAXYHist", kTH1D, {axisDCA}, false); histos.add("DCAZHist", "DCAZHist", kTH1D, {axisDCA}, false); histos.add("pTHist", "pTHist", kTH1D, {axisPT}, true); - histos.add("EtaVsVtxZHist", "EtaVsVtxZHist", kTH2D, {axisEta, axisVtxZ}, true); } + if (doprocessMC) { histos.add("MCEventHist_ambiguity", "MCEventHist_ambiguity", kTH1D, {axisMCEvent_ambiguity}, false); histos.add("DCAXYMCRecHist", "DCAXYMCRecHist", kTH1D, {axisDCA}, false); @@ -96,6 +113,10 @@ struct HeavyIonMultiplicity { histos.add("EtaVsVtxZMCRecHist", "EtaVsVtxZMCRecHist", kTH2D, {axisEta, axisVtxZ}, true); histos.add("MCRecEtaHist", "MCRecEtaHist", kTH1D, {axisEta}, true); histos.add("MCGenEtaHist", "MCGenEtaHist", kTH1D, {axisEta}, true); + histos.add("MCRecPhiHist", "MCRecPhiHist", kTH1D, {axisPhi}, true); + histos.add("MCGenPhiHist", "MCGenPhiHist", kTH1D, {axisPhi}, true); + histos.add("MCRecPhiVsEtaHist", "MCRecPhiVsEtaHist", kTH2D, {axisPhi, axisEta}, false); + histos.add("MCGenPhiVsEtaHist", "MCGenPhiVsEtaHist", kTH2D, {axisPhi, axisEta}, false); histos.add("MCRecMultHist", "MCRecMultHist", kTH1D, {axisMult}, true); histos.add("MCGenMultHist", "MCGenMultHist", kTH1D, {axisMult}, true); histos.add("MCGenVsRecMultHist", "MCGenVsRecMultHist", kTH2D, {axisMult, axisMult}, true); @@ -104,7 +125,14 @@ struct HeavyIonMultiplicity { histos.add("MCGenVsRecMultHist_Inelgt0", "MCGenVsRecMultHist_Inelgt0", kTH2D, {axisMult, axisMult}, true); } } - expressions::Filter trackSelectionProper = ((aod::track::trackCutFlag & trackSelectionITS) == trackSelectionITS) && ifnode((aod::track::detectorMap & (uint8_t)o2::aod::track::TPC) == (uint8_t)o2::aod::track::TPC, (aod::track::trackCutFlag & trackSelectionTPC) == trackSelectionTPC, true) && ((aod::track::trackCutFlag & trackSelectionDCA) == trackSelectionDCA); + + expressions::Filter trackSelectionProperMixed = ncheckbit(aod::track::detectorMap, (uint8_t)o2::aod::track::ITS) && + ncheckbit(aod::track::trackCutFlag, trackSelectionITS) && + ifnode(ncheckbit(aod::track::detectorMap, (uint8_t)o2::aod::track::TPC), + ncheckbit(aod::track::trackCutFlag, trackSelectionTPC), true) && + ifnode(dcaZ.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ && ncheckbit(aod::track::trackCutFlag, trackSelectionDCAXYonly), + ncheckbit(aod::track::trackCutFlag, trackSelectionDCA)); + void processData(CollisionDataTable::iterator const& collision, FilTrackDataTable const& tracks) { auto NchTracks = 0; @@ -112,13 +140,15 @@ struct HeavyIonMultiplicity { histos.fill(HIST("EventHist"), 0); if (collision.sel8()) { histos.fill(HIST("EventHist"), 1); - if (std::abs(collision.posZ()) < 10) { + if (std::abs(collision.posZ()) < VtxRange) { histos.fill(HIST("EventHist"), 2); histos.fill(HIST("VtxZHist"), collision.posZ()); for (auto& track : tracks) { if (std::abs(track.eta()) < etaRange) { NchTracks++; histos.fill(HIST("EtaHist"), track.eta()); + histos.fill(HIST("PhiHist"), track.phi()); + histos.fill(HIST("PhiVsEtaHist"), track.phi(), track.eta()); histos.fill(HIST("EtaVsVtxZHist"), track.eta(), collision.posZ()); histos.fill(HIST("DCAXYHist"), track.dcaXY()); histos.fill(HIST("DCAZHist"), track.dcaZ()); @@ -138,6 +168,7 @@ struct HeavyIonMultiplicity { } PROCESS_SWITCH(HeavyIonMultiplicity, processData, "process data", false); + void processMC(CollisionMCTrueTable::iterator const& TrueCollision, CollisionMCRecTable const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) { histos.fill(HIST("MCEventHist_ambiguity"), RecCollisions.size()); @@ -163,6 +194,8 @@ struct HeavyIonMultiplicity { if (std::abs(particle.eta()) < etaRange) { NchGenTracks++; histos.fill(HIST("MCGenEtaHist"), particle.eta()); + histos.fill(HIST("MCGenPhiHist"), particle.phi()); + histos.fill(HIST("MCGenPhiVsEtaHist"), particle.phi(), particle.eta()); } } } @@ -177,7 +210,7 @@ struct HeavyIonMultiplicity { histos.fill(HIST("EventHist"), 0); if (RecCollision.sel8()) { histos.fill(HIST("EventHist"), 1); - if (std::abs(RecCollision.posZ()) < 10) { + if (std::abs(RecCollision.posZ()) < VtxRange) { histos.fill(HIST("EventHist"), 2); histos.fill(HIST("VtxZHist"), RecCollision.posZ()); @@ -186,6 +219,8 @@ struct HeavyIonMultiplicity { if (std::abs(Rectrack.eta()) < etaRange) { NchRecTracks++; histos.fill(HIST("MCRecEtaHist"), Rectrack.eta()); + histos.fill(HIST("MCRecPhiHist"), Rectrack.phi()); + histos.fill(HIST("MCRecPhiVsEtaHist"), Rectrack.phi(), Rectrack.eta()); histos.fill(HIST("EtaVsVtxZMCRecHist"), Rectrack.eta(), RecCollision.posZ()); histos.fill(HIST("DCAXYMCRecHist"), Rectrack.dcaXY()); histos.fill(HIST("DCAZMCRecHist"), Rectrack.dcaZ()); @@ -210,6 +245,7 @@ struct HeavyIonMultiplicity { } PROCESS_SWITCH(HeavyIonMultiplicity, processMC, "process MC", false); }; + WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; diff --git a/Tutorials/src/configurableObjects.cxx b/Tutorials/src/configurableObjects.cxx index a2556baf256..210d93c0dac 100644 --- a/Tutorials/src/configurableObjects.cxx +++ b/Tutorials/src/configurableObjects.cxx @@ -14,10 +14,11 @@ /// \author /// \since +#include + #include "configurableCut.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" -#include using namespace o2; using namespace o2::framework; @@ -55,6 +56,8 @@ auto printMatrix(Array2D const& m) static constexpr float defaultm[3][4] = {{1.1, 1.2, 1.3, 1.4}, {2.1, 2.2, 2.3, 2.4}, {3.1, 3.2, 3.3, 3.4}}; static LabeledArray la{&defaultm[0][0], 3, 4, {"r 1", "r 2", "r 3"}, {"c 1", "c 2", "c 3", "c 4"}}; +const std::string defaultmS[3][4] = {{"One.One", "One.Two", "One.Three", "One.Four"}, {"Two.One", "Two.Two", "Two.Three", "Two.Four"}, {"Three.One", "Three.Two", "Three.Three", "Three.Four"}}; +static LabeledArray laS{&defaultmS[0][0], 3, 4, {"rS 1", "rS 2", "rS 3"}, {"cS 1", "cS 2", "cS 3", "cS 4"}}; struct ConfigurableObjectDemo { // Simple type configurables @@ -71,7 +74,8 @@ struct ConfigurableObjectDemo { Configurable> farray{"farray", {0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1}, "generic float array"}; Configurable> darray{"darray", {0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1}, "generic double array"}; Configurable> vmatrix{"matrix", {&defaultm[0][0], 3, 4}, "generic matrix"}; - Configurable> vla{"vla", {defaultm[0], 3, 4, {"r 1", "r 2", "r 3"}, {"c 1", "c 2", "c 3", "c 4"}}, "labeled array"}; + Configurable> vla{"vla", {defaultm[0], 3, 4, {"r 1", "r 2", "r 3"}, {"c 1", "c 2", "c 3", "c 4"}}, "labeled array with float content"}; + Configurable> vlaS{"vlaS", {defaultmS[0], 3, 4, {"rS 1", "rS 2", "rS 3"}, {"cS 1", "cS 2", "cS 3", "cS 4"}}, "labeled array with string content"}; // Configurables can be grouped into `ConfigurableGroup`s. // Their names must be unique. @@ -93,7 +97,8 @@ struct ConfigurableObjectDemo { auto fvec = (std::vector)farray; LOGF(info, "Float array: %s", printArray(fvec).c_str()); LOGF(info, "Matrix: %s", printMatrix((Array2D)vmatrix)); - LOGF(info, "Labeled:\n %s\n %s\n %s", printArray(vla->getLabelsRows()), printArray(vla->getLabelsCols()), printMatrix(vla->getData())); + LOGF(info, "Labeled float array:\n %s\n %s\n %s", printArray(vla->getLabelsRows()), printArray(vla->getLabelsCols()), printMatrix(vla->getData())); + LOGF(info, "Labeled std::string array:\n %s\n %s\n %s", printArray(vlaS->getLabelsRows()), printArray(vlaS->getLabelsCols()), printMatrix(vlaS->getData())); }; void process(aod::Collision const&, aod::Tracks const& tracks)