ATLAS Offline Software
Loading...
Searching...
No Matches
METHelpers.icc
Go to the documentation of this file.
1///////////////////////// -*- C++ -*- /////////////////////////////
2
3/*
4 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
5*/
6
7// Template definitions
8
9namespace met {
10
11 // Hides these from other code that might include METHelpers.h
12 namespace accessors {
13 static const SG::AuxElement::ConstAccessor< std::vector< ElementLink< xAOD::IParticleContainer> > > constitObjLinks("ConstitObjectLinks");
14 static const SG::AuxElement::ConstAccessor< std::vector< float > > constitObjWeights("ConstitObjectWeights");
15 }
16
17 template <class T>
18 std::vector<const T*> getMETElements(const xAOD::MissingET& met) {
19 using namespace msgMET;
20
21 const auto& uniqueLinks = accessors::constitObjLinks(met);
22 std::vector<const T*> objs_out{};
23 objs_out.reserve(uniqueLinks.size());
24 // Loop through links
25 for (const auto& link: uniqueLinks){
26 if (link.isValid()) {
27 const T* obj = dynamic_cast<const T*>(*link);
28 if(obj == nullptr) {
29 ANA_MSG_WARNING("Mismatched element type retrieved from " << met.name());
30 objs_out.push_back(nullptr);
31 } else {
32 objs_out.push_back(obj);
33 }
34 } else {
35 ANA_MSG_WARNING("Invalid ElementLink from MET term " << met.name());
36 objs_out.push_back(nullptr);
37 }
38 }
39
40 return objs_out;
41 }
42
43 template <class T>
44 std::vector<std::pair<const T*,float> > getMETElementsWeights(const xAOD::MissingET& met) {
45 using namespace msgMET;
46
47 const auto& uniqueLinks = accessors::constitObjLinks(met);
48 const auto& uniqueWeights = accessors::constitObjWeights(met);
49 std::vector<std::pair<const T*,float> > objs_weights_out{};
50 objs_weights_out.reserve(uniqueLinks.size());
51 // Loop through links
52 for (size_t i=0; i<uniqueLinks.size(); ++i) {
53 auto& link = uniqueLinks[i];
54 float weight = uniqueWeights[i];
55 if (link.isValid()) {
56 const T* obj = dynamic_cast<const T*>(*link);
57 if(obj == nullptr) {
58 ANA_MSG_WARNING("Mismatched element type retrieved from " << met.name());
59 objs_weights_out.push_back(std::make_pair(nullptr,0));
60 } else {
61 objs_weights_out.push_back(std::make_pair(obj,weight));
62 }
63 } else {
64 ANA_MSG_WARNING("Invalid ElementLink from MET term " << met.name());
65 objs_weights_out.push_back(std::make_pair(nullptr,0));
66 }
67 }
68
69 return objs_weights_out;
70 }
71
72}