31 {
32
35
39
40
45
47
48 METNetSig::METNetSig(const std::string& name):
50
52
53 METNetSig::~METNetSig() { }
54
56
59
60 if (m_netSigLocation.value().find("dummy") != std::string::npos ) {
61 ATH_MSG_WARNING(
"You are loading a dummy/untrained METNetSig network! This should only be done when testing the code!\n"
62 " -- If you wish to load a trained network please specify a path to an onnx file using the 'NetworkLocation' argument.\n"
63 " -- A list of supported networks can be found at atlas-groupdata.web.cern.ch/atlas-groupdata/METUtilities/run2_13TeV/METNet/" );
64 }
65
68 ATH_CHECK(m_jetContainerKey.initialize());
69
70
71 ATH_MSG_INFO(
"Initialising the METNet ONNX environment using the file " + m_netSigLocation);
72 m_metnetsighandler = std::make_unique<METNetSigHandler>( m_netSigLocation );
73 if( m_metnetsighandler->initialize() != 0){
75 return StatusCode::FAILURE;
76 }
77
78 if(m_metmaker_loose.empty()){
80 ATH_CHECK( toolConfig.setProperty(
"JetContainer", m_jetContainerKey.key()) );
81 ATH_CHECK( toolConfig.setProperty(
"DoPFlow",
true) );
82 ATH_CHECK( toolConfig.setProperty(
"JetSelection",
"Loose") );
83 ATH_CHECK( toolConfig.makePrivateTool(m_metmaker_loose) );
84 }
86
87 if(m_metmaker_tight.empty()){
89 ATH_CHECK( toolConfig.setProperty(
"JetContainer", m_jetContainerKey.key()) );
90 ATH_CHECK( toolConfig.setProperty(
"DoPFlow",
true) );
91 ATH_CHECK( toolConfig.setProperty(
"JetSelection",
"Tight") );
92 ATH_CHECK( toolConfig.makePrivateTool(m_metmaker_tight) );
93 }
95
96 if(m_metmaker_tghtr.empty()){
98 ATH_CHECK( toolConfig.setProperty(
"JetContainer", m_jetContainerKey.key()) );
99 ATH_CHECK( toolConfig.setProperty(
"DoPFlow",
true) );
100 ATH_CHECK( toolConfig.setProperty(
"JetSelection",
"Tighter") );
101 ATH_CHECK( toolConfig.makePrivateTool(m_metmaker_tghtr) );
102 }
103 ATH_CHECK( m_metmaker_tghtr.retrieve() );
104
105 if(m_metmaker_tenac.empty()){
107 ATH_CHECK( toolConfig.setProperty(
"JetContainer", m_jetContainerKey.key()) );
108 ATH_CHECK( toolConfig.setProperty(
"DoPFlow",
true) );
109 ATH_CHECK( toolConfig.setProperty(
"JetSelection",
"Tenacious") );
110 ATH_CHECK( toolConfig.makePrivateTool(m_metmaker_tenac) );
111 }
112 ATH_CHECK( m_metmaker_tenac.retrieve() );
113
114 return StatusCode::SUCCESS;
115 }
116
118
119 StatusCode METNetSig::rebuildMET(
const std::string& metKey,
125 {
126
127 if ( (*metCont)[metKey] != nullptr ) {
128 ATH_MSG_DEBUG(
"MET term '" << metKey <<
"' already exists in the container — skipping rebuild in METNetSig.");
129 return StatusCode::SUCCESS;
130 }
131
132 return m_metmaker_tight->rebuildMET( metKey, metType, metCont, collection, helper, objScale );
133 }
134
135 StatusCode METNetSig::rebuildJetMET(
const std::string&,
136 const std::string& softClusKey,
137 const std::string& softTrkKey,
142 bool ) const {
143
144
146
147 float avgmu = ei->averageInteractionsPerCrossing();
148 float actmu = ei->actualInteractionsPerCrossing();
149
151
152
153 auto metCont_loose = std::make_unique<xAOD::MissingETContainer>();
154 auto metCont_looseAux = std::make_unique<xAOD::MissingETAuxContainer>();
155 metCont_loose->setStore( metCont_looseAux.get() );
156
157 auto metCont_tight = std::make_unique<xAOD::MissingETContainer>();
158 auto metCont_tightAux = std::make_unique<xAOD::MissingETAuxContainer>();
159 metCont_tight->setStore( metCont_tightAux.get() );
160
161 auto metCont_tghtr = std::make_unique<xAOD::MissingETContainer>();
162 auto metCont_tghtrAux = std::make_unique<xAOD::MissingETAuxContainer>();
163 metCont_tghtr->setStore( metCont_tghtrAux.get() );
164
165 auto metCont_tenac = std::make_unique<xAOD::MissingETContainer>();
166 auto metCont_tenacAux = std::make_unique<xAOD::MissingETAuxContainer>();
167 metCont_tenac->setStore( metCont_tenacAux.get() );
168
169
170
172 ATH_CHECK( copyMETContainer( metCont_loose.get(), metCont ) );
173 ATH_CHECK( copyMETContainer( metCont_tight.get(), metCont ) );
174 ATH_CHECK( copyMETContainer( metCont_tghtr.get(), metCont ) );
175 ATH_CHECK( copyMETContainer( metCont_tenac.get(), metCont ) );
176
177
182
183
185 ATH_CHECK( m_metmaker_loose->rebuildJetMET(
"RefJet", softClusKey, softTrkKey, metCont_loose.get(), jets, metCoreCont, helper_loose,
true ) );
186 ATH_CHECK( m_metmaker_tight->rebuildJetMET(
"RefJet", softClusKey, softTrkKey, metCont_tight.get(), jets, metCoreCont, helper_tight,
true ) );
187 ATH_CHECK( m_metmaker_tghtr->rebuildJetMET(
"RefJet", softClusKey, softTrkKey, metCont_tghtr.get(), jets, metCoreCont, helper_tghtr,
true ) );
188 ATH_CHECK( m_metmaker_tenac->rebuildJetMET(
"RefJet", softClusKey, softTrkKey, metCont_tenac.get(), jets, metCoreCont, helper_tenac,
true ) );
189
190
196
201
203
204
205 std::vector<std::string> input_names;
206 std::vector<float> input_values;
207
208 ATH_CHECK( addMETFinal(
"Loose", metCont_loose.get(), input_names, input_values ) );
209
210
215 ATH_CHECK( addMETFinal(
"Tight", metCont_tight.get(), input_names, input_values ) );
216
217 ATH_CHECK( addMETFinal(
"Tighter", metCont_tghtr.get(), input_names, input_values ) );
218 ATH_CHECK( addMETFinal(
"Tenacious", metCont_tenac.get(), input_names, input_values ) );
219
220
222 if(!pvtxs.isValid()){
223 ATH_MSG_ERROR(
"Could not retrieve primary vertex container!");
224 return StatusCode::FAILURE;
225 }
226 int NVx_2Tracks = 0;
227 int NVx_4Tracks = 0;
228 int PV_NTracks = 0;
229 int n_tracks = 0;
231 n_tracks = vx->nTrackParticles();
232 if ( n_tracks>=2 ) NVx_2Tracks++;
233 if ( n_tracks>=4 ) NVx_4Tracks++;
235 }
236 ATH_CHECK( addInputValue(
"ActualMu", actmu, input_names, input_values ) );
237 ATH_CHECK( addInputValue(
"AverageMu", avgmu, input_names, input_values ) );
238 ATH_CHECK( addInputValue(
"NPV_2Tracks", NVx_2Tracks, input_names, input_values ) );
239 ATH_CHECK( addInputValue(
"NPV_4Tracks", NVx_4Tracks, input_names, input_values ) );
240 ATH_CHECK( addInputValue(
"PV_NTracks", PV_NTracks, input_names, input_values ) );
241
242
245 if ( (*metCont)["NetInputDummy"] != NULL ) {
246
247 ATH_MSG_DEBUG(
"NetInputDummy already present in container — erasing and recreating.");
248 auto it = metCont->
find(
"NetInputDummy");
249 if ( it != metCont->
end() ) metCont->
erase(it);
250 }
252 dec_inputnames( *(*metCont)["NetInputDummy"] ) = std::move(input_names);
253 dec_inputvalues( *(*metCont)["NetInputDummy"] ) = std::move(input_values);
254 return StatusCode::SUCCESS;
255 }
256
258 float& met_x, float& met_y, float& sigma_x, float& sigma_y) const
259 {
260
261
263 if ( (*metCont)["NetInputDummy"] == NULL ) {
264 ATH_MSG_ERROR(
"Could not find the NetInputDummy MET object in the container. Did you run rebuildJetMET?" );
265 return StatusCode::FAILURE;
266 }
267
268
269
270 std::vector<float> tmp_inputs = acc_inputvalues(*(*metCont)["NetInputDummy"]);
271 ATH_MSG_VERBOSE(
"Loaded " << tmp_inputs.size() <<
" network inputs" );
272
273
274 if ( (int)tmp_inputs.size() != m_metnetsighandler->getReqSize() ) {
275 ATH_MSG_ERROR(
"The MET container provided " << tmp_inputs.size()
276 << " elements, but the ONNX network needs exactly " << m_metnetsighandler->getReqSize() << "!" );
277 return StatusCode::FAILURE;
278 }
279
280
281 std::vector<float> net_met = m_metnetsighandler->predict( std::move(tmp_inputs) );
282
283
284
285
286
287 met_x = net_met[0];
288 met_y = net_met[1];
289 sigma_x = net_met[2];
290 sigma_y = net_met[3];
291
292 ATH_MSG_DEBUG(
"Writing the Final Network MET: (" << met_x <<
", " << met_y <<
", " << sigma_x <<
", " << sigma_y <<
")" );
293
294 return StatusCode::SUCCESS;
295 }
296
298
299 StatusCode METNetSig::addMETFinal(
const std::string& WP_name,
301 std::vector<std::string>& name_vec,
302 std::vector<float>& val_vec ) const
303 {
304
305 ATH_CHECK( addMETTerm( WP_name, (*met_container)[
"RefJet"], name_vec, val_vec ) );
306 ATH_CHECK( addMETTerm( WP_name, (*met_container)[
"PVSoftTrk"], name_vec, val_vec ) );
307 ATH_CHECK( addMETTerm( WP_name, (*met_container)[
"FinalTrk"], name_vec, val_vec ) );
308 ATH_CHECK( addMETTerm( WP_name, (*met_container)[
"SoftClus"], name_vec, val_vec ) );
309 ATH_CHECK( addMETTerm( WP_name, (*met_container)[
"FinalClus"], name_vec, val_vec ) );
310 return StatusCode::SUCCESS;
311 }
312
313 StatusCode METNetSig::addMETTerm(
const std::string &WP_name,
315 std::vector<std::string>& name_vec,
316 std::vector<float>& val_vec ) const
317 {
318
319 std::string tname = WP_name +
"_" + acc_name(*
met);
320
321
322 ATH_CHECK( addInputValue( tname+
"_mpx",
met->mpx()/1000., name_vec, val_vec ) );
323 ATH_CHECK( addInputValue( tname+
"_mpy",
met->mpy()/1000., name_vec, val_vec ) );
324 ATH_CHECK( addInputValue( tname+
"_sumet",
met->sumet()/1000., name_vec, val_vec ) );
325
326 return StatusCode::SUCCESS;
327 }
328
329 StatusCode METNetSig::addInputValue(
const std::string& var_name,
330 float value,
331 std::vector<std::string>& name_vec,
332 std::vector<float>& val_vec ) const
333 {
334
335
336 ATH_MSG_VERBOSE(
"Adding variable: " << var_name <<
" = " << value <<
" to the network input vector" );
337 name_vec.push_back( var_name );
338 val_vec.push_back( value );
339 return StatusCode::SUCCESS;
340 }
341
344 {
345
346
350
352 blank_met = nullptr;
353 name = acc_name(*old_met);
354 source = acc_source(*old_met);
355 ATH_CHECK( fillMET( blank_met, new_container, name, source ) );
356 *(*new_container)[
name] = *(*old_container)[
name];
357
358
359 dec_constitObjLinks(*(*new_container)[name]) = acc_constitObjLinks(*(*old_container)[name]);
360 }
361
362 return StatusCode::SUCCESS;
363 }
364
366
371 {
372 ATH_MSG_ERROR(
"METNetSig has not overloaded this version of rebuildMET from IMETMaker!\n"
373 "Please only use this method:\n"
374 "StatusCode METMaker::rebuildMET("
375 "const std::string& metKey,\n"
376 "xAOD::Type::ObjectType metType,\n"
377 "xAOD::MissingETContainer* metCont,\n"
378 "const xAOD::IParticleContainer* collection,\n"
379 "xAOD::MissingETAssociationHelper& helper,\n"
380 "MissingETBase::UsageHandler::Policy objScale\n"
381 ")" );
382 return StatusCode::FAILURE;
383 }
384
389 bool,
391
392 {
393 ATH_MSG_ERROR(
"METNetSig has not overloaded this version of rebuildMET from IMETMaker!\n"
394 "Please only use this method:\n"
395 "StatusCode METMaker::rebuildMET("
396 "const std::string& metKey,\n"
397 "xAOD::Type::ObjectType metType,\n"
398 "xAOD::MissingETContainer* metCont,\n"
399 "const xAOD::IParticleContainer* collection,\n"
400 "xAOD::MissingETAssociationHelper& helper,\n"
401 "MissingETBase::UsageHandler::Policy objScale\n"
402 ")" );
403 return StatusCode::FAILURE;
404 }
405
406 StatusCode METNetSig::rebuildJetMET(
const std::string& metJetKey,
407 const std::string& ,
412 bool doJetJVT) const
413 {
414 return rebuildJetMET(metJetKey, "SoftClus", "PVSoftTrk", metCont, jets, metCoreCont, helper, doJetJVT);
415 }
416
424 bool,
425 bool,
426 std::vector<const xAOD::IParticle*>* ) const
427 {
428 ATH_MSG_ERROR(
"METNetSig has not overloaded this version of rebuildJetMET from IMETMaker!\n"
429 "Please use the method with the following arguments:\n"
430 "StatusCode METNetSig::rebuildJetMET(\n"
431 "const std::string& metJetKey,\n"
432 "const std::string& softClusKey,\n"
433 "const std::string& softTrkKey,\n"
434 "xAOD::MissingETContainer* metCont,\n"
435 "const xAOD::JetContainer* jets,\n"
436 "const xAOD::MissingETContainer* metCoreCont,\n"
437 "xAOD::MissingETAssociationHelper& helper,\n"
438 "bool doJetJVT\n"
439 ")" );
440 return StatusCode::FAILURE;
441 }
442
443 StatusCode METNetSig::rebuildTrackMET(
const std::string&,
444 const std::string&,
449 bool ) const
450 {
451 ATH_MSG_ERROR(
"Please dont use the method METNetSig::rebuildTrackMET!\n"
452 "It has no use in METNetSig and is a holdover from it's inheritance from IMETMaker." );
453 return StatusCode::FAILURE;
454 }
455
461 bool ) const
462 {
464 return StatusCode::FAILURE;
465 }
466
470 {
472 return StatusCode::FAILURE;
473 }
474
475}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
ElementLink< xAOD::IParticleContainer > iplink_t
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
iterator erase(iterator position)
Remove element at a given position.
ElementLink implementation for ROOT usage.
Helper class to provide constant type-safe access to aux data.
const_iterator find(const std::string &name) const
Find non-modifiable MET object by name.
::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 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.