1 #ifndef GAUDISVC_GENERIC3D_H     2 #define GAUDISVC_GENERIC3D_H 1     4 #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"    35   template <
typename INTERFACE, 
typename IMPLEMENTATION>
    53     void adoptRepresentation( TObject* rep ) 
override;
    66     AIDA::IAnnotation& 
annotation()
 override { 
return m_annotation; }
    68     const AIDA::IAnnotation& 
annotation()
 const override { 
return m_annotation; }
    71     int entries() 
const override;
    73     int allEntries() 
const override;
    75     double sumBinHeights() 
const override;
    77     double sumAllBinHeights() 
const override;
    81     double minBinHeight() 
const override;
    83     double maxBinHeight() 
const override;
    85     int rIndexX( 
int index )
 const { 
return m_xAxis.rIndex( index ); }
    86     int rIndexY( 
int index )
 const { 
return m_yAxis.rIndex( index ); }
    87     int rIndexZ( 
int index )
 const { 
return m_zAxis.rIndex( index ); }
    90     double binMeanX( 
int indexX, 
int, 
int )
 const override    92       return m_rep->GetXaxis()->GetBinCenter( rIndexX( indexX ) );
    95     double binMeanY( 
int, 
int indexY, 
int )
 const override    97       return m_rep->GetYaxis()->GetBinCenter( rIndexY( indexY ) );
   100     double binMeanZ( 
int, 
int, 
int indexZ )
 const override   102       return m_rep->GetYaxis()->GetBinCenter( rIndexY( indexZ ) );
   105     int binEntries( 
int indexX, 
int indexY, 
int indexZ )
 const override   107       if ( binHeight( indexX, indexY, indexZ ) <= 0 ) 
return 0;
   108       double xx = binHeight( indexX, indexY, indexZ ) / binError( indexX, indexY, indexZ );
   109       return int( xx * xx + 0.5 );
   115       for ( 
int i = -2; i < yAxis().bins(); ++i )
   116         for ( 
int j = -2; j < zAxis().bins(); ++j ) n += binEntries( index, i, j );
   123       for ( 
int i = -2; i < xAxis().bins(); ++i )
   124         for ( 
int j = -2; j < zAxis().bins(); ++j ) n += binEntries( i, index, j );
   132       for ( 
int i = -2; i < xAxis().bins(); ++i )
   133         for ( 
int j = -2; j < yAxis().bins(); ++j ) n += binEntries( i, j, index );
   138     double binHeight( 
int indexX, 
int indexY, 
int indexZ )
 const   140       return m_rep->GetBinContent( rIndexX( indexX ), rIndexY( indexY ), rIndexZ( indexZ ) );
   147       for ( 
int i = -2; i < yAxis().bins(); ++i )
   148         for ( 
int j = -2; j < zAxis().bins(); ++j ) s += binHeight( index, i, j );
   155       for ( 
int i = -2; i < xAxis().bins(); ++i )
   156         for ( 
int j = -2; j < zAxis().bins(); ++j ) s += binHeight( i, index, j );
   163       for ( 
int i = -2; i < xAxis().bins(); ++i )
   164         for ( 
int j = -2; j < yAxis().bins(); ++j ) s += binHeight( i, j, index );
   168     double binError( 
int indexX, 
int indexY, 
int indexZ )
 const override   170       return m_rep->GetBinError( rIndexX( indexX ), rIndexY( indexY ), rIndexZ( indexZ ) );
   173     double meanX()
 const override { 
return m_rep->GetMean( 1 ); }
   176     double meanY()
 const override { 
return m_rep->GetMean( 2 ); }
   178     double meanZ()
 const override { 
return m_rep->GetMean( 3 ); }
   180     double rmsX()
 const override { 
return m_rep->GetRMS( 1 ); }
   182     double rmsY()
 const override { 
return m_rep->GetRMS( 2 ); }
   184     double rmsZ()
 const override { 
return m_rep->GetRMS( 3 ); }
   186     const AIDA::IAxis& 
xAxis()
 const override { 
return m_xAxis; }
   188     const AIDA::IAxis& 
