28 if ((0 >= nBinsX) || (xHigh - xLow < std::numeric_limits<float>::epsilon()))
31 m_xBinWidth = (xHigh - xLow) /
static_cast<float>(nBinsX);
49 std::cout <<
"Construct Histogram from xml: cannot find xml element with name " << xmlElementName << std::endl;
66 if (orderedBinContents.size() !=
static_cast<unsigned int>(
m_nBinsX) + 2)
71 const float value(orderedBinContents[binX + 1]);
73 if (std::fabs(value) > std::numeric_limits<float>::epsilon())
81 m_histogramMap(rhs.m_histogramMap),
82 m_nBinsX(rhs.m_nBinsX),
85 m_xBinWidth(rhs.m_xBinWidth)
123 float sumEntries(0.f);
132 sumEntries += iterX->second;
152 const float binContents(iterX->second);
154 if (binContents > maximumValue)
156 maximumValue = binContents;
157 maximumBinX = iterX->first;
166 float sumEntries(0.f), sumXEntries(0.f);
176 const float binCenter(firstBinCenter + (
m_xBinWidth *
static_cast<float>(iterX->first)));
177 const float binContents(iterX->second);
179 sumEntries += binContents;
180 sumXEntries += binContents * binCenter;
183 if (std::fabs(sumEntries) < std::numeric_limits<float>::epsilon())
186 return (sumXEntries / sumEntries);
193 float sumEntries(0.f), sumXEntries(0.f), sumXXEntries(0.f);
203 const float binCenter(firstBinCenter + (
m_xBinWidth *
static_cast<float>(iterX->first)));
204 const float binContents(iterX->second);
206 sumEntries += binContents;
207 sumXEntries += binContents * binCenter;
208 sumXXEntries += binContents * binCenter * binCenter;
211 if (std::fabs(sumEntries) < std::numeric_limits<float>::epsilon())
214 const float meanX(sumXEntries / sumEntries);
215 const float meanXX(sumXXEntries / sumEntries);
217 return std::sqrt(meanXX - (meanX * meanX));
240 iter->second += weight;
244 if (!
m_histogramMap.insert(HistogramMap::value_type(binX, weight)).second)
255 mapEntry.second = (mapEntry.second * scaleFactor);
277 std::string binContentsString;
302 if ((0 >= nBinsX) || (xHigh - xLow < std::numeric_limits<float>::epsilon()) || (0 >= nBinsY) || (yHigh - yLow < std::numeric_limits<float>::epsilon()))
305 m_xBinWidth = (xHigh - xLow) /
static_cast<float>(nBinsX);
306 m_yBinWidth = (yHigh - yLow) /
static_cast<float>(nBinsY);
327 std::cout <<
"Construct Histogram from xml: cannot find xml element with name " << xmlElementName << std::endl;
350 typedef std::vector<FloatVector> HistogramEntryList;
351 HistogramEntryList histogramEntryList;
354 if (histogramEntryList.size() !=
static_cast<unsigned int>(
m_nBinsY) + 2)
359 const FloatVector &orderedBinContents(histogramEntryList[binY + 1]);
361 if (orderedBinContents.size() !=
static_cast<unsigned int>(
m_nBinsX) + 2)
366 const float value(orderedBinContents[binX + 1]);
367 if (std::fabs(value) > std::numeric_limits<float>::epsilon())
379 m_xyHistogramMap(rhs.m_xyHistogramMap),
380 m_yxHistogramMap(rhs.m_yxHistogramMap),
381 m_nBinsX(rhs.m_nBinsX),
383 m_xHigh(rhs.m_xHigh),
384 m_xBinWidth(rhs.m_xBinWidth),
385 m_nBinsY(rhs.m_nBinsY),
387 m_yHigh(rhs.m_yHigh),
388 m_yBinWidth(rhs.m_yBinWidth)
401 HistogramMap::const_iterator iterXY = iterX->second.find(binY);
403 if (iterX->second.end() == iterXY)
406 return iterXY->second;
447 float sumEntries(0.f);
458 HistogramMap::const_iterator iterX = iterY->second.find(xBin);
460 if (iterY->second.end() == iterX)
463 sumEntries += iterX->second;
473 int &maximumBinX,
int &maximumBinY)
const
487 HistogramMap::const_iterator iterX = iterY->second.find(xBin);
489 if (iterY->second.end() == iterX)
492 const float binContents(iterX->second);
494 if (binContents > maximumValue)
496 maximumValue = binContents;
497 maximumBinX = iterX->first;
498 maximumBinY = iterY->first;
508 float sumEntries(0.f), sumXEntries(0.f);
520 HistogramMap::const_iterator iterX = iterY->second.find(xBin);
522 if (iterY->second.end() == iterX)
525 const float binXCenter(firstBinXCenter + (
m_xBinWidth *
static_cast<float>(iterX->first)));
526 const float binContents(iterX->second);
528 sumEntries += binContents;
529 sumXEntries += binContents * binXCenter;
533 if (std::fabs(sumEntries) < std::numeric_limits<float>::epsilon())
536 return (sumXEntries / sumEntries);
543 float sumEntries(0.f), sumXEntries(0.f), sumXXEntries(0.f);
555 HistogramMap::const_iterator iterX = iterY->second.find(xBin);
557 if (iterY->second.end() == iterX)
560 const float binXCenter(firstBinXCenter + (
m_xBinWidth *
static_cast<float>(iterX->first)));
561 const float binContents(iterX->second);
563 sumEntries += binContents;
564 sumXEntries += binContents * binXCenter;
565 sumXXEntries += binContents * binXCenter * binXCenter;
569 if (std::fabs(sumEntries) < std::numeric_limits<float>::epsilon())
572 const float meanX(sumXEntries / sumEntries);
573 const float meanXX(sumXXEntries / sumEntries);
575 return std::sqrt(meanXX - (meanX * meanX));
582 float sumEntries(0.f), sumYEntries(0.f);
594 HistogramMap::const_iterator iterY = iterX->second.find(yBin);
596 if (iterX->second.end() == iterY)
599 const float binYCenter(firstBinYCenter + (
m_yBinWidth *
static_cast<float>(iterY->first)));
600 const float binContents(iterY->second);
602 sumEntries += binContents;
603 sumYEntries += binContents * binYCenter;
607 if (std::fabs(sumEntries) < std::numeric_limits<float>::epsilon())
610 return (sumYEntries / sumEntries);
617 float sumEntries(0.f), sumYEntries(0.f), sumYYEntries(0.f);
629 HistogramMap::const_iterator iterY = iterX->second.find(yBin);
631 if (iterX->second.end() == iterY)
634 const float binYCenter(firstBinYCenter + (
m_yBinWidth *
static_cast<float>(iterY->first)));
635 const float binContents(iterY->second);
637 sumEntries += binContents;
638 sumYEntries += binContents * binYCenter;
639 sumYYEntries += binContents * binYCenter * binYCenter;
643 if (std::fabs(sumEntries) < std::numeric_limits<float>::epsilon())
646 const float meanY(sumYEntries / sumEntries);
647 const float meanYY(sumYYEntries / sumEntries);
649 return std::sqrt(meanYY - (meanY * meanY));
671 HistogramMap::iterator iter = yHistogramMap.find(binY);
673 if (yHistogramMap.end() != iter)
675 iter->second += weight;
679 if (!yHistogramMap.insert(HistogramMap::value_type(binY, weight)).second)
692 for (HistogramMap::value_type &mapEntryY : mapEntryX.second)
694 mapEntryY.second = (mapEntryY.second * scaleFactor);
700 for (HistogramMap::value_type &mapEntryX : mapEntryY.second)
702 mapEntryX.second = (mapEntryX.second * scaleFactor);
741 std::string binContentsString;
Header file for histogram classes.
Header file defining status codes and relevant preprocessor macros.
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
Header file for the xml helper class.
float GetCumulativeSum() const
Get the cumulative sum of bin entries in the histogram (ignores overflow and underflow bins)
float GetMeanX() const
Get the mean x value of entries in the histogram (ignores overflow and underflow bins)
void GetMaximum(float &maximumValue, int &maximumBinX) const
Get the maximum value in the histogram and the corresponding bin number (ignores overflow and underfl...
int GetBinNumber(const float valueX) const
Get the bin number for a specified value.
void Fill(const float valueX, const float weight=1.f)
Add an entry to the histogram.
Histogram(const unsigned int nBinsX, const float xLow, const float xHigh)
Constructor.
float m_xBinWidth
The x bin width.
int GetOverflowBinNumber() const
Get the overflow bin number of the histogram.
int GetMinBinNumber() const
Get the min bin number of the histogram (ignores overflow and underflow bins)
void SetBinContent(const int binX, const float value)
Set the contents of a specified bin.
float m_xHigh
The max binned x value.
float GetStandardDeviationX() const
Get the standard deviation of entries in the histogram (ignores overflow and underflow bins)
int GetMaxBinNumber() const
Get the max bin number of the histogram (ignores overflow and underflow bins)
void WriteToXml(TiXmlDocument *const pTiXmlDocument, const std::string &xmlElementName) const
Write the histogram to an xml document.
int m_nBinsX
The number of x bins.
float GetBinContent(const int binX) const
Get the content of a specified bin.
HistogramMap m_histogramMap
The histogram map.
int GetUnderflowBinNumber() const
Get the underflow bin number of the histogram.
float m_xLow
The min binned x value.
void Scale(const float scaleFactor)
Scale contents of all histogram bins by a specified factor.
StatusCodeException class.
TiXmlElement * Element() const
TiXmlHandle FirstChild() const
Return a handle to the first child node.
TiXmlNode * LinkEndChild(TiXmlNode *addThis)
int GetOverflowBinNumberY() const
Get the overflow y bin number of the histogram.
TwoDHistogramMap m_yxHistogramMap
The y->x->value 2d histogram map.
int GetOverflowBinNumberX() const
Get the overflow x bin number of the histogram.
int m_nBinsX
The number of x bins.
int m_nBinsY
The number of y bins.
float GetBinContent(const int binX, const int binY) const
Get the content of a specified bin.
std::map< int, float > HistogramMap
float m_xLow
The min binned x value.
TwoDHistogram(const unsigned int nBinsX, const float xLow, const float xHigh, const unsigned int nBinsY, const float yLow, const float yHigh)
Constructor.
int GetUnderflowBinNumberY() const
Get the underflow y bin number of the histogram.
float GetCumulativeSum() const
Get the cumulative sum of bin entries in the histogram (ignores overflow and underflow bins)
float GetMeanX() const
Get the mean x value of entries in the histogram (ignores overflow and underflow bins)
int GetBinNumberY(const float valueY) const
Get the y bin number for a specified value.
float m_yHigh
The max binned y value.
float m_yLow
The min binned y value.
float GetStandardDeviationY() const
Get the standard deviation of y entries in the histogram (ignores overflow and underflow bins)
void GetMaximum(float &maximumValue, int &maximumBinX, int &maximumBinY) const
Get the maximum value in the histogram and the corresponding bin numbers (ignores overflow and underf...
int GetMaxBinNumberY() const
Get the max y bin number of the histogram (ignores overflow and underflow bins)
int GetBinNumberX(const float valueX) const
Get the x bin number for a specified x value.
void SetBinContent(const int binX, const int binY, const float value)
Set the contents of a specified bin.
TwoDHistogramMap m_xyHistogramMap
The x->y->value 2d histogram map.
float GetStandardDeviationX() const
Get the standard deviation of x entries in the histogram (ignores overflow and underflow bins)
float m_xHigh
The max binned x value.
int GetUnderflowBinNumberX() const
Get the underflow x bin number of the histogram.
void WriteToXml(TiXmlDocument *const pTiXmlDocument, const std::string &xmlElementName) const
Write the histogram to an xml document.
float GetMeanY() const
Get the mean y value of entries in the histogram (ignores overflow and underflow bins)
int GetMinBinNumberY() const
Get the min y bin number of the histogram (ignores overflow and underflow bins)
float m_yBinWidth
The y bin width.
void Fill(const float valueX, const float valueY, const float weight=1.f)
Add an entry to the histogram.
void Scale(const float scaleFactor)
Scale contents of all histogram bins by a specified factor.
int GetMinBinNumberX() const
Get the min x bin number of the histogram (ignores overflow and underflow bins)
float m_xBinWidth
The x bin width.
int GetMaxBinNumberX() const
Get the max x bin number of the histogram (ignores overflow and underflow bins)
static StatusCode ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector< T > &vector)
Read a vector of values from a (space separated) list in an xml element.
static StatusCode Read2DVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, const std::string &rowName, std::vector< std::vector< T > > &vector)
Read a two-dimensional array of values into a vector of vectors. Each row of values must be contained...
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
std::vector< float > FloatVector
std::string TypeToString(const T &t)