2828#include " Framework/runDataProcessing.h"
2929#include " PWGLF/DataModel/LFStrangenessTables.h"
3030#include " ReconstructionDataFormats/Track.h"
31+ #include " Common/Core/TrackSelectionDefaults.h"
3132
3233using namespace o2 ;
3334using namespace o2 ::framework;
3435using namespace constants ::physics;
3536
3637using 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
4041using 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