ATLAS Offline Software
Loading...
Searching...
No Matches
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
18namespace {
19
20using MiniEvaluator = CP::MVAInputEvaluator::MiniEvaluator;
21
22class Pt final : public MiniEvaluator {
23public:
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
31class Eta final: public MiniEvaluator {
32public:
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
40class M final: public MiniEvaluator {
41public:
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
49class D0 final: public MiniEvaluator {
50public:
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
58class ErrD0 final: public MiniEvaluator {
59public:
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
67class Z0 final : public MiniEvaluator {
68public:
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
76class ErrZ0 final : public MiniEvaluator {
77public:
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
85class Phi final : public MiniEvaluator {
86public:
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
94class ErrPhi final : public MiniEvaluator {
95public:
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
103class Theta final : public MiniEvaluator {
104public:
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
112class ErrTheta final : public MiniEvaluator {
113public:
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
121class QOverP final : public MiniEvaluator {
122public:
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
130class ErrQOverP final : public MiniEvaluator {
131public:
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
139class ChiSq final : public MiniEvaluator {
140public:
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
148class RedChiSq final : public MiniEvaluator {
149public:
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
157class D0Sig final : public MiniEvaluator {
158public:
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
166class DZ final : public MiniEvaluator {
167public:
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
175class ErrDZ final : public MiniEvaluator {
176public:
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
184class DZSinTheta final : public MiniEvaluator {
185public:
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
193class ErrDZSinTheta final : public MiniEvaluator {
194public:
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
208std::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
218int 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
229class FitWeight final : public MiniEvaluator {
230public:
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
244class VxX final : public MiniEvaluator {
245public:
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
253class ErrVxX final : public MiniEvaluator {
254public:
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
262class VxY final : public MiniEvaluator {
263public:
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
271class ErrVxY final : public MiniEvaluator {
272public:
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
280class VxZ final : public MiniEvaluator {
281public:
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
289class ErrVxZ final : public MiniEvaluator {
290public:
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
300namespace CP {
301
305
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
435void 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
static const int D0
Definition AtlasPID.h:119
std::vector< size_t > vec
boost::graph_traits< boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS > >::vertex_descriptor Vertex
@ Phi
Definition RPCdef.h:8
@ Eta
Definition RPCdef.h:8
void add(const std::string &name, const MVAInputEvaluator::Input &type)
InputEvaluatorMap m_evalMap
void load(const MVAInputEvaluator::InputSelectionMap &selection)
std::map< std::string, Input > InputSelectionMap
void eval(const xAOD::TrackParticle &trk, const xAOD::Vertex &vx, const xAOD::EventInfo &evt, std::map< std::string, double > &input) const
const std::string selection
Select isolated Photons, Electrons and Muons.
double d0significance(const xAOD::TrackParticle *tp, double d0_uncert_beam_spot_2)
EventInfo_v1 EventInfo
Definition of the latest event info version.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.