ATLAS Offline Software
Loading...
Searching...
No Matches
HistogramFiller.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef AthenaMonitoringKernel_HistogramFiller_h
6#define AthenaMonitoringKernel_HistogramFiller_h
7
8#include <boost/container/small_vector.hpp>
9#include <functional>
10#include <memory>
11#include <mutex>
12#include <vector>
13
17
18class TProfile;
19class TProfile2D;
20
21namespace Monitored {
22
23 // Forward declare generic histogram filler (see HistogramFillerUtils.h)
24 namespace detail {
25 template<typename H, typename W, typename M, typename ...Ms>
26 void doFill(H* hist, W weight, size_t i, const M& m1, const Ms&... m);
27 template<typename W>
28 void doFill(TProfile*, W, size_t, const double&, const char* const&);
29 template<typename W>
30 void doFill(TProfile*, W, size_t, const char* const&, const char* const&);
31 template<typename W>
32 void doFill(TProfile2D*, W, size_t, const double&, const double&, const char* const&);
33 template<typename W>
34 void doFill(TProfile2D*, W, size_t, const char* const&, const char* const&, const char* const&);
35 template<typename W>
36 void doFill(TProfile2D*, W, size_t, const char* const&, const double&, const char* const&);
37 template<typename W>
38 void doFill(TProfile2D*, W, size_t, const double&, const char* const&, const char* const&);
39 }
40
45 public:
51 HistogramFiller(const HistogramDef& histDef, std::shared_ptr<IHistogramProvider> histogramProvider)
52 : m_histDef(new HistogramDef(histDef)),
53 m_histogramProvider(std::move(histogramProvider)) {}
54
62
66 virtual ~HistogramFiller() {}
67
68
73 VariablesPack() = default;
74 VariablesPack( const std::initializer_list<const Monitored::IMonitoredVariable*>& v)
75 : m_var( v ) {}
76
80 const Monitored::IMonitoredVariable* operator[](std::size_t i) const {
81 return m_var[i];
82 }
83
87 size_t size () const {
88 return m_var.size();
89 }
90
94 inline void set( unsigned index, const IMonitoredVariable* ptr ) {
95 if ( m_var.size() <= index ) {
96 m_var.resize(index+1);
97 }
98 m_var[index] = ptr;
99 }
100
104 std::vector<std::string> names() const {
105 std::vector<std::string> r;
106 for ( const auto* v: m_var )
107 if ( v != nullptr )
108 r.push_back( v->name() );
109 return r;
110 }
111
114
115 private:
118 boost::container::small_vector<const Monitored::IMonitoredVariable*, 3> m_var;
119 };
120
125 virtual unsigned fill( const VariablesPack& ) const = 0;
126
130 void touch() const {
132 }
133
134
135 const std::vector<std::string>& histogramVariablesNames() const {
136 return m_histDef->name;
137 }
138
139 const std::string& histogramWeightName() const {
140 return m_histDef->weight;
141 }
142
143 const std::string& histogramCutMaskName() const {
144 return m_histDef->cutMask;
145 }
146
147 const std::unique_lock<std::mutex> getLock() const {
148 return std::unique_lock(m_lock);
149 }
150
151 protected:
152 template <class H>
153 H* histogram() const {
154 return static_cast<H*>(m_histogramProvider->histogram());
155 }
156
167 template<class H, typename W, typename C, typename ...Ms>
168 unsigned fill(W weight, C cut, const Ms&... m) const {
169 auto hist = this->histogram<H>();
170
171 size_t i = 0;
172 for (; i < std::max({m.size()...}); ++i ) {
173 if ( cut(i) ) {
174 detail::doFill(hist, weight, i, m...);
175 }
176 }
177 return i;
178 }
179
180 std::shared_ptr<HistogramDef> m_histDef;
181 std::shared_ptr<IHistogramProvider> m_histogramProvider;
182 mutable std::mutex m_lock;
183
184 private:
186 };
187}
188#endif /* AthenaMonitoringKernel_HistogramFiller_HistogramFiller_h */
#define H(x, y, z)
Definition MD5.cxx:114
HistogramFiller(const HistogramFiller &hf)
Copy constructor.
void touch() const
Ensure histogram exists.
HistogramFiller(const HistogramDef &histDef, std::shared_ptr< IHistogramProvider > histogramProvider)
Default constructor.
const std::string & histogramWeightName() const
virtual ~HistogramFiller()
Virtual destructor.
std::shared_ptr< HistogramDef > m_histDef
const std::vector< std::string > & histogramVariablesNames() const
const std::string & histogramCutMaskName() const
virtual unsigned fill(const VariablesPack &) const =0
Method that actually fills the ROOT object.
HistogramFiller & operator=(HistogramFiller const &)=delete
std::shared_ptr< IHistogramProvider > m_histogramProvider
unsigned fill(W weight, C cut, const Ms &... m) const
Fill histogram from IMonitoredVariable.
const std::unique_lock< std::mutex > getLock() const
int r
Definition globals.cxx:22
struct color C
void doFill(H *hist, W weight, size_t i, const M &m1, const Ms &... m)
Perform (arbitrary dimension) histogram fill with weight.
Generic monitoring tool for athena components.
Definition index.py:1
STL namespace.
the internal class used to keep parsed Filler properties
helper class to pass variables to fillers
VariablesPack(const std::initializer_list< const Monitored::IMonitoredVariable * > &v)
const Monitored::IMonitoredVariable * cut
pointer to cut mask variable, typically absent
const Monitored::IMonitoredVariable * operator[](std::size_t i) const
get monitored variable at given index
std::vector< std::string > names() const
names of all variables stored
size_t size() const
number of variables in the pack ( not counting the weight and mask )
void set(unsigned index, const IMonitoredVariable *ptr)
sets monitored variable at the index (may need to resize vector of variables)
boost::container::small_vector< const Monitored::IMonitoredVariable *, 3 > m_var
Vector with small buffer optimization to avoid dynamic allocation for the most common case of histogr...
const Monitored::IMonitoredVariable * weight
pointer to weight variable, typically absent