@@ -437,6 +437,9 @@ struct FilterCF {
437437 template <class T >
438438 using HasMultTables = decltype (std::declval<T&>().multNTracksPV());
439439
440+ template <class T >
441+ using HasNMPI = decltype (std::declval<T&>().nMPI());
442+
440443 // / \brief Templetized process data for a given collision and its associated tracks
441444 // / \param collision The collision object containing information about the collision
442445 // / \param tracks The collection of tracks associated with the collision
@@ -634,7 +637,9 @@ struct FilterCF {
634637 }
635638 }
636639 outputMcCollisions (mcCollision.posZ (), multiplicity);
637- outputMcCollisionExtras (mcCollision.nMPI ());
640+ if constexpr (std::experimental::is_detected<HasNMPI, typename MCs::iterator>::value) {
641+ outputMcCollisionExtras (mcCollision.nMPI ());
642+ }
638643 }
639644
640645 // PASS 2 on collisions: store collisions and tracks
@@ -707,7 +712,7 @@ struct FilterCF {
707712 Preslice<aod::McParticles> perMcCollision = aod::mcparticle::mcCollisionId;
708713 Preslice<aod::Tracks> perCollision = aod::track::collisionId;
709714 using McCollisionsWithHepMC = soa::Join<aod::McCollisions, aod::HepMCXSections>;
710- void processMC (McCollisionsWithHepMC const & mcCollisions, aod::McParticles const & allParticles,
715+ void processMC (aod::McCollisions const & mcCollisions, aod::McParticles const & allParticles,
711716 soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSels, aod::CFMultiplicities> const & allCollisions,
712717 soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::McTrackLabels, aod::TrackSelection>> const & tracks,
713718 aod::BCsWithTimestamps const & bcs)
@@ -716,8 +721,17 @@ struct FilterCF {
716721 }
717722 PROCESS_SWITCH (FilterCF, processMC, " Process MC" , false );
718723
724+ void processMCWithHepMC (McCollisionsWithHepMC const & mcCollisions, aod::McParticles const & allParticles,
725+ soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSels, aod::CFMultiplicities> const & allCollisions,
726+ soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::McTrackLabels, aod::TrackSelection>> const & tracks,
727+ aod::BCsWithTimestamps const & bcs)
728+ {
729+ processMCT (mcCollisions, allParticles, allCollisions, tracks, bcs);
730+ }
731+ PROCESS_SWITCH (FilterCF, processMCWithHepMC, " Process MC with HepMC cross-section (nMPI)" , false );
732+
719733 // NOTE not filtering collisions here because in that case there can be tracks referring to MC particles which are not part of the selected MC collisions
720- void processMCPid (McCollisionsWithHepMC const & mcCollisions, aod::McParticles const & allParticles,
734+ void processMCPid (aod::McCollisions const & mcCollisions, aod::McParticles const & allParticles,
721735 soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSels, aod::CFMultiplicities> const & allCollisions,
722736 soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::McTrackLabels, aod::TrackSelection, aod::pidTPCPr, aod::pidTOFPr, aod::TracksDCA>> const & tracks,
723737 aod::BCsWithTimestamps const & bcs)
@@ -726,7 +740,16 @@ struct FilterCF {
726740 }
727741 PROCESS_SWITCH (FilterCF, processMCPid, " Process MC with PID" , false );
728742
729- void processMCMults (McCollisionsWithHepMC const & mcCollisions, aod::McParticles const & allParticles,
743+ void processMCPidWithHepMC (McCollisionsWithHepMC const & mcCollisions, aod::McParticles const & allParticles,
744+ soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSels, aod::CFMultiplicities> const & allCollisions,
745+ soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::McTrackLabels, aod::TrackSelection, aod::pidTPCPr, aod::pidTOFPr, aod::TracksDCA>> const & tracks,
746+ aod::BCsWithTimestamps const & bcs)
747+ {
748+ processMCT (mcCollisions, allParticles, allCollisions, tracks, bcs);
749+ }
750+ PROCESS_SWITCH (FilterCF, processMCPidWithHepMC, " Process MC with PID and HepMC cross-section (nMPI)" , false );
751+
752+ void processMCMults (aod::McCollisions const & mcCollisions, aod::McParticles const & allParticles,
730753 soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSels, aod::CFMultiplicities, aod::CentFT0Cs, aod::PVMults, aod::FV0Mults, aod::MultsGlobal> const & allCollisions,
731754 soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::McTrackLabels, aod::TrackSelection>> const & tracks,
732755 aod::BCsWithTimestamps const & bcs)
@@ -736,7 +759,18 @@ struct FilterCF {
736759
737760 PROCESS_SWITCH (FilterCF, processMCMults, " Process MC with multiplicity sets" , false );
738761
739- void processMCGen (McCollisionsWithHepMC::iterator const & mcCollision, aod::McParticles const & particles)
762+ void processMCMultsWithHepMC (McCollisionsWithHepMC const & mcCollisions, aod::McParticles const & allParticles,
763+ soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSels, aod::CFMultiplicities, aod::CentFT0Cs, aod::PVMults, aod::FV0Mults, aod::MultsGlobal> const & allCollisions,
764+ soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::McTrackLabels, aod::TrackSelection>> const & tracks,
765+ aod::BCsWithTimestamps const & bcs)
766+ {
767+ processMCT (mcCollisions, allParticles, allCollisions, tracks, bcs);
768+ }
769+ PROCESS_SWITCH (FilterCF, processMCMultsWithHepMC, " Process MC with multiplicity sets and HepMC cross-section (nMPI)" , false );
770+
771+ // / \brief Templated MCGen processing; stores nMPI only when the MC collision carries the HepMC cross-section table
772+ template <typename TMC >
773+ void processMCGenT (const TMC & mcCollision, aod::McParticles const & particles)
740774 {
741775 float multiplicity = 0 .0f ;
742776 for (const auto & particle : particles) {
@@ -756,9 +790,22 @@ struct FilterCF {
756790 sign, particle.pdgCode (), particle.flags ());
757791 }
758792 outputMcCollisions (mcCollision.posZ (), multiplicity);
759- outputMcCollisionExtras (mcCollision.nMPI ());
793+ if constexpr (std::experimental::is_detected<HasNMPI, TMC >::value) {
794+ outputMcCollisionExtras (mcCollision.nMPI ());
795+ }
796+ }
797+
798+ void processMCGen (aod::McCollisions::iterator const & mcCollision, aod::McParticles const & particles)
799+ {
800+ processMCGenT (mcCollision, particles);
760801 }
761802 PROCESS_SWITCH (FilterCF, processMCGen, " Process MCGen" , false );
803+
804+ void processMCGenWithHepMC (McCollisionsWithHepMC::iterator const & mcCollision, aod::McParticles const & particles)
805+ {
806+ processMCGenT (mcCollision, particles);
807+ }
808+ PROCESS_SWITCH (FilterCF, processMCGenWithHepMC, " Process MCGen with HepMC cross-section (nMPI)" , false );
762809};
763810
764811struct MultiplicitySelector {
0 commit comments