@@ -49,29 +49,29 @@ using namespace o2::framework::expressions;
4949using namespace o2 ::aod::track;
5050
5151AxisSpec PtAxis = {1001 , -0.005 , 10.005 };
52- AxisSpec DeltaZAxis = {61 , -6.1 , 6.1 };
53- AxisSpec ZAxis = {301 , -30.1 , 30.1 };
54- AxisSpec PhiAxis = {629 , 0 , o2::constants::math::TwoPI, " Rad" , " phi axis" };
55- // AxisSpec EtaAxis = {18, -4.6, -1.};
56- AxisSpec DCAxyAxis = {5000 , -1 , 500 };
57- AxisSpec DCAzAxis = {5000 , -251 , 250 };
58- AxisSpec CentAxis = {{0 , 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 100 }};
59-
60- static constexpr TrackSelectionFlags::flagtype trackSelectionITS =
52+ AxisSpec DeltaZAxis = {61 , -6.1 , 6.1 };
53+ AxisSpec ZAxis = {301 , -30.1 , 30.1 };
54+ AxisSpec PhiAxis = {629 , 0 , o2::constants::math::TwoPI, " Rad" , " phi axis" };
55+ // AxisSpec EtaAxis = {18, -4.6, -1.};
56+ AxisSpec DCAxyAxis = {5000 , -1 , 500 };
57+ AxisSpec DCAzAxis = {5000 , -251 , 250 };
58+ AxisSpec CentAxis = {{0 , 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 100 }};
59+
60+ static constexpr TrackSelectionFlags::flagtype trackSelectionITS =
6161 TrackSelectionFlags::kITSNCls | TrackSelectionFlags::kITSChi2NDF |
6262 TrackSelectionFlags::kITSHits ;
6363
64- static constexpr TrackSelectionFlags::flagtype trackSelectionTPC =
64+ static constexpr TrackSelectionFlags::flagtype trackSelectionTPC =
6565 TrackSelectionFlags::kTPCNCls |
6666 TrackSelectionFlags::kTPCCrossedRowsOverNCls |
6767 TrackSelectionFlags::kTPCChi2NDF ;
6868
69- static constexpr TrackSelectionFlags::flagtype trackSelectionDCA =
69+ static constexpr TrackSelectionFlags::flagtype trackSelectionDCA =
7070 TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy ;
7171
72- using MFTTracksLabeled = soa::Join<o2::aod::MFTTracks, aod::McMFTTrackLabels>;
72+ using MFTTracksLabeled = soa::Join<o2::aod::MFTTracks, aod::McMFTTrackLabels>;
7373
74- struct PseudorapidityDensityMFT {
74+ struct PseudorapidityDensityMFT {
7575 SliceCache cache;
7676 Preslice<aod::MFTTracks> perCol = o2::aod::fwdtrack::collisionId;
7777 Preslice<aod::McParticles> perMcCol = aod::mcparticle::mcCollisionId;
@@ -80,7 +80,7 @@ struct PseudorapidityDensityMFT {
8080 Service<o2::framework::O2DatabasePDG> pdg;
8181
8282 Configurable<float > estimatorEta{" estimatorEta" , 1.0 ,
83- " eta range for INEL>0 sample definition" };
83+ " eta range for INEL>0 sample definition" };
8484
8585 Configurable<bool > useEvSel{" useEvSel" , true , " use event selection" };
8686 Configurable<bool > disableITSROFCut{" disableITSROFCut" , false , " Disable ITS ROF cut for event selection" };
@@ -99,19 +99,19 @@ struct PseudorapidityDensityMFT {
9999 Configurable<float > cfgPhiCut{" cfgPhiCut" , 0 .1f ,
100100 " Cut on azimuthal angle of MFT tracks" };
101101 Configurable<float > cfgPhiCut1{" cfgPhiCut1" , 0 .0f ,
102- " low Cut on azimuthal angle of MFT tracks" };
102+ " low Cut on azimuthal angle of MFT tracks" };
103103 Configurable<float > cfgPhiCut2{" cfgPhiCut2" , 6 .3f ,
104- " high Cut on azimuthal angle of MFT tracks" };
104+ " high Cut on azimuthal angle of MFT tracks" };
105105 Configurable<float > cfgVzCut1{" cfgVzCut1" , -30 .0f ,
106106 " Cut1 on vertex position of MFT tracks" };
107107 Configurable<float > cfgVzCut2{" cfgVzCut2" , 30 .0f ,
108108 " Cut2 on vertex position of MFT tracks" };
109109 Configurable<float > cfgnCluster{" cfgnCluster" , 5 .0f ,
110110 " Cut on no of clusters per MFT track" };
111111 Configurable<float > cfgnEta1{" cfgnEta1" , -4 .5f ,
112- " Cut on eta1" };
112+ " Cut on eta1" };
113113 Configurable<float > cfgnEta2{" cfgnEta2" , -1 .0f ,
114- " Cut on eta1" };
114+ " Cut on eta1" };
115115 Configurable<float > cfgChi2NDFMax{" cfgChi2NDFMax" , 2000 .0f , " Max allowed chi2/NDF for MFT tracks" };
116116 Configurable<float > maxDCAxy{" maxDCAxy" , 2 .0f , " Cut on dcaXY" };
117117 Configurable<float > maxDCAz{" maxDCAz" , 2 .0f , " Cut on dcaZ" };
@@ -120,27 +120,43 @@ struct PseudorapidityDensityMFT {
120120 " registry" ,
121121 {
122122 {" TracksEtaZvtx" ,
123- " ; #eta; #it{z}_{vtx} (cm); tracks" ,
124- {HistType::kTH2F , {EtaAxis, ZAxis}}}, //
123+ " ; #eta; #it{z}_{vtx} (cm); tracks" ,
124+ {HistType::kTH2F , {EtaAxis, ZAxis}}}, //
125125 {" Tracks/EtaZvtx_gt0" ,
126- " ; #eta; #it{z}_{vtx} (cm); tracks" ,
127- {HistType::kTH2F , {EtaAxis, ZAxis}}}, //
126+ " ; #eta; #it{z}_{vtx} (cm); tracks" ,
127+ {HistType::kTH2F , {EtaAxis, ZAxis}}}, //
128128 {" TracksPhiEta" ,
129- " ; #varphi; #eta; tracks" ,
130- {HistType::kTH2F , {PhiAxis, EtaAxis}}}, //
129+ " ; #varphi; #eta; tracks" ,
130+ {HistType::kTH2F , {PhiAxis, EtaAxis}}}, //
131131 {" TracksPhiZvtx" ,
132- " ; #varphi; #it{z}_{vtx} (cm); tracks" ,
133- {HistType::kTH2F , {PhiAxis, ZAxis}}}, //
132+ " ; #varphi; #it{z}_{vtx} (cm); tracks" ,
133+ {HistType::kTH2F , {PhiAxis, ZAxis}}}, //
134134 {" TracksPtEta" ,
135- " ; p_{T} (GeV/c); #eta" ,
136- {HistType::kTH2F , {PtAxis, EtaAxis}}}, //
135+ " ; p_{T} (GeV/c); #eta" ,
136+ {HistType::kTH2F , {PtAxis, EtaAxis}}}, //
137137 {" EventSelection" ,
138- " ;status;events" ,
139- {HistType::kTH1F , {{15 , 0.5 , 15.5 }}}},
138+ " ;status;events" ,
139+ {HistType::kTH1F , {{15 , 0.5 , 15.5 }}}},
140140 {" EventCounts" ,
141- " ;status;events" ,
142- {HistType::kTH1F , {{2 , 0.5 , 2.5 }}}},
141+ " ;status;events" ,
142+ {HistType::kTH1F , {{2 , 0.5 , 2.5 }}}},
143143 {" Tracks/Control/TrackCount" , " ;status;Track counts" , {HistType::kTH1F , {{15 , 0.5 , 15.5 }}}}, // added
144+ // Purity-related histograms
145+ {" Purity/SelectedAfterDCAxy/All" ,
146+ " ;bin;counts" ,
147+ {HistType::kTH1F , {{1 , 0.5 , 1.5 }}}},
148+ {" Purity/SelectedAfterDCAxy/AllEta" ,
149+ " ;#eta;counts" ,
150+ {HistType::kTH1F , {EtaAxis}}},
151+ {" Purity/Gen/PrimaryEta" ,
152+ " ;#eta;primaries" ,
153+ {HistType::kTH1F , {EtaAxis}}},
154+ {" Purity/Gen/All" ,
155+ " ;bin;counts" ,
156+ {HistType::kTH1F , {{1 , 0.5 , 1.5 }}}},
157+ {" Purity/Gen/AllEta" ,
158+ " ;#eta;counts" ,
159+ {HistType::kTH1F , {EtaAxis}}}
144160 }};
145161
146162 void init (InitContext&)
@@ -151,9 +167,9 @@ struct PseudorapidityDensityMFT {
151167 static_cast <int >(doprocessCountingCentrality) >
152168 1 ) {
153169 LOGP (fatal,
154- " Exactly one process function between processMult, "
155- " processMultReassoc, processMultReassoc3d and processCountingCentrality should be "
156- " enabled!" );
170+ " Exactly one process function between processMult, "
171+ " processMultReassoc, processMultReassoc3d and processCountingCentrality should be "
172+ " enabled!" );
157173 }
158174 AxisSpec MultAxis = {multBinning, " N_{trk}" };
159175 auto hstat = registry.get <TH1>(HIST (" EventSelection" ));
@@ -463,7 +479,7 @@ struct PseudorapidityDensityMFT {
463479 x->SetBinLabel (2 , " Selected" );
464480
465481 registry.add (" Events/Centrality/CentPercentileMCGen" ,
466- " CentPercentileMCGen" , kTH1D , {CentAxis}, false );
482+ " CentPercentileMCGen" , kTH1D , {CentAxis}, false );
467483 registry.add ({" Events/Centrality/NtrkZvtxGen" ,
468484 " ; N_{trk}; Z_{vtx} (cm); centrality" ,
469485 {HistType::kTH3F , {MultAxis, ZAxis, CentAxis}}});
@@ -491,7 +507,7 @@ struct PseudorapidityDensityMFT {
491507 for (const auto & bc : bcs) {
492508 if (!useEvSel ||
493509 (useEvSel && ((bc.selection_bit (aod::evsel::kIsBBT0A ) &&
494- bc.selection_bit (aod::evsel::kIsBBT0C )) != 0 ))) {
510+ bc.selection_bit (aod::evsel::kIsBBT0C )) != 0 ))) {
495511 registry.fill (HIST (" EventSelection" ), 8 ); // added 5->12
496512 cols.clear ();
497513 for (const auto & collision : collisions) {
@@ -515,7 +531,7 @@ struct PseudorapidityDensityMFT {
515531 }
516532
517533 PROCESS_SWITCH (PseudorapidityDensityMFT, processTagging,
518- " Collect event sample stats" , true );
534+ " Collect event sample stats" , true );
519535
520536 Partition<aod::MFTTracks> sample =
521537 (aod::fwdtrack::eta < -2 .8f ) && (aod::fwdtrack::eta > -3 .2f );
@@ -531,10 +547,10 @@ struct PseudorapidityDensityMFT {
531547 expressions::Filter trackSelectionCentral =
532548 ((aod::track::trackCutFlag & trackSelectionITS) == trackSelectionITS) &&
533549 ifnode ((aod::track::v001::detectorMap & (uint8_t )o2::aod::track::TPC) ==
534- (uint8_t )o2::aod::track::TPC,
535- (aod::track::trackCutFlag & trackSelectionTPC) ==
536- trackSelectionTPC,
537- true) &&
550+ (uint8_t )o2::aod::track::TPC,
551+ (aod::track::trackCutFlag & trackSelectionTPC) ==
552+ trackSelectionTPC,
553+ true) &&
538554 ((aod::track::trackCutFlag & trackSelectionDCA) == trackSelectionDCA) &&
539555 (nabs(aod::track::eta) < estimatorEta);
540556
@@ -543,8 +559,8 @@ struct PseudorapidityDensityMFT {
543559 aod::TracksDCA>>; // central tracks for INEL>0
544560
545561 void processMult (CollwEv::iterator const & collision,
546- aod::MFTTracks const & tracks,
547- FiCentralTracks const & midtracks, aod::Tracks const &)
562+ aod::MFTTracks const & tracks,
563+ FiCentralTracks const & midtracks, aod::Tracks const &)
548564 {
549565
550566 registry.fill (HIST (" EventSelection" ), 1 .);
@@ -574,7 +590,7 @@ struct PseudorapidityDensityMFT {
574590 ((phi > o2::constants::math::PI - cfgPhiCut) && (phi < o2::constants::math::PI + cfgPhiCut)) ||
575591 (phi > o2::constants::math::TwoPI - cfgPhiCut) ||
576592 ((phi > ((o2::constants::math::PIHalf - 0.1 ) * o2::constants::math::PI) - cfgPhiCut) &&
577- (phi < ((o2::constants::math::PIHalf - 0.1 ) * o2::constants::math::PI) + cfgPhiCut)))
593+ (phi < ((o2::constants::math::PIHalf - 0.1 ) * o2::constants::math::PI) + cfgPhiCut)))
578594 continue ;
579595 }
580596
@@ -597,7 +613,7 @@ struct PseudorapidityDensityMFT {
597613 }
598614
599615 PROCESS_SWITCH (PseudorapidityDensityMFT, processMult,
600- " Process reco or data info" , true );
616+ " Process reco or data info" , true );
601617 // Common implementation for both BestCollisionsFwd and BestCollisionsFwd3d
602618 template <typename RetracksT>
603619 void processMultReassocCommon (CollwEv::iterator const & collision,
@@ -709,23 +725,26 @@ struct PseudorapidityDensityMFT {
709725 float dcaxy_cut = retrack.bestDCAXY ();
710726 o2::math_utils::bringTo02Pi (phi);
711727 // Declare dcaz_cut only if needed below.
712- if ((cfgnEta1 < track.eta ()) && (track.eta () < cfgnEta2) && track.nClusters () >= cfgnCluster && chi2ndf < cfgChi2NDFMax && (phi > cfgPhiCut1 && phi < cfgPhiCut2)) {
713- if (usePhiCut) {
714- if ((phi <= 0.02 ) || ((phi >= 3.10 ) && (phi <= 3.23 )) || (phi >= 6.21 ))
715- continue ;
716- }
717- if (useDCAxyCut) {
718- if (dcaxy_cut > maxDCAxy)
728+ if ((cfgnEta1 < track.eta ()) && (track.eta () < cfgnEta2) && track.nClusters () >= cfgnCluster && chi2ndf < cfgChi2NDFMax && (phi > cfgPhiCut1 && phi < cfgPhiCut2)) {
729+ if (usePhiCut) {
730+ if ((phi <= 0.02 ) || ((phi >= 3.10 ) && (phi <= 3.23 )) || (phi >= 6.21 ))
731+ continue ;
732+ }
733+ if (useDCAxyCut) {
734+ if (dcaxy_cut > maxDCAxy)
735+ continue ;
736+ }
737+ if constexpr (std::is_same_v<RetracksT, soa::SmallGroups<aod::BestCollisionsFwd3d>>) {
738+ float dcaz_cut = retrack.bestDCAZ ();
739+ if (useDCAzCut) {
740+ if (dcaz_cut > maxDCAz)
719741 continue ;
720742 }
721- if constexpr (std::is_same_v<RetracksT, soa::SmallGroups<aod::BestCollisionsFwd3d>>) {
722- float dcaz_cut = retrack.bestDCAZ ();
723- if (useDCAzCut) {
724- if (dcaz_cut > maxDCAz)
725- continue ;
726- }
727- }
728- registry.fill (HIST (" TracksEtaZvtx" ), track.eta (), z);
743+ }
744+ // Purity denominator: all tracks that pass the DCA selection and other quality cuts
745+ registry.fill (HIST (" Purity/SelectedAfterDCAxy/All" ), 1 .);
746+ registry.fill (HIST (" Purity/SelectedAfterDCAxy/AllEta" ), track.eta ());
747+ registry.fill (HIST (" TracksEtaZvtx" ), track.eta (), z);
729748 if (midtracks.size () > 0 && retrack.ambDegree () > 0 ) {
730749 registry.fill (HIST (" Tracks/EtaZvtx_gt0" ), track.eta (), z);
731750 registry.fill (HIST (" Tracks/2Danalysis/EtaZvtx_sel8_inelfwdgt0" ), track.eta (), z);
@@ -879,15 +898,15 @@ struct PseudorapidityDensityMFT {
879898 processMultReassocCommon (collision, mft, retracks, midtracks, trk);
880899 }
881900 PROCESS_SWITCH (PseudorapidityDensityMFT, processMultReassoc,
882- " Process reco or data info" , false );
901+ " Process reco or data info" , false );
883902
884903 PROCESS_SWITCH (PseudorapidityDensityMFT, processMultReassoc3d,
885- " Process reco or data info (3d)" , false );
904+ " Process reco or data info (3d)" , false );
886905
887906 using ExColsCent = soa::Join<aod::Collisions, aod::CentFT0Cs, aod::EvSels>;
888907
889908 void processCountingCentrality (ExColsCent::iterator const & collision,
890- aod::MFTTracks const & tracks)
909+ aod::MFTTracks const & tracks)
891910 {
892911 auto c = collision.centFT0C ();
893912 registry.fill (HIST (" Events/Centrality/Selection" ), 1 ., c);
@@ -911,7 +930,7 @@ struct PseudorapidityDensityMFT {
911930 ((phi > o2::constants::math::PI - cfgPhiCut) && (phi < o2::constants::math::PI + cfgPhiCut)) ||
912931 (phi > o2::constants::math::TwoPI - cfgPhiCut) ||
913932 ((phi > ((o2::constants::math::PIHalf - 0.1 ) * o2::constants::math::PI) - cfgPhiCut) &&
914- (phi < ((o2::constants::math::PIHalf - 0.1 ) * o2::constants::math::PI) + cfgPhiCut)))
933+ (phi < ((o2::constants::math::PIHalf - 0.1 ) * o2::constants::math::PI) + cfgPhiCut)))
915934 continue ;
916935 }
917936
@@ -926,12 +945,12 @@ struct PseudorapidityDensityMFT {
926945 }
927946
928947 PROCESS_SWITCH (PseudorapidityDensityMFT, processCountingCentrality,
929- " Count tracks in centrality bins" , false );
948+ " Count tracks in centrality bins" , false );
930949
931950 using Particles = soa::Filtered<aod::McParticles>;
932951 expressions::Filter primaries =
933952 (aod::mcparticle::flags &
934- (uint8_t )o2::aod::mcparticle::enums::PhysicalPrimary) ==
953+ (uint8_t )o2::aod::mcparticle::enums::PhysicalPrimary) ==
935954 (uint8_t )o2::aod::mcparticle::enums::PhysicalPrimary;
936955 Partition<Particles> mcSample = nabs(aod::mcparticle::eta) < 1 .1f ;
937956 Partition<Particles> mcSampleCentral =
@@ -940,7 +959,7 @@ struct PseudorapidityDensityMFT {
940959 void processGen (
941960 aod::McCollisions::iterator const & mcCollision,
942961 o2::soa::SmallGroups<soa::Join<aod::Collisions, aod::EvSels,
943- aod::McCollisionLabels>> const & collisions,
962+ aod::McCollisionLabels>> const & collisions,
944963 Particles const & particles, aod::MFTTracks const & /* tracks*/ ,
945964 FiCentralTracks const & midtracks)
946965 {
@@ -990,7 +1009,7 @@ struct PseudorapidityDensityMFT {
9901009 int moreThanOne = 0 ;
9911010
9921011 LOGP (debug, " MC col {} has {} reco cols" , mcCollision.globalIndex (),
993- collisions.size ());
1012+ collisions.size ());
9941013 for (const auto & collision : collisions) {
9951014 registry.fill (HIST (" EventEfficiency" ), 3 .);
9961015 if (!disableITSROFCut && !collision.selection_bit (aod::evsel::kNoITSROFrameBorder )) {
@@ -1049,6 +1068,13 @@ struct PseudorapidityDensityMFT {
10491068 continue ;
10501069 }
10511070 if (cfgnEta1 < particle.eta () && particle.eta () < cfgnEta2 && (phi > cfgPhiCut1 && phi < cfgPhiCut2)) {
1071+ // Purity numerator reference at generator level: physical primaries in the same eta window
1072+ if (particle.isPhysicalPrimary ()) {
1073+ registry.fill (HIST (" Purity/Gen/PrimaryEta" ), particle.eta ());
1074+ // Truth-side total counters for primaries in acceptance (for purity calculations)
1075+ registry.fill (HIST (" Purity/Gen/All" ), 1 .);
1076+ registry.fill (HIST (" Purity/Gen/AllEta" ), particle.eta ());
1077+ }
10521078 registry.fill (HIST (" TracksEtaZvtxGen_t" ), particle.eta (),
10531079 mcCollision.posZ ());
10541080 if (perCollisionMCSampleCentral.size () > 0 ) {
@@ -1077,11 +1103,11 @@ struct PseudorapidityDensityMFT {
10771103 }
10781104
10791105 PROCESS_SWITCH (PseudorapidityDensityMFT, processGen,
1080- " Process generator-level info" , false );
1106+ " Process generator-level info" , false );
10811107
10821108 using ExColsGenCent =
10831109 soa::SmallGroups<soa::Join<aod::McCollisionLabels, aod::Collisions,
1084- aod::CentFT0Cs, aod::EvSels>>;
1110+ aod::CentFT0Cs, aod::EvSels>>;
10851111
10861112 void processGenCent (aod::McCollisions::iterator const & mcCollision,
10871113 ExColsGenCent const & collisions,
@@ -1090,7 +1116,7 @@ struct PseudorapidityDensityMFT {
10901116 {
10911117
10921118 LOGP (debug, " MC col {} has {} reco cols" , mcCollision.globalIndex (),
1093- collisions.size ());
1119+ collisions.size ());
10941120
10951121 float c_gen = -1 ;
10961122 bool atLeastOne = false ;
@@ -1169,7 +1195,7 @@ struct PseudorapidityDensityMFT {
11691195 }
11701196
11711197 PROCESS_SWITCH (PseudorapidityDensityMFT, processGenCent,
1172- " Process generator-level info in centrality bins" , false );
1198+ " Process generator-level info in centrality bins" , false );
11731199
11741200 void processGenPt (
11751201 soa::Join<aod::Collisions, aod::EvSels>::iterator const & collision,
@@ -1190,10 +1216,10 @@ struct PseudorapidityDensityMFT {
11901216 }
11911217
11921218 PROCESS_SWITCH (PseudorapidityDensityMFT, processGenPt,
1193- " Process particle-level info of pt" , false );
1194- };
1219+ " Process particle-level info of pt" , false );
1220+ };
11951221
1196- WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
1197- {
1222+ WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
1223+ {
11981224 return WorkflowSpec{adaptAnalysisTask<PseudorapidityDensityMFT>(cfgc)};
1199- }
1225+ }
0 commit comments