Skip to content

Commit 604a2a8

Browse files
authored
PWGEM/Dilepton: update ITS cluster size cut (AliceO2Group#8066)
* PWGEM/Dilepton: update ITS cluster size cut * PWGEM/Dilepton: update eventQC task * PWGEM/Dilepton: add an eID cut ITSTOFreq
1 parent 12d7bd1 commit 604a2a8

File tree

8 files changed

+86
-31
lines changed

8 files changed

+86
-31
lines changed

PWGEM/Dilepton/Core/DielectronCut.cxx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,21 @@ void DielectronCut::SetChi2PerClusterITS(float min, float max)
125125
mMaxChi2PerClusterITS = max;
126126
LOG(info) << "Dielectron Cut, set chi2 per cluster ITS range: " << mMinChi2PerClusterITS << " - " << mMaxChi2PerClusterITS;
127127
}
128-
void DielectronCut::SetMeanClusterSizeITS(float min, float max, float maxP)
128+
void DielectronCut::SetMeanClusterSizeITS(float min, float max, float minP, float maxP)
129129
{
130130
mMinMeanClusterSizeITS = min;
131131
mMaxMeanClusterSizeITS = max;
132+
mMinP_ITSClusterSize = minP;
132133
mMaxP_ITSClusterSize = maxP;
133134
LOG(info) << "Dielectron Cut, set mean cluster size ITS range: " << mMinMeanClusterSizeITS << " - " << mMaxMeanClusterSizeITS;
134135
}
136+
void DielectronCut::SetMeanClusterSizeITSPDep(std::function<float(float)> pDepCut, float minP, float maxP)
137+
{
138+
mMaxMeanClusterSizeITSPDep = pDepCut;
139+
mMinP_ITSClusterSize = minP;
140+
mMaxP_ITSClusterSize = maxP;
141+
LOG(info) << "Dielectron Cut, set mean cluster size ITS p dep: " << mMaxMeanClusterSizeITSPDep(0.5);
142+
}
135143
void DielectronCut::SetTrackDca3DRange(float min, float max)
136144
{
137145
mMinDca3D = min;

PWGEM/Dilepton/Core/DielectronCut.h

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class DielectronCut : public TNamed
7373
kDCAz,
7474
kITSNCls,
7575
kITSChi2NDF,
76-
kITSCluserSize,
76+
kITSClusterSize,
7777
kPrefilter,
7878
kNCuts
7979
};
@@ -85,7 +85,9 @@ class DielectronCut : public TNamed
8585
kTPChadrejORTOFreq = 2,
8686
kTPConly = 3,
8787
kTOFif = 4,
88-
kPIDML = 5
88+
kITSTOFreq = 5,
89+
kTPChadrejORITSTOFreq = 6,
90+
kPIDML = 7
8991
};
9092

9193
template <typename T = int, typename TPair>
@@ -176,9 +178,9 @@ class DielectronCut : public TNamed
176178
if (!IsSelectedTrack(track, DielectronCuts::kITSChi2NDF)) {
177179
return false;
178180
}
179-
if (!IsSelectedTrack(track, DielectronCuts::kITSCluserSize)) {
180-
return false;
181-
}
181+
// if (!IsSelectedTrack(track, DielectronCuts::kITSClusterSize)) {
182+
// return false;
183+
// }
182184

183185
if (mRequireITSibAny) {
184186
auto hits_ib = std::count_if(its_ib_any_Requirement.second.begin(), its_ib_any_Requirement.second.end(), [&](auto&& requiredLayer) { return track.itsClusterMap() & (1 << requiredLayer); });
@@ -271,6 +273,12 @@ class DielectronCut : public TNamed
271273
case static_cast<int>(PIDSchemes::kTOFif):
272274
return PassTOFif(track);
273275

276+
case static_cast<int>(PIDSchemes::kITSTOFreq):
277+
return PassTOFreq(track) && PassITSreq(track);
278+
279+
case static_cast<int>(PIDSchemes::kTPChadrejORITSTOFreq):
280+
return PassTPChadrej(track) || (PassTOFreq(track) && PassITSreq(track));
281+
274282
case static_cast<int>(PIDSchemes::kPIDML):
275283
return true; // don't use kPIDML here.
276284

@@ -319,6 +327,15 @@ class DielectronCut : public TNamed
319327
return is_el_included_TPC && is_pi_excluded_TPC && is_el_included_TOF;
320328
}
321329

