1717// / \author Ran Tu <ran.tu@cern.ch>, Fudan University
1818
1919#include " PWGHF/Core/CentralityEstimation.h"
20+ #include " PWGHF/Core/DecayChannels.h"
2021#include " PWGHF/Core/HfHelper.h"
2122#include " PWGHF/Core/SelectorCuts.h"
2223#include " PWGHF/DataModel/AliasTables.h"
2829#include " PWGUD/Core/SGSelector.h"
2930#include " PWGUD/Core/UPCHelpers.h"
3031
32+ #include " Common/Core/RecoDecay.h"
3133#include " Common/DataModel/EventSelection.h"
3234#include " Common/DataModel/Multiplicity.h"
3335
3436#include < CCDB/BasicCCDBManager.h>
37+ #include < CommonConstants/PhysicsConstants.h>
3538#include < CommonDataFormat/TimeStamp.h>
3639#include < Framework/ASoA.h>
3740#include < Framework/AnalysisDataModel.h>
@@ -126,6 +129,10 @@ DECLARE_SOA_TABLE(HfUpcLcMcInfos, "AOD", "HFUPCLCMCINFO",
126129 full::FlagMcMatchRec,
127130 full::OriginMcRec,
128131 full::PtBhadMotherPart);
132+ DECLARE_SOA_TABLE (HfUpcLcMcGen, " AOD" , " HFUPCLCMCGEN" ,
133+ full::Pt,
134+ hf_cand_mc_flag::FlagMcMatchGen,
135+ hf_cand_mc_flag::OriginMcGen);
129136} // namespace o2::aod
130137
131138// / Λc± → p± K∓ π± analysis task
@@ -134,12 +141,14 @@ struct HfTaskUpcLc {
134141 Produces<o2::aod::HfUpcLcInfos> rowCandUpc;
135142 Produces<o2::aod::HfUpcLcMcBdtInfos> rowCandUpcMcBdt;
136143 Produces<o2::aod::HfUpcLcMcInfos> rowCandUpcMc;
144+ Produces<o2::aod::HfUpcLcMcGen> rowLcMcGen;
137145 Produces<o2::aod::HfUpcQa> rowUpcQa;
138146
139147 Configurable<int > selectionFlagLc{" selectionFlagLc" , 1 , " Selection Flag for Lc" };
140148 Configurable<double > yCandRecoMax{" yCandRecoMax" , 0.8 , " max. cand. rapidity" };
141149 Configurable<std::vector<double >> binsPt{" binsPt" , std::vector<double >{hf_cuts_lc_to_p_k_pi::vecBinsPt}, " pT bin limits" };
142150 Configurable<bool > fillTreeOnlySingleGap{" fillTreeOnlySingleGap" , false , " Only fill the tree for candidates that pass the single-gap UPC events" };
151+ Configurable<bool > fillMcGenLcTree{" fillMcGenLcTree" , false , " Fill the generated Lc to p K pi tree" };
143152 Configurable<bool > fillTreeUpcQa{" fillTreeUpcQa" , false , " Fill Tree for UPC QA" };
144153 Configurable<bool > fillHistQa{" fillHistQa" , false , " Fill histograms for UPC detector QA" };
145154 Configurable<bool > verticesWithUpc{" verticesWithUpc" , false , " Consider vertices with UPC settings" };
@@ -211,10 +220,22 @@ struct HfTaskUpcLc {
211220 BCsType const & bcs,
212221 aod::FT0s const & ft0s,
213222 aod::FV0As const & fv0as,
214- aod::FDDs const & fdds
215-
216- )
223+ aod::FDDs const & fdds,
224+ soa::Join<aod::McParticles, aod::HfCand3ProngMcGen> const * mcParticles = nullptr )
217225 {
226+ if constexpr (IsMc) {
227+ if (fillMcGenLcTree) {
228+ for (const auto & particle : *mcParticles) {
229+ if (std::abs (particle.flagMcMatchGen ()) != hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) {
230+ continue ;
231+ }
232+ if (yCandRecoMax >= 0 . && std::abs (RecoDecay::y (particle.pVector (), o2::constants::physics::MassLambdaCPlus)) > yCandRecoMax) {
233+ continue ;
234+ }
235+ rowLcMcGen (particle.pt (), particle.flagMcMatchGen (), particle.originMcGen ());
236+ }
237+ }
238+ }
218239 for (const auto & collision : collisions) {
219240 float centrality{-1 .f };
220241 const auto rejectionMask = hfEvSel.getHfCollisionRejectionMaskWithUpc <true , CentralityEstimator::None, BCsType>(collision, centrality, ccdb, registry, bcs);
@@ -397,27 +418,29 @@ struct HfTaskUpcLc {
397418 aod::BcFullInfos const & bcs,
398419 LcCandidatesMlMc const & selectedLcCandidatesMlMc,
399420 aod::McCollisions const &,
421+ soa::Join<aod::McParticles, aod::HfCand3ProngMcGen> const & mcParticles,
400422 aod::TracksWMc const &,
401423 aod::FT0s const & ft0s,
402424 aod::FV0As const & fv0as,
403425 aod::FDDs const & fdds,
404426 aod::Zdcs const & /* zdcs*/ )
405427 {
406- runAnalysisPerCollisionWithUpc<true , true >(collisions, selectedLcCandidatesMlMc, bcs, ft0s, fv0as, fdds);
428+ runAnalysisPerCollisionWithUpc<true , true >(collisions, selectedLcCandidatesMlMc, bcs, ft0s, fv0as, fdds, &mcParticles );
407429 }
408430 PROCESS_SWITCH (HfTaskUpcLc, processMcWithMlWithUpc, " Process MC with the ML method with UPC" , false );
409431
410432 void processMcStdWithUpc (soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::Mults> const & collisions,
411433 aod::BcFullInfos const & bcs,
412434 LcCandidatesMc const & selectedLcCandidatesMc,
413435 aod::McCollisions const &,
436+ soa::Join<aod::McParticles, aod::HfCand3ProngMcGen> const & mcParticles,
414437 aod::TracksWMc const &,
415438 aod::FT0s const & ft0s,
416439 aod::FV0As const & fv0as,
417440 aod::FDDs const & fdds,
418441 aod::Zdcs const & /* zdcs*/ )
419442 {
420- runAnalysisPerCollisionWithUpc<false , true >(collisions, selectedLcCandidatesMc, bcs, ft0s, fv0as, fdds);
443+ runAnalysisPerCollisionWithUpc<false , true >(collisions, selectedLcCandidatesMc, bcs, ft0s, fv0as, fdds, &mcParticles );
421444 }
422445 PROCESS_SWITCH (HfTaskUpcLc, processMcStdWithUpc, " Process MC with the standard method with UPC" , false );
423446};
0 commit comments