4848#include " Common/DataModel/PIDResponse.h"
4949#include " Common/DataModel/Qvectors.h"
5050#include " Framework/StaticFor.h"
51+ #include " Framework/O2DatabasePDGPlugin.h"
5152#include " Common/DataModel/McCollisionExtra.h"
5253#include " PWGLF/DataModel/EPCalibrationTables.h"
5354
@@ -202,6 +203,8 @@ struct strangederivedbuilder {
202203 Preslice<aod::McParticles> mcParticlePerMcCollision = o2::aod::mcparticle::mcCollisionId;
203204 Preslice<UDCollisionsFull> udCollisionsPerCollision = o2::aod::udcollision::collisionId;
204205
206+ Service<o2::framework::O2DatabasePDG> pdg;
207+
205208 std::vector<uint32_t > genK0Short;
206209 std::vector<uint32_t > genLambda;
207210 std::vector<uint32_t > genAntiLambda;
@@ -549,18 +552,42 @@ struct strangederivedbuilder {
549552 }
550553
551554 // master function to process a collision
552- template <typename mccoll>
553- void populateMCCollisionTable (mccoll const & mcCollisions)
555+ template <typename mccoll, typename mcparts >
556+ void populateMCCollisionTable (mccoll const & mcCollisions, mcparts const & mcParticlesEntireTable )
554557 {
555558 // ______________________________________________
556559 // fill all MC collisions, correlate via index later on
557560 for (const auto & mccollision : mcCollisions) {
561+ const uint64_t mcCollIndex = mccollision.globalIndex ();
562+ auto mcParticles = mcParticlesEntireTable.sliceBy (mcParticlePerMcCollision, mcCollIndex);
563+
564+ // count total MC multiplicity in generated collision
565+ // reproduces what is done here:
566+ // https://github.com/AliceO2Group/O2Physics/blob/master/Common/TableProducer/multiplicityTable.cxx#L654
567+ int totalMult = 0 ;
568+ for (const auto & mcPart : mcParticles) {
569+ if (!mcPart.isPhysicalPrimary ()) {
570+ continue ;
571+ }
572+
573+ auto charge = 0 .;
574+ auto * p = pdg->GetParticle (mcPart.pdgCode ());
575+ if (p != nullptr ) {
576+ charge = p->Charge ();
577+ }
578+ if (std::abs (charge) < 1e-3 ) {
579+ continue ; // reject neutral particles in counters
580+ }
581+ totalMult++;
582+ }
583+
558584 strangeMCColl (mccollision.posX (), mccollision.posY (), mccollision.posZ (),
559585 mccollision.impactParameter (), mccollision.eventPlaneAngle ());
560586 strangeMCMults (mccollision.multMCFT0A (), mccollision.multMCFT0C (),
561587 mccollision.multMCNParticlesEta05 (),
562588 mccollision.multMCNParticlesEta08 (),
563- mccollision.multMCNParticlesEta10 ());
589+ mccollision.multMCNParticlesEta10 (),
590+ totalMult);
564591 }
565592 }
566593
@@ -574,15 +601,15 @@ struct strangederivedbuilder {
574601 populateCollisionTables (collisions, udCollisions, V0s, Cascades, KFCascades, TraCascades);
575602 }
576603
577- void processCollisionsWithMC (soa::Join<aod::Collisions, aod::FT0Mults, aod::FV0Mults, aod::FDDMults, aod::PVMults, aod::ZDCMults, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs, aod::CentFV0As, aod::EvSels, aod::McCollisionLabels, aod::MultsExtra, aod::MultsGlobal> const & collisions, soa::Join<aod::V0Datas, aod::McV0Labels> const & V0s, soa::Join<aod::V0MCCores, aod::V0MCCollRefs> const & /* V0MCCores*/ , soa::Join<aod::CascDatas, aod::McCascLabels> const & Cascades, aod::KFCascDatas const & KFCascades, aod::TraCascDatas const & TraCascades, aod::BCsWithTimestamps const & /* bcs*/ , soa::Join<aod::McCollisions, aod::McCollsExtra, aod::MultsExtraMC> const & mcCollisions, aod::McParticles const &)
604+ void processCollisionsWithMC (soa::Join<aod::Collisions, aod::FT0Mults, aod::FV0Mults, aod::FDDMults, aod::PVMults, aod::ZDCMults, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs, aod::CentFV0As, aod::EvSels, aod::McCollisionLabels, aod::MultsExtra, aod::MultsGlobal> const & collisions, soa::Join<aod::V0Datas, aod::McV0Labels> const & V0s, soa::Join<aod::V0MCCores, aod::V0MCCollRefs> const & /* V0MCCores*/ , soa::Join<aod::CascDatas, aod::McCascLabels> const & Cascades, aod::KFCascDatas const & KFCascades, aod::TraCascDatas const & TraCascades, aod::BCsWithTimestamps const & /* bcs*/ , soa::Join<aod::McCollisions, aod::McCollsExtra, aod::MultsExtraMC> const & mcCollisions, aod::McParticles const & mcParticles )
578605 {
579- populateMCCollisionTable (mcCollisions);
606+ populateMCCollisionTable (mcCollisions, mcParticles );
580607 populateCollisionTables (collisions, collisions, V0s, Cascades, KFCascades, TraCascades);
581608 }
582609
583- void processCollisionsWithUDWithMC (soa::Join<aod::Collisions, aod::FT0Mults, aod::FV0Mults, aod::FDDMults, aod::PVMults, aod::ZDCMults, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs, aod::CentFV0As, aod::EvSels, aod::McCollisionLabels, aod::MultsExtra, aod::MultsGlobal> const & collisions, soa::Join<aod::V0Datas, aod::McV0Labels> const & V0s, soa::Join<aod::V0MCCores, aod::V0MCCollRefs> const & /* V0MCCores*/ , soa::Join<aod::CascDatas, aod::McCascLabels> const & Cascades, aod::KFCascDatas const & KFCascades, aod::TraCascDatas const & TraCascades, aod::BCsWithTimestamps const & /* bcs*/ , UDCollisionsFull const & udCollisions, soa::Join<aod::McCollisions, aod::McCollsExtra, aod::MultsExtraMC> const & mcCollisions, aod::McParticles const &)
610+ void processCollisionsWithUDWithMC (soa::Join<aod::Collisions, aod::FT0Mults, aod::FV0Mults, aod::FDDMults, aod::PVMults, aod::ZDCMults, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs, aod::CentFV0As, aod::EvSels, aod::McCollisionLabels, aod::MultsExtra, aod::MultsGlobal> const & collisions, soa::Join<aod::V0Datas, aod::McV0Labels> const & V0s, soa::Join<aod::V0MCCores, aod::V0MCCollRefs> const & /* V0MCCores*/ , soa::Join<aod::CascDatas, aod::McCascLabels> const & Cascades, aod::KFCascDatas const & KFCascades, aod::TraCascDatas const & TraCascades, aod::BCsWithTimestamps const & /* bcs*/ , UDCollisionsFull const & udCollisions, soa::Join<aod::McCollisions, aod::McCollsExtra, aod::MultsExtraMC> const & mcCollisions, aod::McParticles const & mcParticles )
584611 {
585- populateMCCollisionTable (mcCollisions);
612+ populateMCCollisionTable (mcCollisions, mcParticles );
586613 populateCollisionTables (collisions, udCollisions, V0s, Cascades, KFCascades, TraCascades);
587614 }
588615
0 commit comments