@@ -66,6 +66,17 @@ AxisSpec phiAxis = {629, 0, TwoPI, "Rad", "#phi"};
6666AxisSpec etaAxis = {20 , -4 ., -2 .};
6767AxisSpec centAxis{100 , 0 , 100 , " centrality" };
6868AxisSpec chiSqAxis = {100 , 0 ., 1000 .};
69+ AxisSpec nclsAxis{10 , 0.5 , 10.5 , " # clusters" };
70+
71+ enum TrkSel {
72+ trkSelNCls,
73+ trkSelChi2Ncl,
74+ trkSelEta,
75+ trkSelPhiCut,
76+ trkSelPt,
77+ trkSelCA,
78+ nTrkSel
79+ };
6980
7081struct DndetaMFTPbPb {
7182 SliceCache cache;
@@ -101,27 +112,29 @@ struct DndetaMFTPbPb {
101112 " minimum number of MFT clusters" };
102113 Configurable<bool > useChi2Cut{" useChi2Cut" , false , " use track chi2 cut" };
103114 Configurable<float > maxChi2NCl{" maxChi2NCl" , 1000 .f , " maximum chi2 per MFT clusters" };
115+ Configurable<bool > usePtCut{" usePtCut" , false , " use track pT cut" };
104116 Configurable<double > minPt{" minPt" , 0 ., " minimum pT of the MFT tracks" };
105117 Configurable<bool > requireCA{
106118 " requireCA" , false , " Use Cellular Automaton track-finding algorithm" };
107119 Configurable<float > maxDCAxy{" maxDCAxy" , 2 .0f , " Cut on dcaXY" };
108120 } trackCuts;
109121
110122 struct : ConfigurableGroup {
111- Configurable<float > maxZvtx{" maxZvtx" , 10 .0f , " Cut on z-vtx" };
123+ Configurable<float > maxZvtx{" maxZvtx" , 10 .0f , " maximum cut on z-vtx (cm)" };
124+ Configurable<float > minZvtx{" minZvtx" , -10 .0f , " minimum cut on z-vtx (cm)" };
112125 Configurable<bool > useZDiffCut{" useZDiffCut" , false ,
113126 " use Zvtx reco-mc diff. cut" };
114127 Configurable<float > maxZvtxDiff{
115128 " maxZvtxDiff" , 1 .0f ,
116129 " max allowed Z vtx difference for reconstruced collisions (cm)" };
117130 Configurable<bool > requireIsGoodZvtxFT0VsPV{" requireIsGoodZvtxFT0VsPV" , true , " require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference" };
118131 Configurable<bool > requireRejectSameBunchPileup{" requireRejectSameBunchPileup" , true , " reject collisions in case of pileup with another collision in the same foundBC" };
119- Configurable<bool > requireNoCollInTimeRangeStrict{" requireNoCollInTimeRangeStrict" , true , " requireNoCollInTimeRangeStrict" };
120- Configurable<bool > requireNoCollInRofStrict{" requireNoCollInRofStrict" , true , " requireNoCollInRofStrict" };
132+ Configurable<bool > requireNoCollInTimeRangeStrict{" requireNoCollInTimeRangeStrict" , false , " requireNoCollInTimeRangeStrict" };
133+ Configurable<bool > requireNoCollInRofStrict{" requireNoCollInRofStrict" , false , " requireNoCollInRofStrict" };
121134 Configurable<bool > requireNoCollInRofStandard{" requireNoCollInRofStandard" , false , " requireNoCollInRofStandard" };
122- Configurable<bool > requireNoHighMultCollInPrevRof{" requireNoHighMultCollInPrevRof" , true , " requireNoHighMultCollInPrevRof" };
135+ Configurable<bool > requireNoHighMultCollInPrevRof{" requireNoHighMultCollInPrevRof" , false , " requireNoHighMultCollInPrevRof" };
123136 Configurable<bool > requireNoCollInTimeRangeStd{
124- " requireNoCollInTimeRangeStd" , false ,
137+ " requireNoCollInTimeRangeStd" , true ,
125138 " reject collisions corrupted by the cannibalism, with other collisions "
126139 " within +/- 10 microseconds" };
127140 Configurable<bool > requireNoCollInTimeRangeNarrow{
@@ -234,7 +247,7 @@ struct DndetaMFTPbPb {
234247 " be enabled!" );
235248 }
236249
237- auto hev = registry.add <TH1>(" hEvtSel" , " hEvtSel" , HistType::kTH1F ,
250+ auto hev = registry.add <TH1>(" Events/ hEvtSel" , " hEvtSel" , HistType::kTH1F ,
238251 {{14 , -0 .5f , +13 .5f }});
239252 hev->GetXaxis ()->SetBinLabel (1 , " All collisions" );
240253 hev->GetXaxis ()->SetBinLabel (2 , " Ev. sel." );
@@ -250,6 +263,14 @@ struct DndetaMFTPbPb {
250263 hev->GetXaxis ()->SetBinLabel (12 , " Below min occup." );
251264 hev->GetXaxis ()->SetBinLabel (13 , " Above max occup." );
252265
266+ registry.add (" Tracks/hTrkSel" , " Number of tracks; Cut; #Tracks Passed Cut" , {HistType::kTH1D , {{nTrkSel, 0 , nTrkSel}}});
267+ registry.get <TH1>(HIST (" Tracks/hTrkSel" ))->GetXaxis ()->SetBinLabel (trkSelNCls + 1 , " Ncl cut" );
268+ registry.get <TH1>(HIST (" Tracks/hTrkSel" ))->GetXaxis ()->SetBinLabel (trkSelChi2Ncl + 1 , " #chi^{2}/Ncl cut" );
269+ registry.get <TH1>(HIST (" Tracks/hTrkSel" ))->GetXaxis ()->SetBinLabel (trkSelEta + 1 , " #eta cut" );
270+ registry.get <TH1>(HIST (" Tracks/hTrkSel" ))->GetXaxis ()->SetBinLabel (trkSelPhiCut + 1 , " #varphi cut" );
271+ registry.get <TH1>(HIST (" Tracks/hTrkSel" ))->GetXaxis ()->SetBinLabel (trkSelPt + 1 , " #it{p}_{T} cut" );
272+ registry.get <TH1>(HIST (" Tracks/hTrkSel" ))->GetXaxis ()->SetBinLabel (trkSelCA + 1 , " Tracking algorithm (CA)" );
273+
253274 auto hBcSel = registry.add <TH1>(" hBcSel" , " hBcSel" , HistType::kTH1F ,
254275 {{3 , -0 .5f , +2 .5f }});
255276 hBcSel->GetXaxis ()->SetBinLabel (1 , " Good BCs" );
@@ -290,7 +311,7 @@ struct DndetaMFTPbPb {
290311 qaregistry.add (
291312 {" Tracks/NclustersEta" ,
292313 " ; nClusters; #eta; occupancy" ,
293- {HistType::kTHnSparseF , {{ 7 , 4 , 10 } , etaAxis, occupancyAxis}}});
314+ {HistType::kTHnSparseF , {nclsAxis , etaAxis, occupancyAxis}}});
294315 qaregistry.add ({" Tracks/NchSel" ,
295316 " ; N_{ch}; occupancy" ,
296317 {HistType::kTH2F , {multAxis, occupancyAxis}}});
@@ -311,7 +332,7 @@ struct DndetaMFTPbPb {
311332 qaregistry.add (
312333 {" Tracks/NclustersEtaBest" ,
313334 " ; nClusters; #eta; occupancy" ,
314- {HistType::kTHnSparseF , {{ 7 , 4 , 10 } , etaAxis, occupancyAxis}}});
335+ {HistType::kTHnSparseF , {nclsAxis , etaAxis, occupancyAxis}}});
315336 qaregistry.add (
316337 {" Tracks/DCAXYPt" ,
317338 " ; p_{T} (GeV/c) ; DCA_{XY} (cm); occupancy" ,
@@ -389,7 +410,7 @@ struct DndetaMFTPbPb {
389410 qaregistry.add ({" Tracks/Centrality/NclustersEta" ,
390411 " ; nClusters; #eta; centrality; occupancy" ,
391412 {HistType::kTHnSparseF ,
392- {{ 7 , 4 , 10 } , etaAxis, centralityAxis, occupancyAxis}}});
413+ {nclsAxis , etaAxis, centralityAxis, occupancyAxis}}});
393414
394415 if (doprocessDatawBestTracksCentFT0C ||
395416 doprocessDatawBestTracksCentFT0CVariant1 ||
@@ -412,7 +433,7 @@ struct DndetaMFTPbPb {
412433 {" Tracks/Centrality/NclustersEtaBest" ,
413434 " ; nClusters; #eta; centrality; occupancy" ,
414435 {HistType::kTHnSparseF ,
415- {{ 7 , 4 , 10 } , etaAxis, centralityAxis, occupancyAxis}}});
436+ {nclsAxis , etaAxis, centralityAxis, occupancyAxis}}});
416437 qaregistry.add ({" Tracks/Centrality/TrackAmbDegree" ,
417438 " ; N_{coll}^{comp}; centrality; occupancy" ,
418439 {HistType::kTHnSparseF ,
@@ -744,20 +765,21 @@ struct DndetaMFTPbPb {
744765 template <typename T>
745766 bool isTrackSelected (const T& track)
746767 {
747- if (track.eta () < trackCuts.minEta || track. eta () > trackCuts. maxEta )
768+ if (track.nClusters () < trackCuts.minNclusterMft ) {
748769 return false ;
770+ }
771+ registry.fill (HIST (" Tracks/hTrkSel" ), trkSelNCls);
749772 if (trackCuts.useChi2Cut ) {
750773 float nclMft = std::max (2 .0f * track.nClusters () - 5 .0f , 1 .0f );
751774 float mftChi2NCl = track.chi2 () / nclMft;
752775 if (mftChi2NCl > trackCuts.maxChi2NCl )
753776 return false ;
754777 }
755- if (trackCuts.requireCA && !track.isCA ())
756- return false ;
757- if (track.nClusters () < trackCuts.minNclusterMft )
758- return false ;
759- if (track.pt () < trackCuts.minPt )
778+ registry.fill (HIST (" Tracks/hTrkSel" ), trkSelChi2Ncl);
779+ if (track.eta () < trackCuts.minEta || track.eta () > trackCuts.maxEta ) {
760780 return false ;
781+ }
782+ registry.fill (HIST (" Tracks/hTrkSel" ), trkSelEta);
761783 if (trackCuts.usephiCut ) {
762784 float phi = track.phi ();
763785 o2::math_utils::bringTo02Pi (phi);
@@ -771,6 +793,15 @@ struct DndetaMFTPbPb {
771793 (phi < ((PIHalf - 0.1 ) * PI) + trackCuts.phiCut )))
772794 return false ;
773795 }
796+ registry.fill (HIST (" Tracks/hTrkSel" ), trkSelPhiCut);
797+ if (trackCuts.usePtCut && track.pt () < trackCuts.minPt ) {
798+ return false ;
799+ }
800+ registry.fill (HIST (" Tracks/hTrkSel" ), trkSelPt);
801+ if (trackCuts.requireCA && !track.isCA ()) {
802+ return false ;
803+ }
804+ registry.fill (HIST (" Tracks/hTrkSel" ), trkSelCA);
774805 return true ;
775806 }
776807
@@ -938,85 +969,85 @@ struct DndetaMFTPbPb {
938969 bool isGoodEvent (C const & collision)
939970 {
940971 if constexpr (fillHis) {
941- registry.fill (HIST (" hEvtSel" ), 0 );
972+ registry.fill (HIST (" Events/ hEvtSel" ), 0 );
942973 }
943974 if (!collision.sel8 ()) {
944975 return false ;
945976 }
946977 if constexpr (fillHis) {
947- registry.fill (HIST (" hEvtSel" ), 1 );
978+ registry.fill (HIST (" Events/ hEvtSel" ), 1 );
948979 }
949980 if (eventCuts.requireIsGoodZvtxFT0VsPV && !collision.selection_bit (aod::evsel::kIsGoodZvtxFT0vsPV )) {
950981 return false ;
951982 }
952983 if constexpr (fillHis) {
953- registry.fill (HIST (" hEvtSel" ), 2 );
984+ registry.fill (HIST (" Events/ hEvtSel" ), 2 );
954985 }
955986 if (eventCuts.requireRejectSameBunchPileup && !collision.selection_bit (aod::evsel::kNoSameBunchPileup )) {
956987 return false ;
957988 }
958989 if constexpr (fillHis) {
959- registry.fill (HIST (" hEvtSel" ), 3 );
990+ registry.fill (HIST (" Events/ hEvtSel" ), 3 );
960991 }
961- if (std::abs ( collision.posZ ()) >= eventCuts.maxZvtx ) {
992+ if (collision.posZ () <= eventCuts. minZvtx || collision. posZ ( ) >= eventCuts.maxZvtx ) {
962993 return false ;
963994 }
964995 if constexpr (fillHis) {
965- registry.fill (HIST (" hEvtSel" ), 4 );
996+ registry.fill (HIST (" Events/ hEvtSel" ), 4 );
966997 }
967998 if (eventCuts.requireNoCollInTimeRangeStd &&
968999 !collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStandard )) {
9691000 return false ;
9701001 }
9711002 if constexpr (fillHis) {
972- registry.fill (HIST (" hEvtSel" ), 5 );
1003+ registry.fill (HIST (" Events/ hEvtSel" ), 5 );
9731004 }
9741005 if (eventCuts.requireNoCollInTimeRangeNarrow &&
9751006 !collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeNarrow )) {
9761007 return false ;
9771008 }
9781009 if constexpr (fillHis) {
979- registry.fill (HIST (" hEvtSel" ), 6 );
1010+ registry.fill (HIST (" Events/ hEvtSel" ), 6 );
9801011 }
9811012 if (eventCuts.requireNoCollInTimeRangeStrict && !collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStrict )) {
9821013 return false ;
9831014 }
9841015 if constexpr (fillHis) {
985- registry.fill (HIST (" hEvtSel" ), 7 );
1016+ registry.fill (HIST (" Events/ hEvtSel" ), 7 );
9861017 }
9871018 if (eventCuts.requireNoCollInRofStrict && !collision.selection_bit (o2::aod::evsel::kNoCollInRofStrict )) {
9881019 return false ;
9891020 }
9901021 if constexpr (fillHis) {
991- registry.fill (HIST (" hEvtSel" ), 8 );
1022+ registry.fill (HIST (" Events/ hEvtSel" ), 8 );
9921023 }
9931024 if (eventCuts.requireNoCollInRofStandard && !collision.selection_bit (o2::aod::evsel::kNoCollInRofStandard )) {
9941025 return false ;
9951026 }
9961027 if constexpr (fillHis) {
997- registry.fill (HIST (" hEvtSel" ), 9 );
1028+ registry.fill (HIST (" Events/ hEvtSel" ), 9 );
9981029 }
9991030 if (eventCuts.requireNoHighMultCollInPrevRof && !collision.selection_bit (o2::aod::evsel::kNoHighMultCollInPrevRof )) {
10001031 return false ;
10011032 }
10021033 if constexpr (fillHis) {
1003- registry.fill (HIST (" hEvtSel" ), 10 );
1034+ registry.fill (HIST (" Events/ hEvtSel" ), 10 );
10041035 }
10051036 if (eventCuts.minOccupancy >= 0 &&
10061037 getOccupancy (collision, eventCuts.occupancyEstimator ) <
10071038 eventCuts.minOccupancy ) {
10081039 return false ;
10091040 }
10101041 if constexpr (fillHis) {
1011- registry.fill (HIST (" hEvtSel" ), 11 );
1042+ registry.fill (HIST (" Events/ hEvtSel" ), 11 );
10121043 }
10131044 if (eventCuts.maxOccupancy >= 0 &&
10141045 getOccupancy (collision, eventCuts.occupancyEstimator ) >
10151046 eventCuts.maxOccupancy ) {
10161047 return false ;
10171048 }
10181049 if constexpr (fillHis) {
1019- registry.fill (HIST (" hEvtSel" ), 12 );
1050+ registry.fill (HIST (" Events/ hEvtSel" ), 12 );
10201051 }
10211052 return true ;
10221053 }
0 commit comments