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,46 @@ static constexpr TrackSelectionFlags::flagtype trackSelectionTPC =
6265 TrackSelectionFlags::kTPCChi2NDF ;
6366static constexpr TrackSelectionFlags::flagtype trackSelectionDCA =
6467 TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy ;
68+ static constexpr TrackSelectionFlags::flagtype trackSelectionDCAXYonly =
69+ TrackSelectionFlags::kDCAxy ;
70+
6571AxisSpec axisEvent{4 , -0.5 , 3.5 , " #Event" };
6672AxisSpec axisVtxZ{800 , -20 , 20 , " Vertex Z" };
6773AxisSpec axisDCA = {601 , -3.01 , 3.01 };
6874AxisSpec axisPT = {1000 , -0.05 , 49.95 };
6975AxisSpec axisEta{200 , -5 , 5 , " #eta" };
76+ AxisSpec axisPhi{629 , 0 , 2 * M_PI , " #phi" };
7077AxisSpec axisMCEvent_ambiguity{6 , -0.5 , 5.5 , " reco collisions per true collision" };
78+
7179struct HeavyIonMultiplicity {
80+
7281 HistogramRegistry histos{" histos" , {}, OutputObjHandlingPolicy::AnalysisObject};
7382 Service<o2::framework::O2DatabasePDG> pdg;
7483 Preslice<TrackMCRecTable> perCollision = aod::track::collisionId;
84+
7585 Configurable<float > etaRange{" eta-range" , 1 .0f , " Eta range to consider" };
86+ Configurable<float > VtxRange{" vertex-range" , 10 .0f , " Vertex Z range to consider" };
87+ Configurable<float > dcaZ{" dcaZ" , 0 .2f , " Custom DCA Z cut (ignored if negative)" };
7688 ConfigurableAxis multHistBin{" MultDistBinning" , {501 , -0.5 , 500.5 }, " " };
89+
7790 void init (InitContext const &)
7891 {
7992 AxisSpec axisMult = {multHistBin};
8093 histos.add (" EventHist" , " EventHist" , kTH1D , {axisEvent}, false );
8194 histos.add (" VtxZHist" , " VtxZHist" , kTH1D , {axisVtxZ}, false );
95+
8296 if (doprocessData) {
8397 histos.add (" MultHist" , " MultHist" , kTH1D , {axisMult}, true );
8498 histos.add (" MultHist_Inelgt0" , " MultHist_Inelgt0" , kTH1D , {axisMult}, true );
8599 histos.add (" EtaHist" , " EtaHist" , kTH1D , {axisEta}, true );
100+ histos.add (" PhiHist" , " PhiHist" , kTH1D , {axisPhi}, true );
101+ histos.add (" EtaVsVtxZHist" , " EtaVsVtxZHist" , kTH2D , {axisEta, axisVtxZ}, false );
102+ histos.add (" PhiVsEtaHist" , " PhiVsEtaHist" , kTH2D , {axisPhi, axisEta}, false );
86103 histos.add (" DCAXYHist" , " DCAXYHist" , kTH1D , {axisDCA}, false );
87104 histos.add (" DCAZHist" , " DCAZHist" , kTH1D , {axisDCA}, false );
88105 histos.add (" pTHist" , " pTHist" , kTH1D , {axisPT}, true );
89- histos.add (" EtaVsVtxZHist" , " EtaVsVtxZHist" , kTH2D , {axisEta, axisVtxZ}, true );
90106 }
107+
91108 if (doprocessMC) {
92109 histos.add (" MCEventHist_ambiguity" , " MCEventHist_ambiguity" , kTH1D , {axisMCEvent_ambiguity}, false );
93110 histos.add (" DCAXYMCRecHist" , " DCAXYMCRecHist" , kTH1D , {axisDCA}, false );
@@ -96,6 +113,10 @@ struct HeavyIonMultiplicity {
96113 histos.add (" EtaVsVtxZMCRecHist" , " EtaVsVtxZMCRecHist" , kTH2D , {axisEta, axisVtxZ}, true );
97114 histos.add (" MCRecEtaHist" , " MCRecEtaHist" , kTH1D , {axisEta}, true );
98115 histos.add (" MCGenEtaHist" , " MCGenEtaHist" , kTH1D , {axisEta}, true );
116+ histos.add (" MCRecPhiHist" , " MCRecPhiHist" , kTH1D , {axisPhi}, true );
117+ histos.add (" MCGenPhiHist" , " MCGenPhiHist" , kTH1D , {axisPhi}, true );
118+ histos.add (" MCRecPhiVsEtaHist" , " MCRecPhiVsEtaHist" , kTH2D , {axisPhi, axisEta}, false );
119+ histos.add (" MCGenPhiVsEtaHist" , " MCGenPhiVsEtaHist" , kTH2D , {axisPhi, axisEta}, false );
99120 histos.add (" MCRecMultHist" , " MCRecMultHist" , kTH1D , {axisMult}, true );
100121 histos.add (" MCGenMultHist" , " MCGenMultHist" , kTH1D , {axisMult}, true );
101122 histos.add (" MCGenVsRecMultHist" , " MCGenVsRecMultHist" , kTH2D , {axisMult, axisMult}, true );
@@ -104,21 +125,30 @@ struct HeavyIonMultiplicity {
104125 histos.add (" MCGenVsRecMultHist_Inelgt0" , " MCGenVsRecMultHist_Inelgt0" , kTH2D , {axisMult, axisMult}, true );
105126 }
106127 }
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);
128+
129+ expressions::Filter trackSelectionProperMixed = ncheckbit(aod::track::detectorMap, (uint8_t )o2::aod::track::ITS ) &&
130+ ncheckbit (aod::track::trackCutFlag, trackSelectionITS) &&
131+ ifnode (ncheckbit(aod::track::detectorMap, (uint8_t )o2::aod::track::TPC),
132+ ncheckbit(aod::track::trackCutFlag, trackSelectionTPC), true) &&
133+ ifnode(dcaZ.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ && ncheckbit(aod::track::trackCutFlag, trackSelectionDCAXYonly),
134+ ncheckbit(aod::track::trackCutFlag, trackSelectionDCA));
135+
108136 void processData (CollisionDataTable::iterator const & collision, FilTrackDataTable const & tracks)
109137 {
110138 auto NchTracks = 0 ;
111139 bool Inelgt0 = false ;
112140 histos.fill (HIST (" EventHist" ), 0 );
113141 if (collision.sel8 ()) {
114142 histos.fill (HIST (" EventHist" ), 1 );
115- if (std::abs (collision.posZ ()) < 10 ) {
143+ if (std::abs (collision.posZ ()) < VtxRange ) {
116144 histos.fill (HIST (" EventHist" ), 2 );
117145 histos.fill (HIST (" VtxZHist" ), collision.posZ ());
118146 for (auto & track : tracks) {
119147 if (std::abs (track.eta ()) < etaRange) {
120148 NchTracks++;
121149 histos.fill (HIST (" EtaHist" ), track.eta ());
150+ histos.fill (HIST (" PhiHist" ), track.phi ());
151+ histos.fill (HIST (" PhiVsEtaHist" ), track.phi (), track.eta ());
122152 histos.fill (HIST (" EtaVsVtxZHist" ), track.eta (), collision.posZ ());
123153 histos.fill (HIST (" DCAXYHist" ), track.dcaXY ());
124154 histos.fill (HIST (" DCAZHist" ), track.dcaZ ());
@@ -138,6 +168,7 @@ struct HeavyIonMultiplicity {
138168 }
139169
140170 PROCESS_SWITCH (HeavyIonMultiplicity, processData, " process data" , false );
171+
141172 void processMC (CollisionMCTrueTable::iterator const & TrueCollision, CollisionMCRecTable const & RecCollisions, TrackMCTrueTable const & GenParticles, FilTrackMCRecTable const & RecTracks)
142173 {
143174 histos.fill (HIST (" MCEventHist_ambiguity" ), RecCollisions.size ());
@@ -163,6 +194,8 @@ struct HeavyIonMultiplicity {
163194 if (std::abs (particle.eta ()) < etaRange) {
164195 NchGenTracks++;
165196 histos.fill (HIST (" MCGenEtaHist" ), particle.eta ());
197+ histos.fill (HIST (" MCGenPhiHist" ), particle.phi ());
198+ histos.fill (HIST (" MCGenPhiVsEtaHist" ), particle.phi (), particle.eta ());
166199 }
167200 }
168201 }
@@ -177,7 +210,7 @@ struct HeavyIonMultiplicity {
177210 histos.fill (HIST (" EventHist" ), 0 );
178211 if (RecCollision.sel8 ()) {
179212 histos.fill (HIST (" EventHist" ), 1 );
180- if (std::abs (RecCollision.posZ ()) < 10 ) {
213+ if (std::abs (RecCollision.posZ ()) < VtxRange ) {
181214 histos.fill (HIST (" EventHist" ), 2 );
182215 histos.fill (HIST (" VtxZHist" ), RecCollision.posZ ());
183216
@@ -186,6 +219,8 @@ struct HeavyIonMultiplicity {
186219 if (std::abs (Rectrack.eta ()) < etaRange) {
187220 NchRecTracks++;
188221 histos.fill (HIST (" MCRecEtaHist" ), Rectrack.eta ());
222+ histos.fill (HIST (" MCRecPhiHist" ), Rectrack.phi ());
223+ histos.fill (HIST (" MCRecPhiVsEtaHist" ), Rectrack.phi (), Rectrack.eta ());
189224 histos.fill (HIST (" EtaVsVtxZMCRecHist" ), Rectrack.eta (), RecCollision.posZ ());
190225 histos.fill (HIST (" DCAXYMCRecHist" ), Rectrack.dcaXY ());
191226 histos.fill (HIST (" DCAZMCRecHist" ), Rectrack.dcaZ ());
@@ -210,6 +245,7 @@ struct HeavyIonMultiplicity {
210245 }
211246 PROCESS_SWITCH (HeavyIonMultiplicity, processMC, " process MC" , false );
212247};
248+
213249WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
214250{
215251 return WorkflowSpec{adaptAnalysisTask<HeavyIonMultiplicity>(cfgc)};
0 commit comments