diff --git a/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx b/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx index b696c6b6412..043b0f480a0 100644 --- a/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx +++ b/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx @@ -174,10 +174,10 @@ struct HfTaskCharmHadronsV0FemtoDream { using FilteredCollisions = soa::Filtered>; using FilteredCollision = FilteredCollisions::iterator; - using FilteredMcColisions = soa::Filtered>; - using FilteredMcColision = FilteredMcColisions::iterator; + using FilteredMcCollisions = soa::Filtered>; + using FilteredMcColision = FilteredMcCollisions::iterator; - using FilteredFDMcParts = soa::Filtered>; + using FilteredFDMcParts = soa::Filtered>; using FilteredFDMcPart = FilteredFDMcParts::iterator; using FDV0Particles = soa::Join; @@ -189,11 +189,12 @@ struct HfTaskCharmHadronsV0FemtoDream { Filter hfMcSelFilter = (nabs(aod::fdhf::flagMc) == charmSel.charmHadMcSel); Preslice perCol = aod::femtodreamparticle::fdCollisionId; + Preslice perColMc = aod::femtodreamparticle::fdCollisionId; Preslice perHf3ProngByCol = aod::femtodreamparticle::fdCollisionId; Preslice perHf2ProngByCol = aod::femtodreamparticle::fdCollisionId; Preslice perHfDstarByCol = aod::femtodreamparticle::fdCollisionId; - /// Partition for particle Lambda + /// Partitions for particle Lambda Partition partitionLambda = (aod::femtodreamparticle::partType == uint8_t(aod::femtodreamparticle::ParticleType::kV0)) && ((aod::femtodreamparticle::cut & v0Sel.cutBit) == v0Sel.cutBit) && (aod::femtodreamparticle::pt > v0Sel.ptV0Min) && @@ -205,7 +206,18 @@ struct HfTaskCharmHadronsV0FemtoDream { (aod::femtodreamparticle::mAntiLambda > v0Sel.invMassAntiV0Min) && (aod::femtodreamparticle::mAntiLambda < v0Sel.invMassAntiV0Max); - /// Partition for particle K0Short + Partition partitionMcLambda = (aod::femtodreamparticle::partType == uint8_t(aod::femtodreamparticle::ParticleType::kV0)) && + ((aod::femtodreamparticle::cut & v0Sel.cutBit) == v0Sel.cutBit) && + (aod::femtodreamparticle::pt > v0Sel.ptV0Min) && + (aod::femtodreamparticle::pt < v0Sel.ptV0Max) && + (aod::femtodreamparticle::eta > v0Sel.etaV0Min) && + (aod::femtodreamparticle::eta < v0Sel.etaV0Max) && + (aod::femtodreamparticle::mLambda > v0Sel.invMassV0Min) && + (aod::femtodreamparticle::mLambda < v0Sel.invMassV0Max) && + (aod::femtodreamparticle::mAntiLambda > v0Sel.invMassAntiV0Min) && + (aod::femtodreamparticle::mAntiLambda < v0Sel.invMassAntiV0Max); + + /// Partitions for particle K0Short Partition partitionK0Short = (aod::femtodreamparticle::partType == uint8_t(aod::femtodreamparticle::ParticleType::kV0K0Short)) && ((aod::femtodreamparticle::cut & v0Sel.cutBit) == v0Sel.cutBit) && (aod::femtodreamparticle::pt > v0Sel.ptV0Min) && @@ -217,6 +229,17 @@ struct HfTaskCharmHadronsV0FemtoDream { (aod::femtodreamparticle::mAntiLambda > v0Sel.invMassAntiV0Min) && (aod::femtodreamparticle::mAntiLambda < v0Sel.invMassAntiV0Max); + Partition partitionMcK0Short = (aod::femtodreamparticle::partType == uint8_t(aod::femtodreamparticle::ParticleType::kV0K0Short)) && + ((aod::femtodreamparticle::cut & v0Sel.cutBit) == v0Sel.cutBit) && + (aod::femtodreamparticle::pt > v0Sel.ptV0Min) && + (aod::femtodreamparticle::pt < v0Sel.ptV0Max) && + (aod::femtodreamparticle::eta > v0Sel.etaV0Min) && + (aod::femtodreamparticle::eta < v0Sel.etaV0Max) && + (aod::femtodreamparticle::mLambda > v0Sel.invMassV0Min) && + (aod::femtodreamparticle::mLambda < v0Sel.invMassV0Max) && + (aod::femtodreamparticle::mAntiLambda > v0Sel.invMassAntiV0Min) && + (aod::femtodreamparticle::mAntiLambda < v0Sel.invMassAntiV0Max); + /// Partition for particle 2 Partition partitionCharmHadron3Prong = aod::fdhf::bdtBkg < charmSel.charmHadBkgBDTmax && aod::fdhf::bdtFD < charmSel.charmHadFdBDTmax && aod::fdhf::bdtFD > charmSel.charmHadFdBDTmin&& aod::fdhf::bdtPrompt charmSel.charmHadPromptBDTmin; Partition partitionCharmHadron2Prong = aod::fdhf::bdtBkg < charmSel.charmHadBkgBDTmax && aod::fdhf::bdtFD < charmSel.charmHadFdBDTmax && aod::fdhf::bdtFD > charmSel.charmHadFdBDTmin&& aod::fdhf::bdtPrompt charmSel.charmHadPromptBDTmin; @@ -381,10 +404,9 @@ struct HfTaskCharmHadronsV0FemtoDream { if (cand.candidateSelFlag() == 1) { invMass = cand.m(std::array{MassPiPlus, MassKPlus}); return invMass; - } else { - invMass = cand.m(std::array{MassKPlus, MassPiPlus}); - return invMass; } + invMass = cand.m(std::array{MassKPlus, MassPiPlus}); + return invMass; } else if constexpr (Channel == DecayChannel::DstarToD0Pi) { // D* → D0π (PDG: 413) float mDstar = 0.f; float mD0 = 0.f; @@ -397,9 +419,8 @@ struct HfTaskCharmHadronsV0FemtoDream { } if (ReturnDaughMass) { return mD0; - } else { - return mDstar - mD0; } + return mDstar - mD0; } // Add more channels as needed return 0.f; @@ -502,7 +523,7 @@ struct HfTaskCharmHadronsV0FemtoDream { } template - void doMixedEvent(CollisionType const& cols, PartitionType1& charms, PartitionType2& v0s, FDParticles const& /*femtoParts*/, BinningType policy) + void doMixedEvent(CollisionType const& cols, PartitionType1& charms, PartitionType2& v0s, FDParticles const& /*femtoParts*/, BinningType const& policy) { processType = 2; // for mixed event // Mixed events that contain the pair of interest @@ -717,9 +738,9 @@ struct HfTaskCharmHadronsV0FemtoDream { } } - template - void runMixing(FilteredCollisions const& cols, - FDV0Particles const& parts, + template + void runMixing(Cols const& cols, + V0Part const& parts, CharmPart& charmPart) { if (!mixSetting.doMixEvent) { @@ -728,13 +749,25 @@ struct HfTaskCharmHadronsV0FemtoDream { auto run = [&](auto& v0Part) { switch (mixSetting.mixingBinPolicy) { case femtodreamcollision::kMult: - doMixedEvent(cols, charmPart, v0Part, parts, colBinningMult); + if constexpr (IsMc) { + doMixedEvent(cols, charmPart, v0Part, parts, colBinningMult); + } else { + doMixedEvent(cols, charmPart, v0Part, parts, colBinningMult); + } break; case femtodreamcollision::kMultPercentile: - doMixedEvent(cols, charmPart, v0Part, parts, colBinningMultPercentile); + if constexpr (IsMc) { + doMixedEvent(cols, charmPart, v0Part, parts, colBinningMultPercentile); + } else { + doMixedEvent(cols, charmPart, v0Part, parts, colBinningMultPercentile); + } break; case femtodreamcollision::kMultMultPercentile: - doMixedEvent(cols, charmPart, v0Part, parts, colBinningMultMultPercentile); + if constexpr (IsMc) { + doMixedEvent(cols, charmPart, v0Part, parts, colBinningMultMultPercentile); + } else { + doMixedEvent(cols, charmPart, v0Part, parts, colBinningMultMultPercentile); + } break; default: LOG(fatal) << "Invalid binning policiy specifed. Breaking..."; @@ -742,9 +775,17 @@ struct HfTaskCharmHadronsV0FemtoDream { }; if (v0Sel.pdgCodeV0 == kLambda0) { - run(partitionLambda); + if constexpr (IsMc) { + run(partitionMcLambda); + } else { + run(partitionLambda); + } } else if (v0Sel.pdgCodeV0 == kK0Short) { - run(partitionK0Short); + if constexpr (IsMc) { + run(partitionMcK0Short); + } else { + run(partitionK0Short); + } } else { LOG(fatal) << "Unsupported V0 PDG: " << v0Sel.pdgCodeV0 << " (allowed: 3122, 310) for mixed-events"; } @@ -781,7 +822,7 @@ struct HfTaskCharmHadronsV0FemtoDream { LOG(fatal) << "Unsupported V0 PDG: " << v0Sel.pdgCodeV0 << " (allowed: 3122, 310) for same events"; } } - runMixing(cols, parts, partitionCharmHadron3Prong); + runMixing(cols, parts, partitionCharmHadron3Prong); } PROCESS_SWITCH(HfTaskCharmHadronsV0FemtoDream, processDataLcV0, "Enable processing LcToPKPi and V0 correlation", false); @@ -815,7 +856,7 @@ struct HfTaskCharmHadronsV0FemtoDream { LOG(fatal) << "Unsupported V0 PDG: " << v0Sel.pdgCodeV0 << " (allowed: 3122, 310)"; } } - runMixing(cols, parts, partitionCharmHadron3Prong); + runMixing(cols, parts, partitionCharmHadron3Prong); } PROCESS_SWITCH(HfTaskCharmHadronsV0FemtoDream, processDataDplusV0, "Enable processing DplusToPiKPi and V0 correlation", false); @@ -849,7 +890,7 @@ struct HfTaskCharmHadronsV0FemtoDream { LOG(fatal) << "Unsupported V0 PDG: " << v0Sel.pdgCodeV0 << " (allowed: 3122, 310)"; } } - runMixing(cols, parts, partitionCharmHadron2Prong); + runMixing(cols, parts, partitionCharmHadron2Prong); } PROCESS_SWITCH(HfTaskCharmHadronsV0FemtoDream, processDataD0V0, "Enable processing D0ToPiK and V0 correlation", false); @@ -884,9 +925,43 @@ struct HfTaskCharmHadronsV0FemtoDream { LOG(fatal) << "Unsupported V0 PDG: " << v0Sel.pdgCodeV0 << " (allowed: 3122, 310)"; } } - runMixing(cols, parts, partitionCharmHadronDstar); + runMixing(cols, parts, partitionCharmHadronDstar); } PROCESS_SWITCH(HfTaskCharmHadronsV0FemtoDream, processDataDstarV0, "Enable processing DstarToD0Pi and V0 correlation", false); + + void processMcDplusV0(FilteredMcCollisions const& cols, + FilteredFDMcParts const& parts, + o2::aod::FDMCParticles const&, + o2::aod::FDExtMCParticles const&, + FilteredCharmMcCand3Prongs const&) + { + for (const auto& col : cols) { + eventHisto.fillQA(col); + auto sliceMcCharmHad = partitionMcCharmHadron3Prong->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); + if (fillTableWithCharm.value && sliceMcCharmHad.size() == 0) { + continue; + } + if (v0Sel.pdgCodeV0 == kLambda0) { + auto sliceMcV0 = partitionMcLambda->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); + fillTables(col, sliceMcV0, sliceMcCharmHad, parts); + if (sliceMcCharmHad.size() > 0 && sliceMcV0.size() > 0) { + doSameEvent(sliceMcCharmHad, sliceMcV0, parts, col); + } + + } else if (v0Sel.pdgCodeV0 == kK0Short) { + auto sliceMcV0 = partitionMcK0Short->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); + fillTables(col, sliceMcV0, sliceMcCharmHad, parts); + + if (sliceMcCharmHad.size() > 0 && sliceMcV0.size() > 0) { + doSameEvent(sliceMcCharmHad, sliceMcV0, parts, col); + } + } else { + LOG(fatal) << "Unsupported V0 PDG: " << v0Sel.pdgCodeV0 << " (allowed: 3122, 310)"; + } + } + runMixing(cols, parts, partitionMcCharmHadron3Prong); + } + PROCESS_SWITCH(HfTaskCharmHadronsV0FemtoDream, processMcDplusV0, "Enable processing DplusToPiKPi and V0 correlation for Monte Carlo", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)