@@ -88,7 +88,6 @@ auto static constexpr CminCharge = 3.f;
8888static constexpr int CnullInt = 0 ;
8989static constexpr float Cnull = 0 .0f ;
9090static constexpr int ConeInt = 1 ;
91- static constexpr int CtwoInt = 2 ;
9291static constexpr float Cone = 1 .0f ;
9392
9493// FV0 specific constants
@@ -221,10 +220,20 @@ enum EvtSel {
221220
222221struct MultE {
223222 static constexpr int CnoMult = 0 ;
224- static constexpr int CmultFT0M = 1 ;
225- static constexpr int CmultTPC = 2 ;
223+ static constexpr int CmultFT0C = 1 ;
224+ static constexpr int CmultFT0M = 2 ;
225+ static constexpr int CmultTPC = 3 ;
226226};
227-
227+ /*
228+ template <typename C>
229+ concept hasFT0C = requires(C::iterator const& c) {
230+ c.centFT0C();
231+ };
232+ template <typename C>
233+ concept hasFT0M = requires(C::iterator const& c) {
234+ c.centFT0M();
235+ };
236+ */
228237struct FlattenictyPikp {
229238
230239 HistogramRegistry registryData{" registryData" , {}, OutputObjHandlingPolicy::AnalysisObject, true , true };
@@ -241,7 +250,7 @@ struct FlattenictyPikp {
241250 o2::parameters::GRPMagField* grpmag = nullptr ;
242251
243252 struct : ConfigurableGroup {
244- Configurable<int > multEst{" multEst" , 1 , " 0: without multiplicity; 1: MultFT0M ; 2: MultTPC" };
253+ Configurable<int > multEst{" multEst" , 1 , " 0: without multiplicity; 1: MultFT0C ; 2: MultFT0M; 3 : MultTPC" };
245254 Configurable<bool > applyCalibGainFromCCDB{" applyCalibGainFromCCDB" , false , " equalize detector amplitudes" };
246255 Configurable<bool > applyCalibVtxFromCCDB{" applyCalibVtxFromCCDB" , false , " equalize Amp vs vtx" };
247256 Configurable<bool > applyCalibDeDx{" applyCalibDeDx" , false , " calibration of dedx signal" };
@@ -283,13 +292,14 @@ struct FlattenictyPikp {
283292 Configurable<float > cutVtxZ{" cutVtxZ" , 10 .0f , " Accepted z-vertex range" };
284293 Configurable<bool > zVtxCutMC{" zVtxCutMC" , true , " use Zvtx cut in MC" };
285294 Configurable<bool > useINELCutMC{" useINELCutMC" , true , " use INEL>0 cut in MC" };
286- Configurable<bool > removeNoSameBunchPileup{" removeNoSameBunchPileup" , true , " Reject collisions in case of pileup with another collision in the same foundBC" };
287- Configurable<bool > requireIsGoodZvtxFT0vsPV{" requireIsGoodZvtxFT0vsPV" , true , " Small difference between z-vertex from PV and from FT0" };
295+ Configurable<bool > removeNoSameBunchPileup{" removeNoSameBunchPileup" , false , " Reject collisions in case of pileup with another collision in the same foundBC" };
296+ Configurable<bool > requireIsGoodZvtxFT0vsPV{" requireIsGoodZvtxFT0vsPV" , false , " Small difference between z-vertex from PV and from FT0" };
288297 Configurable<bool > requireIsVertexITSTPC{" requireIsVertexITSTPC" , false , " At least one ITS-TPC track (reject vertices built from ITS-only tracks)" };
289298 Configurable<bool > requirekIsVertexTOFmatched{" requirekIsVertexTOFmatched" , false , " Require kIsVertexTOFmatched: at least one of vertex contributors is matched to TOF" };
290299 Configurable<bool > useMultMCmidrap{" useMultMCmidrap" , true , " use generated Nch in ∣eta∣ < 0.8" };
291300 Configurable<bool > useInelgt0wTVX{" useInelgt0wTVX" , true , " Use INEL > 0 condition with TVX trigger, i.e. FT0A and FT0C acceptance" };
292301 Configurable<bool > removeSplitVertex{" removeSplitVertex" , true , " Remove split vertices" };
302+ // Configurable<bool> customGenCent{"customGenCent", false, "Use custom generated MC centrality estimation"};
293303 } evtSelOpt;
294304
295305 struct : ConfigurableGroup {
@@ -484,8 +494,9 @@ struct FlattenictyPikp {
484494 using MyCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::FT0sCorrected, aod::CentFT0As, aod::CentFT0Cs>;
485495 using Colls = soa::Join<aod::Collisions, aod::EvSels, aod::TPCMults, aod::PVMults, aod::MultZeqs, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>;
486496 using CollsGen = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::TPCMults, aod::PVMults, aod::MultZeqs, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>;
487- using MCColls = soa::Join<aod::McCollisions, aod::McCentFT0Ms, aod::MultsExtraMC>;
488- using CollsMCExtraMult = soa::Join<aod::McCollisions, aod::McCentFT0Ms, aod::MultMCExtras, aod::McCollsExtra>;
497+ using MCColls = soa::Join<aod::McCollisions, aod::McCentFT0Ms, aod::McCentFT0Cs, aod::MultsExtraMC>;
498+ using CollsMCExtraMult = soa::Join<aod::McCollisions, aod::McCentFT0Ms, aod::McCentFT0Cs, aod::MultMCExtras, aod::McCollsExtra>;
499+ // using CollsMCExtraMultPercentile = soa::Join<aod::McCollisions, aod::McCentFT0Ms, aod::McCentFT0Cs, aod::MultMCExtras, aod::McCollsExtra, aod::McPercentiles>;
489500 using CollsGenSgn = soa::SmallGroups<soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::TPCMults, aod::PVMults, aod::MultZeqs, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>>;
490501 using MyPIDTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection, aod::TrackSelectionExtension, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::pidTPCFullEl, aod::pidTPCFullMu, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr, aod::pidTOFFullEl, aod::pidTOFFullMu, aod::pidTOFbeta, aod::TOFSignal, aod::pidTOFFlags>;
491502 using MyLabeledTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, aod::TrackSelectionExtension, aod::TracksDCA, aod::McTrackLabels>;
@@ -591,17 +602,20 @@ struct FlattenictyPikp {
591602
592603 AxisSpec multAxis{binOpt.axisMultPerc , " multiplicity estimator" };
593604
594- switch (defOpt.multEst ) {
605+ switch (defOpt.multEst . value ) {
595606 case MultE::CnoMult:
596607 break ;
608+ case MultE::CmultFT0C:
609+ multAxis.name = " multFT0C" ;
610+ break ;
597611 case MultE::CmultFT0M:
598612 multAxis.name = " multFT0M" ;
599613 break ;
600614 case MultE::CmultTPC:
601615 multAxis.name = " multTPC" ;
602616 break ;
603617 default :
604- LOG (fatal) << " No valid option for mult estimator " << defOpt.multEst ;
618+ LOGF (fatal, " No valid option for mult estimator %d " , defOpt.multEst . value ) ;
605619 }
606620
607621 if (trkSelOpt.rejectTrkAtTPCSector || v0SelOpt.rejectV0sAtTPCSector ) {
@@ -791,6 +805,8 @@ struct FlattenictyPikp {
791805 registryMC.get <TH1 >(HIST (" Events/hEvtMcGen" ))->GetXaxis ()->SetBinLabel (3 , " INELgt0" );
792806 registryMC.get <TH1 >(HIST (" Events/hEvtMcGen" ))->GetXaxis ()->SetBinLabel (4 , " INELgt0TVX" );
793807 //
808+ registryMC.add (" Events/hNchGen" , " Gen Nch; Gen Nch (|#eta|<0.8)" , {kTH1F , {nChAxis}});
809+ registryMC.add (" Events/hNchGenCent" , " Gen cent; mult" , {kTH1F , {multAxis}});
794810 registryMC.add (" Events/hNchGenVsCent" , " Gen Nch vs Cent; mult; Gen Nch (|#eta|<0.8)" , {kTH2F , {nChAxis, multAxis}});
795811 registryMC.add (" Events/hVtxZRec" , " MC Rec vertex z position" , kTH1F , {vtxzAxis});
796812 registryMC.add (" Events/hVtxZGen" , " Generated vertex z position" , kTH1F , {vtxzAxis});
@@ -1337,25 +1353,6 @@ struct FlattenictyPikp {
13371353 return std::abs (charge) >= CminCharge;
13381354 }
13391355
1340- template <typename P>
1341- int countPart (P const & particles)
1342- {
1343- auto nCharged = 0 ;
1344- for (auto const & particle : particles) {
1345- if (!isChrgParticle (particle.pdgCode ())) {
1346- continue ;
1347- }
1348- if (!particle.isPhysicalPrimary ()) {
1349- continue ;
1350- }
1351- if (std::abs (particle.eta ()) > trkSelOpt.trkEtaMax ) {
1352- continue ;
1353- }
1354- nCharged++;
1355- }
1356- return nCharged;
1357- }
1358-
13591356 template <typename P>
13601357 bool isInelGt0wTVX (P const & particles)
13611358 {
@@ -1933,13 +1930,36 @@ struct FlattenictyPikp {
19331930 return iRing;
19341931 }
19351932
1933+ template <typename C>
1934+ float getGenCent (C const & collision)
1935+ {
1936+ float val = -999.0 ;
1937+ switch (defOpt.multEst .value ) {
1938+ case MultE::CnoMult:
1939+ return val;
1940+ case MultE::CmultFT0C:
1941+ return collision.centFT0C ();
1942+ case MultE::CmultFT0M:
1943+ return collision.centFT0M ();
1944+ default :
1945+ LOGF (fatal, " No valid centrality estimator: %s" , defOpt.multEst .value );
1946+ return val;
1947+ }
1948+ }
1949+
19361950 template <typename C, bool isMC = false >
19371951 float getMult (C const & collision)
19381952 {
19391953 float val = -999.0 ;
1940- switch (defOpt.multEst ) {
1954+ switch (defOpt.multEst . value ) {
19411955 case MultE::CnoMult:
19421956 return val;
1957+ case MultE::CmultFT0C:
1958+ if constexpr (!isMC) {
1959+ return collision.centFT0C ();
1960+ } else {
1961+ return collision.multMCFT0C ();
1962+ }
19431963 break ;
19441964 case MultE::CmultFT0M:
19451965 if constexpr (!isMC) {
@@ -1952,13 +1972,12 @@ struct FlattenictyPikp {
19521972 if constexpr (!isMC) {
19531973 return collision.multTPC ();
19541974 } else {
1955- LOG (fatal) << " No valid multiplicity estimator: " << defOpt.multEst ;
1956- return val;
1975+ return collision.multMCNParticlesEta08 ();
19571976 }
19581977 break ;
19591978 default :
1960- return collision. centFT0M ( );
1961- break ;
1979+ LOGF (fatal, " No valid multiplicity estimator: %s " , defOpt. multEst . value );
1980+ return val ;
19621981 }
19631982 }
19641983
@@ -2400,11 +2419,32 @@ struct FlattenictyPikp {
24002419 {
24012420 LOGP (debug, " MC col {} has {} reco cols" , mcCollision.globalIndex (), collisions.size ());
24022421 auto multMC = -1 .;
2403- if (evtSelOpt.useMultMCmidrap || defOpt. multEst == CtwoInt ) { // use generated Nch in ∣eta∣ < 0.8
2404- multMC = countPart (particles );
2422+ if (evtSelOpt.useMultMCmidrap ) {
2423+ multMC = mcCollision. multMCNParticlesEta08 ( );
24052424 } else {
2406- multMC = getMultMC (mcCollision); // using McCentFT0Ms
2407- }
2425+ multMC = getMultMC (mcCollision);
2426+ }
2427+ /*
2428+ cauto centMcGen = -1.;
2429+ if (evtSelOpt.customGenCent) {
2430+ if constexpr (hasFT0C<CollsGen>) {
2431+ centMcGen = mcCollision.mcpercft0c();
2432+ } else if (hasFT0M<CollsGen>) {
2433+ centMcGen = mcCollision.mcpercft0m();
2434+ }
2435+ } else {
2436+ if (defOpt.multEst == MultE::CmultFT0C) {
2437+ centMcGen = mcCollision.centFT0C();
2438+ } else if (defOpt.multEst == MultE::CmultFT0M) {
2439+ centMcGen = mcCollision.centFT0M();
2440+ } else {
2441+ centMcGen = -1.;
2442+ }
2443+ }
2444+ */
2445+ registryMC.fill (HIST (" Events/hNchGen" ), multMC);
2446+ registryMC.fill (HIST (" Events/hNchGenCent" ), getGenCent (mcCollision));
2447+
24082448 const float flatMC = fillFlatMC<true >(particles);
24092449 registryMC.fill (HIST (" Events/hFlatMCGen" ), flatMC);
24102450
@@ -2444,7 +2484,7 @@ struct FlattenictyPikp {
24442484 fillMCGenRecEvt<pidSgn, o2::track::PID ::Proton>(particle, multMC, flatMC);
24452485 });
24462486 }
2447- if (!isGoodEvent<false >(collision)) {
2487+ if (!isGoodEvent<true >(collision)) {
24482488 continue ;
24492489 }
24502490 const float multRecGt1 = getMult (collision);
0 commit comments