ATLAS Offline Software
Loading...
Searching...
No Matches
WebdaqHistSvc.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef WEBDAQHISTSVC_THISTSVC_H
6#define WEBDAQHISTSVC_THISTSVC_H
7
8#include "GaudiKernel/ITHistSvc.h"
9#include "GaudiKernel/IIncidentListener.h"
10#include "Gaudi/Interfaces/IOptionsSvc.h"
13
14#include "TrigServicesUtils.h"
15
16class TObject;
17class TH1;
18class TH2;
19class TH3;
20class TGraph;
21class TTree;
22
23#include <vector>
24#include <string>
25#include <memory>
26#include <mutex>
27#include <atomic>
28#include <thread>
29
30#include <boost/regex.hpp>
31#include <boost/date_time/posix_time/posix_time_types.hpp>
32#include <tbb/concurrent_hash_map.h>
33
47class WebdaqHistSvc: public extends<AthService, ITHistSvc, IIncidentListener>
48{
49public:
50 using base_class::base_class;
51 virtual ~WebdaqHistSvc() noexcept override {}
52
53 virtual StatusCode initialize ATLAS_NOT_THREAD_SAFE () override;
54 virtual void handle( const Incident& incident ) override;
55 virtual StatusCode stop() override;
56 virtual StatusCode finalize() override;
57
58 virtual StatusCode regHist(const std::string& name) override;
59 virtual StatusCode regHist(const std::string& name, std::unique_ptr<TH1> hist) override;
60 virtual StatusCode regHist(const std::string& name, TH1*) override;
61 virtual StatusCode getHist(const std::string& id, TH1*& hist, size_t ind) const override;
62 virtual StatusCode getHist(const std::string& id, TH2*& hist, size_t ind) const override;
63 virtual StatusCode getHist(const std::string& id, TH3*& hist, size_t ind) const override;
64
65 virtual StatusCode deReg(TObject* obj) override; //<! very slow
66 virtual StatusCode deReg(const std::string& name) override; //<! use this instead
67
68 virtual std::vector<std::string> getHists() const override;
69 std::set<std::string> getSet(const boost::regex&) const;
70
71 virtual StatusCode regShared( const std::string&, std::unique_ptr<TH1>, LockedHandle<TH1>& ) override;
72 virtual StatusCode regShared( const std::string&, std::unique_ptr<TH2>, LockedHandle<TH2>& ) override;
73 virtual StatusCode regShared( const std::string&, std::unique_ptr<TH3>, LockedHandle<TH3>& ) override;
74 virtual StatusCode getShared( const std::string&, LockedHandle<TH1>& ) const override;
75 virtual StatusCode getShared( const std::string&, LockedHandle<TH2>& ) const override;
76 virtual StatusCode getShared( const std::string&, LockedHandle<TH3>& ) const override;
77
78 virtual StatusCode getTHists(TDirectory *td, TList &, bool recurse=false) const override;
79 virtual StatusCode getTHists(const std::string& name, TList &, bool recurse=false) const override;
80 virtual StatusCode getTHists(TDirectory *td, TList &tl, bool recurse=false, bool reg=false) override;
81 virtual StatusCode getTHists(const std::string& name, TList &tl, bool recurse=false, bool reg=false) override;
82
83 virtual bool exists( const std::string& name ) const override { return existsHist(name); }
84 virtual bool existsHist( const std::string& name ) const override;
85
86 /* Unsupported interfaces */
87 virtual StatusCode regTree(const std::string&) override { NOSUPPORT(WARNING, "TTree"); }
88 virtual StatusCode regTree(const std::string&, std::unique_ptr<TTree>) override { NOSUPPORT(WARNING, "TTree"); }
89 virtual StatusCode regTree(const std::string&, TTree*) override { NOSUPPORT(WARNING, "TTree"); }
90 virtual StatusCode getTree(const std::string&, TTree*&) const override { NOSUPPORT(WARNING, "TTree"); }
91
92 virtual std::vector<std::string> getTrees() const override { NOSUPPORT(DEBUG, "TTree"); }
93 virtual StatusCode getTTrees(TDirectory*, TList&, bool) const override { NOSUPPORT(DEBUG, "TTree"); }
94 virtual StatusCode getTTrees(const std::string&, TList&, bool) const override { NOSUPPORT(DEBUG, "TTree"); }
95 virtual StatusCode getTTrees(TDirectory*, TList&, bool, bool) override { NOSUPPORT(DEBUG, "TTree"); }
96 virtual StatusCode getTTrees(const std::string&, TList&, bool, bool) override { NOSUPPORT(DEBUG, "TTree"); }
97
98 virtual StatusCode regGraph(const std::string&) override { NOSUPPORT(WARNING, "TGraph"); }
99 virtual StatusCode regGraph(const std::string&, std::unique_ptr<TGraph>) override { NOSUPPORT(WARNING, "TGraph"); }
100 virtual StatusCode regGraph(const std::string&, TGraph*) override { NOSUPPORT(WARNING, "TGraph"); }
101 virtual std::vector<std::string> getGraphs() const override { NOSUPPORT(DEBUG, "TGraph"); }
102 virtual StatusCode getGraph(const std::string&, TGraph*&) const override { NOSUPPORT(DEBUG, "TGraph"); }
103
104 virtual StatusCode regEfficiency(const std::string&) override { NOSUPPORT(WARNING, "TEfficiency"); }
105 virtual StatusCode regEfficiency(const std::string&, std::unique_ptr<TEfficiency>) override { NOSUPPORT(WARNING, "TEfficiency"); }
106 virtual StatusCode regEfficiency(const std::string&, TEfficiency*) override { NOSUPPORT(WARNING, "TEfficiency"); }
107 virtual StatusCode getEfficiency(const std::string&, TEfficiency*&) const override { NOSUPPORT(WARNING, "TEfficiency"); }
108 virtual std::vector<std::string> getEfficiencies() const override { NOSUPPORT(WARNING, "TEfficiency"); }
109
110 virtual StatusCode getTEfficiencies(TDirectory*, TList&, bool) const override { NOSUPPORT(WARNING, "TEfficiency"); }
111 virtual StatusCode getTEfficiencies(const std::string&, TList&, bool) const override { NOSUPPORT(WARNING, "TEfficiency"); }
112 virtual StatusCode getTEfficiencies(TDirectory*, TList&, bool, bool) override { NOSUPPORT(WARNING, "TEfficiency"); }
113 virtual StatusCode getTEfficiencies(const std::string&, TList&, bool, bool) override { NOSUPPORT(WARNING, "TEfficiency"); }
114
115 virtual StatusCode regShared( const std::string&, std::unique_ptr<TGraph>, LockedHandle<TGraph>& ) override { NOSUPPORT(WARNING, "TGraph"); }
116 virtual StatusCode getShared( const std::string&, LockedHandle<TGraph>& ) const override { NOSUPPORT(WARNING, "TGraph"); }
117 virtual StatusCode regShared( const std::string&, std::unique_ptr<TEfficiency>, LockedHandle<TEfficiency>& ) override { NOSUPPORT(WARNING, "TEfficiency"); }
118 virtual StatusCode getShared( const std::string&, LockedHandle<TEfficiency>& ) const override { NOSUPPORT(WARNING, "TEfficiency"); }
119
120 virtual StatusCode merge( const std::string& ) override { NOSUPPORT(WARNING, "merge"); }
121 virtual StatusCode merge( TObject* ) override { NOSUPPORT(WARNING, "merge"); }
122
123 virtual bool existsTree( const std::string& ) const override { NOSUPPORT(DEBUG, "TTree"); }
124 virtual bool existsGraph( const std::string& ) const override { NOSUPPORT(WARNING, "TGraph"); }
125 virtual bool existsEfficiency( const std::string& ) const override { NOSUPPORT(WARNING, "TEfficiency"); }
126
127private:
129 struct THistID {
130 THistID(const std::string& s, TObject* o) : id(s), obj(o) {};
131 THistID() = default;
132 std::string id;
133 TObject* obj{nullptr};
134 std::unique_ptr<std::mutex> mutex;
135 };
136
138 std::atomic<bool> m_stopFlag{false};
140 void monitoringTask(const std::string&, unsigned int, unsigned int, std::atomic<bool>&, const boost::regex&) const;
142 void publish(const std::string& appName, const std::string& histID) const;
144 void publishAll(const boost::regex& nameSelect) const;
146 void syncPublish(long int, const boost::posix_time::ptime&) const;
148 std::thread m_thread;
149 std::thread m_threadFast;
151 std::string m_partition;
153 std::string m_appName;
155 std::string m_tdaqWebdaqBase;
159 std::atomic<bool> m_histoMapUpdated{false};
161 std::atomic<bool> m_histoMapUpdatedFast{false};
162
164 ServiceHandle<Gaudi::Interfaces::IOptionsSvc> m_jobOptionsSvc{this, "JobOptionsSvc", "JobOptionsSvc"};
165
167 tbb::concurrent_hash_map<std::string, THistID> m_hists;
168
170 bool isObjectAllowed(const std::string& path, const TObject *o) const;
171
173 StatusCode getTHists_i(const std::string& name, TList &) const;
174
175 // Templated methods implementing the virtual interface methods
176 template <typename T> StatusCode regHist_i(std::unique_ptr<T> hist, const std::string& name, bool shared, THistID*& phid);
177 template <typename T> T* getHist_i(const std::string& id, const size_t& ind, bool quiet = false) const;
178 template <typename T> LockedHandle<T> regShared_i( const std::string& id, std::unique_ptr<T> hist);
179 template <typename T> LockedHandle<T> getShared_i( const std::string& id ) const;
180
181 // Properties
182 Gaudi::Property<std::string> m_excludeType{this, "ExcludeType", "()"};
183 Gaudi::Property<std::string> m_includeType{this, "IncludeType", ".+"};
184 Gaudi::Property<std::string> m_excludeName{this, "ExcludeName", ".*\\..*"};
185 Gaudi::Property<std::string> m_includeName{this, "IncludeName",
186 "^/((run_[0-9]+/lb_[0-9]+/LB)|(SHIFT)|(EXPERT)|(DEBUG)|(EXPRESS)|(RUNSTAT))/.+/.+"};
187
188 //New properties for the monitoring task
189 Gaudi::Property<unsigned int> m_numSlots{this, "NumSlots", 8, "Number of slots for the main monitoring task"};
190 Gaudi::Property<unsigned int> m_numSlotsFast{this, "NumSlotsFast", 1, "Number of slots for the fast monitoring task"};
191 Gaudi::Property<unsigned int> m_intervalSeconds{this, "IntervalSeconds", 80, "Interval between histogram publications periods in seconds"};
192 Gaudi::Property<unsigned int> m_intervalSecondsFast{this, "IntervalSecondsFast", 10, "Interval between histogram publications periods in seconds for the fast publication"};
193 Gaudi::Property<std::string> m_OHServerName{this, "OHServerName", "Histogramming", "Name of the OH server to publish histograms into"};
194 Gaudi::Property<std::string> m_PublicationIncludeName{this, "PublicationIncludeName",".*","Regex to select histograms for publication"};
195 Gaudi::Property<std::string> m_fastPublicationIncludeName{this, "FastPublicationIncludeName","^.EXPERT.HLTFramework.TrigSignatureMoni.*","Regex to select histograms for fast publication"};
196
197 // Dummy properties for compatibility with THistSvc
198 Gaudi::Property<int> m_autoSave{this, "AutoSave", 0, "Not supported by WebdaqHistSvc"};
199 Gaudi::Property<int> m_autoFlush{this, "AutoFlush", 0, "Not supported by WebdaqHistSvc"};
200 Gaudi::Property<bool> m_print{this, "PrintAll", false, "Not supported by WebdaqHistSvc"};
201 Gaudi::Property<int> m_maxFileSize{this, "MaxFileSize", 10240, "Not supported by WebdaqHistSvc"};
202 Gaudi::Property<std::vector<std::string>> m_outputfile{this, "Output", {}, "Not supported by WebdaqHistSvc"};
203 Gaudi::Property<std::vector<std::string>> m_inputfile{this, "Input", {}, "Not supported by WebdaqHistSvc"};
204
205 // compiled regexes
206 boost::regex m_excludeTypeRegex;
207 boost::regex m_includeTypeRegex;
208 boost::regex m_excludeNameRegex;
209 boost::regex m_includeNameRegex;
212
213};
214
215#endif // WEBDAQHISTSVC_THISTSVC_H
#define NOSUPPORT(lvl, what)
Helper to mark unsupported interfaces.
Define macros for attributes used to control the static checker.
HLT online histogram service.
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
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< unsigned int > m_intervalSeconds
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::thread m_threadFast
std::string m_tdaqWebdaqBase
Webdaq configuration variable, see https://gitlab.cern.ch/atlas-tdaq-software/webdaq.
void monitoringTask(const std::string &, unsigned int, unsigned int, std::atomic< bool > &, const boost::regex &) const
The actual publication Task.
boost::regex m_PublicationIncludeNameRegex
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
std::string m_appName
Application name.
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
std::set< std::string > getSet(const boost::regex &) const
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
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
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
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
Gaudi::Property< unsigned int > m_intervalSecondsFast
virtual std::vector< std::string > getGraphs() const override
Gaudi::Property< unsigned int > m_numSlots
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
void publish(const std::string &appName, const std::string &histID) const
Publish one histogram.
std::string m_partition
The partition to publish to.
Gaudi::Property< unsigned int > m_numSlotsFast
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
void publishAll(const boost::regex &nameSelect) const
Final publication after stop.
StatusCode getTHists_i(const std::string &name, TList &) const
Get TList of registered histograms.
Gaudi::Property< int > m_maxFileSize
Gaudi::Property< std::vector< std::string > > m_inputfile
void syncPublish(long int, const boost::posix_time::ptime &) const
Sync the publication to a multiple of the interval.
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
#define DEBUG
Definition page_access.h:11
void initialize()
Helper struct that bundles the histogram, name and mutex.
THistID(const std::string &s, TObject *o)
std::unique_ptr< std::mutex > mutex