ATLAS Offline Software
xAODConfigSvc.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Gaudi/Athena include(s):
6 #include "GaudiKernel/Incident.h"
7 #include "GaudiKernel/IIncidentSvc.h"
8 #include "GaudiKernel/GaudiException.h"
10 
11 // Trigger include(s):
14 
15 // Local include(s):
16 #include "xAODConfigSvc.h"
19 
20 // Boost includes
21 #define BOOST_BIND_GLOBAL_PLACEHOLDERS // Needed to silence Boost pragma message
22 #include <boost/property_tree/ptree.hpp>
23 #include <boost/property_tree/json_parser.hpp>
24 
25 namespace TrigConf {
26 
27  xAODConfigSvc::xAODConfigSvc( const std::string& name, ISvcLocator* svcLoc )
28  : base_class( name, svcLoc ),
29  m_tmcAux( nullptr ), m_tmc( nullptr ), m_menu(),
30  m_ctpConfig(), m_chainList(), m_sequenceList(), m_bgSet() {
31 
32  }
33 
35 
36  // Greet the user:
37  ATH_MSG_INFO( "Initialising" );
38 
39  // Note this is a service, there is NO scheduler propagation of these read handle keys to clients of this service.
40  // We still however use the ReadHandle mechanism to consume the collection, along with validation checks.
41  // Attempting to use this service when no eventKey is available will cause the service to fail.
42  // Attempting to use this service when no eventBGKey is available will return empty bunch group data.
43  CHECK( m_eventKey.initialize() );
44  CHECK( m_eventBGKey.initialize() );
45 
46  CHECK( m_hltMenuKey.initialize() );
47  CHECK( m_l1MenuKey.initialize() );
48 
49  // Set up the callbacks for the service:
50  ServiceHandle< IIncidentSvc > incSvc( "IncidentSvc", name() );
51  CHECK( incSvc.retrieve() );
52  incSvc->addListener( this, IncidentType::BeginEvent, 0,
54 
55  if (m_useInFileMetadata) {
56  // Retrieve the needed service(s):
57  CHECK( m_metaStore.retrieve() );
58 
59  // Set up the callbacks for the service:
60  ServiceHandle< IIncidentSvc > incSvc( "IncidentSvc", name() );
61  incSvc->addListener( this, IncidentType::BeginInputFile, 0,
63 
64  // Internal holder for R2 payloads
65  m_tmcAux = std::make_unique<xAOD::TriggerMenuAuxContainer>();
66  m_tmc = std::make_unique<xAOD::TriggerMenuContainer>();
67  m_tmc->setStore( m_tmcAux.get() );
68 
69  // Internal holders for R3 payloads
70  m_hltJsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
71  m_hltJson = std::make_unique<xAOD::TriggerMenuJsonContainer>();
72  m_hltJson->setStore( m_hltJsonAux.get() );
73 
74  m_hltmonitoringJsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
75  m_hltmonitoringJson = std::make_unique<xAOD::TriggerMenuJsonContainer>();
77 
78  m_l1JsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
79  m_l1Json = std::make_unique<xAOD::TriggerMenuJsonContainer>();
80  m_l1Json->setStore( m_l1JsonAux.get() );
81 
82  m_hltpsJsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
83  m_hltpsJson = std::make_unique<xAOD::TriggerMenuJsonContainer>();
84  m_hltpsJson->setStore( m_hltpsJsonAux.get() );
85 
86  m_l1psJsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
87  m_l1psJson = std::make_unique<xAOD::TriggerMenuJsonContainer>();
88  m_l1psJson->setStore( m_l1psJsonAux.get() );
89 
90  m_bgJsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
91  m_bgJson = std::make_unique<xAOD::TriggerMenuJsonContainer>();
92  m_bgJson->setStore( m_bgJsonAux.get() );
93  }
94 
98 
99  // Reset the internal flag:
100  m_isInFailure = false;
101 
102  // Return gracefully:
103  return StatusCode::SUCCESS;
104  }
105 
107 
108  // Return gracefully:
109  return StatusCode::SUCCESS;
110  }
111 
113 
114  // Long-term-support interface for (including Run 2 AODs)
115  if( m_isInFailure ) {
117  << "Trigger menu not loaded";
118  throw GaudiException( "Service not initialised correctly",
119  "TrigConf::xAODConfigSvc::ctpConfig",
120  StatusCode::FAILURE );
121  }
122 
123  // Return the slot-specific pointer:
124  return m_ctpConfig.get();
125  }
126 
128 
129  // Long-term-support interface (including Run 2 AODs)
130  if( m_isInFailure ) {
132  << "Trigger menu not loaded";
133  throw GaudiException( "Service not initialised correctly",
134  "TrigConf::xAODConfigSvc::bunchGroupSet",
135  StatusCode::FAILURE );
136  }
137 
138  // Return the slot-specific pointer:
139  return m_bgSet.get();
140  }
141 
142 
144 
145  // Long-term-support interface (including Run 2 AODs)
146  if( m_isInFailure ) {
148  << "Trigger menu not loaded";
149  throw GaudiException( "Service not initialised correctly",
150  "TrigConf::xAODConfigSvc::chains",
151  StatusCode::FAILURE );
152  }
153 
154  // Return the slot-specifc object:
155  return *(m_chainList.get());
156  }
157 
159 
160  // Long-term-support interface (including Run 2 AODs)
161  if( m_isInFailure ) {
163  << "Trigger menu not loaded";
164  throw GaudiException( "Service not initialised correctly",
165  "TrigConf::xAODConfigSvc::chains",
166  StatusCode::FAILURE );
167  }
168 
169  // Return the slot-specific object:
170  return *(m_sequenceList.get());
171  }
172 
174  if (!m_useInFileMetadata) {
175 
176  SG::ReadHandle<HLTMenu> hltMenuHandle(m_hltMenuKey); // No context - Detector Store
177  if( !hltMenuHandle.isValid() ) {
178  REPORT_MESSAGE( MSG::WARNING )
179  << "Unable to load " << m_hltMenuKey.key() << " from Detector Store." << endmsg;
181  } else {
182  return hltMenuHandle->smk();
183  }
184 
185  } else if (m_menuJSONContainerAvailable) {
186 
187  // Run3: From in-file JSON metadata or JSON from conditions store
188  return m_currentHlt.get()->smk();
189 
190  } else {
191 
192  // Legacy support for R2 AODs
193  if( ! m_menu.get()->m_ptr ) {
195  << "Trigger menu not yet known. Configuration key not returned.";
196  throw GaudiException( "Service not initialised correctly",
197  "TrigConf::xAODConfigSvc::masterKey",
198  StatusCode::FAILURE );
199  return 0;
200  }
201 
202  // Return the key from the slot-specific metadata object:
203  return m_menu.get()->m_ptr->smk();
204 
205  }
206  }
207 
209  if (!m_useInFileMetadata) {
210 
211  const bool firstEvent = !m_currentL1ps.get()->isInitialized();
212  if (firstEvent) {
214  }
215 
217  if( !l1psRCH.isValid() ) {
218  REPORT_MESSAGE( MSG::WARNING )
219  << "Unable to load " << m_L1PrescaleSetKey.key() << " from Conditions Store." << endmsg;
221  } else {
222  return l1psRCH->psk();
223  }
224 
225  } else if (m_menuJSONContainerAvailable) {
226 
227  // Run3: From in-file JSON metadata or JSON from conditions store
228  return m_currentL1ps.get()->psk();
229 
230  } else {
231 
232  // Legacy support for R2 AODs
233  if( ! m_menu.get()->m_ptr ) {
234  REPORT_MESSAGE( MSG::ERROR )
235  << "Trigger menu not yet known. Configuration key not returned.";
236  throw GaudiException( "Service not initialised correctly",
237  "TrigConf::xAODConfigSvc::lvl1PrescaleKey",
238  StatusCode::FAILURE );
239  return 0;
240  }
241 
242  // Return the key from the slot-specific metadata object:
243  return m_menu.get()->m_ptr->l1psk();
244  }
245  }
246 
248  if (!m_useInFileMetadata) {
249  const bool firstEvent = !m_currentBg.get()->isInitialized();
250  if (firstEvent)
253  if (!l1BGS.isValid())
254  {
255  REPORT_MESSAGE( MSG::WARNING )
256  << "Unable to load " << m_L1BunchGroupSetKey.key() << " from Conditions Store." << endmsg;
258  }
259  else
260  return l1BGS->bgsk();
261  } else if (m_menuJSONContainerAvailable)
262  return m_currentBg.get()->bgsk();
263  else {
265  << "There's no way to access the bunch group set key from a legacy AOD!" << endmsg;
267  }
268  }
269 
271  if (!m_useInFileMetadata) {
272 
273  const bool firstEvent = !m_currentHltps.get()->isInitialized();
274  if (firstEvent) {
276  }
277 
279  if( !hltpsRCH.isValid() ) {
280  REPORT_MESSAGE( MSG::WARNING )
281  << "Unable to load " << m_HLTPrescaleSetKey.key() << " from Conditions Store." << endmsg;
283  } else {
284  return hltpsRCH->psk();
285  }
286 
287  } else if (m_menuJSONContainerAvailable) {
288 
289  // Run3: From in-file JSON metadata or JSON from conditions store
290  return m_currentHltps.get()->psk();
291 
292  } else {
293 
294  // Legacy support for R2 AODs
295  if( ! m_menu.get()->m_ptr ) {
297  << "Trigger menu not yet known. Configuration key not returned.";
298  throw GaudiException( "Service not initialised correctly",
299  "TrigConf::xAODConfigSvc::hltPrescaleKey",
300  StatusCode::FAILURE );
301  return 0;
302  }
303 
304  // Return the key from the slot-specific metadata object:
305  return m_menu.get()->m_ptr->hltpsk();
306 
307  }
308  }
309 
310  const HLTMenu& xAODConfigSvc::hltMenu(const EventContext& ctx) const {
311  if (!m_useInFileMetadata) {
312  SG::ReadHandle<HLTMenu> hltMenuHandle(m_hltMenuKey, ctx);
313  if( hltMenuHandle.isValid() ) {
314  return *hltMenuHandle;
315  }
316  }
318  REPORT_MESSAGE( MSG::FATAL ) << "Run 3 hltMenu JSON not loaded." << endmsg;
319  throw GaudiException( "Service not initialised correctly",
320  "TrigConf::xAODConfigSvc::hltMenu",
321  StatusCode::FAILURE );
322  }
323  // Run3: From in-file JSON metadata or JSON from detector store
324  return *(m_currentHlt.get(ctx));
325  }
326 
327  const HLTMonitoring& xAODConfigSvc::hltMonitoring(const EventContext& ctx) const {
329  REPORT_MESSAGE( MSG::FATAL ) << "Run 3 hltMonitoring JSON not loaded." << endmsg;
330  throw GaudiException( "Service not initialised correctly",
331  "TrigConf::xAODConfigSvc::hltMenu",
332  StatusCode::FAILURE );
333  }
334  // Run3: From in-file JSON metadata
335  return *(m_currentHltmonitoring.get(ctx));
336  }
337 
338  const L1Menu& xAODConfigSvc::l1Menu(const EventContext& ctx) const {
339  if (!m_useInFileMetadata) {
340  SG::ReadHandle<L1Menu> l1MenuHandle(m_l1MenuKey, ctx);
341  if( l1MenuHandle.isValid() ) {
342  return *l1MenuHandle;
343  }
344  }
346  REPORT_MESSAGE( MSG::FATAL ) << "Run 3 l1Menu JSON not loaded." << endmsg;
347  throw GaudiException( "Service not initialised correctly",
348  "TrigConf::xAODConfigSvc::l1Menu",
349  StatusCode::FAILURE );
350  }
351  // Run3: From in-file JSON metadata or JSON from detector store
352  return *(m_currentL1.get(ctx));
353  }
354 
355  const HLTPrescalesSet& xAODConfigSvc::hltPrescalesSet(const EventContext& ctx) const {
356  if (!m_useInFileMetadata) {
358  if( hltpsRCH.isValid() ) {
359  return **hltpsRCH;
360  }
361  }
363  REPORT_MESSAGE( MSG::FATAL ) << "Run 3 hltPrescalesSet JSON not loaded." << endmsg;
364  throw GaudiException( "Service not initialised correctly",
365  "TrigConf::xAODConfigSvc::hltPrescalesSet",
366  StatusCode::FAILURE );
367  }
368  // Run3: From in-file JSON metadata or JSON from conditions store
369  return *(m_currentHltps.get(ctx));
370  }
371 
372  const L1PrescalesSet& xAODConfigSvc::l1PrescalesSet(const EventContext& ctx) const {
373  if (!m_useInFileMetadata) {
375  if( l1psRCH.isValid() ) {
376  return **l1psRCH;
377  }
378  }
380  REPORT_MESSAGE( MSG::FATAL ) << "Run 3 l1PrescalesSet JSON not loaded." << endmsg;
381  throw GaudiException( "Service not initialised correctly",
382  "TrigConf::xAODConfigSvc::l1PrescalesSet",
383  StatusCode::FAILURE );
384  }
385  // Run3: From in-file JSON metadata or JSON from conditions store
386  return *(m_currentL1ps.get(ctx));
387  }
388 
389  const L1BunchGroupSet& xAODConfigSvc::l1BunchGroupSet(const EventContext& ctx) const {
390  if (!m_useInFileMetadata) {
392  if( l1BGS.isValid() )
393  return **l1BGS;
394  }
396  REPORT_MESSAGE( MSG::FATAL ) << "Run 3 l1BunchGroupSet JSON not loaded." << endmsg;
397  throw GaudiException( "Service not initialised correctly",
398  "TrigConf::xAODConfigSvc::l1BunchGroupSet",
399  StatusCode::FAILURE );
400  }
401  // Run3: From in-file JSON metadata or JSON from conditions store
402  return *(m_currentBg.get(ctx));
403  }
404 
405  void xAODConfigSvc::handle( const Incident& inc ) {
406 
407  // Tell the user what we're doing:
408  REPORT_MESSAGE( MSG::DEBUG ) << "Callback received with incident: "
409  << inc.type() << endmsg;
410 
411  // If it's a file-beginning incident, let's read in the
412  // metadata object:
413  if( inc.type() == IncidentType::BeginInputFile ) {
414  if( readMetadata().isFailure() && m_stopOnFailure ) {
416  << "Couldn't read in the input file's metadata";
417  throw GaudiException( "Couldn't read in the input file's "
418  "metadata",
419  "TrigConf::xAODConfigSvc::handle",
420  StatusCode::FAILURE );
421  return;
422  }
423  }
424  // If it's an event-beginning incident, let's make sure that the
425  // correct menu is cached:
426  else if( inc.type() == IncidentType::BeginEvent ) {
427  if( prepareEvent().isFailure() && m_stopOnFailure ) {
429  << "Couldn't prepare the trigger configuration for the "
430  << "current event";
431  throw GaudiException( "Couldn't prepare the trigger configuration "
432  "for the current event",
433  "TrigConf::xAODConfigSvc::handle",
434  StatusCode::FAILURE );
435  return;
436  }
437  }
438  // We got some strange incident...
439  else {
440  REPORT_MESSAGE( MSG::WARNING ) << "Unknown incident type received: "
441  << inc.type() << endmsg;
442  return;
443  }
444 
445  // Return gracefully:
446  return;
447  }
448 
450 
451  // Only one thread at a time is allowed to process a new file being opened
452  // and this should only happen when it is not being iterated over
453  // as part of the BeginEvent incident.
454  std::unique_lock lockUnique(m_sharedMutex);
455 
458 
459  // Read the R2 metadata object...
460  const xAOD::TriggerMenuContainer* input_tmc = nullptr;
462  or m_metaStore->retrieve( input_tmc, m_metaName ).isFailure() )
463  {
465  }
466 
467  // Read the R3 metadata object...
468  const xAOD::TriggerMenuJsonContainer* input_hlt = nullptr;
469  const xAOD::TriggerMenuJsonContainer* input_hltmonitoring = nullptr;
470  const xAOD::TriggerMenuJsonContainer* input_l1 = nullptr;
471  const xAOD::TriggerMenuJsonContainer* input_hltps = nullptr;
472  const xAOD::TriggerMenuJsonContainer* input_l1ps = nullptr;
473  const xAOD::TriggerMenuJsonContainer* input_bg = nullptr;
475  or m_metaStore->retrieve( input_hlt, m_metaNameJSON_hlt ).isFailure() )
476  {
478  }
480  or m_metaStore->retrieve( input_hltmonitoring, m_metaNameJSON_hltmonitoring ).isFailure() )
481  {
482  // m_menuJSONContainerAvailable = false;
483  // Currently planning on only storing these data in MC. Hence this has to be an optional input.
484  }
486  or m_metaStore->retrieve( input_l1, m_metaNameJSON_l1 ).isFailure() )
487  {
489  }
491  or m_metaStore->retrieve( input_hltps, m_metaNameJSON_hltps ).isFailure() )
492  {
494  }
496  or m_metaStore->retrieve( input_l1ps, m_metaNameJSON_l1ps ).isFailure() )
497  {
499  }
501  or m_metaStore->retrieve( input_bg, m_metaNameJSON_bg ).isFailure() )
502  {
503  // m_menuJSONContainerAvailable = false;
504  // This was not written up to the end of 2021, we have to make it optional for at least a while
505  }
506 
508  // Update the internal flag:
509  m_isInFailure = true;
510  // Decide what to do:
511  if( m_stopOnFailure ) {
512  REPORT_MESSAGE( MSG::FATAL ) << "Couldn't retrieve xAOD::TriggerMenuContainer or xAOD::TriggerMenuJsonContainer(s)" << endmsg;
513  return StatusCode::FAILURE;
514  } else {
515  REPORT_MESSAGE( MSG::WARNING ) << "Couldn't retrieve xAOD::TriggerMenuContainer or xAOD::TriggerMenuJsonContainer(s)" << endmsg;
516  return StatusCode::SUCCESS;
517  }
518  }
519 
520  // From file #2 and onward, check for mixed-messages from the input files.
521  // Note from the check just above, we know that we have at least one type of data available on this input file
522  //
523  // We do this as we currently have just two "available" flags, for the two data formats. Not two per slot
525  m_isInFailure = true;
528  if( m_stopOnFailure ) {
530  << "In this input file we found xAOD::TriggerMenuJsonContainer(s), but no xAOD::TriggerMenuContainer. "
531  << "This is inconsistent with previous input files." << endmsg;
532  return StatusCode::FAILURE;
533  } else {
534  REPORT_MESSAGE( MSG::WARNING )
535  << "In this input file we found xAOD::TriggerMenuJsonContainer(s), but no xAOD::TriggerMenuContainer. "
536  << "This is inconsistent with previous input files." << endmsg;
537  return StatusCode::SUCCESS;
538  }
539  }
541  m_isInFailure = true;
544  if( m_stopOnFailure ) {
546  << "In this input file we found xAOD::TriggerMenuContainer, but no xAOD::TriggerMenuJsonContainer. "
547  << "This is inconsistent with previous input files." << endmsg;
548  return StatusCode::FAILURE;
549  } else {
550  REPORT_MESSAGE( MSG::WARNING )
551  << "In this input file we found xAOD::TriggerMenuContainer, but no xAOD::TriggerMenuJsonContainer. "
552  << "This is inconsistent with previous input files." << endmsg;
553  return StatusCode::SUCCESS;
554  }
555  }
556 
557  // Let the user know what happened:
558  REPORT_MESSAGE( MSG::DEBUG ) << "Loaded trigger configuration metadata container(s)" << endmsg;
559 
560  // If available, give preference to the R3 format
562 
563  copyMetadataToPersonalStore(input_hlt, m_hltJson.get());
564  if (input_hltmonitoring) {
565  copyMetadataToPersonalStore(input_hltmonitoring, m_hltmonitoringJson.get());
566  }
567  copyMetadataToPersonalStore(input_l1, m_l1Json.get());
568  copyMetadataToPersonalStore(input_hltps, m_hltpsJson.get());
569  copyMetadataToPersonalStore(input_l1ps, m_l1psJson.get());
570  if (input_bg) {
571  copyMetadataToPersonalStore(input_bg, m_bgJson.get());
572  }
573 
574  return StatusCode::SUCCESS;
575 
576  } else if (m_triggerMenuContainerAvailable) { // Otherwise load the Run 2 format
577 
578  // A little sanity check:
579  if( ! input_tmc->size() ) {
580  REPORT_MESSAGE( MSG::WARNING ) << "No trigger configurations are available on the input" << endmsg;
581  return StatusCode::SUCCESS;
582  }
583 
584  // Copy in new menus
585  for ( const xAOD::TriggerMenu* inputMenu : *input_tmc ) {
586  bool alreadyHave = false;
587  for( const xAOD::TriggerMenu* existingMenu : *m_tmc ) {
588  if (xAODKeysMatch(inputMenu, existingMenu)) {
589  alreadyHave = true;
590  break;
591  }
592  }
593  if (alreadyHave) {
594  continue;
595  }
596  // Copy this menu into the service's internal cache of all menus
597  xAOD::TriggerMenu* newMenu = new xAOD::TriggerMenu();
598  m_tmc->push_back( newMenu ); // Note: 'newMenu' is now memory managed by m_tmc
599  *newMenu = *inputMenu;
600  REPORT_MESSAGE( MSG::DEBUG ) << "Imported new configuration: SMK = " << newMenu->smk()
601  << ", L1PSK = " << newMenu->l1psk()
602  << ", HLTPSK = " << newMenu->hltpsk() << endmsg;
603  }
604 
605  return StatusCode::SUCCESS;
606 
607  } // m_menuJSONContainerAvailable or m_triggerMenuContainerAvailable
608 
609  //Should never get here (due to check above)
610  ATH_MSG_ERROR( "Both m_menuJSONContainerAvailable and m_triggerMenuContainerAvailable are false" );
611  return StatusCode::FAILURE;
612  }
613 
615  for ( const xAOD::TriggerMenuJson* inputTriggerMenuJson : *input ) {
616  bool alreadyHave = false;
617  for( const xAOD::TriggerMenuJson* existingTriggerMenuJson : *existing ) {
618  if (inputTriggerMenuJson->key() == existingTriggerMenuJson->key()) {
619  alreadyHave = true;
620  break;
621  }
622  }
623  if (alreadyHave) {
624  continue;
625  }
626  // Copy this menu JSON into the service's internal cache of all menus
627  xAOD::TriggerMenuJson* newTriggerMenuJson = new xAOD::TriggerMenuJson();
628  existing->push_back( newTriggerMenuJson ); // Note: 'newTriggerMenuJson' is now memory managed by 'existing'
629  *newTriggerMenuJson = *inputTriggerMenuJson; // Perform xAOD copy
630  REPORT_MESSAGE( MSG::DEBUG ) << "Imported new configuration: Name = " << newTriggerMenuJson->name() << " Key = " << newTriggerMenuJson->key() << endmsg;
631  }
632  }
633 
635 
636  // Can the incident service provide this to us?
637  const EventContext& context = Gaudi::Hive::currentContext();
638 
639  if (!m_useInFileMetadata) { // Run 3 RAWtoALL decoding mode
640  return prepareEventRun3Athena(context);
641  }
642 
643  // Otherwise we're dealing with in-file data
644  // Read the current event's trigger keys:
646  const xAOD::TrigConfKeys* keys = nullptr;
647  if( keysRH.isValid() ) {
648  keys = keysRH.cptr();
649  } else {
650  // Update the internal flag:
651  m_isInFailure = true;
652  // Decide what to do:
653  if( m_stopOnFailure ) {
655  << "Coudln't retrieve xAOD::TrigConfKeys";
656  return StatusCode::FAILURE;
657  } else {
658  REPORT_MESSAGE( MSG::DEBUG ) << "Coudln't retrieve xAOD::TrigConfKeys" << endmsg;
659  return StatusCode::SUCCESS;
660  }
661  }
662 
664  const xAOD::BunchConfKey* bgKey = nullptr;
665  if (bgKeyRH.isValid()) {
666  bgKey = bgKeyRH.cptr();
667  } // Note: This is optional, no errors if it cannot be found
668 
669  if (m_menuJSONContainerAvailable) { // Run 3 AOD decoding mode
670  return prepareEventxAODTriggerMenuJson(keys, bgKey, context);
671  } else if (m_triggerMenuContainerAvailable) { // Run 2 AOD decoding mode
672  return prepareEventxAODTriggerMenu(keys, context);
673  }
674  ATH_MSG_ERROR( "Both m_menuJSONContainerAvailable and m_triggerMenuContainerAvailable are false" );
675  return StatusCode::FAILURE;
676  }
677 
678 
680  const xAOD::TriggerMenu* loadedMenuInSlot = m_menu.get(context)->m_ptr;
681 
682  // Check if we have the correct menu already:
683  if( loadedMenuInSlot != nullptr && xAODKeysMatch( keys, loadedMenuInSlot ) ) {
685  << "Configuration matches the loaded one, nothing to do." << endmsg;
686  return StatusCode::SUCCESS;
687  }
688 
689  // If not, let's look for the correct configuration:
690  // Open a shared lock. OK for multiple events to search at the same time,
691  // but prevent the extension of m_tmc from a BeginInputFile incident.
692  std::shared_lock lockShared(m_sharedMutex);
693 
696  for( ; menu_itr != menu_end; ++menu_itr ) {
697  // Check if this is the menu we're looking for:
698  if( ! xAODKeysMatch( keys, *menu_itr ) ) continue;
699  // Remember it's pointer:
700  loadedMenuInSlot = *menu_itr;
701  m_menu.get(context)->m_ptr = loadedMenuInSlot;
702  // Cache the menu's configuration.
703  CTPConfig& ctpConfig = *(m_ctpConfig.get(context));
704  HLTChainList& chainList = *(m_chainList.get(context));
705  HLTSequenceList& sequenceList = *(m_sequenceList.get(context));
706  BunchGroupSet& bgSet = *(m_bgSet.get(context));
707  CHECK( prepareTriggerMenu( loadedMenuInSlot, ctpConfig,
708  chainList, sequenceList,
709  bgSet, msg() ) );
710  REPORT_MESSAGE( MSG::DEBUG ) << "ctpConfig.menu().size() = " << ctpConfig.menu().size()
711  << " chainList.size() = " << chainList.size()
712  << " sequenceList.size() = " << sequenceList.size()
713  << " bgSet.bunchGroups().size() = " << bgSet.bunchGroups().size() << endmsg;
714  // We're done:
715  return StatusCode::SUCCESS;
716  }
717 
718  // Apparently we didn't find the correct menu!
720  << "Couldn't find configuration for current event (SMK:"
721  << keys->smk() << ", L1PSK:" << keys->l1psk()
722  << ", HLTPSK:" << keys->hltpsk() << ")";
723  return StatusCode::FAILURE;
724  }
725 
726 
727  StatusCode xAODConfigSvc::prepareEventRun3Athena(const EventContext& context) {
728  HLTMenu& currentHlt = *(m_currentHlt.get(context));
729  L1Menu& currentL1 = *(m_currentL1.get(context));
730  HLTPrescalesSet& currentHltps = *(m_currentHltps.get(context));
731  L1PrescalesSet& currentL1ps = *(m_currentL1ps.get(context));
732  L1BunchGroupSet& currentBg = *(m_currentBg.get(context));
733 
734  // There is only the beginEvent incident when reading the data from the Detector and Conditions stores.
735  // So only one thread may be active at one time on these (slot-specific) objects. Hence we do not need to lock like
736  // we do when we also have to deal with the possibility of concurrent beginFile incidents.
737 
738  bool validConfig = true;
739 
740  // In the beginEvent incident _before_ the first event, we cannot read the prescales (conditions) but we can still
741  // read the menu (detector store).
742  const bool firstEvent = (!currentHlt.isInitialized() and !currentHltps.isInitialized());
743 
744  SG::ReadHandle<HLTMenu> hltMenuHandle(m_hltMenuKey, context);
745  if( !hltMenuHandle.isValid() ) {
746  REPORT_MESSAGE( MSG::WARNING )
747  << "Unable to load " << m_hltMenuKey.key() << " from Detector Store." << endmsg;
748  } else {
749  if (!currentHlt.isInitialized() or currentHlt.smk() != hltMenuHandle->smk()) {
750  validConfig = false;
751  currentHlt.clear();
752  currentHlt.setData( hltMenuHandle->data() );
753  currentHlt.setSMK( hltMenuHandle->smk() );
754  }
755  }
756 
757  SG::ReadHandle<L1Menu> l1MenuHandle(m_l1MenuKey, context);
758  if( !l1MenuHandle.isValid() ) {
759  REPORT_MESSAGE( MSG::WARNING )
760  << "Unable to load " << m_l1MenuKey.key() << " from Detector Store." << endmsg;
761  } else {
762  if (!currentL1.isInitialized() or currentL1.smk() != l1MenuHandle->smk()) {
763  validConfig = false;
764  currentL1.clear();
765  currentL1.setData( l1MenuHandle->data() );
766  currentL1.setSMK( l1MenuHandle->smk() );
767  }
768  }
769 
770  if (firstEvent) {
771 
772  REPORT_MESSAGE( MSG::WARNING )
773  << "L1 and HLT prescales will not be available via the TrigConf::xAODConfigSvc in the first "
774  << "event when running with UseInFileMetadata=False" << endmsg;
775 
776  } else {
777 
779  if( !l1psRCH.isValid() ) {
780  REPORT_MESSAGE( MSG::WARNING )
781  << "Unable to load " << m_L1PrescaleSetKey.key() << " from Conditions Store." << endmsg;
782  } else {
783  if (!currentL1ps.isInitialized() or currentL1ps.psk() != l1psRCH->psk()) {
784  validConfig = false;
785  currentL1ps.clear();
786  currentL1ps.setData( l1psRCH->data() );
787  currentL1ps.setPSK( l1psRCH->psk() );
788  }
789  }
790 
792  if( !hltpsRCH.isValid() ) {
793  REPORT_MESSAGE( MSG::WARNING )
794  << "Unable to load " << m_HLTPrescaleSetKey.key() << " from Conditions Store." << endmsg;
795  } else {
796  if (!currentHltps.isInitialized() or currentHltps.psk() != hltpsRCH->psk()) {
797  validConfig = false;
798  currentHltps.clear();
799  currentHltps.setData( hltpsRCH->data() );
800  currentHltps.setPSK( hltpsRCH->psk() );
801  }
802  }
803 
804  // Bunchgroup data are not accessible via this service in this mode as the conditions alg uses a different
805  // format to the JSON interface used by the trigger.
806 
807  }
808 
809  if (validConfig) {
811  << "Configuration matches the loaded one, nothing to do." << endmsg;
812  return StatusCode::SUCCESS;
813  }
814 
815  CTPConfig& ctpConfig = *(m_ctpConfig.get(context));
816  HLTChainList& chainList = *(m_chainList.get(context));
817  HLTSequenceList& sequenceList = *(m_sequenceList.get(context));
818  BunchGroupSet& bgSet = *(m_bgSet.get(context));
819 
820  // Copy data into legacy long-term-support interfaces
821  CHECK( prepareTriggerMenu( currentHlt,
822  currentL1,
823  currentHltps,
824  currentL1ps,
825  currentBg,
826  ctpConfig,
827  chainList,
828  sequenceList,
829  bgSet,
830  msg() ) );
831 
832  REPORT_MESSAGE( MSG::INFO ) << "Loaded Trigger configuration from Conditions Store and Detector Store:"
833  << " SMK = " << (currentHlt.isInitialized() ? std::to_string(currentHlt.smk()) : std::string("UNKNOWN"))
834  << ", L1PSK = " << (currentL1ps.isInitialized() ? std::to_string(currentL1ps.psk()) : std::string("UNKNOWN"))
835  << ", HLTPSK = " << (currentHltps.isInitialized() ? std::to_string(currentHltps.psk()) : std::string("UNKNOWN"))
836  << ", BGSK = " << (currentBg.isInitialized() ? std::to_string(currentBg.bgsk()) : std::string("UNKNOWN")) << endmsg;
837 
838  REPORT_MESSAGE( MSG::DEBUG ) << "ctpConfig.menu().size() = " << ctpConfig.menu().size()
839  << " chainList.size() = " << chainList.size()
840  << " sequenceList.size() = " << sequenceList.size()
841  << " bgSet.bunchGroups().size() = " << bgSet.bunchGroups().size() << endmsg;
842 
843  return StatusCode::SUCCESS;
844  }
845 
846 
847 
849  const xAOD::TriggerMenuJson* loadedHltJson = m_currentHltJson.get(context)->m_ptr;
850  const xAOD::TriggerMenuJson* loadedL1Json = m_currentL1Json.get(context)->m_ptr;
851  const xAOD::TriggerMenuJson* loadedHltpsJson = m_currentHltpsJson.get(context)->m_ptr;
852  const xAOD::TriggerMenuJson* loadedL1psJson = m_currentL1psJson.get(context)->m_ptr;
853  const xAOD::TriggerMenuJson* loadedBgJson = m_currentBgJson.get(context)->m_ptr;
854 
855  bool validConfig = true;
856  if (loadedHltJson == nullptr || loadedHltJson->key() != keys->smk()) {
857  validConfig = false;
858  }
859  // The check on loadedHltJson is good also for loadedHltmonitoringJson
860  if (loadedL1Json == nullptr || loadedL1Json->key() != keys->smk()) {
861  validConfig = false;
862  }
863  if (loadedHltpsJson == nullptr || loadedHltpsJson->key() != keys->hltpsk()) {
864  validConfig = false;
865  }
866  if (loadedL1psJson == nullptr || loadedL1psJson->key() != keys->l1psk()) {
867  validConfig = false;
868  }
869  if (bgKey) {
870  if (loadedBgJson == nullptr || loadedBgJson->key() != static_cast<unsigned int>(bgKey->id())) {
871  validConfig = false;
872  }
873  }
874 
875  if (validConfig) {
877  << "Configuration matches the loaded one, nothing to do." << endmsg;
878  return StatusCode::SUCCESS;
879  }
880 
881  // If not, let's look for the correct configuration:
882  // Open a shared lock. OK for multiple events to search at the same time,
883  // but prevent the extension of m_hltJson et. al. from a BeginInputFile incident.
884  std::shared_lock lockShared(m_sharedMutex);
885 
886  TriggerMenuJsonPtrWrapper& currentHltJson = *(m_currentHltJson.get(context));
887  TriggerMenuJsonPtrWrapper& currentHltmonitoringJson = *(m_currentHltmonitoringJson.get(context));
888  TriggerMenuJsonPtrWrapper& currentL1Json = *(m_currentL1Json.get(context));
889  TriggerMenuJsonPtrWrapper& currentHltpsJson = *(m_currentHltpsJson.get(context));
890  TriggerMenuJsonPtrWrapper& currentL1psJson = *(m_currentL1psJson.get(context));
891  TriggerMenuJsonPtrWrapper& currentBgJson = *(m_currentBgJson.get(context));
892 
893  TrigConf::HLTMenu& currentHlt = *(m_currentHlt.get(context));
894  TrigConf::HLTMonitoring& currentHltmonitoring = *(m_currentHltmonitoring.get(context));
895  TrigConf::L1Menu& currentL1 = *(m_currentL1.get(context));
896  TrigConf::HLTPrescalesSet& currentHltps = *(m_currentHltps.get(context));
897  TrigConf::L1PrescalesSet& currentL1ps = *(m_currentL1ps.get(context));
898  TrigConf::L1BunchGroupSet& currentBg = *(m_currentBg.get(context));
899 
900  ATH_CHECK( loadPtree("HLT Menu", m_hltJson.get(), keys->smk(), currentHltJson, currentHlt) );
901  ATH_CHECK( loadPtree("HLT Monitoring", m_hltmonitoringJson.get(), keys->smk(), currentHltmonitoringJson, currentHltmonitoring, /*optional=*/true) );
902  ATH_CHECK( loadPtree("L1 Menu", m_l1Json.get(), keys->smk(), currentL1Json, currentL1) );
903  ATH_CHECK( loadPtree("HLT Prescales", m_hltpsJson.get(), keys->hltpsk(), currentHltpsJson, currentHltps) );
904  ATH_CHECK( loadPtree("L1 Prescales", m_l1psJson.get(), keys->l1psk(), currentL1psJson, currentL1ps) );
905  if (bgKey) {
906  ATH_CHECK( loadPtree("Bunchgroups", m_bgJson.get(), bgKey->id(), currentBgJson, currentBg) );
907  }
908 
909  // Loading the payload doesn't additionally let the object know about its own key. We can load this in now too.
910  // The current*Json objects were updated by loadPtree to point to the entry with the correct key.
911  // We don't set this in loadPtree as the poperties are on the derived objects, not the base DataStructure.
912  currentHlt.setSMK( currentHltJson.m_ptr->key() );
913  if (currentHltmonitoringJson.m_ptr) {
914  currentHltmonitoring.setSMK( currentHltmonitoringJson.m_ptr->key() );
915  }
916  currentL1.setSMK( currentL1Json.m_ptr->key() );
917  currentHltps.setPSK( currentHltpsJson.m_ptr->key() );
918  currentL1ps.setPSK( currentL1psJson.m_ptr->key() );
919  if (bgKey) {
920  currentBg.setBGSK( currentBgJson.m_ptr->key() );
921  }
922 
923  CTPConfig& ctpConfig = *(m_ctpConfig.get(context));
924  HLTChainList& chainList = *(m_chainList.get(context));
925  HLTSequenceList& sequenceList = *(m_sequenceList.get(context));
926  BunchGroupSet& bgSet = *(m_bgSet.get(context));
927 
928  // Copy data into legacy long-term-support interfaces
929  CHECK( prepareTriggerMenu( currentHlt,
930  currentL1,
931  currentHltps,
932  currentL1ps,
933  currentBg,
934  ctpConfig,
935  chainList,
936  sequenceList,
937  bgSet,
938  msg() ) );
939 
940  REPORT_MESSAGE( MSG::INFO ) << "Loaded xAOD::TriggerMenuJson configuration:"
941  << " SMK = " << keys->smk()
942  << ", L1PSK = " << keys->l1psk()
943  << ", HLTPSK = " << keys->hltpsk()
944  << ", BGSK = " << (bgKey ? std::to_string(bgKey->id()) : std::string("UNKNOWN")) << endmsg;
945 
946  REPORT_MESSAGE( MSG::DEBUG ) << "ctpConfig.menu().size() = " << ctpConfig.menu().size()
947  << " chainList.size() = " << chainList.size()
948  << " sequenceList.size() = " << sequenceList.size()
949  << " bgSet.bunchGroups().size() = " << bgSet.bunchGroups().size() << endmsg;
950 
951  return StatusCode::SUCCESS;
952 
953  }
954 
955  StatusCode xAODConfigSvc::loadPtree(const std::string& humanName,
956  const xAOD::TriggerMenuJsonContainer* metaContainer,
957  const uint32_t keyToCheck,
958  TriggerMenuJsonPtrWrapper& cacheOfLoadedMenuPtr,
959  DataStructure& dataStructure,
960  const bool optional) {
961  xAOD::TriggerMenuJsonContainer::const_iterator menu_itr = metaContainer->begin();
962  xAOD::TriggerMenuJsonContainer::const_iterator menu_end = metaContainer->end();
963  const xAOD::TriggerMenuJson* ptrToLocatedMenu = nullptr;
964  cacheOfLoadedMenuPtr.m_ptr = nullptr;
965  for( ; menu_itr != menu_end; ++menu_itr ) {
966  // Check if this is the menu we're looking for:
967  if( keyToCheck != (*menu_itr)->key() ) continue;
968  // Remember its pointer:
969  ptrToLocatedMenu = *menu_itr;
970  cacheOfLoadedMenuPtr.m_ptr = ptrToLocatedMenu;
971  std::stringstream rawData;
972  rawData << ptrToLocatedMenu->payload();
973  dataStructure.clear();
974  try {
976  boost::property_tree::read_json(rawData, pt);
977  dataStructure.setData(std::move(pt));
978  } catch (const boost::property_tree::json_parser_error& e) {
979  REPORT_MESSAGE( MSG::FATAL ) << "Unable to decode a JSON trigger menu metadata payload for " << humanName << " with key " << keyToCheck << endmsg;
980  REPORT_MESSAGE( MSG::FATAL ) << e.what();
981  return StatusCode::FAILURE;
982  }
983  break;
984  }
985 
986  if (not optional and ptrToLocatedMenu == nullptr) {
988  << "Couldn't find configuration for current event"
989  << ", Requested key=" << keyToCheck
990  << ", Requested menu=" << humanName
991  << endmsg;
992  return StatusCode::FAILURE;
993  }
994  return StatusCode::SUCCESS;
995  }
996 
997 } // namespace TrigConf
TrigConf::BunchGroupSet
Definition: BunchGroupSet.h:19
TrigConf::xAODConfigSvc::hltPrescalesSet
virtual const HLTPrescalesSet & hltPrescalesSet(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured HLT prescales ptree.
Definition: xAODConfigSvc.cxx:355
TrigConf::L1Menu::setSMK
void setSMK(unsigned int psk)
Definition: L1Menu.cxx:196
xAODConfigSvc.h
TrigConf::HLTPrescalesSet::setPSK
void setPSK(unsigned int psk)
Definition: HLTPrescalesSet.cxx:80
TrigConf::L1BunchGroupSet::setBGSK
void setBGSK(unsigned int bgsk)
Definition: L1BunchGroupSet.h:96
TrigConf::xAODConfigSvc::m_bgJsonAux
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_bgJsonAux
Definition: xAODConfigSvc.h:279
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
TrigConf::xAODConfigSvc::m_currentL1
SG::SlotSpecificObj< L1Menu > m_currentL1
Definition: xAODConfigSvc.h:293
prepareTriggerMenu.h
TrigConf::xAODConfigSvc::m_L1PrescaleSetKey
SG::ReadCondHandleKey< TrigConf::L1PrescalesSet > m_L1PrescaleSetKey
Definition: xAODConfigSvc.h:242
TrigConf::DataStructure::isInitialized
bool isInitialized() const
Definition: DataStructure.h:216
max
#define max(a, b)
Definition: cfImp.cxx:41
TrigConf::xAODConfigSvc::readMetadata
StatusCode readMetadata()
Function reading in a new metadata object from the input.
Definition: xAODConfigSvc.cxx:449
TrigConf::xAODConfigSvc::copyMetadataToPersonalStore
void copyMetadataToPersonalStore(const xAOD::TriggerMenuJsonContainer *input, xAOD::TriggerMenuJsonContainer *existing)
Helper function for copying into the service's private data store.
Definition: xAODConfigSvc.cxx:614
TrigConf::HLTMonitoring::setSMK
void setSMK(unsigned int psk)
Definition: HLTMonitoring.cxx:99
TrigConf::xAODConfigSvc::m_currentBg
SG::SlotSpecificObj< L1BunchGroupSet > m_currentBg
Definition: xAODConfigSvc.h:296
python.Constants.FATAL
int FATAL
Definition: Control/AthenaCommon/python/Constants.py:19
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TrigConf::xAODConfigSvc::prepareEvent
StatusCode prepareEvent()
Function setting up the service for a new event.
Definition: xAODConfigSvc.cxx:634
TrigConf::HLTMenu
HLT menu configuration.
Definition: HLTMenu.h:21
TrigConf::xAODConfigSvc::ctpConfig
virtual const CTPConfig * ctpConfig() const override
Get the LVL1 trigger menu.
Definition: xAODConfigSvc.cxx:112
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
xAOD::TriggerMenu_v1::l1psk
uint32_t l1psk() const
Get the LVL1 prescale key of this configuration.
TrigConf::xAODConfigSvc::m_currentL1ps
SG::SlotSpecificObj< L1PrescalesSet > m_currentL1ps
Definition: xAODConfigSvc.h:295
TrigConf::xAODConfigSvc::prepareEventxAODTriggerMenu
StatusCode prepareEventxAODTriggerMenu(const xAOD::TrigConfKeys *keys, const EventContext &context)
Do per-event decoding for R2 in-file serialised xAOD::TriggerMenu metadata.
Definition: xAODConfigSvc.cxx:679
TrigConf::xAODConfigSvc::m_hltJson
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_hltJson
Definition: xAODConfigSvc.h:270
TrigConf::xAODConfigSvc::m_menu
SG::SlotSpecificObj< MenuPtrWrapper > m_menu
Definition: xAODConfigSvc.h:263
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
TrigConf::xAODConfigSvc::hltMenu
virtual const HLTMenu & hltMenu(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured HLTMenu ptree.
Definition: xAODConfigSvc.cxx:310
TrigConf::HLTMenu::smk
unsigned int smk() const
setter and getter for the supermasterkey
Definition: HLTMenu.cxx:41
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
TrigConf::xAODConfigSvc::m_sharedMutex
std::shared_mutex m_sharedMutex
The mutex used to to restrict access to m_tmc when it is being written to.
Definition: xAODConfigSvc.h:300
TrigConf::xAODConfigSvc::m_metaNameJSON_hltps
Gaudi::Property< std::string > m_metaNameJSON_hltps
Definition: xAODConfigSvc.h:220
TrigConf::xAODConfigSvc::m_currentHltps
SG::SlotSpecificObj< HLTPrescalesSet > m_currentHltps
Definition: xAODConfigSvc.h:294
TrigConf::xAODConfigSvc::m_chainList
SG::SlotSpecificObj< HLTChainList > m_chainList
The "translated" HLT configuration object.
Definition: xAODConfigSvc.h:309
TrigConf::xAODConfigSvc::m_useInFileMetadata
Gaudi::Property< bool > m_useInFileMetadata
Definition: xAODConfigSvc.h:248
TrigConf::xAODConfigSvc::m_metaNameJSON_hltmonitoring
Gaudi::Property< std::string > m_metaNameJSON_hltmonitoring
Definition: xAODConfigSvc.h:214
TrigConf::xAODConfigSvc::m_currentL1psJson
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentL1psJson
Definition: xAODConfigSvc.h:287
xAOD::TriggerMenuJson_v1::name
const std::string & name() const
Get the name of this configuration.
TrigConf::xAODConfigSvc::m_currentHltJson
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentHltJson
Definition: xAODConfigSvc.h:283
TrigConf::xAODConfigSvc::m_l1Json
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_l1Json
Definition: xAODConfigSvc.h:274
TrigConf::xAODConfigSvc::m_ctpConfig
SG::SlotSpecificObj< CTPConfig > m_ctpConfig
Definition: xAODConfigSvc.h:307
test_pyathena.pt
pt
Definition: test_pyathena.py:11
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:205
TrigConf::prepareTriggerMenu
StatusCode prepareTriggerMenu(const xAOD::TriggerMenu *menu, CTPConfig &ctpConfig, HLTChainList &chainList, HLTSequenceList &sequenceList, BunchGroupSet &bgSet, MsgStream &msg)
In order to avoid duplicating code between how the dual-use and the Athena-only code translates the x...
Definition: prepareTriggerMenu.cxx:47
TrigConf::xAODConfigSvc::bunchGroupSetKey
virtual uint32_t bunchGroupSetKey() const override
Get the LVL1 bunch group set key.
Definition: xAODConfigSvc.cxx:247
TrigConf::L1Menu::clear
virtual void clear() override
Clearing the configuration data.
Definition: L1Menu.cxx:150
TrigConf::L1Menu
L1 menu configuration.
Definition: L1Menu.h:28
TrigConf::xAODConfigSvc::initialize
virtual StatusCode initialize() override
Function initialising the service.
Definition: xAODConfigSvc.cxx:34
TrigConf::HLTMenu::setSMK
void setSMK(unsigned int psk)
Definition: HLTMenu.cxx:46
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
TrigConf::xAODConfigSvc::lvl1PrescaleKey
virtual uint32_t lvl1PrescaleKey() const override
Get the LVL1 prescale key.
Definition: xAODConfigSvc.cxx:208
TrigConf::xAODConfigSvc::m_bgSet
SG::SlotSpecificObj< BunchGroupSet > m_bgSet
The "translated" bunch group set object.
Definition: xAODConfigSvc.h:313
TrigConf::L1PrescalesSet::setPSK
void setPSK(unsigned int psk)
Definition: L1PrescalesSet.cxx:49
TrigConf::DataStructure::setData
void setData(const ptree &data)
Setting the configuration data.
Definition: DataStructure.cxx:39
TrigConf::xAODConfigSvc::m_metaNameJSON_l1ps
Gaudi::Property< std::string > m_metaNameJSON_l1ps
Definition: xAODConfigSvc.h:223
TrigConf
Forward iterator to traverse the main components of the trigger configuration.
Definition: Config.h:22
TrigConf::xAODKeysMatch
bool xAODKeysMatch(const xAOD::TrigConfKeys *keys, const xAOD::TriggerMenu *menu)
Since this is used in a couple of places, it seemed to make sense to put this simple code into a cent...
Definition: xAODKeysMatch.cxx:20
TrigConf::xAODConfigSvc::m_eventBGKey
SG::ReadHandleKey< xAOD::BunchConfKey > m_eventBGKey
Definition: xAODConfigSvc.h:200
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TrigConf::xAODConfigSvc::handle
virtual void handle(const Incident &inc) override
Function handling the incoming incidents.
Definition: xAODConfigSvc.cxx:405
TrigConf::HLTChainList
list of all HLT chains in a trigger menu
Definition: HLTChainList.h:56
TrigConf::xAODConfigSvc::m_tmc
std::unique_ptr< xAOD::TriggerMenuContainer > m_tmc
Definition: xAODConfigSvc.h:260
TrigConf::xAODConfigSvc::m_l1psJson
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_l1psJson
Definition: xAODConfigSvc.h:278
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
TrigConf::xAODConfigSvc::m_eventKey
SG::ReadHandleKey< xAOD::TrigConfKeys > m_eventKey
Definition: xAODConfigSvc.h:197
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
TrigConf::xAODConfigSvc::m_hltMenuKey
SG::ReadHandleKey< HLTMenu > m_hltMenuKey
Definition: xAODConfigSvc.h:233
TrigConf::xAODConfigSvc::m_triggerMenuContainerAvailable
bool m_triggerMenuContainerAvailable
Is decoded R2 format data available?
Definition: xAODConfigSvc.h:320
TrigConf::L1PrescalesSet::psk
unsigned int psk() const
setter and getter for the L1 prescale key
Definition: L1PrescalesSet.cxx:44
TrigConf::xAODConfigSvc::m_hltpsJson
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_hltpsJson
Definition: xAODConfigSvc.h:276
TrigConf::xAODConfigSvc::masterKey
virtual uint32_t masterKey() const override
Get the Super Master Key.
Definition: xAODConfigSvc.cxx:173
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TrigConf::xAODConfigSvc::m_metaNameJSON_hlt
Gaudi::Property< std::string > m_metaNameJSON_hlt
Definition: xAODConfigSvc.h:211
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
TrigConf::xAODConfigSvc::finalize
virtual StatusCode finalize() override
Function finalising the service.
Definition: xAODConfigSvc.cxx:106
TrigConf::L1Menu::smk
unsigned int smk() const
setter and getter for the supermasterkey
Definition: L1Menu.cxx:191
TrigConf::xAODConfigSvc::prepareEventxAODTriggerMenuJson
StatusCode prepareEventxAODTriggerMenuJson(const xAOD::TrigConfKeys *keys, const xAOD::BunchConfKey *bgKey, const EventContext &context)
Do per-event decoding for R3 in-file serialised xAOD::TriggerMenuJson metadata.
Definition: xAODConfigSvc.cxx:848
TrigConf::xAODConfigSvc::m_l1psJsonAux
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_l1psJsonAux
Definition: xAODConfigSvc.h:277
TrigConf::xAODConfigSvc::m_hltpsJsonAux
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_hltpsJsonAux
Definition: xAODConfigSvc.h:275
TrigConf::L1BunchGroupSet
L1 board configuration.
Definition: L1BunchGroupSet.h:71
TrigConf::L1PrescalesSet::clear
virtual void clear() override
Clearing the configuration data.
Definition: L1PrescalesSet.cxx:31
TrigConf::xAODConfigSvc::m_hltmonitoringJsonAux
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_hltmonitoringJsonAux
Definition: xAODConfigSvc.h:271
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
TrigConf::xAODConfigSvc::m_menuJSONContainerAvailable
bool m_menuJSONContainerAvailable
Is decoded R3 format data available?
Definition: xAODConfigSvc.h:322
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
TrigConf::xAODConfigSvc::m_HLTPrescaleSetKey
SG::ReadCondHandleKey< TrigConf::HLTPrescalesSet > m_HLTPrescaleSetKey
Definition: xAODConfigSvc.h:239
TrigConf::name
Definition: HLTChainList.h:35
TrigConf::L1PrescalesSet
L1 menu configuration.
Definition: L1PrescalesSet.h:19
TrigConf::HLTMenu::clear
virtual void clear() override
Clearing the configuration data.
Definition: HLTMenu.cxx:29
BunchGroup.h
TrigConf::xAODConfigSvc::m_metaStore
ServiceHandle< StoreGateSvc > m_metaStore
Connection to the metadata store.
Definition: xAODConfigSvc.h:317
TrigConf::BunchGroupSet::bunchGroups
const std::vector< BunchGroup > & bunchGroups() const
Definition: BunchGroupSet.h:27
TrigConf::xAODConfigSvc::m_isInFailure
bool m_isInFailure
Internal state of the service.
Definition: xAODConfigSvc.h:254
ptree
boost::property_tree::ptree ptree
Definition: JsonFileLoader.cxx:16
TrigConf::xAODConfigSvc::m_stopOnFailure
Gaudi::Property< bool > m_stopOnFailure
Definition: xAODConfigSvc.h:252
TrigConf::xAODConfigSvc::m_currentBgJson
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentBgJson
Definition: xAODConfigSvc.h:288
xAOD::TrigConfKeys_v1
Class describing the configuration used in a given event.
Definition: TrigConfKeys_v1.h:32
xAOD::TriggerMenu
TriggerMenu_v1 TriggerMenu
Define the latest version of the trigger menu class.
Definition: TriggerMenu.h:16
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
errorcheck.h
Helpers for checking error return status codes and reporting errors.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
TrigConf::DataStructure
Base class for Trigger configuration data and wrapper around underlying representation.
Definition: DataStructure.h:37
xAOD::TriggerMenuJson_v1::key
uint32_t key() const
Get the key of this configuration.
TrigConf::xAODConfigSvc::chains
virtual const HLTChainList & chains() const override
Get the HLT chains.
Definition: xAODConfigSvc.cxx:143
xAOD::BunchConfKey_v1::id
uint32_t id() const
Get the 32-bit identifier of the bunch configuration.
Definition: BunchConfKey_v1.cxx:17
REPORT_MESSAGE
#define REPORT_MESSAGE(LVL)
Report a message.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:365
xAODKeysMatch.h
xAOD::TriggerMenuJson_v1
Raw JSON data for a given type of menu file.
Definition: TriggerMenuJson_v1.h:26
TrigConf::HLTMonitoring
HLT monitoring configuration.
Definition: HLTMonitoring.h:27
TrigConf::xAODConfigSvc::m_hltJsonAux
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_hltJsonAux
Definition: xAODConfigSvc.h:269
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
TrigConf::xAODConfigSvc::m_L1BunchGroupSetKey
SG::ReadCondHandleKey< TrigConf::L1BunchGroupSet > m_L1BunchGroupSetKey
Definition: xAODConfigSvc.h:245
TrigConf::xAODConfigSvc::m_tmcAux
std::unique_ptr< xAOD::TriggerMenuAuxContainer > m_tmcAux
Definition: xAODConfigSvc.h:259
TrigConf::xAODConfigSvc::m_currentHlt
SG::SlotSpecificObj< HLTMenu > m_currentHlt
Definition: xAODConfigSvc.h:291
TrigConf::TriggerMenuJsonPtrWrapper::m_ptr
const xAOD::TriggerMenuJson * m_ptr
Definition: xAODConfigSvc.h:63
TrigConf::xAODConfigSvc::bunchGroupSet
virtual const BunchGroupSet * bunchGroupSet() const override
Get the LVL1 bunch group set.
Definition: xAODConfigSvc.cxx:127
TrigConf::xAODConfigSvc::hltMonitoring
virtual const HLTMonitoring & hltMonitoring(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured HLTMonitoring ptree.
Definition: xAODConfigSvc.cxx:327
TrigConf::HLTPrescalesSet::clear
virtual void clear() override
Clearing the configuration data.
Definition: HLTPrescalesSet.cxx:61
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
TrigConf::xAODConfigSvc::m_hltmonitoringJson
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_hltmonitoringJson
Definition: xAODConfigSvc.h:272
TrigConf::TriggerMenuJsonPtrWrapper
Small utility class to wrap a pointer to a const xAOD::TriggerMenuJson.
Definition: xAODConfigSvc.h:61
TrigConf::xAODConfigSvc::l1PrescalesSet
virtual const L1PrescalesSet & l1PrescalesSet(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured L1 prescales ptree.
Definition: xAODConfigSvc.cxx:372
TrigConf::xAODConfigSvc::m_metaName
Gaudi::Property< std::string > m_metaName
Definition: xAODConfigSvc.h:205
TrigConf::CTPConfig::menu
const Menu & menu() const
Definition: CTPConfig.h:38
TrigConf::xAODConfigSvc::m_bgJson
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_bgJson
Definition: xAODConfigSvc.h:280
HLTSequenceList.h
TrigConf::xAODConfigSvc::sequences
virtual const HLTSequenceList & sequences() const override
Get the HLT sequences.
Definition: xAODConfigSvc.cxx:158
DEBUG
#define DEBUG
Definition: page_access.h:11
xAOD::TriggerMenuJson
TriggerMenuJson_v1 TriggerMenuJson
Define the latest version of the trigger menu JSON class.
Definition: TriggerMenuJson.h:15
TrigConf::xAODConfigSvc::m_metaNameJSON_l1
Gaudi::Property< std::string > m_metaNameJSON_l1
Definition: xAODConfigSvc.h:217
TrigConf::DataStructure::clear
virtual void clear()
Clearing the configuration data.
Definition: DataStructure.cxx:65
xAOD::TriggerMenuJson_v1::payload
const std::string & payload() const
Get the JSON payload.
TrigConf::xAODConfigSvc::prepareEventRun3Athena
StatusCode prepareEventRun3Athena(const EventContext &context)
Do per-event updating of R3 JSON-based metadata, reading the data direct from the Conditions and Dete...
Definition: xAODConfigSvc.cxx:727
TrigConf::xAODConfigSvc::m_currentHltpsJson
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentHltpsJson
Definition: xAODConfigSvc.h:286
TrigConf::xAODConfigSvc::m_currentHltmonitoring
SG::SlotSpecificObj< HLTMonitoring > m_currentHltmonitoring
Definition: xAODConfigSvc.h:292
TrigConf::CTPConfig
Definition: CTPConfig.h:27
xAOD::TriggerMenu_v1::smk
uint32_t smk() const
Get the Super Master Key of this configuration.
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:790
TrigConf::L1BunchGroupSet::bgsk
unsigned int bgsk() const
setter and getter for the bunch group key
Definition: L1BunchGroupSet.h:95
TrigConf::HLTPrescalesSet::psk
unsigned int psk() const
setter and getter for the HLT prescale key
Definition: HLTPrescalesSet.cxx:75
TrigConf::xAODConfigSvc::loadPtree
StatusCode loadPtree(const std::string &humanName, const xAOD::TriggerMenuJsonContainer *metaContainer, const uint32_t keyToCheck, TriggerMenuJsonPtrWrapper &cacheOfLoadedMenuPtr, DataStructure &dataStructure, const bool optional=false)
Helper function to find a JSON in a given TriggerMenuJsonContainer using a given key,...
Definition: xAODConfigSvc.cxx:955
TrigConf::xAODConfigSvc::xAODConfigSvc
xAODConfigSvc(const std::string &name, ISvcLocator *svcLoc)
Standard service constructor.
Definition: xAODConfigSvc.cxx:27
TrigConf::Menu::size
int size() const
Definition: Menu.h:143
TrigConf::HLTPrescalesSet
HLT menu configuration.
Definition: HLTPrescalesSet.h:19
xAOD::TriggerMenu_v1
Class holding one particular trigger configuration.
Definition: TriggerMenu_v1.h:34
TrigConf::xAODConfigSvc::m_l1JsonAux
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_l1JsonAux
Definition: xAODConfigSvc.h:273
TrigConf::xAODConfigSvc::l1Menu
virtual const L1Menu & l1Menu(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured L1 ptree.
Definition: xAODConfigSvc.cxx:338
TrigConf::xAODConfigSvc::m_l1MenuKey
SG::ReadHandleKey< L1Menu > m_l1MenuKey
Definition: xAODConfigSvc.h:236
TrigConf::xAODConfigSvc::hltPrescaleKey
virtual uint32_t hltPrescaleKey() const override
Get the HLT prescale key.
Definition: xAODConfigSvc.cxx:270
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
TrigConf::xAODConfigSvc::m_metaNameJSON_bg
Gaudi::Property< std::string > m_metaNameJSON_bg
Definition: xAODConfigSvc.h:226
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
TrigConf::xAODConfigSvc::m_currentHltmonitoringJson
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentHltmonitoringJson
Definition: xAODConfigSvc.h:284
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
xAOD::TriggerMenu_v1::hltpsk
uint32_t hltpsk() const
Get the HLT prescale key of this configuration.
TrigConf::xAODConfigSvc::m_currentL1Json
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentL1Json
Definition: xAODConfigSvc.h:285
TrigConf::xAODConfigSvc::l1BunchGroupSet
virtual const L1BunchGroupSet & l1BunchGroupSet(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured bunchgroup ptree.
Definition: xAODConfigSvc.cxx:389
ServiceHandle< IIncidentSvc >
xAOD::BunchConfKey_v1
Class identifying the bunch configuration of a given event.
Definition: BunchConfKey_v1.h:29
TrigConf::xAODConfigSvc::m_sequenceList
SG::SlotSpecificObj< HLTSequenceList > m_sequenceList
The "translated" HLT configuration object.
Definition: xAODConfigSvc.h:311
TrigConf::HLTSequenceList
list of HLT sequences
Definition: HLTSequenceList.h:40