330+
template <typename T>
331+
bool PassITSreq(T const& track) const
332+
{
333+
bool is_el_included_TPC = mMinTPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < mMaxTPCNsigmaEl;
334+
bool is_pi_excluded_TPC = track.tpcInnerParam() < mMaxPinForPionRejectionTPC ? (track.tpcNSigmaPi() < mMinTPCNsigmaPi || mMaxTPCNsigmaPi < track.tpcNSigmaPi()) : true;
335+
bool is_el_included_ITS = (track.p() < mMinP_ITSClusterSize || mMaxP_ITSClusterSize < track.p()) ? true : (mMinMeanClusterSizeITS < track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))) && (track.meanClusterSizeITS() * std::cos(std::atan(track.tgl())) < (mMaxMeanClusterSizeITSPDep ? mMaxMeanClusterSizeITSPDep(track.p()) : mMaxMeanClusterSizeITS));
336+
return is_el_included_TPC && is_pi_excluded_TPC && is_el_included_ITS;
337+
}
338+
322339
template <typename T>
323340
bool IsSelectedTrack(T const& track, const DielectronCuts& cut) const
324341
{
@@ -362,8 +379,13 @@ class DielectronCut : public TNamed
362379
case DielectronCuts::kITSChi2NDF:
363380
return mMinChi2PerClusterITS < track.itsChi2NCl() && track.itsChi2NCl() < mMaxChi2PerClusterITS;
364381

365-
case DielectronCuts::kITSCluserSize:
366-
return track.p() < mMaxP_ITSClusterSize ? mMinMeanClusterSizeITS < track.meanClusterSizeITS() * std::cos(std::atan(track.tgl())) && track.meanClusterSizeITS() * std::cos(std::atan(track.tgl())) < mMaxMeanClusterSizeITS : true;
382+
// case DielectronCuts::kITSClusterSize: {
383+
// if (track.p() < mMinP_ITSClusterSize || mMaxP_ITSClusterSize < track.p()) {
384+
// return true;
385+
// } else {
386+
// return (mMinMeanClusterSizeITS < track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))) && (track.meanClusterSizeITS() * std::cos(std::atan(track.tgl())) < (mMaxMeanClusterSizeITSPDep ? mMaxMeanClusterSizeITSPDep(track.p()) : mMaxMeanClusterSizeITS));
387+
// }
388+
// }
367389

368390
case DielectronCuts::kPrefilter:
369391
return track.pfb() <= 0;
@@ -393,7 +415,8 @@ class DielectronCut : public TNamed
393415
void SetChi2PerClusterTPC(float min, float max);
394416
void SetNClustersITS(int min, int max);
395417
void SetChi2PerClusterITS(float min, float max);
396-
void SetMeanClusterSizeITS(float min, float max, float maxP = 0.f);
418+
void SetMeanClusterSizeITS(float min, float max, float minP = 0.f, float maxP = 0.f);
419+
void SetMeanClusterSizeITSPDep(std::function<float(float)> pDepCut, float minP = 0.f, float maxP = 0.f);
397420

398421
void SetPIDScheme(int scheme);
399422
void SetMinPinTOF(float min);
@@ -470,7 +493,9 @@ class DielectronCut : public TNamed
470493
bool mApplyPhiV{true};
471494
bool mApplyPF{false};
472495
float mMinMeanClusterSizeITS{-1e10f}, mMaxMeanClusterSizeITS{1e10f}; // max <its cluster size> x cos(Lmabda)
496+
float mMinP_ITSClusterSize{0.0};
473497
float mMaxP_ITSClusterSize{0.0};
498+
std::function<float(float)> mMaxMeanClusterSizeITSPDep{}; // max dca in xy plane as function of pT
474499

475500
// pid cuts
476501
int mPIDScheme{-1};

PWGEM/Dilepton/Core/Dilepton.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,10 @@ struct Dilepton {
177177
Configurable<bool> cfg_require_itsib_1st{"cfg_require_itsib_1st", true, "flag to require ITS ib 1st hit"};
178178
Configurable<float> cfg_min_its_cluster_size{"cfg_min_its_cluster_size", 0.f, "min ITS cluster size"};
179179
Configurable<float> cfg_max_its_cluster_size{"cfg_max_its_cluster_size", 16.f, "max ITS cluster size"};
180+
Configurable<float> cfg_min_p_its_cluster_size{"cfg_min_p_its_cluster_size", 0.0, "min p to apply ITS cluster size cut"};
180181
Configurable<float> cfg_max_p_its_cluster_size{"cfg_max_p_its_cluster_size", 0.0, "max p to apply ITS cluster size cut"};
182+
Configurable<float> cfg_slope_its_cluster_size{"cfg_slope_its_cluster_size", 0.4f, "slope for max ITS cluster size vs. p"};
183+
Configurable<float> cfg_intercept_its_cluster_size{"cfg_intercept_its_cluster_size", 1.94f, "intercept for max ITS cluster size vs. p"};
181184

182185
Configurable<int> cfg_pid_scheme{"cfg_pid_scheme", static_cast<int>(DielectronCut::PIDSchemes::kTPChadrejORTOFreq), "pid scheme [kTOFreq : 0, kTPChadrej : 1, kTPChadrejORTOFreq : 2, kTPConly : 3]"};
183186
Configurable<float> cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"};
@@ -628,7 +631,7 @@ struct Dilepton {
628631
fDielectronCut.SetChi2PerClusterTPC(0.0, dielectroncuts.cfg_max_chi2tpc);
629632
fDielectronCut.SetChi2PerClusterITS(0.0, dielectroncuts.cfg_max_chi2its);
630633
fDielectronCut.SetNClustersITS(dielectroncuts.cfg_min_ncluster_its, 7);
631-
fDielectronCut.SetMeanClusterSizeITS(dielectroncuts.cfg_min_its_cluster_size, dielectroncuts.cfg_max_its_cluster_size, dielectroncuts.cfg_max_p_its_cluster_size);
634+
fDielectronCut.SetMeanClusterSizeITSPDep([&](float p) { return dielectroncuts.cfg_slope_its_cluster_size * p + dielectroncuts.cfg_intercept_its_cluster_size; }, dielectroncuts.cfg_min_p_its_cluster_size, dielectroncuts.cfg_max_p_its_cluster_size);
632635
fDielectronCut.SetTrackMaxDcaXY(dielectroncuts.cfg_max_dcaxy);
633636
fDielectronCut.SetTrackMaxDcaZ(dielectroncuts.cfg_max_dcaz);
634637
fDielectronCut.RequireITSibAny(dielectroncuts.cfg_require_itsib_any);

PWGEM/Dilepton/Core/DileptonMC.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,10 @@ struct DileptonMC {
158158
Configurable<bool> cfg_require_itsib_1st{"cfg_require_itsib_1st", true, "flag to require ITS ib 1st hit"};
159159
Configurable<float> cfg_min_its_cluster_size{"cfg_min_its_cluster_size", 0.f, "min ITS cluster size"};
160160
Configurable<float> cfg_max_its_cluster_size{"cfg_max_its_cluster_size", 16.f, "max ITS cluster size"};
161+
Configurable<float> cfg_min_p_its_cluster_size{"cfg_min_p_its_cluster_size", 0.0, "min p to apply ITS cluster size cut"};
161162
Configurable<float> cfg_max_p_its_cluster_size{"cfg_max_p_its_cluster_size", 0.0, "max p to apply ITS cluster size cut"};
163+
Configurable<float> cfg_slope_its_cluster_size{"cfg_slope_its_cluster_size", 0.4f, "slope for max ITS cluster size vs. p"};
164+
Configurable<float> cfg_intercept_its_cluster_size{"cfg_intercept_its_cluster_size", 1.94f, "intercept for max ITS cluster size vs. p"};
162165

163166
Configurable<int> cfg_pid_scheme{"cfg_pid_scheme", static_cast<int>(DielectronCut::PIDSchemes::kTPChadrejORTOFreq), "pid scheme [kTOFreq : 0, kTPChadrej : 1, kTPChadrejORTOFreq : 2, kTPConly : 3]"};
164167
Configurable<float> cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"};
@@ -512,7 +515,7 @@ struct DileptonMC {
512515
fDielectronCut.SetChi2PerClusterTPC(0.0, dielectroncuts.cfg_max_chi2tpc);
513516
fDielectronCut.SetChi2PerClusterITS(0.0, dielectroncuts.cfg_max_chi2its);
514517
fDielectronCut.SetNClustersITS(dielectroncuts.cfg_min_ncluster_its, 7);
515-
fDielectronCut.SetMeanClusterSizeITS(dielectroncuts.cfg_min_its_cluster_size, dielectroncuts.cfg_max_its_cluster_size, dielectroncuts.cfg_max_p_its_cluster_size);
518+
fDielectronCut.SetMeanClusterSizeITSPDep([&](float p) { return dielectroncuts.cfg_slope_its_cluster_size * p + dielectroncuts.cfg_intercept_its_cluster_size; }, dielectroncuts.cfg_min_p_its_cluster_size, dielectroncuts.cfg_max_p_its_cluster_size);
516519
fDielectronCut.SetTrackMaxDcaXY(dielectroncuts.cfg_max_dcaxy);
517520
fDielectronCut.SetTrackMaxDcaZ(dielectroncuts.cfg_max_dcaz);
518521
fDielectronCut.RequireITSibAny(dielectroncuts.cfg_require_itsib_any);

PWGEM/Dilepton/Core/PhotonHBT.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,10 @@ struct PhotonHBT {
194194
Configurable<float> cfg_max_dcaz{"cfg_max_dcaz", 1.0, "max dca Z for single track in cm"};
195195
Configurable<float> cfg_min_its_cluster_size{"cfg_min_its_cluster_size", 0.f, "min ITS cluster size"};
196196
Configurable<float> cfg_max_its_cluster_size{"cfg_max_its_cluster_size", 16.f, "max ITS cluster size"};
197-
Configurable<float> cfg_max_p_its_cluster_size{"cfg_max_p_its_cluster_size", 0.2, "max p to apply ITS cluster size cut"};
197+
Configurable<float> cfg_max_p_its_cluster_size{"cfg_max_p_its_cluster_size", 0.0, "max p to apply ITS cluster size cut"};
198+
Configurable<float> cfg_min_p_its_cluster_size{"cfg_min_p_its_cluster_size", 0.0, "min p to apply ITS cluster size cut"};
199+
Configurable<float> cfg_slope_its_cluster_size{"cfg_slope_its_cluster_size", 0.4f, "slope for max ITS cluster size vs. p"};
200+
Configurable<float> cfg_intercept_its_cluster_size{"cfg_intercept_its_cluster_size", 1.94f, "intercept for max ITS cluster size vs. p"};
198201

199202
Configurable<int> cfg_pid_scheme{"cfg_pid_scheme", static_cast<int>(DielectronCut::PIDSchemes::kTPChadrejORTOFreq), "pid scheme [kTOFreq : 0, kTPChadrej : 1, kTPChadrejORTOFreq : 2, kTPConly : 3]"};
200203
Configurable<float> cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"};
@@ -541,7 +544,7 @@ struct PhotonHBT {
541544
fDielectronCut.SetChi2PerClusterTPC(0.0, dielectroncuts.cfg_max_chi2tpc);
542545
fDielectronCut.SetChi2PerClusterITS(0.0, dielectroncuts.cfg_max_chi2its);
543546
fDielectronCut.SetNClustersITS(dielectroncuts.cfg_min_ncluster_its, 7);
544-
fDielectronCut.SetMeanClusterSizeITS(dielectroncuts.cfg_min_its_cluster_size, dielectroncuts.cfg_max_its_cluster_size, dielectroncuts.cfg_max_p_its_cluster_size);
547+
fDielectronCut.SetMeanClusterSizeITSPDep([&](float p) { return dielectroncuts.cfg_slope_its_cluster_size * p + dielectroncuts.cfg_intercept_its_cluster_size; }, dielectroncuts.cfg_min_p_its_cluster_size, dielectroncuts.cfg_max_p_its_cluster_size);
545548
fDielectronCut.SetTrackMaxDcaXY(dielectroncuts.cfg_max_dcaxy);
546549
fDielectronCut.SetTrackMaxDcaZ(dielectroncuts.cfg_max_dcaz);
547550

PWGEM/Dilepton/Core/SingleTrackQC.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,10 @@ struct SingleTrackQC {
120120
Configurable<bool> cfg_require_itsib_1st{"cfg_require_itsib_1st", true, "flag to require ITS ib 1st hit"};
121121
Configurable<float> cfg_min_its_cluster_size{"cfg_min_its_cluster_size", 0.f, "min ITS cluster size"};
122122
Configurable<float> cfg_max_its_cluster_size{"cfg_max_its_cluster_size", 16.f, "max ITS cluster size"};
123+
Configurable<float> cfg_min_p_its_cluster_size{"cfg_min_p_its_cluster_size", 0.0, "min p to apply ITS cluster size cut"};
123124
Configurable<float> cfg_max_p_its_cluster_size{"cfg_max_p_its_cluster_size", 0.0, "max p to apply ITS cluster size cut"};
125+
Configurable<float> cfg_slope_its_cluster_size{"cfg_slope_its_cluster_size", 0.4f, "slope for max ITS cluster size vs. p"};
126+
Configurable<float> cfg_intercept_its_cluster_size{"cfg_intercept_its_cluster_size", 1.94f, "intercept for max ITS cluster size vs. p"};
124127

125128
Configurable<int> cfg_pid_scheme{"cfg_pid_scheme", static_cast<int>(DielectronCut::PIDSchemes::kTPChadrejORTOFreq), "pid scheme [kTOFreq : 0, kTPChadrej : 1, kTPChadrejORTOFreq : 2, kTPConly : 3]"};
126129
Configurable<float> cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"};
@@ -322,7 +325,7 @@ struct SingleTrackQC {
322325
fDielectronCut.SetChi2PerClusterTPC(0.0, dielectroncuts.cfg_max_chi2tpc);
323326
fDielectronCut.SetChi2PerClusterITS(0.0, dielectroncuts.cfg_max_chi2its);
324327
fDielectronCut.SetNClustersITS(dielectroncuts.cfg_min_ncluster_its, 7);
325-
fDielectronCut.SetMeanClusterSizeITS(dielectroncuts.cfg_min_its_cluster_size, dielectroncuts.cfg_max_its_cluster_size, dielectroncuts.cfg_max_p_its_cluster_size);
328+
fDielectronCut.SetMeanClusterSizeITSPDep([&](float p) { return dielectroncuts.cfg_slope_its_cluster_size * p + dielectroncuts.cfg_intercept_its_cluster_size; }, dielectroncuts.cfg_min_p_its_cluster_size, dielectroncuts.cfg_max_p_its_cluster_size);
326329
fDielectronCut.SetTrackMaxDcaXY(dielectroncuts.cfg_max_dcaxy);
327330
fDielectronCut.SetTrackMaxDcaZ(dielectroncuts.cfg_max_dcaz);
328331
fDielectronCut.RequireITSibAny(dielectroncuts.cfg_require_itsib_any);

PWGEM/Dilepton/Core/SingleTrackQCMC.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,10 @@ struct SingleTrackQCMC {
123123
Configurable<bool> cfg_require_itsib_1st{"cfg_require_itsib_1st", true, "flag to require ITS ib 1st hit"};
124124
Configurable<float> cfg_min_its_cluster_size{"cfg_min_its_cluster_size", 0.f, "min ITS cluster size"};
125125
Configurable<float> cfg_max_its_cluster_size{"cfg_max_its_cluster_size", 16.f, "max ITS cluster size"};
126+
Configurable<float> cfg_min_p_its_cluster_size{"cfg_min_p_its_cluster_size", 0.0, "min p to apply ITS cluster size cut"};
126127
Configurable<float> cfg_max_p_its_cluster_size{"cfg_max_p_its_cluster_size", 0.0, "max p to apply ITS cluster size cut"};
128+
Configurable<float> cfg_slope_its_cluster_size{"cfg_slope_its_cluster_size", 0.4f, "slope for max ITS cluster size vs. p"};
129+
Configurable<float> cfg_intercept_its_cluster_size{"cfg_intercept_its_cluster_size", 1.94f, "intercept for max ITS cluster size vs. p"};
127130

128131
Configurable<int> cfg_pid_scheme{"cfg_pid_scheme", static_cast<int>(DielectronCut::PIDSchemes::kTPChadrejORTOFreq), "pid scheme [kTOFreq : 0, kTPChadrej : 1, kTPChadrejORTOFreq : 2, kTPConly : 3]"};
129132
Configurable<float> cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"};
@@ -368,7 +371,7 @@ struct SingleTrackQCMC {
368371
fDielectronCut.SetChi2PerClusterTPC(0.0, dielectroncuts.cfg_max_chi2tpc);
369372
fDielectronCut.SetChi2PerClusterITS(0.0, dielectroncuts.cfg_max_chi2its);
370373
fDielectronCut.SetNClustersITS(dielectroncuts.cfg_min_ncluster_its, 7);
371-
fDielectronCut.SetMeanClusterSizeITS(dielectroncuts.cfg_min_its_cluster_size, dielectroncuts.cfg_max_its_cluster_size, dielectroncuts.cfg_max_p_its_cluster_size);
374+
fDielectronCut.SetMeanClusterSizeITSPDep([&](float p) { return dielectroncuts.cfg_slope_its_cluster_size * p + dielectroncuts.cfg_intercept_its_cluster_size; }, dielectroncuts.cfg_min_p_its_cluster_size, dielectroncuts.cfg_max_p_its_cluster_size);
372375
fDielectronCut.SetTrackMaxDcaXY(dielectroncuts.cfg_max_dcaxy);
373376
fDielectronCut.SetTrackMaxDcaZ(dielectroncuts.cfg_max_dcaz);
374377
fDielectronCut.RequireITSibAny(dielectroncuts.cfg_require_itsib_any);

0 commit comments

Comments
 (0)