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;
258 if (seededChains.size() <= 2) {
261 if ((seededChains.size() == 1 && costChain) || (seededChains.size() == 2 && costChain && l1Streamer) ){
262 skipMonitoringThisEvent =
true;
266 for (
auto id : seededChains){
269 seededChainsInfo.push_back(std::move(chainInfo));
279 costData.
setLb( context.eventID().lumi_block() );
283 bool liveTimeIsPerEvent =
true;
284 if (liveTime == 0.0) {
286 liveTimeIsPerEvent =
false;
288 costData.
setLivetime( liveTime, liveTimeIsPerEvent );
291 ATH_CHECK( range->newEvent( costData,
getWeight(context), skipMonitoringThisEvent ) );
297 return StatusCode::SUCCESS;
316 ATH_CHECK( range->addMonitor(std::make_unique<MonitorAlgorithm>(
"Algorithm_HLT", range)) );
317 ATH_MSG_DEBUG(
"Registering Algorithm_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
320 ATH_CHECK( range->addMonitor(std::make_unique<MonitorAlgorithmClass>(
"Algorithm_Class_HLT", range)) );
321 ATH_MSG_DEBUG(
"Registering Algorithm_Class_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
324 ATH_CHECK( range->addMonitor(std::make_unique<MonitorGlobal>(
"Global_HLT", range)) );
325 ATH_MSG_DEBUG(
"Registering Global_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
328 ATH_CHECK( range->addMonitor(std::make_unique<MonitorThreadOccupancy>(
"Thread_Occupancy_HLT", range)) );
329 ATH_MSG_DEBUG(
"Registering Thread_Occupancy_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
332 ATH_CHECK( range->addMonitor(std::make_unique<MonitorChain>(
"Chain_HLT", range)) );
333 ATH_MSG_DEBUG(
"Registering Chain_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
336 ATH_CHECK( range->addMonitor(std::make_unique<MonitorChainAlgorithm>(
"Chain_Algorithm_HLT", range)) );
337 ATH_MSG_DEBUG(
"Registering Chain_Algorihtm_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
340 ATH_CHECK( range->addMonitor(std::make_unique<MonitorSequence>(
"Sequence_HLT", range)) );
341 ATH_MSG_DEBUG(
"Registering Sequence_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
346 for (
const std::unique_ptr<MonitorBase>& monitor : range->getMonitors()){
347 monitor->msg().setLevel(
msg().level());
350 return StatusCode::SUCCESS;
357 constexpr bool includeEndOfLB =
false;
359 std::string rangeName;
363 const auto lumiBlock = context.eventID().lumi_block();
367 if (includeEndOfLB && stop !=
start) {
368 rangeName = std::format(
"LumiBlock_{:05}_{}",
start, stop);
370 rangeName = std::format(
"LumiBlock_{:05}",
start);
376 range = it->second.get();
377 return StatusCode::SUCCESS;
382 return StatusCode::SUCCESS;
387 std::make_unique<MonitoredRange>(rangeName,
this)
391 range = it->second.get();
392 return StatusCode::SUCCESS;
396 range = it->second.get();
397 return StatusCode::SUCCESS;
405 if (costCollection->
size() == 0) {
408 const uint32_t initialSlot = costCollection->
at(0)->getDetail<uint32_t>(
"slot");
410 const uint32_t algSlot =
tc->getDetail<uint32_t>(
"slot");
411 if (algSlot == 0 or algSlot != initialSlot) {
424 std::stringstream
ss;
428 const uint64_t
start =
tc->getDetail<uint64_t>(
"start");
429 const uint64_t stop =
tc->getDetail<uint64_t>(
"stop");
430 const uint32_t slot =
tc->getDetail<uint32_t>(
"slot");
431 const uint64_t start_ms_round = std::llround(
start * 1e-3 );
432 const uint64_t stop_ms_round = std::llround( stop * 1e-3 );
433 const uint32_t threadID =
tc->getDetail<uint32_t>(
"thread");
435 ss <<
"{id:" << algID++;
436 ss <<
", group:" << threadID;
437 ss <<
", className:'slot" << slot <<
"'";
440 ss <<
", duration:" << (stop -
start);
441 ss <<
", start:" << start_ms_round;
442 if (stop_ms_round > start_ms_round) {
443 ss <<
", end:" << stop_ms_round;
445 ss <<
", type:'point'";
450 ATH_MSG_DEBUG(
"Full Event Summary for event " << context.eventID().event_number());
454 return StatusCode::SUCCESS;
462 return StatusCode::SUCCESS;
474 std::string hostnamesList =
"";
475 if (m_hostnames.size() > 1){
477 for (
const auto& name : m_hostnames) hostnamesList += name +
",";
478 hostnamesList.pop_back();
479 }
else if (m_hostnames.size() == 1) {
480 hostnamesList = *m_hostnames.begin();
486 if ( hltMenuHandle.
isValid() ){
487 std::stringstream
ss;
488 boost::property_tree::json_parser::write_json(
ss, hltMenuHandle->data());
501 m_metadataTree->Branch(
"ChainAlgorithmMonitor", &ChainAlgorithmMonitor);
503 m_metadataTree->Branch(
"AlgorithmClassMonitor", &AlgorithmClassMonitor);
515 std::string atlasProject = std::getenv(
"AtlasProject");
516 std::string atlasVersion = std::getenv(
"AtlasVersion");
521 std::string processedRanges;
526 std::stringstream
ss;
528 ss << rangePair.first <<
": ";
529 std::string lbrange = rangePair.first.substr(strlen(
"LumiBlock_"));
530 ss <<
" Lumiblocks " << std::stoi(lbrange) <<
" to " << std::stoi(lbrange) +
m_TimeRangeLengthLB <<
", ";
532 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.