ATLAS Offline Software
MVAInputEvaluator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include "AthLinks/ElementLink.h"
8 
11 #include "xAODTracking/Vertex.h"
12 
13 #include <cmath>
14 #include <stdexcept>
15 #include <vector>
16 
17 // Private
18 namespace {
19 
20 using MiniEvaluator = CP::MVAInputEvaluator::MiniEvaluator;
21 
22 class Pt final : public MiniEvaluator {
23 public:
24  Pt() = default;
25  ~Pt() override final = default;
26  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
27  return trk.pt();
28  }
29 };
30 
31 class Eta final: public MiniEvaluator {
32 public:
33  Eta() = default;
34  ~Eta() override final = default;
35  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
36  return trk.eta();
37  }
38 };
39 
40 class M final: public MiniEvaluator {
41 public:
42  M() = default;
43  ~M() override final = default;
44  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
45  return trk.m();
46  }
47 };
48 
49 class D0 final: public MiniEvaluator {
50 public:
51  D0() = default;
52  ~D0() override final = default;
53  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
54  return trk.d0();
55  }
56 };
57 
58 class ErrD0 final: public MiniEvaluator {
59 public:
60  ErrD0() = default;
61  ~ErrD0() override final = default;
62  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
63  return std::sqrt(trk.definingParametersCovMatrix()(0, 0));
64  }
65 };
66 
67 class Z0 final : public MiniEvaluator {
68 public:
69  Z0() = default;
70  ~Z0() override final = default;
71  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
72  return trk.z0();
73  }
74 };
75 
76 class ErrZ0 final : public MiniEvaluator {
77 public:
78  ErrZ0() = default;
79  ~ErrZ0() override final = default;
80  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
81  return std::sqrt(trk.definingParametersCovMatrix()(1, 1));
82  }
83 };
84 
85 class Phi final : public MiniEvaluator {
86 public:
87  Phi() = default;
88  ~Phi() override final = default;
89  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
90  return trk.phi();
91  }
92 };
93 
94 class ErrPhi final : public MiniEvaluator {
95 public:
96  ErrPhi() = default;
97  ~ErrPhi() override final = default;
98  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
99  return std::sqrt(trk.definingParametersCovMatrix()(2, 2));
100  }
101 };
102 
103 class Theta final : public MiniEvaluator {
104 public:
105  Theta() = default;
106  ~Theta() override final = default;
107  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
108  return trk.theta();
109  }
110 };
111 
112 class ErrTheta final : public MiniEvaluator {
113 public:
114  ErrTheta() = default;
115  ~ErrTheta() override final = default;
116  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
117  return std::sqrt(trk.definingParametersCovMatrix()(3, 3));
118  }
119 };
120 
121 class QOverP final : public MiniEvaluator {
122 public:
123  QOverP() = default;
124  ~QOverP() override final = default;
125  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
126  return trk.qOverP();
127  }
128 };
129 
130 class ErrQOverP final : public MiniEvaluator {
131 public:
132  ErrQOverP() = default;
133  ~ErrQOverP() override final = default;
134  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
135  return std::sqrt(trk.definingParametersCovMatrix()(4, 4));
136  }
137 };
138 
139 class ChiSq final : public MiniEvaluator {
140 public:
141  ChiSq() = default;
142  ~ChiSq() override final = default;
143  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
144  return trk.chiSquared();
145  }
146 };
147 
148 class RedChiSq final : public MiniEvaluator {
149 public:
150  RedChiSq() = default;
151  ~RedChiSq() override final = default;
152  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& /*evt*/) const override final {
153  return (trk.chiSquared() / trk.numberDoF());
154  }
155 };
156 
157 class D0Sig final : public MiniEvaluator {
158 public:
159  D0Sig() = default;
160  ~D0Sig() override final = default;
161  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& /*vx*/, const xAOD::EventInfo& evt) const override final {
162  return xAOD::TrackingHelpers::d0significance(&trk, evt.beamPosSigmaX(), evt.beamPosSigmaY(), evt.beamPosSigmaXY());
163  }
164 };
165 
166 class DZ final : public MiniEvaluator {
167 public:
168  DZ() = default;
169  ~DZ() override final = default;
170  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
171  return (trk.z0() + trk.vz() - vx.z());
172  }
173 };
174 
175 class ErrDZ final : public MiniEvaluator {
176 public:
177  ErrDZ() = default;
178  ~ErrDZ() override final = default;
179  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
180  return std::sqrt(trk.definingParametersCovMatrix()(1, 1) + vx.covariancePosition()(2, 2));
181  }
182 };
183 
184 class DZSinTheta final : public MiniEvaluator {
185 public:
186  DZSinTheta() = default;
187  ~DZSinTheta() override final = default;
188  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
189  return (trk.z0() + trk.vz() - vx.z()) * std::sin(trk.theta());
190  }
191 };
192 
193 class ErrDZSinTheta final : public MiniEvaluator {
194 public:
195  ErrDZSinTheta() = default;
196  ~ErrDZSinTheta() override final = default;
197  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
198  float dz = (trk.z0() + trk.vz() - vx.z());
199  float sinTheta = std::sin(trk.theta());
200  float cosTheta = std::cos(trk.theta());
201  float errSqDZ = trk.definingParametersCovMatrix()(1, 1) + vx.covariancePosition()(2, 2);
202  float errSqTheta = trk.definingParametersCovMatrix()(3, 3);
203  float covZ0Theta = trk.definingParametersCovMatrix()(1, 3);
204  return std::sqrt(errSqDZ * std::pow(sinTheta, 2) + std::pow(dz * cosTheta, 2) * errSqTheta + 2 * sinTheta * dz * cosTheta * covZ0Theta);
205  }
206 };
207 
208 std::vector<const xAOD::TrackParticle*> toVector(const std::vector<ElementLink<xAOD::TrackParticleContainer>>& inTrks) {
209  std::vector<const xAOD::TrackParticle*> outTrks;
210  for (const auto& trkLink : inTrks) {
211  if (trkLink.isValid()) {
212  outTrks.push_back((const xAOD::TrackParticle*)(*trkLink));
213  }
214  }
215  return outTrks;
216 }
217 
218 int inVector(const xAOD::TrackParticle* trk, const std::vector<const xAOD::TrackParticle*>& vec) {
219  int i = 0;
220  for (const auto& ele : vec) {
221  if (trk == ele) {
222  return i;
223  }
224  i++;
225  }
226  return -1;
227 }
228 
229 class FitWeight final : public MiniEvaluator {
230 public:
231  FitWeight() = default;
232  ~FitWeight() override final = default;
233  virtual float eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
234  std::vector<const xAOD::TrackParticle*> fitTrks = toVector(vx.trackParticleLinks());
235  float weight = 0.0;
236  int pos = inVector(&trk, fitTrks);
237  if (pos != -1) {
238  weight = vx.trackWeights().at(pos);
239  }
240  return weight;
241  }
242 };
243 
244 class VxX final : public MiniEvaluator {
245 public:
246  VxX() = default;
247  ~VxX() override final = default;
248  virtual float eval(const xAOD::TrackParticle& /*trk*/, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
249  return vx.x();
250  }
251 };
252 
253 class ErrVxX final : public MiniEvaluator {
254 public:
255  ErrVxX() = default;
256  ~ErrVxX() override final = default;
257  virtual float eval(const xAOD::TrackParticle& /*trk*/, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
258  return std::sqrt(vx.covariancePosition()(0, 0));
259  }
260 };
261 
262 class VxY final : public MiniEvaluator {
263 public:
264  VxY() = default;
265  ~VxY() override final = default;
266  virtual float eval(const xAOD::TrackParticle& /*trk*/, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
267  return vx.y();
268  }
269 };
270 
271 class ErrVxY final : public MiniEvaluator {
272 public:
273  ErrVxY() = default;
274  ~ErrVxY() override final = default;
275  virtual float eval(const xAOD::TrackParticle& /*trk*/, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
276  return std::sqrt(vx.covariancePosition()(1, 1));
277  }
278 };
279 
280 class VxZ final : public MiniEvaluator {
281 public:
282  VxZ() = default;
283  ~VxZ() override final = default;
284  virtual float eval(const xAOD::TrackParticle& /*trk*/, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
285  return vx.z();
286  }
287 };
288 
289 class ErrVxZ final : public MiniEvaluator {
290 public:
291  ErrVxZ() = default;
292  ~ErrVxZ() override final = default;
293  virtual float eval(const xAOD::TrackParticle& /*trk*/, const xAOD::Vertex& vx, const xAOD::EventInfo& /*evt*/) const override final {
294  return std::sqrt(vx.covariancePosition()(2, 2));
295  }
296 };
297 
298 } // namespace
299 
300 namespace CP {
301 
303  clear();
304 }
305 
306 void MVAInputEvaluator::add(const std::string& name, const MVAInputEvaluator::Input& type) {
308  for (const auto& kv : m_evalMap) {
309  if (name == kv.first) {
310  throw std::runtime_error("ERROR in CP::MVAInputEvaluator::add : input name is already present in map: " + name);
311  }
312  }
313  switch (type) {
314  case Input::Pt: {
315  m_evalMap[name] = std::make_unique<::Pt>(::Pt());
316  break;
317  }
318  case Input::Eta: {
319  m_evalMap[name] = std::make_unique<::Eta>(::Eta());
320  break;
321  }
322  case Input::M: {
323  m_evalMap[name] = std::make_unique<::M>(::M());
324  break;
325  }
326  case Input::D0: {
327  m_evalMap[name] = std::make_unique<::D0>(::D0());
328  break;
329  }
330  case Input::ErrD0: {
331  m_evalMap[name] = std::make_unique<::ErrD0>(::ErrD0());
332  break;
333  }
334  case Input::Z0: {
335  m_evalMap[name] = std::make_unique<::Z0>(::Z0());
336  break;
337  }
338  case Input::ErrZ0: {
339  m_evalMap[name] = std::make_unique<::ErrZ0>(::ErrZ0());
340  break;
341  }
342  case Input::Phi: {
343  m_evalMap[name] = std::make_unique<::Phi>(::Phi());
344  break;
345  }
346  case Input::ErrPhi: {
347  m_evalMap[name] = std::make_unique<::ErrPhi>(::ErrPhi());
348  break;
349  }
350  case Input::Theta: {
351  m_evalMap[name] = std::make_unique<::Theta>(::Theta());
352  break;
353  }
354  case Input::ErrTheta: {
355  m_evalMap[name] = std::make_unique<::ErrTheta>(::ErrTheta());
356  break;
357  }
358  case Input::QOverP: {
359  m_evalMap[name] = std::make_unique<::QOverP>(::QOverP());
360  break;
361  }
362  case Input::ErrQOverP: {
363  m_evalMap[name] = std::make_unique<::ErrQOverP>(::ErrQOverP());
364  break;
365  }
366  case Input::ChiSq: {
367  m_evalMap[name] = std::make_unique<::ChiSq>(::ChiSq());
368  break;
369  }
370  case Input::RedChiSq: {
371  m_evalMap[name] = std::make_unique<::RedChiSq>(::RedChiSq());
372  break;
373  }
374  case Input::D0Sig: {
375  m_evalMap[name] = std::make_unique<::D0Sig>(::D0Sig());
376  break;
377  }
378  case Input::DZ: {
379  m_evalMap[name] = std::make_unique<::DZ>(::DZ());
380  break;
381  }
382  case Input::ErrDZ: {
383  m_evalMap[name] = std::make_unique<::ErrDZ>(::ErrDZ());
384  break;
385  }
386  case Input::DZSinTheta: {
387  m_evalMap[name] = std::make_unique<::DZSinTheta>(::DZSinTheta());
388  break;
389  }
390  case Input::ErrDZSinTheta: {
391  m_evalMap[name] = std::make_unique<::ErrDZSinTheta>(::ErrDZSinTheta());
392  break;
393  }
394  case Input::FitWeight: {
395  m_evalMap[name] = std::make_unique<::FitWeight>(::FitWeight());
396  break;
397  }
398  case Input::VxX: {
399  m_evalMap[name] = std::make_unique<::VxX>(::VxX());
400  break;
401  }
402  case Input::ErrVxX: {
403  m_evalMap[name] = std::make_unique<::ErrVxX>(::ErrVxX());
404  break;
405  }
406  case Input::VxY: {
407  m_evalMap[name] = std::make_unique<::VxY>(::VxY());
408  break;
409  }
410  case Input::ErrVxY: {
411  m_evalMap[name] = std::make_unique<::ErrVxY>(::ErrVxY());
412  break;
413  }
414  case Input::VxZ: {
415  m_evalMap[name] = std::make_unique<::VxZ>(::VxZ());
416  break;
417  }
418  case Input::ErrVxZ: {
419  m_evalMap[name] = std::make_unique<::ErrVxZ>(::ErrVxZ());
420  break;
421  }
422  default: {
423  throw std::runtime_error("ERROR in CP::MVAInputEvaluator::add : unknown input enum: " + std::to_string(type));
424  }
425  }
426  }
427 
429  clear();
430  for (const auto& kv : selection) {
431  add(kv.first, kv.second);
432  }
433  }
434 
435 void MVAInputEvaluator::eval(const xAOD::TrackParticle& trk, const xAOD::Vertex& vx, const xAOD::EventInfo& evt, std::map<std::string, double>& input) const {
436  input.clear();
437  for (const auto& kv : m_evalMap) {
438  input[kv.first] = kv.second->eval(trk, vx, evt);
439  }
440  }
441 
443  m_evalMap.clear();
444 }
445 
446 } // namespace CP
CP::MVAInputEvaluator::Pt
@ Pt
Definition: MVAInputEvaluator.h:34
CP::MVAInputEvaluator::MiniEvaluator
Definition: MVAInputEvaluator.h:25
CP::MVAInputEvaluator::M
@ M
Definition: MVAInputEvaluator.h:36
Trk::VKContraintType::Theta
@ Theta
TrackParticlexAODHelpers.h
xAOD::Vertex
Vertex_v1 Vertex
Define the latest version of the vertex class.
Definition: Event/xAOD/xAODTracking/xAODTracking/Vertex.h:16
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
xAOD::TrackingHelpers::d0significance
double d0significance(const xAOD::TrackParticle *tp, double d0_uncert_beam_spot_2)
Definition: TrackParticlexAODHelpers.cxx:42
CP::MVAInputEvaluator::D0Sig
@ D0Sig
Definition: MVAInputEvaluator.h:49
CP::MVAInputEvaluator::ErrTheta
@ ErrTheta
Definition: MVAInputEvaluator.h:44
xAOD
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
Definition: ICaloAffectedTool.h:24
EL::Detail::ManagerStep::final
@ final
CP::MVAInputEvaluator::ErrD0
@ ErrD0
Definition: MVAInputEvaluator.h:38
Phi
@ Phi
Definition: RPCdef.h:8
vec
std::vector< size_t > vec
Definition: CombinationsGeneratorTest.cxx:12
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
CP::MVAInputEvaluator::RedChiSq
@ RedChiSq
Definition: MVAInputEvaluator.h:48
CP::MVAInputEvaluator::eval
void eval(const xAOD::TrackParticle &trk, const xAOD::Vertex &vx, const xAOD::EventInfo &evt, std::map< std::string, double > &input) const
Definition: MVAInputEvaluator.cxx:435
CP::MVAInputEvaluator::DZSinTheta
@ DZSinTheta
Definition: MVAInputEvaluator.h:52
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:562
CP::MVAInputEvaluator::DZ
@ DZ
Definition: MVAInputEvaluator.h:50
Trk::Z0
@ Z0
Definition: ParameterType.h:18
CP
Select isolated Photons, Electrons and Muons.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:48
CP::MVAInputEvaluator::FitWeight
@ FitWeight
Definition: MVAInputEvaluator.h:54
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:200
xAOD::TrackParticle
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Definition: Event/xAOD/xAODTracking/xAODTracking/TrackParticle.h:13
CP::MVAInputEvaluator::VxX
@ VxX
Definition: MVAInputEvaluator.h:55
CP::MVAInputEvaluator::ErrQOverP
@ ErrQOverP
Definition: MVAInputEvaluator.h:46
CP::MVAInputEvaluator::D0
@ D0
Definition: MVAInputEvaluator.h:37
CP::MVAInputEvaluator::m_evalMap
InputEvaluatorMap m_evalMap
Definition: MVAInputEvaluator.h:76
CP::MVAInputEvaluator::QOverP
@ QOverP
Definition: MVAInputEvaluator.h:45
CP::MVAInputEvaluator::ChiSq
@ ChiSq
Definition: MVAInputEvaluator.h:47
Prompt::Def::D0Sig
@ D0Sig
Definition: VarHolder.h:87
lumiFormat.i
int i
Definition: lumiFormat.py:92
CP::MVAInputEvaluator::load
void load(const MVAInputEvaluator::InputSelectionMap &selection)
Definition: MVAInputEvaluator.cxx:428
CP::MVAInputEvaluator::ErrVxZ
@ ErrVxZ
Definition: MVAInputEvaluator.h:60
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
CP::MVAInputEvaluator::clear
void clear()
Definition: MVAInputEvaluator.cxx:442
CP::MVAInputEvaluator::Phi
@ Phi
Definition: MVAInputEvaluator.h:41
CP::MVAInputEvaluator::ErrVxX
@ ErrVxX
Definition: MVAInputEvaluator.h:56
CP::MVAInputEvaluator::VxZ
@ VxZ
Definition: MVAInputEvaluator.h:59
selection
std::string selection
Definition: fbtTestBasics.cxx:73
Vertex.h
CP::MVAInputEvaluator::ErrDZSinTheta
@ ErrDZSinTheta
Definition: MVAInputEvaluator.h:53
CP::MVAInputEvaluator::InputSelectionMap
std::map< std::string, Input > InputSelectionMap
Definition: MVAInputEvaluator.h:65
CP::MVAInputEvaluator::~MVAInputEvaluator
~MVAInputEvaluator()
Definition: MVAInputEvaluator.cxx:302
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
EventInfo
This class provides general information about an event. Event information is provided by the accessor...
Definition: EventInfo/EventInfo/EventInfo.h:42
CP::MVAInputEvaluator::ErrVxY
@ ErrVxY
Definition: MVAInputEvaluator.h:58
CP::MVAInputEvaluator::Z0
@ Z0
Definition: MVAInputEvaluator.h:39
Trk::D0
@ D0
Definition: ParameterType.h:18
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
Prompt::Def::Pt
@ Pt
Definition: VarHolder.h:76
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
MVAInputEvaluator.h
CP::MVAInputEvaluator::Eta
@ Eta
Definition: MVAInputEvaluator.h:35
CP::MVAInputEvaluator::Input
Input
Definition: MVAInputEvaluator.h:33
CP::MVAInputEvaluator::Theta
@ Theta
Definition: MVAInputEvaluator.h:43
CP::MVAInputEvaluator::ErrPhi
@ ErrPhi
Definition: MVAInputEvaluator.h:42
CP::MVAInputEvaluator::add
void add(const std::string &name, const MVAInputEvaluator::Input &type)
Definition: MVAInputEvaluator.cxx:306
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
CP::MVAInputEvaluator::ErrZ0
@ ErrZ0
Definition: MVAInputEvaluator.h:40
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
python.CaloScaleNoiseConfig.default
default
Definition: CaloScaleNoiseConfig.py:79
CP::MVAInputEvaluator::VxY
@ VxY
Definition: MVAInputEvaluator.h:57
CP::MVAInputEvaluator::ErrDZ
@ ErrDZ
Definition: MVAInputEvaluator.h:51
TrackParticleContainer.h
Eta
@ Eta
Definition: RPCdef.h:8