1212// / \file taskOmegac0ToOmegapi.cxx
1313// / \brief OmegaC0 analysis task
1414// / \author Yunfan Liu <yunfan.liu@cern.ch>, China University of Geosciences
15+ // / \author Fabio Catalano <fabio.catalano@cern.ch>, University of Houston
1516
1617#include < vector>
1718
@@ -36,28 +37,33 @@ using namespace o2::framework::expressions;
3637struct HfTaskOmegac0ToOmegapi {
3738 // ML inference
3839 Configurable<bool > applyMl{" applyMl" , false , " Flag to apply ML selections" };
39- Configurable<bool > selectionFlagOmegac0{" selectionFlagOmegac0" , false , " Selection Flag for Omegac0 candidates" };
40+ Configurable<bool > selectionFlagOmegac0{" selectionFlagOmegac0" , true , " Select Omegac0 candidates" };
4041 Configurable<double > yCandGenMax{" yCandGenMax" , 0.5 , " max. gen particle rapidity" };
4142 Configurable<double > yCandRecoMax{" yCandRecoMax" , 0.8 , " max. cand. rapidity" };
4243
4344 HfHelper hfHelper;
4445 SliceCache cache;
45- using MyTracksWMc = soa::Join<aod::Tracks, aod::TracksIU, aod::McTrackLabels>;
4646
47- using Omegac0Candidates = soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi>;
48- using Omegac0CandidatesKF = soa::Join<Omegac0Candidates, aod::HfOmegacKf>;
49- using OmegaC0CandidatesMcKF = soa::Join<Omegac0CandidatesKF, aod::HfToOmegaPiMCRec>;
47+ using TracksMc = soa::Join<aod::Tracks, aod::TracksIU, aod::McTrackLabels>;
5048
51- using Omegac0CandidatesMl = soa::Join<Omegac0Candidates, aod::HfMlSelOmegacToOmegaPi>;
52- using Omegac0CandidatesMlKF = soa::Join<Omegac0CandidatesMl, aod::HfOmegacKf>;
53- using Omegac0CandidatesMlMcKF = soa::Join<Omegac0CandidatesMlKF, aod::HfToOmegaPiMCRec>;
49+ using Omegac0Cands = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi>>;
50+ using Omegac0CandsKF = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfOmegacKf>>;
51+ using OmegaC0CandsMcKF = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfOmegacKf, aod::HfToOmegaPiMCRec>>;
52+
53+ using Omegac0CandsMl = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfMlSelOmegacToOmegaPi>>;
54+ using Omegac0CandsMlKF = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfMlSelOmegacToOmegaPi, aod::HfOmegacKf>>;
55+ using Omegac0CandsMlMcKF = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfMlSelOmegacToOmegaPi, aod::HfOmegacKf, aod::HfToOmegaPiMCRec>>;
56+
57+ using Omegac0Gen = soa::Filtered<soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen>>;
5458
5559 using Collisions = soa::Join<aod::Collisions, aod::EvSels>;
5660 using CollisionsWithMcLabels = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels>;
57- PresliceUnsorted<CollisionsWithMcLabels> colPerMcCollision = aod::mccollisionlabel::mcCollisionId;
5861
59- Partition<Omegac0CandidatesKF> selectedOmegac0CandidatesKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0;
60- Partition<Omegac0CandidatesMlKF> selectedOmegac0CandidatesMlKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0;
62+ Filter filterOmegaCToOmegaPiFlag = (aod::hf_track_index::hfflag & static_cast <uint8_t >(BIT(aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi))) != static_cast <uint8_t >(0 );
63+ Filter filterOmegaCMatchedRec = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchRec) == static_cast <int8_t >(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi));
64+ Filter filterOmegaCMatchedGen = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchGen) == static_cast <int8_t >(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi));
65+
66+ PresliceUnsorted<CollisionsWithMcLabels> colPerMcCollision = aod::mccollisionlabel::mcCollisionId;
6167
6268 // ThnSparse for ML outputScores and Vars
6369 ConfigurableAxis thnConfigAxisPromptScore{" thnConfigAxisPromptScore" , {50 , 0 , 1 }, " Prompt score bins" };
@@ -70,18 +76,16 @@ struct HfTaskOmegac0ToOmegapi {
7076 ConfigurableAxis thnConfigAxisGenPtD{" thnConfigAxisGenPtD" , {500 , 0 , 50 }, " Gen Pt D" };
7177 ConfigurableAxis thnConfigAxisGenPtB{" thnConfigAxisGenPtB" , {1000 , 0 , 100 }, " Gen Pt B" };
7278 ConfigurableAxis thnConfigAxisNumPvContr{" thnConfigAxisNumPvContr" , {200 , -0.5 , 199.5 }, " Number of PV contributors" };
73- HistogramRegistry registry{
74- " registry" ,
75- {}};
79+ HistogramRegistry registry{" registry" , {}};
7680
7781 void init (InitContext&)
7882 {
79- std::array<bool , 12 > doprocess{doprocessDataWithKFParticle, doprocessMcWithKFParticle, doprocessDataWithKFParticleMl, doprocessMcWithKFParticleMl};
83+ std::array<bool , 4 > doprocess{doprocessDataWithKFParticle, doprocessMcWithKFParticle, doprocessDataWithKFParticleMl, doprocessMcWithKFParticleMl};
8084 if ((std::accumulate (doprocess.begin (), doprocess.end (), 0 )) != 1 ) {
8185 LOGP (fatal, " One and only one process function should be enabled at a time." );
8286 }
8387
84- const AxisSpec thnAxisMass{thnConfigAxisMass, " inv. mass (#Omega #pi) (GeV/#it{c}^{2})" };
88+ const AxisSpec thnAxisMass{thnConfigAxisMass, " inv. mass (#Omega#pi) (GeV/#it{c}^{2})" };
8589 const AxisSpec thnAxisPt{thnConfigAxisPt, " #it{p}_{T} (GeV/#it{c})" };
8690 const AxisSpec thnAxisPtB{thnConfigAxisPtB, " #it{p}_{T}^{B} (GeV/#it{c})" };
8791 const AxisSpec thnAxisY{thnConfigAxisY, " y" };
@@ -97,11 +101,7 @@ struct HfTaskOmegac0ToOmegapi {
97101 registry.get <THnSparse>(HIST (" hSparseAcc" ))->Sumw2 ();
98102 }
99103
100- std::vector<AxisSpec> axes = {
101- thnAxisMass,
102- thnAxisPt,
103- thnAxisY,
104- };
104+ std::vector<AxisSpec> axes = {thnAxisMass, thnAxisPt, thnAxisY};
105105 if (doprocessMcWithKFParticle || doprocessMcWithKFParticleMl) {
106106 axes.push_back (thnAxisPtB);
107107 axes.push_back (thnAxisOrigin);
@@ -110,9 +110,7 @@ struct HfTaskOmegac0ToOmegapi {
110110 }
111111 if (applyMl) {
112112 const AxisSpec thnAxisPromptScore{thnConfigAxisPromptScore, " BDT score prompt." };
113-
114113 axes.insert (axes.begin (), thnAxisPromptScore);
115-
116114 registry.add (" hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type" , " Thn for Omegac0 candidates" , HistType::kTHnSparseD , axes);
117115 registry.get <THnSparse>(HIST (" hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ))->Sumw2 ();
118116 } else {
@@ -125,117 +123,104 @@ struct HfTaskOmegac0ToOmegapi {
125123 void processData (const CandType& candidates, CollType const &)
126124 {
127125 for (const auto & candidate : candidates) {
128- if (!(candidate.hfflag () & 1 << aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi )) {
126+ if (!(candidate.resultSelections () == true || (candidate. resultSelections () == false && !selectionFlagOmegac0) )) {
129127 continue ;
130128 }
131129 if (yCandRecoMax >= 0 . && std::abs (candidate.kfRapOmegac ()) > yCandRecoMax) {
132130 continue ;
133131 }
134- float massOmegac0;
135- massOmegac0 = candidate.invMassCharmBaryon ();
136- auto rapidityCandidate = candidate.kfRapOmegac ();
137- auto ptCandidate = candidate.ptCharmBaryon ();
132+
138133 if constexpr (applyMl) {
139- registry.fill (HIST (" hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ), candidate.mlProbOmegac ()[0 ], massOmegac0, ptCandidate, rapidityCandidate );
134+ registry.fill (HIST (" hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ), candidate.mlProbOmegac ()[0 ], candidate. invMassCharmBaryon (), candidate. ptCharmBaryon (), candidate. kfRapOmegac () );
140135 } else {
141- registry.fill (HIST (" hMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ), massOmegac0, ptCandidate, rapidityCandidate );
136+ registry.fill (HIST (" hMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ), candidate. invMassCharmBaryon (), candidate. ptCharmBaryon (), candidate. kfRapOmegac () );
142137 }
143138 }
144139 }
145140
146- void processDataWithKFParticle (Omegac0CandidatesKF const &, Collisions const & collisions)
147- {
148- processData<false >(selectedOmegac0CandidatesKF, collisions);
149- }
150- PROCESS_SWITCH (HfTaskOmegac0ToOmegapi, processDataWithKFParticle, " process HfTaskOmegac0ToOmegapi with KFParticle" , false );
151- // TODO: add processKFParticle
152-
153- void processDataWithKFParticleMl (Omegac0CandidatesMlKF const &, Collisions const & collisions)
154- {
155- processData<true >(selectedOmegac0CandidatesMlKF, collisions);
156- }
157- PROCESS_SWITCH (HfTaskOmegac0ToOmegapi, processDataWithKFParticleMl, " process HfTaskOmegac0ToOmegapi with KFParticle and ML selections" , false );
158- // TODO: add processKFParticleMl
159-
160141 template <bool applyMl, typename CandType, typename CollType>
161142 void processMc (const CandType& candidates,
162- soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const & mcParticles,
163- MyTracksWMc const &,
143+ Omegac0Gen const & mcParticles,
144+ TracksMc const &,
164145 CollType const & collisions,
165146 aod::McCollisions const &)
166147 {
167148 // MC rec.
168149 for (const auto & candidate : candidates) {
169- if (!(candidate.hfflag () & 1 << aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi )) {
150+ if (!(candidate.resultSelections () == true || (candidate. resultSelections () == false && !selectionFlagOmegac0) )) {
170151 continue ;
171152 }
172153 if (yCandRecoMax >= 0 . && std::abs (candidate.kfRapOmegac ()) > yCandRecoMax) {
173154 continue ;
174155 }
175- auto collision = candidate.template collision_as <CollType>();
176- auto numPvContributors = collision.numContrib ();
177- float massOmegac0;
178- massOmegac0 = candidate.invMassCharmBaryon ();
179- auto ptCandidate = candidate.ptCharmBaryon ();
180- auto rapidityCandidate = candidate.kfRapOmegac ();
181- if (candidate.resultSelections () && !selectionFlagOmegac0)
182- if (candidate.flagMcMatchRec () == (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi)) {
183- if constexpr (applyMl) {
184- registry.fill (HIST (" hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ), candidate.mlProbOmegac ()[0 ], massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart (), candidate.originRec (), candidate.flagMcMatchRec (), numPvContributors);
185-
186- } else {
187- registry.fill (HIST (" hMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ), massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart (), candidate.originRec (), candidate.flagMcMatchRec (), numPvContributors);
188- }
189- }
156+
157+ auto numPvContributors = candidate.template collision_as <CollType>().numContrib ();
158+
159+ if constexpr (applyMl) {
160+ registry.fill (HIST (" hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ), candidate.mlProbOmegac ()[0 ], candidate.invMassCharmBaryon (), candidate.ptCharmBaryon (), candidate.kfRapOmegac (), candidate.ptBhadMotherPart (), candidate.originRec (), candidate.flagMcMatchRec (), numPvContributors);
161+
162+ } else {
163+ registry.fill (HIST (" hMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ), candidate.invMassCharmBaryon (), candidate.ptCharmBaryon (), candidate.kfRapOmegac (), candidate.ptBhadMotherPart (), candidate.originRec (), candidate.flagMcMatchRec (), numPvContributors);
164+ }
190165 }
166+
191167 // MC gen.
192168 for (const auto & particle : mcParticles) {
193- if (std::abs (particle.flagMcMatchGen ()) == 1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi) {
194- if (yCandGenMax >= 0 . && std::abs (particle.rapidityCharmBaryonGen ()) > yCandGenMax) {
195- continue ;
196- }
197- float ptGenB = -1 ;
198- auto ptGen = particle.pt ();
199- auto yGen = particle.rapidityCharmBaryonGen ();
200-
201- unsigned maxNumContrib = 0 ;
202- const auto & recoCollsPerMcColl = collisions.sliceBy (colPerMcCollision, particle.mcCollision ().globalIndex ());
203- for (const auto & recCol : recoCollsPerMcColl) {
204- maxNumContrib = recCol.numContrib () > maxNumContrib ? recCol.numContrib () : maxNumContrib;
205- }
206-
207- if (particle.originGen () == RecoDecay::OriginType::Prompt) {
208- registry.fill (HIST (" hSparseAcc" ), ptGen, ptGenB, yGen, 1 , maxNumContrib);
209-
210- } else {
211- ptGenB = mcParticles.rawIteratorAt (particle.idxBhadMotherPart ()).pt ();
212- registry.fill (HIST (" hSparseAcc" ), ptGen, ptGenB, yGen, 2 , maxNumContrib);
213- }
169+ if (yCandGenMax >= 0 . && std::abs (particle.rapidityCharmBaryonGen ()) > yCandGenMax) {
170+ continue ;
171+ }
172+
173+ auto ptGen = particle.pt ();
174+ auto yGen = particle.rapidityCharmBaryonGen ();
175+
176+ unsigned maxNumContrib = 0 ;
177+ const auto & recoCollsPerMcColl = collisions.sliceBy (colPerMcCollision, particle.mcCollision ().globalIndex ());
178+ for (const auto & recCol : recoCollsPerMcColl) {
179+ maxNumContrib = recCol.numContrib () > maxNumContrib ? recCol.numContrib () : maxNumContrib;
180+ }
181+
182+ if (particle.originGen () == RecoDecay::OriginType::Prompt) {
183+ registry.fill (HIST (" hSparseAcc" ), ptGen, -1 ., yGen, RecoDecay::OriginType::Prompt, maxNumContrib);
184+ } else {
185+ float ptGenB = mcParticles.rawIteratorAt (particle.idxBhadMotherPart ()).pt ();
186+ registry.fill (HIST (" hSparseAcc" ), ptGen, ptGenB, yGen, RecoDecay::OriginType::NonPrompt, maxNumContrib);
214187 }
215188 }
216189 }
217190
218- void processMcWithKFParticle (OmegaC0CandidatesMcKF const & omegaC0CandidatesMcKF,
219- soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const & mcParticles,
220- MyTracksWMc const & tracks,
191+ void processDataWithKFParticle (Omegac0CandsKF const & candidates,
192+ Collisions const & collisions)
193+ {
194+ processData<false >(candidates, collisions);
195+ }
196+ PROCESS_SWITCH (HfTaskOmegac0ToOmegapi, processDataWithKFParticle, " process HfTaskOmegac0ToOmegapi with KFParticle" , false );
197+
198+ void processDataWithKFParticleMl (Omegac0CandsMlKF const & candidates,
199+ Collisions const & collisions)
200+ {
201+ processData<true >(candidates, collisions);
202+ }
203+ PROCESS_SWITCH (HfTaskOmegac0ToOmegapi, processDataWithKFParticleMl, " process HfTaskOmegac0ToOmegapi with KFParticle and ML selections" , false );
204+
205+ void processMcWithKFParticle (OmegaC0CandsMcKF const & omegaC0CandidatesMcKF,
206+ Omegac0Gen const & mcParticles,
207+ TracksMc const & tracks,
221208 CollisionsWithMcLabels const & collisions,
222209 aod::McCollisions const & mcCollisions)
223210 {
224211 processMc<false >(omegaC0CandidatesMcKF, mcParticles, tracks, collisions, mcCollisions);
225212 }
226213 PROCESS_SWITCH (HfTaskOmegac0ToOmegapi, processMcWithKFParticle, " Process MC with KFParticle" , false );
227- // TODO: add the processMcWithKFParticle
228214
229- void processMcWithKFParticleMl (Omegac0CandidatesMlMcKF const & omegac0CandidatesMlMcKF,
230- soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const & mcParticles,
231- MyTracksWMc const & tracks,
215+ void processMcWithKFParticleMl (Omegac0CandsMlMcKF const & omegac0CandidatesMlMcKF,
216+ Omegac0Gen const & mcParticles,
217+ TracksMc const & tracks,
232218 CollisionsWithMcLabels const & collisions,
233219 aod::McCollisions const & mcCollisions)
234220 {
235221 processMc<true >(omegac0CandidatesMlMcKF, mcParticles, tracks, collisions, mcCollisions);
236222 }
237223 PROCESS_SWITCH (HfTaskOmegac0ToOmegapi, processMcWithKFParticleMl, " Process MC with KFParticle and ML selections" , false );
238- // TODO: add the processMcWithKFParticleMl
239224};
240225
241226WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments