1 #ifndef GAUDISVC_GENERIC3D_H 2 #define GAUDISVC_GENERIC3D_H 1 8 #include "AIDA/IHistogram3D.h" 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" 34 template<
typename INTERFACE,
typename IMPLEMENTATION>
49 void adoptRepresentation(TObject* rep)
override;
62 AIDA::IAnnotation &
annotation()
override {
return m_annotation; }
64 const AIDA::IAnnotation &
annotation()
const override {
return m_annotation; }
67 int entries()
const override;
69 int allEntries()
const override;
71 double sumBinHeights()
const override;
73 double sumAllBinHeights()
const override;
77 double minBinHeight()
const override;
79 double maxBinHeight()
const override;
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);}
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);
103 for (
int i = -2; i < yAxis().bins(); ++i)
104 for (
int j = -2; j < zAxis().bins(); ++j)
105 n += binEntries(index,i,j);
112 for (
int i = -2; i < xAxis().bins(); ++i)
113 for (
int j = -2; j < zAxis().bins(); ++j)
114 n += binEntries(i,index,j);
121 for (
int i = -2; i < xAxis().bins(); ++i)
122 for (
int j = -2; j < yAxis().bins(); ++j)
123 n += binEntries(i,j,index);
128 double binHeight (
int indexX,
int indexY,
int indexZ )
const 129 {
return m_rep->GetBinContent ( rIndexX(indexX), rIndexY(indexY), rIndexZ(indexZ) ); }
134 for (
int i = -2; i < yAxis().bins(); ++i)
135 for (
int j = -2; j < zAxis().bins(); ++j)
136 s += binHeight(index,i,j);
142 for (
int i = -2; i < xAxis().bins(); ++i)
143 for (
int j = -2; j < zAxis().bins(); ++j)
144 s += binHeight(i,index,j);
150 for (
int i = -2; i < xAxis().bins(); ++i)
151 for (
int j = -2; j < yAxis().bins(); ++j)
152 s += binHeight(i,j,index);
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); }
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);}
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.");
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);
212 int write(
const char* file_name )
const override;
225 int m_sumEntries = 0;
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 );
238 template <
class INTERFACE,
class IMPLEMENTATION>
240 m_rep->SetName(newName.
c_str());
241 m_annotation.setValue(
"Name", newName );
244 template <
class INTERFACE,
class IMPLEMENTATION>
246 return m_rep->GetEntries();
249 template <
class INTERFACE,
class IMPLEMENTATION>
251 return int(m_rep->GetEntries());
254 template <
class INTERFACE,
class IMPLEMENTATION>
256 return m_rep->GetMinimum();
259 template <
class INTERFACE,
class IMPLEMENTATION>
261 return m_rep->GetMaximum();
264 template <
class INTERFACE,
class IMPLEMENTATION>
266 return m_rep->GetSumOfWeights();
269 template <
class INTERFACE,
class IMPLEMENTATION>
271 return m_rep->GetSum();
274 template <
class INTERFACE,
class IMPLEMENTATION>
276 if (sumBinHeights() <= 0)
return 0;
278 m_rep->GetStats(stats);
279 return stats[0]*stats[0]/stats[1];
282 template <
class INTERFACE,
class IMPLEMENTATION>
284 m_rep->Scale ( scaleFactor );
288 template <
class INTERFACE,
class IMPLEMENTATION>
298 template <
class INTERFACE,
class IMPLEMENTATION>
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 ) <<
", " 316 template <
class INTERFACE,
class IMPLEMENTATION>
319 TFile *f = TFile::Open(file_name,
"RECREATE");
320 Int_t nbytes = m_rep->Write();
327 #pragma clang diagnostic pop 328 #elif defined(__GNUC__) && __GNUC__ >= 5 329 #pragma GCC diagnostic pop 332 #endif // GAUDIPI_GENERIC3D_H int rIndexZ(int index) const
int rIndexX(int index) const
AIDA::IAnnotation & annotation() override
Access annotation object.
double meanZ() const override
The mean of the IHistogram3D along the z axis.
const AIDA::IAnnotation & annotation() const override
Access annotation object (cons)
int binEntriesY(int index) const override
Sum of all the entries of the bins along a given y bin.
double maxBinHeight() const override
Get the maximum height of the in-range bins.
int entries() const override
Get the number or all the entries.
std::ostream & print(std::ostream &s) const override
Print (ASCII) the histogram into the output stream.
double binMeanY(int, int indexY, int) const override
The weighted mean along the y axis of a given bin.
const AIDA::IAxis & yAxis() const override
Get the y axis of the IHistogram3D.
const AIDA::IAxis & zAxis() const override
Get the z axis of the IHistogram3D.
double rmsZ() const override
The RMS of the IHistogram3D along the z axis.
std::string name() const
object name
bool add(const INTERFACE &hist) override
Add to this Histogram3D the contents of another IHistogram3D.
double sumAllBinHeights() const override
Get the sum of all the bins heights (including underflow and overflow bin).
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)...
double sumBinHeights() const override
Get the sum of in range bin heights in the IProfile.
double binHeightY(int index) const override
Sum of all the heights of the bins along a given y bin.
double binHeightZ(int index) const override
Sum of all the heights of the bins along a given z bin.
Implementation of the AIDA IAnnotation interface class.
bool scale(double scaleFactor) override
Scale the weights and the errors of all the IHistogram's bins (in-range and out-of-range ones) by a g...
bool setName(const std::string &newName)
Sets the name of the object.
bool setTitle(const std::string &title) override
Set the title of the object.
int rIndexY(int index) const
Generic3D< INTERFACE, IMPLEMENTATION > Base
TObject * representation() const override
ROOT object implementation.
std::unique_ptr< IMPLEMENTATION > m_rep
Reference to underlying implementation.
double binHeight(int indexX, int indexY, int indexZ) const
Total height of the corresponding bin (ie the sum of the weights in this bin).
std::string title() const override
Get the title of the object.
double minBinHeight() const override
Get the minimum height of the in-range bins.
int binEntriesX(int index) const override
Sum of all the entries of the bins along a given x bin.
Common base class for all histograms Use is solely functional to minimize dynamic_casts inside Histog...
AIDA::Annotation m_annotation
Object annotations.
int coordToIndexY(double coord) const override
Get the bin number corresponding to a given coordinate along the y axis.
const AIDA::IAxis & xAxis() const override
Get the x axis of the IHistogram3D.
double rmsY() const override
The RMS of the IHistogram3D along the y axis.
double rmsX() const override
The RMS of the IHistogram3D along the x axis.
double binMeanZ(int, int, int indexZ) const override
The weighted mean along the z axis of a given bin.
int coordToIndexZ(double coord) const override
Get the bin number corresponding to a given coordinate along the z axis.
int dimension() const override
Get the Histogram's dimension.
double meanY() const override
The mean of the IHistogram3D along the y axis.
double binMeanX(int indexX, int, int) const override
The weighted mean along the x axis of a given bin.
int coordToIndexX(double coord) const override
Get the bin number corresponding to a given coordinate along the x axis.
std::ostream & write(std::ostream &s) const override
Write (ASCII) the histogram table into the output stream.
int extraEntries() const override
double equivalentBinEntries() const override
Number of equivalent entries, i.e. SUM[ weight ] ^ 2 / SUM[ weight^2 ]
int allEntries() const override
Get the number or all the entries, both in range and underflow/overflow bins of the IProfile...
double binHeightX(int index) const override
Sum of all the heights of the bins along a given x bin.
double binError(int indexX, int indexY, int indexZ) const override
The error of a given bin.
Generic3D(IMPLEMENTATION *p)
constructor
Helper functions to set/get the application return code.
An IAxis represents a binned histogram axis.
double meanX() const override
The mean of the IHistogram3D along the x axis.
int binEntriesZ(int index) const override
Sum of all the entries of the bins along a given z bin.
Common AIDA implementation stuff for histograms and profiles using ROOT implementations.
double sumExtraBinHeights() const override
Get the sum of the underflow and overflow bin height.