ATLAS Offline Software
Loading...
Searching...
No Matches
BinUtility.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6// BinUtility.h, (c) ATLAS Detector software
8
9#ifndef TRKDETDESCRUTILS_GENERICBINUTILITY1D_H
10#define TRKDETDESCRUTILS_GENERICBINUTILITY1D_H
11
12// Gaudi
13#include "GaudiKernel/GaudiException.h"
14// Eigen
16// Trk
19
20#include <vector>
21
22class MsgStream;
23
24namespace Trk {
25
37
38class BinUtility final
39{
40
41public:
44 {
45 m_binningData.reserve(3);
46 }
47
48 BinUtility(const BinUtility& sbu) = default;
49 BinUtility(BinUtility&& sbu) = default;
50 BinUtility& operator=(const BinUtility& sbu) = default;
51 BinUtility& operator=(BinUtility&& sbu) = default;
52 ~BinUtility() = default;
53
55 BinUtility(size_t bins, float min, float max, BinningOption opt = open, BinningValue value = binR, float sStep = 0.)
57 {
58 m_binningData.reserve(3);
59 std::vector<float> bValues;
60 float step = (max - min) / bins;
61 for (size_t ib = 0; ib <= bins; ++ib)
62 bValues.push_back(min + ib * step);
63 m_binningData.emplace_back(Trk::equidistant, opt, value, bins, min, max, step, sStep, bValues);
64 }
65
67 BinUtility(size_t subbins, float substep, float min, float max, BinningOption opt = open, BinningValue value = binR)
69 {
70 m_binningData.reserve(3);
71 std::vector<float> bValues;
72 float step = (max - min) / (subbins + 1);
73 bValues.push_back(min);
74 for (size_t isb = 1; isb <= subbins; ++isb) {
75 bValues.push_back(min + isb * step - substep);
76 bValues.push_back(min + isb * step);
77 }
78 bValues.push_back(max);
79 m_binningData.emplace_back(Trk::biequidistant, opt, value, 2 * subbins + 1, min, max, step, substep, bValues);
80 }
81
83 BinUtility(std::vector<float>& bValues, BinningOption opt = closed, BinningValue value = binPhi)
85 {
86 m_binningData.reserve(3);
87 size_t nBins = opt == 0 ? bValues.size() - 1 : bValues.size();
88
89 m_binningData.emplace_back(Trk::arbitrary,
90 opt,
91 value,
92 nBins,
93 bValues[0],
94 bValues.back(),
95 (bValues.back() - bValues[0]) / (nBins),
96 0.,
97 bValues);
98 }
99
101 BinUtility(float phiRef, std::vector<std::pair<int, float>>& bValues)
102 : m_binningData()
103 {
104 m_binningData.reserve(3);
105 m_binningData.emplace_back(Trk::open, phiRef, bValues);
106 }
107
110 {
111 const std::vector<BinningData>& bData = gbu.binningData();
112 if (m_binningData.size() + bData.size() > 3){
113 throw GaudiException("BinUtility does not support dim > 3", "FATAL", StatusCode::FAILURE);
114 }
115 m_binningData.insert(m_binningData.end(), bData.begin(), bData.end());
116 return (*this);
117 }
118
120 BinUtility* clone() const { return new BinUtility(*this); }
121
123 const std::vector<BinningData>& binningData() const { return m_binningData; }
124
126 size_t bin(const Amg::Vector3D& position, size_t ba = 0) const
127 {
128 if (ba >= m_binningData.size()){
129 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
130 }
131 size_t bEval = m_binningData[ba].searchGlobal(position);
132 return (bEval > bins(ba) - 1 ? bins(ba) - 1 : bEval); // ST additional protection : DEBUG source
133 }
134
136 size_t entry(const Amg::Vector3D& position, size_t ba = 0) const
137 {
138 if (ba >= m_binningData.size()){
139 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
140 }
141 return m_binningData[ba].entry(position);
142 }
143
145 size_t next(const Amg::Vector3D& position, const Amg::Vector3D& direction, size_t ba = 0) const
146 {
147 if (ba >= m_binningData.size()){
148 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
149 }
150 return m_binningData[ba].next(position, direction);
151 }
152
154 std::pair<size_t, float> distanceToNext(const Amg::Vector3D& position,
155 const Amg::Vector3D& direction,
156 size_t ba = 0) const
157 {
158 if (ba >= m_binningData.size()){
159 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
160 }
161 return m_binningData[ba].distanceToNext(position, direction);
162 }
163
165 LayerOrder orderDirection(const Amg::Vector3D& position, const Amg::Vector3D& direction, size_t ba = 0) const
166 {
167 if (ba >= m_binningData.size()){
168 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
169 }
170 return m_binningData[ba].orderDirection(position, direction);
171 }
172
177 size_t bin(const Amg::Vector2D& lposition, size_t ba = 0) const
178 {
179 if (ba >= m_binningData.size()){
180 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
181 }
182 return m_binningData[ba].searchLocal(lposition);
183 }
184
186 bool inside(const Amg::Vector3D& position) const
187 {
188 std::vector<BinningData>::const_iterator bdIter = m_binningData.begin();
189 for (; bdIter != m_binningData.end(); ++bdIter) {
190 if (!(*bdIter).inside(position))
191 return false;
192 }
193 return true;
194 }
195
197 bool inside(const Amg::Vector2D& lposition) const
198 {
199 return true;
200 std::vector<BinningData>::const_iterator bdIter = m_binningData.begin();
201 for (; bdIter != m_binningData.end(); ++bdIter)
202 if (!(*bdIter).inside(lposition)){
203 return false;
204 }
205 return true;
206 }
207
209 size_t dimensions() const { return m_binningData.size(); }
210
212 size_t max(size_t ba = 0) const
213 {
214 if (ba >= m_binningData.size()){
215 return 0;
216 }
217 return (m_binningData[ba].bins - 1);
218 }
219
221 size_t bins(size_t ba = 0) const
222 {
223 if (ba >= m_binningData.size()){
224 return 0;
225 }
226 return (m_binningData[ba].bins);
227 }
228
230 BinningValue binningValue(size_t ba = 0) const
231 {
232 if (ba >= m_binningData.size()){
233 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
234 }
235 return (m_binningData[ba].binvalue);
236 }
237
239 float binPosition(size_t bin, float pos, size_t ba = 0) const
240 {
241 if (ba >= m_binningData.size()){
242 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
243 }
244 return (m_binningData[ba].binPosition(bin, pos));
245 }
246
248 void clear() { m_binningData.clear(); }
249
251 MsgStream& dump(MsgStream& sl) const
252 {
253 sl << "BinUtility for " << m_binningData.size() << "-dimensional array:" << endmsg;
254 std::vector<BinningData>::const_iterator bdIter = m_binningData.begin();
255 for (size_t ibd = 0; bdIter != m_binningData.end(); ++bdIter, ++ibd) {
256 sl << "dimension : " << ibd << endmsg << endmsg;
257 sl << " - type : " << size_t((*bdIter).type) << endmsg;
258 sl << " - option : " << size_t((*bdIter).option) << endmsg;
259 sl << " - value : " << size_t((*bdIter).binvalue) << endmsg;
260 sl << " - bins : " << (*bdIter).bins << endmsg;
261 sl << " - min/max : " << (*bdIter).min << " / " << (*bdIter).max << endmsg;
262 sl << " - step/sub : " << (*bdIter).step << " / " << (*bdIter).subStep << endmsg;
263 sl << " - boundaries : | ";
264 std::vector<float>::const_iterator bIter = (*bdIter).boundaries.begin();
265 for (; bIter != (*bdIter).boundaries.end(); ++bIter)
266 sl << (*bIter) << " | ";
267 sl << endmsg;
268 }
269 return sl;
270 }
271
273 std::ostream& dump(std::ostream& sl) const
274 {
275 sl << "BinUtility for " << m_binningData.size() << "-dimensional array:" << std::endl;
276 std::vector<BinningData>::const_iterator bdIter = m_binningData.begin();
277 for (size_t ibd = 0; bdIter != m_binningData.end(); ++bdIter, ++ibd) {
278 sl << "dimension : " << ibd << std::endl;
279 sl << " - type : " << size_t((*bdIter).type) << std::endl;
280 sl << " - option : " << size_t((*bdIter).option) << std::endl;
281 sl << " - value : " << size_t((*bdIter).binvalue) << std::endl;
282 sl << " - bins : " << (*bdIter).bins << std::endl;
283 sl << " - min/max : " << (*bdIter).min << " / " << (*bdIter).max << std::endl;
284 sl << " - step/sub : " << (*bdIter).step << " / " << (*bdIter).subStep << std::endl;
285 sl << " - boundaries : | ";
286 std::vector<float>::const_iterator bIter = (*bdIter).boundaries.begin();
287 for (; bIter != (*bdIter).boundaries.end(); ++bIter)
288 sl << (*bIter) << " | ";
289 sl << std::endl;
290 }
291 return sl;
292 }
293
294private:
295 std::vector<BinningData> m_binningData;
296};
297
299MsgStream&
300operator<<(MsgStream& sl, const BinUtility& bgen);
301std::ostream&
302operator<<(std::ostream& sl, const BinUtility& bgen);
303
304} // end of namespace Trk
305
306#endif // TRKDETDESCRUTILS_GENERICBINUTILITY1D_H
#define endmsg
static const std::vector< std::string > bins
#define min(a, b)
Definition cfImp.cxx:40
A generic symmetric BinUtility, for fully symmetric binning in terms of binning grid and binning type...
Definition BinUtility.h:39
void clear()
Clear the data.
Definition BinUtility.h:248
BinUtility(const BinUtility &sbu)=default
bool inside(const Amg::Vector2D &lposition) const
Check if bin is inside from Vector3D.
Definition BinUtility.h:197
size_t bins(size_t ba=0) const
Number of bins.
Definition BinUtility.h:221
BinUtility(size_t subbins, float substep, float min, float max, BinningOption opt=open, BinningValue value=binR)
Constructor for bi-equidistant.
Definition BinUtility.h:67
~BinUtility()=default
LayerOrder orderDirection(const Amg::Vector3D &position, const Amg::Vector3D &direction, size_t ba=0) const
Return the oder direciton for fast interlinking.
Definition BinUtility.h:165
std::pair< size_t, float > distanceToNext(const Amg::Vector3D &position, const Amg::Vector3D &direction, size_t ba=0) const
Distance estimate to next bin.
Definition BinUtility.h:154
BinUtility()
Constructor for equidistant.
Definition BinUtility.h:43
BinUtility(BinUtility &&sbu)=default
BinningValue binningValue(size_t ba=0) const
The type/value of the binning.
Definition BinUtility.h:230
BinUtility & operator=(const BinUtility &sbu)=default
BinUtility(std::vector< float > &bValues, BinningOption opt=closed, BinningValue value=binPhi)
Constructor for arbitrary.
Definition BinUtility.h:83
bool inside(const Amg::Vector3D &position) const
Check if bin is inside from Vector3D.
Definition BinUtility.h:186
size_t next(const Amg::Vector3D &position, const Amg::Vector3D &direction, size_t ba=0) const
Bin from a 3D vector (already in binning frame)
Definition BinUtility.h:145
BinUtility & operator+=(const BinUtility &gbu)
Operator++ to make multidimensional BinUtility.
Definition BinUtility.h:109
size_t bin(const Amg::Vector3D &position, size_t ba=0) const
Bin from a 3D vector (already in binning frame)
Definition BinUtility.h:126
const std::vector< BinningData > & binningData() const
return the binning data
Definition BinUtility.h:123
size_t entry(const Amg::Vector3D &position, size_t ba=0) const
Bin from a 3D vector (already in binning frame)
Definition BinUtility.h:136
MsgStream & dump(MsgStream &sl) const
Output Method for MsgStream, to be overloaded by child classes.
Definition BinUtility.h:251
float binPosition(size_t bin, float pos, size_t ba=0) const
bin->BinningValue navigation : pos=+-1.
Definition BinUtility.h:239
std::ostream & dump(std::ostream &sl) const
Output Method for std::ostream, to be overloaded by child classes.
Definition BinUtility.h:273
size_t max(size_t ba=0) const
First bin maximal value.
Definition BinUtility.h:212
size_t dimensions() const
First bin maximal value.
Definition BinUtility.h:209
BinUtility(size_t bins, float min, float max, BinningOption opt=open, BinningValue value=binR, float sStep=0.)
Constructor for equidistant - the substep is for phi binning offsets.
Definition BinUtility.h:55
size_t bin(const Amg::Vector2D &lposition, size_t ba=0) const
Bin from a 2D vector (following local parameters defintitions)
Definition BinUtility.h:177
BinUtility(float phiRef, std::vector< std::pair< int, float > > &bValues)
Constructor for binH.
Definition BinUtility.h:101
std::vector< BinningData > m_binningData
Definition BinUtility.h:295
BinUtility * clone() const
Implizit Constructor.
Definition BinUtility.h:120
BinUtility & operator=(BinUtility &&sbu)=default
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
Ensure that the ATLAS eigen extensions are properly loaded.
LayerOrder
This enum is used to declare Layers as previous/next in respect of a 1-dimensional binned array.
Definition BinningData.h:31
MsgStream & operator<<(MsgStream &sl, const AlignModule &alignModule)
overload of << operator for MsgStream for debug output
BinningOption
enum BinValue
Definition BinningType.h:39
@ open
Definition BinningType.h:40
@ closed
Definition BinningType.h:41
@ biequidistant
Definition BinningType.h:33
@ equidistant
Definition BinningType.h:32
@ arbitrary
Definition BinningType.h:34
BinningValue
how to take the global / local position
Definition BinningType.h:46
@ binR
Definition BinningType.h:50
@ binPhi
Definition BinningType.h:51