diff --git a/PWGEM/Dilepton/DataModel/lmeeMLTables.h b/PWGEM/Dilepton/DataModel/lmeeMLTables.h index eb4fdee60b2..36fef988076 100644 --- a/PWGEM/Dilepton/DataModel/lmeeMLTables.h +++ b/PWGEM/Dilepton/DataModel/lmeeMLTables.h @@ -195,13 +195,27 @@ DECLARE_SOA_TABLE(EMFwdTrackErrsForML, "AOD", "EMFWDTRKERRML", //! Joinable with using EMFwdTrackErrForML = EMFwdTrackErrsForML::iterator; // for SemiCharmTag at midrapidity, only electrons -namespace emmllhpair +namespace emmlevent +{ +DECLARE_SOA_COLUMN(SubGeneratorId, subGeneratorId, int); //! sub generator Id of mc collision +} // namespace emmlevent +namespace emmltrack { -DECLARE_SOA_COLUMN(Signed1PtL, signed1PtL, float); //! signed1Pt of lepton -DECLARE_SOA_COLUMN(EtaL, etaL, float); //! eta of lepton -DECLARE_SOA_COLUMN(DcaL, dcaL, float); //! dca of lepton -DECLARE_SOA_COLUMN(DcaLSigma, dcaLsigma, float); //! dca of lepton +DECLARE_SOA_COLUMN(IsMotherFromHF, isMotherFromHF, bool); //! is HF included in decay history +DECLARE_SOA_COLUMN(PdgCodeMother, pdgCodeMother, int); //! pdg code of mother of lepton +} // namespace emmltrack +DECLARE_SOA_TABLE(EMMLLeptons, "AOD", "EMMLLEPTON", //! + o2::soa::Index<>, collision::NumContrib, evsel::NumTracksInTimeRange, evsel::SumAmpFT0CInTimeRange, emmlevent::SubGeneratorId, + track::Signed1Pt, track::Eta, + track::DcaXY, track::DcaZ, o2::aod::track::CYY, o2::aod::track::CZY, o2::aod::track::CZZ, + emmltrack::IsMotherFromHF, emmltrack::PdgCodeMother); +// iterators +using EMMLLepton = EMMLLeptons::iterator; + +namespace emmllhpair +{ +DECLARE_SOA_INDEX_COLUMN(EMMLLepton, emmllepton); //! most propable emeventId DECLARE_SOA_COLUMN(Signed1PtH, signed1PtH, float); //! signed1Pt of hadron DECLARE_SOA_COLUMN(EtaH, etaH, float); //! eta of hadron DECLARE_SOA_COLUMN(DcaH, dcaH, float); //! dca of hadron @@ -214,16 +228,17 @@ DECLARE_SOA_COLUMN(CosPA, cospa, float); //! flight direction of LH pair DECLARE_SOA_COLUMN(Lxyz, lxyz, float); //! decay length of LH pair DECLARE_SOA_COLUMN(LxyzSigma, lxyzSigma, float); //! decay length resolution of LH pair -DECLARE_SOA_COLUMN(PdgCodeH, pdgCodeH, int); //! pdg code of associated hadron -DECLARE_SOA_COLUMN(PdgCodeHFH, pdgCodeHFH, int); //! pdg code of HF hadron +DECLARE_SOA_COLUMN(PdgCodeH, pdgCodeH, int); //! pdg code of associated hadron +DECLARE_SOA_COLUMN(PdgCodeHFH, pdgCodeHFH, int); //! pdg code of HF hadron +DECLARE_SOA_COLUMN(FoundCommonMother, foundCommonMother, bool); //! decay length resolution of LH pair } // namespace emmllhpair DECLARE_SOA_TABLE(EMMLLHPairs, "AOD", "EMMLLHPAIR", //! - o2::soa::Index<>, collision::NumContrib, evsel::NumTracksInTimeRange, evsel::SumAmpFT0CInTimeRange, - emmllhpair::Signed1PtL, emmllhpair::EtaL, emmllhpair::DcaL, emmllhpair::DcaLSigma, - emmllhpair::Signed1PtH, emmllhpair::EtaH, emmllhpair::DcaH, emmllhpair::DcaHSigma, emmllhpair::NSigmaKa, + emmllhpair::EMMLLeptonId, + track::Signed1Pt, track::Eta, + track::DcaXY, track::DcaZ, o2::aod::track::CYY, o2::aod::track::CZY, o2::aod::track::CZZ, pidtpc::TPCNSigmaKa, pidtof::TOFNSigmaKa, emmllhpair::Mass, emmllhpair::DcaLH, emmllhpair::CosPA, emmllhpair::Lxyz, emmllhpair::LxyzSigma, - emmllhpair::PdgCodeH, emmllhpair::PdgCodeHFH); + emmllhpair::PdgCodeH, emmllhpair::FoundCommonMother); // iterators using EMMLLHPair = EMMLLHPairs::iterator; diff --git a/PWGEM/Dilepton/Tasks/taggingHFE.cxx b/PWGEM/Dilepton/Tasks/taggingHFE.cxx index e04f8bc2244..aaceb815f8f 100644 --- a/PWGEM/Dilepton/Tasks/taggingHFE.cxx +++ b/PWGEM/Dilepton/Tasks/taggingHFE.cxx @@ -18,6 +18,8 @@ #include "PWGEM/Dilepton/Utils/SemiCharmTag.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "Common/CCDB/EventSelectionParams.h" +#include "Common/CCDB/RCTSelectionFlags.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/Centrality.h" @@ -84,6 +86,7 @@ struct taggingHFE { using MyV0s = soa::Join; using MyCascades = soa::Join; + Produces leptonTable; Produces emmllhpair; // Configurables @@ -217,12 +220,22 @@ struct taggingHFE { struct : ConfigurableGroup { std::string prefix = "eventCut"; + // Configurable cfgEventGeneratorType{"cfgEventGeneratorType", -1, "if positive, select event generator type. i.e. gap or signal"}; Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentMin{"cfgCentMin", -1.f, "min. centrality"}; Configurable cfgCentMax{"cfgCentMax", 999.f, "max. centrality"}; Configurable cfgZvtxMin{"cfgZvtxMin", -10.f, "min. Zvtx"}; Configurable cfgZvtxMax{"cfgZvtxMax", 10.f, "max. Zvtx"}; - Configurable cfgEventGeneratorType{"cfgEventGeneratorType", -1, "if positive, select event generator type. i.e. gap or signal"}; + Configurable cfgRequireFT0AND{"cfgRequireFT0AND", true, "require FT0AND"}; + Configurable cfgRequireNoTFB{"cfgRequireNoTFB", true, "require No time frame border"}; + 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_hadronPID", "select 1 [CBT, CBT_hadronPID] 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"}; } eventCut; struct : ConfigurableGroup { @@ -252,6 +265,8 @@ struct taggingHFE { Configurable cfg_max_dca2legs{"cfg_max_dca2legs", 1e+10, "max distance between 2 legs"}; } lCPairCut; + o2::aod::rctsel::RCTFlagsChecker rctChecker; + HistogramRegistry fRegistry{"fRegistry"}; static constexpr std::string_view hadron_names[6] = {"LF/", "Jpsi/", "D0/", "Dpm/", "Ds/", "Lc/"}; static constexpr std::string_view pair_names[3] = {"e_Kpm/", "e_K0S/", "e_Lambda/"}; @@ -268,6 +283,7 @@ struct taggingHFE { ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); + rctChecker.init(eventCut.cfgRCTLabel.value, eventCut.cfgCheckZDC.value, eventCut.cfgTreatLimitedAcceptanceAsBad.value); std::random_device seed_gen; engine = std::mt19937(seed_gen()); @@ -955,6 +971,30 @@ struct taggingHFE { } } + template + bool isSelectedCollision(TCollision const& collision) + { + if (!(eventCut.cfgZvtxMin < collision.posZ() && collision.posZ() < eventCut.cfgZvtxMax)) { + return false; + } + if (eventCut.cfgRequireFT0AND && !collision.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { + return false; + } + if (eventCut.cfgRequireNoTFB && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + return false; + } + if (eventCut.cfgRequireNoITSROFB && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + return false; + } + if (eventCut.cfgRequireNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + return false; + } + if (eventCut.cfgRequireGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + return true; + } + template void runPairing(TBCs const&, TCollisions const& collisions, TTracks const& tracks, TTrackAssoc const& trackIndices, TV0s const& v0s, TCascades const& cascades, TMCCollisions const&, TMCParticles const& mcParticles) { @@ -963,26 +1003,34 @@ struct taggingHFE { for (const auto& collision : collisions) { const auto& bc = collision.template foundBC_as(); initCCDB(bc); - fRegistry.fill(HIST("Event/hCollisionCounter"), 0); if (!collision.has_mcCollision()) { continue; } + + fRegistry.fill(HIST("Event/hCollisionCounter"), 0); + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[eventCut.cfgCentEstimator] < eventCut.cfgCentMin || eventCut.cfgCentMax < centralities[eventCut.cfgCentEstimator]) { continue; } - fRegistry.fill(HIST("Event/hCollisionCounter"), 1); - const auto& mcCollision = collision.template mcCollision_as(); - if (eventCut.cfgEventGeneratorType < 0 || mcCollision.getSubGeneratorId() == eventCut.cfgEventGeneratorType) { - fillEventHistograms(collision); + + if (!isSelectedCollision(collision)) { + continue; + } + if (eventCut.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; } - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); if (dist01(engine) > cfgDownSampling) { // random sampling, if necessary continue; } + fillEventHistograms(collision); + fRegistry.fill(HIST("Event/hCollisionCounter"), 1); + + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + const auto& trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, collision.globalIndex()); electronIds.reserve(trackIdsThisCollision.size()); positronIds.reserve(trackIdsThisCollision.size()); @@ -999,13 +1047,14 @@ struct taggingHFE { continue; } const auto& mcParticle = track.template mcParticle_as(); - const auto& mcCollision = mcParticle.template mcCollision_as(); - if (eventCut.cfgEventGeneratorType >= 0 && mcCollision.getSubGeneratorId() != eventCut.cfgEventGeneratorType) { - continue; - } - if (!mcParticle.has_mothers() || !(mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator())) { + // const auto& mcCollision = mcParticle.template mcCollision_as(); + // if (eventCut.cfgEventGeneratorType >= 0 && mcCollision.getSubGeneratorId() != eventCut.cfgEventGeneratorType) { + // continue; + // } + if (!mcParticle.has_mothers()) { continue; } + bool isPrimary = mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator(); fillElectronHistograms(track, mcParticles); @@ -1016,7 +1065,7 @@ struct taggingHFE { float dcaXY = mDcaInfoCov.getY(); float dcaZ = mDcaInfoCov.getZ(); - if (isSelectedTrack(track, trackParCov, dcaXY, dcaZ) && std::abs(mcParticle.pdgCode()) == cfgPdgLepton) { + if (isSelectedTrack(track, trackParCov, dcaXY, dcaZ) && std::abs(mcParticle.pdgCode()) == cfgPdgLepton && isPrimary) { // keep truely primary electrons fRegistry.fill(HIST("Track/Electron/hTPCdEdx"), track.tpcInnerParam(), track.mcTunedTPCSignal()); fRegistry.fill(HIST("Track/Electron/hTOFbeta"), track.p(), track.beta()); if (track.sign() > 0) { // positron @@ -1027,7 +1076,7 @@ struct taggingHFE { } mDcaInfoCov.set(999, 999, 999, 999, 999); - trackParCov.setPID(o2::track::PID::Kaon); + trackParCov.setPID(track.pidForTracking()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, trackParCov, 2.f, matCorr, &mDcaInfoCov); dcaXY = mDcaInfoCov.getY(); dcaZ = mDcaInfoCov.getZ(); @@ -1143,35 +1192,42 @@ struct taggingHFE { o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, leptonParCov, 2.f, matCorr, &mDcaInfoCov); float dcaXY_lepton = mDcaInfoCov.getY(); float dcaZ_lepton = mDcaInfoCov.getZ(); - float dca3D_lepton = std::hypot(dcaXY_lepton, dcaZ_lepton); + // float dca3D_lepton = std::hypot(dcaXY_lepton, dcaZ_lepton); float dca3DinSigma_lepton = dca3DinSigmaOTF(dcaXY_lepton, dcaZ_lepton, leptonParCov.getSigmaY2(), leptonParCov.getSigmaZ2(), leptonParCov.getSigmaZY()); - float sigma3D_lepton = dca3D_lepton / dca3DinSigma_lepton; + // float sigma3D_lepton = dca3D_lepton / dca3DinSigma_lepton; + + auto mcpos = pos.template mcParticle_as(); + auto mcmother = mcpos.template mothers_as()[0]; + bool isMotherFromHF = IsFromCharm(mcmother, mcParticles) || IsFromBeauty(mcmother, mcParticles); + auto mcCollision = mcpos.template mcCollision_as(); - const auto& mcpos = pos.template mcParticle_as(); + leptonTable(collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange(), mcCollision.getSubGeneratorId(), + leptonParCov.getQ2Pt(), leptonParCov.getEta(), dcaXY_lepton, dcaZ_lepton, leptonParCov.getSigmaY2(), leptonParCov.getSigmaZY(), leptonParCov.getSigmaZ2(), + isMotherFromHF, mcmother.pdgCode()); // D0 -> e+ nu_e K-, br = 0.03538, ctau = 123.01 um, m = 1864 MeV/c2 for (const auto& kaonId : kaonMinusIds) { const auto& kaon = tracks.rawIteratorAt(kaonId); mDcaInfoCov.set(999, 999, 999, 999, 999); auto trackParCov = getTrackParCov(kaon); - trackParCov.setPID(o2::track::PID::Kaon); + trackParCov.setPID(kaon.pidForTracking()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, trackParCov, 2.f, matCorr, &mDcaInfoCov); float dcaXY_kaon = mDcaInfoCov.getY(); float dcaZ_kaon = mDcaInfoCov.getZ(); - float dca3D_kaon = std::hypot(dcaXY_kaon, dcaZ_kaon); + // float dca3D_kaon = std::hypot(dcaXY_kaon, dcaZ_kaon); float dca3DinSigma_kaon = dca3DinSigmaOTF(dcaXY_kaon, dcaZ_kaon, trackParCov.getSigmaY2(), trackParCov.getSigmaZ2(), trackParCov.getSigmaZY()); - float sigma3D_kaon = dca3D_kaon / dca3DinSigma_kaon; + // float sigma3D_kaon = dca3D_kaon / dca3DinSigma_kaon; if (positronId == kaonId) { continue; } - const auto& eKpair = o2::aod::pwgem::dilepton::utils::makePairLeptonTrack(fitter_eK, collision, pos, kaon, o2::track::PID::Electron, o2::track::PID::Kaon); + const auto& eKpair = o2::aod::pwgem::dilepton::utils::makePairLeptonTrack(fitter_eK, collision, pos, kaon, o2::track::PID::Electron, kaon.pidForTracking()); if (!eKpair.isOK) { continue; } - if (!(lKPairCut.cfg_min_mass < eKpair.mass && eKpair.mass < lKPairCut.cfg_max_mass) || eKpair.cospa < lKPairCut.cfg_min_cospa || lKPairCut.cfg_max_lxyz < eKpair.lxyz / eKpair.lxyzErr || lKPairCut.cfg_max_dca2legs < eKpair.dca2legs) { + if (!(lKPairCut.cfg_min_mass < eKpair.mass && eKpair.mass < lKPairCut.cfg_max_mass) || eKpair.cospa < lKPairCut.cfg_min_cospa || lKPairCut.cfg_max_lxyz < eKpair.lxyz || lKPairCut.cfg_max_dca2legs < eKpair.dca2legs) { continue; } @@ -1189,17 +1245,20 @@ struct taggingHFE { } int mcMotherId = FindCommonMotherFrom2ProngsWithoutPDG(mcpos, mckaon); - int pdgCodeMother = 0; + bool foundCommonMother = false; + // int pdgCodeMother = 0; if (mcMotherId > -1) { - auto mcMother = mcParticles.rawIteratorAt(mcMotherId); - pdgCodeMother = mcMother.pdgCode(); + // auto mcMother = mcParticles.rawIteratorAt(mcMotherId); + // pdgCodeMother = mcMother.pdgCode(); + foundCommonMother = true; } else { - pdgCodeMother = 0; + // pdgCodeMother = 0; + foundCommonMother = false; } - emmllhpair(collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange(), - leptonParCov.getQ2Pt(), leptonParCov.getEta(), dca3D_lepton, sigma3D_lepton, - trackParCov.getQ2Pt(), trackParCov.getEta(), dca3D_kaon, sigma3D_kaon, combinedNSigmaKa(kaon), - eKpair.mass, eKpair.dca2legs, eKpair.cospa, eKpair.lxyz, eKpair.lxyzErr, mckaon.pdgCode(), pdgCodeMother); + emmllhpair(leptonTable.lastIndex(), + trackParCov.getQ2Pt(), trackParCov.getEta(), dcaXY_kaon, dcaZ_kaon, trackParCov.getSigmaY2(), trackParCov.getSigmaZY(), trackParCov.getSigmaZ2(), + kaon.tpcNSigmaKa(), kaon.tofNSigmaKa(), + eKpair.mass, eKpair.dca2legs, eKpair.cospa, eKpair.lxyz, eKpair.lxyzErr, mckaon.pdgCode(), foundCommonMother); } // end of kaon loop @@ -1212,7 +1271,7 @@ struct taggingHFE { if (!eV0pair.isOK) { continue; } - if (!(lV0PairCut.cfg_min_mass < eV0pair.mass && eV0pair.mass < lV0PairCut.cfg_max_mass) || eV0pair.cospa < lV0PairCut.cfg_min_cospa || lV0PairCut.cfg_max_lxyz < eV0pair.lxyz / eV0pair.lxyzErr || lV0PairCut.cfg_max_dca2legs < eV0pair.dca2legs) { + if (!(lV0PairCut.cfg_min_mass < eV0pair.mass && eV0pair.mass < lV0PairCut.cfg_max_mass) || eV0pair.cospa < lV0PairCut.cfg_min_cospa || lV0PairCut.cfg_max_lxyz < eV0pair.lxyz || lV0PairCut.cfg_max_dca2legs < eV0pair.dca2legs) { continue; } fRegistry.fill(HIST("Data/eK0/hs"), leptonParCov.getPt(), dca3DinSigma_lepton, v0.pt(), lxyz_v0, eV0pair.mass, eV0pair.lxyz / eV0pair.lxyzErr, eV0pair.cospa, eV0pair.dca2legs); @@ -1241,7 +1300,7 @@ struct taggingHFE { if (!eV0pair.isOK) { continue; } - if (!(lV0PairCut.cfg_min_mass < eV0pair.mass && eV0pair.mass < lV0PairCut.cfg_max_mass) || eV0pair.cospa < lV0PairCut.cfg_min_cospa || lV0PairCut.cfg_max_lxyz < eV0pair.lxyz / eV0pair.lxyzErr || lV0PairCut.cfg_max_dca2legs < eV0pair.dca2legs) { + if (!(lV0PairCut.cfg_min_mass < eV0pair.mass && eV0pair.mass < lV0PairCut.cfg_max_mass) || eV0pair.cospa < lV0PairCut.cfg_min_cospa || lV0PairCut.cfg_max_lxyz < eV0pair.lxyz || lV0PairCut.cfg_max_dca2legs < eV0pair.dca2legs) { continue; } fRegistry.fill(HIST("Data/eL/hs"), leptonParCov.getPt(), dca3DinSigma_lepton, v0.pt(), lxyz_v0, eV0pair.mass, eV0pair.lxyz / eV0pair.lxyzErr, eV0pair.cospa, eV0pair.dca2legs); @@ -1269,7 +1328,7 @@ struct taggingHFE { if (!eCpair.isOK) { continue; } - if (!(lCPairCut.cfg_min_mass < eCpair.mass && eCpair.mass < lCPairCut.cfg_max_mass) || eCpair.cospa < lCPairCut.cfg_min_cospa || lCPairCut.cfg_max_lxyz < eCpair.lxyz / eCpair.lxyzErr || lCPairCut.cfg_max_dca2legs < eCpair.dca2legs) { + if (!(lCPairCut.cfg_min_mass < eCpair.mass && eCpair.mass < lCPairCut.cfg_max_mass) || eCpair.cospa < lCPairCut.cfg_min_cospa || lCPairCut.cfg_max_lxyz < eCpair.lxyz || lCPairCut.cfg_max_dca2legs < eCpair.dca2legs) { continue; } fRegistry.fill(HIST("Data/eXi/hs"), leptonParCov.getPt(), dca3DinSigma_lepton, cascade.pt(), lxyz_cascade, eCpair.mass, eCpair.lxyz / eCpair.lxyzErr, eCpair.cospa, eCpair.dca2legs); @@ -1303,7 +1362,7 @@ struct taggingHFE { if (!eCpair.isOK) { continue; } - if (!(lCPairCut.cfg_min_mass < eCpair.mass && eCpair.mass < lCPairCut.cfg_max_mass) || eCpair.cospa < lCPairCut.cfg_min_cospa || lCPairCut.cfg_max_lxyz < eCpair.lxyz / eCpair.lxyzErr || lCPairCut.cfg_max_dca2legs < eCpair.dca2legs) { + if (!(lCPairCut.cfg_min_mass < eCpair.mass && eCpair.mass < lCPairCut.cfg_max_mass) || eCpair.cospa < lCPairCut.cfg_min_cospa || lCPairCut.cfg_max_lxyz < eCpair.lxyz || lCPairCut.cfg_max_dca2legs < eCpair.dca2legs) { continue; } fRegistry.fill(HIST("Data/eOmega/hs"), leptonParCov.getPt(), dca3DinSigma_lepton, cascade.pt(), lxyz_cascade, eCpair.mass, eCpair.lxyz / eCpair.lxyzErr, eCpair.cospa, eCpair.dca2legs); @@ -1339,34 +1398,41 @@ struct taggingHFE { o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, leptonParCov, 2.f, matCorr, &mDcaInfoCov); float dcaXY_lepton = mDcaInfoCov.getY(); float dcaZ_lepton = mDcaInfoCov.getZ(); - float dca3D_lepton = std::hypot(dcaXY_lepton, dcaZ_lepton); + // float dca3D_lepton = std::hypot(dcaXY_lepton, dcaZ_lepton); float dca3DinSigma_lepton = dca3DinSigmaOTF(dcaXY_lepton, dcaZ_lepton, leptonParCov.getSigmaY2(), leptonParCov.getSigmaZ2(), leptonParCov.getSigmaZY()); - float sigma3D_lepton = dca3D_lepton / dca3DinSigma_lepton; + // float sigma3D_lepton = dca3D_lepton / dca3DinSigma_lepton; - const auto& mcele = ele.template mcParticle_as(); + auto mcele = ele.template mcParticle_as(); + auto mcmother = mcele.template mothers_as()[0]; + bool isMotherFromHF = IsFromCharm(mcmother, mcParticles) || IsFromBeauty(mcmother, mcParticles); + auto mcCollision = mcele.template mcCollision_as(); + + leptonTable(collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange(), mcCollision.getSubGeneratorId(), + leptonParCov.getQ2Pt(), leptonParCov.getEta(), dcaXY_lepton, dcaZ_lepton, leptonParCov.getSigmaY2(), leptonParCov.getSigmaZY(), leptonParCov.getSigmaZ2(), + isMotherFromHF, mcmother.pdgCode()); // D0bar -> e- anti-nu_e K+, br = 0.03538, ctau = 123.01 um, m = 1864 MeV/c2 for (const auto& kaonId : kaonPlusIds) { const auto& kaon = tracks.rawIteratorAt(kaonId); mDcaInfoCov.set(999, 999, 999, 999, 999); auto trackParCov = getTrackParCov(kaon); - trackParCov.setPID(o2::track::PID::Kaon); + trackParCov.setPID(kaon.pidForTracking()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, trackParCov, 2.f, matCorr, &mDcaInfoCov); float dcaXY_kaon = mDcaInfoCov.getY(); float dcaZ_kaon = mDcaInfoCov.getZ(); - float dca3D_kaon = std::hypot(dcaXY_kaon, dcaZ_kaon); + // float dca3D_kaon = std::hypot(dcaXY_kaon, dcaZ_kaon); float dca3DinSigma_kaon = dca3DinSigmaOTF(dcaXY_kaon, dcaZ_kaon, trackParCov.getSigmaY2(), trackParCov.getSigmaZ2(), trackParCov.getSigmaZY()); - float sigma3D_kaon = dca3D_kaon / dca3DinSigma_kaon; + // float sigma3D_kaon = dca3D_kaon / dca3DinSigma_kaon; if (electronId == kaonId) { continue; } - const auto& eKpair = o2::aod::pwgem::dilepton::utils::makePairLeptonTrack(fitter_eK, collision, ele, kaon, o2::track::PID::Electron, o2::track::PID::Kaon); + const auto& eKpair = o2::aod::pwgem::dilepton::utils::makePairLeptonTrack(fitter_eK, collision, ele, kaon, o2::track::PID::Electron, kaon.pidForTracking()); if (!eKpair.isOK) { continue; } - if (!(lKPairCut.cfg_min_mass < eKpair.mass && eKpair.mass < lKPairCut.cfg_max_mass) || eKpair.cospa < lKPairCut.cfg_min_cospa || lKPairCut.cfg_max_lxyz < eKpair.lxyz / eKpair.lxyzErr || lKPairCut.cfg_max_dca2legs < eKpair.dca2legs) { + if (!(lKPairCut.cfg_min_mass < eKpair.mass && eKpair.mass < lKPairCut.cfg_max_mass) || eKpair.cospa < lKPairCut.cfg_min_cospa || lKPairCut.cfg_max_lxyz < eKpair.lxyz || lKPairCut.cfg_max_dca2legs < eKpair.dca2legs) { continue; } fRegistry.fill(HIST("Data/eK/hs"), leptonParCov.getPt(), dca3DinSigma_lepton, trackParCov.getPt(), dca3DinSigma_kaon, eKpair.mass, eKpair.lxyz / eKpair.lxyzErr, eKpair.cospa, eKpair.dca2legs); @@ -1383,17 +1449,21 @@ struct taggingHFE { } int mcMotherId = FindCommonMotherFrom2ProngsWithoutPDG(mcele, mckaon); - int pdgCodeMother = 0; + bool foundCommonMother = false; + // int pdgCodeMother = 0; if (mcMotherId > -1) { - auto mcMother = mcParticles.rawIteratorAt(mcMotherId); - pdgCodeMother = mcMother.pdgCode(); + // auto mcMother = mcParticles.rawIteratorAt(mcMotherId); + // pdgCodeMother = mcMother.pdgCode(); + foundCommonMother = true; } else { - pdgCodeMother = 0; + // pdgCodeMother = 0; + foundCommonMother = false; } - emmllhpair(collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange(), - leptonParCov.getQ2Pt(), leptonParCov.getEta(), dca3D_lepton, sigma3D_lepton, - trackParCov.getQ2Pt(), trackParCov.getEta(), dca3D_kaon, sigma3D_kaon, combinedNSigmaKa(kaon), - eKpair.mass, eKpair.dca2legs, eKpair.cospa, eKpair.lxyz, eKpair.lxyzErr, mckaon.pdgCode(), pdgCodeMother); + + emmllhpair(leptonTable.lastIndex(), + trackParCov.getQ2Pt(), trackParCov.getEta(), dcaXY_kaon, dcaZ_kaon, trackParCov.getSigmaY2(), trackParCov.getSigmaZY(), trackParCov.getSigmaZ2(), + kaon.tpcNSigmaKa(), kaon.tofNSigmaKa(), + eKpair.mass, eKpair.dca2legs, eKpair.cospa, eKpair.lxyz, eKpair.lxyzErr, mckaon.pdgCode(), foundCommonMother); } // end of kaon loop @@ -1406,7 +1476,7 @@ struct taggingHFE { if (!eV0pair.isOK) { continue; } - if (!(lV0PairCut.cfg_min_mass < eV0pair.mass && eV0pair.mass < lV0PairCut.cfg_max_mass) || eV0pair.cospa < lV0PairCut.cfg_min_cospa || lV0PairCut.cfg_max_lxyz < eV0pair.lxyz / eV0pair.lxyzErr || lV0PairCut.cfg_max_dca2legs < eV0pair.dca2legs) { + if (!(lV0PairCut.cfg_min_mass < eV0pair.mass && eV0pair.mass < lV0PairCut.cfg_max_mass) || eV0pair.cospa < lV0PairCut.cfg_min_cospa || lV0PairCut.cfg_max_lxyz < eV0pair.lxyz || lV0PairCut.cfg_max_dca2legs < eV0pair.dca2legs) { continue; } fRegistry.fill(HIST("Data/eK0/hs"), leptonParCov.getPt(), dca3DinSigma_lepton, v0.pt(), lxyz_v0, eV0pair.mass, eV0pair.lxyz / eV0pair.lxyzErr, eV0pair.cospa, eV0pair.dca2legs); @@ -1435,7 +1505,7 @@ struct taggingHFE { if (!eV0pair.isOK) { continue; } - if (!(lV0PairCut.cfg_min_mass < eV0pair.mass && eV0pair.mass < lV0PairCut.cfg_max_mass) || eV0pair.cospa < lV0PairCut.cfg_min_cospa || lV0PairCut.cfg_max_lxyz < eV0pair.lxyz / eV0pair.lxyzErr || lV0PairCut.cfg_max_dca2legs < eV0pair.dca2legs) { + if (!(lV0PairCut.cfg_min_mass < eV0pair.mass && eV0pair.mass < lV0PairCut.cfg_max_mass) || eV0pair.cospa < lV0PairCut.cfg_min_cospa || lV0PairCut.cfg_max_lxyz < eV0pair.lxyz || lV0PairCut.cfg_max_dca2legs < eV0pair.dca2legs) { continue; } fRegistry.fill(HIST("Data/eL/hs"), leptonParCov.getPt(), dca3DinSigma_lepton, v0.pt(), lxyz_v0, eV0pair.mass, eV0pair.lxyz / eV0pair.lxyzErr, eV0pair.cospa, eV0pair.dca2legs); @@ -1463,7 +1533,7 @@ struct taggingHFE { if (!eCpair.isOK) { continue; } - if (!(lCPairCut.cfg_min_mass < eCpair.mass && eCpair.mass < lCPairCut.cfg_max_mass) || eCpair.cospa < lCPairCut.cfg_min_cospa || lCPairCut.cfg_max_lxyz < eCpair.lxyz / eCpair.lxyzErr || lCPairCut.cfg_max_dca2legs < eCpair.dca2legs) { + if (!(lCPairCut.cfg_min_mass < eCpair.mass && eCpair.mass < lCPairCut.cfg_max_mass) || eCpair.cospa < lCPairCut.cfg_min_cospa || lCPairCut.cfg_max_lxyz < eCpair.lxyz || lCPairCut.cfg_max_dca2legs < eCpair.dca2legs) { continue; } fRegistry.fill(HIST("Data/eXi/hs"), leptonParCov.getPt(), dca3DinSigma_lepton, cascade.pt(), lxyz_cascade, eCpair.mass, eCpair.lxyz / eCpair.lxyzErr, eCpair.cospa, eCpair.dca2legs); @@ -1497,7 +1567,7 @@ struct taggingHFE { if (!eCpair.isOK) { continue; } - if (!(lCPairCut.cfg_min_mass < eCpair.mass && eCpair.mass < lCPairCut.cfg_max_mass) || eCpair.cospa < lCPairCut.cfg_min_cospa || lCPairCut.cfg_max_lxyz < eCpair.lxyz / eCpair.lxyzErr || lCPairCut.cfg_max_dca2legs < eCpair.dca2legs) { + if (!(lCPairCut.cfg_min_mass < eCpair.mass && eCpair.mass < lCPairCut.cfg_max_mass) || eCpair.cospa < lCPairCut.cfg_min_cospa || lCPairCut.cfg_max_lxyz < eCpair.lxyz || lCPairCut.cfg_max_dca2legs < eCpair.dca2legs) { continue; } fRegistry.fill(HIST("Data/eOmega/hs"), leptonParCov.getPt(), dca3DinSigma_lepton, cascade.pt(), lxyz_cascade, eCpair.mass, eCpair.lxyz / eCpair.lxyzErr, eCpair.cospa, eCpair.dca2legs); @@ -1653,7 +1723,7 @@ struct taggingHFE { Preslice perCol_casc = o2::aod::cascdata::collisionId; Preslice perMcCollision = aod::mcparticle::mcCollisionId; - Filter collisionFilter_evsel = o2::aod::evsel::sel8 == true && (eventCut.cfgZvtxMin < o2::aod::collision::posZ && o2::aod::collision::posZ < eventCut.cfgZvtxMax); + Filter collisionFilter_evsel = eventCut.cfgZvtxMin < o2::aod::collision::posZ && o2::aod::collision::posZ < eventCut.cfgZvtxMax; Filter collisionFilter_centrality = (eventCut.cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < eventCut.cfgCentMax) || (eventCut.cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < eventCut.cfgCentMax) || (eventCut.cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < eventCut.cfgCentMax); using FilteredMyCollisions = soa::Filtered; using FilteredMyCollisionsWithMCLabel = soa::Filtered; diff --git a/PWGEM/Dilepton/Utils/SemiCharmTag.h b/PWGEM/Dilepton/Utils/SemiCharmTag.h index ef211ccbef5..dafc1bf2de2 100644 --- a/PWGEM/Dilepton/Utils/SemiCharmTag.h +++ b/PWGEM/Dilepton/Utils/SemiCharmTag.h @@ -110,14 +110,14 @@ LHPair makePairLeptonTrack(TFitter& fitter, TCollision const& collision, TLepton return pair; } - ROOT::Math::PxPyPzMVector v2(pvec1[0], pvec1[1], pvec1[2], o2::constants::physics::MassKaonCharged); - if (strHadId == o2::track::PID::Kaon) { - v2.SetM(o2::constants::physics::MassKaonCharged); - } else { - LOGF(info, "strHadId supports only Kaon."); - pair.isOK = false; - return pair; - } + ROOT::Math::PxPyPzMVector v2(pvec1[0], pvec1[1], pvec1[2], o2::constants::physics::MassPionCharged); + // if (strHadId == o2::track::PID::Kaon) { + // v2.SetM(o2::constants::physics::MassPionCharged); + // } else { + // LOGF(info, "strHadId supports only Kaon."); + // pair.isOK = false; + // return pair; + // } ROOT::Math::PxPyPzMVector v12 = v1 + v2;