31namespace ADD_CMODE(met) {
42 METNet::METNet(
const std::string& name):
45 StatusCode METNet::initialize() {
50 ATH_CHECK(m_jetContainerKey.initialize());
52 if( m_netLocation.empty()){
54 return StatusCode::FAILURE;
57 std::unique_ptr<METNetHandler> metNetHandler = std::make_unique<METNetHandler>( netFilePath );
58 if( metNetHandler->initialize() != 0){
60 return StatusCode::FAILURE;
62 ATH_MSG_INFO(
"Resolved METNet ONNX file at " + netFilePath);
63 m_metNetHandler = std::move(metNetHandler);
65 if(m_metmaker_loose.empty()){
74 if(m_metmaker_tight.empty()){
83 if(m_metmaker_tghtr.empty()){
92 if(m_metmaker_tenac.empty()){
101 return StatusCode::SUCCESS;
104 StatusCode METNet::rebuildMET(
const std::string& metKey,
110 return m_metmaker_tight->rebuildMET( metKey, metType, metCont, collection, helper, objScale );
113 StatusCode METNet::rebuildJetMET(
const std::string&,
114 const std::string& softClusKey,
115 const std::string& softTrkKey,
125 float avgmu = ei->averageInteractionsPerCrossing();
126 float actmu = ei->actualInteractionsPerCrossing();
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() );
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() );
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() );
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() );
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 ) );
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 ) );
181 std::vector<std::string> input_names;
182 std::vector<float> input_values;
184 ATH_CHECK( addMETFinal(
"Loose", metCont_loose.get(), input_names, input_values ) );
191 ATH_CHECK( addMETFinal(
"Tight", metCont_tight.get(), input_names, input_values ) );
193 ATH_CHECK( addMETFinal(
"Tighter", metCont_tghtr.get(), input_names, input_values ) );
194 ATH_CHECK( addMETFinal(
"Tenacious", metCont_tenac.get(), input_names, input_values ) );
199 ATH_MSG_ERROR(
"Could not retrieve primary vertex container!");
200 return StatusCode::FAILURE;
207 n_tracks = vx->nTrackParticles();
208 if ( n_tracks>=2 ) NVx_2Tracks++;
209 if ( n_tracks>=4 ) NVx_4Tracks++;
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 ) );
222 dec_inputnames( *(*metCont)[
"NetInputDummy"] ) = std::move(input_names);
223 dec_inputvalues( *(*metCont)[
"NetInputDummy"] ) = std::move(input_values);
225 return StatusCode::SUCCESS;
228 StatusCode METNet::evaluateNNMET(
const std::string& totalName,
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;
239 std::vector<float> tmp_inputs = acc_inputvalues(*(*metCont)[
"NetInputDummy"]);
240 ATH_MSG_VERBOSE(
"Loaded " << tmp_inputs.size() <<
" network inputs" );
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;
250 std::vector<float> net_met;
251 m_metNetHandler->predict(net_met, tmp_inputs);
256 metFinal->
setMpx( net_met[0] );
257 metFinal->
setMpy( net_met[1] );
259 ATH_MSG_VERBOSE(
"Writing the Final Network MET: (" << net_met[0] <<
", " << net_met[1] <<
")" );
261 return StatusCode::SUCCESS;
264 StatusCode METNet::addMETFinal(
const std::string& WP_name,
266 std::vector<std::string>& name_vec,
267 std::vector<float>& val_vec )
const {
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;
277 StatusCode METNet::addMETTerm(
const std::string &WP_name,
279 std::vector<std::string>& name_vec,
280 std::vector<float>& val_vec )
const {
283 ATH_MSG_ERROR(
"addMETTerm was called with a null pointer for the input MET value!");
284 return StatusCode::FAILURE;
288 std::string tname = WP_name +
"_" +
met->name();
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 ) );
295 return StatusCode::SUCCESS;
298 StatusCode METNet::addInputValue(
const std::string& var_name,
300 std::vector<std::string>& name_vec,
301 std::vector<float>& val_vec )
const {
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;
316 const std::string& name = old_met->name();
318 ATH_CHECK( fillMET( blank_met, new_container, name, old_met->source() ) );
319 *(*new_container)[name] = *(*old_container)[name];
322 dec_constitObjLinks(*(*new_container)[name]) = acc_constitObjLinks(*(*old_container)[name]);
325 return StatusCode::SUCCESS;
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"
342 return StatusCode::FAILURE;
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"
361 return StatusCode::FAILURE;
364 StatusCode METNet::rebuildJetMET(
const std::string& metJetKey,
370 bool doJetJVT)
const {
371 return rebuildJetMET(metJetKey,
"SoftClus",
"PVSoftTrk", metCont, jets, metCoreCont, helper, doJetJVT);
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"
396 return StatusCode::FAILURE;
399 StatusCode METNet::rebuildTrackMET(
const std::string&,
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;
418 return StatusCode::FAILURE;
425 return StatusCode::FAILURE;