Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Histos.hh
Go to the documentation of this file.
1 ///
2 /// @file Histos.hh
3 /// @brief Hammer histogram manager
4 ///
5 
6 //**** This file is a part of the HAMMER library
7 //**** Copyright (C) 2016 - 2020 The HAMMER Collaboration
8 //**** HAMMER is licensed under version 3 of the GPL; see COPYING for details
9 //**** Please note the MCnet academic guidelines; see GUIDELINES for details
10 
11 // -*- C++ -*-
12 #ifndef HAMMER_HISTOS_HH
13 #define HAMMER_HISTOS_HH
14 
15 #include <vector>
16 
17 #include "Hammer/Histos.fhh"
21 #include "Hammer/Tools/IOTypes.hh"
22 
24 #include "Hammer/Math/Tensor.hh"
27 
28 namespace Hammer {
29 
30  class Log;
31  class DictionaryManager;
32 
33  template <typename T>
34  using HistoNameDict = std::map<std::string, T>;
35 
36  namespace MD = MultiDimensional;
37 
38  /// @brief Hammer histogram manager class
39  ///
40  /// Stores Hammer histograms, ...
41  ///
42  /// @ingroup Core
43  class Histos : public SettingsConsumer {
44 
45  public:
46  Histos(DictionaryManager* dict = nullptr);
47 
48  Histos(const Histos& other) = delete;
49  Histos& operator=(const Histos& other) = delete;
50  Histos(Histos&& other) = delete;
51  Histos& operator=(Histos&& other) = delete;
52 
53  ~Histos() noexcept;
54 
55  public:
56  /// @brief
57  /// @param[in] histogramName
58  /// @param[in] binSizes
59  /// @param[in] hasUnderOverFlow
60  /// @param[in] ranges
61  /// @param[in] shouldCompress
62  /// @param[in] withErrors
63  void addHistogramDefinition(const std::string& histogramName, const IndexList& binSizes, bool hasUnderOverFlow = true,
64  const MD::BinRangeList& ranges = {}, bool shouldCompress = false, bool withErrors = false);
65  void addHistogramDefinition(const std::string& histogramName, const MD::BinEdgeList& binEdges,
66  bool hasUnderOverFlow = true, bool shouldCompress = false, bool withErrors = false);
67 
68  void createProjectedHistogram(const std::string& oldName, const std::string& newName, const std::set<uint16_t>& collapsedIndexPositions);
69 
70  void setHistogramCompression(const std::string& histogramName, bool value = true);
71 
72  void setHistogramKeepErrors(const std::string& histogramName, bool value = true);
73 
74  void addHistogramFixedData(const std::string& histogramName, MD::SharedTensorData data);
75 
76  void resetHistogramFixedData(const std::string& histogramName);
77 
78  void removeHistogram(const std::string& histogramName);
79 
80  /// @brief
81  void init();
82 
83  /// @brief
84  /// @param[in] eventId
85  void setEventId(EventUID eventId);
86 
87  /// @brief
88  void clear();
89 
90  /// @brief
91  /// @param[in] histogramName
92  /// @param[in] value
93  /// @return
94  IndexList getBinIndices(const std::string& histogramName, const MD::BinValue& value) const;
95 
96  EventUIDGroup getHistogramEventIds(const std::string& name, const std::string& scheme) const;
97  MD::BinEdgeList getHistogramEdges(const std::string& histogramName) const;
98  IndexList getHistogramShape(const std::string& histogramName) const;
99 
100  bool getUnderOverFlows(const std::string& histogramName) const;
101 
102  /// @brief
103  /// @return
104  size_t size() const;
105 
106  /// @brief Checks values can be binned
107  /// @param[in] name
108  /// @param[in] values
109  /// @return
110  bool canFill(const std::string& name, const std::vector<double>& values);
111 
112  /// @brief Checks histogram exists
113  /// @param[in] name
114  /// @return
115  void checkExists(const std::string& name);
116 
117  /// @brief
118  /// @param[in] histogramName
119  /// @param[in] schemeName
120  /// @return
121  IOHistogram getHistogram(const std::string& histogramName, const std::string& schemeName) const;
122 
123  /// @brief
124  /// @param[in] histogramName
125  /// @param[in] schemeName
126  /// @return
127  EventIdGroupDict<IOHistogram> getHistograms(const std::string& histogramName, const std::string& schemeName) const;
128 
129  bool isValidHistogram(const std::string& histogramName, size_t dim) const;
130 
131  std::vector<std::string> getHistogramNames() const;
132 
133 #ifdef HAVE_ROOT
134 
135  bool isValidHistogram(const std::string& histogramName, const TH1D& h) const;
136  bool isValidHistogram(const std::string& histogramName, const TH2D& h) const;
137  bool isValidHistogram(const std::string& histogramName, const TH3D& h) const;
138 
139 
140  /// @brief
141  /// @param[in] histogramName
142  /// @param[in] schemeName
143  /// @return
144  std::unique_ptr<TH1D> getHistogram1D(const std::string& histogramName, const std::string& schemeName) const;
145 
146  /// @brief
147  /// @param[in] histogramName
148  /// @param[in] schemeName
149  /// @return
150  std::unique_ptr<TH2D> getHistogram2D(const std::string& histogramName, const std::string& schemeName) const;
151 
152  /// @brief
153  /// @param[in] histogramName
154  /// @param[in] schemeName
155  /// @return
156  std::unique_ptr<TH3D> getHistogram3D(const std::string& histogramName, const std::string& schemeName) const;
157 
158  /// @brief
159  /// @param[in] histogramName
160  /// @param[in] schemeName
161  /// @return
162  EventIdGroupDict<std::unique_ptr<TH1D>> getHistograms1D(const std::string& histogramName, const std::string& schemeName) const;
163 
164  /// @brief
165  /// @param[in] histogramName
166  /// @param[in] schemeName
167  /// @return
168  EventIdGroupDict<std::unique_ptr<TH2D>> getHistograms2D(const std::string& histogramName, const std::string& schemeName) const;
169 
170  /// @brief
171  /// @param[in] histogramName
172  /// @param[in] schemeName
173  /// @return
174  EventIdGroupDict<std::unique_ptr<TH3D>> getHistograms3D(const std::string& histogramName, const std::string& schemeName) const;
175 
176  /// @brief
177  /// @param[in] histogramName
178  /// @param[in] schemeName
179  /// @param[in] rootHistogram
180  /// @return
181  void setHistogram1D(const std::string& histogramName, const std::string& schemeName, TH1D& rootHistogram) const;
182 
183  /// @brief
184  /// @param[in] histogramName
185  /// @param[in] schemeName
186  /// @param[in] rootHistogram
187  /// @return
188  void setHistogram2D(const std::string& histogramName, const std::string& schemeName, TH2D& rootHistogram) const;
189 
190  /// @brief
191  /// @param[in] histogramName
192  /// @param[in] schemeName
193  /// @param[in] rootHistogram
194  /// @return
195  void setHistogram3D(const std::string& histogramName, const std::string& schemeName, TH3D& rootHistogram) const;
196 
197  /// @brief
198  /// @param[in] histogramName
199  /// @param[in] schemeName
200  /// @param[in] rootHistograms
201  /// @return
202  void setHistograms1D(const std::string& histogramName, const std::string& schemeName,
203  EventIdGroupDict<std::unique_ptr<TH1D>>& rootHistograms) const;
204 
205  /// @brief
206  /// @param[in] histogramName
207  /// @param[in] schemeName
208  /// @param[in] rootHistograms
209  /// @return
210  void setHistograms2D(const std::string& histogramName, const std::string& schemeName,
211  EventIdGroupDict<std::unique_ptr<TH2D>>& rootHistograms) const;
212 
213  /// @brief
214  /// @param[in] histogramName
215  /// @param[in] schemeName
216  /// @param[in] rootHistograms
217  /// @return
218  void setHistograms3D(const std::string& histogramName, const std::string& schemeName,
219  EventIdGroupDict<std::unique_ptr<TH3D>>& rootHistograms) const;
220 
221 #endif
222  /// @brief
223  /// @param[in] histogramName
224  /// @param[in] schemeName
225  /// @param[in] binPosition
226  /// @param[in] value
227  /// @param[in] extraWeight
228  void fillHisto(const std::string& histogramName, const std::string& schemeName, const IndexList& binPosition,
229  Tensor& value, double extraWeight = 1.0);
230 
231 // std::set<EventId> getProcesses(const std::string& histogramName, const std::string& schemeName) const;
232 
233  protected:
234  /// @brief logging facility
235  /// @return stream to be used for logging
236  Log& getLog() const;
237 
238  /// @brief
239  void defineSettings();
240 
241  public:
242  /// @brief
243  /// @param[out] msgwriter
244  /// @param[in] histogramName
245  bool writeDefinition(flatbuffers::FlatBufferBuilder* msgwriter, const std::string& histogramName) const;
246 
247  /// @brief
248  /// @param[out] msgwriter
249  /// @param[in] histogramName
250  /// @param[in] schemeName
251  /// @param[in] eventIDs
252  bool writeHistogram(flatbuffers::FlatBufferBuilder* msgwriter, const std::string& histogramName, const std::string& schemeName, const EventUID& eventIDs) const;
253 
254  /// @brief
255  /// @param[in] msgreader
256  /// @param[in] merge
257  std::string readDefinition(const Serial::FBHistoDefinition* msgreader, bool merge);
258 
259  /// @brief
260  /// @param[in] msgreader
261  /// @param[in] merge
262  HistoInfo readHistogram(const Serial::FBHistogram* msgreader, bool merge);
263 
264 
265  std::vector<EventUID> getEventIDRepsForHisto(const std::string& name, const std::string& scheme) const;
266 
267  private:
268 
269  const HistogramSet* getEntry(const std::string& histogramName, const std::string& schemeName) const;
270  HistogramSet* getEntry(const std::string& histogramName, const std::string& schemeName);
271 
272  std::vector<Tensor> getExternalData(const std::string& schemeName, std::vector<LabelsList> labels) const;
273 
274  private:
276 
279 
281 
283  };
284 
285 } // namespace Hammer
286 
287 #endif
std::set< ProcessUID > EventUID
Definition: IndexTypes.hh:53
void createProjectedHistogram(const std::string &oldName, const std::string &newName, const std::set< uint16_t > &collapsedIndexPositions)
Definition: Histos.cc:96
Histos(DictionaryManager *dict=nullptr)
Definition: Histos.cc:35
Forward declaration of serialization related typedefs and includes.
IOHistogram getHistogram(const std::string &histogramName, const std::string &schemeName) const
Definition: Histos.cc:327
bool writeDefinition(flatbuffers::FlatBufferBuilder *msgwriter, const std::string &histogramName) const
Definition: Histos.cc:847
std::vector< EventUID > getEventIDRepsForHisto(const std::string &name, const std::string &scheme) const
Definition: Histos.cc:343
~Histos() noexcept
Definition: Histos.cc:38
IndexList getHistogramShape(const std::string &histogramName) const
Definition: Histos.cc:286
HistoInfo readHistogram(const Serial::FBHistogram *msgreader, bool merge)
Definition: Histos.cc:899
EventIdGroupDict< IOHistogram > getHistograms(const std::string &histogramName, const std::string &schemeName) const
Definition: Histos.cc:317
std::vector< std::vector< double >> BinEdgeList
std::vector< BinContents > IOHistogram
Definition: IOTypes.hh:132
void defineSettings()
purely virtual function for a class to define new settings
Definition: Histos.cc:842
bool getUnderOverFlows(const std::string &histogramName) const
Definition: Histos.cc:297
std::set< EventUID > EventUIDGroup
Definition: IndexTypes.hh:56
void addHistogramFixedData(const std::string &histogramName, MD::SharedTensorData data)
Definition: Histos.cc:162
Log & getLog() const
logging facility
Definition: Histos.cc:838
Container class for histograms belonging to different event types.
Hammer configuration definitions.
bool canFill(const std::string &name, const std::vector< double > &values)
Checks values can be binned.
Definition: Histos.cc:220
Hammer histogram manager class.
Definition: Histos.hh:43
std::map< std::string, T > HistoNameDict
Definition: Histos.fhh:21
Base class to access the settings repository.
const HistogramSet * getEntry(const std::string &histogramName, const std::string &schemeName) const
Definition: Histos.cc:236
EventUIDGroup getHistogramEventIds(const std::string &name, const std::string &scheme) const
Definition: Histos.cc:264
std::shared_ptr< IContainer > SharedTensorData
IndexList getBinIndices(const std::string &histogramName, const MD::BinValue &value) const
Definition: Histos.cc:208
bool isValidHistogram(const std::string &histogramName, size_t dim) const
Definition: Histos.cc:373
Histos & operator=(const Histos &other)=delete
std::string readDefinition(const Serial::FBHistoDefinition *msgreader, bool merge)
Definition: Histos.cc:874
Forward declarations for histogram manager class.
MD::BinEdgeList getHistogramEdges(const std::string &histogramName) const
Definition: Histos.cc:275
size_t size() const
Definition: Histos.cc:216
HistoNameDict< SchemeDict< HistogramSet > > _histograms
Definition: Histos.hh:278
bool _initialized
Definition: Histos.hh:282
std::vector< IndexType > IndexList
Logging class.
Definition: Logging.hh:33
HistoNameDict< HistogramDefinition > _histogramDefs
Definition: Histos.hh:277
std::vector< std::string > getHistogramNames() const
Definition: Histos.cc:337
UMap< EventUIDGroup, T > EventIdGroupDict
Definition: IndexTypes.hh:58
void checkExists(const std::string &name)
Checks histogram exists.
Definition: Histos.cc:229
Histogram definition class.
void resetHistogramFixedData(const std::string &histogramName)
Definition: Histos.cc:171
Multidimensional tensor class with complex numbers as elements.
Definition: Tensor.hh:33
void setEventId(EventUID eventId)
Definition: Histos.cc:197
void clear()
Definition: Histos.cc:201
Base class for accessing Hammer settings repository.
void setHistogramCompression(const std::string &histogramName, bool value=true)
Definition: Histos.cc:144
void setHistogramKeepErrors(const std::string &histogramName, bool value=true)
Definition: Histos.cc:153
bool writeHistogram(flatbuffers::FlatBufferBuilder *msgwriter, const std::string &histogramName, const std::string &schemeName, const EventUID &eventIDs) const
Definition: Histos.cc:857
EventUID _currentEventId
Definition: Histos.hh:275
std::vector< Tensor > getExternalData(const std::string &schemeName, std::vector< LabelsList > labels) const
Definition: Histos.cc:307
Declarations for Hammer IO structs.
DictionaryManager * _dictionaries
Definition: Histos.hh:280
std::vector< BinRange > BinRangeList
ROOT forward declarations.
void fillHisto(const std::string &histogramName, const std::string &schemeName, const IndexList &binPosition, Tensor &value, double extraWeight=1.0)
Definition: Histos.cc:792
void init()
Definition: Histos.cc:180
void addHistogramDefinition(const std::string &histogramName, const IndexList &binSizes, bool hasUnderOverFlow=true, const MD::BinRangeList &ranges={}, bool shouldCompress=false, bool withErrors=false)
Definition: Histos.cc:43
void removeHistogram(const std::string &histogramName)
Definition: Histos.cc:133
Hammer tensor class.
std::vector< double > BinValue