5#define BOOST_BIND_GLOBAL_PLACEHOLDERS
6#include <boost/property_tree/json_parser.hpp>
47 ATH_MSG_DEBUG(
"No EnhancedBiasTool. Not doing additional weighting.");
49 ATH_MSG_FATAL(
"Configured to use Enhanced Bias weights. Must supply weighting tool.");
50 return StatusCode::FAILURE;
58 if (hashFile.empty()) {
67 ATH_CHECK(
m_histSvc->regTree(
"/COSTSTREAM/metadata", std::make_unique<TTree>(
"metadata",
"metadata")) );
70 return StatusCode::SUCCESS;
77 using boost::property_tree::ptree;
82 const ptree& menuData = hltMenuHandle->data();
83 for (
const auto& sequencer : menuData.get_child(
"sequencers")) {
85 for (
const auto& alg : sequencer.second) {
87 size_t breakPoint = alg.second.data().find(
'/');
88 std::string algType = alg.second.data().substr(0, breakPoint);
89 std::string algName = alg.second.data().substr(breakPoint+1, alg.second.data().size());
90 std::replace(algType.begin(), algType.end(),
':',
'_');
91 std::replace(algName.begin(), algName.end(),
':',
'_');
94 if (algType.find(
"EventViewCreatorAlgorithm") != std::string::npos) {
102 std::vector<TrigConf::Chain> chains;
109 const size_t legsSize {chain.legMultiplicities().size()};
110 for (
size_t counter = 0; legsSize > 1 && counter < legsSize; ++counter){
119 size_t breakPoint = entry.find(
'/');
120 if (breakPoint != std::string::npos){
121 std::string algType = entry.substr(0, breakPoint);
122 const std::string algName = entry.substr(breakPoint+1, entry.size());
123 std::replace(algType.begin(), algType.end(),
':',
'_');
133 return StatusCode::SUCCESS;
139 return StatusCode::SUCCESS;
145 ATH_MSG_DEBUG(std::format(
"Extending maximum View instances from {} to {}", current,
max));
151 std::format(
"{}_view_{}", store, viewID),
"STORE");
156 std::format(
"{}_StoreGateSvc_Impl", viewID),
"STORE");
159 return StatusCode::SUCCESS;
164 double ebWeight = 1.0;
174 std::string histName(hist->GetName());
175 std::string bookingString =
"/COSTSTREAM/" + tDir +
"/" + histName;
177 if (!((
m_histSvc->regHist(bookingString, hist)).isSuccess())) {
178 ATH_MSG_WARNING(
"Problem registering histogram with name " << histName);
187 const EventContext& context = ctx;
195 return StatusCode::SUCCESS;
199 ATH_MSG_DEBUG(
"Monitoring event " << context.eventID().event_number() <<
" in LB " << context.eventID().lumi_block() <<
" in range " << range->getName());
210 if (metadataDataHandle.
isValid()){
214 m_hostnames.insert(
tc->getDetail<std::string>(
"hostname"));
215 }
catch (
const std::exception& ) {
216 ATH_MSG_WARNING(
"Missing HLT_RuntimeMetadata EDM hostname for event " << context.eventID().event_number());
222 ATH_MSG_DEBUG(
"Not valid HLT_RuntimeMetadata handle for the event " << context.eventID().event_number());
227 std::map<std::string, std::set<size_t>> chainToAlgIdx;
228 std::map<std::string, std::set<size_t>> chainToUniqAlgs;
229 std::map<std::string, std::map<int16_t, std::set<size_t>>> seqToAlgIdx;
230 std::map<std::string, std::set<std::string>> algToChain;
235 std::map<std::string, std::string> algToSeq;
245 for (
const std::string& chain : algToChain[algName]){
246 chainToAlgIdx[chain].insert(
tc->index());
251 ATH_MSG_DEBUG(
"Algorithm " << algName <<
" executed uniquely for " << *algToChain[algName].begin() <<
" chain");
252 chainToUniqAlgs[*algToChain[algName].begin()].insert(
tc->index());
255 if (algToSeq.count(algName)){
256 const int16_t view =
tc->getDetail<int16_t>(
"view");
257 seqToAlgIdx[algToSeq[algName]][view].insert(
tc->index());
261 const std::set<TrigCompositeUtils::DecisionID> seededChains =
m_algToChainTool->retrieveActiveChains(context,
"HLTNav_L1");
262 std::vector<TrigCompositeUtils::AlgToChainTool::ChainInfo> seededChainsInfo;
265 bool skipMonitoringThisEvent =
false;
268 skipMonitoringThisEvent =
true;
271 for (
auto id : seededChains){
274 seededChainsInfo.push_back(std::move(chainInfo));
285 costData.
setLb( context.eventID().lumi_block() );
289 bool liveTimeIsPerEvent =
true;
290 if (liveTime == 0.0) {
292 liveTimeIsPerEvent =
false;
294 costData.
setLivetime( liveTime, liveTimeIsPerEvent );
297 ATH_CHECK( range->newEvent( costData,
getWeight(context), skipMonitoringThisEvent ) );
303 return StatusCode::SUCCESS;
322 ATH_CHECK( range->addMonitor(std::make_unique<MonitorAlgorithm>(
"Algorithm_HLT", range)) );
323 ATH_MSG_DEBUG(
"Registering Algorithm_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
326 ATH_CHECK( range->addMonitor(std::make_unique<MonitorAlgorithmClass>(
"Algorithm_Class_HLT", range)) );
327 ATH_MSG_DEBUG(
"Registering Algorithm_Class_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
330 ATH_CHECK( range->addMonitor(std::make_unique<MonitorGlobal>(
"Global_HLT", range)) );
331 ATH_MSG_DEBUG(
"Registering Global_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
334 ATH_CHECK( range->addMonitor(std::make_unique<MonitorThreadOccupancy>(
"Thread_Occupancy_HLT", range)) );
335 ATH_MSG_DEBUG(
"Registering Thread_Occupancy_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
338 ATH_CHECK( range->addMonitor(std::make_unique<MonitorROS>(
"ROS_HLT", range)) );
339 ATH_MSG_DEBUG(
"Registering ROS_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
342 ATH_CHECK( range->addMonitor(std::make_unique<MonitorChain>(
"Chain_HLT", range)) );
343 ATH_MSG_DEBUG(
"Registering Chain_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
346 ATH_CHECK( range->addMonitor(std::make_unique<MonitorChainAlgorithm>(
"Chain_Algorithm_HLT", range)) );
347 ATH_MSG_DEBUG(
"Registering Chain_Algorihtm_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
350 ATH_CHECK( range->addMonitor(std::make_unique<MonitorSequence>(
"Sequence_HLT", range)) );
351 ATH_MSG_DEBUG(
"Registering Sequence_HLT Monitor for range " << range->getName() <<
". Size:" << range->getMonitors().size());
356 for (
const std::unique_ptr<MonitorBase>& monitor : range->getMonitors()){
357 monitor->msg().setLevel(
msg().level());
360 return StatusCode::SUCCESS;
367 constexpr bool includeEndOfLB =
false;
369 std::string rangeName;
373 const auto lumiBlock = context.eventID().lumi_block();
377 if (includeEndOfLB && stop !=
start) {
378 rangeName = std::format(
"LumiBlock_{:05}_{}",
start, stop);
380 rangeName = std::format(
"LumiBlock_{:05}",
start);
386 range = it->second.get();
387 return StatusCode::SUCCESS;
392 return StatusCode::SUCCESS;
397 std::make_unique<MonitoredRange>(rangeName,
this)
401 range = it->second.get();
402 return StatusCode::SUCCESS;
406 range = it->second.get();
407 return StatusCode::SUCCESS;
415 if (costCollection->
size() == 0) {
418 const uint32_t initialSlot = costCollection->
at(0)->getDetail<uint32_t>(
"slot");
420 const uint32_t algSlot =
tc->getDetail<uint32_t>(
"slot");
421 if (algSlot == 0 or algSlot != initialSlot) {
434 std::stringstream
ss;
438 const uint64_t
start =
tc->getDetail<uint64_t>(
"start");
439 const uint64_t stop =
tc->getDetail<uint64_t>(
"stop");
440 const uint32_t slot =
tc->getDetail<uint32_t>(
"slot");
441 const uint64_t start_ms_round = std::llround(
start * 1e-3 );
442 const uint64_t stop_ms_round = std::llround( stop * 1e-3 );
443 const uint32_t threadID =
tc->getDetail<uint32_t>(
"thread");
445 ss <<
"{id:" << algID++;
446 ss <<
", group:" << threadID;
447 ss <<
", className:'slot" << slot <<
"'";
450 ss <<
", duration:" << (stop -
start);
451 ss <<
", start:" << start_ms_round;
452 if (stop_ms_round > start_ms_round) {
453 ss <<
", end:" << stop_ms_round;
455 ss <<
", type:'point'";
460 ATH_MSG_DEBUG(
"Full Event Summary for event " << context.eventID().event_number());
464 return StatusCode::SUCCESS;
472 return StatusCode::SUCCESS;
484 std::string hostnamesList =
"";
485 if (m_hostnames.size() > 1){
487 for (
const auto& name : m_hostnames) hostnamesList += name +
",";
488 hostnamesList.pop_back();
489 }
else if (m_hostnames.size() == 1) {
490 hostnamesList = *m_hostnames.begin();
496 if ( hltMenuHandle.
isValid() ){
497 std::stringstream
ss;
498 boost::property_tree::json_parser::write_json(
ss, hltMenuHandle->data());
512 m_metadataTree->Branch(
"ChainAlgorithmMonitor", &ChainAlgorithmMonitor);
514 m_metadataTree->Branch(
"AlgorithmClassMonitor", &AlgorithmClassMonitor);
527 std::string atlasProject = std::getenv(
"AtlasProject");
528 std::string atlasVersion = std::getenv(
"AtlasVersion");
533 std::string processedRanges;
538 std::stringstream
ss;
540 ss << rangePair.first <<
": ";
541 std::string lbrange = rangePair.first.substr(strlen(
"LumiBlock_"));
542 ss <<
" Lumiblocks " << std::stoi(lbrange) <<
" to " << std::stoi(lbrange) +
m_TimeRangeLengthLB <<
", ";
544 processedRanges =
ss.str();
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(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 setCostROSData(const CostROSData &costROSData)
Set ROS to ROB 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.
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.
StatusCode set(const xAOD::TrigCompositeContainer *costCollection, const xAOD::TrigCompositeContainer *rosCollection, uint32_t onlineSlot)
Cache the cost and ros collections, after formally requesting it from storegate.
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 const std::string hash2string(HLTHash, const std::string &category="TE")
hash function translating identifiers into names (via internal dictionary)
static HLTHash string2hash(const std::string &, const std::string &category="TE")
hash function translating TE names into identifiers
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
Gaudi::Property< bool > m_doMonitorROS
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
Gaudi::Property< std::map< std::string, std::vector< uint32_t > > > m_rosToRob
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
SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_rosDataKey
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.
CostROSData m_costROSData
Cached CostROSData class with details needed for ROS monitoring.
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.