5#define BOOST_BIND_GLOBAL_PLACEHOLDERS
6#include <boost/property_tree/json_parser.hpp>
45 ATH_MSG_DEBUG(
"No EnhancedBiasTool. Not doing additional weighting.");
47 ATH_MSG_FATAL(
"Configured to use Enhanced Bias weights. Must supply weighting tool.");
48 return StatusCode::FAILURE;
56 if (hashFile.empty()) {
63 ATH_CHECK(
m_histSvc->regTree(
"/COSTSTREAM/metadata", std::make_unique<TTree>(
"metadata",
"metadata")) );
66 return StatusCode::SUCCESS;
73 using boost::property_tree::ptree;
78 const ptree& menuData = hltMenuHandle->data();
79 for (
const auto& sequencer : menuData.get_child(
"sequencers")) {
81 for (
const auto& alg : sequencer.second) {
83 size_t breakPoint = alg.second.data().find(
'/');
84 std::string algType = alg.second.data().substr(0, breakPoint);
85 std::string algName = alg.second.data().substr(breakPoint+1, alg.second.data().size());
86 std::replace(algType.begin(), algType.end(),
':',
'_');
87 std::replace(algName.begin(), algName.end(),
':',
'_');
90 if (algType.find(
"EventViewCreatorAlgorithm") != std::string::npos) {
98 std::vector<TrigConf::Chain> chains;
105 const size_t legsSize {chain.legMultiplicities().size()};
106 for (
size_t counter = 0; legsSize > 1 && counter < legsSize; ++counter){
115 size_t breakPoint = entry.find(
'/');
116 if (breakPoint != std::string::npos){
117 std::string algType = entry.substr(0, breakPoint);
118 const std::string algName = entry.substr(breakPoint+1, entry.size());
119 std::replace(algType.begin(), algType.end(),
':',
'_');
129 return StatusCode::SUCCESS;
135 return StatusCode::SUCCESS;
141 ATH_MSG_DEBUG(std::format(
"Extending maximum View instances from {} to {}", current,
max));
147 std::format(
"{}_view_{}", store, viewID),
"STORE");
152 std::format(
"{}_StoreGateSvc_Impl", viewID),
"STORE");
155 return StatusCode::SUCCESS;
160 double ebWeight = 1.0;
170 std::string histName(hist->GetName());
171 std::string bookingString =
"/COSTSTREAM/" + tDir +
"/" + histName;
173 if (!((
m_histSvc->regHist(bookingString, hist)).isSuccess())) {
174 ATH_MSG_WARNING(
"Problem registering histogram with name " << histName);
183 const EventContext& context = ctx;
191 return StatusCode::SUCCESS;
195 ATH_MSG_DEBUG(
"Monitoring event " << context.eventID().event_number() <<
" in LB " << context.eventID().lumi_block() <<
" in range " << range->getName());
202 if (metadataDataHandle.
isValid()){
206 m_hostnames.insert(
tc->getDetail<std::string>(
"hostname"));
207 }
catch (
const std::exception& ) {
208 ATH_MSG_WARNING(
"Missing HLT_RuntimeMetadata EDM hostname for event " << context.eventID().event_number());
214 ATH_MSG_DEBUG(
"Not valid HLT_RuntimeMetadata handle for the event " << context.eventID().event_number());
219 std::map<std::string, std::set<size_t>> chainToAlgIdx;
220 std::map<std::string, std::set<size_t>> chainToUniqAlgs;
221 std::map<std::string, std::map<int16_t, std::set<size_t>>> seqToAlgIdx;
222 std::map<std::string, std::set<std::string>> algToChain;
227 std::map<std::string, std::string> algToSeq;
237 for (
const std::string& chain : algToChain[algName]){
238 chainToAlgIdx[chain].insert(
tc->index());
243 ATH_MSG_DEBUG(
"Algorithm " << algName <<
" executed uniquely for " << *algToChain[algName].begin() <<
" chain");
244 chainToUniqAlgs[*algToChain[algName].begin()].insert(
tc->index());
247 if (algToSeq.count(algName)){
248 const int16_t view =
tc->getDetail<int16_t>(
"view");
249 seqToAlgIdx[algToSeq[algName]][view].insert(
tc->index());
253 const std::set<TrigCompositeUtils::DecisionID> seededChains =
m_algToChainTool->retrieveActiveChains(context,
"HLTNav_L1");
254 std::vector<TrigCompositeUtils::AlgToChainTool::ChainInfo> seededChainsInfo;
257 bool skipMonitoringThisEvent =
false;
260 skipMonitoringThisEvent =
true;
263 for (
auto id : seededChains){
266 seededChainsInfo.push_back(std::move(chainInfo));
276 costData.
setLb( context.eventID().lumi_block() );
280 bool liveTimeIsPerEvent =
true;
281 if (liveTime == 0.0) {
283 liveTimeIsPerEvent =
false;
285 costData.
setLivetime( liveTime, liveTimeIsPerEvent );
288 ATH_CHECK( range->newEvent( costData,
getWeight(context), skipMonitoringThisEvent ) );
294 return StatusCode::SUCCESS;
313 ATH_CHECK( range->addMonitor(std::make_unique<MonitorAlgorithm>(
"Algorithm_HLT", range)) );
314 ATH_MSG_DEBUG(
"Registering Algorithm_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
317 ATH_CHECK( range->addMonitor(std::make_unique<MonitorAlgorithmClass>(
"Algorithm_Class_HLT", range)) );
318 ATH_MSG_DEBUG(
"Registering Algorithm_Class_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
321 ATH_CHECK( range->addMonitor(std::make_unique<MonitorGlobal>(
"Global_HLT", range)) );
322 ATH_MSG_DEBUG(
"Registering Global_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
325 ATH_CHECK( range->addMonitor(std::make_unique<MonitorThreadOccupancy>(
"Thread_Occupancy_HLT", range)) );
326 ATH_MSG_DEBUG(
"Registering Thread_Occupancy_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
329 ATH_CHECK( range->addMonitor(std::make_unique<MonitorChain>(
"Chain_HLT", range)) );
330 ATH_MSG_DEBUG(
"Registering Chain_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
333 ATH_CHECK( range->addMonitor(std::make_unique<MonitorChainAlgorithm>(
"Chain_Algorithm_HLT", range)) );
334 ATH_MSG_DEBUG(
"Registering Chain_Algorihtm_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
337 ATH_CHECK( range->addMonitor(std::make_unique<MonitorSequence>(
"Sequence_HLT", range)) );
338 ATH_MSG_DEBUG(
"Registering Sequence_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
343 for (
const std::unique_ptr<MonitorBase>& monitor : range->getMonitors()){
344 monitor->msg().setLevel(
msg().level());
347 return StatusCode::SUCCESS;
354 constexpr bool includeEndOfLB =
false;
356 std::string rangeName;
360 const auto lumiBlock = context.eventID().lumi_block();
364 if (includeEndOfLB && stop !=
start) {
365 rangeName = std::format(
"LumiBlock_{:05}_{}",
start, stop);
367 rangeName = std::format(
"LumiBlock_{:05}",
start);
373 range = it->second.get();
374 return StatusCode::SUCCESS;
379 return StatusCode::SUCCESS;
384 std::make_unique<MonitoredRange>(rangeName,
this)
388 range = it->second.get();
389 return StatusCode::SUCCESS;
393 range = it->second.get();
394 return StatusCode::SUCCESS;
402 if (costCollection->
size() == 0) {
405 const uint32_t initialSlot = costCollection->
at(0)->getDetail<uint32_t>(
"slot");
407 const uint32_t algSlot =
tc->getDetail<uint32_t>(
"slot");
408 if (algSlot == 0 or algSlot != initialSlot) {
421 std::stringstream
ss;
425 const uint64_t
start =
tc->getDetail<uint64_t>(
"start");
426 const uint64_t stop =
tc->getDetail<uint64_t>(
"stop");
427 const uint32_t slot =
tc->getDetail<uint32_t>(
"slot");
428 const uint64_t start_ms_round = std::llround(
start * 1e-3 );
429 const uint64_t stop_ms_round = std::llround( stop * 1e-3 );
430 const uint32_t threadID =
tc->getDetail<uint32_t>(
"thread");
432 ss <<
"{id:" << algID++;
433 ss <<
", group:" << threadID;
434 ss <<
", className:'slot" << slot <<
"'";
437 ss <<
", duration:" << (stop -
start);
438 ss <<
", start:" << start_ms_round;
439 if (stop_ms_round > start_ms_round) {
440 ss <<
", end:" << stop_ms_round;
442 ss <<
", type:'point'";
447 ATH_MSG_DEBUG(
"Full Event Summary for event " << context.eventID().event_number());
451 return StatusCode::SUCCESS;
459 return StatusCode::SUCCESS;
471 std::string hostnamesList =
"";
472 if (m_hostnames.size() > 1){
474 for (
const auto& name : m_hostnames) hostnamesList += name +
",";
475 hostnamesList.pop_back();
476 }
else if (m_hostnames.size() == 1) {
477 hostnamesList = *m_hostnames.begin();
483 if ( hltMenuHandle.
isValid() ){
484 std::stringstream
ss;
485 boost::property_tree::json_parser::write_json(
ss, hltMenuHandle->data());
498 m_metadataTree->Branch(
"ChainAlgorithmMonitor", &ChainAlgorithmMonitor);
500 m_metadataTree->Branch(
"AlgorithmClassMonitor", &AlgorithmClassMonitor);
512 std::string atlasProject = std::getenv(
"AtlasProject");
513 std::string atlasVersion = std::getenv(
"AtlasVersion");
518 std::string processedRanges;
523 std::stringstream
ss;
525 ss << rangePair.first <<
": ";
526 std::string lbrange = rangePair.first.substr(strlen(
"LumiBlock_"));
527 ss <<
" Lumiblocks " << std::stoi(lbrange) <<
" to " << std::stoi(lbrange) +
m_TimeRangeLengthLB <<
", ";
529 processedRanges =
ss.str();
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
boost::property_tree::ptree ptree
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Caches and propagates event data to be used by monitoring algorithms.
bool isMasterSlot() const
void setLb(uint32_t lb)
Setter of effective P1 walltime represented by the current event.
void setSequencersMap(const std::map< std::string, std::map< int16_t, std::set< size_t > > > &seqToAlg)
Set the sequence to alg idx map.
void setTypeMap(const std::unordered_map< uint32_t, std::string > &typeMap)
Set internal type map pointer.
void setChainToAlgMap(const std::map< std::string, std::set< size_t > > &algToChains)
Set the alg name to chains map.
void setSeededChains(const std::vector< TrigCompositeUtils::AlgToChainTool::ChainInfo > &seededChains)
Set the seeded chains set.
StatusCode set(const xAOD::TrigCompositeContainer *costCollection, uint32_t onlineSlot)
Cache the cost and ros collections, after formally requesting it from storegate.
void setLivetime(float time, bool liveTimeIsPerEvent)
Setter of effective P1 walltime represented by the current event, or the current lumi block.
void setChainToUniqAlgMap(const std::map< std::string, std::set< size_t > > &algToChains)
Set the chain to its unique alg names map.
const T * at(size_type n) const
Access an element, as an rvalue.
size_type size() const noexcept
Returns the number of elements in the collection.
Container which represents a time range and holds a collection of Monitors which monitor this range.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type get() const
Dereference the pointer, but don't cache anything.
static HLTHash string2hash(std::string_view, const std::string &category=s_defaultCategory)
hash function translating TE names into identifiers
static const std::string hash2string(HLTHash, const std::string &category=s_defaultCategory)
hash function translating identifiers into names (via internal dictionary)
static void file2hashes(const std::string &fileName="hashes2string.txt")
debugging output of internal dictionary
Gaudi::Property< bool > m_useEBWeights
uint32_t getOnlineSlot(const xAOD::TrigCompositeContainer *costCollection) const
Return the slot used to process the event online.
std::unordered_map< std::string, std::unique_ptr< MonitoredRange > > m_monitoredRanges
Owned storage of Ranges.
Gaudi::Property< bool > m_singleTimeRange
Gaudi::Property< std::set< std::string > > m_excludeAlgsFromChain
Gaudi::Property< std::vector< std::string > > m_additionalHashList
SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_metadataDataKey
Gaudi::Property< bool > m_doMonitorAlgorithm
Gaudi::Property< bool > m_doMonitorChainAlgorithm
virtual StatusCode finalize() final
Currently a noop for this algorithm.
Gaudi::Property< float > m_baseEventWeight
TH1 * bookGetPointer(TH1 *hist, const std::string &tDir="") const
Public method forwarded to this class' AthHistogramAlgorithm::bookGetPointer base.
ServiceHandle< ITHistSvc > m_histSvc
Gaudi::Property< bool > m_doMonitorSequence
std::atomic< size_t > m_maxViewsNumber
What is the maximum number of View instances we've so far cached string hashes to cover?
virtual StatusCode start()
Retrieve menu handle.
virtual StatusCode execute(const EventContext &ctx) final
Monitor event, unless max range limit reached and event outside of all ranges.
void writeMetadata()
Write to outpute tree (if any) the metadata needed downstream.
ToolHandle< IEnhancedBiasWeighter > m_enhancedBiasTool
Gaudi::Property< size_t > m_maxFullEventDumps
Gaudi::Property< std::string > m_additionalHashMap
std::mutex m_addHostnameMutex
Mutex to update set below.
StatusCode getRange(const EventContext &context, MonitoredRange *&range)
Return or construct and return a Range for the Context.
std::unordered_map< uint32_t, std::string > m_algTypeMap
Cache of algorithm's type, read from configuration data.
Gaudi::Property< size_t > m_maxTimeRange
Gaudi::Property< bool > m_doMonitorThreadOccupancy
StatusCode registerMonitors(MonitoredRange *range)
Populate a newly minted Range object with all configured Monitors.
Gaudi::Property< bool > m_doMonitorGlobal
Gaudi::Property< size_t > m_TimeRangeLengthLB
StatusCode checkUpdateMaxView(const size_t max)
High watermark for pre-cached string hashes for the SLOT category.
virtual StatusCode initialize() final
Retrieve tools and initialise read handles.
SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_costDataKey
TTree * m_metadataTree
Used to write out some metadata needed by post-processing (e.g.
TrigCostAnalysis(const std::string &name, ISvcLocator *pSvcLocator)
Construct TrigCostAnalysis.
SG::ReadHandleKey< TrigConf::HLTMenu > m_HLTMenuKey
ToolHandle< TrigCompositeUtils::AlgToChainTool > m_algToChainTool
std::set< std::string > m_storeIdentifiers
Identifiers of object stores, needed to cache STORE string-hash values.
Gaudi::Property< bool > m_doMonitorChain
StatusCode dumpEvent(const EventContext &context) const
Dump event algorithm execution data in ASCII format.
Gaudi::Property< bool > m_doMonitorAlgorithmClass
Gaudi::Property< uint64_t > m_fullEventDumpProbability
std::atomic< size_t > m_fullEventDumps
Counter to keep track of how many events have been full-dumped.
Gaudi::Property< std::string > m_singleTimeRangeName
float getWeight(const EventContext &context)
Compute global event weight to correct for online prescales.
bool checkDoFullEventDump(const EventContext &context, const CostData &costData)
Check if event dumping should be performed for the current event.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
HLT::Identifier createLegName(const HLT::Identifier &chainIdentifier, size_t counter)
Generate the HLT::Identifier which corresponds to a specific leg of a given chain.
TrigCompositeContainer_v1 TrigCompositeContainer
Declare the latest version of the container.
TrigComposite_v1 TrigComposite
Declare the latest version of the class.