diff --git a/PWGEM/Dilepton/DataModel/lmeeMLTables.h b/PWGEM/Dilepton/DataModel/lmeeMLTables.h index 6d877783a38..9fdb761a883 100644 --- a/PWGEM/Dilepton/DataModel/lmeeMLTables.h +++ b/PWGEM/Dilepton/DataModel/lmeeMLTables.h @@ -10,6 +10,7 @@ // or submit itself to any jurisdiction. #include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponseTOF.h" #include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/TrackSelectionTables.h" @@ -118,32 +119,59 @@ using EMPIDPr = EMPIDsPr::iterator; namespace emmlfwdtrack { -DECLARE_SOA_COLUMN(PtMatchedMCHMID, ptMatchedMCHMID, float); //! pt of MCH-MID track in MFT-MCH-MID track at PV -DECLARE_SOA_COLUMN(EtaMatchedMCHMID, etaMatchedMCHMID, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV -DECLARE_SOA_COLUMN(PhiMatchedMCHMID, phiMatchedMCHMID, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV -DECLARE_SOA_COLUMN(XMatchedMCHMIDatMP, xMatchedMCHMIDatMP, float); //! x of MCH-MID track in MFT-MCH-MID track at matching plane -DECLARE_SOA_COLUMN(YMatchedMCHMIDatMP, yMatchedMCHMIDatMP, float); //! y of MCH-MID track in MFT-MCH-MID track at matching plane -DECLARE_SOA_COLUMN(XMatchedMFTatMP, xMatchedMFTatMP, float); //! x of MFT track in MFT-MCH-MID track at matching plane -DECLARE_SOA_COLUMN(YMatchedMFTatMP, yMatchedMFTatMP, float); //! y of MFT track in MFT-MCH-MID track at matching plane -DECLARE_SOA_COLUMN(Sign, sign, int8_t); //! -DECLARE_SOA_COLUMN(Chi2MFT, chi2MFT, float); //! chi2 of MFT standalone track +// DECLARE_SOA_COLUMN(Signed1PtMFTMCHMIDatPV, signed1PtMFTMCHMIDatPV, float); //! pt of MCH-MID track in MFT-MCH-MID track at PV +// DECLARE_SOA_COLUMN(EtaMFTMCHMIDatPV, etaMFTMCHMIDatPV, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV +// DECLARE_SOA_COLUMN(PhiMFTMCHMIDatPV, phiMFTMCHMIDatPV, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV +// +// DECLARE_SOA_COLUMN(Signed1PtMCHMIDatPV, signed1PtMCHMIDatPV, float); //! pt of MCH-MID track in MFT-MCH-MID track at PV +// DECLARE_SOA_COLUMN(EtaMCHMIDatPV, etaMCHMIDatPV, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV +// DECLARE_SOA_COLUMN(PhiMCHMIDatPV, phiMCHMIDatPV, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV + +DECLARE_SOA_COLUMN(Signed1PtMCHMIDatMP, signed1PtMCHMIDatMP, float); //! pt of MCH-MID track in MFT-MCH-MID track at MP +DECLARE_SOA_COLUMN(EtaMCHMIDatMP, etaMCHMIDatMP, float); //! eta of MCH-MID track in MFT-MCH-MID track at MP +DECLARE_SOA_COLUMN(PhiMCHMIDatMP, phiMCHMIDatMP, float); //! phi of MCH-MID track in MFT-MCH-MID track at MP + +DECLARE_SOA_COLUMN(Signed1PtMFTatMP, signed1PtMFTatMP, float); //! pt of MCH-MID track in MFT-MCH-MID track at MP +DECLARE_SOA_COLUMN(EtaMFTatMP, etaMFTatMP, float); //! eta of MCH-MID track in MFT-MCH-MID track at MP +DECLARE_SOA_COLUMN(PhiMFTatMP, phiMFTatMP, float); //! phi of MCH-MID track in MFT-MCH-MID track at MP + +DECLARE_SOA_COLUMN(XMCHMIDatMP, xMCHMIDatMP, float); //! x of MCH-MID track in MFT-MCH-MID track at matching plane +DECLARE_SOA_COLUMN(YMCHMIDatMP, yMCHMIDatMP, float); //! y of MCH-MID track in MFT-MCH-MID track at matching plane +DECLARE_SOA_COLUMN(XErrMCHMIDatMP, xErrMCHMIDatMP, float); //! x error of MCH-MID track in MFT-MCH-MID track at matching plane +DECLARE_SOA_COLUMN(YErrMCHMIDatMP, yErrMCHMIDatMP, float); //! y error of MCH-MID track in MFT-MCH-MID track at matching plane + +DECLARE_SOA_COLUMN(XMFTatMP, xMFTatMP, float); //! x of MFT track in MFT-MCH-MID track at matching plane +DECLARE_SOA_COLUMN(YMFTatMP, yMFTatMP, float); //! y of MFT track in MFT-MCH-MID track at matching plane +DECLARE_SOA_COLUMN(XErrMFTatMP, xErrMFTatMP, float); //! x error of MFT track in MFT-MCH-MID track at matching plane +DECLARE_SOA_COLUMN(YErrMFTatMP, yErrMFTatMP, float); //! y error of MFT track in MFT-MCH-MID track at matching plane + +// DECLARE_SOA_COLUMN(Sign, sign, int8_t); //! +DECLARE_SOA_COLUMN(Chi2MFT, chi2MFT, float); //! chi2/ndf of MFT track +DECLARE_SOA_COLUMN(Chi2MCHMID, chi2MCHMID, float); //! chi2/ndf of MCH-MID track +DECLARE_SOA_COLUMN(Chi2MFTMCHMID, chi2MFTMCHMID, float); //! chi2/ndf of MFT-MCH-MID track DECLARE_SOA_COLUMN(NClustersMFT, nClustersMFT, uint8_t); //! DECLARE_SOA_COLUMN(IsPrimary, isPrimary, bool); //! DECLARE_SOA_COLUMN(IsCorrectMatchMFTMCH, isCorrectMatchMFTMCH, bool); //! } // namespace emmlfwdtrack DECLARE_SOA_TABLE_VERSIONED(EMFwdTracksForML_000, "AOD", "EMFWDTRKML", 0, //! - o2::soa::Index<>, collision::PosZ, collision::NumContrib, evsel::NumTracksInTimeRange, evsel::SumAmpFT0CInTimeRange, emmltrack::HadronicRate, - fwdtrack::TrackType, fwdtrack::Pt, fwdtrack::Eta, fwdtrack::Phi, emmlfwdtrack::Sign, + o2::soa::Index<>, collision::NumContrib, mult::MultFT0C, evsel::NumTracksInTimeRange, evsel::SumAmpFT0CInTimeRange, emmltrack::HadronicRate, + fwdtrack::TrackType, + // emmlfwdtrack::Signed1PtMFTMCHMIDatPV, emmlfwdtrack::EtaMFTMCHMIDatPV, emmlfwdtrack::PhiMFTMCHMIDatPV, + // emmlfwdtrack::Signed1PtMCHMIDatPV, emmlfwdtrack::EtaMCHMIDatPV, emmlfwdtrack::PhiMCHMIDatPV, + + emmlfwdtrack::Signed1PtMCHMIDatMP, emmlfwdtrack::EtaMCHMIDatMP, emmlfwdtrack::PhiMCHMIDatMP, + emmlfwdtrack::Signed1PtMFTatMP, emmlfwdtrack::EtaMFTatMP, emmlfwdtrack::PhiMFTatMP, + emmlfwdtrack::XMCHMIDatMP, emmlfwdtrack::YMCHMIDatMP, + // emmlfwdtrack::XErrMCHMIDatMP, emmlfwdtrack::YErrMCHMIDatMP, + emmlfwdtrack::XMFTatMP, emmlfwdtrack::YMFTatMP, + // emmlfwdtrack::XErrMFTatMP, emmlfwdtrack::YErrMFTatMP, + fwdtrack::FwdDcaX, fwdtrack::FwdDcaY, - emmlfwdtrack::PtMatchedMCHMID, emmlfwdtrack::EtaMatchedMCHMID, emmlfwdtrack::PhiMatchedMCHMID, - emmlfwdtrack::XMatchedMCHMIDatMP, emmlfwdtrack::YMatchedMCHMIDatMP, - emmlfwdtrack::XMatchedMFTatMP, emmlfwdtrack::YMatchedMFTatMP, fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd, - fwdtrack::Chi2, fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT, - // fwdtrack::MCHBitMap, fwdtrack::MIDBitMap, fwdtrack::MIDBoards, - fwdtrack::MFTClusterSizesAndTrackFlags, emmlfwdtrack::Chi2MFT, emmlfwdtrack::NClustersMFT, mcparticle::PdgCode, emmlfwdtrack::IsPrimary, emmlfwdtrack::IsCorrectMatchMFTMCH, - emmltrack::PtGen, emmltrack::EtaGen, emmltrack::PhiGen); + fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT, + fwdtrack::MFTClusterSizesAndTrackFlags, emmlfwdtrack::Chi2MFTMCHMID, emmlfwdtrack::Chi2MCHMID, emmlfwdtrack::Chi2MFT, emmlfwdtrack::NClustersMFT, + mcparticle::PdgCode, emmlfwdtrack::IsPrimary, emmlfwdtrack::IsCorrectMatchMFTMCH, mcparticle::Pt, mcparticle::Eta, mcparticle::Phi); using EMFwdTracksForML = EMFwdTracksForML_000; // iterators diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx index 9ece7b19407..06c778e2c40 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx @@ -17,6 +17,7 @@ #include "PWGEM/Dilepton/DataModel/lmeeMLTables.h" #include "Common/CCDB/EventSelectionParams.h" +#include "Common/CCDB/RCTSelectionFlags.h" #include "Common/CCDB/ctpRateFetcher.h" #include "Common/Core/CollisionTypeHelper.h" #include "Common/Core/RecoDecay.h" @@ -66,7 +67,7 @@ using namespace o2::constants::physics; using namespace o2::aod::fwdtrackutils; struct TreeCreatorMuonML { - using MyCollisionsMC = soa::Join; + using MyCollisionsMC = soa::Join; using MyCollisionMC = MyCollisionsMC::iterator; using MyFwdTracksMC = soa::Join; @@ -81,7 +82,6 @@ struct TreeCreatorMuonML { Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - // Configurable irSource{"irSource", "ZNC hadronic", "Estimator of the interaction rate (Recommended: pp/OO --> T0VTX, Pb-Pb --> ZNC hadronic)"}; // for z shift for propagation Configurable cfgApplyZShiftFromCCDB{"cfgApplyZShiftFromCCDB", false, "flag to apply z shift"}; @@ -98,6 +98,11 @@ struct TreeCreatorMuonML { Configurable cfgRequireNoITSROFB{"cfgRequireNoITSROFB", false, "require no ITS readout frame border"}; Configurable cfgRequireNoSameBunchPileup{"cfgRequireNoSameBunchPileup", false, "require no same bunch pileup in event cut"}; Configurable cfgRequireGoodZvtxFT0vsPV{"cfgRequireGoodZvtxFT0vsPV", false, "require good Zvtx between FT0 vs. PV in event cut"}; + // for RCT + o2::framework::Configurable cfgRequireGoodRCT{"cfgRequireGoodRCT", false, "require good detector flag in run condtion table"}; + o2::framework::Configurable cfgRCTLabel{"cfgRCTLabel", "CBT_muon_glo", "select 1 [CBT, CBT_hadronPID, CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + o2::framework::Configurable cfgCheckZDC{"cfgCheckZDC", false, "set ZDC flag for AA"}; + o2::framework::Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; } eventCutGroup; struct : ConfigurableGroup { @@ -115,6 +120,7 @@ struct TreeCreatorMuonML { std::mt19937 engine; std::uniform_real_distribution dist01; + o2::aod::rctsel::RCTFlagsChecker rctChecker; ctpRateFetcher mRateFetcher; std::string irSourceForCptFetcher{""}; @@ -132,6 +138,7 @@ struct TreeCreatorMuonML { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); ccdbApi.init(ccdburl); + rctChecker.init(eventCutGroup.cfgRCTLabel.value, eventCutGroup.cfgCheckZDC.value, eventCutGroup.cfgTreatLimitedAcceptanceAsBad.value); addHistograms(); @@ -319,7 +326,7 @@ struct TreeCreatorMuonML { float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToVertex, glMuonCutGroup.matchingZ, mBz, mZShift); - float ptMatchedMCHMID = propmuonAtPV_Matched.getPt(); + // float ptMatchedMCHMID = propmuonAtPV_Matched.getPt(); float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); // o2::math_utils::bringTo02Pi(phiMatchedMCHMID); @@ -335,33 +342,43 @@ struct TreeCreatorMuonML { float pDCA = mchtrack.p() * dcaXY_Matched; float rAtAbsorberEnd = fwdtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack - float xMatchedMFTatMP = 999.f; - float yMatchedMFTatMP = 999.f; - float xMatchedMCHMIDatMP = 999.f; - float yMatchedMCHMIDatMP = 999.f; + float xMFTatMP = 999.f, yMFTatMP = 999.f; + float xMCHMIDatMP = 999.f, yMCHMIDatMP = 999.f; + float signed1PtMFTatMP = 999.f, etaMFTatMP = 999.f, phiMFTatMP = 999.f; + float signed1PtMCHMIDatMP = 999.f, etaMCHMIDatMP = 999.f, phiMCHMIDatMP = 999.f; if constexpr (withMFTCov) { auto mfttrackcov = mftCovs.rawIteratorAt(map_mfttrackcovs[mfttrack.globalIndex()]); o2::track::TrackParCovFwd mftsaAtMP = getTrackParCovFwdShift(mfttrack, mZShift, mfttrackcov); // values at innermost update mftsaAtMP.propagateToZhelix(glMuonCutGroup.matchingZ, mBz); // propagated to matching plane - xMatchedMFTatMP = mftsaAtMP.getX(); - yMatchedMFTatMP = mftsaAtMP.getY(); + xMFTatMP = mftsaAtMP.getX(); + yMFTatMP = mftsaAtMP.getY(); + signed1PtMFTatMP = mftsaAtMP.getInvQPt(); + etaMFTatMP = mftsaAtMP.getEta(); + phiMFTatMP = RecoDecay::constrainAngle(mftsaAtMP.getPhi(), 0, 1U); auto muonAtMP = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToMatchingPlane, glMuonCutGroup.matchingZ, mBz, mZShift); // propagated to matching plane - xMatchedMCHMIDatMP = muonAtMP.getX(); - yMatchedMCHMIDatMP = muonAtMP.getY(); + xMCHMIDatMP = muonAtMP.getX(); + yMCHMIDatMP = muonAtMP.getY(); + signed1PtMCHMIDatMP = mftsaAtMP.getInvQPt(); + etaMCHMIDatMP = muonAtMP.getEta(); + phiMCHMIDatMP = RecoDecay::constrainAngle(muonAtMP.getPhi(), 0, 1U); } float deta = etaMatchedMCHMID - eta; float dphi = phiMatchedMCHMID - phi; o2::math_utils::bringToPMPi(dphi); - mltable(collision.posZ(), collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange(), hadronicRate, - fwdtrack.trackType(), pt, eta, phi, fwdtrack.sign(), dcaX, dcaY, ptMatchedMCHMID, etaMatchedMCHMID, phiMatchedMCHMID, - xMatchedMCHMIDatMP, yMatchedMCHMIDatMP, xMatchedMFTatMP, yMatchedMFTatMP, - fwdtrack.nClusters(), pDCA, rAtAbsorberEnd, chi2, fwdtrack.chi2MatchMCHMID(), fwdtrack.chi2MatchMCHMFT(), - // fwdtrack.mchBitMap(), fwdtrack.midBitMap(), fwdtrack.midBoards(), - mfttrack.mftClusterSizesAndTrackFlags(), chi2mft, mfttrack.nClusters(), pdgCode, isPrimary, isMatched, + mltable(collision.numContrib(), collision.multFT0C(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange(), hadronicRate, + fwdtrack.trackType(), + signed1PtMFTatMP, etaMFTatMP, phiMFTatMP, + signed1PtMCHMIDatMP, etaMCHMIDatMP, phiMCHMIDatMP, + xMCHMIDatMP, yMCHMIDatMP, + xMFTatMP, yMFTatMP, + dcaX, dcaY, + fwdtrack.nClusters(), pDCA, rAtAbsorberEnd, fwdtrack.chi2MatchMCHMID(), fwdtrack.chi2MatchMCHMFT(), + mfttrack.mftClusterSizesAndTrackFlags(), chi2, mchtrack.chi2(), chi2mft, mfttrack.nClusters(), + pdgCode, isPrimary, isMatched, mcParticle_MCHMID.pt(), mcParticle_MCHMID.eta(), mcParticle_MCHMID.phi()); fRegistry.fill(HIST("hMuonType"), fwdtrack.trackType()); @@ -409,6 +426,11 @@ struct TreeCreatorMuonML { if (!isSelectedCollision(collision)) { continue; } + + if (eventCutGroup.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } + float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), bc.runNumber(), irSourceForCptFetcher) * 1.e-3; // kHz auto fwdtracks_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex()); @@ -442,6 +464,11 @@ struct TreeCreatorMuonML { if (!isSelectedCollision(collision)) { continue; } + + if (eventCutGroup.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } + float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), bc.runNumber(), irSourceForCptFetcher) * 1.e-3; // kHz auto fwdtracks_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex()); diff --git a/PWGEM/Dilepton/Tasks/taggingHFE.cxx b/PWGEM/Dilepton/Tasks/taggingHFE.cxx index 368a1d64b4d..0b5df3eddc7 100644 --- a/PWGEM/Dilepton/Tasks/taggingHFE.cxx +++ b/PWGEM/Dilepton/Tasks/taggingHFE.cxx @@ -1096,7 +1096,7 @@ struct taggingHFE { if (isXi(cascade) && isPion(bachelor)) { xiMinusIds.emplace_back(cascade.globalIndex()); } - if (isOmega(cascade) && isKaon(bachelor)) { + if (isOmega(cascade) && isKaonBachelor(bachelor)) { omegaMinusIds.emplace_back(cascade.globalIndex()); } } else { // Xi+ or Omega+