@@ -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.3 , " 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" , 20 , " number of sigmas around mass peaks to keep" };
370+ Configurable<float > massWindowSafetyMargin{" massWindowSafetyMargin" , 0.001 , " Extra mass window safety margin (in GeV/c2)" };
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,34 @@ 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+ products.v0dataLink (-1 , -1 );
1381+ continue ;
1382+ }
1383+ }
1384+ }
13131385 if (v0Map[iv0] == -1 && useV0BufferForCascades) {
13141386 v0Map[iv0] = v0sFromCascades.size (); // provide actual valid index in buffer
13151387 v0sFromCascades.push_back (straHelper.v0 );
@@ -1751,7 +1823,7 @@ struct StrangenessBuilder {
17511823 // limited commodity, this isn't the default option.
17521824
17531825 // check if cached - if not, skip
1754- if (v0Map[cascade.v0Id ] < 0 ) {
1826+ if (cascade. v0Id < 0 || v0Map[cascade.v0Id ] < 0 ) {
17551827 // this V0 hasn't been stored / cached
17561828 products.cascdataLink (-1 );
17571829 interlinks.cascadeToCascCores .push_back (-1 );
@@ -1787,6 +1859,44 @@ struct StrangenessBuilder {
17871859 }
17881860 nCascades++;
17891861
1862+ if constexpr (requires { posTrack.tpcNSigmaEl (); }) {
1863+ if (preSelectOpts.preselectOnlyDesiredCascades ) {
1864+ if (
1865+ float lPt = RecoDecay::sqrtSumOfSquares (
1866+ straHelper.cascade .bachelorMomentum [0 ] + straHelper.cascade .positiveMomentum [0 ] + straHelper.cascade .negativeMomentum [0 ],
1867+ straHelper.cascade .bachelorMomentum [1 ] + straHelper.cascade .positiveMomentum [1 ] + straHelper.cascade .negativeMomentum [1 ]);
1868+
1869+ !( // XiMinus PID and mass selection
1870+ straHelper.cascade .charge < 0 &&
1871+ std::abs (posTrack.tpcNSigmaPr ()) < preSelectOpts.maxTPCpidNsigma &&
1872+ std::abs (negTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1873+ std::abs (bachTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1874+ std::abs (straHelper.cascade .massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi (lPt) + preSelectOpts.massWindowSafetyMargin ) &&
1875+ !( // XiPlus PID and mass selection
1876+ straHelper.cascade .charge > 0 &&
1877+ std::abs (posTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1878+ std::abs (negTrack.tpcNSigmaPr ()) < preSelectOpts.maxTPCpidNsigma &&
1879+ std::abs (bachTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1880+ std::abs (straHelper.cascade .massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi (lPt) + preSelectOpts.massWindowSafetyMargin ) &&
1881+ !( // OmegaMinus PID and mass selection
1882+ straHelper.cascade .charge < 0 &&
1883+ std::abs (posTrack.tpcNSigmaPr ()) < preSelectOpts.maxTPCpidNsigma &&
1884+ std::abs (negTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1885+ std::abs (bachTrack.tpcNSigmaKa ()) < preSelectOpts.maxTPCpidNsigma &&
1886+ std::abs (straHelper.cascade .massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega (lPt) + preSelectOpts.massWindowSafetyMargin ) &&
1887+ !( // OmegaPlus PID and mass selection
1888+ straHelper.cascade .charge > 0 &&
1889+ std::abs (posTrack.tpcNSigmaPi ()) < preSelectOpts.maxTPCpidNsigma &&
1890+ std::abs (negTrack.tpcNSigmaPr ()) < preSelectOpts.maxTPCpidNsigma &&
1891+ std::abs (bachTrack.tpcNSigmaKa ()) < preSelectOpts.maxTPCpidNsigma &&
1892+ std::abs (straHelper.cascade .massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega (lPt) + preSelectOpts.massWindowSafetyMargin )) {
1893+ products.cascdataLink (-1 );
1894+ interlinks.cascadeToCascCores .push_back (-1 );
1895+ continue ;
1896+ }
1897+ }
1898+ }
1899+
17901900 // generate analysis tables as required
17911901 if (mEnabledTables [kCascIndices ]) {
17921902 products.cascidx (cascade.globalId ,
@@ -2342,10 +2452,34 @@ struct StrangenessBuilder {
23422452 dataProcess (collisions, mccollisions, v0s, cascades, static_cast <TObject*>(nullptr ), tracks, bcs, mcParticles);
23432453 }
23442454
2455+ 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)
2456+ {
2457+ dataProcess (collisions, static_cast <TObject*>(nullptr ), v0s, cascades, trackedCascades, tracks, bcs, static_cast <TObject*>(nullptr ));
2458+ }
2459+
2460+ 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)
2461+ {
2462+ dataProcess (collisions, static_cast <TObject*>(nullptr ), v0s, cascades, static_cast <TObject*>(nullptr ), tracks, bcs, static_cast <TObject*>(nullptr ));
2463+ }
2464+
2465+ 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)
2466+ {
2467+ dataProcess (collisions, mccollisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles);
2468+ }
2469+
2470+ 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)
2471+ {
2472+ dataProcess (collisions, mccollisions, v0s, cascades, static_cast <TObject*>(nullptr ), tracks, bcs, mcParticles);
2473+ }
2474+
23452475 PROCESS_SWITCH (StrangenessBuilder, processRealData, " process real data" , true );
23462476 PROCESS_SWITCH (StrangenessBuilder, processRealDataRun2, " process real data (Run 2)" , false );
23472477 PROCESS_SWITCH (StrangenessBuilder, processMonteCarlo, " process monte carlo" , false );
23482478 PROCESS_SWITCH (StrangenessBuilder, processMonteCarloRun2, " process monte carlo (Run 2)" , false );
2479+ PROCESS_SWITCH (StrangenessBuilder, processRealDataWithPID, " process real data" , false );
2480+ PROCESS_SWITCH (StrangenessBuilder, processRealDataRun2WithPID, " process real data (Run 2)" , false );
2481+ PROCESS_SWITCH (StrangenessBuilder, processMonteCarloWithPID, " process monte carlo" , false );
2482+ PROCESS_SWITCH (StrangenessBuilder, processMonteCarloRun2WithPID, " process monte carlo (Run 2)" , false );
23492483};
23502484
23512485// Extends the v0data table with expression columns
0 commit comments