Generic3D.h
Go to the documentation of this file.
1 #ifndef GAUDISVC_GENERIC3D_H
2 #define GAUDISVC_GENERIC3D_H 1
3 
4 #include "Axis.h"
5 #include "TFile.h"
6 #include "Annotation.h"
8 #include "AIDA/IHistogram3D.h"
9 #include <stdexcept>
10 #include <memory>
11 
12 // Hide warning message:
13 // warning: 'XYZ' overrides a member function but is not marked 'override'
14 #ifdef __clang__
15 #pragma clang diagnostic push
16 #pragma clang diagnostic ignored "-Winconsistent-missing-override"
17 #elif defined(__GNUC__) && __GNUC__ >= 5
18 #pragma GCC diagnostic push
19 #pragma GCC diagnostic ignored "-Wsuggest-override"
20 #endif
21 
22 namespace Gaudi {
23 
34  template<typename INTERFACE, typename IMPLEMENTATION>
35  class GAUDI_API Generic3D : virtual public INTERFACE, virtual public HistogramBase {
36  public:
39  Generic3D() = default;
40  protected:
42  Generic3D(IMPLEMENTATION* p) : m_rep(p) { }
43  public:
45  ~Generic3D() override = default;
47  TObject* representation() const override { return m_rep.get(); }
49  void adoptRepresentation(TObject* rep) override;
50 
52  int dimension() const override { return 3; }
54  std::string title() const override { return m_annotation.value("Title");}
56  bool setTitle(const std::string & title) override;
58  std::string name() const { return m_annotation.value("Name"); }
60  bool setName( const std::string& newName);
62  AIDA::IAnnotation & annotation() override { return m_annotation; }
64  const AIDA::IAnnotation & annotation() const override { return m_annotation; }
65 
67  int entries() const override;
69  int allEntries() const override;
71  double sumBinHeights() const override;
73  double sumAllBinHeights() const override;
75  double sumExtraBinHeights ( ) const override { return sumAllBinHeights()-sumBinHeights(); }
77  double minBinHeight() const override;
79  double maxBinHeight() const override;
80 
81  int rIndexX(int index) const { return m_xAxis.rIndex(index);}
82  int rIndexY(int index) const { return m_yAxis.rIndex(index);}
83  int rIndexZ(int index) const { return m_zAxis.rIndex(index);}
84 
86  double binMeanX(int indexX,int ,int ) const override
87  { return m_rep->GetXaxis()->GetBinCenter( rIndexX(indexX) ); }
89  double binMeanY(int,int indexY,int ) const override
90  { return m_rep->GetYaxis()->GetBinCenter( rIndexY(indexY) ); }
92  double binMeanZ(int ,int ,int indexZ) const override
93  { return m_rep->GetYaxis()->GetBinCenter( rIndexY(indexZ) ); }
95  int binEntries(int indexX,int indexY,int indexZ) const override {
96  if (binHeight(indexX, indexY, indexZ)<=0) return 0;
97  double xx = binHeight(indexX, indexY, indexZ)/binError(indexX, indexY, indexZ);
98  return int(xx*xx+0.5);
99  }
101  int binEntriesX(int index) const override {
102  int n = 0;
103  for (int i = -2; i < yAxis().bins(); ++i)
104  for (int j = -2; j < zAxis().bins(); ++j)
105  n += binEntries(index,i,j);
106  return n;
107 
108  }
110  int binEntriesY(int index) const override {
111  int n = 0;
112  for (int i = -2; i < xAxis().bins(); ++i)
113  for (int j = -2; j < zAxis().bins(); ++j)
114  n += binEntries(i,index,j);
115  return n;
116  }
117 
119  int binEntriesZ(int index) const override {
120  int n = 0;
121  for (int i = -2; i < xAxis().bins(); ++i)
122  for (int j = -2; j < yAxis().bins(); ++j)
123  n += binEntries(i,j,index);
124  return n;
125  }
126 
128  double binHeight ( int indexX,int indexY,int indexZ ) const
129  { return m_rep->GetBinContent ( rIndexX(indexX), rIndexY(indexY), rIndexZ(indexZ) ); }
130 
132  double binHeightX(int index) const override {
133  double s = 0;
134  for (int i = -2; i < yAxis().bins(); ++i)
135  for (int j = -2; j < zAxis().bins(); ++j)
136  s += binHeight(index,i,j);
137  return s;
138  }
140  double binHeightY(int index) const override {
141  double s = 0;
142  for (int i = -2; i < xAxis().bins(); ++i)
143  for (int j = -2; j < zAxis().bins(); ++j)
144  s += binHeight(i,index,j);
145  return s;
146  }
148  double binHeightZ(int index) const override {
149  double s = 0;
150  for (int i = -2; i < xAxis().bins(); ++i)
151  for (int j = -2; j < yAxis().bins(); ++j)
152  s += binHeight(i,j,index);
153  return s;
154  }
156  double binError ( int indexX,int indexY,int indexZ ) const override
157  { return m_rep->GetBinError ( rIndexX(indexX), rIndexY(indexY ), rIndexZ(indexZ ) ); }
159  double meanX ( ) const override { return m_rep->GetMean ( 1); }
160 
162  double meanY ( ) const override { return m_rep->GetMean ( 2 ); }
164  double meanZ ( ) const override { return m_rep->GetMean ( 3 ); }
166  double rmsX ( ) const override { return m_rep->GetRMS( 1 ); }
168  double rmsY ( ) const override { return m_rep->GetRMS( 2 ); }
170  double rmsZ ( ) const override { return m_rep->GetRMS( 3 ); }
172  const AIDA::IAxis & xAxis ( ) const override { return m_xAxis; }
174  const AIDA::IAxis & yAxis ( ) const override { return m_yAxis; }
176  const AIDA::IAxis & zAxis ( ) const override { return m_zAxis; }
178  int coordToIndexX ( double coord ) const override { return xAxis().coordToIndex(coord);}
180  int coordToIndexY ( double coord ) const override { return yAxis().coordToIndex(coord);}
182  int coordToIndexZ ( double coord ) const override { return zAxis().coordToIndex(coord);}
183 
185  double equivalentBinEntries ( ) const override;
187  bool scale( double scaleFactor ) override;
189  bool add ( const INTERFACE & hist ) override {
190  const Base* p = dynamic_cast<const Base*>(&hist);
191  if ( !p ) throw std::runtime_error("Cannot add profile histograms of different implementations.");
192  m_rep->Add(p->m_rep.get());
193  return true;
194  }
195 
196  // overwrite extraentries
197  int extraEntries() const override {
198  return
199  binEntries(AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN) +
200  binEntries(AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::OVERFLOW_BIN) +
201  binEntries(AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN) +
202  binEntries(AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN) +
203  binEntries(AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::OVERFLOW_BIN) +
204  binEntries(AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN) +
205  binEntries(AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::OVERFLOW_BIN);
206  }
208  std::ostream& print( std::ostream& s ) const override;
210  std::ostream& write( std::ostream& s ) const override;
212  int write( const char* file_name ) const override;
213 
214  protected:
222  // class type
224  // cache sumEntries (allEntries) when setting contents since Root can't compute by himself
225  int m_sumEntries = 0;
226  }; // end class IHistogram3D
227 
228  template <class INTERFACE, class IMPLEMENTATION>
230  m_rep->SetTitle(title.c_str());
231  if ( !annotation().addItem( "Title", title ) )
232  m_annotation.setValue( "Title" , title );
233  if ( !annotation().addItem( "title", title ) )
234  annotation().setValue( "title", title );
235  return true;
236  }
237 
238  template <class INTERFACE, class IMPLEMENTATION>
240  m_rep->SetName(newName.c_str());
241  m_annotation.setValue( "Name", newName );
242  return true;
243  }
244  template <class INTERFACE, class IMPLEMENTATION>
246  return m_rep->GetEntries();
247  }
248 
249  template <class INTERFACE, class IMPLEMENTATION>
251  return int(m_rep->GetEntries());
252  }
253 
254  template <class INTERFACE, class IMPLEMENTATION>
256  return m_rep->GetMinimum();
257  }
258 
259  template <class INTERFACE, class IMPLEMENTATION>
261  return m_rep->GetMaximum();
262  }
263 
264  template <class INTERFACE, class IMPLEMENTATION>
266  return m_rep->GetSumOfWeights();
267  }
268 
269  template <class INTERFACE, class IMPLEMENTATION>
271  return m_rep->GetSum();
272  }
273 
274  template <class INTERFACE, class IMPLEMENTATION>
276  if (sumBinHeights() <= 0) return 0;
277  Stat_t stats[11]; // cover up to 3D...
278  m_rep->GetStats(stats);
279  return stats[0]*stats[0]/stats[1];
280  }
281 
282  template <class INTERFACE, class IMPLEMENTATION>
284  m_rep->Scale ( scaleFactor );
285  return true;
286  }
287 
288  template <class INTERFACE, class IMPLEMENTATION>
290  {
292  m_rep->Print("all");
293  return s;
294  }
295 
296 
298  template <class INTERFACE, class IMPLEMENTATION>
300  {
301  s << "\n3D Histogram Table: " << std::endl;
302  s << "BinX, BinY, BinZ, Height, Error " << std::endl;
303  for ( int i = 0; i < xAxis().bins(); ++i )
304  for ( int j = 0; j < yAxis().bins(); ++j )
305  for ( int k = 0; k < zAxis().bins(); ++k )
306  s << binMeanX( i, j, k ) << ", "
307  << binMeanY( i, j, k ) << ", "
308  << binMeanZ( i, j, k ) << ", "
309  << binHeight( i, j, k ) << ", "
310  << binError ( i, j, k ) << std::endl;
311  s << std::endl;
312  return s;
313  }
314 
316  template <class INTERFACE, class IMPLEMENTATION>
317  int Generic3D<INTERFACE,IMPLEMENTATION>::write( const char* file_name ) const
318  {
319  TFile *f = TFile::Open(file_name,"RECREATE");
320  Int_t nbytes = m_rep->Write();
321  f->Close();
322  return nbytes;
323  }
324 }
325 
326 #ifdef __clang__
327 #pragma clang diagnostic pop
328 #elif defined(__GNUC__) && __GNUC__ >= 5
329 #pragma GCC diagnostic pop
330 #endif
331 
332 #endif // GAUDIPI_GENERIC3D_H
int rIndexZ(int index) const
Definition: Generic3D.h:83
int rIndexX(int index) const
Definition: Generic3D.h:81
AIDA::IAnnotation & annotation() override
Access annotation object.
Definition: Generic3D.h:62
Gaudi::Axis m_xAxis
Definition: Generic3D.h:215
double meanZ() const override
The mean of the IHistogram3D along the z axis.
Definition: Generic3D.h:164
const AIDA::IAnnotation & annotation() const override
Access annotation object (cons)
Definition: Generic3D.h:64
int binEntriesY(int index) const override
Sum of all the entries of the bins along a given y bin.
Definition: Generic3D.h:110
Gaudi::Axis m_yAxis
Definition: Generic3D.h:216
double maxBinHeight() const override
Get the maximum height of the in-range bins.
Definition: Generic3D.h:260
int entries() const override
Get the number or all the entries.
Definition: Generic3D.h:245
std::ostream & print(std::ostream &s) const override
Print (ASCII) the histogram into the output stream.
Definition: Generic3D.h:289
T endl(T...args)
double binMeanY(int, int indexY, int) const override
The weighted mean along the y axis of a given bin.
Definition: Generic3D.h:89
const AIDA::IAxis & yAxis() const override
Get the y axis of the IHistogram3D.
Definition: Generic3D.h:174
const AIDA::IAxis & zAxis() const override
Get the z axis of the IHistogram3D.
Definition: Generic3D.h:176
double rmsZ() const override
The RMS of the IHistogram3D along the z axis.
Definition: Generic3D.h:170
std::string name() const
object name
Definition: Generic3D.h:58
bool add(const INTERFACE &hist) override
Add to this Histogram3D the contents of another IHistogram3D.
Definition: Generic3D.h:189
double sumAllBinHeights() const override
Get the sum of all the bins heights (including underflow and overflow bin).
Definition: Generic3D.h:270
STL class.
int binEntries(int indexX, int indexY, int indexZ) const override
Number of entries in the corresponding bin (ie the number of times fill was calle d for this bin)...
Definition: Generic3D.h:95
double sumBinHeights() const override
Get the sum of in range bin heights in the IProfile.
Definition: Generic3D.h:265
double binHeightY(int index) const override
Sum of all the heights of the bins along a given y bin.
Definition: Generic3D.h:140
double binHeightZ(int index) const override
Sum of all the heights of the bins along a given z bin.
Definition: Generic3D.h:148
Implementation of the AIDA IAnnotation interface class.
Definition: Annotation.h:16
bool scale(double scaleFactor) override
Scale the weights and the errors of all the IHistogram&#39;s bins (in-range and out-of-range ones) by a g...
Definition: Generic3D.h:283
bool setName(const std::string &newName)
Sets the name of the object.
Definition: Generic3D.h:239
Gaudi::Axis m_zAxis
Definition: Generic3D.h:217
bool setTitle(const std::string &title) override
Set the title of the object.
Definition: Generic3D.h:229
int rIndexY(int index) const
Definition: Generic3D.h:82
Generic3D< INTERFACE, IMPLEMENTATION > Base
Definition: Generic3D.h:37
TObject * representation() const override
ROOT object implementation.
Definition: Generic3D.h:47
std::unique_ptr< IMPLEMENTATION > m_rep
Reference to underlying implementation.
Definition: Generic3D.h:221
double binHeight(int indexX, int indexY, int indexZ) const
Total height of the corresponding bin (ie the sum of the weights in this bin).
Definition: Generic3D.h:128
std::string title() const override
Get the title of the object.
Definition: Generic3D.h:54
T get(T...args)
double minBinHeight() const override
Get the minimum height of the in-range bins.
Definition: Generic3D.h:255
int binEntriesX(int index) const override
Sum of all the entries of the bins along a given x bin.
Definition: Generic3D.h:101
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: Generic3D.h:219
int coordToIndexY(double coord) const override
Get the bin number corresponding to a given coordinate along the y axis.
Definition: Generic3D.h:180
void print(string text)
Definition: mergesort.cpp:33
T c_str(T...args)
const AIDA::IAxis & xAxis() const override
Get the x axis of the IHistogram3D.
Definition: Generic3D.h:172
double rmsY() const override
The RMS of the IHistogram3D along the y axis.
Definition: Generic3D.h:168
std::string m_classType
Definition: Generic3D.h:223
string s
Definition: gaudirun.py:245
double rmsX() const override
The RMS of the IHistogram3D along the x axis.
Definition: Generic3D.h:166
double binMeanZ(int, int, int indexZ) const override
The weighted mean along the z axis of a given bin.
Definition: Generic3D.h:92
int coordToIndexZ(double coord) const override
Get the bin number corresponding to a given coordinate along the z axis.
Definition: Generic3D.h:182
int dimension() const override
Get the Histogram&#39;s dimension.
Definition: Generic3D.h:52
double meanY() const override
The mean of the IHistogram3D along the y axis.
Definition: Generic3D.h:162
double binMeanX(int indexX, int, int) const override
The weighted mean along the x axis of a given bin.
Definition: Generic3D.h:86
int coordToIndexX(double coord) const override
Get the bin number corresponding to a given coordinate along the x axis.
Definition: Generic3D.h:178
std::ostream & write(std::ostream &s) const override
Write (ASCII) the histogram table into the output stream.
Definition: Generic3D.h:299
#define GAUDI_API
Definition: Kernel.h:107
int extraEntries() const override
Definition: Generic3D.h:197
STL class.
double equivalentBinEntries() const override
Number of equivalent entries, i.e. SUM[ weight ] ^ 2 / SUM[ weight^2 ]
Definition: Generic3D.h:275
int allEntries() const override
Get the number or all the entries, both in range and underflow/overflow bins of the IProfile...
Definition: Generic3D.h:250
double binHeightX(int index) const override
Sum of all the heights of the bins along a given x bin.
Definition: Generic3D.h:132
double binError(int indexX, int indexY, int indexZ) const override
The error of a given bin.
Definition: Generic3D.h:156
Generic3D(IMPLEMENTATION *p)
constructor
Definition: Generic3D.h:42
Helper functions to set/get the application return code.
Definition: __init__.py:1
An IAxis represents a binned histogram axis.
Definition: Axis.h:29
double meanX() const override
The mean of the IHistogram3D along the x axis.
Definition: Generic3D.h:159
int binEntriesZ(int index) const override
Sum of all the entries of the bins along a given z bin.
Definition: Generic3D.h:119
Common AIDA implementation stuff for histograms and profiles using ROOT implementations.
Definition: Generic3D.h:35
double sumExtraBinHeights() const override
Get the sum of the underflow and overflow bin height.
Definition: Generic3D.h:75