ATLAS Offline Software
TH1F_LW.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // //
7 // Implementation of class TH1F_LW //
8 // //
9 // Author: Thomas H. Kittelmann (Thomas.Kittelmann@cern.ch) //
10 // Initial version: March 2009 //
11 // //
13 
14 #include "LWHists/TH1F_LW.h"
15 #include "LWHists/LWHistControls.h"
16 #include "Flex1DHisto.h"
17 #include "LWHistRootUtils.h"
18 #include "TH1F.h"
19 #include <iostream>
20 #include <utility>
21 
22 #define FLEXHIST() ((reinterpret_cast<Flex1DHisto<float>*>(m_flexHisto)))
23 #define CALL(x,y) m_rootHisto ? m_rootHisto-> x : reinterpret_cast<Flex1DHisto<float>*>(m_flexHisto)-> y
24 #ifdef LW_DEBUG_HEAVY_USERS
25 #define LWCOUNTCALL {if (m_flexHisto) FLEXHIST()->countCall(LWHistTraceUtils::getAdresses());};
26 #define LWREPORT {if (m_flexHisto) FLEXHIST()->produceReport(GetName());};
27 #else
28 #define LWCOUNTCALL {};
29 #define LWREPORT {};
30 #endif
31 
32 //____________________________________________________________________
33 TH1F_LW * TH1F_LW::create( const char* name, const char* title,
34  unsigned nbinsx, const double& xlow, const double& xup )
35 {
36  bool rootbackend(LWHistControls::hasROOTBackend());
37  TH1F_LW * h;
38  if (rootbackend) {
39  h = new TH1F_LW (name,title,nbinsx,xlow,xup,rootbackend);
40  } else {
41  h = MP_NEW(TH1F_LW)(name,title,nbinsx,xlow,xup,rootbackend);
42  h->m_nBytesFromPool = sizeof(TH1F_LW);
43  }
44  return h;
45 }
46 
47 //____________________________________________________________________
48 TH1F_LW * TH1F_LW::create( const char* name, const char* title, unsigned nbinsx, const double* xbins )
49 {
50  bool rootbackend(LWHistControls::hasROOTBackend());
51  TH1F_LW * h;
52  if (rootbackend) {
53  h = new TH1F_LW(name,title,nbinsx,xbins,rootbackend);
54  } else {
55  h = MP_NEW(TH1F_LW)(name,title,nbinsx,xbins,rootbackend);
56  h->m_nBytesFromPool = sizeof(TH1F_LW);
57  }
58  return h;
59 }
60 
61 //____________________________________________________________________
62 TH1F_LW * TH1F_LW::create( const char* name, const char* title, unsigned nbinsx, const float* xbins )
63 {
64  bool rootbackend(LWHistControls::hasROOTBackend());
65  TH1F_LW * h;
66  if (rootbackend) {
67  h = new TH1F_LW(name,title,nbinsx,xbins,rootbackend);
68  } else {
69  h = MP_NEW(TH1F_LW)(name,title,nbinsx,xbins,rootbackend);
70  h->m_nBytesFromPool = sizeof(TH1F_LW);
71  }
72  return h;
73 }
74 
75 //____________________________________________________________________
76 TH1F_LW::TH1F_LW( const char* name, const char* title,
77  unsigned nbins,
78  const double& xmin,
79  const double& xmax,
80  bool rootbackend )
81  : LWHist1D(name,title,rootbackend),
82  m_flexHisto(0),
83  m_rootHisto(0),
84  m_rootbackend_fastloopbin(0),
85  m_ownsRootSumw2(false)
86 {
87  if (rootbackend) {
89  } else {
91  }
92 }
93 
94 //____________________________________________________________________
95 TH1F_LW::TH1F_LW( const char* name, const char* title,
96  unsigned nbins, const double* xbins, bool rootbackend )
97  : LWHist1D(name,title,rootbackend),
98  m_flexHisto(0),
99  m_rootHisto(0),
100  m_rootbackend_fastloopbin(0),
101  m_ownsRootSumw2(false)
102 {
103  if (rootbackend) {
105  } else {
107  }
108 }
109 
110 //____________________________________________________________________
111 TH1F_LW::TH1F_LW( const char* name, const char* title,
112  unsigned nbins, const float* xbins, bool rootbackend )
113  : LWHist1D(name,title,rootbackend),
114  m_flexHisto(0),
115  m_rootHisto(0),
116  m_rootbackend_fastloopbin(0),
117  m_ownsRootSumw2(false)
118 {
119  if (rootbackend) {
121  } else {
123  }
124 }
125 
126 //____________________________________________________________________
128 {
130  clear();
131  if (ownsROOTHisto())
132  delete m_rootHisto;//for root backend
133 }
134 
135 //____________________________________________________________________
137 {
138  return m_rootHisto;
139 }
141 {
142  return m_rootHisto;
143 }
146 {
147  if (!m_rootHisto) {
148  TH1F* h = LWHistRootUtils::createRootHisto<float,TH1F_LW,TH1F,Flex1DHisto<float> >(this,FLEXHIST(),m_ownsRootSumw2);
149  if (!apply(h))
150  assert(false);
152  clear();
153  m_rootHisto = h;
154  }
155  return m_rootHisto;
156 }
157 
158 //____________________________________________________________________
160 {
161  LWREPORT
162  LWHist::clear();
164  m_flexHisto = 0;
165 }
166 
167 //____________________________________________________________________
169 {
171  return;
172 
173  if (m_rootHisto) {
174  if (usingROOTBackend())
175  delete m_rootHisto;
176  else
178  m_rootHisto = 0;
179  }
180 }
181 
182 //____________________________________________________________________
184 {
185  if (m_rootHisto) {
186  m_rootHisto->Reset();
187  return;
188  }
189  if (m_flexHisto) {
190  LWREPORT
191  const float * xbins = FLEXHIST()->getVarBins();
192  double xmin(FLEXHIST()->getXMin()),xmax(FLEXHIST()->getXMax());
193  unsigned nbins(FLEXHIST()->getNBins());
196 
197  }
198 }
199 
200 //____________________________________________________________________
201 void TH1F_LW::SetBins(unsigned nbins,double xmin,double xmax)
202 {
203  if (GetEntries())
204  std::cout<<"TH1F_LW Warning: SetBins(..) called on non-empty histogram."
205  <<" Bin contents lost/reshuffled! (histogram name: \""<<GetName()<<"\")"<<std::endl;
206  if (m_rootHisto) {
207  m_rootHisto->SetBins(nbins,xmin,xmax);
208  } else {
211  }
212 }
213 
214 const float * TH1F_LW::getVarBins() const
215 {
216  if (m_rootHisto) {
217  assert(false);
218  return 0;
219  }
220  return std::as_const(*FLEXHIST()).getVarBins();
221 }
222 
224 {
225  if (m_rootHisto) {
226  assert(false);
227  return 0;
228  }
229  return FLEXHIST()->getVarBins();
230 }
231 
232 double TH1F_LW::getXMin() const
233 {
234  if (m_rootHisto)
235  return std::as_const(*m_rootHisto).GetXaxis()->GetXmin();
236  return FLEXHIST()->getXMin();
237 }
238 
239 double TH1F_LW::getXMax() const
240 {
241  if (m_rootHisto)
242  return std::as_const(*m_rootHisto).GetXaxis()->GetXmax();
243  return FLEXHIST()->getXMax();
244 }
245 
246 void TH1F_LW::Fill(const double& x)
247 {
249  if (m_rootHisto)
250  m_rootHisto->Fill(x);
251  else
252  FLEXHIST()->fill(x);
253 }
254 
255 void TH1F_LW::Fill(const double& x, const double& w)
256 {
258  if (m_rootHisto)
259  m_rootHisto->Fill(x,w);
260  else
261  FLEXHIST()->fill(x,w);
262 }
263 
264 unsigned TH1F_LW::GetNbinsX() const { return CALL(GetNbinsX(),getNBins()); }
265 double TH1F_LW::GetBinContent(unsigned bin) const { LWCOUNTCALL;return CALL(GetBinContent(bin),getBinContent(bin)); }
266 double TH1F_LW::GetBinError(unsigned bin) const { LWCOUNTCALL;return CALL(GetBinError(bin),getBinError(bin)); }
267 void TH1F_LW::SetBinContent(unsigned bin, const double& c) { LWCOUNTCALL;CALL(SetBinContent(bin,c),setBinContent(bin,c)); }
268 void TH1F_LW::SetBinError(unsigned bin, const double& e ) { LWCOUNTCALL;CALL(SetBinError(bin,e),setBinError(bin,e)); }
269 unsigned TH1F_LW::GetEntries() const
270 {
271  if (m_rootHisto)
272  return static_cast<unsigned>(m_rootHisto->GetEntries());
273  else
274  return FLEXHIST()->getEntries();
275 }
276 void TH1F_LW::SetEntries(unsigned n) { CALL(SetEntries(n),setEntries(n)); }
277 
278 
279 void TH1F_LW::getSums( double& sumW, double& sumW2,
280  double& sumWX,double& sumWX2 ) const
281 {
282  if (m_rootHisto) {
283  sumW = LWHistRootUtils::getSumW(m_rootHisto);
284  sumW2 = LWHistRootUtils::getSumW2(m_rootHisto);
285  sumWX = LWHistRootUtils::getSumWX(m_rootHisto);
286  sumWX2 = LWHistRootUtils::getSumWX2(m_rootHisto);
287  } else {
288  sumW = FLEXHIST()->getSumW(); sumW2 = FLEXHIST()->getSumW2();
289  sumWX = FLEXHIST()->getSumWX(); sumWX2 = FLEXHIST()->getSumWX2();
290  }
291 }
292 
293 void TH1F_LW::setSums( const double& sumW,const double&sumW2,const double& sumWX,const double& sumWX2 )
294 {
295  if (m_rootHisto) {
296  LWHistRootUtils::setSumW(m_rootHisto,sumW);
297  LWHistRootUtils::setSumW2(m_rootHisto,sumW2);
298  LWHistRootUtils::setSumWX(m_rootHisto,sumWX);
299  LWHistRootUtils::setSumWX2(m_rootHisto,sumWX2);
300  } else {
301  FLEXHIST()->setSums(sumW,sumW2,sumWX,sumWX2);
302  }
303 }
304 
306 {
307  assert(!m_rootHisto);//Should have called the TAxis method
308  if (m_rootHisto) {
309  assert(false);
310  return 0;
311  }
312  return FLEXHIST()->getBinCenter(bin);
313 }
314 
315 unsigned TH1F_LW::actualFindBinX(const double&x) const
316 {
317  assert(!m_rootHisto);//Should have called the TAxis method
318  return FLEXHIST()->valueToBin(x);
319 }
320 
321 double TH1F_LW::Integral() const { return CALL(Integral(),Integral()); }
323  if (m_rootHisto) {
325  return;
326  }
327  m_rootbackend_fastloopbin=UINT_MAX;
328  FLEXHIST()->resetActiveBinLoop();
329 }
330 bool TH1F_LW::getNextActiveBin(unsigned& bin, double& content, double& error) {
331  if (m_rootHisto) {
332  unsigned n(GetNbinsX()+2);
333  assert(m_rootbackend_fastloopbin<n+1);
338  if (content!=0.0||error!=0.0) {
340  return true;
341  }
342  }
343  return false;
344  }
345  assert(m_rootbackend_fastloopbin==UINT_MAX);
346  return FLEXHIST()->getNextActiveBin(bin, content, error);
347 }
348 void TH1F_LW::GetBinContentAndError(unsigned bin,double& content, double&error) const
349 {
351  if (m_rootHisto) {
353  error = m_rootHisto->GetBinError(bin);
354  } else {
355  FLEXHIST()->getBinContentAndError(bin,content,error);
356  }
357 }
358 
359 void TH1F_LW::SetBinContentAndError(unsigned bin,const double& content, const double& error)
360 {
362  if (m_rootHisto) {
364  m_rootHisto->SetBinError(bin,error);
365  } else {
366  FLEXHIST()->setBinContentAndError(bin,content,error);
367  }
368 }
369 
370 void TH1F_LW::scaleContentsAndErrors( const double& fact )
371 {
372  //Treated like changing unit on the weights.
373  if (m_rootHisto) {
375  double sumW, sumW2, sumWX, sumWX2;
376  getSums(sumW, sumW2, sumWX, sumWX2);
377  setSums(fact*sumW, sumW2*fact*fact, sumWX*fact, sumWX2*fact);
378  return;
379  }
380  FLEXHIST()->scaleContentsAndErrors(fact);
381 }
TH1F_LW::~TH1F_LW
virtual ~TH1F_LW()
Definition: TH1F_LW.cxx:127
LWHistRootUtils::scaleContentsAndErrors
void scaleContentsAndErrors(THX *, const double &fact)
CALL
#define CALL(x, y)
Definition: TH1F_LW.cxx:23
TH1F_LW::TH1F_LW
TH1F_LW(const char *name, const char *title, unsigned nbinsx, const double &xlow, const double &xup, bool rootbackend)
Definition: TH1F_LW.cxx:76
TH1F_LW::scaleContentsAndErrors
virtual void scaleContentsAndErrors(const double &fact) override
Definition: TH1F_LW.cxx:370
TH1F_LW.h
TH1F::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:326
TH1F_LW::SetBinError
virtual void SetBinError(unsigned bin, const double &) override
Definition: TH1F_LW.cxx:268
Flex1DHisto.h
TH1F_LW::Fill
virtual void Fill(const double &x) override
Definition: TH1F_LW.cxx:246
TH1F_LW::create
static TH1F_LW * create(const char *name, const char *title, unsigned nbinsx, const double &xlow, const double &xup)
Definition: TH1F_LW.cxx:33
TH1F_LW::getROOTHist
TH1F * getROOTHist()
Definition: TH1F_LW.cxx:145
TH1F_LW::getROOTHistBaseNoAlloc
virtual const TH1 * getROOTHistBaseNoAlloc() const override
Definition: TH1F_LW.cxx:136
TH1F_LW::SetBinContent
virtual void SetBinContent(unsigned bin, const double &) override
Definition: TH1F_LW.cxx:267
TH1F_LW::SetBinContentAndError
virtual void SetBinContentAndError(unsigned bin, const double &content, const double &error) override
Definition: TH1F_LW.cxx:359
bin
Definition: BinsDiffFromStripMedian.h:43
LWHist1D
Definition: LWHist1D.h:23
LWHist::ownsROOTHisto
bool ownsROOTHisto() const
Definition: LWHist.h:74
TH1F_LW::m_flexHisto
void * m_flexHisto
Definition: TH1F_LW.h:87
TH1F_LW::getVarBins
const float * getVarBins() const
Definition: TH1F_LW.cxx:214
LWREPORT
#define LWREPORT
Definition: TH1F_LW.cxx:29
x
#define x
TH1F_LW::clear
virtual void clear() override
Definition: TH1F_LW.cxx:159
SCT_CalibAlgs::nbins
@ nbins
Definition: SCT_CalibNumbers.h:10
grepfile.content
string content
Definition: grepfile.py:56
LWHist::usingROOTBackend
bool usingROOTBackend() const
Definition: LWHist.h:73
TH1F_LW
Definition: TH1F_LW.h:23
TH1F_LW::GetNbinsX
virtual unsigned GetNbinsX() const override
Definition: TH1F_LW.cxx:264
MP_NEW
#define MP_NEW(Class)
Definition: LWPools.h:26
xmin
double xmin
Definition: listroot.cxx:60
TH1F_LW::m_rootbackend_fastloopbin
unsigned m_rootbackend_fastloopbin
Definition: TH1F_LW.h:89
beamspotman.n
n
Definition: beamspotman.py:731
extractSporadic.h
list h
Definition: extractSporadic.py:97
covarianceTool.title
title
Definition: covarianceTool.py:542
TH1F_LW::SetBins
virtual void SetBins(unsigned nbins, double xmin, double xmax) override
Definition: TH1F_LW.cxx:201
TH1F_LW::resetActiveBinLoop
virtual void resetActiveBinLoop() override
Definition: TH1F_LW.cxx:322
LWHist::GetName
const char * GetName() const
Definition: LWHist.cxx:366
LWHistControls::hasROOTBackend
static bool hasROOTBackend()
Definition: LWHistControls.cxx:47
TH1F::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:327
Flex1DHisto::destroy
static void destroy(Flex1DHisto *)
TH1F_LW::m_ownsRootSumw2
bool m_ownsRootSumw2
Definition: TH1F_LW.h:90
TH1F_LW::GetBinContentAndError
virtual void GetBinContentAndError(unsigned bin, double &content, double &error) const override
Definition: TH1F_LW.cxx:348
LWHistControls::cleanupOnGetROOT
static bool cleanupOnGetROOT()
Definition: LWHistControls.cxx:35
TH1F_LW::actualFindBinX
virtual unsigned actualFindBinX(const double &) const override
Definition: TH1F_LW.cxx:315
TH1F_LW::getXMax
virtual double getXMax() const override
Definition: TH1F_LW.cxx:239
TH1F_LW::getROOTHistBase
virtual TH1 * getROOTHistBase() override
Definition: TH1F_LW.cxx:144
TH1F_LW::GetBinContent
virtual double GetBinContent(unsigned bin) const override
Definition: TH1F_LW.cxx:265
LWCOUNTCALL
#define LWCOUNTCALL
Definition: TH1F_LW.cxx:28
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
TH1F_LW::getNextActiveBin
virtual bool getNextActiveBin(unsigned &bin, double &content, double &error) override
Definition: TH1F_LW.cxx:330
TH1F_LW::m_rootHisto
TH1F * m_rootHisto
Definition: TH1F_LW.h:88
LWHist::clear
virtual void clear()
Definition: LWHist.cxx:474
TH1F_LW::getSums
virtual void getSums(double &sumW, double &sumW2, double &sumWX, double &sumWX2) const override
Definition: TH1F_LW.cxx:279
LWHistRootUtils::deleteRootHisto
void deleteRootHisto(THX *rootHist, bool &sumW2IsFromPools)
TH1F_LW::GetEntries
virtual unsigned GetEntries() const override
Definition: TH1F_LW.cxx:269
LArCellBinning.xbins
int xbins
Definition: LArCellBinning.py:163
TH1F_LW::SetEntries
virtual void SetEntries(unsigned) override
Definition: TH1F_LW.cxx:276
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
TH1F_LW::setSums
virtual void setSums(const double &sumW, const double &sumW2, const double &sumWX, const double &sumWX2) override
Definition: TH1F_LW.cxx:293
FLEXHIST
#define FLEXHIST()
Definition: TH1F_LW.cxx:22
h
TH1F
Definition: rootspy.cxx:320
TH1F_LW::clearKeptROOTHist
virtual void clearKeptROOTHist() override
Definition: TH1F_LW.cxx:168
TH1F_LW::GetBinError
virtual double GetBinError(unsigned bin) const override
Definition: TH1F_LW.cxx:266
TH1F_LW::Reset
virtual void Reset() override
Definition: TH1F_LW.cxx:183
TH1
Definition: rootspy.cxx:268
Flex1DHisto::create
static Flex1DHisto * create(unsigned nbins, const double &xmin, const double &xmax)
xmax
double xmax
Definition: listroot.cxx:61
LWHistRootUtils.h
python.TrigEgammaMonitorHelper.TH1F
def TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:24
LWHistControls.h
python.IoTestsLib.w
def w
Definition: IoTestsLib.py:200
error
Definition: IImpactPoint3dEstimator.h:70
TH1F_LW::Integral
virtual double Integral() const override
Definition: TH1F_LW.cxx:321
python.compressB64.c
def c
Definition: compressB64.py:93
TH1F_LW::actualGetBinCenterX
virtual double actualGetBinCenterX(int bin) const override
Definition: TH1F_LW.cxx:305
LWHist1D::apply
virtual bool apply(TH1 *) const
Definition: LWHist1D.cxx:20
TH1F_LW::getXMin
virtual double getXMin() const override
Definition: TH1F_LW.cxx:232