Skip to content

Commit 1f4ccad

Browse files
[PWGLF] Add TPC PID Vs mass correlation cuts + other fix in the strangenessbuilder (AliceO2Group#11268)
1 parent 674c86c commit 1f4ccad

File tree

3 files changed

+373
-229
lines changed

3 files changed

+373
-229
lines changed

PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,8 @@ struct strangederivedbuilder {
245245
if (doprocessTrackExtrasV0sOnly +
246246
doprocessTrackExtras +
247247
doprocessTrackExtrasNoPID +
248-
doprocessTrackExtrasMC >
248+
doprocessTrackExtrasMC +
249+
doprocessTrackExtrasMCNoPID >
249250
1) {
250251
LOGF(fatal, "You have enabled more than one process function associated to TracksExtra. Please check your configuration! Aborting now.");
251252
}
@@ -332,6 +333,9 @@ struct strangederivedbuilder {
332333
if (doprocessTrackExtrasMC) {
333334
LOGF(info, "TracksExtra processing type.......: V0s + cascades, Monte Carlo");
334335
}
336+
if (doprocessTrackExtrasMCNoPID) {
337+
LOGF(info, "TracksExtra processing type.......: V0s + cascades, Monte Carlo");
338+
}
335339
LOGF(info, "====] cascade interlink processing [==============================");
336340
if (doprocessCascadeInterlinkTracked) {
337341
LOGF(info, "Process cascade/tracked interlink.: yes");
@@ -836,6 +840,11 @@ struct strangederivedbuilder {
836840
fillTrackExtras(V0s, Cascades, KFCascades, TraCascades, tracksExtra);
837841
}
838842

843+
void processTrackExtrasMCNoPID(aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, soa::Join<aod::Tracks, aod::TracksExtra, aod::McTrackLabels> const& tracksExtra, aod::V0s const&)
844+
{
845+
fillTrackExtras(V0s, Cascades, KFCascades, TraCascades, tracksExtra);
846+
}
847+
839848
void processStrangeMothers(soa::Join<aod::V0Datas, aod::McV0Labels> const& V0s, soa::Join<aod::CascDatas, aod::McCascLabels> const& Cascades, aod::McParticles const& mcParticles)
840849
{
841850
std::vector<int> motherReference(mcParticles.size(), -1); // index -1: not used / no reference
@@ -1108,6 +1117,7 @@ struct strangederivedbuilder {
11081117
PROCESS_SWITCH(strangederivedbuilder, processTrackExtras, "Produce track extra information (V0s + casc)", true);
11091118
PROCESS_SWITCH(strangederivedbuilder, processTrackExtrasNoPID, "Produce track extra information (V0s + casc), no PID", false);
11101119
PROCESS_SWITCH(strangederivedbuilder, processTrackExtrasMC, "Produce track extra information (V0s + casc)", false);
1120+
PROCESS_SWITCH(strangederivedbuilder, processTrackExtrasMCNoPID, "Produce track extra information (V0s + casc), no PID", false);
11111121
PROCESS_SWITCH(strangederivedbuilder, processStrangeMothers, "Produce tables with mother info for V0s + casc", true);
11121122
PROCESS_SWITCH(strangederivedbuilder, processCascadeInterlinkTracked, "Produce tables interconnecting cascades", false);
11131123
PROCESS_SWITCH(strangederivedbuilder, processCascadeInterlinkKF, "Produce tables interconnecting cascades", false);

PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx

Lines changed: 136 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,16 @@ static const int defaultParameters[nTablesConst][nParameters]{
138138
// use parameters + cov mat non-propagated, aux info + (extension propagated)
139139
using FullTracksExt = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov>;
140140
using 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>;
141143
using FullTracksExtLabeled = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov, aod::McTrackLabels>;
142144
using 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>;
143147
using 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

148152
struct 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

Comments
 (0)