Skip to content

Commit 873e4ac

Browse files
committed
Standard track selection was included to improve PID
1 parent f54a75e commit 873e4ac

File tree

1 file changed

+134
-43
lines changed

1 file changed

+134
-43
lines changed

PWGMM/UE/Tasks/dedxAnalysis.cxx

Lines changed: 134 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@
2828
#include "Framework/runDataProcessing.h"
2929
#include "PWGLF/DataModel/LFStrangenessTables.h"
3030
#include "ReconstructionDataFormats/Track.h"
31+
#include "Common/Core/TrackSelectionDefaults.h"
3132

3233
using namespace o2;
3334
using namespace o2::framework;
3435
using namespace constants::physics;
3536

3637
using PIDTracks = soa::Join<
37-
aod::Tracks, aod::TracksExtra, aod::TrackSelectionExtension,
38-
aod::pidTOFFullPi, aod::pidTOFFullPr, aod::pidTOFFullEl>;
38+
aod::Tracks, aod::TracksExtra, aod::TrackSelectionExtension, aod::TracksDCA, aod::TrackSelection,
39+
aod::pidTOFFullPi, aod::pidTOFFullPr, aod::pidTOFFullEl, aod::pidTOFbeta>;
3940

4041
using SelectedCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Cs>;
4142

@@ -50,16 +51,19 @@ struct DedxAnalysis {
5051
true};
5152

5253
// Configurable Parameters
54+
// Tracks cuts
5355
Configurable<float> minTPCnClsFound{"minTPCnClsFound", 70.0f,
5456
"min number of found TPC clusters"};
5557
Configurable<float> minNCrossedRowsTPC{"minNCrossedRowsTPC", 70.0f, "min number of found TPC crossed rows"};
56-
Configurable<float> minNClsTPCdEdx{"minNClsTPCdEdx", 50.0f, "min number of TPC clusters for PID"};
5758
Configurable<float> maxChi2TPC{"maxChi2TPC", 4.0f,
5859
"max chi2 per cluster TPC"};
5960
Configurable<float> maxChi2ITS{"maxChi2ITS", 36.0f,
6061
"max chi2 per cluster ITS"};
6162
Configurable<float> etaMin{"etaMin", -0.8f, "etaMin"};
6263
Configurable<float> etaMax{"etaMax", +0.8f, "etaMax"};
64+
Configurable<float> minNCrossedRowsOverFindableClustersTPC{"minNCrossedRowsOverFindableClustersTPC", 0.8f, "Additional cut on the minimum value of the ratio between crossed rows and findable clusters in the TPC"};
65+
Configurable<float> maxDCAz{"maxDCAz", 2.f, "maxDCAz"};
66+
// v0 cuts
6367
Configurable<float> v0cospaMin{"v0cospaMin", 0.998f, "Minimum V0 CosPA"};
6468
Configurable<float> minimumV0Radius{"minimumV0Radius", 0.5f,
6569
"Minimum V0 Radius"};
@@ -78,49 +82,106 @@ struct DedxAnalysis {
7882
"Minimum Mass Gamma"};
7983
Configurable<float> maxMassGamma{"maxMassGamma", 0.002022f,
8084
"Maximum Mass Gamma"};
81-
Configurable<float> minReqClusterITS{"minReqClusterITS", 4.0f, "min number of clusters required in ITS"};
82-
Configurable<float> maxDCAxy{"maxDCAxy", 0.1f, "maxDCAxy"};
83-
Configurable<float> maxDCAz{"maxDCAz", 0.1f, "maxDCAz"};
84-
Configurable<bool> eventSelection{"eventSelection", true, "event selection"};
8585
Configurable<bool> calibrationMode{"calibrationMode", false, "calibration mode"};
8686
// Histograms names
8787
static constexpr std::string_view kDedxvsMomentumPos[4] = {"dEdx_vs_Momentum_all_Pos", "dEdx_vs_Momentum_Pi_v0_Pos", "dEdx_vs_Momentum_Pr_v0_Pos", "dEdx_vs_Momentum_El_v0_Pos"};
8888
static constexpr std::string_view kDedxvsMomentumNeg[4] = {"dEdx_vs_Momentum_all_Neg", "dEdx_vs_Momentum_Pi_v0_Neg", "dEdx_vs_Momentum_Pr_v0_Neg", "dEdx_vs_Momentum_El_v0_Neg"};
89+
static constexpr std::string_view kDedxvsMomentumPosWoCal[4] = {"dEdx_vs_Momentum_all_Pos_WoCal", "dEdx_vs_Momentum_Pi_v0_Pos_WoCal", "dEdx_vs_Momentum_Pr_v0_Pos_WoCal", "dEdx_vs_Momentum_El_v0_Pos_WoCal"};
90+
static constexpr std::string_view kDedxvsMomentumNegWoCal[4] = {"dEdx_vs_Momentum_all_Neg_WoCal", "dEdx_vs_Momentum_Pi_v0_Neg_WoCal", "dEdx_vs_Momentum_Pr_v0_Neg_WoCal", "dEdx_vs_Momentum_El_v0_Neg_WoCal"};
8991
static constexpr double EtaCut[9] = {-0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8};
90-
Configurable<std::vector<float>> calibrationFactor{"calibrationFactor", {50.8263, 51.0122, 50.7456, 50.0372, 49.699, 50.2222, 50.7263, 50.8073}, "calibration factors"};
92+
Configurable<std::vector<float>> calibrationFactorNeg{"calibrationFactorNeg", {50.4011, 50.4764, 50.186, 49.2955, 48.8222, 49.4273, 49.9292, 50.0556}, "negative calibration factors"};
93+
Configurable<std::vector<float>> calibrationFactorPos{"calibrationFactorPos", {50.5157, 50.6359, 50.3198, 49.3345, 48.9197, 49.4931, 50.0188, 50.1406}, "positive calibration factors"};
9194
ConfigurableAxis binP{"binP", {VARIABLE_WIDTH, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0}, ""};
9295

