Skip to content

Commit f573464

Browse files
authored
[PWGLF] Add ambiguous track cut and Bug fix in hStrangeCorrelation (#17815)
1 parent 06a9594 commit f573464

2 files changed

Lines changed: 65 additions & 15 deletions

File tree

PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "Common/Core/Zorro.h"
2626
#include "Common/Core/ZorroSummary.h"
2727
#include "Common/DataModel/Centrality.h"
28+
#include "Common/DataModel/CollisionAssociationTables.h"
2829
#include "Common/DataModel/EventSelection.h"
2930
#include "Common/DataModel/Multiplicity.h"
3031
#include "Common/DataModel/PIDResponseTOF.h"
@@ -82,6 +83,8 @@ struct HStrangeCorrelationFilter {
8283
Configurable<float> strangedEdxNSigmaTight{"strangedEdxNSigmaTight", 3, "Nsigmas for strange decay daughters"};
8384
Configurable<std::string> zorroMask{"zorroMask", "", "zorro trigger class to select on (empty: none)"};
8485
Configurable<float> nSigmaNearXiMassCenter{"nSigmaNearXiMassCenter", 0, "for Oemga analysis only, to check if candidate mass is around Xi"};
86+
Configurable<bool> rejectAmbiguousTracks{"rejectAmbiguousTracks", false, "reject tracks compatible with more than one collision (requires track-to-collision-associator with fillTableOfCollIdsPerTrack)"};
87+
Configurable<bool> rejectAmbiguousAssoc{"rejectAmbiguousAssoc", false, "reject V0/cascade candidates having at least one ambiguous daughter track"};
8588

8689
// used for event selections in Pb-Pb
8790
Configurable<int> cfgCutOccupancyHigh{"cfgCutOccupancyHigh", 3000, "High cut on TPC occupancy"};
@@ -210,10 +213,10 @@ struct HStrangeCorrelationFilter {
210213

211214
// using V0LinkedTagged = soa::Join<aod::V0sLinked, aod::V0Tags>;
212215
// using CascadesLinkedTagged = soa::Join<aod::CascadesLinked, aod::CascTags>;
213-
using FullTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA>;
214-
using FullTracksMC = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::McTrackLabels>;
215-
using DauTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::TracksDCA>;
216-
using DauTracksMC = soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::TracksDCA, aod::McTrackLabels>;
216+
using FullTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackCompColls>;
217+
using FullTracksMC = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::McTrackLabels, aod::TrackCompColls>;
218+
using DauTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::TracksDCA, aod::TrackCompColls>;
219+
using DauTracksMC = soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::TracksDCA, aod::McTrackLabels, aod::TrackCompColls>;
217220
// using IDTracks= soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidBayesPi, aod::pidBayesKa, aod::pidBayesPr, aod::TOFSignal>; // prepared for Bayesian PID
218221
using IDTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidTPCFullKa, aod::pidTOFFullKa, aod::pidTPCFullPr, aod::pidTOFFullPr, aod::pidTPCFullEl, aod::pidTOFFullEl, aod::TOFSignal, aod::TracksDCA>;
219222
using IDTracksMC = soa::Join<aod::Tracks, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidTPCFullKa, aod::pidTOFFullKa, aod::pidTPCFullPr, aod::pidTOFFullPr, aod::pidTPCFullEl, aod::pidTOFFullEl, aod::TOFSignal, aod::TracksDCA, aod::McTrackLabels>;
@@ -300,12 +303,21 @@ struct HStrangeCorrelationFilter {
300303
histos.add("h3dMassLambda", "h3dMassLambda", kTH3F, {axesConfigurations.axisPtQA, axesConfigurations.axisLambdaMass, axesConfigurations.axisMult});
301304
histos.add("h3dMassAntiLambda", "h3dMassAntiLambda", kTH3F, {axesConfigurations.axisPtQA, axesConfigurations.axisLambdaMass, axesConfigurations.axisMult});
302305
}
306+
if (rejectAmbiguousAssoc && (doprocessV0s || doprocessV0sMC)) {
307+
histos.add("hAmbiguousV0Pt", "hAmbiguousV0Pt", kTH1F, {axesConfigurations.axisPtQA});
308+
}
309+
if (rejectAmbiguousTracks && (doprocessTriggers || doprocessTriggersMC)) {
310+
histos.add("hAmbiguousTriggerPt", "hAmbiguousTriggerPt", kTH1F, {axesConfigurations.axisPtQA});
311+
}
303312
if (doprocessCascades || doprocessCascadesMC) {
304313
histos.add("h3dMassXiMinus", "h3dMassXiMinus", kTH3F, {axesConfigurations.axisPtQA, axesConfigurations.axisXiMass, axesConfigurations.axisMult});
305314
histos.add("h3dMassXiPlus", "h3dMassXiPlus", kTH3F, {axesConfigurations.axisPtQA, axesConfigurations.axisXiMass, axesConfigurations.axisMult});
306315
histos.add("h3dMassOmegaMinus", "h3dMassOmegaMinus", kTH3F, {axesConfigurations.axisPtQA, axesConfigurations.axisOmegaMass, axesConfigurations.axisMult});
307316
histos.add("h3dMassOmegaPlus", "h3dMassOmegaPlus", kTH3F, {axesConfigurations.axisPtQA, axesConfigurations.axisOmegaMass, axesConfigurations.axisMult});
308317
}
318+
if (rejectAmbiguousAssoc && (doprocessCascades || doprocessCascadesMC)) {
319+
histos.add("hAmbiguousCascadePt", "hAmbiguousCascadePt", kTH1F, {axesConfigurations.axisPtQA});
320+
}
309321
}
310322

311323
void initCCDB(aod::BCsWithTimestamps::iterator const& bc)
@@ -410,6 +422,20 @@ struct HStrangeCorrelationFilter {
410422
return true;
411423
}
412424

425+
// ambiguous track check: the track is compatible with more than one collision,
426+
// or with a collision different from the one it is assigned to (see PWGCF/TableProducer/dptDptFilter.cxx)
427+
template <class TTrack>
428+
bool isAmbiguousTrack(TTrack const& track)
429+
{
430+
if (track.compatibleCollIds().size() == 0) {
431+
return false; // no collision association information: not ambiguous
432+
}
433+
if (track.compatibleCollIds().size() == 1) {
434+
return track.collisionId() != track.compatibleCollIds()[0];
435+
}
436+
return true; // associated to more than one collision
437+
}
438+
413439
// reco-level trigger quality checks (N.B.: DCA is filtered, not selected)
414440
template <class TTrack>
415441
bool isValidTrigger(TTrack const& track)
@@ -593,6 +619,10 @@ struct HStrangeCorrelationFilter {
593619
if (!isValidTrigger(track)) {
594620
continue;
595621
}
622+
if (rejectAmbiguousTracks && isAmbiguousTrack(track)) {
623+
histos.fill(HIST("hAmbiguousTriggerPt"), track.pt());
624+
continue;
625+
}
596626
TriggCandidate thisTrigg{};
597627
thisTrigg.pt = track.pt();
598628
thisTrigg.trackId = track.globalIndex();
@@ -634,6 +664,10 @@ struct HStrangeCorrelationFilter {
634664
if (!isValidTrigger(track)) {
635665
continue;
636666
}
667+
if (rejectAmbiguousTracks && isAmbiguousTrack(track)) {
668+
histos.fill(HIST("hAmbiguousTriggerPt"), track.pt());
669+
continue;
670+
}
637671
TriggCandidate thisTrigg{};
638672
thisTrigg.pt = track.pt();
639673
thisTrigg.trackId = track.globalIndex();
@@ -812,6 +846,10 @@ struct HStrangeCorrelationFilter {
812846
if (trackSelections.requireClusterInITS && (posdau.itsNCls() < trackSelections.minITSClustersForDaughterTracks || negdau.itsNCls() < trackSelections.minITSClustersForDaughterTracks)) {
813847
continue;
814848
}
849+
if (rejectAmbiguousAssoc && (isAmbiguousTrack(posdau) || isAmbiguousTrack(negdau))) {
850+
histos.fill(HIST("hAmbiguousV0Pt"), v0.pt());
851+
continue;
852+
}
815853

816854
float dcaDauCutForK0s = v0Selection.dcaDaugToPVForK0s == 0 ? v0Selection.dcaMesonToPV : v0Selection.dcaDaugToPVForK0s;
817855
bool isGoodK0Short = (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < v0Selection.lifetimecutK0S &&
@@ -947,6 +985,10 @@ struct HStrangeCorrelationFilter {
947985
if (trackSelections.requireClusterInITS && (posdau.itsNCls() < trackSelections.minITSClustersForDaughterTracks || negdau.itsNCls() < trackSelections.minITSClustersForDaughterTracks)) {
948986
continue;
949987
}
988+
if (rejectAmbiguousAssoc && (isAmbiguousTrack(posdau) || isAmbiguousTrack(negdau))) {
989+
histos.fill(HIST("hAmbiguousV0Pt"), v0.pt());
990+
continue;
991+
}
950992

951993
float dcaDauCutForK0s = v0Selection.dcaDaugToPVForK0s == 0 ? v0Selection.dcaMesonToPV : v0Selection.dcaDaugToPVForK0s;
952994
bool isGoodK0Short = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < v0Selection.lifetimecutK0S &&
@@ -1101,6 +1143,10 @@ struct HStrangeCorrelationFilter {
11011143
if (negTrackCast.tpcNClsCrossedRows() < trackSelections.minTPCNCrossedRows) {
11021144
continue;
11031145
}
1146+
if (rejectAmbiguousAssoc && (isAmbiguousTrack(bachTrackCast) || isAmbiguousTrack(posTrackCast) || isAmbiguousTrack(negTrackCast))) {
1147+
histos.fill(HIST("hAmbiguousCascadePt"), casc.pt());
1148+
continue;
1149+
}
11041150
if (!doPPAnalysis && !cascadeSelectedPbPb(casc, collision.posX(), collision.posY(), collision.posZ())) {
11051151
continue;
11061152
}
@@ -1270,6 +1316,10 @@ struct HStrangeCorrelationFilter {
12701316
if (negTrackCast.tpcNClsCrossedRows() < trackSelections.minTPCNCrossedRows) {
12711317
continue;
12721318
}
1319+
if (rejectAmbiguousAssoc && (isAmbiguousTrack(bachTrackCast) || isAmbiguousTrack(posTrackCast) || isAmbiguousTrack(negTrackCast))) {
1320+
histos.fill(HIST("hAmbiguousCascadePt"), casc.pt());
1321+
continue;
1322+
}
12731323
if (!doPPAnalysis && !cascadeSelectedPbPb(casc, collision.posX(), collision.posY(), collision.posZ())) {
12741324
continue;
12751325
}

PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ struct HStrangeCorrelation {
222222
Configurable<int> assocMaxTPCSharedClusters{"assocMaxTPCSharedClusters", 200, "maximum number of shared TPC clusters (inclusive) for assoc primary tracks"};
223223
Configurable<bool> triggerRequireL0{"triggerRequireL0", false, "require ITS L0 cluster for trigger"};
224224
Configurable<bool> assocRequireL0{"assocRequireL0", true, "require ITS L0 cluster for assoc primary track"};
225-
Configurable<float> minTPCChi2PerClusterAssociated{"minTPCChi2PerClusterAssociated", 4.0f, "Minimum TPC chi2 per cluster for associated primary tracks"};
225+
Configurable<float> maxTPCChi2PerClusterAssociated{"maxTPCChi2PerClusterAssociated", 4.0f, "Maximum TPC chi2 per cluster for associated primary tracks"};
226226
Configurable<bool> checksRequireTPCChi2{"checksRequireTPCChi2", false, "require TPC chi2 per cluster for trigger and associated primary tracks"};
227227
Configurable<bool> requireClusterInITS{"requireClusterInITS", false, "require cluster in ITS for V0 and cascade daughter tracks"};
228228
Configurable<int> minITSClustersForDaughterTracks{"minITSClustersForDaughterTracks", 1, "Minimum number of ITS clusters for V0 daughter tracks"};
@@ -1389,7 +1389,7 @@ struct HStrangeCorrelation {
13891389
if (postrack.tpcNClsCrossedRows() < trackSelection.minTPCNCrossedRowsAssociated || negtrack.tpcNClsCrossedRows() < trackSelection.minTPCNCrossedRowsAssociated) {
13901390
continue;
13911391
}
1392-
if (trackSelection.checksRequireTPCChi2 && (postrack.tpcChi2NCl() < trackSelection.minTPCChi2PerClusterAssociated || negtrack.tpcChi2NCl() < trackSelection.minTPCChi2PerClusterAssociated)) {
1392+
if (trackSelection.checksRequireTPCChi2 && (postrack.tpcChi2NCl() > trackSelection.maxTPCChi2PerClusterAssociated || negtrack.tpcChi2NCl() > trackSelection.maxTPCChi2PerClusterAssociated)) {
13931393
continue;
13941394
}
13951395
if (trackSelection.requireClusterInITS && (postrack.itsNCls() < trackSelection.minITSClustersForDaughterTracks || negtrack.itsNCls() < trackSelection.minITSClustersForDaughterTracks)) {
@@ -1946,7 +1946,7 @@ struct HStrangeCorrelation {
19461946
if (postrack.tpcNClsCrossedRows() < trackSelection.minTPCNCrossedRowsAssociated || negtrack.tpcNClsCrossedRows() < trackSelection.minTPCNCrossedRowsAssociated || bachtrack.tpcNClsCrossedRows() < trackSelection.minTPCNCrossedRowsAssociated) {
19471947
continue;
19481948
}
1949-
if (trackSelection.checksRequireTPCChi2 && (postrack.tpcChi2NCl() < trackSelection.minTPCChi2PerClusterAssociated || negtrack.tpcChi2NCl() < trackSelection.minTPCChi2PerClusterAssociated || bachtrack.tpcChi2NCl() < trackSelection.minTPCChi2PerClusterAssociated)) {
1949+
if (trackSelection.checksRequireTPCChi2 && (postrack.tpcChi2NCl() > trackSelection.maxTPCChi2PerClusterAssociated || negtrack.tpcChi2NCl() > trackSelection.maxTPCChi2PerClusterAssociated || bachtrack.tpcChi2NCl() > trackSelection.maxTPCChi2PerClusterAssociated)) {
19501950
continue;
19511951
}
19521952
if (trackSelection.requireClusterInITS && (postrack.itsNCls() < trackSelection.minITSClustersForDaughterTracks || negtrack.itsNCls() < trackSelection.minITSClustersForDaughterTracks || bachtrack.itsNCls() < trackSelection.minITSClustersForDaughterTracks)) {
@@ -3565,7 +3565,7 @@ struct HStrangeCorrelation {
35653565
if (postrack.tpcNClsCrossedRows() < trackSelection.minTPCNCrossedRowsAssociated || negtrack.tpcNClsCrossedRows() < trackSelection.minTPCNCrossedRowsAssociated) {
35663566
continue;
35673567
}
3568-
if (trackSelection.checksRequireTPCChi2 && (postrack.tpcChi2NCl() < trackSelection.minTPCChi2PerClusterAssociated || negtrack.tpcChi2NCl() < trackSelection.minTPCChi2PerClusterAssociated)) {
3568+
if (trackSelection.checksRequireTPCChi2 && (postrack.tpcChi2NCl() > trackSelection.maxTPCChi2PerClusterAssociated || negtrack.tpcChi2NCl() > trackSelection.maxTPCChi2PerClusterAssociated)) {
35693569
continue;
35703570
}
35713571
if (trackSelection.requireClusterInITS && (postrack.itsNCls() < trackSelection.minITSClustersForDaughterTracks || negtrack.itsNCls() < trackSelection.minITSClustersForDaughterTracks)) {
@@ -3779,7 +3779,7 @@ struct HStrangeCorrelation {
37793779
if (postrack.tpcNClsCrossedRows() < trackSelection.minTPCNCrossedRowsAssociated || negtrack.tpcNClsCrossedRows() < trackSelection.minTPCNCrossedRowsAssociated || bachtrack.tpcNClsCrossedRows() < trackSelection.minTPCNCrossedRowsAssociated) {
37803780
continue;
37813781
}
3782-
if (trackSelection.checksRequireTPCChi2 && (postrack.tpcChi2NCl() < trackSelection.minTPCChi2PerClusterAssociated || negtrack.tpcChi2NCl() < trackSelection.minTPCChi2PerClusterAssociated || bachtrack.tpcChi2NCl() < trackSelection.minTPCChi2PerClusterAssociated)) {
3782+
if (trackSelection.checksRequireTPCChi2 && (postrack.tpcChi2NCl() > trackSelection.maxTPCChi2PerClusterAssociated || negtrack.tpcChi2NCl() > trackSelection.maxTPCChi2PerClusterAssociated || bachtrack.tpcChi2NCl() > trackSelection.maxTPCChi2PerClusterAssociated)) {
37833783
continue;
37843784
}
37853785
if (trackSelection.requireClusterInITS && (postrack.itsNCls() < trackSelection.minITSClustersForDaughterTracks || negtrack.itsNCls() < trackSelection.minITSClustersForDaughterTracks)) {
@@ -4865,8 +4865,8 @@ struct HStrangeCorrelation {
48654865
passesFinalSelection = passesFinalSelection && positiveTrack.tpcNClsCrossedRows() >= trackSelection.minTPCNCrossedRowsAssociated &&
48664866
negativeTrack.tpcNClsCrossedRows() >= trackSelection.minTPCNCrossedRowsAssociated;
48674867
if (trackSelection.checksRequireTPCChi2) {
4868-
passesFinalSelection = passesFinalSelection && positiveTrack.tpcChi2NCl() >= trackSelection.minTPCChi2PerClusterAssociated &&
4869-
negativeTrack.tpcChi2NCl() >= trackSelection.minTPCChi2PerClusterAssociated;
4868+
passesFinalSelection = passesFinalSelection && positiveTrack.tpcChi2NCl() <= trackSelection.maxTPCChi2PerClusterAssociated &&
4869+
negativeTrack.tpcChi2NCl() <= trackSelection.maxTPCChi2PerClusterAssociated;
48704870
}
48714871
if (trackSelection.requireClusterInITS) {
48724872
passesFinalSelection = passesFinalSelection && positiveTrack.itsNCls() >= trackSelection.minITSClustersForDaughterTracks &&
@@ -5217,8 +5217,8 @@ struct HStrangeCorrelation {
52175217
passesFinalSelection = passesFinalSelection && positiveTrack.tpcNClsCrossedRows() >= trackSelection.minTPCNCrossedRowsAssociated &&
52185218
negativeTrack.tpcNClsCrossedRows() >= trackSelection.minTPCNCrossedRowsAssociated;
52195219
if (trackSelection.checksRequireTPCChi2) {
5220-
passesFinalSelection = passesFinalSelection && positiveTrack.tpcChi2NCl() >= trackSelection.minTPCChi2PerClusterAssociated &&
5221-
negativeTrack.tpcChi2NCl() >= trackSelection.minTPCChi2PerClusterAssociated;
5220+
passesFinalSelection = passesFinalSelection && positiveTrack.tpcChi2NCl() <= trackSelection.maxTPCChi2PerClusterAssociated &&
5221+
negativeTrack.tpcChi2NCl() <= trackSelection.maxTPCChi2PerClusterAssociated;
52225222
}
52235223
if (trackSelection.requireClusterInITS) {
52245224
passesFinalSelection = passesFinalSelection && positiveTrack.itsNCls() >= trackSelection.minITSClustersForDaughterTracks &&
@@ -5756,8 +5756,8 @@ struct HStrangeCorrelation {
57565756
passesFinalSelection = passesFinalSelection && positiveTrack.tpcNClsCrossedRows() >= trackSelection.minTPCNCrossedRowsAssociated &&
57575757
negativeTrack.tpcNClsCrossedRows() >= trackSelection.minTPCNCrossedRowsAssociated;
57585758
if (trackSelection.checksRequireTPCChi2) {
5759-
passesFinalSelection = passesFinalSelection && positiveTrack.tpcChi2NCl() >= trackSelection.minTPCChi2PerClusterAssociated &&
5760-
negativeTrack.tpcChi2NCl() >= trackSelection.minTPCChi2PerClusterAssociated;
5759+
passesFinalSelection = passesFinalSelection && positiveTrack.tpcChi2NCl() <= trackSelection.maxTPCChi2PerClusterAssociated &&
5760+
negativeTrack.tpcChi2NCl() <= trackSelection.maxTPCChi2PerClusterAssociated;
57615761
}
57625762
if (trackSelection.requireClusterInITS) {
57635763
passesFinalSelection = passesFinalSelection && positiveTrack.itsNCls() >= trackSelection.minITSClustersForDaughterTracks &&

0 commit comments

Comments
 (0)