ATLAS Offline Software
TrigEgammaMatchingToolMT.icc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 #include <boost/algorithm/string.hpp>
5 
6 
7 // L2Calo, L2Electron, L2Photon, EFCalo, Electron and Photon trigger passed access
8 template<class T>
9 inline bool TrigEgammaMatchingToolMT::ancestorPassed( const TrigCompositeUtils::Decision *dec, const std::string& trigger, const std::string& key,
10  unsigned int condition) const
11 {
12 
13  if( !dec ) return false;
14 
15  auto initRoi = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( dec, "initialRoI");
16  if( !initRoi.isValid() )
17  return false;
18 
19  auto vec = tdt()->features< T >(trigger,condition ,key);
20 
21  for( auto &featLinkInfo : vec )
22  {
23  auto roi = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>(featLinkInfo.source, "initialRoI");
24  if( ! roi.isValid()) continue;
25  if( (*roi.link)->roiWord() == (*initRoi.link)->roiWord())
26  {
27  bool passed = (featLinkInfo.state==TrigCompositeUtils::ActiveState::ACTIVE);
28  if(passed) return true;
29  }
30  }
31  return false;
32 }
33 
34 
35 // L1Calo trigger passed access
36 template<>
37 inline bool TrigEgammaMatchingToolMT::ancestorPassed<TrigRoiDescriptorCollection>( const TrigCompositeUtils::Decision *dec,
38  const std::string& trigger, const std::string& /*key*/,
39  unsigned int condition ) const
40 {
41  if( !dec ) return false;
42  auto initRoi = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( dec, "initialRoI");
43  if( !initRoi.isValid() )
44  return false;
45 
46  auto vec = tdt()->features<TrigRoiDescriptorCollection>(trigger,condition,"",TrigDefs::allFeaturesOfType,"initialRoI");
47 
48  for( auto &featLinkInfo : vec )
49  {
50  if(!featLinkInfo.isValid()) continue;
51  if( (*featLinkInfo.link)->roiWord() == (*initRoi.link)->roiWord())
52  {
53  bool passed = (featLinkInfo.state==TrigCompositeUtils::ActiveState::ACTIVE);
54  if(passed) return true;
55  }
56  }
57  return true;
58 }
59 
60 
61 
62 
63 template<class T>
64 inline bool TrigEgammaMatchingToolMT::closestObject( const xAOD::Egamma *eg, const TrigCompositeUtils::Decision *&dec,
65  const std::string &trigger, const std::string &key ,
66  float dR_value, unsigned int condition
67  ) const
68 {
69  double deltaR=0.;
70  auto vec = tdt()->features<T>(trigger, condition ,key);
71 
72 
73  for( auto &featLinkInfo : vec ){
74 
75  if(! featLinkInfo.isValid() ) continue;
76  const auto *feat = *(featLinkInfo.link);
77  if(!feat) continue;
78  deltaR = dR(eg->eta(),eg->phi(), feat->eta(),feat->phi());
79  if(deltaR < dR_value){
80  dec = featLinkInfo.source;
81  return true;
82  }
83  }
84  return false;
85 }
86 
87 
88 template<class T>
89 inline std::vector<TrigCompositeUtils::LinkInfo<T>> TrigEgammaMatchingToolMT::getFeatures( const TrigCompositeUtils::Decision *dec ,
90  const std::string& trigger, const std::string& key,
91  unsigned int condition)
92 const
93 {
94  std::vector<TrigCompositeUtils::LinkInfo<T>> vec;
95  auto initRoi = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>(dec, "initialRoI");
96  if( !initRoi.isValid() ) return vec;
97 
98  auto vec_dec = tdt()->features<T>(trigger,condition, key);
99  for ( auto& featLinkInfo : vec_dec ){
100  if( !featLinkInfo.isValid() ) continue;
101  auto roi = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>(featLinkInfo.source, "initialRoI");
102  if( ! roi.isValid()) continue;
103  if( (*roi.link)->roiWord() == (*initRoi.link)->roiWord() )
104  vec.push_back( featLinkInfo );
105  }
106  return vec;
107 }
108 
109 
110 
111 
112 
113 // L1Calo
114 template<>
115 inline TrigCompositeUtils::LinkInfo<TrigRoiDescriptorCollection> TrigEgammaMatchingToolMT::getFeature<TrigRoiDescriptorCollection>( const TrigCompositeUtils::Decision *dec ,
116  const std::string& trigger, unsigned int condition)
117 const
118 {
119  auto initRoi = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>(dec, "initialRoI");
120 
121  if( initRoi.isValid() ){
122  // includeFailedDecisions
123 
124  auto vec_dec = tdt()->features<TrigRoiDescriptorCollection>(trigger, condition,"",TrigDefs::allFeaturesOfType,"initialRoI");
125  for( auto &featLinkInfo: vec_dec ){
126  if( !featLinkInfo.isValid() ) continue;
127  if( (*featLinkInfo.link)->roiWord() == (*initRoi.link)->roiWord() ) return featLinkInfo;
128  }
129  }
130 
131  return TrigCompositeUtils::LinkInfo<TrigRoiDescriptorCollection>();
132 }
133 
134 
135 // L2Calo
136 template<>
137 inline TrigCompositeUtils::LinkInfo<xAOD::TrigEMClusterContainer> TrigEgammaMatchingToolMT::getFeature<xAOD::TrigEMClusterContainer>( const TrigCompositeUtils::Decision *dec ,
138  const std::string& trigger, unsigned int condition)
139 const
140 {
141  std::vector<TrigCompositeUtils::LinkInfo<xAOD::TrigEMClusterContainer>> vec = getFeatures<xAOD::TrigEMClusterContainer>(dec, trigger, key("FastCalo") , condition);
142  return !vec.empty() ? vec.front() : TrigCompositeUtils::LinkInfo<xAOD::TrigEMClusterContainer>();
143 }
144 
145 
146 // L2Electron
147 template<>
148 inline std::vector<TrigCompositeUtils::LinkInfo<xAOD::TrigElectronContainer>> TrigEgammaMatchingToolMT::getFeatures<xAOD::TrigElectronContainer>(
149  const TrigCompositeUtils::Decision *dec , const std::string& trigger, unsigned int condition)
150 const
151 {
152  if(boost::contains(trigger,"lrt")){
153  return getFeatures<xAOD::TrigElectronContainer>(dec, trigger, key("FastElectrons_LRT"), condition);
154  }else{
155  return getFeatures<xAOD::TrigElectronContainer>(dec, trigger, key("FastElectrons"), condition);
156  }
157 }
158 
159 
160 // L2Photon
161 template<>
162 inline TrigCompositeUtils::LinkInfo<xAOD::TrigPhotonContainer> TrigEgammaMatchingToolMT::getFeature<xAOD::TrigPhotonContainer>(
163  const TrigCompositeUtils::Decision *dec , const std::string& trigger, unsigned int condition)
164 const
165 {
166  auto vec = getFeatures<xAOD::TrigPhotonContainer>(dec, trigger, key("FastPhotons") , condition);
167  return !vec.empty() ? vec.front() : TrigCompositeUtils::LinkInfo<xAOD::TrigPhotonContainer>();
168 }
169 
170 
171 // EFCalo
172 template<>
173 inline std::vector<TrigCompositeUtils::LinkInfo<xAOD::CaloClusterContainer>> TrigEgammaMatchingToolMT::getFeatures<xAOD::CaloClusterContainer>(
174  const TrigCompositeUtils::Decision *dec , const std::string& trigger, unsigned int condition)
175 const
176 {
177  std::vector<std::string> parts;
178  boost::split(parts,trigger,boost::is_any_of("_"));
179 
180  if(boost::contains(trigger,"lrt")){
181  return getFeatures<xAOD::CaloClusterContainer>(dec, trigger, key("PrecisionCalo_LRT"), condition );
182  }else if(boost::contains(parts.at(0),"g")){
183  return getFeatures<xAOD::CaloClusterContainer>(dec, trigger, key("PrecisionCalo_Photon"), condition );
184  }else{
185  return getFeatures<xAOD::CaloClusterContainer>(dec, trigger, key("PrecisionCalo_Electron"), condition );
186  }
187 
188 }
189 
190 
191 
192 // Electron
193 template<>
194 inline std::vector<TrigCompositeUtils::LinkInfo<xAOD::ElectronContainer>> TrigEgammaMatchingToolMT::getFeatures<xAOD::ElectronContainer>(
195  const TrigCompositeUtils::Decision *dec , const std::string& trigger, unsigned int condition)
196 const
197 {
198  if (boost::contains(trigger,"gsf")){
199  return getFeatures<xAOD::ElectronContainer>(dec, trigger, key("Electrons_GSF") , condition);
200  }else if(boost::contains(trigger,"lrt")){
201  return getFeatures<xAOD::ElectronContainer>(dec, trigger, key("Electrons_LRT") , condition);
202  }else{
203  return getFeatures<xAOD::ElectronContainer>(dec, trigger, key("Electrons") , condition);
204  }
205 }
206 
207 
208 // Photon
209 template<>
210 inline std::vector<TrigCompositeUtils::LinkInfo<xAOD::PhotonContainer>> TrigEgammaMatchingToolMT::getFeatures<xAOD::PhotonContainer>( const TrigCompositeUtils::Decision *dec ,
211  const std::string& trigger, unsigned int condition)
212 const
213 {
214  return getFeatures<xAOD::PhotonContainer>(dec, trigger, key("Photons"), condition );
215 }
216 
217 
218 
219 
220 
221