ATLAS Offline Software
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 
18 class TProfile;
19 class TProfile2D;
20 
21 namespace 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)) {}
60  : m_histDef(hf.m_histDef),
62 
66  virtual ~HistogramFiller() {}
67 
68 
72  struct VariablesPack {
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 {
131  histogram<void>();
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;
183 
184  private:
186  };
187 }
188 #endif /* AthenaMonitoringKernel_HistogramFiller_HistogramFiller_h */
beamspotman.r
def r
Definition: beamspotman.py:672
IHistogramProvider.h
Monitored::HistogramFiller::histogramVariablesNames
const std::vector< std::string > & histogramVariablesNames() const
Definition: HistogramFiller.h:135
Monitored::HistogramFiller::histogram
H * histogram() const
Definition: HistogramFiller.h:153
Monitored::HistogramFiller::m_histDef
std::shared_ptr< HistogramDef > m_histDef
Definition: HistogramFiller.h:180
IMonitoredVariable.h
Monitored::HistogramFiller::histogramWeightName
const std::string & histogramWeightName() const
Definition: HistogramFiller.h:139
Monitored::HistogramFiller::m_histogramProvider
std::shared_ptr< IHistogramProvider > m_histogramProvider
Definition: HistogramFiller.h:181
index
Definition: index.py:1
JetTiledMap::W
@ W
Definition: TiledEtaPhiMap.h:44
BeamSpot::mutex
std::mutex mutex
Definition: InDetBeamSpotVertex.cxx:18
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
HistogramDef.h
plotmaker.hist
hist
Definition: plotmaker.py:148
CSV_InDetExporter.new
new
Definition: CSV_InDetExporter.py:145
Monitored::HistogramFiller::VariablesPack::cut
const Monitored::IMonitoredVariable * cut
pointer to cut mask variable, typically absent
Definition: HistogramFiller.h:113
Monitored::HistogramFiller::getLock
const std::unique_lock< std::mutex > getLock() const
Definition: HistogramFiller.h:147
Monitored::HistogramFiller::fill
unsigned fill(W weight, C cut, const Ms &... m) const
Fill histogram from IMonitoredVariable.
Definition: HistogramFiller.h:168
detail
Definition: extract_histogram_tag.cxx:14
Monitored::HistogramFiller::VariablesPack::operator[]
const Monitored::IMonitoredVariable * operator[](std::size_t i) const
get monitored variable at given index
Definition: HistogramFiller.h:80
dbg::ptr
void * ptr(T *p)
Definition: SGImplSvc.cxx:74
Monitored::HistogramDef
the internal class used to keep parsed Filler properties
Definition: HistogramDef.h:15
Monitored::HistogramFiller::HistogramFiller
HistogramFiller(const HistogramFiller &hf)
Copy constructor.
Definition: HistogramFiller.h:59
Monitored::HistogramFiller::VariablesPack::set
void set(unsigned index, const IMonitoredVariable *ptr)
sets monitored variable at the index (may need to resize vector of variables)
Definition: HistogramFiller.h:94
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:190
Monitored::HistogramFiller::VariablesPack::weight
const Monitored::IMonitoredVariable * weight
pointer to weight variable, typically absent
Definition: HistogramFiller.h:112
Monitored::HistogramFiller::VariablesPack
helper class to pass variables to fillers
Definition: HistogramFiller.h:72
Monitored::detail::doFill
void doFill(H *hist, W weight, size_t i, const M &m1, const Ms &... m)
Perform (arbitrary dimension) histogram fill with weight.
Definition: HistogramFillerUtils.h:164
Monitored::IMonitoredVariable
Definition: IMonitoredVariable.h:14
H
#define H(x, y, z)
Definition: MD5.cxx:114
python.changerun.m1
m1
Definition: changerun.py:30
lumiFormat.i
int i
Definition: lumiFormat.py:85
python.TrigEgammaMonitorHelper.TProfile
def TProfile(*args, **kwargs)
Definition: TrigEgammaMonitorHelper.py:81
Monitored
Generic monitoring tool for athena components.
Definition: GenericMonitoringTool.h:28
Monitored::HistogramFiller::histogramCutMaskName
const std::string & histogramCutMaskName() const
Definition: HistogramFiller.h:143
Monitored::HistogramFiller::VariablesPack::size
size_t size() const
number of variables in the pack ( not counting the weight and mask )
Definition: HistogramFiller.h:87
BindingsTest.cut
cut
This script demonstrates how to call a C++ class from Python Also how to use PyROOT is shown.
Definition: BindingsTest.py:13
Monitored::HistogramFiller::VariablesPack::VariablesPack
VariablesPack()=default
Monitored::HistogramFiller::VariablesPack::m_var
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...
Definition: HistogramFiller.h:118
Monitored::HistogramFiller::fill
virtual unsigned fill(const VariablesPack &) const =0
Method that actually fills the ROOT object.
Monitored::HistogramFiller::VariablesPack::names
std::vector< std::string > names() const
names of all variables stored
Definition: HistogramFiller.h:104
Monitored::HistogramFiller::m_lock
std::mutex m_lock
Definition: HistogramFiller.h:182
Monitored::HistogramFiller
Base class for all histogram fillers.
Definition: HistogramFiller.h:44
Monitored::HistogramFiller::operator=
HistogramFiller & operator=(HistogramFiller const &)=delete
python.PyAthena.v
v
Definition: PyAthena.py:154
DeMoScan.index
string index
Definition: DeMoScan.py:362
Monitored::HistogramFiller::touch
void touch() const
Ensure histogram exists.
Definition: HistogramFiller.h:130
Monitored::HistogramFiller::VariablesPack::VariablesPack
VariablesPack(const std::initializer_list< const Monitored::IMonitoredVariable * > &v)
Definition: HistogramFiller.h:74
Monitored::HistogramFiller::HistogramFiller
HistogramFiller(const HistogramDef &histDef, std::shared_ptr< IHistogramProvider > histogramProvider)
Default constructor.
Definition: HistogramFiller.h:51
python.SystemOfUnits.m
float m
Definition: SystemOfUnits.py:106
Monitored::HistogramFiller::~HistogramFiller
virtual ~HistogramFiller()
Virtual destructor.
Definition: HistogramFiller.h:66