Generic2D.h
Go to the documentation of this file.
1 #ifndef GAUDISVC_GENERIC2D_H
2 #define GAUDISVC_GENERIC2D_H 1
3 #include "AIDA_visibility_hack.h"
5 
6 #include <stdexcept>
7 #include <memory>
8 #include "AIDA/IProfile2D.h"
10 #include "Annotation.h"
11 #include "Axis.h"
12 #include "TFile.h"
13 
14 // Hide warning message:
15 // warning: 'XYZ' overrides a member function but is not marked 'override'
16 #ifdef __clang__
17 #pragma clang diagnostic push
18 #pragma clang diagnostic ignored "-Winconsistent-missing-override"
19 #elif defined(__GNUC__) && __GNUC__ >= 5
20 #pragma GCC diagnostic push
21 #pragma GCC diagnostic ignored "-Wsuggest-override"
22 #endif
23 
24 namespace Gaudi {
25 
36  template <class INTERFACE, class IMPLEMENTATION>
37  class GAUDI_API Generic2D : virtual public INTERFACE, virtual public HistogramBase {
38  public:
40 
41  Generic2D() = default;
42  protected:
44  Generic2D(IMPLEMENTATION* p) : m_rep(p) { }
45  public:
47  ~Generic2D() override = default;
49  TObject* representation() const override { return m_rep.get(); }
51  void adoptRepresentation(TObject* rep) override;
53  std::string title() const override { return m_annotation.value( "Title" ); }
55  bool setTitle(const std::string & title) override;
57  std::string name() const { return m_annotation.value("Name"); }
59  bool setName( const std::string& newName );
61  AIDA::IAnnotation & annotation() override { return m_annotation; }
63  const AIDA::IAnnotation & annotation() const override { return m_annotation; }
64 
66  const AIDA::IAxis & xAxis() const override { return m_xAxis; }
68  const AIDA::IAxis & yAxis() const override { return m_yAxis; }
70  virtual int rIndexX(int index) const { return m_xAxis.rIndex(index); }
72  virtual int rIndexY(int index) const { return m_yAxis.rIndex(index); }
73 
75  int entries() const override;
77  int allEntries() const override;
79  int extraEntries() const override;
81  double sumBinHeights() const override;
83  double sumAllBinHeights() const override;
85  double sumExtraBinHeights ( ) const override { return sumAllBinHeights()-sumBinHeights(); }
87  double minBinHeight() const override;
89  double maxBinHeight() const override;
90 
92  double binMeanX(int indexX,int indexY) const override;
94  double binMeanY(int indexX,int indexY) const override;
96  int binEntries ( int indexX,int indexY ) const override;
98  int binEntriesX(int indexX) const override;
100  int binEntriesY(int indexY) const override;
102  double binHeight(int indexX,int indexY) const override;
104  double binHeightX(int indexX) const override;
106  double binHeightY(int indexY) const override;
108  double binError(int indexX,int indexY) const override;
110  virtual double binRms(int indexX,int indexY) const;
112  double meanX() const override;
114  double meanY() const override;
116  double rmsX() const override;
118  double rmsY() const override;
120  int coordToIndexX(double coordX) const override;
122  int coordToIndexY(double coordY) const override;
124  virtual double equivalentBinEntries ( ) const;
126  virtual bool scale( double scaleFactor );
128  bool add(const INTERFACE & h) override;
129  // overwrite reset
130  bool reset ( ) override;
132  void * cast(const std::string & className) const override;
134  const std::string& userLevelClassType() const { return m_classType; }
136  int dimension() const override { return 2; }
138  std::ostream& print( std::ostream& s ) const override;
140  std::ostream& write( std::ostream& s ) const override;
142  int write( const char* file_name ) const override;
143 
144  protected:
156  int m_sumEntries = 0;
157  };
158 
159  template <class INTERFACE, class IMPLEMENTATION>
161  m_rep->SetTitle(title.c_str());
162  if ( !annotation().addItem( "Title", title ) )
163  m_annotation.setValue( "Title" , title );
164  if ( !annotation().addItem( "title", title ) )
165  annotation().setValue( "title", title );
166  return true;
167  }
168 
169  template <class INTERFACE, class IMPLEMENTATION>
171  m_rep->SetName(newName.c_str());
172  m_annotation.setValue( "Name", newName );
173  return true;
174  }
175 
176  template <class INTERFACE, class IMPLEMENTATION>
178  return m_rep->GetEntries();
179  }
180 
181  template <class INTERFACE, class IMPLEMENTATION>
183  return m_rep->GetEntries();
184  }
185 
186  template <class INTERFACE, class IMPLEMENTATION>
188  return m_rep->GetMinimum();
189  }
190 
191  template <class INTERFACE, class IMPLEMENTATION>
193  return m_rep->GetMaximum();
194  }
195 
196  template <class INTERFACE, class IMPLEMENTATION>
198  return m_rep->GetSumOfWeights();
199  }
200 
201  template <class INTERFACE, class IMPLEMENTATION>
203  return m_rep->GetSum();
204  }
205 
206  template <class INTERFACE, class IMPLEMENTATION>
207  double Generic2D<INTERFACE,IMPLEMENTATION>::binRms(int indexX,int indexY) const {
208  return m_rep->GetBinError ( rIndexX(indexX), rIndexY(indexY) );
209  }
210 
211  template <class INTERFACE, class IMPLEMENTATION>
212  double Generic2D<INTERFACE,IMPLEMENTATION>::binMeanX(int indexX,int ) const {
213  return m_rep->GetXaxis()->GetBinCenter( rIndexX(indexX) );
214  }
215 
216  template <class INTERFACE, class IMPLEMENTATION>
217  double Generic2D<INTERFACE,IMPLEMENTATION>::binMeanY(int,int indexY) const {
218  return m_rep->GetYaxis()->GetBinCenter( rIndexY(indexY) );
219  }
220 
221  template <class INTERFACE, class IMPLEMENTATION>
223  int n = 0;
224  for (int iY = -2; iY < yAxis().bins(); ++iY)
225  n += binEntries(index,iY);
226  return n;
227  }
228 
229  template <class INTERFACE, class IMPLEMENTATION>
231  int n = 0;
232  for (int iX = -2; iX < xAxis().bins(); ++iX)
233  n += binEntries(iX,index);
234  return n;
235  }
236 
237  template <class INTERFACE, class IMPLEMENTATION>
238  double Generic2D<INTERFACE,IMPLEMENTATION>::binHeight ( int indexX,int indexY ) const {
239  return m_rep->GetBinContent ( rIndexX(indexX), rIndexY(indexY) );
240  }
241 
242  template <class INTERFACE, class IMPLEMENTATION>
244  double s = 0;
245  for (int iY = -2; iY < yAxis().bins(); ++iY) {
246  s += binHeight(index,iY);
247  }
248  return s;
249  }
250 
251  template <class INTERFACE, class IMPLEMENTATION>
253  double s = 0;
254  for (int iX = -2; iX < xAxis().bins(); ++iX)
255  s += binHeight(iX,index);
256  return s;
257  }
258 
259  template <class INTERFACE, class IMPLEMENTATION>
260  double Generic2D<INTERFACE,IMPLEMENTATION>::binError(int indexX,int indexY) const {
261  return m_rep->GetBinError ( rIndexX(indexX), rIndexY(indexY ) );
262  }
263 
264  template <class INTERFACE, class IMPLEMENTATION>
266  return m_rep->GetMean(1);
267  }
268 
269  template <class INTERFACE, class IMPLEMENTATION>
271  return m_rep->GetMean(2);
272  }
273 
274  template <class INTERFACE, class IMPLEMENTATION>
276  return m_rep->GetRMS(1);
277  }
278 
279  template <class INTERFACE, class IMPLEMENTATION>
281  return m_rep->GetRMS(2);
282  }
283 
284  template <class INTERFACE, class IMPLEMENTATION>
286  return xAxis().coordToIndex(coord);
287  }
288 
289  template <class INTERFACE, class IMPLEMENTATION>
291  return yAxis().coordToIndex(coord);
292  }
293 
294  template <class INTERFACE, class IMPLEMENTATION>
295  bool Generic2D<INTERFACE,IMPLEMENTATION>::add ( const INTERFACE & hist ) {
296  const Base* p = dynamic_cast<const Base*>(&hist);
297  if ( !p ) throw std::runtime_error("Cannot add profile histograms of different implementations.");
298  m_rep->Add(p->m_rep.get());
299  return true;
300  }
301 
302  template <class INTERFACE, class IMPLEMENTATION>
304  return
305  binEntries(AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN) +
306  binEntries(AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::OVERFLOW_BIN) +
307  binEntries(AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN) +
308  binEntries(AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::OVERFLOW_BIN);
309  }
310 
311  template <class INTERFACE, class IMPLEMENTATION>
313  if (sumBinHeights() <= 0) return 0;
314  Stat_t stats[11]; // cover up to 3D...
315  m_rep->GetStats(stats);
316  return stats[0]*stats[0]/stats[1];
317  }
318 
319  template <class INTERFACE, class IMPLEMENTATION>
321  m_rep->Scale ( scaleFactor );
322  return true;
323  }
324 
325  template <class INTERFACE, class IMPLEMENTATION>
327  m_sumEntries = 0;
328  m_rep->Reset ( );
329  return true;
330  }
331 
332  template <class INTERFACE, class IMPLEMENTATION>
334  {
336  m_rep->Print("all");
337  return s;
338  }
339 
341  template <class INTERFACE, class IMPLEMENTATION>
343  {
344  s << std::endl << "2D Histogram Table: " << std::endl;
345  s << "BinX, BinY, Height, Error " << std::endl;
346  for ( int i = 0; i < xAxis().bins(); ++i ) {
347  for ( int j = 0; j < yAxis().bins(); ++j ) {
348  s << binMeanX( i, j ) << ", "
349  << binMeanY( i, j ) << ", "
350  << binHeight( i, j ) << ", "
351  << binError ( i, j ) << std::endl;
352  }
353  }
354  s << std::endl;
355  return s;
356  }
357 
359  template <class INTERFACE, class IMPLEMENTATION>
360  int Generic2D<INTERFACE,IMPLEMENTATION>::write( const char* file_name ) const
361  {
362  TFile *f = TFile::Open(file_name,"RECREATE");
363  Int_t nbytes = m_rep->Write();
364  f->Close();
365  return nbytes;
366  }
367 }
368 
369 #ifdef __clang__
370 #pragma clang diagnostic pop
371 #elif defined(__GNUC__) && __GNUC__ >= 5
372 #pragma GCC diagnostic pop
373 #endif
374 
375 #endif // GAUDIPI_GENERIC2D_H
int coordToIndexX(double coordX) const override
Convenience method, equivalent to xAxis().coordToIndex(coord).
Definition: Generic2D.h:285
virtual double equivalentBinEntries() const
Number of equivalent entries, i.e. SUM[ weight ] ^ 2 / SUM[ weight^2 ]
Definition: Generic2D.h:312
Generic2D< INTERFACE, IMPLEMENTATION > Base
Definition: Generic2D.h:39
double rmsX() const override
Returns the rms of the profile as calculated on filling-time projected on the X axis.
Definition: Generic2D.h:275
int extraEntries() const override
Get the number of entries in the underflow and overflow bins.
Definition: Generic2D.h:303
int dimension() const override
Get the Histogram&#39;s dimension.
Definition: Generic2D.h:136
T endl(T...args)
Generic2D(IMPLEMENTATION *p)
constructor
Definition: Generic2D.h:44
bool reset() override
Definition: Generic2D.h:326
double binMeanY(int indexX, int indexY) const override
The weighted mean along y of a given bin.
Definition: Generic2D.h:217
virtual bool scale(double scaleFactor)
Scale the weights and the errors of all the IHistogram&#39;s bins (in-range and out-of-range ones) by a g...
Definition: Generic2D.h:320
double rmsY() const override
Returns the rms of the profile as calculated on filling-time projected on the Y axis.
Definition: Generic2D.h:280
double maxBinHeight() const override
Get the maximum height of the in-range bins.
Definition: Generic2D.h:192
std::string name() const
object name
Definition: Generic2D.h:57
bool setName(const std::string &newName)
Set the name of the object.
Definition: Generic2D.h:170
STL class.
virtual int rIndexX(int index) const
operator methods
Definition: Generic2D.h:70
int binEntriesX(int indexX) const override
Equivalent to projectionX().binEntries(indexX).
Definition: Generic2D.h:222
double sumBinHeights() const override
Get the sum of in range bin heights in the IProfile.
Definition: Generic2D.h:197
double binHeightY(int indexY) const override
Equivalent to projectionY().binHeight(indexY).
Definition: Generic2D.h:252
double binHeightX(int indexX) const override
Equivalent to projectionX().binHeight(indexX).
Definition: Generic2D.h:243
std::string m_classType
class type
Definition: Generic2D.h:154
Axis m_xAxis
X axis member.
Definition: Generic2D.h:146
int allEntries() const override
Get the number or all the entries, both in range and underflow/overflow bins of the IProfile...
Definition: Generic2D.h:182
Implementation of the AIDA IAnnotation interface class.
Definition: Annotation.h:18
int coordToIndexY(double coordY) const override
Convenience method, equivalent to yAxis().coordToIndex(coord).
Definition: Generic2D.h:290
double sumExtraBinHeights() const override
Get the sum of the underflow and overflow bin height.
Definition: Generic2D.h:85
std::ostream & print(std::ostream &s) const override
Print (ASCII) the histogram into the output stream.
Definition: Generic2D.h:333
T get(T...args)
const AIDA::IAnnotation & annotation() const override
Access annotation object (cons)
Definition: Generic2D.h:63
const std::string & userLevelClassType() const
The AIDA user-level unterface leaf class type.
Definition: Generic2D.h:134
AIDA::IAnnotation & annotation() override
Access annotation object.
Definition: Generic2D.h:61
double binError(int indexX, int indexY) const override
The error on this bin.
Definition: Generic2D.h:260
Common base class for all histograms Use is solely functional to minimize dynamic_casts inside Histog...
Definition: HistogramBase.h:22
AIDA::Annotation m_annotation
Object annotations.
Definition: Generic2D.h:150
bool setTitle(const std::string &title) override
Set the title of the object.
Definition: Generic2D.h:160
TObject * representation() const override
ROOT object implementation.
Definition: Generic2D.h:49
double meanX() const override
Returns the mean of the profile, as calculated on filling-time projected on the X axis...
Definition: Generic2D.h:265
void print(string text)
Definition: mergesort.cpp:33
T c_str(T...args)
Axis m_yAxis
Y axis member.
Definition: Generic2D.h:148
std::ostream & write(std::ostream &s) const override
Write (ASCII) the histogram table into the output stream.
Definition: Generic2D.h:342
string s
Definition: gaudirun.py:245
double binMeanX(int indexX, int indexY) const override
The weighted mean along x of a given bin.
Definition: Generic2D.h:212
double sumAllBinHeights() const override
Get the sum of all the bins heights (including underflow and overflow bin).
Definition: Generic2D.h:202
virtual double binRms(int indexX, int indexY) const
The spread (RMS) of this bin.
Definition: Generic2D.h:207
std::unique_ptr< IMPLEMENTATION > m_rep
Reference to underlying implementation.
Definition: Generic2D.h:152
int binEntriesY(int indexY) const override
Equivalent to projectionY().binEntries(indexY).
Definition: Generic2D.h:230
int entries() const override
Get the number or all the entries.
Definition: Generic2D.h:177
virtual int rIndexY(int index) const
operator methods
Definition: Generic2D.h:72
double meanY() const override
Returns the mean of the profile, as calculated on filling-time projected on the Y axis...
Definition: Generic2D.h:270
#define GAUDI_API
Definition: Kernel.h:107
std::string title() const override
Get the title of the object.
Definition: Generic2D.h:53
STL class.
Helper functions to set/get the application return code.
Definition: __init__.py:1
An IAxis represents a binned histogram axis.
Definition: Axis.h:31
bool add(const INTERFACE &h) override
Modifies this profile by adding the contents of profile to it.
Definition: Generic2D.h:295
const AIDA::IAxis & yAxis() const override
Return the Y axis.
Definition: Generic2D.h:68
double minBinHeight() const override
Get the minimum height of the in-range bins.
Definition: Generic2D.h:187
const AIDA::IAxis & xAxis() const override
Return the X axis.
Definition: Generic2D.h:66
double binHeight(int indexX, int indexY) const override
Total height of the corresponding bin (ie the sum of the weights in this bin).
Definition: Generic2D.h:238
Common AIDA implementation stuff for histograms and profiles using ROOT implementations.
Definition: Generic2D.h:37