1515// / \help: To develop this code, I took help from the following codes and O2 analysis tutorial
1616// 1. https://github.com/AliceO2Group/O2Physics/blob/master/PWGMM/Mult/Tasks/dndeta.cxx
1717// 2. https://github.com/AliceO2Group/O2Physics/blob/master/PWGMM/Mult/Tasks/dndeta-hi.cxx
18- // 3. https://github.com/AliceO2Group/O2Physics/blob/master/PWGLF /Mult/Tasks/puremc-dndeta.cxx
18+ // 3. https://github.com/AliceO2Group/O2Physics/blob/master/PWGMM /Mult/Tasks/puremc-dndeta.cxx
1919// 4. O2 analysis tutorial: https://indico.cern.ch/event/1267433/
2020
2121#include < cmath>
4141#include " Framework/runDataProcessing.h"
4242#include " ReconstructionDataFormats/GlobalTrackID.h"
4343#include " ReconstructionDataFormats/Track.h"
44+
4445using namespace o2 ;
4546using namespace o2 ::framework;
4647using namespace o2 ::framework::expressions;
4748using namespace o2 ::aod::track;
49+
4850using CollisionDataTable = soa::Join<aod::Collisions, aod::EvSels>;
4951using TrackDataTable = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection>;
5052using FilTrackDataTable = soa::Filtered<TrackDataTable>;
@@ -53,6 +55,7 @@ using TrackMCTrueTable = aod::McParticles;
5355using CollisionMCRecTable = soa::SmallGroups<soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSels>>;
5456using TrackMCRecTable = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::McTrackLabels, aod::TrackSelection>;
5557using FilTrackMCRecTable = soa::Filtered<TrackMCRecTable>;
58+
5659static constexpr TrackSelectionFlags::flagtype trackSelectionITS =
5760 TrackSelectionFlags::kITSNCls | TrackSelectionFlags::kITSChi2NDF |
5861 TrackSelectionFlags::kITSHits ;
@@ -62,32 +65,44 @@ static constexpr TrackSelectionFlags::flagtype trackSelectionTPC =
6265 TrackSelectionFlags::kTPCChi2NDF ;
6366static constexpr TrackSelectionFlags::flagtype trackSelectionDCA =
6467 TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy ;
68+
6569AxisSpec axisEvent{4 , -0.5 , 3.5 , " #Event" };
6670AxisSpec axisVtxZ{800 , -20 , 20 , " Vertex Z" };
6771AxisSpec axisDCA = {601 , -3.01 , 3.01 };
6872AxisSpec axisPT = {1000 , -0.05 , 49.95 };
6973AxisSpec axisEta{200 , -5 , 5 , " #eta" };
74+ AxisSpec axisPhi{629 , 0 , 2 * M_PI , " #phi" };
7075AxisSpec axisMCEvent_ambiguity{6 , -0.5 , 5.5 , " reco collisions per true collision" };
76+
7177struct HeavyIonMultiplicity {
78+
7279 HistogramRegistry histos{" histos" , {}, OutputObjHandlingPolicy::AnalysisObject};
7380 Service<o2::framework::O2DatabasePDG> pdg;
7481 Preslice<TrackMCRecTable> perCollision = aod::track::collisionId;
82+
7583 Configurable<float > etaRange{" eta-range" , 1 .0f , " Eta range to consider" };
84+ Configurable<float > VtxRange{" vertex-range" , 10 .0f , " Vertex Z range to consider" };
85+ Configurable<float > dcaZ{" dcaZ" , 0 .2f , " Custom DCA Z cut (ignored if negative)" };
7686 ConfigurableAxis multHistBin{" MultDistBinning" , {501 , -0.5 , 500.5 }, " " };
87+
7788 void init (InitContext const &)
7889 {
7990 AxisSpec axisMult = {multHistBin};
8091 histos.add (" EventHist" , " EventHist" , kTH1D , {axisEvent}, false );
8192 histos.add (" VtxZHist" , " VtxZHist" , kTH1D , {axisVtxZ}, false );
93+
8294 if (doprocessData) {
8395 histos.add (" MultHist" , " MultHist" , kTH1D , {axisMult}, true );
8496 histos.add (" MultHist_Inelgt0" , " MultHist_Inelgt0" , kTH1D , {axisMult}, true );
8597 histos.add (" EtaHist" , " EtaHist" , kTH1D , {axisEta}, true );
98+ histos.add (" PhiHist" , " PhiHist" , kTH1D , {axisPhi}, true );
99+ histos.add (" EtaVsVtxZHist" , " EtaVsVtxZHist" , kTH2D , {axisEta, axisVtxZ}, false );
100+ histos.add (" PhiVsEtaHist" , " PhiVsEtaHist" , kTH2D , {axisPhi, axisEta}, false );
86101 histos.add (" DCAXYHist" , " DCAXYHist" , kTH1D , {axisDCA}, false );
87102 histos.add (" DCAZHist" , " DCAZHist" , kTH1D , {axisDCA}, false );
88103 histos.add (" pTHist" , " pTHist" , kTH1D , {axisPT}, true );
89- histos.add (" EtaVsVtxZHist" , " EtaVsVtxZHist" , kTH2D , {axisEta, axisVtxZ}, true );
90104 }
105+
91106 if (doprocessMC) {
92107 histos.add (" MCEventHist_ambiguity" , " MCEventHist_ambiguity" , kTH1D , {axisMCEvent_ambiguity}, false );
93108 histos.add (" DCAXYMCRecHist" , " DCAXYMCRecHist" , kTH1D , {axisDCA}, false );
@@ -96,6 +111,10 @@ struct HeavyIonMultiplicity {
96111 histos.add (" EtaVsVtxZMCRecHist" , " EtaVsVtxZMCRecHist" , kTH2D , {axisEta, axisVtxZ}, true );
97112 histos.add (" MCRecEtaHist" , " MCRecEtaHist" , kTH1D , {axisEta}, true );
98113 histos.add (" MCGenEtaHist" , " MCGenEtaHist" , kTH1D , {axisEta}, true );
114+ histos.add (" MCRecPhiHist" , " MCRecPhiHist" , kTH1D , {axisPhi}, true );
115+ histos.add (" MCGenPhiHist" , " MCGenPhiHist" , kTH1D , {axisPhi}, true );
116+ histos.add (" MCRecPhiVsEtaHist" , " MCRecPhiVsEtaHist" , kTH2D , {axisPhi, axisEta}, false );
117+ histos.add (" MCGenPhiVsEtaHist" , " MCGenPhiVsEtaHist" , kTH2D , {axisPhi, axisEta}, false );
99118 histos.add (" MCRecMultHist" , " MCRecMultHist" , kTH1D , {axisMult}, true );
100119 histos.add (" MCGenMultHist" , " MCGenMultHist" , kTH1D , {axisMult}, true );
101120 histos.add (" MCGenVsRecMultHist" , " MCGenVsRecMultHist" , kTH2D , {axisMult, axisMult}, true );
@@ -104,21 +123,29 @@ struct HeavyIonMultiplicity {
104123 histos.add (" MCGenVsRecMultHist_Inelgt0" , " MCGenVsRecMultHist_Inelgt0" , kTH2D , {axisMult, axisMult}, true );
105124 }
106125 }
107- expressions::Filter trackSelectionProper = ((aod::track::trackCutFlag & trackSelectionITS) == trackSelectionITS) && ifnode((aod::track::detectorMap & (uint8_t )o2::aod::track::TPC ) == (uint8_t )o2::aod::track::TPC , (aod::track::trackCutFlag & trackSelectionTPC) == trackSelectionTPC, true ) && ((aod::track::trackCutFlag & trackSelectionDCA) == trackSelectionDCA);
126+
127+ expressions::Filter trackSelectionProperMixed = ncheckbit(aod::track::detectorMap, (uint8_t )o2::aod::track::ITS ) &&
128+ ncheckbit (aod::track::trackCutFlag, trackSelectionITS) &&
129+ ifnode (ncheckbit(aod::track::detectorMap, (uint8_t )o2::aod::track::TPC),
130+ ncheckbit(aod::track::trackCutFlag, trackSelectionTPC), true) &&
131+ ifnode(dcaZ.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ, ncheckbit(aod::track::trackCutFlag, trackSelectionDCA));
132+
108133 void processData (CollisionDataTable::iterator const & collision, FilTrackDataTable const & tracks)
109134 {
110135 auto NchTracks = 0 ;
111136 bool Inelgt0 = false ;
112137 histos.fill (HIST (" EventHist" ), 0 );
113138 if (collision.sel8 ()) {
114139 histos.fill (HIST (" EventHist" ), 1 );
115- if (std::abs (collision.posZ ()) < 10 ) {
140+ if (std::abs (collision.posZ ()) < VtxRange ) {
116141 histos.fill (HIST (" EventHist" ), 2 );
117142 histos.fill (HIST (" VtxZHist" ), collision.posZ ());
118143 for (auto & track : tracks) {
119144 if (std::abs (track.eta ()) < etaRange) {
120145 NchTracks++;
121146 histos.fill (HIST (" EtaHist" ), track.eta ());
147+ histos.fill (HIST (" PhiHist" ), track.phi ());
148+ histos.fill (HIST (" PhiVsEtaHist" ), track.phi (), track.eta ());
122149 histos.fill (HIST (" EtaVsVtxZHist" ), track.eta (), collision.posZ ());
123150 histos.fill (HIST (" DCAXYHist" ), track.dcaXY ());
124151 histos.fill (HIST (" DCAZHist" ), track.dcaZ ());
@@ -138,6 +165,7 @@ struct HeavyIonMultiplicity {
138165 }
139166
140167 PROCESS_SWITCH (HeavyIonMultiplicity, processData, " process data" , false );
168+
141169 void processMC (CollisionMCTrueTable::iterator const & TrueCollision, CollisionMCRecTable const & RecCollisions, TrackMCTrueTable const & GenParticles, FilTrackMCRecTable const & RecTracks)
142170 {
143171 histos.fill (HIST (" MCEventHist_ambiguity" ), RecCollisions.size ());
@@ -163,6 +191,8 @@ struct HeavyIonMultiplicity {
163191 if (std::abs (particle.eta ()) < etaRange) {
164192 NchGenTracks++;
165193 histos.fill (HIST (" MCGenEtaHist" ), particle.eta ());
194+ histos.fill (HIST (" MCGenPhiHist" ), particle.phi ());
195+ histos.fill (HIST (" MCGenPhiVsEtaHist" ), particle.phi (), particle.eta ());
166196 }
167197 }
168198 }
@@ -177,7 +207,7 @@ struct HeavyIonMultiplicity {
177207 histos.fill (HIST (" EventHist" ), 0 );
178208 if (RecCollision.sel8 ()) {
179209 histos.fill (HIST (" EventHist" ), 1 );
180- if (std::abs (RecCollision.posZ ()) < 10 ) {
210+ if (std::abs (RecCollision.posZ ()) < VtxRange ) {
181211 histos.fill (HIST (" EventHist" ), 2 );
182212 histos.fill (HIST (" VtxZHist" ), RecCollision.posZ ());
183213
@@ -186,6 +216,8 @@ struct HeavyIonMultiplicity {
186216 if (std::abs (Rectrack.eta ()) < etaRange) {
187217 NchRecTracks++;
188218 histos.fill (HIST (" MCRecEtaHist" ), Rectrack.eta ());
219+ histos.fill (HIST (" MCRecPhiHist" ), Rectrack.phi ());
220+ histos.fill (HIST (" MCRecPhiVsEtaHist" ), Rectrack.phi (), Rectrack.eta ());
189221 histos.fill (HIST (" EtaVsVtxZMCRecHist" ), Rectrack.eta (), RecCollision.posZ ());
190222 histos.fill (HIST (" DCAXYMCRecHist" ), Rectrack.dcaXY ());
191223 histos.fill (HIST (" DCAZMCRecHist" ), Rectrack.dcaZ ());
@@ -210,6 +242,7 @@ struct HeavyIonMultiplicity {
210242 }
211243 PROCESS_SWITCH (HeavyIonMultiplicity, processMC, " process MC" , false );
212244};
245+
213246WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
214247{
215248 return WorkflowSpec{adaptAnalysisTask<HeavyIonMultiplicity>(cfgc)};
0 commit comments