@@ -138,12 +138,16 @@ static const int defaultParameters[nTablesConst][nParameters]{
138138// use parameters + cov mat non-propagated, aux info + (extension propagated)
139139using FullTracksExt = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov>;
140140using FullTracksExtIU = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU>;
141+ using FullTracksExtWithPID = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov, aod::pidTPCFullEl, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::pidTPCFullKa, aod::pidTPCFullHe>;
142+ using FullTracksExtIUWithPID = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCFullEl, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::pidTPCFullKa, aod::pidTPCFullHe>;
141143using FullTracksExtLabeled = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov, aod::McTrackLabels>;
142144using FullTracksExtLabeledIU = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::McTrackLabels>;
145+ using FullTracksExtLabeledWithPID = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov, aod::pidTPCFullEl, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::pidTPCFullKa, aod::pidTPCFullHe, aod::McTrackLabels>;
146+ using FullTracksExtLabeledIUWithPID = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCFullEl, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::pidTPCFullKa, aod::pidTPCFullHe, aod::McTrackLabels>;
143147using TracksWithExtra = soa::Join<aod::Tracks, aod::TracksExtra>;
144148
145149// For dE/dx association in pre-selection
146- using TracksExtraWithPID = soa::Join<aod::TracksExtra, aod::pidTPCFullEl, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::pidTPCFullHe>;
150+ using TracksExtraWithPID = soa::Join<aod::TracksExtra, aod::pidTPCFullEl, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::pidTPCFullKa, aod:: pidTPCFullHe>;
147151
148152struct StrangenessBuilder {
149153 // helper object
@@ -346,6 +350,46 @@ struct StrangenessBuilder {
346350 Configurable<bool > mc_findableDetachedCascade{" mc_findableDetachedCascade" , false , " if true, generate findable cascades that have collisionId -1. Caution advised." };
347351 } cascadeBuilderOpts;
348352
353+ static constexpr float defaultK0MassWindowParameters[1 ][4 ] = {{2.81882e-03 , 1.14057e-03 , 1.72138e-03 , 5.00262e-01 }};
354+ static constexpr float defaultLambdaWindowParameters[1 ][4 ] = {{1.17518e-03 , 1.24099e-04 , 5.47937e-03 , 3.08009e-01 }};
355+ static constexpr float defaultXiMassWindowParameters[1 ][4 ] = {{1.43210e-03 , 2.03561e-04 , 2.43187e-03 , 7.99668e-01 }};
356+ static constexpr float defaultOmMassWindowParameters[1 ][4 ] = {{1.43210e-03 , 2.03561e-04 , 2.43187e-03 , 7.99668e-01 }};
357+ // preselection options
358+ struct : ConfigurableGroup {
359+ std::string prefix = " preSelectOpts" ;
360+ Configurable<bool > preselectOnlyDesiredV0s{" preselectOnlyDesiredV0s" , false , " preselect only V0s with compatible TPC PID and mass info" };
361+ Configurable<bool > preselectOnlyDesiredCascades{" preselectOnlyDesiredCascades" , false , " preselect only Cascades with compatible TPC PID and mass info" };
362+
363+ // mass preselection options
364+ Configurable<float > massCutPhoton{" massCutPhoton" , 0.2 , " Photon max mass" };
365+ Configurable<LabeledArray<float >> massCutK0{" massCutK0" , {defaultK0MassWindowParameters[0 ], 4 , {" constant" , " linear" , " expoConstant" , " expoRelax" }}, " mass parameters for K0" };
366+ Configurable<LabeledArray<float >> massCutLambda{" massCutLambda" , {defaultLambdaWindowParameters[0 ], 4 , {" constant" , " linear" , " expoConstant" , " expoRelax" }}, " mass parameters for Lambda" };
367+ Configurable<LabeledArray<float >> massCutXi{" massCutXi" , {defaultXiMassWindowParameters[0 ], 4 , {" constant" , " linear" , " expoConstant" , " expoRelax" }}, " mass parameters for Xi" };
368+ Configurable<LabeledArray<float >> massCutOm{" massCutOm" , {defaultOmMassWindowParameters[0 ], 4 , {" constant" , " linear" , " expoConstant" , " expoRelax" }}, " mass parameters for Omega" };
369+ Configurable<float > massWindownumberOfSigmas{" massWindownumberOfSigmas" , 5e+6 , " number of sigmas around mass peaks to keep" };
370+ Configurable<float > massWindowSafetyMargin{" massWindowSafetyMargin" , 0.001 , " Extra mass window safety margin" };
371+
372+ // TPC PID preselection options
373+ Configurable<float > maxTPCpidNsigma{" maxTPCpidNsigma" , 5.0 , " Maximum TPC PID N sigma (in abs value)" };
374+ } preSelectOpts;
375+
376+ float getMassSigmaK0Short (float pt)
377+ {
378+ return preSelectOpts.massCutK0 ->get (" constant" ) + pt * preSelectOpts.massCutK0 ->get (" linear" ) + preSelectOpts.massCutK0 ->get (" expoConstant" ) * TMath::Exp (-pt / preSelectOpts.massCutK0 ->get (" expoRelax" ));
379+ }
380+ float getMassSigmaLambda (float pt)
381+ {
382+ return preSelectOpts.massCutLambda ->get (" constant" ) + pt * preSelectOpts.massCutLambda ->get (" linear" ) + preSelectOpts.massCutLambda ->get (" expoConstant" ) * TMath::Exp (-pt / preSelectOpts.massCutLambda ->get (" expoRelax" ));
383+ }
384+ float getMassSigmaXi (float pt)
385+ {
386+ return preSelectOpts.massCutXi ->get (" constant" ) + pt * preSelectOpts.massCutXi ->get (" linear" ) + preSelectOpts.massCutXi ->get (" expoConstant" ) * TMath::Exp (-pt / preSelectOpts.massCutXi ->get (" expoRelax" ));
387+ }
388+ float getMassSigmaOmega (float pt)
389+ {
390+ return preSelectOpts.massCutOm ->get (" constant" ) + pt * preSelectOpts.massCutOm ->get (" linear" ) + preSelectOpts.massCutOm ->get (" expoConstant" ) * TMath::Exp (-pt / preSelectOpts.massCutOm ->get (" expoRelax" ));
391+ }
392+
349393 o2::ccdb::CcdbApi ccdbApi;
350394 Service<o2::ccdb::BasicCCDBManager> ccdb;
351395
@@ -1310,6 +1354,35 @@ struct StrangenessBuilder {
13101354 products.v0dataLink (-1 , -1 );
13111355 continue ;
13121356 }
1357+ if constexpr (requires { posTrack.tpcNSigmaEl (); }) {
1358+ if (preSelectOpts.preselectOnlyDesiredV0s ) {
1359+ float lPt = RecoDecay::sqrtSumOfSquares (
1360+ straHelper.v0 .positiveMomentum [0 ] + straHelper.v0 .negativeMomentum [0 ],
1361+ straHelper.v0 .positiveMomentum [1 ] + straHelper.v0 .negativeMomentum [1 ]);
1362+
1363+ if (
1364+ !( // photon PID and mass selection
1365+ std::abs (posTrack.tpcNSigmaEl ()) < preSelectOpts.maxTPCpidNsigma &&
1366+ std::abs (negTrack.tpcNSigmaEl ()) < preSelectOpts.maxTPCpidNsigma &&
1367+ std::abs (straHelper.v0 .massGamma ) < preSelectOpts.massCutPhoton ) &&
1368+ !( // K0Short PID and mass selection
1369+ std::abs (posTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1370+ std::abs (negTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1371+ std::abs (straHelper.v0 .massK0Short - o2::constants::physics::MassKaonNeutral) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaK0Short (lPt) + preSelectOpts.massWindowSafetyMargin ) &&
1372+ !( // Lambda PID and mass selection
1373+ std::abs (posTrack.tpcNSigmaPr ()) < preSelectOpts.maxTPCpidNsigma &&
1374+ std::abs (negTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1375+ std::abs (straHelper.v0 .massLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda (lPt) + preSelectOpts.massWindowSafetyMargin ) &&
1376+ !( // antiLambda PID and mass selection
1377+ std::abs (posTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1378+ std::abs (negTrack.tpcNSigmaPr ()) < preSelectOpts.maxTPCpidNsigma &&
1379+ std::abs (straHelper.v0 .massAntiLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda (lPt) + preSelectOpts.massWindowSafetyMargin )
1380+ ) {
1381+ products.v0dataLink (-1 , -1 );
1382+ continue ;
1383+ }
1384+ }
1385+ }
13131386 if (v0Map[iv0] == -1 && useV0BufferForCascades) {
13141387 v0Map[iv0] = v0sFromCascades.size (); // provide actual valid index in buffer
13151388 v0sFromCascades.push_back (straHelper.v0 );
@@ -1787,6 +1860,45 @@ struct StrangenessBuilder {
17871860 }
17881861 nCascades++;
17891862
1863+ if constexpr (requires { posTrack.tpcNSigmaEl (); }) {
1864+ if (preSelectOpts.preselectOnlyDesiredCascades ) {
1865+ if (
1866+ float lPt = RecoDecay::sqrtSumOfSquares (
1867+ straHelper.cascade .bachelorMomentum [0 ] + straHelper.cascade .positiveMomentum [0 ] + straHelper.cascade .negativeMomentum [0 ],
1868+ straHelper.cascade .bachelorMomentum [1 ] + straHelper.cascade .positiveMomentum [1 ] + straHelper.cascade .negativeMomentum [1 ]);
1869+
1870+ !( // XiMinus PID and mass selection
1871+ straHelper.cascade .charge < 0 &&
1872+ std::abs (posTrack.tpcNSigmaPr ()) < preSelectOpts.maxTPCpidNsigma &&
1873+ std::abs (negTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1874+ std::abs (bachTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1875+ std::abs (straHelper.cascade .massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi (lPt) + preSelectOpts.massWindowSafetyMargin ) &&
1876+ !( // XiPlus PID and mass selection
1877+ straHelper.cascade .charge > 0 &&
1878+ std::abs (posTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1879+ std::abs (negTrack.tpcNSigmaPr ()) < preSelectOpts.maxTPCpidNsigma &&
1880+ std::abs (bachTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1881+ std::abs (straHelper.cascade .massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi (lPt) + preSelectOpts.massWindowSafetyMargin ) &&
1882+ !( // OmegaMinus PID and mass selection
1883+ straHelper.cascade .charge < 0 &&
1884+ std::abs (posTrack.tpcNSigmaPr ()) < preSelectOpts.maxTPCpidNsigma &&
1885+ std::abs (negTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1886+ std::abs (bachTrack.tpcNSigmaKa ()) < preSelectOpts.maxTPCpidNsigma &&
1887+ std::abs (straHelper.cascade .massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega (lPt) + preSelectOpts.massWindowSafetyMargin ) &&
1888+ !( // OmegaPlus PID and mass selection
1889+ straHelper.cascade .charge > 0 &&
1890+ std::abs (posTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1891+ std::abs (negTrack.tpcNSigmaPr ()) < preSelectOpts.maxTPCpidNsigma &&
1892+ std::abs (bachTrack.tpcNSigmaKa ()) < preSelectOpts.maxTPCpidNsigma &&
1893+ std::abs (straHelper.cascade .massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega (lPt) + preSelectOpts.massWindowSafetyMargin )
1894+ ) {
1895+ products.cascdataLink (-1 );
1896+ interlinks.cascadeToCascCores .push_back (-1 );
1897+ continue ;
1898+ }
1899+ }
1900+ }
1901+
17901902 // generate analysis tables as required
17911903 if (mEnabledTables [kCascIndices ]) {
17921904 products.cascidx (cascade.globalId ,
@@ -2342,10 +2454,34 @@ struct StrangenessBuilder {
23422454 dataProcess (collisions, mccollisions, v0s, cascades, static_cast <TObject*>(nullptr ), tracks, bcs, mcParticles);
23432455 }
23442456
2457+ void processRealDataWithPID (soa::Join<aod::Collisions, aod::EvSels> const & collisions, aod::V0s const & v0s, aod::Cascades const & cascades, aod::TrackedCascades const & trackedCascades, FullTracksExtIUWithPID const & tracks, aod::BCsWithTimestamps const & bcs)
2458+ {
2459+ dataProcess (collisions, static_cast <TObject*>(nullptr ), v0s, cascades, trackedCascades, tracks, bcs, static_cast <TObject*>(nullptr ));
2460+ }
2461+
2462+ void processRealDataRun2WithPID (soa::Join<aod::Collisions, aod::EvSels> const & collisions, aod::V0s const & v0s, aod::Cascades const & cascades, FullTracksExtWithPID const & tracks, aod::BCsWithTimestamps const & bcs)
2463+ {
2464+ dataProcess (collisions, static_cast <TObject*>(nullptr ), v0s, cascades, static_cast <TObject*>(nullptr ), tracks, bcs, static_cast <TObject*>(nullptr ));
2465+ }
2466+
2467+ void processMonteCarloWithPID (soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels> const & collisions, aod::McCollisions const & mccollisions, aod::V0s const & v0s, aod::Cascades const & cascades, aod::TrackedCascades const & trackedCascades, FullTracksExtLabeledIUWithPID const & tracks, aod::BCsWithTimestamps const & bcs, aod::McParticles const & mcParticles)
2468+ {
2469+ dataProcess (collisions, mccollisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles);
2470+ }
2471+
2472+ void processMonteCarloRun2WithPID (soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels> const & collisions, aod::McCollisions const & mccollisions, aod::V0s const & v0s, aod::Cascades const & cascades, FullTracksExtLabeledWithPID const & tracks, aod::BCsWithTimestamps const & bcs, aod::McParticles const & mcParticles)
2473+ {
2474+ dataProcess (collisions, mccollisions, v0s, cascades, static_cast <TObject*>(nullptr ), tracks, bcs, mcParticles);
2475+ }
2476+
23452477 PROCESS_SWITCH (StrangenessBuilder, processRealData, " process real data" , true );
23462478 PROCESS_SWITCH (StrangenessBuilder, processRealDataRun2, " process real data (Run 2)" , false );
23472479 PROCESS_SWITCH (StrangenessBuilder, processMonteCarlo, " process monte carlo" , false );
23482480 PROCESS_SWITCH (StrangenessBuilder, processMonteCarloRun2, " process monte carlo (Run 2)" , false );
2481+ PROCESS_SWITCH (StrangenessBuilder, processRealDataWithPID, " process real data" , false );
2482+ PROCESS_SWITCH (StrangenessBuilder, processRealDataRun2WithPID, " process real data (Run 2)" , false );
2483+ PROCESS_SWITCH (StrangenessBuilder, processMonteCarloWithPID, " process monte carlo" , false );
2484+ PROCESS_SWITCH (StrangenessBuilder, processMonteCarloRun2WithPID, " process monte carlo (Run 2)" , false );
23492485};
23502486
23512487// Extends the v0data table with expression columns
0 commit comments