ATLAS Offline Software
Loading...
Searching...
No Matches
TrigMonTHistSvc.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef TRIGMONTHISTSVC_THISTSVC_H
6#define TRIGMONTHISTSVC_THISTSVC_H
7
8#include "GaudiKernel/ITHistSvc.h"
11
12class TObject;
13class TH1;
14class TH2;
15class TH3;
16class TGraph;
17class TTree;
18
19#include <vector>
20#include <string>
21#include <unordered_map>
22#include <mutex>
23
24#include <boost/regex.hpp>
25
26// Helper to mark unsupported interfaces
27#define NOSUPPORT(lvl, what) \
28 do { \
29 ATH_MSG_LVL(MSG::lvl, what << "is not supported by this implementation"); \
30 return {}; \
31 } while (0)
32
33
43class TrigMonTHistSvc: public extends<AthService, ITHistSvc>
44{
45public:
46 TrigMonTHistSvc(const std::string& name, ISvcLocator *svc );
47
48 virtual StatusCode initialize ATLAS_NOT_THREAD_SAFE () override;
49 virtual StatusCode stop() override;
50 virtual StatusCode finalize() override;
51
52 virtual StatusCode regHist(const std::string& name) override;
53 virtual StatusCode regHist(const std::string& name, std::unique_ptr<TH1> hist) override;
54 virtual StatusCode regHist(const std::string& name, TH1*) override;
55 virtual StatusCode getHist(const std::string& id, TH1*& hist, size_t ind) const override;
56 virtual StatusCode getHist(const std::string& id, TH2*& hist, size_t ind) const override;
57 virtual StatusCode getHist(const std::string& id, TH3*& hist, size_t ind) const override;
58
59 virtual StatusCode deReg(TObject* obj) override; //<! very slow
60 virtual StatusCode deReg(const std::string& name) override; //<! use this instead
61
62 virtual std::vector<std::string> getHists() const override;
63
64 virtual StatusCode regShared( const std::string&, std::unique_ptr<TH1>, LockedHandle<TH1>& ) override;
65 virtual StatusCode regShared( const std::string&, std::unique_ptr<TH2>, LockedHandle<TH2>& ) override;
66 virtual StatusCode regShared( const std::string&, std::unique_ptr<TH3>, LockedHandle<TH3>& ) override;
67 virtual StatusCode getShared( const std::string&, LockedHandle<TH1>& ) const override;
68 virtual StatusCode getShared( const std::string&, LockedHandle<TH2>& ) const override;
69 virtual StatusCode getShared( const std::string&, LockedHandle<TH3>& ) const override;
70
71 virtual StatusCode getTHists(TDirectory *td, TList &, bool recurse=false) const override;
72 virtual StatusCode getTHists(const std::string& name, TList &, bool recurse=false) const override;
73 virtual StatusCode getTHists(TDirectory *td, TList &tl, bool recurse=false, bool reg=false) override;
74 virtual StatusCode getTHists(const std::string& name, TList &tl, bool recurse=false, bool reg=false) override;
75
76 virtual bool exists( const std::string& name ) const override { return existsHist(name); }
77 virtual bool existsHist( const std::string& name ) const override;
78
79 /* Unsupported interfaces */
80 virtual StatusCode regTree(const std::string&) override { NOSUPPORT(WARNING, "TTree"); }
81 virtual StatusCode regTree(const std::string&, std::unique_ptr<TTree>) override { NOSUPPORT(WARNING, "TTree"); }
82 virtual StatusCode regTree(const std::string&, TTree*) override { NOSUPPORT(WARNING, "TTree"); }
83 virtual StatusCode getTree(const std::string&, TTree*&) const override { NOSUPPORT(WARNING, "TTree"); }
84
85 virtual std::vector<std::string> getTrees() const override { NOSUPPORT(DEBUG, "TTree"); }
86 virtual StatusCode getTTrees(TDirectory*, TList&, bool) const override { NOSUPPORT(DEBUG, "TTree"); }
87 virtual StatusCode getTTrees(const std::string&, TList&, bool) const override { NOSUPPORT(DEBUG, "TTree"); }
88 virtual StatusCode getTTrees(TDirectory*, TList&, bool, bool) override { NOSUPPORT(DEBUG, "TTree"); }
89 virtual StatusCode getTTrees(const std::string&, TList&, bool, bool) override { NOSUPPORT(DEBUG, "TTree"); }
90
91 virtual StatusCode regGraph(const std::string&) override { NOSUPPORT(WARNING, "TGraph"); }
92 virtual StatusCode regGraph(const std::string&, std::unique_ptr<TGraph>) override { NOSUPPORT(WARNING, "TGraph"); }
93 virtual StatusCode regGraph(const std::string&, TGraph*) override { NOSUPPORT(WARNING, "TGraph"); }
94 virtual std::vector<std::string> getGraphs() const override { NOSUPPORT(DEBUG, "TGraph"); }
95 virtual StatusCode getGraph(const std::string&, TGraph*&) const override { NOSUPPORT(DEBUG, "TGraph"); }
96
97 virtual StatusCode regEfficiency(const std::string&) override { NOSUPPORT(WARNING, "TEfficiency"); }
98 virtual StatusCode regEfficiency(const std::string&, std::unique_ptr<TEfficiency>) override { NOSUPPORT(WARNING, "TEfficiency"); }
99 virtual StatusCode regEfficiency(const std::string&, TEfficiency*) override { NOSUPPORT(WARNING, "TEfficiency"); }
100 virtual StatusCode getEfficiency(const std::string&, TEfficiency*&) const override { NOSUPPORT(WARNING, "TEfficiency"); }
101 virtual std::vector<std::string> getEfficiencies() const override { NOSUPPORT(WARNING, "TEfficiency"); }
102
103 virtual StatusCode getTEfficiencies(TDirectory*, TList&, bool) const override { NOSUPPORT(WARNING, "TEfficiency"); }
104 virtual StatusCode getTEfficiencies(const std::string&, TList&, bool) const override { NOSUPPORT(WARNING, "TEfficiency"); }
105 virtual StatusCode getTEfficiencies(TDirectory*, TList&, bool, bool) override { NOSUPPORT(WARNING, "TEfficiency"); }
106 virtual StatusCode getTEfficiencies(const std::string&, TList&, bool, bool) override { NOSUPPORT(WARNING, "TEfficiency"); }
107
108 virtual StatusCode regShared( const std::string&, std::unique_ptr<TGraph>, LockedHandle<TGraph>& ) override { NOSUPPORT(WARNING, "TGraph"); }
109 virtual StatusCode getShared( const std::string&, LockedHandle<TGraph>& ) const override { NOSUPPORT(WARNING, "TGraph"); }
110 virtual StatusCode regShared( const std::string&, std::unique_ptr<TEfficiency>, LockedHandle<TEfficiency>& ) override { NOSUPPORT(WARNING, "TEfficiency"); }
111 virtual StatusCode getShared( const std::string&, LockedHandle<TEfficiency>& ) const override { NOSUPPORT(WARNING, "TEfficiency"); }
112
113 virtual StatusCode merge( const std::string& ) override { NOSUPPORT(WARNING, "merge"); }
114 virtual StatusCode merge( TObject* ) override { NOSUPPORT(WARNING, "merge"); }
115
116 virtual bool existsTree( const std::string& ) const override { NOSUPPORT(DEBUG, "TTree"); }
117 virtual bool existsGraph( const std::string& ) const override { NOSUPPORT(WARNING, "TGraph"); }
118 virtual bool existsEfficiency( const std::string& ) const override { NOSUPPORT(WARNING, "TEfficiency"); }
119
120private:
122 struct THistID {
123 THistID(const std::string& s, TObject* o) : id(s), obj(o) {};
124 ~THistID() { delete mutex; }
125 std::string id;
126 TObject* obj{nullptr};
127 std::mutex* mutex{nullptr};
128 };
129
131 std::unordered_map<std::string, THistID> m_hists;
132
134 bool isObjectAllowed(const std::string& path, const TObject *o) const;
135
137 StatusCode getTHists_i(const std::string& name, TList &) const;
138
139 // Templated methods implementing the virtual interface methods
140 template <typename T> StatusCode regHist_i(std::unique_ptr<T> hist, const std::string& name, bool shared, THistID*& phid);
141 template <typename T> T* getHist_i(const std::string& id, const size_t& ind, bool quiet = false) const;
142 template <typename T> LockedHandle<T> regShared_i( const std::string& id, std::unique_ptr<T> hist);
143 template <typename T> LockedHandle<T> getShared_i( const std::string& id ) const;
144
145 // Properties
146 Gaudi::Property<std::string> m_excludeType{this, "ExcludeType", "()"};
147 Gaudi::Property<std::string> m_includeType{this, "IncludeType", ".+"};
148 Gaudi::Property<std::string> m_excludeName{this, "ExcludeName", ".*\\..*"};
149 Gaudi::Property<std::string> m_includeName{this, "IncludeName",
150 "^/((run_[0-9]+/lb_[0-9]+/LB)|(SHIFT)|(EXPERT)|(DEBUG)|(EXPRESS)|(RUNSTAT))/.+/.+"};
151
152 // Dummy properties for compatibility with THistSvc
153 Gaudi::Property<int> m_autoSave{this, "AutoSave", 0, "Not supported by TrigMonTHistSvc"};
154 Gaudi::Property<int> m_autoFlush{this, "AutoFlush", 0, "Not supported by TrigMonTHistSvc"};
155 Gaudi::Property<bool> m_print{this, "PrintAll", false, "Not supported by TrigMonTHistSvc"};
156 Gaudi::Property<int> m_maxFileSize{this, "MaxFileSize", 10240, "Not supported by TrigMonTHistSvc"};
157 Gaudi::Property<std::vector<std::string>> m_outputfile{this, "Output", {}, "Not supported by TrigMonTHistSvc"};
158 Gaudi::Property<std::vector<std::string>> m_inputfile{this, "Input", {}, "Not supported by TrigMonTHistSvc"};
159
160 // compiled regexes
161 boost::regex m_excludeTypeRegex;
162 boost::regex m_includeTypeRegex;
163 boost::regex m_excludeNameRegex;
164 boost::regex m_includeNameRegex;
165
166 // Mutexes
167 mutable std::recursive_mutex m_svcMut;
168};
169
170#endif // TRIGMONTHISTSVC_THISTSVC_H
#define NOSUPPORT(lvl, what)
Define macros for attributes used to control the static checker.
Gaudi::Property< std::string > m_excludeType
virtual bool existsHist(const std::string &name) const override
virtual StatusCode regEfficiency(const std::string &) override
virtual StatusCode getTEfficiencies(const std::string &, TList &, bool, bool) override
boost::regex m_excludeTypeRegex
virtual std::vector< std::string > getTrees() const override
virtual StatusCode finalize() override
Gaudi::Property< int > m_autoSave
virtual StatusCode merge(const std::string &) override
virtual std::vector< std::string > getEfficiencies() const override
virtual StatusCode regGraph(const std::string &) override
Gaudi::Property< std::string > m_includeName
virtual StatusCode getEfficiency(const std::string &, TEfficiency *&) const override
virtual StatusCode getTTrees(TDirectory *, TList &, bool) const override
virtual StatusCode regGraph(const std::string &, std::unique_ptr< TGraph >) override
Gaudi::Property< int > m_maxFileSize
virtual StatusCode regGraph(const std::string &, TGraph *) override
virtual StatusCode getTEfficiencies(TDirectory *, TList &, bool) const override
virtual StatusCode getTree(const std::string &, TTree *&) const override
virtual StatusCode getTEfficiencies(TDirectory *, TList &, bool, bool) override
virtual StatusCode regEfficiency(const std::string &, TEfficiency *) override
virtual StatusCode regTree(const std::string &, std::unique_ptr< TTree >) override
std::recursive_mutex m_svcMut
Protect access to histogram list.
virtual bool exists(const std::string &name) const override
boost::regex m_includeNameRegex
virtual std::vector< std::string > getGraphs() const override
virtual StatusCode deReg(TObject *obj) override
virtual StatusCode getGraph(const std::string &, TGraph *&) const override
Gaudi::Property< std::string > m_includeType
boost::regex m_excludeNameRegex
StatusCode getTHists_i(const std::string &name, TList &) const
Get TList of registered histograms.
virtual StatusCode regTree(const std::string &, TTree *) override
virtual StatusCode getTTrees(const std::string &, TList &, bool) const override
boost::regex m_includeTypeRegex
virtual StatusCode regShared(const std::string &, std::unique_ptr< TGraph >, LockedHandle< TGraph > &) override
Gaudi::Property< std::vector< std::string > > m_inputfile
Gaudi::Property< std::vector< std::string > > m_outputfile
LockedHandle< T > regShared_i(const std::string &id, std::unique_ptr< T > hist)
Gaudi::Property< bool > m_print
virtual StatusCode getTTrees(const std::string &, TList &, bool, bool) override
Gaudi::Property< std::string > m_excludeName
virtual StatusCode getShared(const std::string &, LockedHandle< TGraph > &) const override
virtual bool existsEfficiency(const std::string &) const override
virtual StatusCode regHist(const std::string &name) override
StatusCode regHist_i(std::unique_ptr< T > hist, const std::string &name, bool shared, THistID *&phid)
virtual StatusCode getTEfficiencies(const std::string &, TList &, bool) const override
virtual StatusCode getShared(const std::string &, LockedHandle< TEfficiency > &) const override
virtual StatusCode initialize ATLAS_NOT_THREAD_SAFE() override
virtual std::vector< std::string > getHists() const override
virtual StatusCode regShared(const std::string &, std::unique_ptr< TH1 >, LockedHandle< TH1 > &) override
virtual StatusCode regEfficiency(const std::string &, std::unique_ptr< TEfficiency >) override
virtual bool existsTree(const std::string &) const override
virtual bool existsGraph(const std::string &) const override
virtual StatusCode stop() override
Gaudi::Property< int > m_autoFlush
LockedHandle< T > getShared_i(const std::string &id) const
T * getHist_i(const std::string &id, const size_t &ind, bool quiet=false) const
virtual StatusCode getHist(const std::string &id, TH1 *&hist, size_t ind) const override
bool isObjectAllowed(const std::string &path, const TObject *o) const
Does the histogram follow the naming rules ?
std::unordered_map< std::string, THistID > m_hists
Registered histograms.
virtual StatusCode merge(TObject *) override
virtual StatusCode getShared(const std::string &, LockedHandle< TH1 > &) const override
TrigMonTHistSvc(const std::string &name, ISvcLocator *svc)
virtual StatusCode getTHists(TDirectory *td, TList &, bool recurse=false) const override
virtual StatusCode regShared(const std::string &, std::unique_ptr< TEfficiency >, LockedHandle< TEfficiency > &) override
virtual StatusCode getTTrees(TDirectory *, TList &, bool, bool) override
virtual StatusCode regTree(const std::string &) override
#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)