96+
TrackSelection myTrackSelection()
97+
{
98+
TrackSelection selectedTracks;
99+
selectedTracks.SetPtRange(0.1f, 1e10f);
100+
selectedTracks.SetEtaRange(etaMin, etaMax);
101+
selectedTracks.SetRequireITSRefit(true);
102+
selectedTracks.SetRequireTPCRefit(true);
103+
selectedTracks.SetMinNCrossedRowsTPC(minNCrossedRowsTPC);
104+
selectedTracks.SetMinNCrossedRowsOverFindableClustersTPC(minNCrossedRowsOverFindableClustersTPC);
105+
selectedTracks.SetMaxChi2PerClusterTPC(maxChi2TPC);
106+
selectedTracks.SetRequireHitsInITSLayers(1, {0, 1});
107+
selectedTracks.SetMaxChi2PerClusterITS(maxChi2ITS);
108+
selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / std::pow(pt, 1.1f); });
109+
selectedTracks.SetMaxDcaZ(maxDCAz);
110+
111+
return selectedTracks;
112+
}
113+
114+
TrackSelection mySelectionPrim;
115+
93116
void init(InitContext const&)
94117
{
118+
AxisSpec dedxAxis{100, 0.0, 100.0, "dE/dx MIP (a. u.)"};
119+
AxisSpec etaAxis{8, -0.8, 0.8, "#eta"};
120+
AxisSpec pAxis = {binP, "#it{p}/Z (GeV/c)"};
95121
if (calibrationMode) {
96122
// MIP for pions
97123
registryDeDx.add(
98-
"hdEdxMIP_vs_eta", "dE/dx", HistType::kTH2F,
99-
{{8, -0.8, 0.8, "#eta"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}});
124+
"hdEdx_vs_eta_Neg_Pi", "dE/dx", HistType::kTH2F,
125+
{{etaAxis}, {dedxAxis}});
126+
registryDeDx.add(
127+
"hdEdx_vs_eta_Pos_Pi", "dE/dx", HistType::kTH2F,
128+
{{etaAxis}, {dedxAxis}});
129+
// MIP for electrons
130+
registryDeDx.add(
131+
"hdEdx_vs_eta_vs_p_Neg_El", "dE/dx", HistType::kTH3F,
132+
{{etaAxis}, {dedxAxis}, {pAxis}});
100133
registryDeDx.add(
101-
"hdEdxMIP_vs_phi", "dE/dx", HistType::kTH2F,
102-
{{100, 0.0, 6.4, "#phi"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}});
134+
"hdEdx_vs_eta_vs_p_Pos_El", "dE/dx", HistType::kTH3F,
135+
{{etaAxis}, {dedxAxis}, {pAxis}});
103136

