00001 #include <cmath>
00002 #include "P1D.h"
00003 #include "GaudiKernel/ObjectFactory.h"
00004 typedef Gaudi::Profile1D P1D;
00005 DECLARE_DATAOBJECT_FACTORY(P1D)
00006
00007 std::pair<DataObject*,AIDA::IProfile1D*> Gaudi::createProf1D
00008 ( const std::string& title ,
00009 int nBins , double xlow, double xup,
00010 double ylow, double yup, const std::string& opt )
00011 {
00012 TProfile* _p = new TProfile(title.c_str(),title.c_str(),nBins,xlow,xup,ylow,yup,opt.c_str() ) ;
00013 Profile1D* p = new Profile1D(_p);
00014 return std::pair<DataObject*,AIDA::IProfile1D*>(p,p);
00015 }
00016
00017 std::pair<DataObject*,AIDA::IProfile1D*> Gaudi::createProf1D
00018 ( const std::string& title,
00019 const Edges& e, double ylow, double yup ,
00020 const std::string& opt )
00021 {
00022 Profile1D* p = new Profile1D(new TProfile(title.c_str(),title.c_str(),e.size()-1,&e.front(),ylow,yup,opt.c_str()));
00023 return std::pair<DataObject*,AIDA::IProfile1D*>(p,p);
00024 }
00025
00026 std::pair<DataObject*,AIDA::IProfile1D*> Gaudi::createProf1D(const AIDA::IProfile1D& hist) {
00027 TProfile *h = getRepresentation<AIDA::IProfile1D,TProfile>(hist);
00028 Profile1D *n = h ? new Profile1D(new TProfile(*h)) : 0;
00029 return std::pair<DataObject*,AIDA::IProfile1D*>(n,n);
00030 }
00031
00032 namespace Gaudi {
00033 template <>
00034 int Generic1D<AIDA::IProfile1D,TProfile>::binEntries (int index) const {
00035 return int(m_rep->GetBinEntries( rIndex(index) )+0.5);
00036 }
00037
00038 template <> void* Generic1D<AIDA::IProfile1D,TProfile>::cast(const std::string& className) const {
00039 if (className == "AIDA::IProfile1D")
00040 return const_cast<AIDA::IProfile1D*>((AIDA::IProfile1D*)this);
00041 else if (className == "AIDA::IProfile")
00042 return const_cast<AIDA::IProfile*>((AIDA::IProfile*)this);
00043 else if (className == "AIDA::IBaseHistogram")
00044 return const_cast<AIDA::IBaseHistogram*>((AIDA::IBaseHistogram*)this);
00045 return 0;
00046 }
00047
00048 template <>
00049 void Generic1D<AIDA::IProfile1D,TProfile>::adoptRepresentation(TObject* rep) {
00050 TProfile* imp = dynamic_cast<TProfile*>(rep);
00051 if ( imp ) {
00052 if ( m_rep ) delete m_rep;
00053 m_rep = imp;
00054 m_axis.initialize(m_rep->GetXaxis(),true);
00055 const TArrayD* a = m_rep->GetSumw2();
00056 if ( 0 == a || (a && a->GetSize()==0) ) m_rep->Sumw2();
00057 setTitle(m_rep->GetTitle());
00058 return;
00059 }
00060 throw std::runtime_error("Cannot adopt native histogram representation.");
00061 }
00062 }
00063
00064 Gaudi::Profile1D::Profile1D() {
00065 m_rep = new TProfile();
00066 init("",false);
00067 }
00068
00069 Gaudi::Profile1D::Profile1D(TProfile* rep) {
00070 m_rep = rep;
00071 init(m_rep->GetTitle());
00072 }
00073
00074 void Gaudi::Profile1D::init(const std::string& title, bool initialize_axis) {
00075 m_classType = "IProfile1D";
00076 setTitle(title);
00077 setName(title);
00078 if ( initialize_axis ) {
00079 axis().initialize(m_rep->GetXaxis(),false);
00080 }
00081
00082 m_rep->SetDirectory(0);
00083 m_sumEntries = 0;
00084 }
00085
00086 bool Gaudi::Profile1D::setBinContents(int i, int entries,double height,double , double spread, double ) {
00087 m_rep->SetBinEntries(rIndex(i), entries );
00088
00089 m_rep->SetBinContent(rIndex(i), height*entries );
00090
00091 double sumwy2Bin = ( spread*spread + height*height )*entries;
00092 m_rep->SetBinError(rIndex(i), sqrt(sumwy2Bin) );
00093 m_sumEntries += entries;
00094
00095 m_rep->SetEntries(m_sumEntries);
00096 return true;
00097 }
00098
00099 bool Gaudi::Profile1D::fill ( double x, double y, double weight ) {
00100 (weight == 1.) ? m_rep->Fill(x,y) : m_rep->Fill(x,y,weight);
00101 return true;
00102 }