6#include "GaudiKernel/Incident.h"
7#include "GaudiKernel/IIncidentSvc.h"
8#include "GaudiKernel/GaudiException.h"
21#define BOOST_BIND_GLOBAL_PLACEHOLDERS
22#include <boost/property_tree/ptree.hpp>
23#include <boost/property_tree/json_parser.hpp>
28 : base_class(
name, svcLoc ),
51 CHECK( incSvc.retrieve() );
52 incSvc->addListener(
this, IncidentType::BeginEvent, 0,
61 incSvc->addListener(
this, IncidentType::BeginInputFile, 0,
65 m_tmcAux = std::make_unique<xAOD::TriggerMenuAuxContainer>();
66 m_tmc = std::make_unique<xAOD::TriggerMenuContainer>();
70 m_hltJsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
71 m_hltJson = std::make_unique<xAOD::TriggerMenuJsonContainer>();
78 m_l1JsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
79 m_l1Json = std::make_unique<xAOD::TriggerMenuJsonContainer>();
82 m_hltpsJsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
83 m_hltpsJson = std::make_unique<xAOD::TriggerMenuJsonContainer>();
86 m_l1psJsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
87 m_l1psJson = std::make_unique<xAOD::TriggerMenuJsonContainer>();
90 m_bgJsonAux = std::make_unique<xAOD::TriggerMenuJsonAuxContainer>();
91 m_bgJson = std::make_unique<xAOD::TriggerMenuJsonContainer>();
103 return StatusCode::SUCCESS;
109 return StatusCode::SUCCESS;
117 <<
"Trigger menu not loaded";
118 throw GaudiException(
"Service not initialised correctly",
119 "TrigConf::xAODConfigSvc::ctpConfig",
120 StatusCode::FAILURE );
132 <<
"Trigger menu not loaded";
133 throw GaudiException(
"Service not initialised correctly",
134 "TrigConf::xAODConfigSvc::bunchGroupSet",
135 StatusCode::FAILURE );
148 <<
"Trigger menu not loaded";
149 throw GaudiException(
"Service not initialised correctly",
150 "TrigConf::xAODConfigSvc::chains",
151 StatusCode::FAILURE );
163 <<
"Trigger menu not loaded";
164 throw GaudiException(
"Service not initialised correctly",
165 "TrigConf::xAODConfigSvc::chains",
166 StatusCode::FAILURE );
177 if( !hltMenuHandle.
isValid() ) {
180 return std::numeric_limits<uint32_t>::max();
182 return hltMenuHandle->smk();
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 );
203 return m_menu.get()->m_ptr->smk();
211 const bool firstEvent = !
m_currentL1ps.get()->isInitialized();
213 return std::numeric_limits<uint32_t>::max();
220 return std::numeric_limits<uint32_t>::max();
222 return l1psRCH->psk();
233 if( !
m_menu.get()->m_ptr ) {
235 <<
"Trigger menu not yet known. Configuration key not returned.";
236 throw GaudiException(
"Service not initialised correctly",
237 "TrigConf::xAODConfigSvc::lvl1PrescaleKey",
238 StatusCode::FAILURE );
243 return m_menu.get()->m_ptr->l1psk();
249 const bool firstEvent = !
m_currentBg.get()->isInitialized();
251 return std::numeric_limits<uint32_t>::max();
257 return std::numeric_limits<uint32_t>::max();
260 return l1BGS->bgsk();
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();
275 return std::numeric_limits<uint32_t>::max();
282 return std::numeric_limits<uint32_t>::max();
284 return hltpsRCH->psk();
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 );
305 return m_menu.get()->m_ptr->hltpsk();
313 if( hltMenuHandle.
isValid() ) {
314 return *hltMenuHandle;
319 throw GaudiException(
"Service not initialised correctly",
320 "TrigConf::xAODConfigSvc::hltMenu",
321 StatusCode::FAILURE );
330 throw GaudiException(
"Service not initialised correctly",
331 "TrigConf::xAODConfigSvc::hltMenu",
332 StatusCode::FAILURE );
342 return *l1MenuHandle;
347 throw GaudiException(
"Service not initialised correctly",
348 "TrigConf::xAODConfigSvc::l1Menu",
349 StatusCode::FAILURE );
364 throw GaudiException(
"Service not initialised correctly",
365 "TrigConf::xAODConfigSvc::hltPrescalesSet",
366 StatusCode::FAILURE );
381 throw GaudiException(
"Service not initialised correctly",
382 "TrigConf::xAODConfigSvc::l1PrescalesSet",
383 StatusCode::FAILURE );
397 throw GaudiException(
"Service not initialised correctly",
398 "TrigConf::xAODConfigSvc::l1BunchGroupSet",
399 StatusCode::FAILURE );
408 REPORT_MESSAGE( MSG::DEBUG ) <<
"Callback received with incident: "
413 if( inc.type() == IncidentType::BeginInputFile ) {
416 <<
"Couldn't read in the input file's metadata";
417 throw GaudiException(
"Couldn't read in the input file's "
419 "TrigConf::xAODConfigSvc::handle",
420 StatusCode::FAILURE );
426 else if( inc.type() == IncidentType::BeginEvent ) {
429 <<
"Couldn't prepare the trigger configuration for the "
431 throw GaudiException(
"Couldn't prepare the trigger configuration "
432 "for the current event",
433 "TrigConf::xAODConfigSvc::handle",
434 StatusCode::FAILURE );
440 REPORT_MESSAGE( MSG::WARNING ) <<
"Unknown incident type received: "
512 REPORT_MESSAGE( MSG::FATAL ) <<
"Couldn't retrieve xAOD::TriggerMenuContainer or xAOD::TriggerMenuJsonContainer(s)" <<
endmsg;
513 return StatusCode::FAILURE;
515 REPORT_MESSAGE( MSG::WARNING ) <<
"Couldn't retrieve xAOD::TriggerMenuContainer or xAOD::TriggerMenuJsonContainer(s)" <<
endmsg;
516 return StatusCode::SUCCESS;
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;
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;
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;
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;
564 if (input_hltmonitoring) {
574 return StatusCode::SUCCESS;
579 if( ! input_tmc->
size() ) {
580 REPORT_MESSAGE( MSG::WARNING ) <<
"No trigger configurations are available on the input" <<
endmsg;
581 return StatusCode::SUCCESS;
586 bool alreadyHave =
false;
598 m_tmc->push_back( newMenu );
599 *newMenu = *inputMenu;
600 REPORT_MESSAGE( MSG::DEBUG ) <<
"Imported new configuration: SMK = " << newMenu->
smk()
601 <<
", L1PSK = " << newMenu->
l1psk()
605 return StatusCode::SUCCESS;
610 ATH_MSG_ERROR(
"Both m_menuJSONContainerAvailable and m_triggerMenuContainerAvailable are false" );
611 return StatusCode::FAILURE;
616 bool alreadyHave =
false;
618 if (inputTriggerMenuJson->key() == existingTriggerMenuJson->key()) {
628 existing->push_back( newTriggerMenuJson );
629 *newTriggerMenuJson = *inputTriggerMenuJson;
630 REPORT_MESSAGE( MSG::DEBUG ) <<
"Imported new configuration: Name = " << newTriggerMenuJson->
name() <<
" Key = " << newTriggerMenuJson->
key() <<
endmsg;
637 const EventContext& context = Gaudi::Hive::currentContext();
648 keys = keysRH.
cptr();
655 <<
"Coudln't retrieve xAOD::TrigConfKeys";
656 return StatusCode::FAILURE;
659 return StatusCode::SUCCESS;
666 bgKey = bgKeyRH.
cptr();
674 ATH_MSG_ERROR(
"Both m_menuJSONContainerAvailable and m_triggerMenuContainerAvailable are false" );
675 return StatusCode::FAILURE;
683 if( loadedMenuInSlot !=
nullptr &&
xAODKeysMatch( keys, loadedMenuInSlot ) ) {
685 <<
"Configuration matches the loaded one, nothing to do." <<
endmsg;
686 return StatusCode::SUCCESS;
696 for( ; menu_itr != menu_end; ++menu_itr ) {
700 loadedMenuInSlot = *menu_itr;
701 m_menu.get(context)->m_ptr = loadedMenuInSlot;
708 chainList, sequenceList,
711 <<
" chainList.size() = " << chainList.size()
712 <<
" sequenceList.size() = " << sequenceList.size()
715 return StatusCode::SUCCESS;
720 <<
"Couldn't find configuration for current event (SMK:"
721 << keys->smk() <<
", L1PSK:" << keys->l1psk()
722 <<
", HLTPSK:" << keys->hltpsk() <<
")";
723 return StatusCode::FAILURE;
738 bool validConfig =
true;
745 if( !hltMenuHandle.
isValid() ) {
749 if (!currentHlt.
isInitialized() or currentHlt.
smk() != hltMenuHandle->smk()) {
752 currentHlt.
setData( hltMenuHandle->data() );
753 currentHlt.
setSMK( hltMenuHandle->smk() );
758 if( !l1MenuHandle.
isValid() ) {
765 currentL1.
setData( l1MenuHandle->data() );
766 currentL1.
setSMK( l1MenuHandle->smk() );
773 <<
"L1 and HLT prescales will not be available via the TrigConf::xAODConfigSvc in the first "
774 <<
"event when running with UseInFileMetadata=False" <<
endmsg;
786 currentL1ps.
setData( l1psRCH->data() );
787 currentL1ps.
setPSK( l1psRCH->psk() );
796 if (!currentHltps.
isInitialized() or currentHltps.
psk() != hltpsRCH->psk()) {
798 currentHltps.
clear();
799 currentHltps.
setData( hltpsRCH->data() );
800 currentHltps.
setPSK( hltpsRCH->psk() );
811 <<
"Configuration matches the loaded one, nothing to do." <<
endmsg;
812 return StatusCode::SUCCESS;
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;
839 <<
" chainList.size() = " << chainList.size()
840 <<
" sequenceList.size() = " << sequenceList.size()
843 return StatusCode::SUCCESS;
855 bool validConfig =
true;
856 if (loadedHltJson ==
nullptr || loadedHltJson->
key() != keys->smk()) {
860 if (loadedL1Json ==
nullptr || loadedL1Json->
key() != keys->smk()) {
863 if (loadedHltpsJson ==
nullptr || loadedHltpsJson->
key() != keys->hltpsk()) {
866 if (loadedL1psJson ==
nullptr || loadedL1psJson->
key() != keys->l1psk()) {
870 if (loadedBgJson ==
nullptr || loadedBgJson->
key() !=
static_cast<unsigned int>(bgKey->
id())) {
877 <<
"Configuration matches the loaded one, nothing to do." <<
endmsg;
878 return StatusCode::SUCCESS;
913 if (currentHltmonitoringJson.
m_ptr) {
914 currentHltmonitoring.
setSMK( currentHltmonitoringJson.
m_ptr->
key() );
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;
947 <<
" chainList.size() = " << chainList.size()
948 <<
" sequenceList.size() = " << sequenceList.size()
951 return StatusCode::SUCCESS;
957 const uint32_t keyToCheck,
960 const bool optional) {
964 cacheOfLoadedMenuPtr.
m_ptr =
nullptr;
965 for( ; menu_itr != menu_end; ++menu_itr ) {
967 if( keyToCheck != (*menu_itr)->key() )
continue;
969 ptrToLocatedMenu = *menu_itr;
970 cacheOfLoadedMenuPtr.
m_ptr = ptrToLocatedMenu;
971 std::stringstream rawData;
972 rawData << ptrToLocatedMenu->
payload();
973 dataStructure.
clear();
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;
981 return StatusCode::FAILURE;
986 if (not optional and ptrToLocatedMenu ==
nullptr) {
988 <<
"Couldn't find configuration for current event"
989 <<
", Requested key=" << keyToCheck
990 <<
", Requested menu=" << humanName
992 return StatusCode::FAILURE;
994 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
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
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.
bool isInitialized() const
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 monitoring configuration.
void setSMK(unsigned int psk)
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.
void setBGSK(unsigned int bgsk)
unsigned int bgsk() const
setter and getter for the bunch group key
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.
Forward iterator to traverse the main components of the trigger configuration.
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.
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.