Skip to content

Commit 45fa730

Browse files
Add lifetime preselection + QA histogram in strangenessbuilder
1 parent 8353072 commit 45fa730

File tree

1 file changed

+156
-21
lines changed

1 file changed

+156
-21
lines changed

PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx

Lines changed: 156 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ using TracksWithExtra = soa::Join<aod::Tracks, aod::TracksExtra>;
149149
// For dE/dx association in pre-selection
150150
using TracksExtraWithPID = soa::Join<aod::TracksExtra, aod::pidTPCFullEl, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::pidTPCFullKa, aod::pidTPCFullHe>;
151151

152+
// simple checkers, but ensure 8 bit integers
153+
#define BITSET(var, nbit) ((var) |= (static_cast<uint8_t>(1) << static_cast<uint8_t>(nbit)))
154+
152155
struct StrangenessBuilder {
153156
// helper object
154157
o2::pwglf::strangenessBuilderHelper straHelper;
@@ -193,6 +196,16 @@ struct StrangenessBuilder {
193196
kCascFoundTags,
194197
nTables };
195198

199+
enum V0PreSelection : uint8_t { selGamma = 0,
200+
selK0Short,
201+
selLambda,
202+
selAntiLambda};
203+
204+
enum CascPreSelection : uint8_t { selXiMinus = 0,
205+
selXiPlus,
206+
selOmegaMinus,
207+
selOmegaPlus};
208+
196209
struct : ProducesGroup {
197210
//__________________________________________________
198211
// V0 tables
@@ -356,12 +369,24 @@ struct StrangenessBuilder {
356369
static constexpr float defaultLambdaWindowParameters[1][4] = {{1.17518e-03, 1.24099e-04, 5.47937e-03, 3.08009e-01}};
357370
static constexpr float defaultXiMassWindowParameters[1][4] = {{1.43210e-03, 2.03561e-04, 2.43187e-03, 7.99668e-01}};
358371
static constexpr float defaultOmMassWindowParameters[1][4] = {{1.43210e-03, 2.03561e-04, 2.43187e-03, 7.99668e-01}};
372+
373+
static constexpr float defaultLifetimeCuts[1][4] = {{20, 60, 40, 20}};
374+
359375
// preselection options
360376
struct : ConfigurableGroup {
361377
std::string prefix = "preSelectOpts";
362378
Configurable<bool> preselectOnlyDesiredV0s{"preselectOnlyDesiredV0s", false, "preselect only V0s with compatible TPC PID and mass info"};
363379
Configurable<bool> preselectOnlyDesiredCascades{"preselectOnlyDesiredCascades", false, "preselect only Cascades with compatible TPC PID and mass info"};
364380

381+
// lifetime preselection options
382+
// apply lifetime cuts to V0 and cascade candidates
383+
// unit of measurement: centimeters
384+
// lifetime of K0Short ~2.6844 cm, no feeddown and plenty to cut
385+
// lifetime of Lambda ~7.9 cm but keep in mind feeddown from cascades
386+
// lifetime of Xi ~4.91 cm
387+
// lifetime of Omega ~2.461 cm
388+
Configurable<LabeledArray<float>> lifetimeCut{"lifetimeCut", {defaultLifetimeCuts[0], 4, {"lifetimeCutK0S", "lifetimeCutLambda", "lifetimeCutXi", "lifetimeCutOmega"}}, "Lifetime cut for V0s and cascades (cm)"};
389+
365390
// mass preselection options
366391
Configurable<float> massCutPhoton{"massCutPhoton", 0.3, "Photon max mass"};
367392
Configurable<LabeledArray<float>> massCutK0{"massCutK0", {defaultK0MassWindowParameters[0], 4, {"constant", "linear", "expoConstant", "expoRelax"}}, "mass parameters for K0"};
@@ -514,6 +539,46 @@ struct StrangenessBuilder {
514539
hDeduplicationStatistics->GetXaxis()->SetBinLabel(2, "Deduplicated V0s");
515540
}
516541

542+
if (preSelectOpts.preselectOnlyDesiredV0s.value == true) {
543+
auto hPreselectionV0s = histos.add<TH1>("hPreselectionV0s", "hPreselectionV0s", kTH1D, {{16, -0.5f, 15.5f}});
544+
hPreselectionV0s->GetXaxis()->SetBinLabel(1, "Not preselected");
545+
hPreselectionV0s->GetXaxis()->SetBinLabel(2, "#gamma");
546+
hPreselectionV0s->GetXaxis()->SetBinLabel(3, "K^{0}_{S}");
547+
hPreselectionV0s->GetXaxis()->SetBinLabel(4, "#gamma, K^{0}_{S}");
548+
hPreselectionV0s->GetXaxis()->SetBinLabel(5, "#Lambda");
549+
hPreselectionV0s->GetXaxis()->SetBinLabel(6, "#gamma, #Lambda");
550+
hPreselectionV0s->GetXaxis()->SetBinLabel(7, "K^{0}_{S}, #Lambda");
551+
hPreselectionV0s->GetXaxis()->SetBinLabel(8, "#gamma, K^{0}_{S}, #Lambda");
552+
hPreselectionV0s->GetXaxis()->SetBinLabel(9, "#bar{#Lambda}");
553+
hPreselectionV0s->GetXaxis()->SetBinLabel(10, "#gamma, #bar{#Lambda}");
554+
hPreselectionV0s->GetXaxis()->SetBinLabel(11, "K^{0}_{S}, #bar{#Lambda}");
555+
hPreselectionV0s->GetXaxis()->SetBinLabel(12, "#gamma, K^{0}_{S}, #bar{#Lambda}");
556+
hPreselectionV0s->GetXaxis()->SetBinLabel(13, "#Lambda, #bar{#Lambda}");
557+
hPreselectionV0s->GetXaxis()->SetBinLabel(14, "#gamma, #Lambda, #bar{#Lambda}");
558+
hPreselectionV0s->GetXaxis()->SetBinLabel(15, "K^{0}_{S}, #Lambda, #bar{#Lambda}");
559+
hPreselectionV0s->GetXaxis()->SetBinLabel(16, "#gamma, K^{0}_{S}, #Lambda, #bar{#Lambda}");
560+
}
561+
562+
if (preSelectOpts.preselectOnlyDesiredCascades.value == true) {
563+
auto hPreselectionCascades = histos.add<TH1>("hPreselectionCascades", "hPreselectionCascades", kTH1D, {{16, -0.5f, 15.5f}});
564+
hPreselectionCascades->GetXaxis()->SetBinLabel(1, "Not preselected");
565+
hPreselectionCascades->GetXaxis()->SetBinLabel(2, "#Xi^{-}");
566+
hPreselectionCascades->GetXaxis()->SetBinLabel(3, "#Xi^{+}");
567+
hPreselectionCascades->GetXaxis()->SetBinLabel(4, "#Xi^{-}, #Xi^{+}");
568+
hPreselectionCascades->GetXaxis()->SetBinLabel(5, "#Omega^{-}");
569+
hPreselectionCascades->GetXaxis()->SetBinLabel(6, "#Xi^{-}, #Omega^{-}");
570+
hPreselectionCascades->GetXaxis()->SetBinLabel(7, "#Xi^{+}, #Omega^{-}");
571+
hPreselectionCascades->GetXaxis()->SetBinLabel(8, "#Xi^{-}, #Xi^{+}, #Omega^{-}");
572+
hPreselectionCascades->GetXaxis()->SetBinLabel(9, "#Omega^{+}");
573+
hPreselectionCascades->GetXaxis()->SetBinLabel(10, "#Xi^{-}, #Omega^{+}");
574+
hPreselectionCascades->GetXaxis()->SetBinLabel(11, "#Xi^{+}, #Omega^{+}");
575+
hPreselectionCascades->GetXaxis()->SetBinLabel(12, "#Xi^{-}, #Xi^{+}, #Omega^{+}");
576+
hPreselectionCascades->GetXaxis()->SetBinLabel(13, "#Omega^{-}, #Omega^{+}");
577+
hPreselectionCascades->GetXaxis()->SetBinLabel(14, "#Xi^{-}, #Omega^{-}, #Omega^{+}");
578+
hPreselectionCascades->GetXaxis()->SetBinLabel(15, "#Xi^{+}, #Omega^{-}, #Omega^{+}");
579+
hPreselectionCascades->GetXaxis()->SetBinLabel(16, "#Xi^{-}, #Xi^{+}, #Omega^{-}, #Omega^{+}");
580+
}
581+
517582
if (mc_findableMode.value > 0) {
518583
// save statistics of findable candidate processing
519584
auto hFindable = histos.add<TH1>("hFindableStatistics", "hFindableStatistics", kTH1D, {{6, -0.5f, 5.5f}});
@@ -648,6 +713,11 @@ struct StrangenessBuilder {
648713
straHelper.cascadeselections.maxDaughterEta = cascadeBuilderOpts.maxDaughterEta;
649714
}
650715

716+
bool verifyMask(uint8_t bitmap, uint8_t mask)
717+
{
718+
return (bitmap & mask) == mask;
719+
}
720+
651721
// for sorting
652722
template <typename T>
653723
std::vector<std::size_t> sort_indices(const std::vector<T>& v, bool doSorting = false)
@@ -1367,23 +1437,55 @@ struct StrangenessBuilder {
13671437
straHelper.v0.positiveMomentum[0] + straHelper.v0.negativeMomentum[0],
13681438
straHelper.v0.positiveMomentum[1] + straHelper.v0.negativeMomentum[1]);
13691439

1370-
if (
1371-
!( // photon PID and mass selection
1440+
float lPtot = RecoDecay::sqrtSumOfSquares(
1441+
straHelper.v0.positiveMomentum[0] + straHelper.v0.negativeMomentum[0],
1442+
straHelper.v0.positiveMomentum[1] + straHelper.v0.negativeMomentum[1],
1443+
straHelper.v0.positiveMomentum[2] + straHelper.v0.negativeMomentum[2]);
1444+
1445+
float lLengthTraveled = RecoDecay::sqrtSumOfSquares(
1446+
straHelper.v0.position[0] - pvX,
1447+
straHelper.v0.position[1] - pvY,
1448+
straHelper.v0.position[2] - pvZ);
1449+
1450+
uint8_t maskV0Preselection = 0;
1451+
1452+
if ( // photon PID, mass, lifetime selection
13721453
std::abs(posTrack.tpcNSigmaEl()) < preSelectOpts.maxTPCpidNsigma &&
13731454
std::abs(negTrack.tpcNSigmaEl()) < preSelectOpts.maxTPCpidNsigma &&
1374-
std::abs(straHelper.v0.massGamma) < preSelectOpts.massCutPhoton) &&
1375-
!( // K0Short PID and mass selection
1455+
std::abs(straHelper.v0.massGamma) < preSelectOpts.massCutPhoton) {
1456+
BITSET(maskV0Preselection, selGamma);
1457+
}
1458+
1459+
if ( // K0Short PID, mass, lifetime selection
13761460
std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma &&
13771461
std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma &&
1378-
std::abs(straHelper.v0.massK0Short - o2::constants::physics::MassKaonNeutral) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaK0Short(lPt) + preSelectOpts.massWindowSafetyMargin) &&
1379-
!( // Lambda PID and mass selection
1462+
o2::constants::physics::MassKaonNeutral * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutK0S") &&
1463+
std::abs(straHelper.v0.massK0Short - o2::constants::physics::MassKaonNeutral) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaK0Short(lPt) + preSelectOpts.massWindowSafetyMargin) {
1464+
BITSET(maskV0Preselection, selK0Short);
1465+
}
1466+
1467+
if ( // Lambda PID, mass, lifetime selection
13801468
std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma &&
13811469
std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma &&
1382-
std::abs(straHelper.v0.massLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda(lPt) + preSelectOpts.massWindowSafetyMargin) &&
1383-
!( // antiLambda PID and mass selection
1470+
o2::constants::physics::MassLambda * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutLambda") &&
1471+
std::abs(straHelper.v0.massLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda(lPt) + preSelectOpts.massWindowSafetyMargin) {
1472+
BITSET(maskV0Preselection, selLambda);
1473+
}
1474+
1475+
if ( // antiLambda PID, mass, lifetime selection
13841476
std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma &&
13851477
std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma &&
1386-
std::abs(straHelper.v0.massAntiLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda(lPt) + preSelectOpts.massWindowSafetyMargin)) {
1478+
o2::constants::physics::MassLambda * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutLambda") &&
1479+
std::abs(straHelper.v0.massAntiLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda(lPt) + preSelectOpts.massWindowSafetyMargin) {
1480+
BITSET(maskV0Preselection, selAntiLambda);
1481+
}
1482+
1483+
histos.fill(HIST("hPreselectionV0s"), maskV0Preselection);
1484+
1485+
if ( !verifyMask(maskV0Preselection, selGamma) &&
1486+
!verifyMask(maskV0Preselection, selK0Short) &&
1487+
!verifyMask(maskV0Preselection, selLambda) &&
1488+
!verifyMask(maskV0Preselection, selAntiLambda)) {
13871489
products.v0dataLink(-1, -1);
13881490
continue;
13891491
}
@@ -1871,35 +1973,68 @@ struct StrangenessBuilder {
18711973

18721974
if constexpr (requires { posTrack.tpcNSigmaEl(); }) {
18731975
if (preSelectOpts.preselectOnlyDesiredCascades) {
1874-
if (
1875-
float lPt = RecoDecay::sqrtSumOfSquares(
1876-
straHelper.cascade.bachelorMomentum[0] + straHelper.cascade.positiveMomentum[0] + straHelper.cascade.negativeMomentum[0],
1877-
straHelper.cascade.bachelorMomentum[1] + straHelper.cascade.positiveMomentum[1] + straHelper.cascade.negativeMomentum[1]);
1976+
float lPt = RecoDecay::sqrtSumOfSquares(
1977+
straHelper.cascade.bachelorMomentum[0] + straHelper.cascade.positiveMomentum[0] + straHelper.cascade.negativeMomentum[0],
1978+
straHelper.cascade.bachelorMomentum[1] + straHelper.cascade.positiveMomentum[1] + straHelper.cascade.negativeMomentum[1]);
1979+
1980+
float lPtot = RecoDecay::sqrtSumOfSquares(
1981+
straHelper.cascade.bachelorMomentum[0] + straHelper.cascade.positiveMomentum[0] + straHelper.cascade.negativeMomentum[0],
1982+
straHelper.cascade.bachelorMomentum[1] + straHelper.cascade.positiveMomentum[1] + straHelper.cascade.negativeMomentum[1],
1983+
straHelper.cascade.bachelorMomentum[2] + straHelper.cascade.positiveMomentum[2] + straHelper.cascade.negativeMomentum[2]);
1984+
1985+
float lLengthTraveled = RecoDecay::sqrtSumOfSquares(
1986+
straHelper.cascade.cascadePosition[0] - pvX,
1987+
straHelper.cascade.cascadePosition[1] - pvY,
1988+
straHelper.cascade.cascadePosition[2] - pvZ);
18781989

1879-
!( // XiMinus PID and mass selection
1990+
uint8_t maskCascadePreselection = 0;
1991+
1992+
if ( // XiMinus PID and mass selection
18801993
straHelper.cascade.charge < 0 &&
18811994
std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma &&
18821995
std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma &&
18831996
std::abs(bachTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma &&
1884-
std::abs(straHelper.cascade.massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi(lPt) + preSelectOpts.massWindowSafetyMargin) &&
1885-
!( // XiPlus PID and mass selection
1997+
o2::constants::physics::MassXiMinus * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutXi") &&
1998+
std::abs(straHelper.cascade.massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi(lPt) + preSelectOpts.massWindowSafetyMargin) {
1999+
BITSET(maskCascadePreselection, selXiMinus);
2000+
}
2001+
2002+
if ( // XiPlus PID and mass selection
18862003
straHelper.cascade.charge > 0 &&
18872004
std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma &&
18882005
std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma &&
18892006
std::abs(bachTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma &&
1890-
std::abs(straHelper.cascade.massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi(lPt) + preSelectOpts.massWindowSafetyMargin) &&
1891-
!( // OmegaMinus PID and mass selection
2007+
o2::constants::physics::MassXiMinus * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutXi") &&
2008+
std::abs(straHelper.cascade.massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi(lPt) + preSelectOpts.massWindowSafetyMargin) {
2009+
BITSET(maskCascadePreselection, selXiPlus);
2010+
}
2011+
2012+
if ( // OmegaMinus PID and mass selection
18922013
straHelper.cascade.charge < 0 &&
18932014
std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma &&
18942015
std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma &&
18952016
std::abs(bachTrack.tpcNSigmaKa()) < preSelectOpts.maxTPCpidNsigma &&
1896-
std::abs(straHelper.cascade.massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega(lPt) + preSelectOpts.massWindowSafetyMargin) &&
1897-
!( // OmegaPlus PID and mass selection
2017+
o2::constants::physics::MassOmegaMinus * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutOmega") &&
2018+
std::abs(straHelper.cascade.massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega(lPt) + preSelectOpts.massWindowSafetyMargin) {
2019+
BITSET(maskCascadePreselection, selOmegaMinus);
2020+
}
2021+
2022+
if ( // OmegaPlus PID and mass selection
18982023
straHelper.cascade.charge > 0 &&
18992024
std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma &&
19002025
std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma &&
19012026
std::abs(bachTrack.tpcNSigmaKa()) < preSelectOpts.maxTPCpidNsigma &&
1902-
std::abs(straHelper.cascade.massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega(lPt) + preSelectOpts.massWindowSafetyMargin)) {
2027+
o2::constants::physics::MassOmegaMinus * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutOmega") &&
2028+
std::abs(straHelper.cascade.massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega(lPt) + preSelectOpts.massWindowSafetyMargin) {
2029+
BITSET(maskCascadePreselection, selOmegaPlus);
2030+
}
2031+
2032+
histos.fill(HIST("hPreselectionCascades"), maskCascadePreselection);
2033+
2034+
if (!verifyMask(maskCascadePreselection, selXiMinus) &&
2035+
!verifyMask(maskCascadePreselection, selXiPlus) &&
2036+
!verifyMask(maskCascadePreselection, selOmegaMinus) &&
2037+
!verifyMask(maskCascadePreselection, selOmegaPlus)) {
19032038
products.cascdataLink(-1);
19042039
interlinks.cascadeToCascCores.push_back(-1);
19052040
continue;

0 commit comments

Comments
 (0)