1313// / \brief Multiplicity task for ALICE3
1414// / \file alice3Multiplicity.cxx
1515
16+ #include " ALICE3/DataModel/collisionAlice3.h"
1617#include " ALICE3/DataModel/tracksAlice3.h"
1718#include " Common/DataModel/Multiplicity.h"
1819#include " Common/DataModel/TrackSelectionTables.h"
2627#include < Framework/HistogramRegistry.h>
2728#include < Framework/HistogramSpec.h>
2829#include < Framework/InitContext.h>
30+ #include < Framework/O2DatabasePDGPlugin.h>
2931#include < Framework/OutputObjHeader.h>
3032#include < Framework/runDataProcessing.h>
3133
@@ -40,12 +42,10 @@ using namespace o2::framework::expressions;
4042
4143using TracksAlice3 = soa::Join<aod::Tracks, aod::TracksDCA, o2::aod::TracksAlice3, aod::TracksExtraA3>;
4244
43- constexpr float EtaHalf = 0.5 ;
44- constexpr float Eta1 = 1.0 ;
45-
4645struct Alice3Multiplicity {
4746 Produces<aod::PVMults> multPV;
4847 Produces<aod::MultsGlobal> multGlobal;
48+ Produces<aod::MultsMCAlice3> multMC;
4949
5050 HistogramRegistry histos{" Histos" , {}, OutputObjHandlingPolicy::AnalysisObject};
5151 Configurable<float > minEta{" minEta" , -2 .5f , " Minimum eta in range for global track counting" };
@@ -58,6 +58,8 @@ struct Alice3Multiplicity {
5858
5959 ConfigurableAxis axisMult{" axisMult" , {10000 , 0 , 10000 }, " Reconstructed tracks" };
6060
61+ Service<o2::framework::O2DatabasePDG> pdg;
62+
6163 Filter trackFilter = (aod::track::eta >= minEta) && (aod::track::eta <= maxEta) && (nabs(aod::track::dcaXY) <= maxDCAxy) && (nabs(aod::track::dcaZ) <= maxDCAz) && (aod::track_alice3::nSiliconHits >= minSiliconHits) && (!requireReconstructed || aod::track_alice3::isReconstructed);
6264
6365 void init (InitContext&)
@@ -66,8 +68,14 @@ struct Alice3Multiplicity {
6668 histos.add (" multiplicity/nTracksPV" , " nTracksPV" , kTH1D , {axisMult});
6769 histos.add (" multiplicity/nTracksPVeta1" , " nTracksPVeta1" , kTH1D , {axisMult});
6870 histos.add (" multiplicity/nTracksPVetaHalf" , " nTracksPVetaHalf" , kTH1D , {axisMult});
71+
6972 histos.add (" multiplicity/nTracksGlobal" , " nTracksGlobal" , kTH1D , {axisMult});
7073 histos.add (" multiplicity/nTracksGlobalPV" , " nTracksGlobalPV" , kTH1D , {axisMult});
74+
75+ histos.add (" multiplicity/nTracksMC" , " nTracksMC" , kTH1D , {axisMult});
76+ histos.add (" multiplicity/nTracksMCEta25" , " nTracksMCEta25" , kTH1D , {axisMult});
77+ histos.add (" multiplicity/nTracksMCEta125" , " nTracksMCEta125" , kTH1D , {axisMult});
78+ histos.add (" multiplicity/nTracksMCEta09" , " nTracksMCEta09" , kTH1D , {axisMult});
7179 }
7280 }
7381
@@ -99,9 +107,9 @@ struct Alice3Multiplicity {
99107 for (const auto & track : tracks) {
100108 if (track.isPVContributor ()) {
101109 ++numTracksPV;
102- if (std::abs (track.eta ()) < Eta1 )
110+ if (std::abs (track.eta ()) < 1.0 )
103111 ++numTracksPVeta1;
104- if (std::abs (track.eta ()) < EtaHalf )
112+ if (std::abs (track.eta ()) < 0.5 )
105113 ++numTracksPVetaHalf;
106114 }
107115 }
@@ -115,13 +123,54 @@ struct Alice3Multiplicity {
115123 multPV (numTracksPV, numTracksPVeta1, numTracksPVetaHalf);
116124 }
117125
126+ void processMC (aod::McCollision const & /* mcCollision*/ , aod::McParticles const & mcParticles)
127+ {
128+ int numMCParticles = 0 ;
129+ int numMCParticlesEta25 = 0 ;
130+ int numMCParticlesEta125 = 0 ;
131+ int numMCParticlesEta09 = 0 ;
132+
133+ for (const auto & mcParticle : mcParticles) {
134+ if (!mcParticle.isPhysicalPrimary ()) {
135+ continue ;
136+ }
137+
138+ auto charge = 0 .;
139+ auto * p = pdg->GetParticle (mcParticle.pdgCode ());
140+ if (p != nullptr ) {
141+ charge = p->Charge ();
142+ }
143+ if (std::abs (charge) < 1e-3 ) {
144+ continue ;
145+ }
146+
147+ ++numMCParticles;
148+ if (std::abs (mcParticle.eta ()) < 2.5 )
149+ ++numMCParticlesEta25;
150+ if (std::abs (mcParticle.eta ()) < 1.25 )
151+ ++numMCParticlesEta125;
152+ if (std::abs (mcParticle.eta ()) < 0.9 )
153+ ++numMCParticlesEta09;
154+ }
155+
156+ if (doQA) {
157+ histos.fill (HIST (" multiplicity/nTracksMC" ), numMCParticles);
158+ histos.fill (HIST (" multiplicity/nTracksMCEta25" ), numMCParticlesEta25);
159+ histos.fill (HIST (" multiplicity/nTracksMCEta125" ), numMCParticlesEta125);
160+ histos.fill (HIST (" multiplicity/nTracksMCEta09" ), numMCParticlesEta09);
161+ }
162+
163+ multMC (numMCParticles, numMCParticlesEta25, numMCParticlesEta125, numMCParticlesEta09);
164+ }
165+
118166 void processDummy (const aod::Collision&)
119167 {
120168 // do nothing
121169 }
122170
123171 PROCESS_SWITCH (Alice3Multiplicity, processGlobalTracks, " Process global track counter" , false );
124172 PROCESS_SWITCH (Alice3Multiplicity, processPV, " Process primary vertex contributor tracks" , false );
173+ PROCESS_SWITCH (Alice3Multiplicity, processMC, " Process MC truth information" , false );
125174 PROCESS_SWITCH (Alice3Multiplicity, processDummy, " Dummy proccess function" , true );
126175};
127176
0 commit comments