Skip to content

Commit 2121de3

Browse files
ddobrigkalibuild
andauthored
Data model fix: avoid classifying TPC loopers as physical primary (#15609)
* Transparent fix proposal draft 1 * Please consider the following formatting changes * Fix whitespace * Address only the bug * Adjustments: fix bugs, tuning * Improve name of ProtectedFlags * Please consider the following formatting changes --------- Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 94e1eec commit 2121de3

2 files changed

Lines changed: 49 additions & 14 deletions

File tree

Framework/Core/include/Framework/AnalysisDataModel.h

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1984,34 +1984,52 @@ DECLARE_SOA_EXPRESSION_COLUMN(Y, y, float, //! Particle rapidity, conditionally
19841984
(aod::mcparticle::e - aod::mcparticle::pz))));
19851985
} // namespace mcparticle
19861986

1987+
namespace mcparticle_v2
1988+
{
1989+
// for improved getters with protection against incorrect physical primary tagging
1990+
// note: this has to be declared in a separate namespace so it does not conflict with existing
1991+
// derived data table declarations in O2Physics
1992+
DECLARE_SOA_DYNAMIC_COLUMN(IsPhysicalPrimary, isPhysicalPrimary, //! True if particle is considered a physical primary according to the ALICE definition
1993+
[](uint8_t input_flags, float vx, float vy) -> bool { return (o2::aod::mcparticle::Tools::removeIsPhysicalPrimaryBit(input_flags, vx, vy) & o2::aod::mcparticle::enums::PhysicalPrimary) == o2::aod::mcparticle::enums::PhysicalPrimary; });
1994+
1995+
// avoid that the stored flags are provided unprotected via
1996+
// the getter '.flags': analysers will get the correct bit map transparently
1997+
DECLARE_SOA_COLUMN(Flags, storedFlags, uint8_t); //! ALICE specific flags, see MCParticleFlags. Do not use directly. Use the dynamic columns, e.g. producedByGenerator()
1998+
DECLARE_SOA_DYNAMIC_COLUMN(ProtectedFlags, flags, //! protected against
1999+
[](uint8_t input_flags, float vx, float vy) -> uint8_t { return o2::aod::mcparticle::Tools::removeIsPhysicalPrimaryBit(input_flags, vx, vy); });
2000+
2001+
} // namespace mcparticle_v2
2002+
19872003
DECLARE_SOA_TABLE_FULL(StoredMcParticles_000, "McParticles", "AOD", "MCPARTICLE", //! MC particle table, version 000
19882004
o2::soa::Index<>, mcparticle::McCollisionId,
1989-
mcparticle::PdgCode, mcparticle::StatusCode, mcparticle::Flags,
2005+
mcparticle::PdgCode, mcparticle::StatusCode, mcparticle_v2::Flags,
19902006
mcparticle::Mother0Id, mcparticle::Mother1Id,
19912007
mcparticle::Daughter0Id, mcparticle::Daughter1Id, mcparticle::Weight,
19922008
mcparticle::Px, mcparticle::Py, mcparticle::Pz, mcparticle::E,
19932009
mcparticle::Vx, mcparticle::Vy, mcparticle::Vz, mcparticle::Vt,
19942010
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>);
2011+
mcparticle::ProducedByGenerator<mcparticle_v2::Flags>,
2012+
mcparticle::FromBackgroundEvent<mcparticle_v2::Flags>,
2013+
mcparticle::GetGenStatusCode<mcparticle_v2::Flags, mcparticle::StatusCode>,
2014+
mcparticle::GetHepMCStatusCode<mcparticle_v2::Flags, mcparticle::StatusCode>,
2015+
mcparticle::GetProcess<mcparticle_v2::Flags, mcparticle::StatusCode>,
2016+
mcparticle_v2::ProtectedFlags<mcparticle_v2::Flags, mcparticle::Vx, mcparticle::Vy>,
2017+
mcparticle_v2::IsPhysicalPrimary<mcparticle_v2::Flags, mcparticle::Vx, mcparticle::Vy>);
20012018

20022019
DECLARE_SOA_TABLE_FULL_VERSIONED(StoredMcParticles_001, "McParticles", "AOD", "MCPARTICLE", 1, //! MC particle table, version 001
20032020
o2::soa::Index<>, mcparticle::McCollisionId,
2004-
mcparticle::PdgCode, mcparticle::StatusCode, mcparticle::Flags,
2021+
mcparticle::PdgCode, mcparticle::StatusCode, mcparticle_v2::Flags,
20052022
mcparticle::MothersIds, mcparticle::DaughtersIdSlice, mcparticle::Weight,
20062023
mcparticle::Px, mcparticle::Py, mcparticle::Pz, mcparticle::E,
20072024
mcparticle::Vx, mcparticle::Vy, mcparticle::Vz, mcparticle::Vt,
20082025
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>);
2026+
mcparticle::ProducedByGenerator<mcparticle_v2::Flags>,
2027+
mcparticle::FromBackgroundEvent<mcparticle_v2::Flags>,
2028+
mcparticle::GetGenStatusCode<mcparticle_v2::Flags, mcparticle::StatusCode>,
2029+
mcparticle::GetHepMCStatusCode<mcparticle_v2::Flags, mcparticle::StatusCode>,
2030+
mcparticle::GetProcess<mcparticle_v2::Flags, mcparticle::StatusCode>,
2031+
mcparticle_v2::ProtectedFlags<mcparticle_v2::Flags, mcparticle::Vx, mcparticle::Vy>,
2032+
mcparticle_v2::IsPhysicalPrimary<mcparticle_v2::Flags, mcparticle::Vx, mcparticle::Vy>);
20152033

20162034
DECLARE_SOA_EXTENDED_TABLE(McParticles_000, StoredMcParticles_000, "EXMCPARTICLE", 0, //! Basic MC particle properties
20172035
mcparticle::Phi,

Framework/Core/include/Framework/DataTypes.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "CommonConstants/LHCConstants.h"
1515

16+
#include <cmath>
1617
#include <cstdint>
1718
#include <limits>
1819
#include <array>
@@ -158,6 +159,22 @@ enum MCParticleFlags : uint8_t {
158159
};
159160
} // namespace o2::aod::mcparticle::enums
160161

162+
namespace o2::aod::mcparticle
163+
{
164+
constexpr float maxRadiusForPhysicalPrimary{5.f};
165+
166+
struct Tools {
167+
// trivial helper to remove Physical Primary bit
168+
static uint8_t removeIsPhysicalPrimaryBit(uint8_t input_flags, float vx, float vy)
169+
{
170+
if ((std::hypot(vx, vy) > o2::aod::mcparticle::maxRadiusForPhysicalPrimary) && ((input_flags & o2::aod::mcparticle::enums::PhysicalPrimary) == o2::aod::mcparticle::enums::PhysicalPrimary)) {
171+
input_flags = input_flags & ~enums::PhysicalPrimary; // remove physical primary bit, keep others
172+
}
173+
return input_flags;
174+
}
175+
};
176+
} // namespace o2::aod::mcparticle
177+
161178
namespace o2::aod::run2
162179
{
163180
enum Run2EventSelectionCut {

0 commit comments

Comments
 (0)