Skip to content

Commit 09a2d34

Browse files
[PWGHF,Trigger] Add track quality selection in HF filter (#11371)
1 parent 2abd9d8 commit 09a2d34

File tree

2 files changed

+55
-8
lines changed

2 files changed

+55
-8
lines changed

EventFiltering/PWGHF/HFFilter.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ struct HfFilter { // Main struct for HF triggers
7676
Configurable<LabeledArray<float>> nSigmaPidCuts{"nSigmaPidCuts", {cutsNsigma[0], 4, 8, labelsRowsNsigma, labelsColumnsNsigma}, "Nsigma cuts for ITS/TPC/TOF PID (except for V0 and cascades)"};
7777
// min and max pts for tracks and bachelors (except for V0 and cascades)
7878
Configurable<LabeledArray<float>> ptCuts{"ptCuts", {cutsPt[0], 2, 10, labelsRowsCutsPt, labelsColumnsCutsPt}, "minimum and maximum pT for bachelor tracks (except for V0 and cascades)"};
79-
79+
Configurable<LabeledArray<float>> trackQaulityCuts{"trackQaulityCuts", {cutsTrackQuality[0], 2, 7, labelsColumnsPtThresholdsForFemto, labelsColumnsTrackQuality}, "Track quality cuts for proton and deuteron)"};
8080
// parameters for high-pT triggers
8181
Configurable<LabeledArray<float>> ptThresholds{"ptThresholds", {cutsHighPtThresholds[0], 1, 2, labelsEmpty, labelsColumnsHighPtThresholds}, "pT treshold for high pT charm hadron candidates for kHighPt triggers in GeV/c"};
8282

@@ -215,6 +215,7 @@ struct HfFilter { // Main struct for HF triggers
215215
helper.setCutsBtoJPsi(cutsBtoHadrons.cutsBtoJPsiX);
216216
helper.setNsigmaProtonCutsForFemto(std::array{nSigmaPidCuts->get(0u, 3u), nSigmaPidCuts->get(1u, 3u), nSigmaPidCuts->get(2u, 3u), nSigmaPidCuts->get(3u, 3u)});
217217
helper.setNsigmaDeuteronCutsForFemto(std::array{nSigmaPidCuts->get(0u, 6u), nSigmaPidCuts->get(1u, 6u), nSigmaPidCuts->get(2u, 6u), nSigmaPidCuts->get(3u, 6u)});
218+
helper.setDeuteronTrackSelectionForFemto(trackQaulityCuts->get(1u, 0u), trackQaulityCuts->get(1u, 1u), trackQaulityCuts->get(1u, 2u), trackQaulityCuts->get(1u, 3u), trackQaulityCuts->get(1u, 4u), trackQaulityCuts->get(1u, 5u), trackQaulityCuts->get(1u, 6u));
218219
helper.setNsigmaProtonCutsForCharmBaryons(nSigmaPidCuts->get(0u, 0u), nSigmaPidCuts->get(1u, 0u));
219220
helper.setNsigmaPionKaonCutsForDzero(nSigmaPidCuts->get(0u, 1u), nSigmaPidCuts->get(1u, 1u));
220221
helper.setNsigmaKaonCutsFor3Prongs(nSigmaPidCuts->get(0u, 2u), nSigmaPidCuts->get(1u, 2u));

EventFiltering/PWGHF/HFFilterHelpers.h

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,11 @@ constexpr float cutsNsigma[4][8] = {
313313
static const std::vector<std::string> labelsColumnsNsigma = {"PrFromLc", "PiKaFromDZero", "KaFrom3Prong", "PrForFemto", "PiKaFromCharmBaryon", "SoftKaonFromXicResoToSigmaC", "DeForFemto", "KaPrFromBeautyToJPsi"};
314314
static const std::vector<std::string> labelsRowsNsigma = {"TPC", "TOF", "Comb", "ITS"};
315315

316+
// track cut
317+
constexpr float cutsTrackQuality[2][7] = {{0., 0., 0., 999., 999., 0., 0.},
318+
{90, 80, 0.83, 160., 1., 5., 0.}};
319+
static const std::vector<std::string> labelsColumnsTrackQuality = {"minTpcCluster", "minTpcRow", "minTpcCrossedOverFound", "maxTpcShared", "maxTpcFracShared", "minItsCluster", "minItsIbCluster"};
320+
316321
// high pt
317322
constexpr float cutsHighPtThresholds[1][2] = {{8., 8.}}; // 2-prongs, 3-prongs
318323
static const std::vector<std::string> labelsColumnsHighPtThresholds = {"2Prongs", "3Prongs"};
@@ -489,6 +494,18 @@ class HfFilterHelper
489494

490495
void setNsigmaProtonCutsForFemto(std::array<float, 4> nSigmaCuts) { mNSigmaPrCutsForFemto = nSigmaCuts; }
491496
void setNsigmaDeuteronCutsForFemto(std::array<float, 4> nSigmaCuts) { mNSigmaDeCutsForFemto = nSigmaCuts; }
497+
498+
void setDeuteronTrackSelectionForFemto(float minTpcCluster, float minTpcRow, float minTpcCrossedOverFound, float maxTpcShared, float maxTpcFracShared, float minItsCluster, float minItsIbCluster)
499+
{
500+
mMinTpcCluster = minTpcCluster;
501+
mMinTpcRow = minTpcRow;
502+
mMinTpcCrossedOverFound = minTpcCrossedOverFound;
503+
mMaxTpcShared = maxTpcShared;
504+
mMaxTpcFracShared = maxTpcFracShared;
505+
mMinItsCluster = minItsCluster;
506+
mMinItsIbCluster = minItsIbCluster;
507+
}
508+
492509
void setNsigmaProtonCutsForCharmBaryons(float nSigmaTpc, float nSigmaTof)
493510
{
494511
mNSigmaTpcPrCutForCharmBaryons = nSigmaTpc;
@@ -754,7 +771,13 @@ class HfFilterHelper
754771
std::array<float, 2> mCosPaMinXiBach{-2.f, -2.f}; // minimum cosine of pointing angle for XiBachelor candidates
755772
std::array<o2::framework::LabeledArray<double>, kNBeautyParticles> mCutsBhad{}; // selections for B-hadron candidates (DeltaMass, CPA, DecayLength, ImpactParameterProduct)
756773
o2::framework::LabeledArray<double> mCutsBhadToJPsi{}; // selections for B->JPsi candidates (PtMinMu, DeltaMass, CPA, DecayLength)
757-
774+
float mMinTpcCluster{90.}; // Minimum number of TPC clusters required on a track
775+
float mMinTpcRow{80.}; // Minimum number of TPC rows (pad rows) traversed by the track
776+
float mMinTpcCrossedOverFound{0.83}; // Minimum ratio of crossed TPC rows over findable clusters
777+
float mMaxTpcShared{160.}; // Maximum allowed number of shared TPC clusters between tracks
778+
float mMaxTpcFracShared{1.}; // Maximum allowed fraction of shared TPC clusters relative to total clusters
779+
float mMinItsCluster{1.}; // Minimum required number of ITS clusters
780+
float mMinItsIbCluster{1.}; // Minimum required number of ITS clusters for IB
758781
// PID recalibrations
759782
int mTpcPidCalibrationOption{0}; // Option for TPC PID calibration (0 -> AO2D, 1 -> postcalibrations, 2 -> alternative bethe bloch parametrisation)
760783
std::array<TH3F*, 8> mHistMapPiPrKaDe{}; // Map for TPC PID postcalibrations for pions, kaon, protons and deuterons
@@ -941,9 +964,9 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra
941964
}
942965

943966
float NSigma = std::sqrt(NSigmaTPC * NSigmaTPC + NSigmaTOF * NSigmaTOF);
944-
967+
float momentum = track.p();
945968
if (trackSpecies == kProtonForFemto) {
946-
if (pt <= ptThresholdPidStrategy) {
969+
if (momentum <= ptThresholdPidStrategy) {
947970
if (NSigma > nSigmaCuts[2]) {
948971
return false;
949972
}
@@ -955,9 +978,32 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra
955978
}
956979
// For deuterons: Determine whether to apply TOF based on pt threshold
957980
if (trackSpecies == kDeuteronForFemto) {
981+
982+
if (track.tpcNClsFound() < mMinTpcCluster) {
983+
return false;
984+
}
985+
if (track.tpcNClsCrossedRows() < mMinTpcRow) {
986+
return false;
987+
}
988+
if (track.tpcCrossedRowsOverFindableCls() < mMinTpcCrossedOverFound) {
989+
return false;
990+
}
991+
if (track.tpcNClsShared() > mMaxTpcShared) {
992+
return false;
993+
}
994+
if (track.tpcFractionSharedCls() > mMaxTpcFracShared) {
995+
return false;
996+
}
997+
if (track.itsNCls() < mMinItsCluster) {
998+
return false;
999+
}
1000+
if (track.itsNClsInnerBarrel() < mMinItsIbCluster) {
1001+
return false;
1002+
}
1003+
9581004
// Apply different PID strategy in different pt range
9591005
// one side selection only
960-
if (pt <= ptThresholdPidStrategy) {
1006+
if (momentum <= ptThresholdPidStrategy) {
9611007
if (std::fabs(NSigmaTPC) > nSigmaCuts[0] || NSigmaITS < -nSigmaCuts[3]) { // Use TPC and ITS below the threshold, NSigmaITS for deuteron with a lower limit
9621008
return false;
9631009
}
@@ -972,9 +1018,9 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra
9721018
hTPCPID->Fill(track.p(), NSigmaTPC);
9731019
if ((!forceTof || track.hasTOF())) {
9741020
if (trackSpecies == kProtonForFemto)
975-
hTOFPID->Fill(track.p(), NSigmaTOF);
976-
else if (trackSpecies == kDeuteronForFemto && pt > ptThresholdPidStrategy)
977-
hTOFPID->Fill(track.p(), NSigmaTOF);
1021+
hTOFPID->Fill(momentum, NSigmaTOF);
1022+
else if (trackSpecies == kDeuteronForFemto && momentum > ptThresholdPidStrategy)
1023+
hTOFPID->Fill(momentum, NSigmaTOF);
9781024
}
9791025
}
9801026

0 commit comments

Comments
 (0)