Gaudi Framework, version v20r4

Generated: 8 Jan 2009

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

Generated at Thu Jan 8 17:44:23 2009 for Gaudi Framework, version v20r4 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004