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>;
61+
5762 PresliceUnsorted<CollisionsWithMcLabels> colPerMcCollision = aod::mccollisionlabel::mcCollisionId;
5863
59- Partition<Omegac0CandidatesKF> selectedOmegac0CandidatesKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0;
60- Partition<Omegac0CandidatesMlKF> selectedOmegac0CandidatesMlKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0;
64+ Filter filterOmegaCToOmegaPiFlag = (aod::hf_track_index::hfflag & static_cast <uint8_t >(BIT(aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi))) != static_cast <uint8_t >(0 );
65+ Filter filterOmegaCMatchedRec = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchRec) == static_cast <int8_t >(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi));
66+ Filter filterOmegaCMatchedGen = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchGen) == static_cast <int8_t >(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi));
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,102 @@ 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)
141+ void processDataWithKFParticle (Omegac0CandsKF const & candidates , Collisions const & collisions)
147142 {
148- processData<false >(selectedOmegac0CandidatesKF , collisions);
143+ processData<false >(candidates , collisions);
149144 }
150145 PROCESS_SWITCH (HfTaskOmegac0ToOmegapi, processDataWithKFParticle, " process HfTaskOmegac0ToOmegapi with KFParticle" , false );
151- // TODO: add processKFParticle
152146
153- void processDataWithKFParticleMl (Omegac0CandidatesMlKF const &, Collisions const & collisions)
147+ void processDataWithKFParticleMl (Omegac0CandsMlKF const & candidates , Collisions const & collisions)
154148 {
155- processData<true >(selectedOmegac0CandidatesMlKF , collisions);
149+ processData<true >(candidates , collisions);
156150 }
157151 PROCESS_SWITCH (HfTaskOmegac0ToOmegapi, processDataWithKFParticleMl, " process HfTaskOmegac0ToOmegapi with KFParticle and ML selections" , false );
158- // TODO: add processKFParticleMl
159152
160153 template <bool applyMl, typename CandType, typename CollType>
161154 void processMc (const CandType& candidates,
162- soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const & mcParticles,
163- MyTracksWMc const &,
155+ Omegac0Gen const & mcParticles,
156+ TracksMc const &,
164157 CollType const & collisions,
165158 aod::McCollisions const &)
166159 {
167160 // MC rec.
168161 for (const auto & candidate : candidates) {
169- if (!(candidate.hfflag () & 1 << aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi )) {
162+ if (!(candidate.resultSelections () == true || (candidate. resultSelections () == false && !selectionFlagOmegac0) )) {
170163 continue ;
171164 }
172165 if (yCandRecoMax >= 0 . && std::abs (candidate.kfRapOmegac ()) > yCandRecoMax) {
173166 continue ;
174167 }
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- }
168+
169+ auto numPvContributors = candidate.template collision_as <CollType>().numContrib ();
170+
171+ if constexpr (applyMl) {
172+ registry.fill (HIST (" hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ), candidate.mlProbOmegac ()[0 ], candidate.invMassCharmBaryon (), candidate.ptCharmBaryon (), candidate.kfRapOmegac (), candidate.ptBhadMotherPart (), candidate.originRec (), candidate.flagMcMatchRec (), numPvContributors);
173+
174+ } else {
175+ registry.fill (HIST (" hMassVsPtVsPtBVsYVsOriginVsOmegac0Type" ), candidate.invMassCharmBaryon (), candidate.ptCharmBaryon (), candidate.kfRapOmegac (), candidate.ptBhadMotherPart (), candidate.originRec (), candidate.flagMcMatchRec (), numPvContributors);
176+ }
190177 }
178+
191179 // MC gen.
192180 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- }
181+ if (yCandGenMax >= 0 . && std::abs (particle.rapidityCharmBaryonGen ()) > yCandGenMax) {
182+ continue ;
183+ }
184+
185+ auto ptGen = particle.pt ();
186+ auto yGen = particle.rapidityCharmBaryonGen ();
187+
188+ unsigned maxNumContrib = 0 ;
189+ const auto & recoCollsPerMcColl = collisions.sliceBy (colPerMcCollision, particle.mcCollision ().globalIndex ());
190+ for (const auto & recCol : recoCollsPerMcColl) {
191+ maxNumContrib = recCol.numContrib () > maxNumContrib ? recCol.numContrib () : maxNumContrib;
192+ }
193+
194+ if (particle.originGen () == RecoDecay::OriginType::Prompt) {
195+ registry.fill (HIST (" hSparseAcc" ), ptGen, -1 ., yGen, RecoDecay::OriginType::Prompt, maxNumContrib);
196+ } else {
197+ float ptGenB = mcParticles.rawIteratorAt (particle.idxBhadMotherPart ()).pt ();
198+ registry.fill (HIST (" hSparseAcc" ), ptGen, ptGenB, yGen, RecoDecay::OriginType::NonPrompt, maxNumContrib);
214199 }
215200 }
216201 }
217202
218- void processMcWithKFParticle (OmegaC0CandidatesMcKF const & omegaC0CandidatesMcKF,
219- soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const & mcParticles,
220- MyTracksWMc const & tracks,
203+ void processMcWithKFParticle (OmegaC0CandsMcKF const & omegaC0CandidatesMcKF,
204+ Omegac0Gen const & mcParticles,
205+ TracksMc const & tracks,
221206 CollisionsWithMcLabels const & collisions,
222207 aod::McCollisions const & mcCollisions)
223208 {
224209 processMc<false >(omegaC0CandidatesMcKF, mcParticles, tracks, collisions, mcCollisions);
225210 }
226211 PROCESS_SWITCH (HfTaskOmegac0ToOmegapi, processMcWithKFParticle, " Process MC with KFParticle" , false );
227- // TODO: add the processMcWithKFParticle
228212
229- void processMcWithKFParticleMl (Omegac0CandidatesMlMcKF const & omegac0CandidatesMlMcKF,
230- soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const & mcParticles,
231- MyTracksWMc const & tracks,
213+ void processMcWithKFParticleMl (Omegac0CandsMlMcKF const & omegac0CandidatesMlMcKF,
214+ Omegac0Gen const & mcParticles,
215+ TracksMc const & tracks,
232216 CollisionsWithMcLabels const & collisions,
233217 aod::McCollisions const & mcCollisions)
234218 {
235219 processMc<true >(omegac0CandidatesMlMcKF, mcParticles, tracks, collisions, mcCollisions);
236220 }
237221 PROCESS_SWITCH (HfTaskOmegac0ToOmegapi, processMcWithKFParticleMl, " Process MC with KFParticle and ML selections" , false );
238- // TODO: add the processMcWithKFParticleMl
239222};
240223
241224WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments