2020#include " Common/DataModel/Multiplicity.h"
2121#include " Common/DataModel/EventSelection.h"
2222#include " Common/DataModel/Centrality.h"
23+ #include " Common/DataModel/TrackSelectionTables.h"
2324#include " Common/Core/MC.h"
2425
2526#include " TDatabasePDG.h"
@@ -52,6 +53,9 @@ struct PseudorapidityDensity {
5253 Configurable<float > vtxZMax{" vtxZMax" , 15 , " max z vertex" };
5354 Configurable<float > vtxZMin{" vtxZMin" , -15 , " min z vertex" };
5455
56+ Configurable<float > maxDCAXY{" maxDCAXY" , 2.4 , " max allowed transverse DCA" };
57+ Configurable<float > maxDCAZ{" maxDCAZ" , 3.2 , " max allowed longitudal DCA" };
58+
5559 ConfigurableAxis percentileBinning{" pBins" ,
5660 {VARIABLE_WIDTH, 0 ., 0.01 , 0.1 , 0.5 , 1 , 5 , 10 , 15 , 20 , 30 , 40 , 50 , 70 , 100 },
5761 " Centrality/multiplicity percentile binning" };
@@ -106,10 +110,11 @@ struct PseudorapidityDensity {
106110
107111 expressions::Filter etaFilter = (aod::track::eta < etaMax) && (aod::track::eta > etaMin);
108112 expressions::Filter trackTypeFilter = (aod::track::trackType == TRACKTYPE);
113+ expressions::Filter DCAFilter = aod::track::dcaXY <= maxDCAXY && aod::track::dcaZ <= maxDCAZ;
109114 expressions::Filter posZFilter = (aod::collision::posZ < vtxZMax) && (aod::collision::posZ > vtxZMin);
110115 expressions::Filter posZFilterMC = (aod::mccollision::posZ < vtxZMax) && (aod::mccollision::posZ > vtxZMin);
111116
112- void process (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels>>::iterator const & collision, soa::Filtered<aod::Tracks> const & tracks)
117+ void process (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels>>::iterator const & collision, soa::Filtered<soa::Join< aod::Tracks, aod::TracksExtended> > const & tracks)
113118 {
114119 registry.fill (HIST (" EventSelection" ), 1 .);
115120 if (select (collision)) {
@@ -125,7 +130,7 @@ struct PseudorapidityDensity {
125130 }
126131 }
127132
128- void processBinned (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::CentV0Ms>>::iterator const & collision, soa::Filtered<aod::Tracks> const & tracks)
133+ void processBinned (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::CentV0Ms>>::iterator const & collision, soa::Filtered<soa::Join< aod::Tracks, aod::TracksExtended> > const & tracks)
129134 {
130135 auto p = collision.centV0M ();
131136 registry.fill (HIST (" EventSelectionBin" ), 1 ., p);
@@ -146,7 +151,7 @@ struct PseudorapidityDensity {
146151
147152 using Particles = aod::McParticles;
148153
149- void processGen (soa::Filtered<aod::McCollisions>::iterator const & mcCollision, o2::soa::SmallGroups<soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels>> const & collisions, Particles const & particles, soa::Filtered<aod::Tracks> const & tracks)
154+ void processGen (soa::Filtered<aod::McCollisions>::iterator const & mcCollision, o2::soa::SmallGroups<soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels>> const & collisions, Particles const & particles, soa::Filtered<soa::Join< aod::Tracks, aod::TracksExtended> > const & tracks)
150155 {
151156 registry.fill (HIST (" EventEfficiency" ), 1 .);
152157 for (auto & collision : collisions) {
@@ -161,17 +166,27 @@ struct PseudorapidityDensity {
161166 auto p = pdg->GetParticle (particle.pdgCode ());
162167 int charge = 0 ;
163168 if (p == nullptr ) {
169+ // unknown particles will be skipped
164170 if (particle.pdgCode () > 1000000000 ) {
165- auto x = (std::trunc (particle.pdgCode () / 10000 ) - 100000 );
166- charge = x - std::trunc (x / 1000 ) * 1000 ;
167- LOGF (DEBUG, " [%d] Nucleus with PDG code %d (charge %d) " , particle.globalIndex (), particle.pdgCode (), charge);
171+ // auto x = (std::trunc(particle.pdgCode() / 10000) - 100000);
172+ // charge = x - std::trunc(x / 1000) * 1000;
173+ LOGF (DEBUG, " [%d] Nucleus with PDG code %d" , particle.globalIndex (), particle.pdgCode () /* , charge*/ ); // (charge %d)
168174 } else {
169175 LOGF (DEBUG, " [%d] Unknown particle with PDG code %d" , particle.globalIndex (), particle.pdgCode ());
170176 }
171177 } else {
172178 charge = p->Charge ();
173179 }
174180 if (charge != 0 && MC::isPhysicalPrimary (particle) && (particle.eta () < etaMax) && (particle.eta () > etaMin)) {
181+ // FIXME: temporary before Run 3 MC is fixed
182+ if constexpr (TRACKTYPE == o2::dataformats::GlobalTrackID::ITS) {
183+ auto dcaxy = std::sqrt ((particle.vx () - mcCollision.posX ()) * (particle.vx () - mcCollision.posX ()) +
184+ (particle.vy () - mcCollision.posY ()) * (particle.vy () - mcCollision.posY ()));
185+ auto dcaz = std::abs (particle.vz () - mcCollision.posZ ());
186+ if (!(dcaxy <= maxDCAXY && dcaz <= maxDCAZ)) {
187+ continue ;
188+ }
189+ }
175190 registry.fill (HIST (" TracksEtaZvtxGen" ), particle.eta (), mcCollision.posZ ());
176191 registry.fill (HIST (" TracksPhiEtaGen" ), particle.phi (), particle.eta ());
177192 }
0 commit comments