ATLAS Offline Software
EgammaHelpers.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 
8 #ifndef COLUMNAR_EGAMMA_EGAMMA_HELPERS_H
9 #define COLUMNAR_EGAMMA_EGAMMA_HELPERS_H
10 
15 
16 namespace columnar
17 {
18  namespace EgammaHelpers
19  {
26 
27 
28 
29  template<ContainerIdConcept CI = ContainerId::egamma,typename CM=ColumnarModeDefault>
31  {
34 
35  public:
36 
37  EnergyAccessor (ColumnarTool<CM>& columnarTool) : m_ptAcc (columnarTool, "pt"), m_etaAcc (columnarTool, "eta") {}
38 
39  float operator () (ObjectId<CI,CM> object) const
40  {
41  return m_ptAcc(object) * std::cosh(m_etaAcc(object));
42  }
43  };
44 
45 
46 
47  // not sure if this should live here, since it draws in a dependency
48  // on ColumnarTracking/xAODTracking, but let's keep it here for now
49  template<ContainerIdConcept CI = ContainerId::egamma,typename CM=ColumnarModeDefault>
51  {
58 
59  public:
61  : m_etaAcc (columnarTool, "eta"),
62  m_vertexLinksAcc (columnarTool, "vertexLinks"),
63  m_trackParticleLinksAcc (columnarTool, "trackParticleLinks", {.isOptional = true}),
64  m_numberOfPixelHitsAcc (columnarTool, "numberOfPixelHits"),
65  m_numberOfSCTHitsAcc (columnarTool, "numberOfSCTHits")
66  {
67  if constexpr (!CM::isXAOD)
68  resetAccessor (m_objectTypeAcc, columnarTool, "objectType", {.isOptional = true});
69  }
70 
78  std::pair<bool,unsigned> operator () (ObjectId<CI,CM> photon, bool excludeTRT) const
79  {
80  // While the accessor is generally meant to be used with
81  // photons, sometimes electrons are passed as photons for
82  // performance studies, etc. In xAOD mode we can just check
83  // `IParticle::type()`, while in columnar mode we need the user
84  // to pass that in as an extra column. Having an extra column
85  // for that feels like a bit of an overkill, but it is optional
86  // here, and we can revisit it later if it becomes an issue.
88  if constexpr (CM::isXAOD)
89  {
90  type = photon.getXAODObjectNoexcept().type();
91  } else
92  {
93  if (m_objectTypeAcc.isAvailable(photon))
95  }
96  if (type != xAOD::Type::Photon)
97  return std::make_pair (false, 0x0);
98 
99  const auto vertices = m_vertexLinksAcc(photon);
100  if (vertices.size() == 0) return std::make_pair (false, 0x0);
101  if (!vertices[0].has_value())
102  return std::make_pair (false, 0x1);
103 
104  unsigned missingLinks = 0x0;
105 
106  auto vertex = vertices[0].value();
107  bool hasTrk1 = false;
108  bool hasTrk2 = false;
109  std::uint8_t nSiHits1 = 0;
110  std::uint8_t nSiHits2 = 0;
111  if (m_trackParticleLinksAcc.isAvailable(vertex)) {
112  const auto tracks = m_trackParticleLinksAcc(vertex);
113  if (tracks.size() > 0) {
114  if (tracks[0].has_value()) {
115  hasTrk1 = true;
116  nSiHits1 += m_numberOfPixelHitsAcc(tracks[0].value());
117  nSiHits1 += m_numberOfSCTHitsAcc(tracks[0].value());
118  } else missingLinks |= 0x2;
119  }
120  if (tracks.size() > 1) {
121  if (tracks[1].has_value()) {
122  hasTrk2 = true;
123  nSiHits2 += m_numberOfPixelHitsAcc(tracks[1].value());
124  nSiHits2 += m_numberOfSCTHitsAcc(tracks[1].value());
125  } else missingLinks |= 0x4;
126  }
127  }
128 
129  auto conversionType = xAOD::EgammaDetails::conversionType(hasTrk1, hasTrk2, nSiHits1, nSiHits2);
130  return std::make_pair (xAOD::EgammaDetails::isConvertedPhoton (excludeTRT, photon(m_etaAcc), vertices.size(), conversionType), missingLinks);
131  }
132  };
133  }
134 }
135 
136 #endif
columnar::EgammaHelpers::IsConvertedPhotonAccessor::m_trackParticleLinksAcc
VertexAccessor< std::vector< OptObjectId< ContainerId::track, CM > >, CM > m_trackParticleLinksAcc
Definition: EgammaHelpers.h:54
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:215
columnar::EgammaHelpers::EnergyAccessor
Definition: EgammaHelpers.h:31
columnar::EgammaHelpers::EnergyAccessor::m_etaAcc
ColumnAccessor< CI, float, CM > m_etaAcc
Definition: EgammaHelpers.h:33
columnar::EgammaHelpers::IsConvertedPhotonAccessor::IsConvertedPhotonAccessor
IsConvertedPhotonAccessor(ColumnarTool< CM > &columnarTool)
Definition: EgammaHelpers.h:60
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:558
ObjectType
ObjectType
Definition: BaseObject.h:11
TrackDef.h
athena.value
value
Definition: athena.py:124
xAOD::EgammaDetails::isConvertedPhoton
bool isConvertedPhoton(const bool excludeTRT, const float eta, const std::size_t nVertices, const ConversionType conversionType)
is the object a converted photon
Definition: EgammaDetails.h:59
columnar::EgammaHelpers::EnergyAccessor::operator()
float operator()(ObjectId< CI, CM > object) const
Definition: EgammaHelpers.h:39
EgammaDef.h
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
xAOD::EgammaDetails::conversionType
ConversionType conversionType(const bool hasTrk1, const bool hasTrk2, const std::uint8_t nSiHits1, const std::uint8_t nSiHits2)
return the photon conversion type (see EgammaEnums)
Definition: EgammaDetails.h:40
columnar::ColumnarModeXAOD::isXAOD
static constexpr bool isXAOD
Whether this is the xAOD mode.
Definition: ColumnarDef.h:20
columnar::EgammaHelpers::IsConvertedPhotonAccessor::m_etaAcc
ColumnAccessor< CI, float, CM > m_etaAcc
Definition: EgammaHelpers.h:52
ColumnAccessor.h
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::EgammaHelpers::IsConvertedPhotonAccessor::m_numberOfSCTHitsAcc
TrackAccessor< std::uint8_t, CM > m_numberOfSCTHitsAcc
Definition: EgammaHelpers.h:56
columnar::EgammaHelpers::IsConvertedPhotonAccessor
Definition: EgammaHelpers.h:51
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ContainerId.h:178
columnar::EgammaHelpers::EnergyAccessor::m_ptAcc
ColumnAccessor< CI, float, CM > m_ptAcc
Definition: EgammaHelpers.h:32
xAOD::Photon
Photon_v1 Photon
Definition of the current "egamma version".
Definition: Event/xAOD/xAODEgamma/xAODEgamma/Photon.h:17
columnar::EgammaHelpers::IsConvertedPhotonAccessor::operator()
std::pair< bool, unsigned > operator()(ObjectId< CI, CM > photon, bool excludeTRT) const
return whether the photon is converted, and a bitmask of missing links
Definition: EgammaHelpers.h:78
Trk::vertex
@ vertex
Definition: MeasurementType.h:21
xAOD::photon
@ photon
Definition: TrackingPrimitives.h:200
columnar
Definition: ClusterDef.h:16
columnar::EgammaHelpers::EnergyAccessor::EnergyAccessor
EnergyAccessor(ColumnarTool< CM > &columnarTool)
Definition: EgammaHelpers.h:37
columnar::ColumnarTool
the base class for all columnar components
Definition: ColumnAccessorDataArray.h:17
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:18
columnar::AccessorTemplate
the raw column accessor template class
Definition: ColumnAccessor.h:81
columnar::EgammaHelpers::IsConvertedPhotonAccessor::m_objectTypeAcc
ColumnAccessor< CI, RetypeColumn< xAOD::Type::ObjectType, std::uint16_t >, CM > m_objectTypeAcc
Definition: EgammaHelpers.h:57
columnar::resetAccessor
void resetAccessor(AccessorTemplate< CI, CT, CAM, CM > &accessor, ColumnarTool< CM > &columnBase, const std::string &name, ColumnInfo &&info={})
reset a column accessor to point to a new column
Definition: ColumnAccessor.h:210
columnar::EgammaHelpers::IsConvertedPhotonAccessor::m_vertexLinksAcc
ColumnAccessor< CI, std::vector< OptObjectId< ContainerId::vertex, CM > >, CM > m_vertexLinksAcc
Definition: EgammaHelpers.h:53
columnar::EgammaHelpers::IsConvertedPhotonAccessor::m_numberOfPixelHitsAcc
TrackAccessor< std::uint8_t, CM > m_numberOfPixelHitsAcc
Definition: EgammaHelpers.h:55
EgammaDetails.h