104137
} else {
105-
AxisSpec pAxis = {binP, "#it{p}/Z (GeV/c)"};
138+
// MIP for pions
139+
registryDeDx.add(
140+
"hdEdx_vs_eta_Neg_calibrated_Pi", "dE/dx", HistType::kTH2F,
141+
{{etaAxis}, {dedxAxis}});
106142

107143
registryDeDx.add(
108-
"hdEdxMIP_vs_eta_calibrated", "dE/dx", HistType::kTH2F,
109-
{{8, -0.8, 0.8, "#eta"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}});
144+
"hdEdx_vs_eta_Pos_calibrated_Pi", "dE/dx", HistType::kTH2F,
145+
{{etaAxis}, {dedxAxis}});
146+
147+
// MIP for electrons
148+
registryDeDx.add(
149+
"hdEdx_vs_eta_vs_p_Neg_calibrated_El", "dE/dx", HistType::kTH3F,
150+
{{etaAxis}, {dedxAxis}, {pAxis}});
151+
110152
registryDeDx.add(
111-
"hdEdxMIP_vs_phi", "dE/dx", HistType::kTH2F,
112-
{{100, 0.0, 6.4, "#phi"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}});
153+
"hdEdx_vs_eta_vs_p_Pos_calibrated_El", "dE/dx", HistType::kTH3F,
154+
{{etaAxis}, {dedxAxis}, {pAxis}});
113155

114156
// De/Dx for ch and v0 particles
115157
for (int i = 0; i < 4; ++i) {
116158
registryDeDx.add(kDedxvsMomentumPos[i].data(), "dE/dx", HistType::kTH3F,
117-
{{pAxis}, {100, 0.0, 100.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}});
159+
{{pAxis}, {dedxAxis}, {etaAxis}});
118160
registryDeDx.add(kDedxvsMomentumNeg[i].data(), "dE/dx", HistType::kTH3F,
119-
{{pAxis}, {100, 0.0, 100.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}});
161+
{{pAxis}, {dedxAxis}, {etaAxis}});
162+
163+
registryDeDx.add(kDedxvsMomentumPosWoCal[i].data(), "dE/dx", HistType::kTH3F,
164+
{{pAxis}, {dedxAxis}, {etaAxis}});
165+
registryDeDx.add(kDedxvsMomentumNegWoCal[i].data(), "dE/dx", HistType::kTH3F,
166+
{{pAxis}, {dedxAxis}, {etaAxis}});
120167
}
121168
}
169+
170+
registryDeDx.add(
171+
"hdEdx_vs_phi", "dE/dx", HistType::kTH2F,
172+
{{100, 0.0, 6.4, "#phi"}, {dedxAxis}});
173+
174+
registryDeDx.add(
175+
"hbeta_vs_p_Neg", "beta", HistType::kTH2F,
176+
{{pAxis}, {100, 0.0, 1.1, "#beta"}});
177+
178+
registryDeDx.add(
179+
"hbeta_vs_p_Pos", "beta", HistType::kTH2F,
180+
{{pAxis}, {100, 0.0, 1.1, "#beta"}});
122181
// Event Counter
123182
registryDeDx.add("histRecVtxZData", "collision z position", HistType::kTH1F, {{100, -20.0, +20.0, "z_{vtx} (cm)"}});
183+
184+
mySelectionPrim = myTrackSelection();
124185
}
125186

