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