ATLAS Offline Software
Loading...
Searching...
No Matches
MuonHoughHisto2D.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef MUONHOUGHPATTERNEVENT_MUONHOUGHHISTO2D_H
6#define MUONHOUGHPATTERNEVENT_MUONHOUGHHISTO2D_H
7
9#include <memory.h>
10
11#include <algorithm>
12#include <cmath>
13#include <functional>
14#include <iostream>
15#include <set>
16#include <vector>
17class TH2F;
18
23public:
25 ~MuonHoughHisto2D() = default;
27 MuonHoughHisto2D(int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, int number_of_maxima = 1);
28
30 int fill(double x, double y, double weight = 1.);
31
33 void fill(int binnumber, double weight = 1.);
34
36 int getNbinsX() const;
38 int getNbinsY() const;
39
41 double getXmin() const;
43 double getXmax() const;
44
46 double getBinWidthX() const;
47
49 double getBinWidthY() const;
50
52 double getBinContent(int binnumber) const;
53
55 void reset();
56
58 void findMaxima();
59
61 std::pair<int, double> getMax() const;
63 std::pair<int, double> getMaximumBin(unsigned int maximum_number = 0);
65 std::pair<double, double> getCoordsMaximum(unsigned int maximum_number = 0);
66
68 bool checkIfMaximumAlreadyUsed(int binnumber) const;
70 bool checkIfMaximum(int binnumber, double& maximum, int& maxbin) const;
71
73 int distanceBins(int binnumber1, int binnumber2) const;
74
76 double getMaximum(unsigned int maximum_number = 0);
78 int getMaxBin(unsigned int maximum_number = 0);
79
81 double content_Bin_Area(int binnumber) const;
82
83 // histogram functions:
84
86 std::pair<double, double> binnumberToCoords(int binnumber, int printlevel = 0) const; // <x-point, y-point>
88 double binnumberToXCoord(int binnumber) const;
90 double binnumberToYCoord(int binnumber) const;
91
93 int coordToBinnumber(double x, double y) const;
95 int coordToBinx(double x) const;
97 int coordToBiny(double y) const;
98
105 int binInHistogram(unsigned int bin) const;
106
108 void setThreshold(double threshold);
110 double getThreshold() const;
111
113 std::unique_ptr<TH2F> bookAndFillRootHistogram(const std::string& hname) const;
114
115 void setMaximumIsValid(bool flag) { m_maximumIsValid = flag; }
116
117private:
119 void init();
120
122 void resetHisto();
123
125 std::unique_ptr<unsigned int []> m_histBuffer{};
127 unsigned int m_size{0};
128
130 unsigned int m_nbinsx{0};
132 unsigned int m_nbinsx_plus2{0};
134 double m_xmin{0};
136 double m_xmax{0};
138 unsigned int m_nbinsy{0};
140 unsigned int m_nbinsy_plus2{0};
142 double m_ymin{0.};
144 double m_ymax{0.};
145
147 double m_binwidthx{0.};
149 double m_binwidthy{0.};
150
152 double m_invbinwidthx{0.};
154 double m_invbinwidthy{0.};
155
158 std::set<int> m_bins_above_threshold{};
159
161 std::vector<int> m_maximumbins{};
162
163
165 const int m_number_of_maxima{0};
166
168 unsigned int m_scale{0}; // conversion from double -> unsigned int
169 unsigned int m_threshold{0};
170
173
175 bool m_maxima_found{false};
176
179 unsigned int m_maximum{0};
180 bool m_maximumIsValid{true}; // flag whether the maximum can be trusted
182 void setBinContent(int binnumber, double value);
184 void setBinContent(int binx, int biny, double value);
185
188};
189
190inline int MuonHoughHisto2D::fill(double x, double y, double w) {
191 int binnumber = coordToBinnumber(x, y);
192 fill(binnumber, w);
193 return binnumber;
194}
195
196inline void MuonHoughHisto2D::fill(int binnumber, double weight) {
197 unsigned int& binval = m_histBuffer[binnumber];
198 binval += m_scale * weight;
199 if (binval > m_maximum) {
200 m_maximum = binval;
201 m_maximumBin = binnumber;
202 }
203}
204inline void MuonHoughHisto2D::setBinContent(int binnumber, double value) { m_histBuffer[binnumber] = m_scale * value; }
205inline double MuonHoughHisto2D::getBinContent(int binnumber) const { return m_histBuffer[binnumber] / m_scale; }
206inline double MuonHoughHisto2D::content_Bin_Area(int binnumber) const { return getBinContent(binnumber); }
207inline int MuonHoughHisto2D::getNbinsX() const { return m_nbinsx; }
208inline int MuonHoughHisto2D::getNbinsY() const { return m_nbinsy; }
209inline double MuonHoughHisto2D::getXmin() const { return m_xmin; }
210inline double MuonHoughHisto2D::getXmax() const { return m_xmax; }
211inline double MuonHoughHisto2D::getBinWidthX() const { return m_binwidthx; }
212inline double MuonHoughHisto2D::getBinWidthY() const { return m_binwidthy; }
214inline double MuonHoughHisto2D::getThreshold() const { return m_threshold; }
215inline double MuonHoughHisto2D::getMaximum(unsigned int maximum_number) {
216 return getMaximumBin(maximum_number).second;
217}
218inline int MuonHoughHisto2D::getMaxBin(unsigned int maximum_number) {
219 return getMaximumBin(maximum_number).first;
220}
221inline int MuonHoughHisto2D::coordToBinx(double x) const { return static_cast<int>((x - m_xmin) * m_invbinwidthx) + 1; }
222inline int MuonHoughHisto2D::coordToBiny(double y) const { return static_cast<int>((y - m_ymin) * m_invbinwidthy) + 1; }
223inline int MuonHoughHisto2D::coordToBinnumber(double x, double y) const {
224 int biny = coordToBiny(y);
225 int binx = coordToBinx(x);
226 return binx + biny * m_nbinsx_plus2;
227}
228inline double MuonHoughHisto2D::binnumberToXCoord(int binnumber) const {
229 return m_xmin + m_binwidthx * (-0.5 + (binnumber) % m_nbinsx_plus2);
230}
231inline double MuonHoughHisto2D::binnumberToYCoord(int binnumber) const {
232 return m_ymin + m_binwidthy * (-0.5 + (binnumber) / m_nbinsx_plus2);
233}
234inline void MuonHoughHisto2D::resetHisto() { memset(m_histBuffer.get(), 0, sizeof(unsigned int) * m_size); }
235
236#endif // MUONHOUGHPATTERNEVENT_MUONHOUGHHISTO2D_H
#define y
#define x
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
bool checkIfMaximumAlreadyUsed(int binnumber) const
check when searching for several maxima if binnumber is close to an earlier found maximum
std::pair< int, double > getMaximumBin(unsigned int maximum_number=0)
returns binnumber and maximum of maximum number maximum_number
void init()
initialises private members, called in constructor
unsigned int m_size
size of array
unsigned int m_nbinsx
number of x bins
double m_invbinwidthx
inv binwidth x axis used for cpu speedup
std::vector< int > m_maximumbins
binnumbers found as maxima
~MuonHoughHisto2D()=default
destructor
void setThreshold(double threshold)
set threshold for maxima in histogram
double m_ymax
maximum y coordinate
int getMaxBin(unsigned int maximum_number=0)
return maximum binnumber
double m_binwidthx
binwidth x axis
unsigned int m_nbinsx_plus2
number of x bins + 2 , used for cpu speedup
unsigned int m_nbinsy_plus2
number of y bins + 2 , used for cpu speedup
const int m_number_of_maxima
number of maxima to be searched for
std::pair< double, double > getCoordsMaximum(unsigned int maximum_number=0)
returns coords of maximum number maximum_number
double getThreshold() const
returns threshold for maxima in histogram
unsigned int m_maximum
bool checkIfMaximum(int binnumber, double &maximum, int &maxbin) const
check if binnumber is a maximum
int getNbinsY() const
returns number of bins y coordinate
unsigned int m_nbinsy
number of y bins
MuonHoughHisto2D & operator=(const MuonHoughHisto2D &right)
double m_xmax
maximum x coordinate
void resetHisto()
resets histogram
int getNbinsX() const
returns number of bins x coordinate
std::unique_ptr< TH2F > bookAndFillRootHistogram(const std::string &hname) const
intialises a root histogram of MuonHoughHisto2D and fill it, used for debugging purposes
MuonHoughHisto2D(const MuonHoughHisto2D &)
double getBinWidthY() const
return binwidth y axis
unsigned int m_scale
threshold for minimum content for a maximum
bool m_maxima_found
check if search for maxima already performed
double getXmax() const
returns max x axis
double m_xmin
minimum x coordinate
const int m_distance_to_next_maximum
minimum distance for a maximum to be away from another maximum
void reset()
clears histogram and bins_above_threshold
double getBinWidthX() const
return binwidth x axis
double getXmin() const
returns min x axis
void findMaxima()
find maxima in histogram
std::set< int > m_bins_above_threshold
set of bins that are above threshold used for speeding up searching for maxima
MuonHoughHisto2D(int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, int number_of_maxima=1)
constructor
int coordToBinx(double x) const
converts x-coordinates to binx
int distanceBins(int binnumber1, int binnumber2) const
calculates the distance in binwidths between two binnumbers ("Manhattan metric")
int coordToBiny(double y) const
converts y-coordinates to biny
double getMaximum(unsigned int maximum_number=0)
return value of maximum bin
double m_invbinwidthy
inv binwidth y axis used for cpu speedup
void setBinContent(int binx, int biny, double value)
set bin content of binnumber corresponding to coordinates
std::pair< int, double > getMax() const
returns binnumber and maximum of histogram (doesn't use m_bins_above_threshold)
int coordToBinnumber(double x, double y) const
converts coordinates to a binnumber
int binInHistogram(unsigned int bin) const
checks if bin is in histogram or if it is an under/overflow bin (unused) 0 is in histo 1 x underflow ...
unsigned int m_threshold
double m_ymin
minimum y coordinate
double getBinContent(int binnumber) const
returns x axis
std::unique_ptr< unsigned int[]> m_histBuffer
actual storage of bin values
double binnumberToXCoord(int binnumber) const
gives x-coordinate for certain binnumber
double binnumberToYCoord(int binnumber) const
gives y-coordinate for certain binnumber
double content_Bin_Area(int binnumber) const
return the total content of binarea (default: content of bin)
std::pair< double, double > binnumberToCoords(int binnumber, int printlevel=0) const
gives coordinates for certain binnumber
int fill(double x, double y, double weight=1.)
fill 2d histogram with point (x,y) with weight w, return binnumber filled
void setBinContent(int binnumber, double value)
set bin content of binnumber
void setMaximumIsValid(bool flag)
double m_binwidthy
binwidth y axis
double xmax
Definition listroot.cxx:61
double ymin
Definition listroot.cxx:63
double xmin
Definition listroot.cxx:60
double ymax
Definition listroot.cxx:64