Skip to content

Commit fa79185

Browse files
ddobrigkalibuild
andauthored
PWGLF: physical primary checks for h-Str analysis (#7055)
* PWGLF: physical primary checks for h-Str analysis * Add physical primary condition also for closure * Please consider the following formatting changes (#312) * Please consider the following formatting changes (#313) --------- Co-authored-by: ALICE Builder <alibuild@users.noreply.github.com>
1 parent 7e16669 commit fa79185

6 files changed

Lines changed: 175 additions & 91 deletions

File tree

PWGLF/DataModel/LFHStrangeCorrelationTables.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ namespace o2::aod
3434
namespace triggerTracks
3535
{
3636
DECLARE_SOA_INDEX_COLUMN(Collision, collision); //!
37+
DECLARE_SOA_COLUMN(MCPhysicalPrimary, mcPhysicalPrimary, bool); // true physical primary flag
3738
DECLARE_SOA_INDEX_COLUMN_FULL(Track, track, int, Tracks, "_Trigger"); //!
3839
} // namespace triggerTracks
39-
DECLARE_SOA_TABLE(TriggerTracks, "AOD", "TRIGGERTRACKS", o2::soa::Index<>, triggerTracks::CollisionId, triggerTracks::TrackId);
40+
DECLARE_SOA_TABLE(TriggerTracks, "AOD", "TRIGGERTRACKS", o2::soa::Index<>, triggerTracks::CollisionId, triggerTracks::MCPhysicalPrimary, triggerTracks::TrackId);
4041
/// _________________________________________
4142
/// Table for storing assoc track indices
4243
namespace assocPions
@@ -57,6 +58,7 @@ DECLARE_SOA_COLUMN(CompatibleAntiLambda, compatibleAntiLambda, bool); // compati
5758
DECLARE_SOA_COLUMN(MCTrueK0Short, mcTrueK0Short, bool); // true K0Short in MC
5859
DECLARE_SOA_COLUMN(MCTrueLambda, mcTrueLambda, bool); // true Lambda in MC
5960
DECLARE_SOA_COLUMN(MCTrueAntiLambda, mcTrueAntiLambda, bool); // true AntiLambda in MC
61+
DECLARE_SOA_COLUMN(MCPhysicalPrimary, mcPhysicalPrimary, bool); // true physical primary flag
6062
DECLARE_SOA_COLUMN(MassRegionK0Short, massRegionK0Short, int); //
6163
DECLARE_SOA_COLUMN(MassRegionLambda, massRegionLambda, int); //
6264
DECLARE_SOA_COLUMN(MassRegionAntiLambda, massRegionAntiLambda, int); //
@@ -109,6 +111,7 @@ DECLARE_SOA_TABLE(AssocV0s, "AOD", "ASSOCV0S", o2::soa::Index<>,
109111
assocV0s::MCTrueK0Short,
110112
assocV0s::MCTrueLambda,
111113
assocV0s::MCTrueAntiLambda,
114+
assocV0s::MCPhysicalPrimary,
112115
assocV0s::MassRegionK0Short,
113116
assocV0s::MassRegionLambda,
114117
assocV0s::MassRegionAntiLambda,
@@ -130,6 +133,7 @@ DECLARE_SOA_COLUMN(MCTrueXiMinus, mcTrueXiMinus, bool); // true Xi
130133
DECLARE_SOA_COLUMN(MCTrueXiPlus, mcTrueXiPlus, bool); // true XiPlus in mc
131134
DECLARE_SOA_COLUMN(MCTrueOmegaMinus, mcTrueOmegaMinus, bool); // true OmegaMinus in mc
132135
DECLARE_SOA_COLUMN(MCTrueOmegaPlus, mcTrueOmegaPlus, bool); // true OmegaPlus in mc
136+
DECLARE_SOA_COLUMN(MCPhysicalPrimary, mcPhysicalPrimary, bool); // physical primary in MC
133137
DECLARE_SOA_COLUMN(MassRegionXi, massRegionXi, int); //
134138
DECLARE_SOA_COLUMN(MassRegionOmega, massRegionOmega, int); //
135139
DECLARE_SOA_DYNAMIC_COLUMN(Compatible, compatible, //! check compatibility with a hypothesis of a certain number (0 - K0, 1 - L, 2 - Lbar)
@@ -186,6 +190,7 @@ DECLARE_SOA_TABLE(AssocCascades, "AOD", "ASSOCCASCADES", o2::soa::Index<>, assoc
186190
assocCascades::MCTrueXiPlus,
187191
assocCascades::MCTrueOmegaMinus,
188192
assocCascades::MCTrueOmegaPlus,
193+
assocCascades::MCPhysicalPrimary,
189194
assocCascades::MassRegionXi,
190195
assocCascades::MassRegionOmega,
191196
assocCascades::Compatible<assocCascades::CompatibleXiMinus, assocCascades::CompatibleXiPlus, assocCascades::CompatibleOmegaMinus, assocCascades::CompatibleOmegaPlus>,

PWGLF/DataModel/LFStrangenessTables.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,7 @@ DECLARE_SOA_COLUMN(IsTrueLambda, isTrueLambda, bool); //! PDG
762762
DECLARE_SOA_COLUMN(IsTrueAntiLambda, isTrueAntiLambda, bool); //! PDG checked correctly in MC
763763
DECLARE_SOA_COLUMN(IsTrueHypertriton, isTrueHypertriton, bool); //! PDG checked correctly in MC
764764
DECLARE_SOA_COLUMN(IsTrueAntiHypertriton, isTrueAntiHypertriton, bool); //! PDG checked correctly in MC
765+
DECLARE_SOA_COLUMN(IsPhysicalPrimary, isPhysicalPrimary, bool); //! physical primary
765766

766767
// dE/dx compatibility bools
767768
DECLARE_SOA_COLUMN(IsdEdxGamma, isdEdxGamma, bool); //! compatible with dE/dx hypotheses
@@ -783,6 +784,7 @@ DECLARE_SOA_TABLE(V0Tags, "AOD", "V0TAGS",
783784
v0tag::IsTrueAntiLambda,
784785
v0tag::IsTrueHypertriton,
785786
v0tag::IsTrueAntiHypertriton,
787+
v0tag::IsPhysicalPrimary,
786788
v0tag::IsdEdxGamma,
787789
v0tag::IsdEdxK0Short,
788790
v0tag::IsdEdxLambda,
@@ -1312,10 +1314,11 @@ namespace casctag
13121314
DECLARE_SOA_COLUMN(IsInteresting, isInteresting, bool); //! will this be built or not?
13131315

13141316
// MC association bools
1315-
DECLARE_SOA_COLUMN(IsTrueXiMinus, isTrueXiMinus, bool); //! PDG checked correctly in MC
1316-
DECLARE_SOA_COLUMN(IsTrueXiPlus, isTrueXiPlus, bool); //! PDG checked correctly in MC
1317-
DECLARE_SOA_COLUMN(IsTrueOmegaMinus, isTrueOmegaMinus, bool); //! PDG checked correctly in MC
1318-
DECLARE_SOA_COLUMN(IsTrueOmegaPlus, isTrueOmegaPlus, bool); //! PDG checked correctly in MC
1317+
DECLARE_SOA_COLUMN(IsTrueXiMinus, isTrueXiMinus, bool); //! PDG checked correctly in MC
1318+
DECLARE_SOA_COLUMN(IsTrueXiPlus, isTrueXiPlus, bool); //! PDG checked correctly in MC
1319+
DECLARE_SOA_COLUMN(IsTrueOmegaMinus, isTrueOmegaMinus, bool); //! PDG checked correctly in MC
1320+
DECLARE_SOA_COLUMN(IsTrueOmegaPlus, isTrueOmegaPlus, bool); //! PDG checked correctly in MC
1321+
DECLARE_SOA_COLUMN(IsPhysicalPrimary, isPhysicalPrimary, bool); //! physical primary
13191322

13201323
// dE/dx compatibility bools
13211324
DECLARE_SOA_COLUMN(IsdEdxXiMinus, isdEdxXiMinus, bool); //! compatible with dE/dx hypotheses
@@ -1329,6 +1332,7 @@ DECLARE_SOA_TABLE(CascTags, "AOD", "CASCTAGS",
13291332
casctag::IsTrueXiPlus,
13301333
casctag::IsTrueOmegaMinus,
13311334
casctag::IsTrueOmegaPlus,
1335+
casctag::IsPhysicalPrimary,
13321336
casctag::IsdEdxXiMinus,
13331337
casctag::IsdEdxXiPlus,
13341338
casctag::IsdEdxOmegaMinus,

PWGLF/TableProducer/Strangeness/cascadebuilder.cxx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,6 +1999,7 @@ struct cascadePreselector {
19991999
bitTrueXiMinus,
20002000
bitTrueXiPlus,
20012001
bitTrueOmegaMinus,
2002+
bitPhysicalPrimary,
20022003
bitTrueOmegaPlus,
20032004
bitdEdxXiMinus,
20042005
bitdEdxXiPlus,
@@ -2098,6 +2099,7 @@ struct cascadePreselector {
20982099
void checkPDG(TCascadeObject const& lCascadeCandidate, uint16_t& maskElement)
20992100
{
21002101
int lPDG = -1;
2102+
bool physicalPrimary = false;
21012103

21022104
// Acquire all three daughter tracks, please
21032105
auto lBachTrack = lCascadeCandidate.template bachelor_as<TTrackTo>();
@@ -2123,6 +2125,7 @@ struct cascadePreselector {
21232125
for (auto& lBachMother : lMCBachTrack.template mothers_as<aod::McParticles>()) {
21242126
if (lV0Mother == lBachMother) {
21252127
lPDG = lV0Mother.pdgCode();
2128+
physicalPrimary = lV0Mother.isPhysicalPrimary();
21262129

21272130
// additionally check PDG of the mother particle if requested
21282131
if (dIfMCselectV0MotherPDG != 0) {
@@ -2152,6 +2155,8 @@ struct cascadePreselector {
21522155
bitset(maskElement, bitTrueOmegaMinus);
21532156
if (lPDG == -3334)
21542157
bitset(maskElement, bitTrueOmegaPlus);
2158+
if (physicalPrimary)
2159+
bitset(maskElement, bitPhysicalPrimary);
21552160
}
21562161
//*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
21572162
/// function to check early dE/dx selection
@@ -2232,6 +2237,7 @@ struct cascadePreselector {
22322237
casctags(validCascade,
22332238
bitcheck(selectionMask[ii], bitTrueXiMinus), bitcheck(selectionMask[ii], bitTrueXiPlus),
22342239
bitcheck(selectionMask[ii], bitTrueOmegaMinus), bitcheck(selectionMask[ii], bitTrueOmegaPlus),
2240+
bitcheck(selectionMask[ii], bitPhysicalPrimary),
22352241
bitcheck(selectionMask[ii], bitdEdxXiMinus), bitcheck(selectionMask[ii], bitdEdxXiPlus),
22362242
bitcheck(selectionMask[ii], bitdEdxOmegaMinus), bitcheck(selectionMask[ii], bitdEdxOmegaPlus));
22372243
}

PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ struct hstrangecorrelationfilter {
128128
using V0LinkedTagged = soa::Join<aod::V0sLinked, aod::V0Tags>;
129129
using CascadesLinkedTagged = soa::Join<aod::CascadesLinked, aod::CascTags>;
130130
using DauTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::TracksDCA>;
131+
using DauTracksMC = soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::TracksDCA, aod::McTrackLabels>;
131132
// using IDTracks= soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidBayesPi, aod::pidBayesKa, aod::pidBayesPr, aod::TOFSignal>; // prepared for Bayesian PID
132133
using IDTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidTPCFullKa, aod::pidTOFFullKa, aod::pidTPCFullPr, aod::pidTOFFullPr, aod::TOFSignal, aod::TracksDCA>;
133134
using V0DatasWithoutTrackX = soa::Join<aod::V0Indices, aod::V0Cores>;
@@ -166,6 +167,33 @@ struct hstrangecorrelationfilter {
166167
histos.add("h3dMassOmegaPlus", "h3dMassOmegaPlus", kTH3F, {axisPtQA, axisOmegaMass, axisMult});
167168
}
168169

170+
// reco-level trigger quality checks (N.B.: DCA is filtered, not selected)
171+
template <class TTrack>
172+
bool isValidTrigger(TTrack track)
173+
{
174+
if (track.eta() > triggerEtaMax || track.eta() < triggerEtaMin) {
175+
return false;
176+
}
177+
// if (track.sign()= 1 ) {continue;}
178+
if (track.pt() > triggerPtCutMax || track.pt() < triggerPtCutMin) {
179+
return false;
180+
}
181+
if (track.tpcNClsCrossedRows() < minTPCNCrossedRows) {
182+
return false; // crossed rows
183+
}
184+
if (!track.hasITS() && triggerRequireITS) {
185+
return false; // skip, doesn't have ITS signal (skips lots of TPC-only!)
186+
}
187+
if (track.tpcNClsShared() > triggerMaxTPCSharedClusters) {
188+
return false; // skip, has shared clusters
189+
}
190+
if (!(bitcheck(track.itsClusterMap(), 0)) && triggerRequireL0) {
191+
return false; // skip, doesn't have cluster in ITS L0
192+
}
193+
return true;
194+
}
195+
196+
// for real data processing
169197
void processTriggers(soa::Join<aod::Collisions, aod::EvSels>::iterator const& collision, soa::Filtered<DauTracks> const& tracks)
170198
{
171199
// Perform basic event selection
@@ -180,30 +208,44 @@ struct hstrangecorrelationfilter {
180208
/// _________________________________________________
181209
/// Step 1: Populate table with trigger tracks
182210
for (auto const& track : tracks) {
183-
if (track.eta() > triggerEtaMax || track.eta() < triggerEtaMin) {
211+
if (!isValidTrigger(track))
184212
continue;
185-
}
186-
// if (track.sign()= 1 ) {continue;}
187-
if (track.pt() > triggerPtCutMax || track.pt() < triggerPtCutMin) {
213+
triggerTrack(
214+
track.collisionId(),
215+
false, // if you decide to check real data for primaries, you'll have a hard time
216+
track.globalIndex());
217+
}
218+
}
219+
220+
// for MC processing
221+
void processTriggersMC(soa::Join<aod::Collisions, aod::EvSels>::iterator const& collision, soa::Filtered<DauTracksMC> const& tracks, aod::McParticles const&)
222+
{
223+
// Perform basic event selection
224+
if (!collision.sel8()) {
225+
return;
226+
}
227+
// No need to correlate stuff that's in far collisions
228+
if (TMath::Abs(collision.posZ()) > 10.0) {
229+
return;
230+
}
231+
232+
/// _________________________________________________
233+
/// Step 1: Populate table with trigger tracks
234+
for (auto const& track : tracks) {
235+
if (!isValidTrigger(track))
188236
continue;
189-
}
190-
if (track.tpcNClsCrossedRows() < minTPCNCrossedRows) {
191-
continue; // crossed rows
192-
}
193-
if (!track.hasITS() && triggerRequireITS) {
194-
continue; // skip, doesn't have ITS signal (skips lots of TPC-only!)
195-
}
196-
if (track.tpcNClsShared() > triggerMaxTPCSharedClusters) {
197-
continue; // skip, has shared clusters
198-
}
199-
if (!(bitcheck(track.itsClusterMap(), 0)) && triggerRequireL0) {
200-
continue; // skip, doesn't have cluster in ITS L0
237+
bool physicalPrimary = false;
238+
if (track.has_mcParticle()) {
239+
auto mcParticle = track.mcParticle();
240+
physicalPrimary = mcParticle.isPhysicalPrimary();
201241
}
202242
triggerTrack(
203243
track.collisionId(),
244+
physicalPrimary,
204245
track.globalIndex());
205246
}
206247
}
248+
207249
void processAssocPions(soa::Join<aod::Collisions, aod::EvSels>::iterator const& collision, soa::Filtered<IDTracks> const& tracks)
208250
{
209251
// Perform basic event selection
@@ -380,7 +422,7 @@ struct hstrangecorrelationfilter {
380422
) {
381423
assocV0(v0.collisionId(), v0.globalIndex(),
382424
compatibleK0Short, compatibleLambda, compatibleAntiLambda,
383-
origV0entry.isTrueK0Short(), origV0entry.isTrueLambda(), origV0entry.isTrueAntiLambda(),
425+
origV0entry.isTrueK0Short(), origV0entry.isTrueLambda(), origV0entry.isTrueAntiLambda(), origV0entry.isPhysicalPrimary(),
384426
massRegK0Short, massRegLambda, massRegAntiLambda);
385427
}
386428
}
@@ -482,6 +524,7 @@ struct hstrangecorrelationfilter {
482524
compatibleXiMinus, compatibleXiPlus, compatibleOmegaMinus, compatibleOmegaPlus,
483525
origCascadeEntry.isTrueXiMinus(), origCascadeEntry.isTrueXiPlus(),
484526
origCascadeEntry.isTrueOmegaMinus(), origCascadeEntry.isTrueOmegaPlus(),
527+
origCascadeEntry.isPhysicalPrimary(),
485528
massRegXi, massRegOmega);
486529
}
487530
}

PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,7 +1377,7 @@ struct lambdakzeroPreselector {
13771377
Configurable<int> minITSCluITSOnly{"minITSCluITSOnly", 0, "minimum number of ITS clusters to ask for if daughter track does not have TPC"};
13781378

13791379
// for bit-packed maps
1380-
std::vector<uint16_t> selectionMask;
1380+
std::vector<uint32_t> selectionMask;
13811381
enum v0bit { bitInteresting = 0,
13821382
bitTrackQuality,
13831383
bitTrueGamma,
@@ -1386,6 +1386,7 @@ struct lambdakzeroPreselector {
13861386
bitTrueAntiLambda,
13871387
bitTrueHypertriton,
13881388
bitTrueAntiHypertriton,
1389+
bitPhysicalPrimary,
13891390
bitdEdxGamma,
13901391
bitdEdxK0Short,
13911392
bitdEdxLambda,
@@ -1419,7 +1420,7 @@ struct lambdakzeroPreselector {
14191420
//*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
14201421
/// function to check track quality
14211422
template <class TTrackTo, typename TV0Object>
1422-
void checkTrackQuality(TV0Object const& lV0Candidate, uint16_t& maskElement, bool passdEdx = false)
1423+
void checkTrackQuality(TV0Object const& lV0Candidate, uint32_t& maskElement, bool passdEdx = false)
14231424
{
14241425
auto lNegTrack = lV0Candidate.template negTrack_as<TTrackTo>();
14251426
auto lPosTrack = lV0Candidate.template posTrack_as<TTrackTo>();
@@ -1462,9 +1463,10 @@ struct lambdakzeroPreselector {
14621463
//*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
14631464
/// function to check PDG association
14641465
template <class TTrackTo, typename TV0Object>
1465-
void checkPDG(TV0Object const& lV0Candidate, uint16_t& maskElement)
1466+
void checkPDG(TV0Object const& lV0Candidate, uint32_t& maskElement)
14661467
{
14671468
int lPDG = -1;
1469+
bool physicalPrimary = false;
14681470
auto lNegTrack = lV0Candidate.template negTrack_as<TTrackTo>();
14691471
auto lPosTrack = lV0Candidate.template posTrack_as<TTrackTo>();
14701472

@@ -1478,6 +1480,7 @@ struct lambdakzeroPreselector {
14781480
for (auto& lPosMother : lMCPosTrack.template mothers_as<aod::McParticles>()) {
14791481
if (lNegMother.globalIndex() == lPosMother.globalIndex() && (!dIfMCselectPhysicalPrimary || lNegMother.isPhysicalPrimary())) {
14801482
lPDG = lNegMother.pdgCode();
1483+
physicalPrimary = lNegMother.isPhysicalPrimary();
14811484

14821485
// additionally check PDG of the mother particle if requested
14831486
if (dIfMCselectV0MotherPDG != 0) {
@@ -1507,10 +1510,12 @@ struct lambdakzeroPreselector {
15071510
bitset(maskElement, bitTrueHypertriton);
15081511
if (lPDG == -1010010030)
15091512
bitset(maskElement, bitTrueAntiHypertriton);
1513+
if (physicalPrimary)
1514+
bitset(maskElement, bitPhysicalPrimary);
15101515
}
15111516
//*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
15121517
template <class TTrackTo, typename TV0Object>
1513-
void checkdEdx(TV0Object const& lV0Candidate, uint16_t& maskElement)
1518+
void checkdEdx(TV0Object const& lV0Candidate, uint32_t& maskElement)
15141519
{
15151520
auto lNegTrack = lV0Candidate.template negTrack_as<TTrackTo>();
15161521
auto lPosTrack = lV0Candidate.template posTrack_as<TTrackTo>();
@@ -1593,7 +1598,8 @@ struct lambdakzeroPreselector {
15931598
}
15941599
v0tags(validV0,
15951600
bitcheck(selectionMask[ii], bitTrueGamma), bitcheck(selectionMask[ii], bitTrueK0Short), bitcheck(selectionMask[ii], bitTrueLambda),
1596-
bitcheck(selectionMask[ii], bitTrueAntiLambda), bitcheck(selectionMask[ii], bitTrueHypertriton), bitcheck(selectionMask[ii], bitTrueAntiHypertriton),
1601+
bitcheck(selectionMask[ii], bitTrueAntiLambda),
1602+
bitcheck(selectionMask[ii], bitTrueHypertriton), bitcheck(selectionMask[ii], bitTrueAntiHypertriton), bitcheck(selectionMask[ii], bitPhysicalPrimary),
15971603
bitcheck(selectionMask[ii], bitdEdxGamma), bitcheck(selectionMask[ii], bitdEdxK0Short), bitcheck(selectionMask[ii], bitdEdxLambda),
15981604
bitcheck(selectionMask[ii], bitdEdxAntiLambda), bitcheck(selectionMask[ii], bitdEdxHypertriton), bitcheck(selectionMask[ii], bitdEdxAntiHypertriton),
15991605
bitcheck(selectionMask[ii], bitUsedInCascade), bitcheck(selectionMask[ii], bitUsedInTrackedCascade));

0 commit comments

Comments
 (0)