| # Gaudi Framework, version v20r3
Generated: 24 Nov 2008

# Generic3D.h

Go to the documentation of this file.

    00001 #ifndef GAUDISVC_GENERIC3D_H
    00002 #define GAUDISVC_GENERIC3D_H 1
    00003
    00004 #include "Axis.h"
    00005 #include "TFile.h"
    00006 #include "Annotation.h"
    00007 #include "GaudiKernel/HistogramBase.h"
    00008 #include "AIDA/IHistogram3D.h"
    00009 #include <stdexcept>
    00010
    00011 /*
    00012  *    Gaudi namespace
    00013  */
    00014 namespace Gaudi {
    00015
    00026   template<typename INTERFACE, typename IMPLEMENTATION>
    00027   class Generic3D : virtual public INTERFACE, virtual public HistogramBase  {
    00028   public:
    00029     typedef Generic3D<INTERFACE,IMPLEMENTATION> Base;
    00031     Generic3D() : m_rep(0)  {}
    00033     virtual ~Generic3D()    { delete m_rep; }
    00035     TObject* representation() const                      { return m_rep;                       }
    00037     virtual void adoptRepresentation(TObject* rep);
    00038
    00040     virtual int  dimension() const  { return 3; }
    00042     virtual std::string title() const                    {  return m_annotation.value("Title");}
    00044     virtual bool setTitle(const std::string & title);
    00046     virtual std::string name() const                     { return m_annotation.value("Name"); }
    00048     bool setName( const std::string& newName);
    00050     virtual AIDA::IAnnotation & annotation()             { return m_annotation;               }
    00052     virtual const AIDA::IAnnotation & annotation() const { return m_annotation;               }
    00053
    00055     virtual int entries() const;
    00057     virtual int allEntries() const;
    00059     virtual double sumBinHeights() const;
    00061     virtual double sumAllBinHeights() const;
    00063     virtual double  sumExtraBinHeights (  ) const  { return  sumAllBinHeights()-sumBinHeights(); }
    00065     virtual double minBinHeight() const;
    00067     virtual double maxBinHeight() const;
    00068
    00069     int rIndexX(int index) const { return m_xAxis.rIndex(index);}
    00070     int rIndexY(int index) const { return m_yAxis.rIndex(index);}
    00071     int rIndexZ(int index) const { return m_zAxis.rIndex(index);}
    00072
    00074     double binMeanX(int indexX,int ,int ) const
    00075     { return (m_rep->GetXaxis())->GetBinCenter( rIndexX(indexX) ); }
    00077     double binMeanY(int,int indexY,int  ) const
    00078     { return (m_rep->GetYaxis())->GetBinCenter( rIndexY(indexY) ); }
    00080     double binMeanZ(int ,int ,int indexZ) const
    00081     { return (m_rep->GetYaxis())->GetBinCenter( rIndexY(indexZ) ); }
    00083     int binEntries(int indexX,int indexY,int indexZ) const    {
    00084       if (binHeight(indexX, indexY, indexZ)<=0) return 0;
    00085       double xx =  binHeight(indexX, indexY, indexZ)/binError(indexX, indexY, indexZ);
    00086       return int(xx*xx+0.5);
    00087     }
    00089     virtual int binEntriesX(int index) const    {
    00090       int n = 0;
    00091       for (int i = -2; i < yAxis().bins(); ++i)
    00092         for (int j = -2; j < zAxis().bins(); ++j)
    00093           n += binEntries(index,i,j);
    00094       return n;
    00095
    00096     }
    00098     virtual int binEntriesY(int index) const    {
    00099       int n = 0;
    00100       for (int i = -2; i < xAxis().bins(); ++i)
    00101         for (int j = -2; j < zAxis().bins(); ++j)
    00102           n += binEntries(i,index,j);
    00103       return n;
    00104     }
    00105
    00107     virtual int binEntriesZ(int index) const    {
    00108       int n = 0;
    00109       for (int i = -2; i < xAxis().bins(); ++i)
    00110         for (int j = -2; j < yAxis().bins(); ++j)
    00111           n += binEntries(i,j,index);
    00112       return n;
    00113     }
    00114
    00116     double  binHeight ( int indexX,int indexY,int indexZ ) const
    00117     { return m_rep->GetBinContent ( rIndexX(indexX), rIndexY(indexY), rIndexZ(indexZ) ); }
    00118
    00120     virtual double binHeightX(int index) const    {
    00121       double s = 0;
    00122       for (int i = -2; i < yAxis().bins(); ++i)
    00123         for (int j = -2; j < zAxis().bins(); ++j)
    00124           s += binHeight(index,i,j);
    00125       return s;
    00126     }
    00128     virtual double binHeightY(int index) const    {
    00129       double s = 0;
    00130       for (int i = -2; i < xAxis().bins(); ++i)
    00131         for (int j = -2; j < zAxis().bins(); ++j)
    00132           s += binHeight(i,index,j);
    00133       return s;
    00134     }
    00136     virtual double binHeightZ(int index) const    {
    00137       double s = 0;
    00138       for (int i = -2; i < xAxis().bins(); ++i)
    00139         for (int j = -2; j < yAxis().bins(); ++j)
    00140           s += binHeight(i,j,index);
    00141       return s;
    00142     }
    00144     virtual double  binError ( int indexX,int indexY,int indexZ ) const
    00145     { return m_rep->GetBinError ( rIndexX(indexX), rIndexY(indexY ), rIndexZ(indexZ ) ); }
    00147     virtual double  meanX (  ) const  { return m_rep->GetMean ( 1); }
    00148
    00150     virtual double  meanY (  ) const  { return m_rep->GetMean ( 2 ); }
    00152     virtual double  meanZ (  ) const  { return m_rep->GetMean ( 3 ); }
    00154     virtual double  rmsX (  ) const  { return m_rep->GetRMS( 1 ); }
    00156     virtual double  rmsY (  ) const  { return m_rep->GetRMS( 2 ); }
    00158     virtual double  rmsZ (  ) const  { return m_rep->GetRMS( 3 ); }
    00160     virtual const AIDA::IAxis & xAxis (  ) const  { return m_xAxis; }
    00162     virtual const AIDA::IAxis & yAxis (  ) const  { return m_yAxis; }
    00164     virtual const AIDA::IAxis & zAxis (  ) const  { return m_zAxis; }
    00166     virtual int  coordToIndexX ( double coord ) const { return xAxis().coordToIndex(coord);}
    00168     virtual int  coordToIndexY ( double coord ) const { return yAxis().coordToIndex(coord);}
    00170     virtual int  coordToIndexZ ( double coord ) const { return zAxis().coordToIndex(coord);}
    00171
    00173     virtual double equivalentBinEntries (  ) const;
    00175     virtual bool scale( double scaleFactor );
    00177     virtual bool  add ( const INTERFACE & hist ) {
    00178       const Base* p = dynamic_cast<const Base*>(&hist);
    00179       if ( p )  {
    00180         m_rep->Add(p->m_rep);
    00181         return true;
    00182       }
    00183       throw std::runtime_error("Cannot add profile histograms of different implementations.");
    00184     }
    00185
    00186     // overwrite extraentries
    00187     int extraEntries() const {
    00188       return
    00189         binEntries(AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN) +
    00190         binEntries(AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::OVERFLOW_BIN)  +
    00191         binEntries(AIDA::IAxis::UNDERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN)  +
    00192         binEntries(AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN) +
    00193         binEntries(AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN,AIDA::IAxis::OVERFLOW_BIN) +
    00194         binEntries(AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::UNDERFLOW_BIN)  +
    00195         binEntries(AIDA::IAxis::OVERFLOW_BIN, AIDA::IAxis::OVERFLOW_BIN,AIDA::IAxis::OVERFLOW_BIN);
    00196     }
    00198     virtual std::ostream& print( std::ostream& s ) const;
    00200     virtual std::ostream& write( std::ostream& s ) const;
    00202     virtual int write( const char* file_name ) const;
    00203
    00204   protected:
    00205     Gaudi::Axis              m_xAxis;
    00206     Gaudi::Axis              m_yAxis;
    00207     Gaudi::Axis              m_zAxis;
    00209     mutable AIDA::Annotation m_annotation;
    00211     IMPLEMENTATION*          m_rep;
    00212     // class type
    00213     std::string              m_classType;
    00214     // cache sumEntries (allEntries)   when setting contents since Root can't compute by himself
    00215     int                      m_sumEntries;
    00216   }; // end class IHistogram3D
    00217
    00218   template <class INTERFACE, class IMPLEMENTATION>
    00219   bool Generic3D<INTERFACE,IMPLEMENTATION>::setTitle(const std::string & title)  {
    00220     m_rep->SetTitle(title.c_str());
    00221     if ( !annotation().addItem( "Title", title ) )
    00222       m_annotation.setValue( "Title" , title );
    00223     if ( !annotation().addItem( "title", title ) )
    00224       annotation().setValue( "title", title );
    00225     return true;
    00226   }
    00227
    00228   template <class INTERFACE, class IMPLEMENTATION>
    00229   bool Generic3D<INTERFACE,IMPLEMENTATION>::setName( const std::string& newName ) {
    00230     m_rep->SetName(newName.c_str());
    00231     m_annotation.setValue( "Name", newName );
    00232     return true;
    00233   }
    00234   template <class INTERFACE, class IMPLEMENTATION>
    00235   int Generic3D<INTERFACE,IMPLEMENTATION>::entries() const                       {
    00236     return (int)m_rep->GetEntries();
    00237   }
    00238
    00239   template <class INTERFACE, class IMPLEMENTATION>
    00240   int Generic3D<INTERFACE,IMPLEMENTATION>::allEntries (  ) const  {
    00241     return int(m_rep->GetEntries());
    00242   }
    00243
    00244   template <class INTERFACE, class IMPLEMENTATION>
    00245   double  Generic3D<INTERFACE,IMPLEMENTATION>::minBinHeight() const  {
    00246     return m_rep->GetMinimum();
    00247   }
    00248
    00249   template <class INTERFACE, class IMPLEMENTATION>
    00250   double  Generic3D<INTERFACE,IMPLEMENTATION>::maxBinHeight() const  {
    00251     return m_rep->GetMaximum();
    00252   }
    00253
    00254   template <class INTERFACE, class IMPLEMENTATION>
    00255   double Generic3D<INTERFACE,IMPLEMENTATION>::sumBinHeights () const  {
    00256     return m_rep->GetSumOfWeights();
    00257   }
    00258
    00259   template <class INTERFACE, class IMPLEMENTATION>
    00260   double Generic3D<INTERFACE,IMPLEMENTATION>::sumAllBinHeights () const  {
    00261     return m_rep->GetSum();
    00262   }
    00263
    00264   template <class INTERFACE, class IMPLEMENTATION>
    00265   double Generic3D<INTERFACE,IMPLEMENTATION>::equivalentBinEntries() const  {
    00266     if (sumBinHeights() <= 0) return 0;
    00267     Stat_t stats[11];   // cover up to 3D...
    00268     m_rep->GetStats(stats);
    00269     return stats[0]*stats[0]/stats[1];
    00270   }
    00271
    00272   template <class INTERFACE, class IMPLEMENTATION>
    00273   bool Generic3D<INTERFACE,IMPLEMENTATION>::scale(double scaleFactor)   {
    00274     m_rep->Scale ( scaleFactor );
    00275     return true;
    00276   }
    00277
    00278   template <class INTERFACE, class IMPLEMENTATION>
    00279   std::ostream& Generic3D<INTERFACE,IMPLEMENTATION>::print( std::ostream& s ) const
    00280   {
    00282     m_rep->Print("all");
    00283     return s;
    00284   }
    00285
    00286
    00288   template <class INTERFACE, class IMPLEMENTATION>
    00289   std::ostream& Generic3D<INTERFACE,IMPLEMENTATION>::write( std::ostream& s ) const
    00290   {
    00291     s << "\n3D Histogram Table: " << std::endl;
    00292     s << "BinX, BinY, BinZ, Height, Error " << std::endl;
    00293     for ( int i = 0; i < xAxis().bins(); ++i )
    00294       for ( int j = 0; j < yAxis().bins(); ++j )
    00295         for ( int k = 0; k < zAxis().bins(); ++k )
    00296         s << binMeanX( i, j, k )    << ", "
    00297           << binMeanY( i, j, k )    << ", "
    00298           << binMeanZ( i, j, k )    << ", "
    00299           << binHeight( i, j, k ) << ", "
    00300           << binError ( i, j, k ) << std::endl;
    00301     s << std::endl;
    00302     return s;
    00303   }
    00304
    00306   template <class INTERFACE, class IMPLEMENTATION>
    00307   int Generic3D<INTERFACE,IMPLEMENTATION>::write( const char* file_name ) const
    00308   {
    00309     TFile *f = TFile::Open(file_name,"RECREATE");
    00310     Int_t nbytes = m_rep->Write();
    00311     f->Close();
    00312     return nbytes;
    00313   }
    00314 } // end namespace AIDA
    00315 #endif // GAUDIPI_GENERIC3D_H