4 #pragma warning(disable:2259)
10 #pragma warning(disable:4996)
14 #include "GaudiKernel/StreamBuffer.h"
15 #include "GaudiKernel/ObjectFactory.h"
17 std::pair<DataObject*,AIDA::IHistogram1D*>
Gaudi::createH1D(
const std::string& title,
int nBins,
double xlow,
double xup) {
18 auto p =
new Histogram1D(
new TH1D(title.c_str(),title.c_str(),nBins,xlow,xup));
22 std::pair<DataObject*,AIDA::IHistogram1D*>
Gaudi::createH1D(
const std::string& title,
const Edges& e) {
23 auto p =
new Histogram1D(
new TH1D(title.c_str(),title.c_str(),e.size()-1,&e.front()));
27 std::pair<DataObject*,AIDA::IHistogram1D*>
Gaudi::createH1D(
const AIDA::IHistogram1D& hist) {
28 TH1D *
h = getRepresentation<AIDA::IHistogram1D,TH1D>(hist);
29 auto n = ( h ?
new Histogram1D(
new TH1D(*h)) : nullptr );
35 if (className ==
"AIDA::IHistogram1D")
36 return const_cast<AIDA::IHistogram1D*
>((AIDA::IHistogram1D*)
this);
37 if (className ==
"AIDA::IHistogram")
38 return const_cast<AIDA::IHistogram*
>((AIDA::IHistogram*)
this);
44 if (binHeight(index)<=0)
return 0;
45 double xx = binHeight(index)/binError(index);
46 return int(xx*xx+0.5);
51 TH1D* imp =
dynamic_cast<TH1D*
>(rep);
52 if ( !imp )
throw std::runtime_error(
"Cannot adopt native histogram representation.");
65 init(m_rep->GetTitle());
70 m_classType =
"IHistogram1D";
71 if ( initialize_axis ) {
72 m_axis.initialize(m_rep->GetXaxis(),
false);
74 const TArrayD* a = m_rep->GetSumw2();
75 if ( !a || (a && a->GetSize()==0) ) m_rep->Sumw2();
77 m_rep->SetDirectory(
nullptr);
85 for(
int i=1, n=m_rep->GetNbinsX();
i<=
n; ++
i) {
86 m_sumwx += m_rep->GetBinContent(
i)*m_rep->GetBinCenter(
i);
87 m_sumEntries += m_rep->GetBinContent(
i);
101 init(m_rep->GetTitle());
107 m_rep->SetBinContent(rIndex(i),height);
108 m_rep->SetBinError(rIndex(i),error);
110 if (i != AIDA::IAxis::UNDERFLOW_BIN && i != AIDA::IAxis::OVERFLOW_BIN )
111 m_sumwx += centre*height;
112 m_sumEntries += entries;
119 #pragma warning(push)
120 #pragma warning(disable:1572)
123 m_rep->SetEntries(m_sumEntries);
124 std::vector<double> stat(11);
126 stat[0] = sumBinHeights();
128 if (equivalentBinEntries() != 0)
129 stat[1] = ( sumBinHeights() * sumBinHeights() ) / equivalentBinEntries();
132 if ( sumBinHeights() != 0 ) mean = m_sumwx/ sumBinHeights();
133 stat[3] = ( mean*mean + rms*rms )* sumBinHeights();
134 m_rep->PutStats(&stat.front());
140 m_rep->SetEntries(allEntries);
142 std::vector<double> stat(11);
144 stat[0] = sumBinHeights();
147 if (eqBinEntries != 0)
148 stat[1] = ( sumBinHeights() * sumBinHeights() ) / eqBinEntries;
150 stat[2] = mean*sumBinHeights();
152 stat[3] = ( mean*mean + rms*rms )* sumBinHeights();
153 m_rep->PutStats(&stat.front());
158 (weight == 1.) ? m_rep->Fill(x) : m_rep->Fill(x,weight);
164 std::string tit = h.title()+
"Copy";
165 if (h.axis().isFixedBinning() ) {
166 m_rep.reset(
new TH1D(tit.c_str(),tit.c_str(),h.axis().bins(),h.axis().lowerEdge(),h.axis().upperEdge()) );
170 for (
int i =0;
i < h.axis().bins(); ++
i) {
171 e.push_back(h.axis().binLowerEdge(
i));
174 e.push_back(h.axis().upperEdge() );
175 m_rep.reset(
new TH1D(tit.c_str(),tit.c_str(),e.size()-1,&e.front()) );
177 m_axis.initialize(m_rep->GetXaxis(),
false);
182 double sumw = h.sumBinHeights();
185 if (h.equivalentBinEntries() != 0)
186 sumw2 = ( sumw * sumw ) /h.equivalentBinEntries();
188 double sumwx = h.mean()*h.sumBinHeights();
189 double sumwx2 = (h.mean()*h.mean() + h.rms()*h.rms() )*h.sumBinHeights();
192 for (
int i=-2;
i < axis().bins(); ++
i) {
194 m_rep->SetBinContent(rIndex(
i),h.binHeight(
i) );
195 m_rep->SetBinError(rIndex(
i),h.binError(
i) );
199 m_rep->SetEntries(h.allEntries());
201 std::vector<double> stat(11);
206 m_rep->PutStats(&stat.front());
219 for (
int j = 0; j < size; j++) {
220 std::string key,
value;
222 annotation().addItem (key, value);
223 if (
"Title" == key) {
227 double lowerEdge, upperEdge, binHeight, binError;
228 int isFixedBinning, bins;
229 s >> isFixedBinning >> bins;
231 if ( isFixedBinning ) {
232 s >> lowerEdge >> upperEdge;
233 m_rep.reset(
new TH1D(title.c_str(),title.c_str(),bins,lowerEdge,upperEdge) );
237 for (
int i = 0;
i <= bins; ++
i )
238 s >> *(
double*)&edges[
i];
239 m_rep.reset(
new TH1D(title.c_str(),title.c_str(),edges.size()-1,&edges.front()) );
241 m_axis.initialize(m_rep->GetXaxis(),
true);
246 for (
int i = 0;
i <= bins + 1; ++
i ) {
247 s >> binHeight >> binError;
248 m_rep->SetBinContent(
i, binHeight );
249 m_rep->SetBinError(
i, binError );
253 m_rep->SetEntries( allEntries );
255 s >> stats[0] >> stats[1] >> stats[2] >> stats[3];
256 m_rep->PutStats( stats );
262 s << static_cast<int>( annotation().size() );
263 for (
int i = 0;
i < annotation().size();
i++) {
264 s << annotation().key(
i);
265 s << annotation().value(
i);
267 const AIDA::IAxis & axis( this->axis() );
268 const int isFixedBinning = axis.isFixedBinning();
269 const int bins = axis.bins();
270 s << isFixedBinning << bins;
271 if ( isFixedBinning ) {
272 s << axis.lowerEdge();
275 for (
int i = 0;
i < bins; ++
i )
276 s << axis.binLowerEdge(
i);
278 s << axis.upperEdge();
279 for (
int i = 0;
i <= bins + 1; ++
i )
280 s << m_rep->GetBinContent(
i) << m_rep->GetBinError(
i );
282 s << m_rep->GetEntries();
284 m_rep->GetStats( stats );
285 s << stats[0] << stats[1] << stats[2] << stats[3];
bool fill(double x, double weight) override
Fill the Profile1D with a value and the corresponding weight.
void adoptRepresentation(TObject *rep) override
Adopt ROOT histogram representation.
void * cast(const std::string &cl) const override
Manual cast by class name.
virtual bool setStatistics(int allEntries, double eqBinEntries, double mean, double rms)
set histogram statistics
std::pair< DataObject *, AIDA::IHistogram1D * > createH1D(const AIDA::IHistogram1D &hist)
Copy constructor.
The stream buffer is a small object collecting object data.
StreamBuffer & serialize(StreamBuffer &s)
Serialization mechanism, Serialize the object for reading.
bool reset() override
need to overwrite reset to reset the sums
std::vector< double > Edges
void init(const std::string &title, bool initialize_axis=true)
void adoptRepresentation(TObject *rep) override
Adopt ROOT histogram representation.
AIDA implementation for 1 D histograms using ROOT THD1.
void copyFromAida(const AIDA::IHistogram1D &h)
Create new histogram from any AIDA based histogram.
bool setRms(double rms)
Update histogram RMS.
int binEntries(int index) const override
Number of entries in the corresponding bin (ie the number of times fill was called for this bin)...
virtual bool setBinContents(int i, int entries, double height, double error, double centre)
set bin content (entries and centre are not used )
Histogram1D()
Standard constructor.
#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.