126187
// Single-Track Selection
@@ -302,34 +363,72 @@ struct DedxAnalysis {
302363
// Kaons
303364
for (const auto& trk : tracks) {
304365

366+
// track Selection
305367
if (!passedSingleTrackSelection(trk, collision))
306368
continue;
307-
if (!trk.passedTPCRefit())
369+
370+
if (!mySelectionPrim.IsSelected(trk))
308371
continue;
372+
309373
float signedP = trk.sign() * trk.tpcInnerParam();
310374

311-
// MIP for pions
375+
// MIP calibration for pions
312376
if (trk.tpcInnerParam() >= 0.35 && trk.tpcInnerParam() <= 0.45) {
313377
if (calibrationMode) {
314-
registryDeDx.fill(HIST("hdEdxMIP_vs_eta"), trk.eta(), trk.tpcSignal());
315-
registryDeDx.fill(HIST("hdEdxMIP_vs_phi"), trk.phi(), trk.tpcSignal());
378+
if (signedP < 0) {
379+
registryDeDx.fill(HIST("hdEdx_vs_eta_Neg_Pi"), trk.eta(), trk.tpcSignal());
380+
} else {
381+
registryDeDx.fill(HIST("hdEdx_vs_eta_Pos_Pi"), trk.eta(), trk.tpcSignal());
382+
}
383+
316384
} else {
317-
registryDeDx.fill(HIST("hdEdxMIP_vs_phi"), trk.phi(), trk.tpcSignal());
318385
for (int i = 0; i < 8; ++i) {
319386
if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) {
320-
registryDeDx.fill(HIST("hdEdxMIP_vs_eta_calibrated"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactor->at(i));
387+
if (signedP < 0) {
388+
registryDeDx.fill(HIST("hdEdx_vs_eta_Neg_calibrated_Pi"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i));
389+
} else {
390+
registryDeDx.fill(HIST("hdEdx_vs_eta_Pos_calibrated_Pi"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorPos->at(i));
391+
}
321392
}
322393
}
323394
}
324395
}
396+
// MIP calibration for electrons
397+
if (signedP < 0) {
398+
registryDeDx.fill(HIST("hbeta_vs_p_Neg"), std::abs(signedP), trk.beta());
399+
} else {
400+
registryDeDx.fill(HIST("hbeta_vs_p_Pos"), signedP, trk.beta());
401+
}
402+
403+
if (std::abs(trk.beta() - 1) < 0.1) { // beta cut
404+
if (calibrationMode) {
405+
if (signedP < 0) {
406+
registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Neg_El"), trk.eta(), trk.tpcSignal(), std::abs(signedP));
407+
} else {
408+
registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Pos_El"), trk.eta(), trk.tpcSignal(), signedP);
409+
}
410+
} else {
411+
for (int i = 0; i < 8; ++i) {
412+
if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) {
413+
if (signedP < 0) {
414+
registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Neg_calibrated_El"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), std::abs(signedP));
415+
} else {
416+
registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Pos_calibrated_El"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorPos->at(i), signedP);
417+
}
418+
}
419+
}
420+
}
421+
}
422+
423+
registryDeDx.fill(HIST("hdEdx_vs_phi"), trk.phi(), trk.tpcSignal());
325424

326425
if (!calibrationMode) {
327426
for (int i = 0; i < 8; ++i) {
328427
if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) {
329428
if (signedP > 0) {
330-
registryDeDx.fill(HIST(kDedxvsMomentumPos[0]), signedP, trk.tpcSignal() * 50 / calibrationFactor->at(i), trk.eta());
429+
registryDeDx.fill(HIST(kDedxvsMomentumPos[0]), signedP, trk.tpcSignal() * 50 / calibrationFactorPos->at(i), trk.eta());
331430
} else {
332-
registryDeDx.fill(HIST(kDedxvsMomentumNeg[0]), std::abs(signedP), trk.tpcSignal() * 50 / calibrationFactor->at(i), trk.eta());
431+
registryDeDx.fill(HIST(kDedxvsMomentumNeg[0]), std::abs(signedP), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), trk.eta());
333432
}
334433
}
335434
}
@@ -384,12 +483,10 @@ struct DedxAnalysis {
384483

385484
for (int i = 0; i < 8; ++i) {
386485
if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) {
387-
388-
registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta());
486+
registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta());
389487
}
390488
if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) {
391-
392-
registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta());
489+
registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta());
393490
}
394491
}
395492
}
@@ -408,12 +505,10 @@ struct DedxAnalysis {
408505

409506
for (int i = 0; i < 8; ++i) {
410507
if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) {
411-
412-
registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta());
508+
registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta());
413509
}
414510
if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) {
415-
416-
registryDeDx.fill(HIST(kDedxvsMomentumPos[2]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta());
511+
registryDeDx.fill(HIST(kDedxvsMomentumPos[2]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta());
417512
}
418513
}
419514
}
@@ -432,12 +527,10 @@ struct DedxAnalysis {
432527

433528
for (int i = 0; i < 8; ++i) {
434529
if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) {
435-
436-
registryDeDx.fill(HIST(kDedxvsMomentumNeg[2]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta());
530+
registryDeDx.fill(HIST(kDedxvsMomentumNeg[2]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta());
437531
}
438532
if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) {
439-
440-
registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta());
533+
registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta());
441534
}
442535
}
443536
}
@@ -456,12 +549,10 @@ struct DedxAnalysis {
456549

457550
for (int i = 0; i < 8; ++i) {
458551
if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) {
459-
460-
registryDeDx.fill(HIST(kDedxvsMomentumNeg[3]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta());
552+
registryDeDx.fill(HIST(kDedxvsMomentumNeg[3]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta());
461553
}
462554
if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) {
463-
464-
registryDeDx.fill(HIST(kDedxvsMomentumPos[3]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta());
555+
registryDeDx.fill(HIST(kDedxvsMomentumPos[3]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta());
465556
}
466557
}
467558
}

0 commit comments

Comments
 (0)