@@ -151,18 +151,20 @@ struct HfCorrelatorXicHadronsSelection {
151151 Filter xicPlusFilter = aod::hf_sel_candidate_xic::isSelXicToXiPiPi >= selectionFlagXic;
152152 Filter xic0Filter = aod::hf_sel_toxipi::resultSelections == true ;
153153
154- template <bool IsXicPlus, typename CollType, typename CandType>
154+ template <bool IsMc, bool IsXicPlus, typename CollType, typename CandType>
155155 void selectionCollision (CollType const & collision, CandType const & candidates)
156156 {
157157 bool isSelColl = true ;
158158 bool isCandFound = false ;
159159 bool isSel8 = true ;
160160 bool isNosameBunchPileUp = true ;
161- double yCand = -999 .;
162- double massCand = -999 .;
163- double ptCand = -999 ;
161+
164162 if (doSelXicCollision) {
165163 for (const auto & candidate : candidates) {
164+ double massCand = -999 .;
165+ double ptCand = -999 .;
166+ double yCand = -999 .;
167+
166168 // For both XicPlus and Xic0
167169 if constexpr (IsXicPlus) {
168170 massCand = o2::constants::physics::MassXiCPlus;
@@ -174,27 +176,42 @@ struct HfCorrelatorXicHadronsSelection {
174176 yCand = candidate.kfRapXic ();
175177 }
176178
179+ // Kinematic cuts
177180 if (std::abs (yCand) > yCandMax || ptCand < ptCandMin) {
178181 isCandFound = false ;
179182 continue ;
180183 }
184+
185+ if constexpr (IsMc) {
186+ auto const mcFlag = std::abs (candidate.flagMcMatchRec ());
187+
188+ bool isSignal = (mcFlag == static_cast <int >(o2::aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiPiPi))
189+ || (mcFlag == static_cast <int >(BIT (aod::hf_cand_xic0_omegac0::DecayType::XiczeroToXiPi)));
190+
191+ if (!isSignal) {
192+ isCandFound = false ;
193+ continue ;
194+ }
195+ }
196+ // If it passed both Kinematic and MC checks
181197 isCandFound = true ;
182198 break ;
183199 }
184200 }
201+
202+ // Collision-level cuts
185203 if (useSel8) {
186204 isSel8 = collision.sel8 ();
187205 }
188206 if (selNoSameBunchPileUpColl) {
189207 isNosameBunchPileUp = static_cast <bool >(collision.selection_bit (o2::aod::evsel::kNoSameBunchPileup ));
190208 }
191-
209+
192210 isSelColl = isCandFound && isSel8 && isNosameBunchPileUp;
193-
194211 candSel (isSelColl);
195212 }
196213
197- template <typename CandType>
214+ template <typename CandType>
198215 void selectionCollisionMcGen (CandType const & mcParticles)
199216 {
200217 bool isCandFound = false ;
@@ -264,28 +281,28 @@ struct HfCorrelatorXicHadronsSelection {
264281 void processXicPlusSelection (SelCollisions::iterator const & collision,
265282 CandsXicPlusDataFiltered const & candidates)
266283 {
267- selectionCollision<true >(collision, candidates);
284+ selectionCollision<false , true >(collision, candidates);
268285 }
269286 PROCESS_SWITCH (HfCorrelatorXicHadronsSelection, processXicPlusSelection, " Process XicPlus Collision Selection for Data" , true );
270287
271288 void processXic0Selection (SelCollisions::iterator const & collision,
272289 CandsXic0DataFiltered const & candidates)
273290 {
274- selectionCollision<false >(collision, candidates);
291+ selectionCollision<false , false >(collision, candidates);
275292 }
276293 PROCESS_SWITCH (HfCorrelatorXicHadronsSelection, processXic0Selection, " Process Xic0 Collision Selection for Data" , false );
277294
278295 void processXicPlusSelectionMcRec (SelCollisions::iterator const & collision,
279296 CandsXicPlusMcRecFiltered const & candidates)
280297 {
281- selectionCollision<true >(collision, candidates);
298+ selectionCollision<true , true >(collision, candidates);
282299 }
283300 PROCESS_SWITCH (HfCorrelatorXicHadronsSelection, processXicPlusSelectionMcRec, " Process XicPlus Selection McRec" , false );
284301
285302 void processXic0SelectionMcRec (SelCollisions::iterator const & collision,
286303 CandsXic0McRecFiltered const & candidates)
287304 {
288- selectionCollision<false >(collision, candidates);
305+ selectionCollision<true , false >(collision, candidates);
289306 }
290307 PROCESS_SWITCH (HfCorrelatorXicHadronsSelection, processXic0SelectionMcRec, " Process Xic0 Selection McRec" , false );
291308
0 commit comments