File indexing completed on 2025-02-21 10:00:27
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef GAUDISVC_GENERIC3D_H
0012 #define GAUDISVC_GENERIC3D_H 1
0013
0014 #include "AIDA/IHistogram3D.h"
0015 #include "Annotation.h"
0016 #include "Axis.h"
0017 #include "GaudiKernel/HistogramBase.h"
0018 #include "TFile.h"
0019 #include <memory>
0020 #include <stdexcept>
0021
0022
0023
0024 #ifdef __clang__
0025 # pragma clang diagnostic push
0026 # pragma clang diagnostic ignored "-Wsuggest-override"
0027 # pragma clang diagnostic ignored "-Winconsistent-missing-override"
0028 #elif defined( __GNUC__ ) && __GNUC__ >= 5
0029 # pragma GCC diagnostic push
0030 # pragma GCC diagnostic ignored "-Wsuggest-override"
0031 #endif
0032
0033 namespace Gaudi {
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 template <typename INTERFACE, typename IMPLEMENTATION>
0046 class GAUDI_API Generic3D : virtual public INTERFACE, virtual public HistogramBase {
0047 public:
0048 typedef Generic3D<INTERFACE, IMPLEMENTATION> Base;
0049
0050 Generic3D() = default;
0051
0052 protected:
0053
0054 Generic3D( IMPLEMENTATION* p ) : m_rep( p ) {}
0055
0056 public:
0057
0058 TObject* representation() const override { return m_rep.get(); }
0059
0060 void adoptRepresentation( TObject* rep ) override;
0061
0062
0063 int dimension() const override { return 3; }
0064
0065 std::string title() const override { return m_annotation.value( "Title" ); }
0066
0067 bool setTitle( const std::string& title ) override;
0068
0069 std::string name() const { return m_annotation.value( "Name" ); }
0070
0071 bool setName( const std::string& newName );
0072
0073 AIDA::IAnnotation& annotation() override { return m_annotation; }
0074
0075 const AIDA::IAnnotation& annotation() const override { return m_annotation; }
0076
0077
0078 int entries() const override;
0079
0080 int allEntries() const override;
0081
0082 double sumBinHeights() const override;
0083
0084 double sumAllBinHeights() const override;
0085
0086 double sumExtraBinHeights() const override { return sumAllBinHeights() - sumBinHeights(); }
0087
0088 double minBinHeight() const override;
0089
0090 double maxBinHeight() const override;
0091
0092 int rIndexX( int index ) const { return m_xAxis.rIndex( index ); }
0093 int rIndexY( int index ) const { return m_yAxis.rIndex( index ); }
0094 int rIndexZ( int index ) const { return m_zAxis.rIndex( index ); }
0095
0096
0097 double binMeanX( int indexX, int, int ) const override {
0098 return m_rep->GetXaxis()->GetBinCenter( rIndexX( indexX ) );
0099 }
0100
0101 double binMeanY( int, int indexY, int ) const override {
0102 return m_rep->GetYaxis()->GetBinCenter( rIndexY( indexY ) );
0103 }
0104
0105 double binMeanZ( int, int, int indexZ ) const override {
0106 return m_rep->GetYaxis()->GetBinCenter( rIndexY( indexZ ) );
0107 }
0108
0109 int binEntries( int indexX, int indexY, int indexZ ) const override {
0110 if ( binHeight( indexX, indexY, indexZ ) <= 0 ) return 0;
0111 double xx = binHeight( indexX, indexY, indexZ ) / binError( indexX, indexY, indexZ );
0112 return int( xx * xx + 0.5 );
0113 }
0114
0115 int binEntriesX( int index ) const override {
0116 int n = 0;
0117 for ( int i = -2; i < yAxis().bins(); ++i )
0118 for ( int j = -2; j < zAxis().bins(); ++j ) n += binEntries( index, i, j );
0119 return n;
0120 }
0121
0122 int binEntriesY( int index ) const override {
0123 int n = 0;
0124 for ( int i = -2; i < xAxis().bins(); ++i )
0125 for ( int j = -2; j < zAxis().bins(); ++j ) n += binEntries( i, index, j );
0126 return n;
0127 }
0128
0129
0130 int binEntriesZ( int index ) const override {
0131 int n = 0;
0132 for ( int i = -2; i < xAxis().bins(); ++i )
0133 for ( int j = -2; j < yAxis().bins(); ++j ) n += binEntries( i, j, index );
0134 return n;
0135 }
0136
0137
0138 double binHeight( int indexX, int indexY, int indexZ ) const {
0139 return m_rep->GetBinContent( rIndexX( indexX ), rIndexY( indexY ), rIndexZ( indexZ ) );
0140 }
0141
0142
0143 double binHeightX( int index ) const override {
0144 double s = 0;
0145 for ( int i = -2; i < yAxis().bins(); ++i )
0146 for ( int j = -2; j < zAxis().bins(); ++j ) s += binHeight( index, i, j );
0147 return s;
0148 }
0149
0150 double binHeightY( int index ) const override {
0151 double s = 0;
0152 for ( int i = -2; i < xAxis().bins(); ++i )
0153 for ( int j = -2; j < zAxis().bins(); ++j ) s += binHeight( i, index, j );
0154 return s;
0155 }
0156
0157 double binHeightZ( int index ) const override {
0158 double s = 0;
0159 for ( int i = -2; i < xAxis().bins(); ++i )
0160 for ( int j = -2; j < yAxis().bins(); ++j ) s += binHeight( i, j, index );
0161 return s;
0162 }
0163
0164 double binError( int indexX, int indexY, int indexZ ) const override {
0165 return m_rep->GetBinError( rIndexX( indexX ), rIndexY( indexY ), rIndexZ( indexZ ) );
0166 }
0167
0168 double meanX() const override { return m_rep->GetMean( 1 ); }
0169
0170
0171 double meanY() const override { return m_rep->GetMean( 2 ); }
0172
0173 double meanZ() const override { return m_rep->GetMean( 3 ); }
0174
0175 double rmsX() const override { return m_rep->GetRMS( 1 ); }
0176
0177 double rmsY() const override { return m_rep->GetRMS( 2 ); }
0178
0179 double rmsZ() const override { return m_rep->GetRMS( 3 ); }
0180
0181 const AIDA::IAxis& xAxis() const override { return m_xAxis; }
0182
0183 const AIDA::IAxis& yAxis() const override { return m_yAxis; }
0184
0185 const AIDA::IAxis& zAxis() const override { return m_zAxis; }
0186
0187 int coordToIndexX( double coord ) const override { return xAxis().coordToIndex( coord ); }
0188
0189 int coordToIndexY( double coord ) const override { return yAxis().coordToIndex( coord ); }
0190
0191 int coordToIndexZ( double coord ) const override { return zAxis().coordToIndex( coord ); }
0192
0193
0194 double equivalentBinEntries() const override;
0195
0196
0197 bool scale( double scaleFactor ) override;
0198
0199 bool add( const INTERFACE& hist ) override {
0200 const Base* p = dynamic_cast<const Base*>( &hist );
0201 if ( !p ) throw std::runtime_error( "Cannot add profile histograms of different implementations." );
0202 m_rep->Add( p->m_rep.get() );
0203 return true;
0204 }
0205
0206
0207 int extraEntries() const override {
0208 return binEntries( AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN ) +
0209 binEntries( AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN ) +
0210 binEntries( AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN ) +
0211 binEntries( AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN ) +
0212 binEntries( AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN ) +
0213 binEntries( AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::UNDERFLOW_BIN ) +
0214 binEntries( AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN );
0215 }
0216
0217 std::ostream& print( std::ostream& s ) const override;
0218
0219 std::ostream& write( std::ostream& s ) const override;
0220
0221 int write( const char* file_name ) const override;
0222
0223 protected:
0224 Gaudi::Axis m_xAxis;
0225 Gaudi::Axis m_yAxis;
0226 Gaudi::Axis m_zAxis;
0227
0228 mutable AIDA::Annotation m_annotation;
0229
0230 std::unique_ptr<IMPLEMENTATION> m_rep;
0231
0232 std::string m_classType;
0233
0234 int m_sumEntries = 0;
0235 };
0236
0237 template <class INTERFACE, class IMPLEMENTATION>
0238 bool Generic3D<INTERFACE, IMPLEMENTATION>::setTitle( const std::string& title ) {
0239 m_rep->SetTitle( title.c_str() );
0240 if ( !annotation().addItem( "Title", title ) ) m_annotation.setValue( "Title", title );
0241 if ( !annotation().addItem( "title", title ) ) annotation().setValue( "title", title );
0242 return true;
0243 }
0244
0245 template <class INTERFACE, class IMPLEMENTATION>
0246 bool Generic3D<INTERFACE, IMPLEMENTATION>::setName( const std::string& newName ) {
0247 m_rep->SetName( newName.c_str() );
0248 m_annotation.setValue( "Name", newName );
0249 return true;
0250 }
0251 template <class INTERFACE, class IMPLEMENTATION>
0252 int Generic3D<INTERFACE, IMPLEMENTATION>::entries() const {
0253 return m_rep->GetEntries();
0254 }
0255
0256 template <class INTERFACE, class IMPLEMENTATION>
0257 int Generic3D<INTERFACE, IMPLEMENTATION>::allEntries() const {
0258 return int( m_rep->GetEntries() );
0259 }
0260
0261 template <class INTERFACE, class IMPLEMENTATION>
0262 double Generic3D<INTERFACE, IMPLEMENTATION>::minBinHeight() const {
0263 return m_rep->GetMinimum();
0264 }
0265
0266 template <class INTERFACE, class IMPLEMENTATION>
0267 double Generic3D<INTERFACE, IMPLEMENTATION>::maxBinHeight() const {
0268 return m_rep->GetMaximum();
0269 }
0270
0271 template <class INTERFACE, class IMPLEMENTATION>
0272 double Generic3D<INTERFACE, IMPLEMENTATION>::sumBinHeights() const {
0273 return m_rep->GetSumOfWeights();
0274 }
0275
0276 template <class INTERFACE, class IMPLEMENTATION>
0277 double Generic3D<INTERFACE, IMPLEMENTATION>::sumAllBinHeights() const {
0278 return m_rep->GetSum();
0279 }
0280
0281 template <class INTERFACE, class IMPLEMENTATION>
0282 double Generic3D<INTERFACE, IMPLEMENTATION>::equivalentBinEntries() const {
0283 if ( sumBinHeights() <= 0 ) return 0;
0284 Stat_t stats[11];
0285 m_rep->GetStats( stats );
0286 return stats[0] * stats[0] / stats[1];
0287 }
0288
0289 template <class INTERFACE, class IMPLEMENTATION>
0290 bool Generic3D<INTERFACE, IMPLEMENTATION>::scale( double scaleFactor ) {
0291 m_rep->Scale( scaleFactor );
0292 return true;
0293 }
0294
0295 template <class INTERFACE, class IMPLEMENTATION>
0296 std::ostream& Generic3D<INTERFACE, IMPLEMENTATION>::print( std::ostream& s ) const {
0297
0298 m_rep->Print( "all" );
0299 return s;
0300 }
0301
0302
0303 template <class INTERFACE, class IMPLEMENTATION>
0304 std::ostream& Generic3D<INTERFACE, IMPLEMENTATION>::write( std::ostream& s ) const {
0305 s << "\n3D Histogram Table: " << std::endl;
0306 s << "BinX, BinY, BinZ, Height, Error " << std::endl;
0307 for ( int i = 0; i < xAxis().bins(); ++i )
0308 for ( int j = 0; j < yAxis().bins(); ++j )
0309 for ( int k = 0; k < zAxis().bins(); ++k )
0310 s << binMeanX( i, j, k ) << ", " << binMeanY( i, j, k ) << ", " << binMeanZ( i, j, k ) << ", "
0311 << binHeight( i, j, k ) << ", " << binError( i, j, k ) << std::endl;
0312 s << std::endl;
0313 return s;
0314 }
0315
0316
0317 template <class INTERFACE, class IMPLEMENTATION>
0318 int Generic3D<INTERFACE, IMPLEMENTATION>::write( const char* file_name ) const {
0319 TFile* f = TFile::Open( file_name, "RECREATE" );
0320 Int_t nbytes = m_rep->Write();
0321 f->Close();
0322 return nbytes;
0323 }
0324 }
0325
0326 #ifdef __clang__
0327 # pragma clang diagnostic pop
0328 #elif defined( __GNUC__ ) && __GNUC__ >= 5
0329 # pragma GCC diagnostic pop
0330 #endif
0331
0332 #endif