@@ -1918,6 +1918,8 @@ DECLARE_SOA_TABLE_VERSIONED(McCollisions_001, "AOD", "MCCOLLISION", 1, //! MC co
19181918using McCollisions = McCollisions_001;
19191919using McCollision = McCollisions::iterator;
19201920
1921+
1922+
19211923namespace mcparticle
19221924{
19231925DECLARE_SOA_INDEX_COLUMN (McCollision, mcCollision); // ! MC collision of this particle
@@ -1984,34 +1986,56 @@ DECLARE_SOA_EXPRESSION_COLUMN(Y, y, float, //! Particle rapidity, conditionally
19841986 (aod::mcparticle::e - aod::mcparticle::pz))));
19851987} // namespace mcparticle
19861988
1989+ namespace mcparticle_v2
1990+ {
1991+ // for improved getters with protection against incorrect physical primary tagging
1992+ // note: this has to be declared in a separate namespace so it does not conflict with existing
1993+ // derived data table declarations in O2Physics
1994+ DECLARE_SOA_DYNAMIC_COLUMN (IsPhysicalPrimary, isPhysicalPrimary, // ! True if particle is considered a physical primary according to the ALICE definition
1995+ [](uint8_t flags, float vx, float vy) -> bool {
1996+ if (std::hypot (vx, vy) > o2::aod::mcparticle::maxRadiusForPhysicalPrimary) return o2::aod::mcparticle::enums::FromBackgroundEvent;
1997+ return (flags & o2::aod::mcparticle::enums::PhysicalPrimary) == o2::aod::mcparticle::enums::PhysicalPrimary; });
1998+
1999+ // avoid that the stored flags are provided unprotected via
2000+ // the getter '.flags': analysers will get the correct bit map transparently
2001+ DECLARE_SOA_COLUMN (Flags, storedFlags, uint8_t ); // ! ALICE specific flags, see MCParticleFlags. Do not use directly. Use the dynamic columns, e.g. producedByGenerator()
2002+ DECLARE_SOA_DYNAMIC_COLUMN (McParticleFlags, flags, // ! protected against
2003+ [](uint8_t input_flags, float vx, float vy) -> uint8_t {
2004+ if (std::hypot (vx, vy) > o2::aod::mcparticle::maxRadiusForPhysicalPrimary) return o2::aod::mcparticle::enums::FromBackgroundEvent;
2005+ return input_flags; });
2006+
2007+ }
2008+
19872009DECLARE_SOA_TABLE_FULL (StoredMcParticles_000, " McParticles" , " AOD" , " MCPARTICLE" , // ! MC particle table, version 000
19882010 o2::soa::Index<>, mcparticle::McCollisionId,
1989- mcparticle::PdgCode, mcparticle::StatusCode, mcparticle ::Flags,
2011+ mcparticle::PdgCode, mcparticle::StatusCode, mcparticle_v2 ::Flags,
19902012 mcparticle::Mother0Id, mcparticle::Mother1Id,
19912013 mcparticle::Daughter0Id, mcparticle::Daughter1Id, mcparticle::Weight,
19922014 mcparticle::Px, mcparticle::Py, mcparticle::Pz, mcparticle::E,
19932015 mcparticle::Vx, mcparticle::Vy, mcparticle::Vz, mcparticle::Vt,
19942016 mcparticle::PVector<mcparticle::Px, mcparticle::Py, mcparticle::Pz>,
1995- mcparticle::ProducedByGenerator<mcparticle::Flags>,
1996- mcparticle::FromBackgroundEvent<mcparticle::Flags>,
1997- mcparticle::GetGenStatusCode<mcparticle::Flags, mcparticle::StatusCode>,
1998- mcparticle::GetHepMCStatusCode<mcparticle::Flags, mcparticle::StatusCode>,
1999- mcparticle::GetProcess<mcparticle::Flags, mcparticle::StatusCode>,
2000- mcparticle::IsPhysicalPrimary<mcparticle::Flags>);
2017+ mcparticle::ProducedByGenerator<mcparticle_v2::Flags>,
2018+ mcparticle::FromBackgroundEvent<mcparticle_v2::Flags>,
2019+ mcparticle::GetGenStatusCode<mcparticle_v2::Flags, mcparticle::StatusCode>,
2020+ mcparticle::GetHepMCStatusCode<mcparticle_v2::Flags, mcparticle::StatusCode>,
2021+ mcparticle::GetProcess<mcparticle_v2::Flags, mcparticle::StatusCode>,
2022+ mcparticle_v2::McParticleFlags<mcparticle_v2::Flags, mcparticle::Vx, mcparticle::Vy>,
2023+ mcparticle_v2::IsPhysicalPrimary<mcparticle_v2::Flags, mcparticle::Vx, mcparticle::Vy>);
20012024
20022025DECLARE_SOA_TABLE_FULL_VERSIONED (StoredMcParticles_001, " McParticles" , " AOD" , " MCPARTICLE" , 1 , // ! MC particle table, version 001
20032026 o2::soa::Index<>, mcparticle::McCollisionId,
2004- mcparticle::PdgCode, mcparticle::StatusCode, mcparticle ::Flags,
2027+ mcparticle::PdgCode, mcparticle::StatusCode, mcparticle_v2 ::Flags,
20052028 mcparticle::MothersIds, mcparticle::DaughtersIdSlice, mcparticle::Weight,
20062029 mcparticle::Px, mcparticle::Py, mcparticle::Pz, mcparticle::E,
20072030 mcparticle::Vx, mcparticle::Vy, mcparticle::Vz, mcparticle::Vt,
20082031 mcparticle::PVector<mcparticle::Px, mcparticle::Py, mcparticle::Pz>,
2009- mcparticle::ProducedByGenerator<mcparticle::Flags>,
2010- mcparticle::FromBackgroundEvent<mcparticle::Flags>,
2011- mcparticle::GetGenStatusCode<mcparticle::Flags, mcparticle::StatusCode>,
2012- mcparticle::GetHepMCStatusCode<mcparticle::Flags, mcparticle::StatusCode>,
2013- mcparticle::GetProcess<mcparticle::Flags, mcparticle::StatusCode>,
2014- mcparticle::IsPhysicalPrimary<mcparticle::Flags>);
2032+ mcparticle::ProducedByGenerator<mcparticle_v2::Flags>,
2033+ mcparticle::FromBackgroundEvent<mcparticle_v2::Flags>,
2034+ mcparticle::GetGenStatusCode<mcparticle_v2::Flags, mcparticle::StatusCode>,
2035+ mcparticle::GetHepMCStatusCode<mcparticle_v2::Flags, mcparticle::StatusCode>,
2036+ mcparticle::GetProcess<mcparticle_v2::Flags, mcparticle::StatusCode>,
2037+ mcparticle_v2::McParticleFlags<mcparticle_v2::Flags, mcparticle::Vx, mcparticle::Vy>,
2038+ mcparticle_v2::IsPhysicalPrimary<mcparticle_v2::Flags, mcparticle::Vx, mcparticle::Vy>);
20152039
20162040DECLARE_SOA_EXTENDED_TABLE (McParticles_000, StoredMcParticles_000, " EXMCPARTICLE" , 0 , // ! Basic MC particle properties
20172041 mcparticle::Phi,
0 commit comments