@@ -142,8 +142,10 @@ enum CascadeSels {
142142 kCascadeSelsMax
143143};
144144
145- const char cascadeSelsName[] = " Cascade Selection Object" ;
146- const std::unordered_map<CascadeSels, std::string> cascadeSelsToString = {
145+ constexpr char XiSelHistName[] = " hXiSelection" ;
146+ constexpr char OmegaSelHistName[] = " hOmegaSelection" ;
147+ constexpr char CascadeSelsName[] = " Cascade Selection Object" ;
148+ const std::unordered_map<CascadeSels, std::string> cascadeSelectionNames = {
147149 {kCascadeCpaMin , " Cascade CPA Min" },
148150 {kCascadeDcaDaughMax , " Cascade DCA Daughters Max" },
149151 {kCascadeTransRadMin , " Cascade Transverse Radius Min" },
@@ -167,29 +169,29 @@ const std::unordered_map<CascadeSels, std::string> cascadeSelsToString = {
167169
168170// / \class FemtoDreamTrackCuts
169171// / \brief Cut class to contain and execute all cuts applied to tracks
170- template <modes::Cascade cascadeType>
172+ template <modes::Cascade cascadeType, const char * HistName >
171173class CascadeSelection : public BaseSelection <float , o2::aod::femtodatatypes::CascadeMaskType, kCascadeSelsMax >
172174{
173175 public:
174176 CascadeSelection () = default ;
175177 ~CascadeSelection () = default ;
176178
177179 template <typename T1, typename T2>
178- void configure (T1 const & config, T2 const & filter)
180+ void configure (o2::framework::HistogramRegistry* registry, T1 const & config, T2 const & filter)
179181 {
180182 if constexpr (modes::isEqual (cascadeType, modes::Cascade::kXi )) {
181183 mXiMassLowerLimit = filter.massXiMin .value ;
182184 mXiMassUpperLimit = filter.massXiMax .value ;
183185 mOmegaMassLowerLimit = filter.rejectMassOmegaMin .value ;
184186 mOmegaMassUpperLimit = filter.rejectMassOmegaMax .value ;
185- this ->addSelection (config.bachelorTpcPion .value , kBachelorTpcPion , limits::kAbsUpperLimit , true , true );
187+ this ->addSelection (kBachelorTpcPion , cascadeSelectionNames. at ( kBachelorTpcPion ), config.bachelorTpcPion .value , limits::kAbsUpperLimit , true , true , false );
186188 }
187189 if constexpr (modes::isEqual (cascadeType, modes::Cascade::kOmega )) {
188190 mOmegaMassLowerLimit = filter.massOmegaMin .value ;
189191 mOmegaMassUpperLimit = filter.massOmegaMax .value ;
190192 mXiMassLowerLimit = filter.rejectMassXiMin .value ;
191193 mXiMassUpperLimit = filter.rejectMassXiMax .value ;
192- this ->addSelection (config.bachelorTpcKaon .value , kBachelorTpcKaon , limits::kAbsUpperLimit , true , true );
194+ this ->addSelection (kBachelorTpcKaon , cascadeSelectionNames. at ( kBachelorTpcKaon ), config.bachelorTpcKaon .value , limits::kAbsUpperLimit , true , true , false );
193195 }
194196
195197 mPtMin = filter.ptMin .value ;
@@ -201,19 +203,21 @@ class CascadeSelection : public BaseSelection<float, o2::aod::femtodatatypes::Ca
201203 mLambdaMassMin = filter.massLambdaMin .value ;
202204 mLambdaMassMax = filter.massLambdaMax .value ;
203205
204- this ->addSelection (config.posDauTpc .value , kPosDauTpc , limits::kAbsUpperLimit , true , true );
205- this ->addSelection (config.negDauTpc .value , kNegDauTpc , limits::kAbsUpperLimit , true , true );
206-
207- this ->addSelection (config.cascadeCpaMin .value , kCascadeCpaMin , limits::kLowerLimit , true , true );
208- this ->addSelection (config.cascadeTransRadMin .value , kCascadeTransRadMin , limits::kLowerLimit , true , true );
209- this ->addSelection (config.cascadeDcaDauMax .value , kCascadeDcaDaughMax , limits::kAbsUpperLimit , true , true );
210- this ->addSelection (config.lambdaCpaMin .value , kLambdaCpaMin , limits::kLowerLimit , true , true );
211- this ->addSelection (config.lambdaTransRadMin .value , kLambdaTransRadMin , limits::kLowerLimit , true , true );
212- this ->addSelection (config.lambdaDcaDauMax .value , kLambdaDcaDauMax , limits::kAbsUpperLimit , true , true );
213- this ->addSelection (config.lambdaDcaToPvMin .value , kLambdaDcaToPvMin , limits::kLowerLimit , true , true );
214- this ->addSelection (config.dauAbsEtaMax .value , kDauAbsEtaMax , limits::kAbsUpperLimit , true , true );
215- this ->addSelection (config.dauDcaMin .value , kDauDcaMin , limits::kAbsLowerLimit , true , true );
216- this ->addSelection (config.dauTpcClustersMin .value , kDauTpcClsMin , limits::kLowerLimit , true , true );
206+ this ->addSelection (kPosDauTpc , cascadeSelectionNames.at (kPosDauTpc ), config.posDauTpc .value , limits::kAbsUpperLimit , true , true , false );
207+ this ->addSelection (kNegDauTpc , cascadeSelectionNames.at (kNegDauTpc ), config.negDauTpc .value , limits::kAbsUpperLimit , true , true , false );
208+
209+ this ->addSelection (kCascadeCpaMin , cascadeSelectionNames.at (kCascadeCpaMin ), config.cascadeCpaMin .value , limits::kLowerLimit , true , true , false );
210+ this ->addSelection (kCascadeTransRadMin , cascadeSelectionNames.at (kCascadeTransRadMin ), config.cascadeTransRadMin .value , limits::kLowerLimit , true , true , false );
211+ this ->addSelection (kCascadeDcaDaughMax , cascadeSelectionNames.at (kCascadeDcaDaughMax ), config.cascadeDcaDauMax .value , limits::kAbsUpperLimit , true , true , false );
212+ this ->addSelection (kLambdaCpaMin , cascadeSelectionNames.at (kLambdaCpaMin ), config.lambdaCpaMin .value , limits::kLowerLimit , true , true , false );
213+ this ->addSelection (kLambdaTransRadMin , cascadeSelectionNames.at (kLambdaTransRadMin ), config.lambdaTransRadMin .value , limits::kLowerLimit , true , true , false );
214+ this ->addSelection (kLambdaDcaDauMax , cascadeSelectionNames.at (kLambdaDcaDauMax ), config.lambdaDcaDauMax .value , limits::kAbsUpperLimit , true , true , false );
215+ this ->addSelection (kLambdaDcaToPvMin , cascadeSelectionNames.at (kLambdaDcaToPvMin ), config.lambdaDcaToPvMin .value , limits::kLowerLimit , true , true , false );
216+ this ->addSelection (kDauAbsEtaMax , cascadeSelectionNames.at (kDauAbsEtaMax ), config.dauAbsEtaMax .value , limits::kAbsUpperLimit , true , true , false );
217+ this ->addSelection (kDauDcaMin , cascadeSelectionNames.at (kDauDcaMin ), config.dauDcaMin .value , limits::kAbsLowerLimit , true , true , false );
218+ this ->addSelection (kDauTpcClsMin , cascadeSelectionNames.at (kDauTpcClsMin ), config.dauTpcClustersMin .value , limits::kLowerLimit , true , true , false );
219+
220+ this ->setupContainers <HistName>(registry);
217221 };
218222
219223 template <typename T1, typename T2, typename T3>
@@ -263,31 +267,44 @@ class CascadeSelection : public BaseSelection<float, o2::aod::femtodatatypes::Ca
263267 LOG (warn) << " Encountered Cascade candidate with 0 charge" ;
264268 }
265269
266- this ->assembleBitmask ();
270+ this ->assembleBitmask <HistName> ();
267271 };
268272
269273 template <typename T>
270- bool checkFilters (const T& cascade) const
274+ bool checkCandidate (const T& cascade) const
271275 {
272- return ((cascade.pt () > mPtMin && cascade.pt () < mPtMax ) &&
273- (cascade.eta () > mEtaMin && cascade.eta () < mEtaMax ) &&
274- (cascade.phi () > mPhiMin && cascade.phi () < mPhiMax ) &&
275- (cascade.mLambda () > mLambdaMassMin && cascade.mLambda () < mLambdaMassMax ));
276- }
276+ // check kinematics
277+ const bool kinematicsOK =
278+ (cascade.pt () > mPtMin && cascade.pt () < mPtMax ) &&
279+ (cascade.eta () > mEtaMin && cascade.eta () < mEtaMax ) &&
280+ (cascade.phi () > mPhiMin && cascade.phi () < mPhiMax );
281+
282+ if (!kinematicsOK) {
283+ return false ;
284+ }
277285
278- template <typename T>
279- bool checkHypothesis (T const & cascadeCandidate)
280- {
281- // no need to check PID of the bachelor/daughters here, they are set as minimal cuts
282- if constexpr (modes::isEqual (cascadeType, modes::Cascade::kXi )) {
283- return (mXiMassLowerLimit < cascadeCandidate.mXi () && mXiMassUpperLimit > cascadeCandidate.mXi ()) && // inside xi mass window
284- (cascadeCandidate.mOmega () < mOmegaMassLowerLimit || cascadeCandidate.mOmega () > mOmegaMassUpperLimit ); // outside omega mass window
286+ // check mass of daughter lambda
287+ const bool lambdaOK =
288+ (cascade.mLambda () > mLambdaMassMin && cascade.mLambda () < mLambdaMassMax );
289+
290+ if (!lambdaOK) {
291+ return false ;
285292 }
293+
294+ // check mass hypothesis
286295 if constexpr (modes::isEqual (cascadeType, modes::Cascade::kXi )) {
287- return (mOmegaMassLowerLimit < cascadeCandidate.mOmega () && mOmegaMassUpperLimit > cascadeCandidate.mOmega ()) && // inside omega mass window
288- (cascadeCandidate.mXi () < mXiMassLowerLimit || cascadeCandidate.mXi () > mXiMassUpperLimit ); // outside xi mass window
296+ // Xi candidate must be inside Xi window and outside Omega
297+ return (cascade.mXi () > mXiMassLowerLimit && cascade.mXi () < mXiMassUpperLimit ) &&
298+ (cascade.mOmega () < mOmegaMassLowerLimit || cascade.mOmega () > mOmegaMassUpperLimit );
299+ }
300+
301+ if constexpr (modes::isEqual (cascadeType, modes::Cascade::kOmega )) {
302+ // Omega candidate must be inside Omega window and outside Xi
303+ return (cascade.mOmega () > mOmegaMassLowerLimit && cascade.mOmega () < mOmegaMassUpperLimit ) &&
304+ (cascade.mXi () < mXiMassLowerLimit || cascade.mXi () > mXiMassUpperLimit );
289305 }
290- return false ;
306+
307+ return false ; // should never happen
291308 }
292309
293310 protected:
@@ -327,17 +344,16 @@ struct ConfCascadeTables : o2::framework::ConfigurableGroup {
327344 o2::framework::Configurable<int > produceOmegaExtras{" produceOmegaExtras" , -1 , " Produce OmegaExtras (-1: auto; 0 off; 1 on)" };
328345};
329346
330- template <modes::Cascade cascadeType>
347+ template <modes::Cascade cascadeType, const char * HistName >
331348class CascadeBuilder
332349{
333350 public:
334351 CascadeBuilder () = default ;
335352 ~CascadeBuilder () = default ;
336353
337354 template <typename T1, typename T2, typename T3, typename T4>
338- void init (T1& config, T2& filter, T3& table, T4& initContext)
355+ void init (o2::framework::HistogramRegistry* registry, T1& config, T2& filter, T3& table, T4& initContext)
339356 {
340- mCascadeSelection .configure (config, filter);
341357 if constexpr (modes::isEqual (cascadeType, modes::Cascade::kXi )) {
342358 LOG (info) << " Initialize femto Xi builder..." ;
343359 mProduceXis = utils::enableTable (" FXis_001" , table.produceXis .value , initContext);
@@ -353,10 +369,13 @@ class CascadeBuilder
353369
354370 if (mProduceXis || mProduceXiExtras || mProduceXiMasks || mProduceOmegas || mProduceOmegaMasks || mProduceOmegaExtras ) {
355371 mFillAnyTable = true ;
356- mCascadeSelection .printSelections (cascadeSelsName, cascadeSelsToString);
357372 } else {
358- LOG (info) << " No tables configured" ;
373+ LOG (info) << " No tables configured, Selection object will not be configured..." ;
374+ LOG (info) << " Initialization done..." ;
375+ return ;
359376 }
377+ mCascadeSelection .configure (registry, config, filter);
378+ mCascadeSelection .printSelections (CascadeSelsName);
360379 LOG (info) << " Initialization done..." ;
361380 }
362381
@@ -371,11 +390,11 @@ class CascadeBuilder
371390 int32_t posDaughterIndex = 0 ;
372391 int32_t negDaughterIndex = 0 ;
373392 for (const auto & cascade : fullCascades) {
374- if (!mCascadeSelection .checkFilters (cascade)) {
393+ if (!mCascadeSelection .checkCandidate (cascade)) {
375394 continue ;
376395 }
377396 mCascadeSelection .applySelections (cascade, fullTracks, col);
378- if (mCascadeSelection .passesAllRequiredSelections () && mCascadeSelection . checkHypothesis (cascade) ) {
397+ if (mCascadeSelection .passesAllRequiredSelections ()) {
379398
380399 auto bachelor = cascade.template bachelor_as <T5>();
381400 auto posDaughter = cascade.template posTrack_as <T5>();
@@ -450,7 +469,7 @@ class CascadeBuilder
450469 bool fillAnyTable () { return mFillAnyTable ; }
451470
452471 private:
453- CascadeSelection<cascadeType> mCascadeSelection ;
472+ CascadeSelection<cascadeType, HistName > mCascadeSelection ;
454473 bool mFillAnyTable = false ;
455474 bool mProduceXis = false ;
456475 bool mProduceXiMasks = false ;
0 commit comments