Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-06 09:24:28

0001 // -*- C++ -*-
0002 //
0003 // Histogram.hpp is a part of myStatistics
0004 // Copyright (C) 2012-2019 Simon Platzer, The Herwig Collaboration
0005 //
0006 // myStatistics is licenced under version 3 of the GPL, see COPYING for details.
0007 //
0008 #ifndef MYSTATISTICS_Histogram_hpp_included
0009 #define MYSTATISTICS_Histogram_hpp_included
0010 
0011 #include <map>
0012 #include <vector>
0013 #include <string>
0014 #include <iostream>
0015 
0016 #include "EventContribution.h"
0017 #include "Bin.h"
0018 
0019 namespace Statistics {
0020 
0021   /**
0022    * \brief A (one dimensional) histogram
0023    * \author Simon Platzer
0024    */
0025   class Histogram {
0026 
0027   public:
0028 
0029     /**
0030      * Default constructor
0031      */
0032     Histogram();
0033 
0034     /**
0035      * Destructor
0036      */
0037     virtual ~Histogram();
0038 
0039     /**
0040      * Constructor giving a name and bin boundaries; bin boundaries
0041      * are subsequent boundaries.
0042      */
0043     Histogram(const std::string& newName,
0044           const std::vector<double>& newBoundaries,
0045           bool newNoUnderflow = false,
0046           bool newNoOverflow = false);
0047 
0048     /**
0049      * Constructor giving a name, bin boundaries and periodicity
0050      * interval; bin boundaries are subsequent boundaries.
0051      */
0052     Histogram(const std::string& newName,
0053           const std::vector<double>& newBoundaries,
0054           const std::pair<double,double>& newPeriodicity);
0055 
0056     /**
0057      * Create equally spaced bin edges
0058      */
0059     static std::vector<double> regularBinEdges(double lower, double upper, size_t nBins);
0060 
0061     /**
0062      * Create logarithmicaly spaced bin edges
0063      */
0064     static std::vector<double> logBinEdges(double lower, double upper, size_t nBins);
0065 
0066   public:
0067 
0068     /**
0069      * Initialize this histogram.
0070      */
0071     void initialize();
0072 
0073     /**
0074      * Reset this histogram.
0075      */
0076     void reset();
0077 
0078     /**
0079      * Finalize this histogram.
0080      */
0081     void finalize();
0082 
0083   public:
0084 
0085     /**
0086      * Book a contribution to the current event.
0087      */
0088     bool count(EventContribution event, size_t id);
0089 
0090   public:
0091 
0092     /**
0093      * Return true, if this histogram is compatible with another one.
0094      */
0095     bool isCompatible(const Histogram& other) const;
0096 
0097     /**
0098      * Add a histogram to this histogram
0099      */
0100     Histogram& operator+=(const Histogram& other);
0101 
0102     /**
0103      * Subtract a histogram from this histogram
0104      */
0105     Histogram& operator-=(const Histogram& other);
0106 
0107   public:
0108 
0109     /**
0110      * Return the id of the histogram
0111      */
0112     const std::string& name() const { return theName; }
0113 
0114     /**
0115      * Return the underflow bin
0116      */
0117     const Bin& underflow() const { return theUnderflow; }
0118 
0119     /**
0120      * Return the bins
0121      */
0122     const std::vector<Bin>& bins() const { return theBins; }
0123 
0124     /**
0125      * Return the overflow bin
0126      */
0127     const Bin& overflow() const { return theOverflow; }
0128 
0129     /**
0130      * True, if there is no underflow
0131      */
0132     bool noUnderflow() const { return theNoUnderflow; }
0133 
0134     /**
0135      * True, if there is no overflow
0136      */
0137     bool noOverflow() const { return theNoOverflow; }
0138 
0139 
0140     /**
0141      * Return true, if the quantity considered is periodic
0142      */
0143     bool isPeriodic() const { return theIsPeriodic; }
0144 
0145     /**
0146      * Return the periodicity interval, if appropriate
0147      */
0148     const std::pair<double,double>& periodicity() const { return thePeriodicity; }
0149 
0150   public:
0151 
0152     /**
0153      * Fill histogram data from an XML element
0154      */
0155     void fromXML(const XML::Element&);
0156 
0157     /**
0158      * Return an XML element for the data of this histogram
0159      */
0160     XML::Element toXML() const;
0161 
0162   private:
0163 
0164     /**
0165      * The id of the histogram
0166      */
0167     std::string theName;
0168 
0169     /**
0170      * The underflow bin
0171      */
0172     Bin theUnderflow;
0173 
0174     /**
0175      * The bins
0176      */
0177     std::vector<Bin> theBins;
0178 
0179     /**
0180      * The overflow bin
0181      */
0182     Bin theOverflow;
0183 
0184     /**
0185      * True, if there is no underflow
0186      */
0187     bool theNoUnderflow;
0188 
0189     /**
0190      * True, if there is no overflow
0191      */
0192     bool theNoOverflow;
0193 
0194     /**
0195      * True, if the quantity considered is periodic
0196      */
0197     bool theIsPeriodic;
0198 
0199     /**
0200      * The periodicity of the quantity considered
0201      */
0202     std::pair<double,double> thePeriodicity;
0203 
0204     /**
0205      * Fill the bin map
0206      */
0207     void fillBinMap();
0208 
0209     /**
0210      * Return a bin by index
0211      */
0212     Bin& binByIndex(int);
0213 
0214     /**
0215      * Map bin upper boundaries to bins
0216      */
0217     std::map<double,int> binMap;
0218 
0219   };
0220 
0221 }
0222 
0223 #endif // MYSTATISTICS_Histogram_hpp_included