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 auto 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 auto p =
new Histogram2D(
new TH2D(title.c_str(),title.c_str(),eX.size()-1,&eX.front(),eY.size()-1,&eY.front()));
30 auto 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(
nullptr);
127 adoptRepresentation(rep);
128 m_sumwx = m_sumwy = 0;
129 m_rep->SetDirectory(
nullptr);
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.
bool setRms(double rmsX, double rmsY)
Sets the rms of the histogram.
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
int binEntries(int indexX, int indexY) const override
The number of entries (ie the number of times fill was called for this bin).
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.
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 setTitle(const std::string &title) override
Set the title of the object.
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.
#define DECLARE_DATAOBJECT_FACTORY(x)
Helper functions to set/get the application return code.
Common AIDA implementation stuff for histograms and profiles using ROOT implementations.