@@ -125,6 +125,7 @@ struct FemtoUniverseProducerTask {
125125 Produces<aod::FDCascParticles> outputCascParts;
126126
127127 Configurable<bool > confIsDebug{" confIsDebug" , true , " Enable Debug tables" };
128+ Configurable<bool > confIsUseCutculator{" confIsUseCutculator" , true , " Enable cutculator for track cuts" };
128129 // Choose if filtering or skimming version is run
129130 // Configurable<bool> confIsTrigger{"confIsTrigger", false, "Store all collisions"}; //Commented: not used configurable
130131 // Choose if running on converted data or Run3 / Pilot
@@ -325,6 +326,15 @@ struct FemtoUniverseProducerTask {
325326 Configurable<std::vector<int >> classMlD0D0bar{" classMlD0D0bar" , {0 , 1 , 2 }, " Indexes of ML scores to be stored. Three indexes max." };
326327 } ConfD0Selection;
327328
329+ // PID bitmask configurables
330+ struct : o2::framework::ConfigurableGroup {
331+ Configurable<float > confMinMomTOF{" confMinMomTOF" , 0.75 , " momentum threshold for particle identification using TOF" };
332+ Configurable<float > confNsigmaTPCParticleChild{" confNsigmaTPCParticleChild" , 3.0 , " TPC Sigma for particle (daugh & bach) momentum < Confmom" };
333+ Configurable<float > confNsigmaTOFParticleChild{" confNsigmaTOFParticleChild" , 3.0 , " TOF Sigma for particle (daugh & bach) momentum > Confmom" };
334+ Configurable<float > confNsigmaTPCParticle{" confNsigmaTPCParticle" , 3.0 , " TPC Sigma for particle (track) momentum < Confmom" };
335+ Configurable<float > confNsigmaCombinedParticle{" confNsigmaCombinedParticle" , 3.0 , " TPC and TOF Sigma (combined) for particle (track) momentum > Confmom" };
336+ } ConfPIDBitmask;
337+
328338 HfHelper hfHelper;
329339 bool isKaonNSigma (float mom, float nsigmaTPCK, float nsigmaTOFK)
330340 {
@@ -411,6 +421,48 @@ struct FemtoUniverseProducerTask {
411421 }
412422 }
413423
424+ bool isNSigmaTPC (float nsigmaTPCParticle)
425+ {
426+ return (std::abs (nsigmaTPCParticle) < ConfPIDBitmask.confNsigmaTPCParticleChild );
427+ }
428+
429+ bool isNSigmaTOF (float mom, float nsigmaTOFParticle, bool hasTOF)
430+ {
431+ // Cut only on daughter and bachelor tracks, that have TOF signal
432+ if (mom > ConfPIDBitmask.confMinMomTOF && hasTOF) {
433+ return (std::abs (nsigmaTOFParticle) < ConfPIDBitmask.confNsigmaTOFParticleChild );
434+ } else {
435+ return true ;
436+ }
437+ }
438+
439+ bool isNSigmaCombined (float mom, float nsigmaTPCParticle, float nsigmaTOFParticle)
440+ {
441+ if (mom <= ConfPIDBitmask.confMinMomTOF ) {
442+ return (std::abs (nsigmaTPCParticle) < ConfPIDBitmask.confNsigmaTPCParticle );
443+ } else {
444+ return (TMath::Hypot (nsigmaTOFParticle, nsigmaTPCParticle) < ConfPIDBitmask.confNsigmaCombinedParticle );
445+ }
446+ }
447+
448+ template <typename TrackType>
449+ aod::femtouniverseparticle::CutContainerType PIDBitmask (const TrackType& track)
450+ {
451+ static const o2::track::PID pids[] = {o2::track::PID::Proton, o2::track::PID::Pion, o2::track::PID::Kaon};
452+ aod::femtouniverseparticle::CutContainerType mask = 0u ;
453+ for (UInt_t i = 0 ; i < 3 ; ++i) {
454+ if (isNSigmaTPC (trackCuts.getNsigmaTPC (track, pids[i])))
455+ mask |= (1u << i);
456+ if (isNSigmaTOF (track.p (), trackCuts.getNsigmaTOF (track, pids[i]), track.hasTOF ()))
457+ mask |= (8u << i);
458+ if (isNSigmaCombined (track.p (), trackCuts.getNsigmaTPC (track, pids[i]), trackCuts.getNsigmaTOF (track, pids[i])))
459+ mask |= (64u << i);
460+ }
461+ if (track.hasTOF ())
462+ mask |= (512u );
463+ return mask;
464+ }
465+
414466 // / \todo should we add filter on min value pT/eta of V0 and daughters?
415467 /* Filter v0Filter = (nabs(aod::v0data::x) < V0DecVtxMax.value) &&
416468 (nabs(aod::v0data::y) < V0DecVtxMax.value) &&
@@ -1023,8 +1075,9 @@ struct FemtoUniverseProducerTask {
10231075 track.phi (), aod::femtouniverseparticle::ParticleType::kTrack ,
10241076 cutContainer.at (
10251077 femto_universe_track_selection::TrackContainerPosition::kCuts ),
1026- cutContainer.at (
1027- femto_universe_track_selection::TrackContainerPosition::kPID ),
1078+ confIsUseCutculator ? cutContainer.at (
1079+ femto_universe_track_selection::TrackContainerPosition::kPID )
1080+ : PIDBitmask (track),
10281081 track.dcaXY (), childIDs, 0 ,
10291082 track.sign ()); // sign getter is mAntiLambda()
10301083
@@ -1078,11 +1131,11 @@ struct FemtoUniverseProducerTask {
10781131 v0.positiveeta (), v0.positivephi (),
10791132 aod::femtouniverseparticle::ParticleType::kV0Child ,
10801133 cutContainerV0.at (femto_universe_v0_selection::V0ContainerPosition::kPosCuts ),
1081- cutContainerV0.at (femto_universe_v0_selection::V0ContainerPosition::kPosPID ),
1134+ confIsUseCutculator ? cutContainerV0.at (femto_universe_v0_selection::V0ContainerPosition::kPosPID ) : PIDBitmask (postrack ),
10821135 0 .,
10831136 childIDs,
10841137 0 ,
1085- 0 );
1138+ postrack. sign () );
10861139 const int rowOfPosTrack = outputParts.lastIndex ();
10871140 if constexpr (isMC) {
10881141 fillMCParticle (postrack, o2::aod::femtouniverseparticle::ParticleType::kV0Child );
@@ -1098,11 +1151,11 @@ struct FemtoUniverseProducerTask {
10981151 v0.negativephi (),
10991152 aod::femtouniverseparticle::ParticleType::kV0Child ,
11001153 cutContainerV0.at (femto_universe_v0_selection::V0ContainerPosition::kNegCuts ),
1101- cutContainerV0.at (femto_universe_v0_selection::V0ContainerPosition::kNegPID ),
1154+ confIsUseCutculator ? cutContainerV0.at (femto_universe_v0_selection::V0ContainerPosition::kNegPID ) : PIDBitmask (negtrack ),
11021155 0 .,
11031156 childIDs,
11041157 0 ,
1105- 0 );
1158+ negtrack. sign () );
11061159 const int rowOfNegTrack = outputParts.lastIndex ();
11071160 if constexpr (isMC) {
11081161 fillMCParticle (negtrack, o2::aod::femtouniverseparticle::ParticleType::kV0Child );
@@ -1160,12 +1213,12 @@ struct FemtoUniverseProducerTask {
11601213 casc.positiveeta (),
11611214 casc.positivephi (),
11621215 aod::femtouniverseparticle::ParticleType::kV0Child ,
1163- 0 , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kPosCuts),
1164- 0 , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kPosPID),
1216+ 0 , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kPosCuts),
1217+ PIDBitmask (posTrackCasc) , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kPosPID),
11651218 hasTOF,
11661219 childIDs,
11671220 0 ,
1168- 0 );
1221+ posTrackCasc. sign () );
11691222 const int rowOfPosTrack = outputParts.lastIndex ();
11701223 if constexpr (isMC) {
11711224 fillMCParticle (posTrackCasc, o2::aod::femtouniverseparticle::ParticleType::kV0Child );
@@ -1182,12 +1235,12 @@ struct FemtoUniverseProducerTask {
11821235 casc.negativeeta (),
11831236 casc.negativephi (),
11841237 aod::femtouniverseparticle::ParticleType::kV0Child ,
1185- 0 , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegCuts),
1186- 0 , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegPID),
1238+ 0 , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegCuts),
1239+ PIDBitmask (negTrackCasc) , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegPID),
11871240 hasTOF,
11881241 childIDs,
11891242 0 ,
1190- 0 );
1243+ negTrackCasc. sign () );
11911244 const int rowOfNegTrack = outputParts.lastIndex ();
11921245 if constexpr (isMC) {
11931246 fillMCParticle (negTrackCasc, o2::aod::femtouniverseparticle::ParticleType::kV0Child );
@@ -1205,12 +1258,12 @@ struct FemtoUniverseProducerTask {
12051258 casc.bacheloreta (),
12061259 casc.bachelorphi (),
12071260 aod::femtouniverseparticle::ParticleType::kCascadeBachelor ,
1208- 0 , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegCuts),
1209- 0 , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegPID),
1261+ 0 , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegCuts),
1262+ PIDBitmask (bachTrackCasc) , // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegPID),
12101263 hasTOF,
12111264 childIDs,
12121265 0 ,
1213- 0 );
1266+ bachTrackCasc. sign () );
12141267 const int rowOfBachTrack = outputParts.lastIndex ();
12151268 if constexpr (isMC) {
12161269 fillMCParticle (bachTrackCasc, o2::aod::femtouniverseparticle::ParticleType::kCascadeBachelor );
0 commit comments