4 #pragma warning(disable:2259)
10 #pragma warning(disable:4996)
17 #include "GaudiKernel/ObjectFactory.h"
19 std::pair<DataObject*,IHistogram2D*>
Gaudi::createH2D(
const std::string & title,
int binsX,
double iminX,
double imaxX,
int binsY,
double iminY,
double imaxY) {
20 Histogram2D* p =
new Histogram2D(
new TH2D(title.c_str(),title.c_str(),binsX, iminX, imaxX, binsY, iminY, imaxY));
24 std::pair<DataObject*,IHistogram2D*>
Gaudi::createH2D(
const std::string & title,
const Edges& eX,
const Edges& eY) {
25 Histogram2D* p =
new Histogram2D(
new TH2D(title.c_str(),title.c_str(),eX.size()-1,&eX.front(),eY.size()-1,&eY.front()));
30 Histogram2D* p =
new Histogram2D(rep);
34 std::pair<DataObject*,IHistogram2D*>
Gaudi::createH2D(
const IHistogram2D& hist) {
35 TH2D *h = getRepresentation<AIDA::IHistogram2D,TH2D>(hist);
36 Histogram2D *
n = h ?
new Histogram2D(
new TH2D(*h)) : nullptr;
40 std::pair<DataObject*,IHistogram1D*>
41 Gaudi::slice1DX(
const std::string& nam,
const IHistogram2D& hist,
int first,
int last) {
42 TH2 *r = getRepresentation<IHistogram2D,TH2>(hist);
43 TH1D *t = r ? r->ProjectionX(
"_px",first,last,
"e") :
nullptr;
44 if ( t ) t->SetName(nam.c_str());
45 Histogram1D* p = t ?
new Histogram1D(t) : nullptr;
49 std::pair<DataObject*,IHistogram1D*>
50 Gaudi::slice1DY(
const std::string& nam,
const IHistogram2D& hist,
int first,
int last) {
51 TH2 *r = getRepresentation<IHistogram2D,TH2>(hist);
52 TH1D *t = r ? r->ProjectionY(
"_py",first,last,
"e") :
nullptr;
53 if ( t ) t->SetName(nam.c_str());
54 Histogram1D* p = t ?
new Histogram1D(t) : nullptr;
58 std::pair<DataObject*,IHistogram1D*>
59 Gaudi::project1DY(
const std::string& nam,
const IHistogram2D& hist,
int first,
int last) {
60 TH2 *r = getRepresentation<IHistogram2D,TH2>(hist);
61 TH1D *t = r ? r->ProjectionY(
"_px",first,last,
"e") :
nullptr;
62 if ( t ) t->SetName(nam.c_str());
63 Histogram1D* p = t ?
new Histogram1D(t) : nullptr;
67 std::pair<DataObject*,IProfile1D*>
68 Gaudi::profile1DX(
const std::string& nam,
const IHistogram2D& hist,
int first,
int last) {
69 TH2 *r = Gaudi::getRepresentation<IHistogram2D,TH2>(hist);
70 TProfile *t = r ? r->ProfileX(
"_pfx",first,last,
"e") :
nullptr;
71 if ( t ) t->SetName(nam.c_str());
72 Profile1D* p = t ?
new Profile1D(t) : nullptr;
76 std::pair<DataObject*,IProfile1D*>
77 Gaudi::profile1DY(
const std::string& nam,
const IHistogram2D& hist,
int first,
int last) {
78 TH2 *r = getRepresentation<IHistogram2D,TH2>(hist);
79 TProfile *t = r ? r->ProfileY(
"_pfx",first,last,
"e") :
nullptr;
80 if ( t ) t->SetName(nam.c_str());
81 Profile1D* p = t ?
new Profile1D(t) : nullptr;
89 if (className ==
"AIDA::IHistogram2D")
90 return (IHistogram2D*)
this;
91 else if (className ==
"AIDA::IHistogram")
92 return (IHistogram*)
this;
98 if (binHeight(indexX, indexY)<=0)
return 0;
99 double xx = binHeight(indexX, indexY)/binError(indexX, indexY);
100 return int(xx*xx+0.5);
105 TH2D* imp =
dynamic_cast<TH2D*
>(rep);
106 if ( !imp )
throw std::runtime_error(
"Cannot adopt native histogram representation.");
108 m_xAxis.initialize(m_rep->GetXaxis(),
true);
109 m_yAxis.initialize(m_rep->GetYaxis(),
true);
110 const TArrayD* a = m_rep->GetSumw2();
111 if ( !a || (a && a->GetSize()==0) ) m_rep->Sumw2();
112 setTitle(m_rep->GetTitle());
122 m_rep->SetDirectory(0);
127 adoptRepresentation(rep);
128 m_sumwx = m_sumwy = 0;
129 m_rep->SetDirectory(0);
133 m_rep->SetBinContent(rIndexX(i), rIndexY(j), height);
134 m_rep->SetBinError(rIndexX(i), rIndexY(j), error);
136 if (i >=0 && j >= 0) {
137 m_sumwx += centreX*height;
138 m_sumwy += centreY*height;
140 m_sumEntries += entries;
147 return Base::reset();
153 #pragma warning(push)
154 #pragma warning(disable:1572)
157 (weight==1.) ? m_rep->Fill(x,y) : m_rep->Fill(x,y,weight );
162 m_rep->SetEntries(m_sumEntries);
163 std::vector<double> stat(11);
164 stat[0] = sumBinHeights();
166 if(equivalentBinEntries() != 0)
167 stat[1] = (sumBinHeights() * sumBinHeights()) / equivalentBinEntries();
170 if(sumBinHeights() != 0) meanX = m_sumwx/ sumBinHeights();
171 stat[3] = (meanX*meanX + rmsX*rmsX) * sumBinHeights();
174 if(sumBinHeights() != 0) meanY = m_sumwy/ sumBinHeights();
175 stat[5] = (meanY*meanY + rmsY*rmsY) * sumBinHeights();
177 m_rep->PutStats(&stat.front());
183 const char* tit = h.title().c_str();
184 if (h.xAxis().isFixedBinning() && h.yAxis().isFixedBinning() )
185 m_rep.reset(
new TH2D(tit,tit,
186 h.xAxis().bins(),h.xAxis().lowerEdge(),h.xAxis().upperEdge(),
187 h.yAxis().bins(),h.yAxis().lowerEdge(),h.yAxis().upperEdge() ) );
190 for (
int i =0;
i < h.xAxis().bins(); ++
i)
191 eX.push_back(h.xAxis().binLowerEdge(
i));
193 eX.push_back(h.xAxis().upperEdge() );
194 for (
int i =0;
i < h.yAxis().bins(); ++
i)
195 eY.push_back(h.yAxis().binLowerEdge(
i));
197 eY.push_back(h.yAxis().upperEdge() );
198 m_rep.reset(
new TH2D(tit,tit,eX.size()-1,&eX.front(),eY.size()-1,&eY.front()) );
200 m_xAxis.initialize(m_rep->GetXaxis(),
true);
201 m_yAxis.initialize(m_rep->GetYaxis(),
true);
207 double sumw = h.sumBinHeights();
209 if (h.equivalentBinEntries() != 0)
210 sumw2 = ( sumw * sumw ) /h.equivalentBinEntries();
211 double sumwx = h.meanX()*h.sumBinHeights();
212 double sumwx2 = (h.meanX()*h.meanX() + h.rmsX()*h.rmsX() )*h.sumBinHeights();
213 double sumwy = h.meanY()*h.sumBinHeights();
214 double sumwy2 = (h.meanY()*h.meanY() + h.rmsY()*h.rmsY() )*h.sumBinHeights();
218 for (
int i=-2;
i < xAxis().bins(); ++
i) {
219 for (
int j=-2; j < yAxis().bins(); ++j) {
221 m_rep->SetBinContent(rIndexX(
i), rIndexY(j), h.binHeight(
i,j) );
222 m_rep->SetBinError(rIndexX(
i), rIndexY(j), h.binError(
i,j) );
224 if (
i >= 0 && j >= 0) {
225 sumwxy += h.binHeight(
i,j)*h.binMeanX(
i,j)*h.binMeanY(
i,j);
231 m_rep->SetEntries(h.allEntries());
233 std::array<double,11> stat = {{ sumw, sumw2,
237 m_rep->PutStats(stat.data());
std::pair< DataObject *, AIDA::IHistogram1D * > slice1DY(const std::string &name, const AIDA::IHistogram2D &h, int firstbin, int lastbin)
Create 1D slice from 2D histogram.
virtual bool setTitle(const std::string &title)
Set the title of the object.
bool setRms(double rmsX, double rmsY)
Sets the rms of the histogram.
virtual int binEntries(int indexX, int indexY) const
The number of entries (ie the number of times fill was called for this bin).
std::pair< DataObject *, AIDA::IHistogram1D * > project1DY(const std::string &name, const AIDA::IHistogram2D &h, int firstbin, int lastbin)
Create 1D projection in Y from 2D histogram.
virtual bool setBinContents(int binIndexX, int binIndexY, int entries, double height, double error, double centreX, double centreY)
Fast filling method for a given bin. It can be also the over/underflow bin.
std::vector< double > Edges
void adoptRepresentation(TObject *rep) override
Adopt ROOT histogram representation.
Histogram2D()
Standard Constructor.
void * cast(const std::string &className) const
Introspection method.
AIDA implementation for 2 D histograms using ROOT THD2.
std::pair< DataObject *, AIDA::IHistogram2D * > createH2D(const AIDA::IHistogram2D &hist)
Copy constructor.
std::pair< DataObject *, AIDA::IHistogram1D * > slice1DX(const std::string &name, const AIDA::IHistogram2D &h, int firstbin, int lastbin)
Create 1D slice from 2D histogram.
#define DECLARE_DATAOBJECT_FACTORY(x)
std::pair< DataObject *, AIDA::IProfile1D * > profile1DX(const std::string &name, const AIDA::IHistogram2D &h, int firstbin, int lastbin)
Create 1D profile in X from 2D histogram.
std::pair< DataObject *, AIDA::IProfile1D * > profile1DY(const std::string &name, const AIDA::IHistogram2D &h, int firstbin, int lastbin)
Create 1D profile in Y from 2D histogram.
bool fill(double x, double y, double weight=1.)
Fill the Histogram2D with a value and the.
void copyFromAida(const IHistogram2D &h)
Create new histogram from any AIDA based histogram.
std::unique_ptr< IMPLEMENTATION > m_rep
Reference to underlying implementation.
Helper functions to set/get the application return code.
Common AIDA implementation stuff for histograms and profiles using ROOT implementations.