yAxis()
 const override { 
return m_yAxis; }
   190     const AIDA::IAxis& 
zAxis()
 const override { 
return m_zAxis; }
   192     int coordToIndexX( 
double coord )
 const override { 
return xAxis().coordToIndex( coord ); }
   194     int coordToIndexY( 
double coord )
 const override { 
return yAxis().coordToIndex( coord ); }
   196     int coordToIndexZ( 
double coord )
 const override { 
return zAxis().coordToIndex( coord ); }
   199     double equivalentBinEntries() 
const override;
   202     bool scale( 
double scaleFactor ) 
override;
   204     bool add( 
const INTERFACE& hist )
 override   206       const Base* p = 
dynamic_cast<const Base*
>( &hist );
   207       if ( !p ) 
throw std::runtime_error( 
"Cannot add profile histograms of different implementations." );
   215       return binEntries( AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN ) +
   216              binEntries( AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN ) +
   217              binEntries( AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN ) +
   218              binEntries( AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN ) +
   219              binEntries( AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN ) +
   220              binEntries( AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN ) +
   221              binEntries( AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN );
   228     int write( 
const char* file_name ) 
const override;
   241     int m_sumEntries = 0;
   244   template <
class INTERFACE, 
class IMPLEMENTATION>
   247     m_rep->SetTitle( title.
c_str() );
   248     if ( !annotation().addItem( 
"Title", title ) ) m_annotation.setValue( 
"Title", title );
   249     if ( !annotation().addItem( 
"title", title ) ) annotation().setValue( 
"title", title );
   253   template <
class INTERFACE, 
class IMPLEMENTATION>
   256     m_rep->SetName( newName.
c_str() );
   257     m_annotation.setValue( 
"Name", newName );
   260   template <
class INTERFACE, 
class IMPLEMENTATION>
   263     return m_rep->GetEntries();
   266   template <
class INTERFACE, 
class IMPLEMENTATION>
   269     return int( m_rep->GetEntries() );
   272   template <
class INTERFACE, 
class IMPLEMENTATION>
   275     return m_rep->GetMinimum();
   278   template <
class INTERFACE, 
class IMPLEMENTATION>
   281     return m_rep->GetMaximum();
   284   template <
class INTERFACE, 
class IMPLEMENTATION>
   287     return m_rep->GetSumOfWeights();
   290   template <
class INTERFACE, 
class IMPLEMENTATION>
   293     return m_rep->GetSum();
   296   template <
class INTERFACE, 
class IMPLEMENTATION>
   299     if ( sumBinHeights() <= 0 ) 
return 0;
   301     m_rep->GetStats( stats );
   302     return stats[0] * stats[0] / stats[1];
   305   template <
class INTERFACE, 
class IMPLEMENTATION>
   308     m_rep->Scale( scaleFactor );
   312   template <
class INTERFACE, 
class IMPLEMENTATION>
   316     m_rep->Print( 
"all" );
   321   template <
class INTERFACE, 
class IMPLEMENTATION>
   324     s << 
"\n3D Histogram Table: " << 
std::endl;
   325     s << 
"BinX, BinY, BinZ, Height, Error " << 
std::endl;
   326     for ( 
int i = 0; i < xAxis().bins(); ++i )
   327       for ( 
int j = 0; j < yAxis().bins(); ++j )
   328         for ( 
int k = 0; k < zAxis().bins(); ++k )
   329           s << binMeanX( i, j, k ) << 
", " << binMeanY( i, j, k ) << 
", " << binMeanZ( i, j, k ) << 
", "   330             << binHeight( i, j, k ) << 
", " << binError( i, j, k ) << 
std::endl;
   336   template <
class INTERFACE, 
class IMPLEMENTATION>
   339     TFile* f     = TFile::Open( file_name, 
"RECREATE" );
   340     Int_t nbytes = m_rep->Write();
   347 #pragma clang diagnostic pop   348 #elif defined( __GNUC__ ) && __GNUC__ >= 5   349 #pragma GCC diagnostic pop   352 #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). 
 
Generic3D< INTERFACE, IMPLEMENTATION > Base
 
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 
 
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.