31 {
32
36
41
42 METNet::METNet(const std::string& name):
44
47
50 ATH_CHECK(m_jetContainerKey.initialize());
51
52 if( m_netLocation.empty()){
54 return StatusCode::FAILURE;
55 }
57 std::unique_ptr<METNetHandler> metNetHandler = std::make_unique<METNetHandler>( netFilePath );
58 if( metNetHandler->initialize() != 0){
60 return StatusCode::FAILURE;
61 }
62 ATH_MSG_INFO(
"Resolved METNet ONNX file at " + netFilePath);
63 m_metNetHandler = std::move(metNetHandler);
64
65 if(m_metmaker_loose.empty()){
67 ATH_CHECK( toolConfig.setProperty(
"JetContainer", m_jetContainerKey.key()) );
68 ATH_CHECK( toolConfig.setProperty(
"DoPFlow",
true) );
69 ATH_CHECK( toolConfig.setProperty(
"JetSelection",
"Loose") );
70 ATH_CHECK( toolConfig.makePrivateTool(m_metmaker_loose) );
71 }
73
74 if(m_metmaker_tight.empty()){
76 ATH_CHECK( toolConfig.setProperty(
"JetContainer", m_jetContainerKey.key()) );
77 ATH_CHECK( toolConfig.setProperty(
"DoPFlow",
true) );
78 ATH_CHECK( toolConfig.setProperty(
"JetSelection",
"Tight") );
79 ATH_CHECK( toolConfig.makePrivateTool(m_metmaker_tight) );
80 }
82
83 if(m_metmaker_tghtr.empty()){
85 ATH_CHECK( toolConfig.setProperty(
"JetContainer", m_jetContainerKey.key()) );
86 ATH_CHECK( toolConfig.setProperty(
"DoPFlow",
true) );
87 ATH_CHECK( toolConfig.setProperty(
"JetSelection",
"Tighter") );
88 ATH_CHECK( toolConfig.makePrivateTool(m_metmaker_tghtr) );
89 }
91
92 if(m_metmaker_tenac.empty()){
94 ATH_CHECK( toolConfig.setProperty(
"JetContainer", m_jetContainerKey.key()) );
95 ATH_CHECK( toolConfig.setProperty(
"DoPFlow",
true) );
96 ATH_CHECK( toolConfig.setProperty(
"JetSelection",
"Tenacious") );
97 ATH_CHECK( toolConfig.makePrivateTool(m_metmaker_tenac) );
98 }
100
101 return StatusCode::SUCCESS;
102 }
103
104 StatusCode METNet::rebuildMET(
const std::string& metKey,
110 return m_metmaker_tight->rebuildMET( metKey, metType, metCont, collection, helper, objScale );
111 }
112
113 StatusCode METNet::rebuildJetMET(
const std::string&,
114 const std::string& softClusKey,
115 const std::string& softTrkKey,
120 bool ) const {
121
122
124
125 float avgmu = ei->averageInteractionsPerCrossing();
126 float actmu = ei->actualInteractionsPerCrossing();
127
128
129 auto metCont_loose = std::make_shared<xAOD::MissingETContainer>();
130 auto metCont_looseAux = std::make_shared<xAOD::MissingETAuxContainer>();
131 metCont_loose->setStore( metCont_looseAux.get() );
132
133 auto metCont_tight = std::make_shared<xAOD::MissingETContainer>();
134 auto metCont_tightAux = std::make_shared<xAOD::MissingETAuxContainer>();
135 metCont_tight->setStore( metCont_tightAux.get() );
136
137 auto metCont_tghtr = std::make_shared<xAOD::MissingETContainer>();
138 auto metCont_tghtrAux = std::make_shared<xAOD::MissingETAuxContainer>();
139 metCont_tghtr->setStore( metCont_tghtrAux.get() );
140
141 auto metCont_tenac = std::make_shared<xAOD::MissingETContainer>();
142 auto metCont_tenacAux = std::make_shared<xAOD::MissingETAuxContainer>();
143 metCont_tenac->setStore( metCont_tenacAux.get() );
144
145
146
148 ATH_CHECK( copyMETContainer( metCont_loose.get(), metCont ) );
149 ATH_CHECK( copyMETContainer( metCont_tight.get(), metCont ) );
150 ATH_CHECK( copyMETContainer( metCont_tghtr.get(), metCont ) );
151 ATH_CHECK( copyMETContainer( metCont_tenac.get(), metCont ) );
152
153
158
159
161 ATH_CHECK( m_metmaker_loose->rebuildJetMET(
"RefJet", softClusKey, softTrkKey, metCont_loose.get(), jets, metCoreCont, helper_loose,
true ) );
162 ATH_CHECK( m_metmaker_tight->rebuildJetMET(
"RefJet", softClusKey, softTrkKey, metCont_tight.get(), jets, metCoreCont, helper_tight,
true ) );
163 ATH_CHECK( m_metmaker_tghtr->rebuildJetMET(
"RefJet", softClusKey, softTrkKey, metCont_tghtr.get(), jets, metCoreCont, helper_tghtr,
true ) );
164 ATH_CHECK( m_metmaker_tenac->rebuildJetMET(
"RefJet", softClusKey, softTrkKey, metCont_tenac.get(), jets, metCoreCont, helper_tenac,
true ) );
165
166
172
177
179
180
181 std::vector<std::string> input_names;
182 std::vector<float> input_values;
183
184 ATH_CHECK( addMETFinal(
"Loose", metCont_loose.get(), input_names, input_values ) );
185
186
191 ATH_CHECK( addMETFinal(
"Tight", metCont_tight.get(), input_names, input_values ) );
192
193 ATH_CHECK( addMETFinal(
"Tighter", metCont_tghtr.get(), input_names, input_values ) );
194 ATH_CHECK( addMETFinal(
"Tenacious", metCont_tenac.get(), input_names, input_values ) );
195
196
198 if(!pvtxs.isValid()){
199 ATH_MSG_ERROR(
"Could not retrieve primary vertex container!");
200 return StatusCode::FAILURE;
201 }
202 int NVx_2Tracks = 0;
203 int NVx_4Tracks = 0;
204 int PV_NTracks = 0;
205 int n_tracks = 0;
207 n_tracks = vx->nTrackParticles();
208 if ( n_tracks>=2 ) NVx_2Tracks++;
209 if ( n_tracks>=4 ) NVx_4Tracks++;
211 }
212 ATH_CHECK( addInputValue(
"ActualMu", actmu, input_names, input_values ) );
213 ATH_CHECK( addInputValue(
"AverageMu", avgmu, input_names, input_values ) );
214 ATH_CHECK( addInputValue(
"NPV_2Tracks", NVx_2Tracks, input_names, input_values ) );
215 ATH_CHECK( addInputValue(
"NPV_4Tracks", NVx_4Tracks, input_names, input_values ) );
216 ATH_CHECK( addInputValue(
"PV_NTracks", PV_NTracks, input_names, input_values ) );
217
218
222 dec_inputnames( *(*metCont)["NetInputDummy"] ) = std::move(input_names);
223 dec_inputvalues( *(*metCont)["NetInputDummy"] ) = std::move(input_values);
224
225 return StatusCode::SUCCESS;
226 }
227
228 StatusCode METNet::evaluateNNMET(
const std::string& totalName,
230
231
233 if ( (*metCont)["NetInputDummy"] == NULL ) {
234 ATH_MSG_ERROR(
"Could not find the NetInputDummy MET object in the container. Did you run rebuildJetMET?" );
235 return StatusCode::FAILURE;
236 }
237
238
239 std::vector<float> tmp_inputs = acc_inputvalues(*(*metCont)["NetInputDummy"]);
240 ATH_MSG_VERBOSE(
"Loaded " << tmp_inputs.size() <<
" network inputs" );
241
242
243 if ( tmp_inputs.size() != m_metNetHandler->getReqSize() ) {
244 ATH_MSG_ERROR(
"The MET container provided " << tmp_inputs.size()
245 << " elements, but the ONNX network needs exactly " << m_metNetHandler->getReqSize() << "!" );
246 return StatusCode::FAILURE;
247 }
248
249
250 std::vector<float> net_met;
251 m_metNetHandler->predict(net_met, tmp_inputs);
252
253
256 metFinal->
setMpx( net_met[0] );
257 metFinal->
setMpy( net_met[1] );
258
259 ATH_MSG_VERBOSE(
"Writing the Final Network MET: (" << net_met[0] <<
", " << net_met[1] <<
")" );
260
261 return StatusCode::SUCCESS;
262 }
263
264 StatusCode METNet::addMETFinal(
const std::string& WP_name,
266 std::vector<std::string>& name_vec,
267 std::vector<float>& val_vec ) const {
268
269 ATH_CHECK( addMETTerm( WP_name, (*met_container)[
"RefJet"], name_vec, val_vec ) );
270 ATH_CHECK( addMETTerm( WP_name, (*met_container)[
"PVSoftTrk"], name_vec, val_vec ) );
271 ATH_CHECK( addMETTerm( WP_name, (*met_container)[
"FinalTrk"], name_vec, val_vec ) );
272 ATH_CHECK( addMETTerm( WP_name, (*met_container)[
"SoftClus"], name_vec, val_vec ) );
273 ATH_CHECK( addMETTerm( WP_name, (*met_container)[
"FinalClus"], name_vec, val_vec ) );
274 return StatusCode::SUCCESS;
275 }
276
277 StatusCode METNet::addMETTerm(
const std::string &WP_name,
279 std::vector<std::string>& name_vec,
280 std::vector<float>& val_vec ) const {
281
283 ATH_MSG_ERROR(
"addMETTerm was called with a null pointer for the input MET value!");
284 return StatusCode::FAILURE;
285 }
286
287
288 std::string tname = WP_name +
"_" +
met->name();
289
290
291 ATH_CHECK( addInputValue( tname+
"_mpx",
met->mpx(), name_vec, val_vec ) );
292 ATH_CHECK( addInputValue( tname+
"_mpy",
met->mpy(), name_vec, val_vec ) );
293 ATH_CHECK( addInputValue( tname+
"_sumet",
met->sumet(), name_vec, val_vec ) );
294
295 return StatusCode::SUCCESS;
296 }
297
298 StatusCode METNet::addInputValue(
const std::string& var_name,
299 float value,
300 std::vector<std::string>& name_vec,
301 std::vector<float>& val_vec ) const {
302
303
304 ATH_MSG_VERBOSE(
"Adding variable: " << var_name <<
" = " << value <<
" to the network input vector" );
305 name_vec.push_back( var_name );
306 val_vec.push_back( value );
307 return StatusCode::SUCCESS;
308 }
309
313
315 blank_met = nullptr;
316 const std::string&
name = old_met->name();
317
318 ATH_CHECK( fillMET( blank_met, new_container, name, old_met->source() ) );
319 *(*new_container)[
name] = *(*old_container)[
name];
320
321
322 dec_constitObjLinks(*(*new_container)[name]) = acc_constitObjLinks(*(*old_container)[name]);
323 }
324
325 return StatusCode::SUCCESS;
326 }
327
332 ATH_MSG_ERROR(
"METNet has not overloaded this version of rebuildMET from IMETMaker!\n"
333 "Please only use this method:\n"
334 "StatusCode METMaker::rebuildMET("
335 "const std::string& metKey,\n"
336 "xAOD::Type::ObjectType metType,\n"
337 "xAOD::MissingETContainer* metCont,\n"
338 "const xAOD::IParticleContainer* collection,\n"
339 "xAOD::MissingETAssociationHelper& helper,\n"
340 "MissingETBase::UsageHandler::Policy objScale\n"
341 ")" );
342 return StatusCode::FAILURE;
343 }
344
349 bool,
351 ATH_MSG_ERROR(
"METNet has not overloaded this version of rebuildMET from IMETMaker!\n"
352 "Please only use this method:\n"
353 "StatusCode METMaker::rebuildMET("
354 "const std::string& metKey,\n"
355 "xAOD::Type::ObjectType metType,\n"
356 "xAOD::MissingETContainer* metCont,\n"
357 "const xAOD::IParticleContainer* collection,\n"
358 "xAOD::MissingETAssociationHelper& helper,\n"
359 "MissingETBase::UsageHandler::Policy objScale\n"
360 ")" );
361 return StatusCode::FAILURE;
362 }
363
364 StatusCode METNet::rebuildJetMET(
const std::string& metJetKey,
365 const std::string& ,
370 bool doJetJVT) const {
371 return rebuildJetMET(metJetKey, "SoftClus", "PVSoftTrk", metCont, jets, metCoreCont, helper, doJetJVT);
372 }
373
381 bool,
382 bool,
383 std::vector<const xAOD::IParticle*>* ) const {
384 ATH_MSG_ERROR(
"METNet has not overloaded this version of rebuildJetMET from IMETMaker!\n"
385 "Please use the method with the following arguments:\n"
386 "StatusCode METNet::rebuildJetMET(\n"
387 "const std::string& metJetKey,\n"
388 "const std::string& softClusKey,\n"
389 "const std::string& softTrkKey,\n"
390 "xAOD::MissingETContainer* metCont,\n"
391 "const xAOD::JetContainer* jets,\n"
392 "const xAOD::MissingETContainer* metCoreCont,\n"
393 "xAOD::MissingETAssociationHelper& helper,\n"
394 "bool doJetJVT\n"
395 ")" );
396 return StatusCode::FAILURE;
397 }
398
399 StatusCode METNet::rebuildTrackMET(
const std::string&,
400 const std::string&,
405 bool ) const {
406 ATH_MSG_ERROR(
"Please don't use the method METNet::rebuildTrackMET!\n"
407 "It has no use in METNet and is a holdover from its inheritance from IMETMaker." );
408 return StatusCode::FAILURE;
409 }
410
416 bool ) const {
418 return StatusCode::FAILURE;
419 }
420
425 return StatusCode::FAILURE;
426 }
427
428}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
ElementLink< xAOD::IParticleContainer > iplink_t
ElementLink implementation for ROOT usage.
Helper class to provide constant type-safe access to aux data.
void setMpy(float value)
Set the component.
void setMpx(float value)
Set the component.
::StatusCode StatusCode
StatusCode definition for legacy code.
uint64_t bitmask_t
Type for status word bit mask.
Policy
Policies on usage checks.
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
ObjectType
Type of objects that have a representation in the xAOD EDM.
MissingET_v1 MissingET
Version control by type defintion.
Vertex_v1 Vertex
Define the latest version of the vertex class.
MissingETContainer_v1 MissingETContainer
JetContainer_v1 JetContainer
Definition of the current "jet container version".
DataVector< IParticle > IParticleContainer
Simple convenience declaration of IParticleContainer.
static Types::bitmask_t total(Region reg=Region::FullAcceptance)
Standard full reconstructed MET.
static Types::bitmask_t muon(Region reg=Region::FullAcceptance)
Standard MET term from reconstructed muons.
static Types::bitmask_t tau(Region reg=Region::FullAcceptance)
Standard MET term from reconstructed tau leptons.
static Types::bitmask_t electron(Region reg=Region::FullAcceptance)
Standard MET term from reconstructed electrons.
static Types::bitmask_t photon(Region reg=Region::FullAcceptance)
Standard MET term from reconstructed photons.
@ LCTopo
Indicator for MET contribution from TopoClusters with LCW calibration applied.
@ Track
Indicator for MET contribution from reconstructed charged particle tracks.