2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
7 //____________________________________________________________________
9 inline Flex1DHisto<T> * Flex1DHisto<T>::create(unsigned nbins, const double& xmin, const double& xmax)
11 return new(LWPools::acquire(sizeof(Flex1DHisto<T>)+extraAllocSize(nbins))) Flex1DHisto<T>(nbins,xmin,xmax);
14 //____________________________________________________________________
16 template <class TFloat>
17 inline Flex1DHisto<T> * Flex1DHisto<T>::create(unsigned nbins, const TFloat* xbins )
19 return new(LWPools::acquire(sizeof(Flex1DHisto<T>)+extraAllocSize(nbins))) Flex1DHisto<T>(nbins,xbins);
22 //____________________________________________________________________
24 inline void Flex1DHisto<T>::destroy(Flex1DHisto<T> *h)
27 unsigned nx = h->getNBins();
29 LWPools::release(reinterpret_cast<char*>(h),sizeof(Flex1DHisto<T>)+extraAllocSize(nx));
33 //____________________________________________________________________
35 inline Flex1DHisto<T>::Flex1DHisto( unsigned nbins,
36 const double& xmin, const double& xmax )
37 : m_invDelta(nbins/(xmax-xmin)),
43 m_nbinsPlus1(nbins+1),
53 //____________________________________________________________________
55 template <class TFloat>
56 inline Flex1DHisto<T>::Flex1DHisto( unsigned nbins, const TFloat* xbins )
57 : m_invDelta(nbins/(xbins[nbins]-xbins[0])),
63 m_nbinsPlus1(nbins+1),
66 m_varBins(LWPools::acquire<float>(nbins+1)),
70 assert(m_xmin<m_xmax);
73 for (unsigned i = 0; i<nbins;++i)
74 assert(xbins[i]<xbins[i+1]);
76 for (unsigned i = 0; i<m_nbinsPlus1;++i)
77 m_varBins[i]=xbins[i];
80 //____________________________________________________________________
82 inline Flex1DHisto<T>::~Flex1DHisto()
85 LWPools::release(m_varBins,m_nbinsPlus1);
88 //____________________________________________________________________
90 inline unsigned Flex1DHisto<T>::valueToBin(const double& x) const
92 return LWBinUtils::valueToBin( x, m_varBins, m_invDelta,m_xmin, m_xmax,m_nbinsPlus1 );
95 //____________________________________________________________________
97 inline double Flex1DHisto<T>::getBinCenter(int bin) const
99 return LWBinUtils::getBinCenter( bin, m_varBins,m_invDelta, m_xmin,m_nbinsPlus1);
102 //____________________________________________________________________
104 inline void Flex1DHisto<T>::fill(const double& x)
106 //Fixme: make sure that we always abort on nan's (in non-strict-root mode)
107 unsigned bin = valueToBin(x);
112 m_flexArray.fill(bin);
113 //Update stats (sums not for over/under flow):
115 if (bin>0&&bin<m_nbinsPlus1) {
123 //____________________________________________________________________
125 inline void Flex1DHisto<T>::fill(const double& x, const double& w)
129 std::cout<<"LWHisto: Saw NaN in fill weight"<<std::endl;
133 unsigned bin = valueToBin(x);
138 m_flexArray.fill(bin,w);
139 //Update stats (sums not for over/under flow):
141 if (bin>0&&bin<m_nbinsPlus1) {
142 //NB: root used to use fabs(w) instead of w in the formulas below:
151 //____________________________________________________________________
153 inline unsigned Flex1DHisto<T>::getEntries() const
158 //____________________________________________________________________
160 inline void Flex1DHisto<T>::setEntries(unsigned n)
165 //____________________________________________________________________
167 inline double Flex1DHisto<T>::getSumW() const
172 //____________________________________________________________________
174 inline double Flex1DHisto<T>::getSumW2() const
179 //____________________________________________________________________
181 inline double Flex1DHisto<T>::getSumWX() const
186 //____________________________________________________________________
188 inline double Flex1DHisto<T>::getSumWX2() const
193 //____________________________________________________________________
195 inline void Flex1DHisto<T>::setSums( const double& sumW,
198 const double& sumWX2 )
206 //____________________________________________________________________
208 inline void Flex1DHisto<T>::copyContents(T*__restrict__ cont, double*__restrict__ err) const
210 m_flexArray.copyContents(cont,err);
213 //____________________________________________________________________
215 inline double Flex1DHisto<T>::Integral() const
217 return m_flexArray.Integral()-m_flexArray.getBinContent(0)-m_flexArray.getBinContent(m_nbinsPlus1);
220 //____________________________________________________________________
222 inline bool Flex1DHisto<T>::holdsSeparateSumW2Info() const
224 return m_flexArray.holdsSeparateSumW2Info();
227 //____________________________________________________________________
229 inline double Flex1DHisto<T>::getBinContent(unsigned bin) const
231 if (bin>m_nbinsPlus1)
232 #ifdef LW_STRICT_ROOT_BEHAVIOUR
237 assert(bin<m_nbinsPlus1+1);
238 return m_flexArray.getBinContent(bin);
241 //____________________________________________________________________
243 inline double Flex1DHisto<T>::getBinError(unsigned bin) const
245 if (bin>m_nbinsPlus1)
246 #ifdef LW_STRICT_ROOT_BEHAVIOUR
251 assert(bin<m_nbinsPlus1+1);
252 return m_flexArray.getBinError(bin);
255 //____________________________________________________________________
257 inline void Flex1DHisto<T>::getBinContentAndError(unsigned bin, double& cont, double& err ) const
259 //float/integer version
260 if (bin>m_nbinsPlus1)
261 #ifdef LW_STRICT_ROOT_BEHAVIOUR
266 assert(bin<m_nbinsPlus1+1);
268 m_flexArray.getBinContentAndError(bin,tmp,err);
269 cont = static_cast<double>(tmp);
272 //____________________________________________________________________
274 inline void Flex1DHisto<double>::getBinContentAndError(unsigned bin, double& cont, double& err ) const
277 if (bin>m_nbinsPlus1) {
278 #ifdef LW_STRICT_ROOT_BEHAVIOUR
286 assert(bin<m_nbinsPlus1+1);
287 m_flexArray.getBinContentAndError(bin,cont,err);
290 //____________________________________________________________________
292 inline void Flex1DHisto<T>::setBinContent(unsigned bin, const double& c)
294 if (bin>m_nbinsPlus1)
296 assert(bin<m_nbinsPlus1+1);
297 m_flexArray.setBinContent(bin,static_cast<T>(c));
298 #ifdef LW_STRICT_ROOT_BEHAVIOUR
299 if (bin==m_nbinsPlus1)//inconsistent root behaviour for last bin...
303 m_sumW = 0;//As in ROOT
306 //____________________________________________________________________
308 inline void Flex1DHisto<T>::setBinError(unsigned bin, const double& e)
310 if (bin>m_nbinsPlus1) {//as in root
313 assert(bin<m_nbinsPlus1+1);
314 m_flexArray.setBinError(bin,e);
317 //____________________________________________________________________
319 inline void Flex1DHisto<T>::setBinContentAndError(unsigned bin, const double& cont, const double& err )
321 if (bin>m_nbinsPlus1) {//as in root
324 assert(bin<m_nbinsPlus1+1);
325 m_flexArray.setBinContentAndError(bin,static_cast<T>(cont),err);
326 #ifdef LW_STRICT_ROOT_BEHAVIOUR
327 if (bin==m_nbinsPlus1)//inconsistent root behaviour for last bin...
331 m_sumW = 0;//As in ROOT
334 //____________________________________________________________________
336 inline void Flex1DHisto<T>::resetActiveBinLoop()
338 m_flexArray.resetActiveBinLoop();
341 //____________________________________________________________________
343 inline bool Flex1DHisto<T>::getNextActiveBin(unsigned& bin, double& content, double& error)
345 //float/integer version
346 T tmp(0);//init to avoid gcc43 warning.
347 bool b = m_flexArray.getNextActiveBin(bin,tmp,error);
348 content = static_cast<double>(tmp);
352 //____________________________________________________________________
354 inline bool Flex1DHisto<double>::getNextActiveBin(unsigned& bin, double& content, double& error)
357 return m_flexArray.getNextActiveBin(bin,content,error);
360 //____________________________________________________________________
362 inline void Flex1DHisto<T>::scaleContentsAndErrors( const double& fact )
365 m_sumW2 *= fact*fact;
368 m_flexArray.scaleContentsAndErrors(fact);
372 #ifdef LW_DEBUG_HEAVY_USERS
374 //____________________________________________________________________
376 inline void Flex1DHisto<T>::countCall(const std::pair<void*,void*>&addresses)
378 std::map<std::pair<void*,void*>,unsigned long>::iterator it = m_callmap.find(addresses);
379 if (it==m_callmap.end())
380 m_callmap[addresses]=0;
385 //____________________________________________________________________
387 inline void Flex1DHisto<T>::produceReport(const char*histname)
389 std::map<std::pair<void*,void*>,unsigned long>::iterator it,itE(m_callmap.end());
390 for(it=m_callmap.begin();it!=itE;++it) {
392 const char * caller = LWHistTraceUtils::getSymbol(it->first.second);
393 const char * calledmethod = LWHistTraceUtils::getSymbol(it->first.first);
394 std::cout<<"LWHists WARNING: Method in histogram called "<<it->second<<" times: "<<calledmethod<<" from "<<caller<<" (histogram named \""<<histname<<"\")"<<std::endl;
395 //fixme: do free on caller and calledmethod