5#ifndef WEBDAQHISTSVC_THISTSVC_H
6#define WEBDAQHISTSVC_THISTSVC_H
8#include "GaudiKernel/ITHistSvc.h"
9#include "GaudiKernel/IIncidentListener.h"
10#include "Gaudi/Interfaces/IOptionsSvc.h"
27#include <boost/regex.hpp>
28#include <boost/date_time/posix_time/posix_time_types.hpp>
29#include <tbb/concurrent_hash_map.h>
32#define NOSUPPORT(lvl, what) \
34 ATH_MSG_LVL(MSG::lvl, what << "is not supported by this implementation"); \
52class WebdaqHistSvc:
public extends<AthService, ITHistSvc, IIncidentListener>
59 virtual void handle(
const Incident& incident )
override;
60 virtual StatusCode
stop()
override;
61 virtual StatusCode
finalize()
override;
63 virtual StatusCode
regHist(
const std::string& name)
override;
64 virtual StatusCode
regHist(
const std::string& name, std::unique_ptr<TH1> hist)
override;
65 virtual StatusCode
regHist(
const std::string& name, TH1*)
override;
66 virtual StatusCode
getHist(
const std::string&
id, TH1*& hist,
size_t ind)
const override;
67 virtual StatusCode
getHist(
const std::string&
id, TH2*& hist,
size_t ind)
const override;
68 virtual StatusCode
getHist(
const std::string&
id, TH3*& hist,
size_t ind)
const override;
70 virtual StatusCode
deReg(TObject* obj)
override;
71 virtual StatusCode
deReg(
const std::string& name)
override;
73 virtual std::vector<std::string>
getHists()
const override;
74 std::set<std::string>
getSet(boost::regex)
const;
76 virtual StatusCode
regShared(
const std::string&, std::unique_ptr<TH1>, LockedHandle<TH1>& )
override;
77 virtual StatusCode
regShared(
const std::string&, std::unique_ptr<TH2>, LockedHandle<TH2>& )
override;
78 virtual StatusCode
regShared(
const std::string&, std::unique_ptr<TH3>, LockedHandle<TH3>& )
override;
79 virtual StatusCode
getShared(
const std::string&, LockedHandle<TH1>& )
const override;
80 virtual StatusCode
getShared(
const std::string&, LockedHandle<TH2>& )
const override;
81 virtual StatusCode
getShared(
const std::string&, LockedHandle<TH3>& )
const override;
83 virtual StatusCode
getTHists(TDirectory *td, TList &,
bool recurse=
false)
const override;
84 virtual StatusCode
getTHists(
const std::string& name, TList &,
bool recurse=
false)
const override;
85 virtual StatusCode
getTHists(TDirectory *td, TList &tl,
bool recurse=
false,
bool reg=
false)
override;
86 virtual StatusCode
getTHists(
const std::string& name, TList &tl,
bool recurse=
false,
bool reg=
false)
override;
88 virtual bool exists(
const std::string& name )
const override {
return existsHist(name); }
89 virtual bool existsHist(
const std::string& name )
const override;
92 virtual StatusCode
regTree(
const std::string&)
override {
NOSUPPORT(WARNING,
"TTree"); }
93 virtual StatusCode
regTree(
const std::string&, std::unique_ptr<TTree>)
override {
NOSUPPORT(WARNING,
"TTree"); }
94 virtual StatusCode
regTree(
const std::string&, TTree*)
override {
NOSUPPORT(WARNING,
"TTree"); }
95 virtual StatusCode
getTree(
const std::string&, TTree*&)
const override {
NOSUPPORT(WARNING,
"TTree"); }
104 virtual StatusCode
regGraph(
const std::string&, std::unique_ptr<TGraph>)
override {
NOSUPPORT(WARNING,
"TGraph"); }
105 virtual StatusCode
regGraph(
const std::string&, TGraph*)
override {
NOSUPPORT(WARNING,
"TGraph"); }
110 virtual StatusCode
regEfficiency(
const std::string&, std::unique_ptr<TEfficiency>)
override {
NOSUPPORT(WARNING,
"TEfficiency"); }
112 virtual StatusCode
getEfficiency(
const std::string&, TEfficiency*&)
const override {
NOSUPPORT(WARNING,
"TEfficiency"); }
120 virtual StatusCode
regShared(
const std::string&, std::unique_ptr<TGraph>, LockedHandle<TGraph>& )
override {
NOSUPPORT(WARNING,
"TGraph"); }
121 virtual StatusCode
getShared(
const std::string&, LockedHandle<TGraph>& )
const override {
NOSUPPORT(WARNING,
"TGraph"); }
122 virtual StatusCode
regShared(
const std::string&, std::unique_ptr<TEfficiency>, LockedHandle<TEfficiency>& )
override {
NOSUPPORT(WARNING,
"TEfficiency"); }
123 virtual StatusCode
getShared(
const std::string&, LockedHandle<TEfficiency>& )
const override {
NOSUPPORT(WARNING,
"TEfficiency"); }
125 virtual StatusCode
merge(
const std::string& )
override {
NOSUPPORT(WARNING,
"merge"); }
148 void syncPublish(
long int, boost::posix_time::ptime);
169 tbb::concurrent_hash_map<std::string, THistID>
m_hists;
175 StatusCode
getTHists_i(
const std::string& name, TList &)
const;
178 template <
typename T> StatusCode
regHist_i(std::unique_ptr<T> hist,
const std::string& name,
bool shared,
THistID*& phid);
179 template <
typename T> T*
getHist_i(
const std::string&
id,
const size_t& ind,
bool quiet =
false)
const;
180 template <
typename T> LockedHandle<T>
regShared_i(
const std::string&
id, std::unique_ptr<T> hist);
181 template <
typename T> LockedHandle<T>
getShared_i(
const std::string&
id )
const;
188 "^/((run_[0-9]+/lb_[0-9]+/LB)|(SHIFT)|(EXPERT)|(DEBUG)|(EXPRESS)|(RUNSTAT))/.+/.+"};
191 Gaudi::Property<int>
m_numSlots{
this,
"NumSlots", 8,
"Number of slots for the main monitoring task"};
192 Gaudi::Property<int>
m_numSlotsFast{
this,
"NumSlotsFast", 1,
"Number of slots for the fast monitoring task"};
193 Gaudi::Property<int>
m_intervalSeconds{
this,
"IntervalSeconds", 80,
"Interval between histogram publications periods in seconds"};
194 Gaudi::Property<int>
m_intervalSecondsFast{
this,
"IntervalSecondsFast", 10,
"Interval between histogram publications periods in seconds for the fast publication"};
195 Gaudi::Property<std::string>
m_OHServerName{
this,
"OHServerName",
"Histogramming",
"Name of the OH server to publish histograms into"};
196 Gaudi::Property<std::string>
m_PublicationIncludeName{
this,
"PublicationIncludeName",
".*",
"Regex to select histograms for publication"};
197 Gaudi::Property<std::string>
m_fastPublicationIncludeName{
this,
"FastPublicationIncludeName",
"^.EXPERT.HLTFramework.TrigSignatureMoni.*",
"Regex to select histograms for fast publication"};
200 Gaudi::Property<int>
m_autoSave{
this,
"AutoSave", 0,
"Not supported by WebdaqHistSvc"};
201 Gaudi::Property<int>
m_autoFlush{
this,
"AutoFlush", 0,
"Not supported by WebdaqHistSvc"};
202 Gaudi::Property<bool>
m_print{
this,
"PrintAll",
false,
"Not supported by WebdaqHistSvc"};
203 Gaudi::Property<int>
m_maxFileSize{
this,
"MaxFileSize", 10240,
"Not supported by WebdaqHistSvc"};
204 Gaudi::Property<std::vector<std::string>>
m_outputfile{
this,
"Output", {},
"Not supported by WebdaqHistSvc"};
205 Gaudi::Property<std::vector<std::string>>
m_inputfile{
this,
"Input", {},
"Not supported by WebdaqHistSvc"};
#define NOSUPPORT(lvl, what)
Define macros for attributes used to control the static checker.
virtual StatusCode getTTrees(const std::string &, TList &, bool) const override
virtual StatusCode getTEfficiencies(TDirectory *, TList &, bool) const override
Gaudi::Property< std::string > m_includeType
virtual bool existsGraph(const std::string &) const override
boost::regex m_fastPublicationIncludeNameRegex
WebdaqHistSvc(const std::string &name, ISvcLocator *svc)
virtual StatusCode regTree(const std::string &) override
Gaudi::Property< int > m_autoSave
virtual StatusCode getTree(const std::string &, TTree *&) const override
virtual StatusCode stop() override
virtual StatusCode getHist(const std::string &id, TH1 *&hist, size_t ind) const override
virtual StatusCode merge(const std::string &) override
virtual StatusCode getTEfficiencies(const std::string &, TList &, bool) const override
Gaudi::Property< std::string > m_excludeType
virtual StatusCode getTEfficiencies(const std::string &, TList &, bool, bool) override
Gaudi::Property< std::string > m_excludeName
virtual StatusCode regGraph(const std::string &) override
std::string m_tdaqWebdaqBase
Webdaq configuration variable, see https://gitlab.cern.ch/atlas-tdaq-software/webdaq.
boost::regex m_PublicationIncludeNameRegex
std::set< std::string > getSet(boost::regex) const
std::thread m_thread
Publication thread.
boost::regex m_includeTypeRegex
Gaudi::Property< std::vector< std::string > > m_outputfile
virtual StatusCode regEfficiency(const std::string &, std::unique_ptr< TEfficiency >) override
Gaudi::Property< bool > m_print
std::atomic< bool > m_stopFlag
Flag to stop the monitoring task.
virtual std::vector< std::string > getHists() const override
virtual StatusCode getTEfficiencies(TDirectory *, TList &, bool, bool) override
virtual void handle(const Incident &incident) override
boost::regex m_excludeNameRegex
LockedHandle< T > getShared_i(const std::string &id) const
virtual bool existsTree(const std::string &) const override
Gaudi::Property< std::string > m_OHServerName
virtual StatusCode regShared(const std::string &, std::unique_ptr< TGraph >, LockedHandle< TGraph > &) override
Gaudi::Property< int > m_autoFlush
Gaudi::Property< std::string > m_fastPublicationIncludeName
virtual StatusCode getShared(const std::string &, LockedHandle< TH1 > &) const override
virtual StatusCode merge(TObject *) override
virtual bool existsHist(const std::string &name) const override
virtual StatusCode regTree(const std::string &, TTree *) override
void conditionedSleep(std::chrono::milliseconds, const std::atomic< bool > &)
Sleep for a duration or until the stop flag is set.
virtual std::vector< std::string > getTrees() const override
std::atomic< bool > m_histoMapUpdatedFast
Flag to indicate when the histogram map is updated for the fast publication.
virtual StatusCode getTTrees(const std::string &, TList &, bool, bool) override
void syncPublish(long int, boost::posix_time::ptime)
Sync the publication to a multiple of the interval.
virtual StatusCode getEfficiency(const std::string &, TEfficiency *&) const override
virtual StatusCode getShared(const std::string &, LockedHandle< TGraph > &) const override
virtual ~WebdaqHistSvc() noexcept override
virtual StatusCode getTTrees(TDirectory *, TList &, bool, bool) override
Gaudi::Property< int > m_numSlots
StatusCode regHist_i(std::unique_ptr< T > hist, const std::string &name, bool shared, THistID *&phid)
virtual StatusCode regShared(const std::string &, std::unique_ptr< TEfficiency >, LockedHandle< TEfficiency > &) override
virtual StatusCode getGraph(const std::string &, TGraph *&) const override
virtual std::vector< std::string > getEfficiencies() const override
virtual std::vector< std::string > getGraphs() const override
std::string m_tdaqOHServerName
The OH server name (TDAQ_OH_SERVER if defined, m_OHServerName otherwise)
virtual StatusCode finalize() override
boost::regex m_includeNameRegex
Gaudi::Property< std::string > m_PublicationIncludeName
virtual StatusCode regEfficiency(const std::string &, TEfficiency *) override
virtual StatusCode regTree(const std::string &, std::unique_ptr< TTree >) override
boost::regex m_excludeTypeRegex
virtual StatusCode regEfficiency(const std::string &) override
LockedHandle< T > regShared_i(const std::string &id, std::unique_ptr< T > hist)
virtual StatusCode regHist(const std::string &name) override
ServiceHandle< Gaudi::Interfaces::IOptionsSvc > m_jobOptionsSvc
joboptions service
tbb::concurrent_hash_map< std::string, THistID > m_hists
Map of the registered histograms.
virtual StatusCode regShared(const std::string &, std::unique_ptr< TH1 >, LockedHandle< TH1 > &) override
std::string m_partition
The partition to publish to.
Gaudi::Property< int > m_intervalSecondsFast
Gaudi::Property< int > m_intervalSeconds
void monitoringTask(int, int, std::atomic< bool > &, boost::regex)
The actual publication Task.
T * getHist_i(const std::string &id, const size_t &ind, bool quiet=false) const
virtual bool exists(const std::string &name) const override
std::atomic< bool > m_histoMapUpdated
Flag to indicate when the histogram map is updated.
virtual StatusCode initialize ATLAS_NOT_THREAD_SAFE() override
bool isObjectAllowed(const std::string &path, const TObject *o) const
Does the histogram follow the naming rules ?
virtual StatusCode deReg(TObject *obj) override
virtual StatusCode getTHists(TDirectory *td, TList &, bool recurse=false) const override
virtual StatusCode regGraph(const std::string &, std::unique_ptr< TGraph >) override
virtual bool existsEfficiency(const std::string &) const override
StatusCode getTHists_i(const std::string &name, TList &) const
Get TList of registered histograms.
Gaudi::Property< int > m_maxFileSize
Gaudi::Property< int > m_numSlotsFast
Gaudi::Property< std::vector< std::string > > m_inputfile
virtual StatusCode getTTrees(TDirectory *, TList &, bool) const override
virtual StatusCode regGraph(const std::string &, TGraph *) override
virtual StatusCode getShared(const std::string &, LockedHandle< TEfficiency > &) const override
Gaudi::Property< std::string > m_includeName
Helper struct that bundles the histogram, name and mutex.
THistID(const std::string &s, TObject *o)