ATLAS Offline Software
MetInput.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_MET_MET_INPUT_H
9 #define COLUMNAR_MET_MET_INPUT_H
10 
14 #include <ColumnarMet/MetDef.h>
16 
17 namespace columnar
18 {
19  namespace MetHelpers
20  {
30 
31  template<ContainerIdConcept CI = ContainerId::particle,typename CM=ColumnarModeDefault>
33  {
35  : pt (columnarBase, "pt"),
36  eta (columnarBase, "eta"),
37  phi (columnarBase, "phi"),
38  m (columnarBase, "m")
39  {}
40 
41  InputMomentumAccessors (ColumnarTool<CM>& columnarBase, const std::string& prefix)
42  : pt (columnarBase, prefix + "_pt"),
43  eta (columnarBase, prefix + "_eta"),
44  phi (columnarBase, prefix + "_phi"),
45  m (columnarBase, prefix + "_m")
46  {}
47 
52 
53  // IMPORTANT: These have to return float, not double, to match
54  // the xAOD interface. The internal calculations are done in
55  // double, and the caller immediately converts it back to double,
56  // but converting it to float here introduces a very tiny
57  // truncation error that we need to match the xAOD implementation.
58  [[nodiscard]] float px (ObjectId<CI,CM> object) const {
59  return pt(object) * std::cos(phi(object));}
60  [[nodiscard]] float py (ObjectId<CI,CM> object) const {
61  return pt(object) * std::sin(phi(object));}
62 
64  {
65  return xAOD::JetFourMom_t(pt(jet),eta(jet),phi(jet),m(jet));
66  }
67  };
68 
69 
70 
71  template<ContainerIdConcept CI = ContainerId::particle,typename CM = ColumnarModeDefault> class OriginalObjectHandle;
72  template<ContainerIdConcept CI,typename CM> OriginalObjectHandle (const asg::AsgTool&,ObjectRange<CI,CM>) -> OriginalObjectHandle<CI,CM>;
73 
74  template<ContainerIdConcept CI> class OriginalObjectHandle<CI,ColumnarModeXAOD> final
75  {
76  bool m_originalInputs = false;
77  bool m_isShallowCopy = false;
78 
79  public:
80 
82 
84  {
85  if (!container.empty())
86  {
87  using namespace MetDef;
88  m_originalInputs = !acc_originalObject.isAvailable(*container.getXAODObject().front());
89  m_isShallowCopy = dynamic_cast<const xAOD::ShallowAuxContainer*>(container.getXAODObject().front()->container()->getConstStore());
90  if (tool.msgLvl(MSG::VERBOSE))
91  {
92  tool.msg(MSG::VERBOSE) << "const store = " << container.getXAODObject().front()->container()->getConstStore() << endmsg;
93  }
94  }
95  }
96 
97  [[nodiscard]] bool originalInputs () const {
98  return m_originalInputs;
99  }
100 
101  [[nodiscard]] bool isShallowCopy () const {
102  return m_isShallowCopy;
103  }
104 
105  [[nodiscard]] ObjectId<CI,CM> getOriginal (const ObjectId<CI,CM>& id) const
106  {
107  if (m_originalInputs)
108  {
109  return id;
110  } else
111  {
112  using namespace MetDef;
113  auto *originalObject = *acc_originalObject(id.getXAODObject());
114  if (!originalObject)
115  throw std::runtime_error ("originalObjectLink not available for MET input");
116  return ObjectId<CI,CM> (dynamic_cast<typename CI::xAODObjectIdType&>(*originalObject));
117  }
118  }
119 
121  {
122  using namespace MetDef;
123  if (acc_nominalObject.isAvailable(jet.getXAODObject())) {
124  auto nominal = acc_nominalObject(jet.getXAODObject());
125  if (nominal && *nominal)
126  {
127  return ObjectId<CI,CM> {static_cast<CI::xAODObjectIdType&>(**nominal)};
128  }
129  }
130  std::ostringstream message;
131  message << "No nominal calibrated jet available for jet " << jet << ". Cannot simplify overlap removal!";
132  throw std::runtime_error (message.str());
133  }
134  };
135 
136  template<ContainerIdConcept CI> class OriginalObjectHandle<CI,ColumnarModeArray> final
137  {
138  public:
139 
141 
142  explicit OriginalObjectHandle (const asg::AsgTool& /*tool*/, ObjectRange<CI,CM> /*container*/)
143  {};
144 
145  [[nodiscard]] bool originalInputs () const {
146  return true;
147  }
148 
149  [[nodiscard]] bool isShallowCopy () const {
150  return false;
151  }
152 
153  [[nodiscard]] ObjectId<CI,CM> getOriginal (const ObjectId<CI,CM>& id) const
154  {
155  return id;
156  }
157 
159  {
160  throw std::runtime_error ("no nominal object available in columnar mode");
161  }
162  };
163 
164 
165 
168  template<ContainerIdConcept CI,typename CM=ColumnarModeDefault>
170 
171  template<ContainerIdConcept CI>
173  {
175 
176  ObjectTypeAccessor (ColumnarTool<CM>& /*columnBase*/, const std::string& /*columnName*/) {}
177 
179  {
180  return object.getXAODObject().type();
181  }
182 
183  [[nodiscard]] std::optional<xAODType::ObjectType> operator() (ObjectRange<CI,CM> container) const
184  {
185  if (container.empty())
186  return std::nullopt;
187  return container.getXAODObject().front()->type();
188  }
189  };
190 
191  template<ContainerIdConcept CI>
193  {
195 
196  // FIX ME: ideally this should rely on a global column with a
197  // single type, not a type per object, but that functionality
198  // doesn't currently (13 Jan 25) exist.
200 
201  ObjectTypeAccessor (ColumnarTool<CM>& columnBase, const std::string& columnName)
202  : typeAcc (columnBase, columnName) {}
203 
205  {
206  return typeAcc(object);
207  }
208 
209  [[nodiscard]] std::optional<xAODType::ObjectType> operator() (ObjectRange<CI,CM> container) const
210  {
211  // Technically we may be able to return a type here, but for
212  // consistency with the xAOD mode we return nullopt if the
213  // container is empty.
214  if (container.empty())
215  return std::nullopt;
216  return typeAcc(container[0]);
217  }
218  };
219  }
220 }
221 
222 #endif
columnar::MetHelpers::OriginalObjectHandle
OriginalObjectHandle(const asg::AsgTool &, ObjectRange< CI, CM >) -> OriginalObjectHandle< CI, CM >
asg::AsgTool
Base class for the dual-use tool implementation classes.
Definition: AsgTool.h:47
columnar::MetHelpers::OriginalObjectHandle< CI, ColumnarModeXAOD >::getNominalObject
ObjectId< CI, CM > getNominalObject(const ObjectId< CI, CM > &jet) const
Definition: MetInput.h:120
columnar::MetHelpers::InputMomentumAccessors
a class that provides all the accessors needed to access object momentum variables
Definition: MetInput.h:33
columnar::MetHelpers::OriginalObjectHandle
Definition: MetInput.h:71
columnar::MetHelpers::OriginalObjectHandle< CI, ColumnarModeArray >::getOriginal
ObjectId< CI, CM > getOriginal(const ObjectId< CI, CM > &id) const
Definition: MetInput.h:153
columnar::getXAODObject
xAODContainer & getXAODObject() const noexcept
Definition: ObjectRange.h:147
columnar::MetHelpers::OriginalObjectHandle< CI, ColumnarModeArray >::originalInputs
bool originalInputs() const
Definition: MetInput.h:145
xAOD::ShallowAuxContainer
Class creating a shallow copy of an existing auxiliary container.
Definition: ShallowAuxContainer.h:54
columnar::MetHelpers::InputMomentumAccessors::px
float px(ObjectId< CI, CM > object) const
Definition: MetInput.h:58
columnar::MetHelpers::OriginalObjectHandle< CI, ColumnarModeXAOD >::isShallowCopy
bool isShallowCopy() const
Definition: MetInput.h:101
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
ShallowAuxContainer.h
columnar::MetHelpers::InputMomentumAccessors::jetP4
xAOD::JetFourMom_t jetP4(ObjectId< CI, CM > jet) const
Definition: MetInput.h:63
columnar::MetHelpers::ObjectTypeAccessor< CI, ColumnarModeXAOD >::ObjectTypeAccessor
ObjectTypeAccessor(ColumnarTool< CM > &, const std::string &)
Definition: MetInput.h:176
columnar::MetHelpers::InputMomentumAccessors::phi
ColumnAccessor< CI, RetypeColumn< double, float >, CM > phi
Definition: MetInput.h:50
columnar::ObjectRange
a class representing a continuous sequence of objects (a.k.a. a container)
Definition: ContainerId.h:175
CI
std::map< std::string, HypoJetVector >::const_iterator CI
Definition: xAODJetCollector.h:18
ReweightUtils.message
message
Definition: ReweightUtils.py:15
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
columnar::MetHelpers::OriginalObjectHandle< CI, ColumnarModeArray >::getNominalObject
ObjectId< CI, CM > getNominalObject(const ObjectId< CI, CM > &) const
Definition: MetInput.h:158
ColumnAccessor.h
columnar::MetHelpers::OriginalObjectHandle< CI, ColumnarModeXAOD >::OriginalObjectHandle
OriginalObjectHandle(const asg::AsgTool &tool, ObjectRange< CI, CM > container)
Definition: MetInput.h:83
checkCorrelInHIST.prefix
dictionary prefix
Definition: checkCorrelInHIST.py:391
columnar::MetHelpers::OriginalObjectHandle< CI, ColumnarModeArray >::OriginalObjectHandle
OriginalObjectHandle(const asg::AsgTool &, ObjectRange< CI, CM >)
Definition: MetInput.h:142
columnar::MetHelpers::InputMomentumAccessors::InputMomentumAccessors
InputMomentumAccessors(ColumnarTool< CM > &columnarBase, const std::string &prefix)
Definition: MetInput.h:41
columnar::MetHelpers::OriginalObjectHandle< CI, ColumnarModeXAOD >::originalInputs
bool originalInputs() const
Definition: MetInput.h:97
columnar::final
CM final
Definition: ColumnAccessor.h:106
xAOD::JetFourMom_t
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< double > > JetFourMom_t
Base 4 Momentum type for Jet.
Definition: JetTypes.h:17
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ContainerId.h:176
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:239
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:452
python.Dumpers.typename
def typename(t)
Definition: Dumpers.py:193
columnar::ColumnarModeArray
Definition: ColumnarDef.h:30
columnar::MetHelpers::InputMomentumAccessors::m
ColumnAccessor< CI, RetypeColumn< double, float >, CM > m
Definition: MetInput.h:51
columnar::MetHelpers::InputMomentumAccessors::eta
ColumnAccessor< CI, RetypeColumn< double, float >, CM > eta
Definition: MetInput.h:49
columnar
Definition: ClusterDef.h:16
ContainerId.h
columnar::ColumnarTool
the base class for all columnar components
Definition: ColumnAccessorDataArray.h:17
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:15
columnar::MetHelpers::OriginalObjectHandle< CI, ColumnarModeArray >::isShallowCopy
bool isShallowCopy() const
Definition: MetInput.h:149
columnar::MetHelpers::OriginalObjectHandle< CI, ColumnarModeXAOD >::getOriginal
ObjectId< CI, CM > getOriginal(const ObjectId< CI, CM > &id) const
Definition: MetInput.h:105
columnar::MetHelpers::InputMomentumAccessors::InputMomentumAccessors
InputMomentumAccessors(ColumnarTool< CM > &columnarBase)
Definition: MetInput.h:34
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:13
columnar::AccessorTemplate
the raw column accessor template class
Definition: ColumnAccessor.h:81
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
columnar::MetHelpers::InputMomentumAccessors::py
float py(ObjectId< CI, CM > object) const
Definition: MetInput.h:60
xAODType::ObjectType
ObjectType
Type of objects that have a representation in the xAOD EDM.
Definition: ObjectType.h:32
columnar::MetHelpers::InputMomentumAccessors::pt
ColumnAccessor< CI, RetypeColumn< double, float >, CM > pt
Definition: MetInput.h:48
columnar::operator()
decltype(auto) operator()(ObjectId< CI, CM > id) const noexcept
Definition: ColumnAccessor.h:173
columnar::MetHelpers::ObjectTypeAccessor< CI, ColumnarModeArray >::typeAcc
ColumnAccessor< CI, RetypeColumn< xAODType::ObjectType, std::uint16_t >, CM > typeAcc
Definition: MetInput.h:199
ParticleDef.h
columnar::MetHelpers::ObjectTypeAccessor
an accessor that allows to access the xAOD object type of an input object
Definition: MetInput.h:169
columnar::MetHelpers::ObjectTypeAccessor< CI, ColumnarModeArray >::ObjectTypeAccessor
ObjectTypeAccessor(ColumnarTool< CM > &columnBase, const std::string &columnName)
Definition: MetInput.h:201
MetDef.h