00001
00002 #include "H2D.h"
00003 #include "H1D.h"
00004 #include "P1D.h"
00005 #include "TH1D.h"
00006 #include "TProfile.h"
00007 #include "GaudiKernel/ObjectFactory.h"
00008 typedef Gaudi::Histogram2D H2D;
00009 DECLARE_DATAOBJECT_FACTORY(H2D)
00010
00011 std::pair<DataObject*,IHistogram2D*> Gaudi::createH2D(const std::string & title,int binsX,double iminX,double imaxX,int binsY,double iminY,double imaxY) {
00012 Histogram2D* p = new Histogram2D(new TH2D(title.c_str(),title.c_str(),binsX, iminX, imaxX, binsY, iminY, imaxY));
00013 return std::pair<DataObject*,IHistogram2D*>(p,p);
00014 }
00015
00016 std::pair<DataObject*,IHistogram2D*> Gaudi::createH2D(const std::string & title, const Edges& eX, const Edges& eY) {
00017 Histogram2D* p = new Histogram2D(new TH2D(title.c_str(),title.c_str(),eX.size()-1,&eX.front(),eY.size()-1,&eY.front()));
00018 return std::pair<DataObject*,IHistogram2D*>(p,p);
00019 }
00020
00021 std::pair<DataObject*,IHistogram2D*> Gaudi::createH2D(TH2D* rep) {
00022 Histogram2D* p = new Histogram2D(rep);
00023 return std::pair<DataObject*,IHistogram2D*>(p,p);
00024 }
00025
00026 std::pair<DataObject*,IHistogram2D*> Gaudi::createH2D(const IHistogram2D& hist) {
00027 TH2D *h = getRepresentation<AIDA::IHistogram2D,TH2D>(hist);
00028 Histogram2D *n = h ? new Histogram2D(new TH2D(*h)) : 0;
00029 return std::pair<DataObject*,IHistogram2D*>(n,n);
00030 }
00031
00032 std::pair<DataObject*,IHistogram1D*>
00033 Gaudi::slice1DX(const std::string& nam,const IHistogram2D& hist,int first, int last) {
00034 TH2 *r = getRepresentation<IHistogram2D,TH2>(hist);
00035 TH1D *t = r ? r->ProjectionX("_px",first,last,"e") : 0;
00036 if ( t ) t->SetName(nam.c_str());
00037 Histogram1D* p = t ? new Histogram1D(t) : 0;
00038 return std::pair<DataObject*,IHistogram1D*>(p,p);
00039 }
00040
00041 std::pair<DataObject*,IHistogram1D*>
00042 Gaudi::slice1DY(const std::string& nam,const IHistogram2D& hist,int first, int last) {
00043 TH2 *r = getRepresentation<IHistogram2D,TH2>(hist);
00044 TH1D *t = r ? r->ProjectionY("_py",first,last,"e") : 0;
00045 if ( t ) t->SetName(nam.c_str());
00046 Histogram1D* p = t ? new Histogram1D(t) : 0;
00047 return std::pair<DataObject*,IHistogram1D*>(p,p);
00048 }
00049
00050 std::pair<DataObject*,IHistogram1D*>
00051 Gaudi::project1DY(const std::string& nam,const IHistogram2D& hist,int first,int last) {
00052 TH2 *r = getRepresentation<IHistogram2D,TH2>(hist);
00053 TH1D *t = r ? r->ProjectionY("_px",first,last,"e") : 0;
00054 if ( t ) t->SetName(nam.c_str());
00055 Histogram1D* p = t ? new Histogram1D(t) : 0;
00056 return std::pair<DataObject*,IHistogram1D*>(p,p);
00057 }
00058
00059 std::pair<DataObject*,IProfile1D*>
00060 Gaudi::profile1DX(const std::string& nam,const IHistogram2D& hist,int first,int last) {
00061 TH2 *r = Gaudi::getRepresentation<IHistogram2D,TH2>(hist);
00062 TProfile *t = r ? r->ProfileX("_pfx",first,last,"e") : 0;
00063 if ( t ) t->SetName(nam.c_str());
00064 Profile1D* p = t ? new Profile1D(t) : 0;
00065 return std::pair<DataObject*,IProfile1D*>(p,p);
00066 }
00067
00068 std::pair<DataObject*,IProfile1D*>
00069 Gaudi::profile1DY(const std::string& nam, const IHistogram2D& hist,int first, int last) {
00070 TH2 *r = getRepresentation<IHistogram2D,TH2>(hist);
00071 TProfile *t = r ? r->ProfileY("_pfx",first,last,"e") : 0;
00072 if ( t ) t->SetName(nam.c_str());
00073 Profile1D* p = t ? new Profile1D(t) : 0;
00074 return std::pair<DataObject*,IProfile1D*>(p,p);
00075 }
00076
00077
00078 namespace Gaudi {
00079 template <>
00080 void * Generic2D<IHistogram2D,TH2D>::cast(const std::string & className) const {
00081 if (className == "AIDA::IHistogram2D")
00082 return (IHistogram2D*)this;
00083 else if (className == "AIDA::IHistogram")
00084 return (IHistogram*)this;
00085 return 0;
00086 }
00087
00088 template <>
00089 int Generic2D<IHistogram2D,TH2D>::binEntries(int indexX,int indexY) const {
00090 if (binHeight(indexX, indexY)<=0) return 0;
00091 double xx = binHeight(indexX, indexY)/binError(indexX, indexY);
00092 return int(xx*xx+0.5);
00093 }
00094
00095 template <>
00096 void Generic2D<AIDA::IHistogram2D,TH2D>::adoptRepresentation(TObject* rep) {
00097 TH2D* imp = dynamic_cast<TH2D*>(rep);
00098 if ( imp ) {
00099 if ( m_rep ) delete m_rep;
00100 m_rep = imp;
00101 m_xAxis.initialize(m_rep->GetXaxis(),true);
00102 m_yAxis.initialize(m_rep->GetYaxis(),true);
00103 const TArrayD* a = m_rep->GetSumw2();
00104 if ( 0 == a || (a && a->GetSize()==0) ) m_rep->Sumw2();
00105 setTitle(m_rep->GetTitle());
00106 return;
00107 }
00108 throw std::runtime_error("Cannot adopt native histogram representation.");
00109 }
00110 }
00111
00112 Gaudi::Histogram2D::Histogram2D() {
00113 m_rep = new TH2D();
00114 m_rep->Sumw2();
00115 m_sumEntries = 0;
00116 m_sumwx = m_sumwy = 0;
00117 setTitle("");
00118 m_rep->SetDirectory(0);
00119 }
00120
00121 Gaudi::Histogram2D::Histogram2D(TH2D* rep) {
00122 m_rep = 0;
00123 adoptRepresentation(rep);
00124 m_sumEntries = 0;
00125 m_sumwx = m_sumwy = 0;
00126 m_rep->SetDirectory(0);
00127 }
00128
00129 bool Gaudi::Histogram2D::fill ( double x,double y,double weight) {
00130 (weight==1.) ? m_rep->Fill(x,y) : m_rep->Fill(x,y,weight );
00131 return true;
00132 }
00133
00134 bool Gaudi::Histogram2D::setBinContents( int i,int j,int entries,double height,double error,double centreX,double centreY) {
00135 m_rep->SetBinContent(rIndexX(i), rIndexY(j), height);
00136 m_rep->SetBinError(rIndexX(i), rIndexY(j), error);
00137
00138 if (i >=0 && j >= 0) {
00139 m_sumwx += centreX*height;
00140 m_sumwy += centreY*height;
00141 }
00142 m_sumEntries += entries;
00143 return true;
00144 }
00145
00146 bool Gaudi::Histogram2D::setRms(double rmsX,double rmsY) {
00147 m_rep->SetEntries(m_sumEntries);
00148 std::vector<double> stat(11);
00149 stat[0] = sumBinHeights();
00150 stat[1] = 0;
00151 if(equivalentBinEntries() != 0)
00152 stat[1] = (sumBinHeights() * sumBinHeights()) / equivalentBinEntries();
00153 stat[2] = m_sumwx;
00154 double meanX = 0;
00155 if(sumBinHeights() != 0) meanX = m_sumwx/ sumBinHeights();
00156 stat[3] = (meanX*meanX + rmsX*rmsX) * sumBinHeights();
00157 stat[4] = m_sumwy;
00158 double meanY = 0;
00159 if(sumBinHeights() != 0) meanY = m_sumwy/ sumBinHeights();
00160 stat[5] = (meanY*meanY + rmsY*rmsY) * sumBinHeights();
00161 stat[6] = 0;
00162 m_rep->PutStats(&stat.front());
00163 return true;
00164 }
00165
00166 bool Gaudi::Histogram2D::reset() {
00167 m_sumwx = 0;
00168 m_sumwy = 0;
00169 return Base::reset();
00170 }
00171
00172 void Gaudi::Histogram2D::copyFromAida(const IHistogram2D& h) {
00173
00174 delete m_rep;
00175 const char* tit = h.title().c_str();
00176 if (h.xAxis().isFixedBinning() && h.yAxis().isFixedBinning() )
00177 m_rep = new TH2D(tit,tit,
00178 h.xAxis().bins(),h.xAxis().lowerEdge(),h.xAxis().upperEdge(),
00179 h.yAxis().bins(),h.yAxis().lowerEdge(),h.yAxis().upperEdge() );
00180 else {
00181 Edges eX, eY;
00182 for (int i =0; i < h.xAxis().bins(); ++i)
00183 eX.push_back(h.xAxis().binLowerEdge(i));
00184
00185 eX.push_back(h.xAxis().upperEdge() );
00186 for (int i =0; i < h.yAxis().bins(); ++i)
00187 eY.push_back(h.yAxis().binLowerEdge(i));
00188
00189 eY.push_back(h.yAxis().upperEdge() );
00190 m_rep = new TH2D(tit,tit,eX.size()-1,&eX.front(),eY.size()-1,&eY.front());
00191 }
00192 m_xAxis.initialize(m_rep->GetXaxis(),true);
00193 m_yAxis.initialize(m_rep->GetYaxis(),true);
00194 m_rep->Sumw2();
00195 m_sumEntries = 0;
00196 m_sumwx = 0;
00197 m_sumwy = 0;
00198
00199 double sumw = h.sumBinHeights();
00200 double sumw2 = 0;
00201 if (h.equivalentBinEntries() != 0)
00202 sumw2 = ( sumw * sumw ) /h.equivalentBinEntries();
00203 double sumwx = h.meanX()*h.sumBinHeights();
00204 double sumwx2 = (h.meanX()*h.meanX() + h.rmsX()*h.rmsX() )*h.sumBinHeights();
00205 double sumwy = h.meanY()*h.sumBinHeights();
00206 double sumwy2 = (h.meanY()*h.meanY() + h.rmsY()*h.rmsY() )*h.sumBinHeights();
00207 double sumwxy = 0;
00208
00209
00210 for (int i=-2; i < xAxis().bins(); ++i) {
00211 for (int j=-2; j < yAxis().bins(); ++j) {
00212
00213 m_rep->SetBinContent(rIndexX(i), rIndexY(j), h.binHeight(i,j) );
00214 m_rep->SetBinError(rIndexX(i), rIndexY(j), h.binError(i,j) );
00215
00216 if ( i >= 0 && j >= 0) {
00217 sumwxy += h.binHeight(i,j)*h.binMeanX(i,j)*h.binMeanY(i,j);
00218 }
00219 }
00220 }
00221
00222
00223 m_rep->SetEntries(h.allEntries());
00224
00225 std::vector<double> stat(11);
00226 stat[0] = sumw;
00227 stat[1] = sumw2;
00228 stat[2] = sumwx;
00229 stat[3] = sumwx2;
00230 stat[4] = sumwy;
00231 stat[5] = sumwy2;
00232 stat[6] = sumwxy;
00233 m_rep->PutStats(&stat.front());
00234 }