ATLAS Offline Software
Loading...
Searching...
No Matches
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
25namespace 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(),
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
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 ) {
116 REPORT_MESSAGE( MSG::FATAL )
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 ) {
131 REPORT_MESSAGE( MSG::FATAL )
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 ) {
147 REPORT_MESSAGE( MSG::FATAL )
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 ) {
162 REPORT_MESSAGE( MSG::FATAL )
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
173 uint32_t xAODConfigSvc::masterKey() const {
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;
180 return std::numeric_limits<uint32_t>::max();
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 ) {
194 REPORT_MESSAGE( MSG::FATAL )
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) {
213 return std::numeric_limits<uint32_t>::max();
214 }
215
217 if( !l1psRCH.isValid() ) {
218 REPORT_MESSAGE( MSG::WARNING )
219 << "Unable to load " << m_L1PrescaleSetKey.key() << " from Conditions Store." << endmsg;
220 return std::numeric_limits<uint32_t>::max();
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)
251 return std::numeric_limits<uint32_t>::max();
253 if (!l1BGS.isValid())
254 {
255 REPORT_MESSAGE( MSG::WARNING )
256 << "Unable to load " << m_L1BunchGroupSetKey.key() << " from Conditions Store." << endmsg;
257 return std::numeric_limits<uint32_t>::max();
258 }
259 else
260 return l1BGS->bgsk();
262 return m_currentBg.get()->bgsk();
263 else {
264 REPORT_MESSAGE( MSG::DEBUG )
265 << "There's no way to access the bunch group set key from a legacy AOD!" << endmsg;
266 return std::numeric_limits<uint32_t>::max();
267 }
268 }
269
271 if (!m_useInFileMetadata) {
272
273 const bool firstEvent = !m_currentHltps.get()->isInitialized();
274 if (firstEvent) {
275 return std::numeric_limits<uint32_t>::max();
276 }
277
279 if( !hltpsRCH.isValid() ) {
280 REPORT_MESSAGE( MSG::WARNING )
281 << "Unable to load " << m_HLTPrescaleSetKey.key() << " from Conditions Store." << endmsg;
282 return std::numeric_limits<uint32_t>::max();
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 ) {
296 REPORT_MESSAGE( MSG::FATAL )
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 ) {
415 REPORT_MESSAGE( MSG::FATAL )
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 ) {
428 REPORT_MESSAGE( MSG::FATAL )
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 ) {
529 REPORT_MESSAGE( MSG::FATAL )
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 ) {
545 REPORT_MESSAGE( MSG::FATAL )
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 ) {
654 REPORT_MESSAGE( MSG::FATAL )
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
679 StatusCode xAODConfigSvc::prepareEventxAODTriggerMenu(const xAOD::TrigConfKeys* keys, const EventContext& context) {
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 ) ) {
684 REPORT_MESSAGE( MSG::DEBUG )
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!
719 REPORT_MESSAGE( MSG::FATAL )
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::DEBUG )
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) {
810 REPORT_MESSAGE( MSG::DEBUG )
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
848 StatusCode xAODConfigSvc::prepareEventxAODTriggerMenuJson(const xAOD::TrigConfKeys* keys, const xAOD::BunchConfKey* bgKey, const EventContext& context) {
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) {
876 REPORT_MESSAGE( MSG::DEBUG )
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 {
975 boost::property_tree::ptree pt;
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) {
987 REPORT_MESSAGE( MSG::FATAL )
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
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
Helpers for checking error return status codes and reporting errors.
#define REPORT_MESSAGE(LVL)
Report a message.
#define CHECK(...)
Evaluate an expression and check for errors.
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
const std::vector< BunchGroup > & bunchGroups() const
Base class for Trigger configuration data and wrapper around underlying representation.
void setData(const ptree &data)
Setting the configuration data.
virtual void clear()
Clearing the configuration data.
list of all HLT chains in a trigger menu
HLT menu configuration.
Definition HLTMenu.h:21
void setSMK(unsigned int psk)
Definition HLTMenu.cxx:46
virtual void clear() override
Clearing the configuration data.
Definition HLTMenu.cxx:29
unsigned int smk() const
setter and getter for the supermasterkey
Definition HLTMenu.cxx:41
HLT monitoring configuration.
void setSMK(unsigned int psk)
HLT menu configuration.
void setPSK(unsigned int psk)
unsigned int psk() const
setter and getter for the HLT prescale key
virtual void clear() override
Clearing the configuration data.
list of HLT sequences
L1 board configuration.
void setBGSK(unsigned int bgsk)
unsigned int bgsk() const
setter and getter for the bunch group key
L1 menu configuration.
Definition L1Menu.h:28
unsigned int smk() const
setter and getter for the supermasterkey
Definition L1Menu.cxx:191
virtual void clear() override
Clearing the configuration data.
Definition L1Menu.cxx:150
void setSMK(unsigned int psk)
Definition L1Menu.cxx:196
L1 menu configuration.
virtual void clear() override
Clearing the configuration data.
unsigned int psk() const
setter and getter for the L1 prescale key
void setPSK(unsigned int psk)
SG::ReadCondHandleKey< TrigConf::HLTPrescalesSet > m_HLTPrescaleSetKey
xAODConfigSvc(const std::string &name, ISvcLocator *svcLoc)
Standard service constructor.
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentHltpsJson
virtual uint32_t lvl1PrescaleKey() const override
Get the LVL1 prescale key.
Gaudi::Property< std::string > m_metaNameJSON_l1ps
bool m_menuJSONContainerAvailable
Is decoded R3 format data available?
virtual const L1PrescalesSet & l1PrescalesSet(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured L1 prescales ptree.
Gaudi::Property< std::string > m_metaNameJSON_hlt
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentBgJson
bool m_triggerMenuContainerAvailable
Is decoded R2 format data available?
Gaudi::Property< std::string > m_metaName
virtual StatusCode finalize() override
Function finalising the service.
SG::SlotSpecificObj< HLTMenu > m_currentHlt
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_hltpsJson
virtual const HLTSequenceList & sequences() const override
Get the HLT sequences.
StatusCode prepareEventRun3Athena(const EventContext &context)
Do per-event updating of R3 JSON-based metadata, reading the data direct from the Conditions and Dete...
virtual void handle(const Incident &inc) override
Function handling the incoming incidents.
SG::SlotSpecificObj< HLTChainList > m_chainList
The "translated" HLT configuration object.
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_hltmonitoringJson
Gaudi::Property< std::string > m_metaNameJSON_l1
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentHltmonitoringJson
SG::SlotSpecificObj< L1PrescalesSet > m_currentL1ps
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentHltJson
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_l1psJson
SG::ReadHandleKey< xAOD::BunchConfKey > m_eventBGKey
SG::SlotSpecificObj< CTPConfig > m_ctpConfig
std::unique_ptr< xAOD::TriggerMenuContainer > m_tmc
SG::ReadHandleKey< HLTMenu > m_hltMenuKey
SG::SlotSpecificObj< BunchGroupSet > m_bgSet
The "translated" bunch group set object.
StatusCode prepareEvent()
Function setting up the service for a new event.
SG::ReadHandleKey< L1Menu > m_l1MenuKey
Gaudi::Property< bool > m_stopOnFailure
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_hltJsonAux
virtual uint32_t bunchGroupSetKey() const override
Get the LVL1 bunch group set key.
virtual const HLTMonitoring & hltMonitoring(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured HLTMonitoring ptree.
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_l1psJsonAux
SG::SlotSpecificObj< HLTSequenceList > m_sequenceList
The "translated" HLT configuration object.
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_l1Json
Gaudi::Property< bool > m_useInFileMetadata
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.
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_bgJsonAux
virtual const CTPConfig * ctpConfig() const override
Get the LVL1 trigger menu.
SG::ReadCondHandleKey< TrigConf::L1BunchGroupSet > m_L1BunchGroupSetKey
virtual const L1Menu & l1Menu(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured L1 ptree.
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_hltJson
SG::SlotSpecificObj< MenuPtrWrapper > m_menu
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentL1Json
SG::SlotSpecificObj< L1BunchGroupSet > m_currentBg
SG::ReadHandleKey< xAOD::TrigConfKeys > m_eventKey
virtual const BunchGroupSet * bunchGroupSet() const override
Get the LVL1 bunch group set.
Gaudi::Property< std::string > m_metaNameJSON_hltmonitoring
virtual const HLTChainList & chains() const override
Get the HLT chains.
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_hltmonitoringJsonAux
SG::SlotSpecificObj< HLTMonitoring > m_currentHltmonitoring
std::shared_mutex m_sharedMutex
The mutex used to to restrict access to m_tmc when it is being written to.
std::unique_ptr< xAOD::TriggerMenuAuxContainer > m_tmcAux
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_hltpsJsonAux
SG::SlotSpecificObj< TriggerMenuJsonPtrWrapper > m_currentL1psJson
StatusCode prepareEventxAODTriggerMenu(const xAOD::TrigConfKeys *keys, const EventContext &context)
Do per-event decoding for R2 in-file serialised xAOD::TriggerMenu metadata.
StatusCode readMetadata()
Function reading in a new metadata object from the input.
std::unique_ptr< xAOD::TriggerMenuJsonContainer > m_bgJson
std::unique_ptr< xAOD::TriggerMenuJsonAuxContainer > m_l1JsonAux
virtual uint32_t hltPrescaleKey() const override
Get the HLT prescale key.
virtual StatusCode initialize() override
Function initialising the service.
Gaudi::Property< std::string > m_metaNameJSON_hltps
SG::SlotSpecificObj< HLTPrescalesSet > m_currentHltps
SG::SlotSpecificObj< L1Menu > m_currentL1
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,...
virtual const HLTMenu & hltMenu(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured HLTMenu ptree.
Gaudi::Property< std::string > m_metaNameJSON_bg
virtual const HLTPrescalesSet & hltPrescalesSet(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured HLT prescales ptree.
virtual const L1BunchGroupSet & l1BunchGroupSet(const EventContext &ctx=Gaudi::Hive::currentContext()) const override
Returns the JSON configured bunchgroup ptree.
bool m_isInFailure
Internal state of the service.
ServiceHandle< StoreGateSvc > m_metaStore
Connection to the metadata store.
SG::ReadCondHandleKey< TrigConf::L1PrescalesSet > m_L1PrescaleSetKey
virtual uint32_t masterKey() const override
Get the Super Master Key.
void copyMetadataToPersonalStore(const xAOD::TriggerMenuJsonContainer *input, xAOD::TriggerMenuJsonContainer *existing)
Helper function for copying into the service's private data store.
uint32_t id() const
Get the 32-bit identifier of the bunch configuration.
const std::string & payload() const
Get the JSON payload.
uint32_t key() const
Get the key of this configuration.
const std::string & name() const
Get the name of this configuration.
uint32_t smk() const
Get the Super Master Key of this configuration.
uint32_t hltpsk() const
Get the HLT prescale key of this configuration.
uint32_t l1psk() const
Get the LVL1 prescale key of this configuration.
Forward iterator to traverse the main components of the trigger configuration.
Definition Config.h:22
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...
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...
TriggerMenuJson_v1 TriggerMenuJson
Define the latest version of the trigger menu JSON class.
TriggerMenu_v1 TriggerMenu
Define the latest version of the trigger menu class.
Definition TriggerMenu.h:16
TriggerMenuContainer_v1 TriggerMenuContainer
Define the latest version of the trigger menu container class.
BunchConfKey_v1 BunchConfKey
Declare the current version of the bunch configuration key type.
TriggerMenuJsonContainer_v1 TriggerMenuJsonContainer
TrigConfKeys_v1 TrigConfKeys
Declare the current version of the trigger configuration keys type.
Small utility class to wrap a pointer to a const xAOD::TriggerMenuJson.
const xAOD::TriggerMenuJson * m_ptr
MsgStream & msg
Definition testRead.cxx:32