Commit 50660cc5 authored by Joerg Stelzer's avatar Joerg Stelzer Committed by Walter Lampl
Browse files

Move xml file path resolution from python to c++ for LVL1ConfigSvc (ATR-20864)

Also refactor LVL1ConfigSvc a bit to clearly separate Run2 and Run3 menu
loading
parent fe137019
......@@ -40,7 +40,7 @@ find_package( nlohmann_json )
atlas_add_component( TrigConfigSvc
src/*.cxx src/components/*.cxx
INCLUDE_DIRS ${COOL_INCLUDE_DIRS}
LINK_LIBRARIES AthAnalysisBaseCompsLib AthenaBaseComps TrigConfIO TrigConfData TrigConfStorage TrigConfL1Data L1TopoConfig EventInfo AthenaMonitoringLib nlohmann_json::nlohmann_json )
LINK_LIBRARIES AthAnalysisBaseCompsLib AthenaBaseComps TrigConfIO TrigConfData TrigConfStorage TrigConfL1Data L1TopoConfig EventInfo AthenaMonitoringLib PathResolver nlohmann_json::nlohmann_json )
# Install files from the package:
atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
......
# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
from PyUtils.Decorators import memoize
from AthenaCommon.Logging import logging
......@@ -156,7 +156,6 @@ def getL1ConfigSvc( flags = None ):
from AthenaCommon.Logging import log
from TriggerJobOpts.TriggerFlags import TriggerFlags
from TrigConfigSvc.TrigConfigSvcConf import TrigConf__LVL1ConfigSvc
from TrigConfigSvc.TrigConfigSvcConfig import findFileInXMLPATH
from AthenaCommon.AppMgr import theApp
# generate menu file
generatedFile = generateL1Menu( flags=flags )
......@@ -165,7 +164,12 @@ def getL1ConfigSvc( flags = None ):
l1ConfigSvc = TrigConf__LVL1ConfigSvc( "LVL1ConfigSvc" )
l1ConfigSvc.ConfigSource = "XML"
l1XMLFile = findFileInXMLPATH( TriggerFlags.inputLVL1configFile() if flags is None else flags.Trigger.LVL1ConfigFile )
l1XMLFile = TriggerFlags.inputLVL1configFile() if flags is None else flags.Trigger.LVL1ConfigFile
# check if file exists in this directory otherwise add the package to aid path resolution
# also a '/' in the file name indicates that no package needs to be added
import os.path
if not ( "/" in l1XMLFile or os.path.isfile(l1XMLFile) ):
l1XMLFile = "TriggerMenuMT/" + l1XMLFile
l1ConfigSvc.XMLMenuFile = l1XMLFile
log.info( "For run 2 style menu access configured LVL1ConfigSvc with input file : %s", l1XMLFile )
......
# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
from TrigConfigSvc.TrigConfigSvcConf import (TrigConf__LVL1ConfigSvc,
TrigConf__L1TopoConfigSvc,
......@@ -417,32 +417,8 @@ class SetupTrigConfigSvc(object):
def TrigConfigSvcCfg( flags ):
from AthenaCommon.Logging import log
from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
acc = ComponentAccumulator()
from TrigConfigSvc.TrigConfigSvcConf import TrigConf__LVL1ConfigSvc
from TrigConfigSvc.TrigConfigSvcConfig import findFileInXMLPATH
l1ConfigSvc = TrigConf__LVL1ConfigSvc( "LVL1ConfigSvc" )
l1XMLFile = findFileInXMLPATH(flags.Trigger.LVL1ConfigFile)
log.debug( "LVL1ConfigSvc input file:"+l1XMLFile )
l1ConfigSvc.XMLMenuFile = l1XMLFile
l1ConfigSvc.ConfigSource = "XML"
acc.addService( l1ConfigSvc )
from TrigConfigSvc.TrigConfigSvcConf import TrigConf__HLTConfigSvc
hltConfigSvc = TrigConf__HLTConfigSvc( "HLTConfigSvc" )
hltJsonFile = flags.Trigger.HLTMenuFile.replace(".xml",".json").replace("HLTconfig","HLTmenu")
#hltJsonFile = findFileInXMLPATH(hltJsonFile)
log.debug( "HLTConfigSvc input file:"+hltJsonFile )
hltConfigSvc.JsonFileName = hltJsonFile
acc.addService( hltConfigSvc )
return acc
from TrigConfigSvc.TrigConfigSvcCfg import TrigConfigSvcCfg
return TrigConfigSvcCfg( flags )
if __name__ == "__main__":
from AthenaCommon.Configurable import Configurable
......
/*
Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/
// class declaration
......@@ -57,16 +57,8 @@ using namespace TrigConf;
HLTConfigSvc::HLTConfigSvc( const string& name, ISvcLocator* pSvcLocator ) :
base_class(name, pSvcLocator),
m_eventStore(0),
m_currentLumiblock(0),
m_currentPSS(0),
m_setMergedHLT(true),
m_doMon(false),
m_partition(""),
m_histProp_timePrescaleUpdate(Gaudi::Histo1DDef("Time for prescale update",0,200,100)),
m_hist_timePrescaleUpdate(0),
m_hist_prescaleLB(0),
m_PartitionName("")
m_eventStore( "StoreGateSvc/StoreGateSvc", name ),
m_histProp_timePrescaleUpdate(Gaudi::Histo1DDef("Time for prescale update",0,200,100))
{
base_class::declareCommonProperties();
......@@ -293,8 +285,8 @@ HLTConfigSvc::initialize() {
ATH_MSG_INFO("Fired Incident 'TrigConf' - " << incname);
}
CHECK(service("StoreGateSvc", m_eventStore, /*createIf=*/false));
CHECK( m_eventStore.retrieve() );
ATH_MSG_INFO("finish initialize");
return StatusCode::SUCCESS;
......@@ -355,7 +347,7 @@ TrigConf::HLTConfigSvc::applyPrescaleSet(const TrigConf::HLTPrescaleSet& pss) {
ATH_MSG_INFO("Applying PSK " << pss.id() << " to menu ");
const EventInfo* pEvent(0);
if ( m_eventStore && m_eventStore->retrieve(pEvent).isSuccess() ) {
if ( m_eventStore->retrieve(pEvent).isSuccess() ) {
ATH_MSG_INFO("on event " << *pEvent->event_ID());
}
......
/*
Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/
#ifndef TrigConfigSvc_HLTConfigSvc
......@@ -81,25 +81,25 @@ namespace TrigConf {
enum ConfigSource { XML, ORACLE, MYSQL, SQLITE, DBLOOKUP };
StoreGateSvc* m_eventStore;
ServiceHandle<StoreGateSvc> m_eventStore;
// The configuration:
HLTFrame m_HLTFrame; // what for is this varaible - seems unused ???
uint m_currentLumiblock;
uint m_currentPSS;
uint m_currentLumiblock { 0 };
uint m_currentPSS { 0 };
// Properties:
bool m_setMergedHLT;
bool m_doMon;
std::string m_partition;
bool m_setMergedHLT { true };
bool m_doMon { false };
std::string m_partition { "" };
Histo1DProperty m_histProp_timePrescaleUpdate;
// Histograms:
TH1F* m_hist_timePrescaleUpdate;
TH2I* m_hist_prescaleLB;
TH1F* m_hist_timePrescaleUpdate { nullptr };
TH2I* m_hist_prescaleLB { nullptr };
StringProperty m_PartitionName; // non-empty job-property overwrite value from DataFlowConfig
StringProperty m_PartitionName { "" }; // non-empty job-property overwrite value from DataFlowConfig
};
}
......
/*
Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/
#include "./LVL1ConfigSvc.h"
......@@ -38,141 +38,163 @@
#include "TrigConfL1Data/JetThresholdValue.h"
#include "TrigConfL1Data/L1DataDef.h"
#include "TrigConfBase/TrigDBConnectionConfig.h"
#include "TrigConfInterfaces/IJobOptionsSvc.h"
#include "boost/algorithm/string/case_conv.hpp"
#include "boost/algorithm/string.hpp"
// STL includes:
#include <exception>
#include <vector>
using namespace std;
using namespace TrigConf;
LVL1ConfigSvc::LVL1ConfigSvc( const std::string& name, ISvcLocator* pSvcLocator ) :
base_class( name, pSvcLocator ),
m_detectorStore(0),
m_ctpConfig(0),
m_thrcfg(0),
m_muctpi(0),
m_prescaleSetID(0),
m_bunchgroupSetID(0),
m_dumpTTVmap(false)
{
TrigConf::LVL1ConfigSvc::LVL1ConfigSvc( const std::string& name, ISvcLocator* pSvcLocator ) :
base_class( name, pSvcLocator )
{
base_class::declareCommonProperties();
declareProperty( "DBLVL1PSKey", m_prescaleSetID, "L1 Prescale key");
declareProperty( "DBBGSKey", m_bunchgroupSetID, "L1 Bunchgroup key");
declareProperty( "DumpTTVmap", m_dumpTTVmap, "Dump threshold vector");
}
LVL1ConfigSvc::~LVL1ConfigSvc()
TrigConf::LVL1ConfigSvc::~LVL1ConfigSvc()
{}
const TrigConf::ThresholdConfig*
TrigConf::LVL1ConfigSvc::thresholdConfig() const { return m_ctpConfig ? &m_ctpConfig->menu().thresholdConfig() : nullptr; }
StatusCode
LVL1ConfigSvc::writeConfigToDetectorStore() {
TrigConf::LVL1ConfigSvc::initializeRun3StyleMenu() {
m_inputType = boost::to_lower_copy(m_inputType.value()); // lower case
if( auto joSvc = serviceLocator()->service<TrigConf::IJobOptionsSvc>( "JobOptionsSvc" ) ) {
if( joSvc->superMasterKey()>0 ) {
ATH_MSG_INFO("Taking new style menu from db with setting from TrigConf::JobOptionsSvc");
m_inputType = "db";
m_smk = joSvc->superMasterKey();
m_dbConnection = joSvc->server();
}
}
ATH_MSG_INFO("Run 3 style menu configuration");
ATH_MSG_INFO(" Run 3 input type = " << m_inputType.value());
if( m_inputType == "file" ) {
ATH_MSG_INFO(" Run 3 input file = " << m_l1FileName.value());
} else if ( m_inputType == "db" ) {
ATH_MSG_INFO(" Run 3 DB connection = " << m_dbConnection);
ATH_MSG_INFO(" Run 3 SMK = " << m_smk);
}
if( ! loadRun3StyleMenu().isSuccess() ) {
ATH_MSG_INFO( "The previous WARNING message is being ignored in the current transition phase. Once we rely entirely on the new menu providing mechanism, this will become a reason to abort.");
}
return StatusCode::SUCCESS;
}
StatusCode
TrigConf::LVL1ConfigSvc::loadRun3StyleMenu() {
// do not write empty menu to storegate, so people can check on handlekey being valid
if( m_inputType == "none" ) {
ATH_MSG_INFO( "No L1 menu recorded in the detector store" );
return StatusCode::SUCCESS;
}
TrigConf::L1Menu * l1menu = new TrigConf::L1Menu();
if( m_inputType == "db" ) {
// db menu loader
TrigConf::TrigDBMenuLoader dbloader(m_dbConnection);
dbloader.setLevel(TrigConf::MSGTC::WARNING);
if( dbloader.loadL1Menu( m_smk, *l1menu ) ) {
ATH_MSG_INFO( "Loaded L1 menu from DB " << m_dbConnection << " for SMK " << m_smk.value() );
} else {
ATH_MSG_WARNING( "Failed loading L1 menu from DB for SMK " << m_smk.value());
return StatusCode::RECOVERABLE;
}
} else if ( m_inputType == "file" ) {
// json file menu loader
TrigConf::JsonFileLoader fileLoader;
fileLoader.setLevel(TrigConf::MSGTC::WARNING);
if( fileLoader.loadFile( m_l1FileName, *l1menu ) ) {
ATH_MSG_INFO( "Loaded L1 menu file " << m_l1FileName.value() );
} else {
ATH_MSG_WARNING( "Failed loading L1 menu file " << m_l1FileName.value());
return StatusCode::RECOVERABLE;
}
} else if( m_inputType == "cool" ) {
ATH_MSG_FATAL( "Loading of L1 menu from COOL + DB not implemented");
return StatusCode::FAILURE;
}
// auto writeHandle = SG::makeHandle(m_l1MenuKey);
// ATH_MSG_INFO("Recording L1 menu with " << m_l1MenuKey);
// ATH_CHECK( writeHandle.record( std::unique_ptr<TrigConf::L1Menu>(l1menu) ));
ServiceHandle<StoreGateSvc> detStore( "StoreGateSvc/DetectorStore", name() );
ATH_CHECK( detStore.retrieve() );
if( detStore->record(l1menu,"L1TriggerMenu").isSuccess() ) {
ATH_MSG_INFO( "Recorded L1 menu with key 'L1TriggerMenu' in the detector store" );
}
return StatusCode::SUCCESS;
}
StatusCode
LVL1ConfigSvc::initialize() {
TrigConf::LVL1ConfigSvc::initializeRun2StyleMenu() {
/// Handle to JobOptionsSvc used to retrieve the DataFlowConfig property
m_configSourceString = boost::to_lower_copy(m_configSourceString); // lower case
// ATH_CHECK( m_l1MenuKey.initialize() );
if( auto joSvc = serviceLocator()->service<TrigConf::IJobOptionsSvc>( "JobOptionsSvc" ) ) {
if( joSvc->superMasterKey()>0 ) {
m_inputType = "db";
m_smk = joSvc->superMasterKey();
m_dbConnection = joSvc->server();
m_configSourceString = "NONE";
if ( m_configSourceString == "none" ) {
ATH_MSG_INFO("Run 2 style menu has been disabled");
m_xmlFile = "";
} else if( m_configSourceString == "xml") {
if( boost::algorithm::ends_with(m_xmlFile, ".xml") && ! boost::algorithm::starts_with(m_xmlFile, "./") ) {
m_xmlFile = PathResolver::find_file( m_xmlFile, "XMLPATH" );
}
} else {
ATH_MSG_INFO("Did not locate TrigConf::JobOptionsSvc, not running athenaHLT");
TrigDBConnectionConfig::DBType dbtype(TrigDBConnectionConfig::DBLookup);
if (m_configSourceString == "oracle") { dbtype = TrigDBConnectionConfig::Oracle; }
else if (m_configSourceString == "mysql") { dbtype = TrigDBConnectionConfig::MySQL; }
else if (m_configSourceString == "sqlite") { dbtype = TrigDBConnectionConfig::SQLite; }
if(m_dbHLTPSKey) {
m_dbconfig = std::make_unique<TrigDBConnectionConfig>( dbtype, m_dbServer, m_dbSMKey, m_dbHLTPSKey );
} else {
m_dbconfig = std::make_unique<TrigDBConnectionConfig>( dbtype, m_dbServer, m_dbSMKey, m_dbHLTPSKeySet );
}
m_dbconfig->m_useFrontier = m_useFrontier;
}
StatusCode sc = writeConfigToDetectorStore();
if( !sc.isSuccess() ) {
ATH_MSG_INFO( "This previous WARNING message is being ignored in the current transition phase. Once we rely entirely on the new menu providing mechanism, this will become a reason to abort.");
ATH_MSG_INFO("Run 2 style menu");
ATH_MSG_INFO(" Run 2 config source = " << m_configSourceString);
if( m_configSourceString != "none" ) {
if( m_configSourceString == "xml" ) {
ATH_MSG_INFO(" Run 2 Input file = " << m_xmlFile);
} else {
ATH_MSG_INFO(" Run 2 DB Server = " << m_dbServer);
ATH_MSG_INFO(" Run 2 DB User = " << m_dbUser);
ATH_MSG_INFO(" Run 2 DB Table = " << m_dbTable);
ATH_MSG_INFO(" Run 2 DB connection = " << m_dbconfig->toString());
ATH_MSG_INFO(" Run 2 SMK = " << m_dbSMKey);
ATH_MSG_INFO(" Run 2 L1 PSK = " << m_prescaleSetID);
ATH_MSG_INFO(" Run 2 BGSK = " << m_bunchgroupSetID);
ATH_MSG_INFO(" UseFrontier = " << m_useFrontier.value());
}
}
CHECK(ConfigSvcBase::initialize());
// could be that this is needed when running from DB
CHECK(setProperties());
if( !fromDB() and m_xmlFile=="NONE" ) {
if( m_dbconfig==nullptr && m_xmlFile=="NONE" ) {
ATH_MSG_INFO("xml file set to NONE, will not load LVL1 Menu");
return StatusCode::SUCCESS;
} else {
CHECK( loadRun2StyleMenu() );
}
return StatusCode::SUCCESS;
}
if( fromDB() ) {
ATH_MSG_INFO(" DB LVL1 PrescaleKey = " << m_prescaleSetID);
ATH_MSG_INFO(" DB BunchGroupSetKey = " << m_bunchgroupSetID);
}
/**
* Loading Run-2-style menu
*/
StatusCode
TrigConf::LVL1ConfigSvc::loadRun2StyleMenu() {
CHECK( initStorageMgr() );
try {
// m_storageMgr->setLevel(MSGTC::DEBUG); // TODO check if this is propagated to the loader
// m_storageMgr->masterTableLoader().setLevel(MSGTC::DEBUG);
m_ctpConfig = new CTPConfig();
m_ctpConfig->setSMK( m_dbSMKey );
m_ctpConfig->setPrescaleSetId( m_prescaleSetID );
......@@ -183,37 +205,25 @@ LVL1ConfigSvc::initialize() {
return StatusCode::FAILURE;
}
ATH_MSG_VERBOSE("CTPConfig object loaded");
m_thrcfg = &m_ctpConfig->menu().thresholdConfig();
m_muctpi = new Muctpi();
m_muctpi->setSMK( m_dbSMKey );
//m_muctpi->setLvl1MasterTableId( 0 );
m_storageMgr->masterTableLoader().load( *m_muctpi );
ATH_MSG_VERBOSE("MuCTPI configuration object loaded");
} catch ( std::exception & e ) {
CHECK(freeStorageMgr());
ATH_MSG_ERROR("Standard C++ exception caught: " << e.what());
return StatusCode::FAILURE;
} catch ( ... ) {
CHECK(freeStorageMgr());
ATH_MSG_ERROR("Unknown exception caught.");
return StatusCode::FAILURE;
}
CHECK(freeStorageMgr());
//
// Check if we have a valid trigger menu:
//
/**
* Check if we have a valid trigger menu:
*/
if( Verifyer::verify( m_ctpConfig->menu(), msg() ) ) {
ATH_MSG_ERROR("Loaded trigger menu fails verification");
return StatusCode::FAILURE;
......@@ -221,23 +231,29 @@ LVL1ConfigSvc::initialize() {
ATH_MSG_DEBUG("Loaded trigger menu passed verification");
}
ATH_MSG_DEBUG("Dumping LVL1 configuration");
return StatusCode::SUCCESS;
}
if (msgSvc()->outputLevel(name()) <= MSG::INFO) {
m_ctpConfig->print(" ", m_printMenuLevel);
}
// Dump threshold value map
if (m_dumpTTVmap) {
ATH_MSG_DEBUG("Dumping ThresholdValue map from ThresholdConfig");
m_thrcfg->printThresholdValueMap();
}
StatusCode
TrigConf::LVL1ConfigSvc::initialize() {
CHECK(AthService::initialize());
/// Handle to JobOptionsSvc used to retrieve the DataFlowConfig property
ATH_MSG_INFO("=================================");
ATH_MSG_INFO("Initializing " << name() << " service");
ATH_MSG_INFO("=================================");
/*
initializing and load new and old menu
*/
CHECK( initializeRun3StyleMenu() );
// Get a hold of the DetectorStore:
CHECK(service( "DetectorStore", m_detectorStore ));
CHECK( initializeRun2StyleMenu() );
//
// fire incident
// fire incident (this has to be revisited)
//
ServiceHandle<IIncidentSvc> incSvc("IncidentSvc",name());
if (incSvc.retrieve().isFailure()) {
......@@ -255,12 +271,10 @@ LVL1ConfigSvc::initialize() {
}
StatusCode
LVL1ConfigSvc::finalize() {
TrigConf::LVL1ConfigSvc::finalize() {
ATH_MSG_DEBUG("Finalizing");
// Delete configuration objects:
//delete m_thrcfg;
delete m_ctpConfig;
delete m_muctpi;
......@@ -271,7 +285,7 @@ LVL1ConfigSvc::finalize() {
}
StatusCode
LVL1ConfigSvc::queryInterface( const InterfaceID& riid, void** ppvIF ) {
TrigConf::LVL1ConfigSvc::queryInterface( const InterfaceID& riid, void** ppvIF ) {
StatusCode sc = StatusCode::FAILURE;
......@@ -296,8 +310,8 @@ LVL1ConfigSvc::queryInterface( const InterfaceID& riid, void** ppvIF ) {
}
const BunchGroupSet*
LVL1ConfigSvc::bunchGroupSet() const {
const TrigConf::BunchGroupSet*
TrigConf::LVL1ConfigSvc::bunchGroupSet() const {
if (ctpConfig()==0) return 0;
return &ctpConfig()->bunchGroupSet();
}
/*
Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/
#ifndef TrigConfigSvc_LVL1ConfigSvc
......@@ -39,37 +39,54 @@ namespace TrigConf {
// Access functions described by ILVL1ConfigSvc:
const Muctpi* muctpiConfig() const { return m_muctpi; }
const CTPConfig* ctpConfig() const { return m_ctpConfig; }
const ThresholdConfig* thresholdConfig() const { return m_thrcfg; }
const ThresholdConfig* thresholdConfig() const;
const BunchGroupSet* bunchGroupSet() const;
uint32_t lvl1PrescaleKey() const { return m_prescaleSetID; }
uint32_t lvl1PrescaleKey() const { return static_cast<uint32_t>(m_prescaleSetID); }
private:
StatusCode writeConfigToDetectorStore();
// loads Run-2-style menu (xml) and keeps in memory to be
// provided to clients of the L1 configuration via the access methods above
StatusCode loadRun2StyleMenu();
// jobProperties
Gaudi::Property< std::string > m_inputType { this, "InputType", "file", "file (json file), db (Trigger DB), cool (keys from cool, content from Trigger DB), none (no menu)" };
Gaudi::Property< std::string > m_l1FileName { this, "JsonFileName", "L1Menu.json", "file name of L1 json file, needed if InputType is file" };
Gaudi::Property< std::string > m_dbConnection { this, "TriggerDB", "TRIGGERDB", "DB connection alias, needed if InputType is db" };
Gaudi::Property< unsigned int > m_smk { this, "SMK", 0, "DB smk, needed if InputType is db" };
// loads Run-3-style menu (json) and writes it to the detector
// store to be read by clients of the L1 configuration from there
StatusCode loadRun3StyleMenu();
//SG::WriteHandleKey<TrigConf::L1Menu> m_l1MenuKey{"DetectorStore+L1TriggerMenu"};
/*
Run 2-style menu (xml) initialization and loading
This is still needed in the transition period and even
afterwards still for reading Run 2 menu configuration. It
* verifies and manipulates the job properties related to the Run 2 menu
* calls loading Run 2 Style menu (xml) from either file or DB
*/
StatusCode initializeRun2StyleMenu();
::StoreGateSvc* m_detectorStore;
// the configuration
CTPConfig* m_ctpConfig;
ThresholdConfig* m_thrcfg;
Muctpi* m_muctpi;
/*
Run 3-style menu (json) initialization and loading
* verifies and manipulates the job properties related to the Run 3 menu
* calls loading Run 3 Style menu (json) from either file or DB
*/
StatusCode initializeRun3StyleMenu();
// Properties:
//int m_masterID;
int m_prescaleSetID;
int m_bunchgroupSetID;
BooleanProperty m_dumpTTVmap;
// jobProperties for Run 3 style menu
Gaudi::Property< std::string > m_inputType { this, "InputType", "file", "file (json file), db (Trigger DB), cool (keys from cool, content from Trigger DB), none (no menu)" };
Gaudi::Property< std::string > m_l1FileName { this, "JsonFileName", "", "file name of L1 json file, needed if InputType is file" };
Gaudi::Property< std::string > m_dbConnection { this, "TriggerDB", "TRIGGERDB", "DB connection alias, needed if InputType is db" };
Gaudi::Property< unsigned int > m_smk { this, "SMK", 0, "DB smk, needed if InputType is db" };
// Run 2 style configuration
CTPConfig* m_ctpConfig { nullptr };
Muctpi* m_muctpi { nullptr };
// Properties:
Gaudi::Property< int > m_prescaleSetID { this, "DBLVL1PSKey", 0, "L1 Prescale key" };
Gaudi::Property< int > m_bunchgroupSetID { this, "DBBGSKey", 0, "L1 Bunchgroup key" };
Gaudi::Property< bool > m_dumpTTVmap { this, "DumpTTVmap", false, "Dump threshold vector" };
};
}
......