1313#include " Framework/AnalysisDataModel.h"
1414#include " Framework/AnalysisTask.h"
1515
16+ #include " Selections.h"
1617#include " ReducedTables.h"
1718
1819#include " Framework/runDataProcessing.h"
1920
2021using namespace o2 ;
2122using namespace o2 ::framework;
2223using namespace o2 ::framework::expressions;
24+ using namespace pwgmm ::mult;
2325static constexpr float defparams[1 ][7 ] = {{0.142664 , 1.40302 , 2.61158 , 1.20139 , 5.24992 , 2.16384 , 0.871307 }};
26+ static constexpr double PI = o2::constants::math::PI;
2427
2528struct Reducer {
29+ SliceCache cache;
30+
2631 using BCs = soa::Join<aod::BCs, aod::Timestamps, aod::BcSels>;
2732 using MCCollisions = soa::Join<aod::McCollisions, aod::HepMCXSections, aod::HepMCPdfInfos, aod::MultsExtraMC>;
2833 using MCCollisionsNoHepMC = soa::Join<aod::McCollisions, aod::MultsExtraMC>;
2934 using Collisions = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::FT0Mults, aod::FDDMults, aod::ZDCMults, aod::PVMults>;
3035 using Particles = aod::McParticles;
31- using Tracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, aod::TracksDCA, aod::McTrackLabels>;
36+ using Tracks = soa::Filtered<soa:: Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, aod::TracksDCA, aod::McTrackLabels> >;
3237
3338 Produces<aod::StoredRBCs> rbcs;
3439 Produces<aod::StoredRMCCollisions> rmcc;
@@ -39,6 +44,9 @@ struct Reducer {
3944 Configurable<float > reductionFactor{" reduction-factor" , 1 .e -4 , " Reduction factor" };
4045 Configurable<LabeledArray<float >> params{" params" , {defparams[0 ], 1 , 7 , {" pars" }, {" 0bin" , " l" , " a" , " n1" , " p1" , " n2" , " p2" }}, " Multiplicity distribution parameterization" };
4146
47+ Configurable<std::vector<double >> etaBins{" eta" , {-1.5 , -0.5 , 0.5 , 1.5 }, " eta binning" };
48+ Configurable<std::vector<double >> phiBins{" phi" , {0 ., PI / 2 ., PI, 3 . * PI / 2 ., 2 . * PI}, " phi binning" };
49+
4250 Preslice<aod::Collisions> cperBC = aod::collision::bcId;
4351 Preslice<aod::McCollisions> mccperBC = aod::mccollision::bcId;
4452 Preslice<aod::McParticles> perMCc = aod::mcparticle::mcCollisionId;
@@ -52,6 +60,11 @@ struct Reducer {
5260 std::vector<int64_t > usedLabels;
5361 std::vector<float > weights;
5462
63+ std::vector<double > etabins;
64+ std::vector<double > phibins;
65+
66+ std::vector<int > binned;
67+
5568 double NormalizedDoubleNBD (double x)
5669 {
5770 // <n> = (p[2,4]^2)
@@ -73,6 +86,23 @@ struct Reducer {
7386 randomgen.seed (rd ());
7487 LOGP (debug, " >>> Starting with params: {}, {}, {}, {}, {}, {}, {}" , params->get ((int )0 , int (0 )), params->get ((int )0 , 1 ), params->get ((int )0 , 2 ),
7588 params->get ((int )0 , 3 ), params->get ((int )0 , 4 ), params->get ((int )0 , 5 ), params->get ((int )0 , 6 ));
89+ etabins = static_cast <std::vector<double >>(etaBins);
90+ phibins = static_cast <std::vector<double >>(phiBins);
91+ binned.resize ((etabins.size () - 1 ) * (phibins.size () - 1 ));
92+ }
93+
94+ int findBin (float eta, float phi)
95+ {
96+ // locate a bin in a linear array - the stride for phi is etabins.size() - 1
97+ if (std::abs (eta) < etabins[0 ]) { // underflow
98+ return -1 ;
99+ }
100+ auto e = std::lower_bound (etabins.begin (), etabins.end (), eta);
101+ if (e == etabins.end ()) { // overflow
102+ return -1 ;
103+ }
104+ auto p = std::lower_bound (phibins.begin (), phibins.end (), phi);
105+ return std::distance (etabins.begin (), e) - 1 /* eta pos */ + (etabins.size () - 1 ) /* stride */ * (std::distance (phibins.begin (), p) - 1 ) /* phi pos */ ;
76106 }
77107
78108 template <typename MCC>
@@ -108,28 +138,37 @@ struct Reducer {
108138 }
109139 }
110140
141+ expressions::Filter fTrackSelectionITS = ncheckbit(aod::track::v001::detectorMap, (uint8_t )o2::aod::track::ITS) &&
142+ ncheckbit (aod::track::trackCutFlag, trackSelectionITS);
143+ expressions::Filter fTrackSelectionTPC = ifnode(ncheckbit(aod::track::v001::detectorMap, (uint8_t )o2::aod::track::TPC),
144+ ncheckbit (aod::track::trackCutFlag, trackSelectionTPC), true );
145+ expressions::Filter fTrackSelectionDCA = ncheckbit(aod::track::trackCutFlag, trackSelectionDCA);
146+
111147 void processFull (BCs::iterator const & bc,
112148 MCCollisions const & mccollisions,
113- Collisions const & collisions)
149+ Collisions const & collisions,
150+ Tracks const & tracks)
114151 {
115- processGeneric (bc, mccollisions, collisions);
152+ processGeneric (bc, mccollisions, collisions, tracks );
116153 }
117154
118155 PROCESS_SWITCH (Reducer, processFull, " Full process with HepMC" , false );
119156
120157 void processLite (BCs::iterator const & bc,
121158 MCCollisionsNoHepMC const & mccollisions,
122- Collisions const & collisions)
159+ Collisions const & collisions,
160+ Tracks const & tracks)
123161 {
124- processGeneric (bc, mccollisions, collisions);
162+ processGeneric (bc, mccollisions, collisions, tracks );
125163 }
126164
127165 PROCESS_SWITCH (Reducer, processLite, " Process without HepMC" , true );
128166
129- template <typename TBCI, typename TMCC, typename TC>
167+ template <typename TBCI, typename TMCC, typename TC, typename TT >
130168 void processGeneric (TBCI const & bc,
131169 TMCC const & mccollisions,
132- TC const & collisions)
170+ TC const & collisions,
171+ TT const & tracks)
133172 {
134173 usedMCCs.clear ();
135174 usedLabels.clear ();
@@ -154,7 +193,7 @@ struct Reducer {
154193 continue ;
155194 }
156195 rmcc (bcId, weights[i], mcc.posX (), mcc.posY (), mcc.posZ (), mcc.impactParameter (), mcc.multMCFT0A (), mcc.multMCFT0C (), mcc.multMCNParticlesEta05 (), mcc.multMCNParticlesEta10 ());
157- if constexpr (TMCC:: template contains<aod::HepMCXSections>() && TMCC:: template contains<aod::HepMCPdfInfos>() ) {
196+ if constexpr (requires {mcc. processId (); mcc. pdf1 (); } ) {
158197 rhepmci (rmcc.lastIndex (), mcc.xsectGen (), mcc.ptHard (), mcc.nMPI (), mcc.processId (), mcc.id1 (), mcc.id2 (), mcc.pdfId1 (), mcc.pdfId2 (), mcc.x1 (), mcc.x2 (), mcc.scalePdf (), mcc.pdf1 (), mcc.pdf2 ());
159198 }
160199 // remember used events so that the index relation can be preserved
@@ -176,7 +215,15 @@ struct Reducer {
176215 ++i;
177216 continue ;
178217 }
179- rc (bcId, c.posX (), c.posY (), c.posZ (), c.collisionTimeRes (), c.multFT0A (), c.multFT0C (), c.multFDDA (), c.multFDDC (), c.multZNA (), c.multZNC (), c.multNTracksPV (), c.multNTracksPVeta1 (), c.multNTracksPVetaHalf ());
218+ std::fill (binned.begin (), binned.end (), 0 );
219+ auto stracks = tracks.sliceBy (perC, c.globalIndex ());
220+ for (auto & track : stracks) {
221+ auto bin = findBin (track.eta (), track.phi ());
222+ if (bin >= 0 ) {
223+ binned[bin] += 1 ;
224+ }
225+ }
226+ rc (bcId, c.posX (), c.posY (), c.posZ (), c.collisionTimeRes (), c.multFT0A (), c.multFT0C (), c.multFDDA (), c.multFDDC (), c.multZNA (), c.multZNC (), c.multNTracksPV (), c.multNTracksPVeta1 (), c.multNTracksPVetaHalf (), binned);
180227 rmcl (usedLabels[std::distance (usedMCCs.begin (), pos)]);
181228 ++i;
182229 }
0 commit comments