| # Gaudi Framework, version v20r4
Generated: 8 Jan 2009

# Generic1D.h

Go to the documentation of this file.

    00001 #ifndef GAUDISVC_GENERIC1D_H
    00002 #define GAUDISVC_GENERIC1D_H 1
    00003
    00004 #include <stdexcept>
    00005 #include "Axis.h"
    00006 #include "Annotation.h"
    00007 #include "GaudiKernel/HistogramBase.h"
    00008 #include "AIDA/IProfile1D.h"
    00009 #include "TFile.h"
    00010
    00011 /*
    00012  *    Gaudi namespace
    00013  */
    00014 namespace Gaudi {
    00015
    00026   template <class INTERFACE, class IMPLEMENTATION>
    00027   class Generic1D : virtual public INTERFACE, virtual public HistogramBase {
    00028   public:
    00029     typedef Generic1D<INTERFACE,IMPLEMENTATION> Base;
    00031     Generic1D() : m_rep(0) {}
    00033     virtual ~Generic1D()                                 { delete m_rep;                       }
    00035     virtual const std::string& userLevelClassType() const{ return m_classType;                 }
    00037     virtual void* cast(const std::string& cl) const;
    00039     TObject* representation() const                      { return m_rep;                       }
    00041     virtual void adoptRepresentation(TObject*rep);
    00043     virtual std::string title() const                    { return m_annotation.value("Title"); }
    00045     virtual bool setTitle(const std::string & title);
    00047     std::string name() const                             { return m_annotation.value("Name");  }
    00049     bool setName( const std::string& newName );
    00051     virtual AIDA::IAnnotation & annotation()             { return m_annotation;                }
    00053     virtual const AIDA::IAnnotation & annotation() const { return m_annotation;                }
    00055     Axis & axis ()                                       { return m_axis;                      }
    00057     const Axis & axis () const                           { return m_axis;                      }
    00058
    00060     virtual int entries() const                   { return (int)m_rep->GetEntries();           }
    00062     virtual int allEntries() const                { return int(m_rep->GetEntries());           }
    00064     virtual int extraEntries() const;
    00066     virtual int  binEntries ( int index ) const;
    00067     // spread
    00068     virtual double binRms(int index) const;
    00070     virtual double sumBinHeights() const         { return m_rep->GetSumOfWeights();            }
    00072     virtual double sumAllBinHeights() const      { return m_rep->GetSum();                     }
    00074     virtual double  sumExtraBinHeights () const  { return  sumAllBinHeights()-sumBinHeights(); }
    00076     virtual double minBinHeight() const          { return m_rep->GetMinimum();                 }
    00078     virtual double maxBinHeight() const          { return m_rep->GetMaximum();                 }
    00079
    00081     virtual double equivalentBinEntries (  ) const;
    00083     virtual bool scale( double scaleFactor );
    00085     virtual bool reset();
    00087     virtual bool add(const INTERFACE & profile);
    00089     virtual int rIndex(int index) const          { return m_axis.rIndex(index);}
    00091     virtual double  binMean(int index) const;
    00093     virtual double  binHeight(int index) const;
    00095     virtual double  binError(int index) const;
    00097     virtual double  mean() const                 { return m_rep->GetMean();                    }
    00099     virtual double  rms () const                 {  return m_rep->GetRMS();                    }
    00101     virtual int  coordToIndex ( double coord ) const { return axis().coordToIndex(coord);}
    00103     virtual int  dimension (  ) const  { return 1; }
    00105     virtual std::ostream& print( std::ostream& s ) const;
    00107     virtual std::ostream& write( std::ostream& s ) const;
    00109     virtual int write( const char* file_name ) const;
    00110
    00111   protected:
    00113     Axis                     m_axis;
    00115     mutable AIDA::Annotation m_annotation;
    00117     IMPLEMENTATION*          m_rep;
    00118     // class type
    00119     std::string              m_classType;
    00120     // cache sumEntries (allEntries)   when setting contents since Root can't compute by himself
    00121     int                      m_sumEntries;
    00122   }; // end class Generic1D
    00123
    00124   template <class INTERFACE, class IMPLEMENTATION>
    00125   bool Generic1D<INTERFACE,IMPLEMENTATION>::setTitle(const std::string & title)  {
    00126     m_rep->SetTitle(title.c_str());
    00127     if ( !annotation().addItem( "Title", title ) )
    00128       m_annotation.setValue( "Title" , title );
    00129     if ( !annotation().addItem( "title", title ) )
    00130       annotation().setValue( "title", title );
    00131     return true;
    00132   }
    00133
    00134   template <class INTERFACE, class IMPLEMENTATION>
    00135   bool Generic1D<INTERFACE,IMPLEMENTATION>::setName( const std::string& newName ) {
    00136     m_rep->SetName(newName.c_str());
    00137     m_annotation.setValue( "Name", newName );
    00138     return true;
    00139   }
    00140
    00141   template <class INTERFACE, class IMPLEMENTATION>
    00142   double Generic1D<INTERFACE,IMPLEMENTATION>::binRms(int index) const {
    00143     return m_rep->GetBinError ( rIndex(index) );
    00144   }
    00145
    00146   template <class INTERFACE, class IMPLEMENTATION>
    00147   double Generic1D<INTERFACE,IMPLEMENTATION>::binMean ( int index ) const  {
    00148     return m_rep->GetBinCenter ( rIndex(index) );
    00149   }
    00150
    00151   template <class INTERFACE, class IMPLEMENTATION>
    00152   double Generic1D<INTERFACE,IMPLEMENTATION>::binHeight ( int index ) const  {
    00153     return m_rep->GetBinContent ( rIndex(index) );
    00154   }
    00155
    00156   template <class INTERFACE, class IMPLEMENTATION>
    00157   double Generic1D<INTERFACE,IMPLEMENTATION>::binError ( int index ) const  {
    00158     return m_rep->GetBinError ( rIndex(index) );
    00159   }
    00160
    00161   template <class INTERFACE, class IMPLEMENTATION>
    00162   int Generic1D<INTERFACE,IMPLEMENTATION>::extraEntries() const {
    00163     return binEntries(AIDA::IAxis::UNDERFLOW_BIN) +
    00164           binEntries(AIDA::IAxis::OVERFLOW_BIN);
    00165   }
    00166   template <class INTERFACE, class IMPLEMENTATION>
    00167   bool Generic1D<INTERFACE,IMPLEMENTATION>::reset()   {
    00168     m_sumEntries = 0;
    00169     m_rep->Reset();
    00170     return true;
    00171   }
    00172
    00173   template <class INTERFACE, class IMPLEMENTATION>
    00174   double Generic1D<INTERFACE,IMPLEMENTATION>::equivalentBinEntries() const  {
    00175     if (sumBinHeights() <= 0) return 0;
    00176     Stat_t stats[11];   // cover up to 3D...
    00177     m_rep->GetStats(stats);
    00178     return stats[0]*stats[0]/stats[1];
    00179   }
    00180
    00181   template <class INTERFACE, class IMPLEMENTATION>
    00182   bool Generic1D<INTERFACE,IMPLEMENTATION>::scale(double scaleFactor)   {
    00183     m_rep->Scale ( scaleFactor );
    00184     return true;
    00185   }
    00186
    00187   template <class INTERFACE, class IMPLEMENTATION>
    00188   bool Generic1D<INTERFACE,IMPLEMENTATION>::add(const INTERFACE & h)  {
    00189     const Generic1D<INTERFACE,IMPLEMENTATION>* p =
    00190       dynamic_cast<const Generic1D<INTERFACE,IMPLEMENTATION>*>(&h);
    00191     if ( p )  {
    00192       m_rep->Add(p->m_rep);
    00193       return true;
    00194     }
    00195     throw std::runtime_error("Cannot add profile histograms of different implementations.");
    00196   }
    00197
    00198   template <class INTERFACE, class IMPLEMENTATION>
    00199   std::ostream& Generic1D<INTERFACE,IMPLEMENTATION>::print( std::ostream& s ) const    {
    00201     m_rep->Print("all");
    00202     return s;
    00203   }
    00204
    00206   template <class INTERFACE, class IMPLEMENTATION>
    00207   std::ostream& Generic1D<INTERFACE,IMPLEMENTATION>::write( std::ostream& s ) const  {
    00208     s << "\n1D Histogram Table: " << std::endl;
    00209     s << "Bin, Height, Error "  << std::endl;
    00210     for( int i = 0; i < axis().bins(); ++i )
    00211       s << binMean( i ) << ", "
    00212         << binHeight( i ) << ", "
    00213         << binError ( i ) << std::endl;
    00214     s << std::endl;
    00215     return s;
    00216   }
    00217
    00219   template <class INTERFACE, class IMPLEMENTATION>
    00220   int Generic1D<INTERFACE,IMPLEMENTATION>::write( const char* file_name ) const
    00221   {
    00222     TFile *f = TFile::Open(file_name,"RECREATE");
    00223     Int_t nbytes = m_rep->Write();
    00224     f->Close();
    00225     return nbytes;
    00226   }
    00227 } // end namespace AIDA
    00228
    00229 #endif // AIDAROOT_GENERIC1D_H