ATLAS Offline Software
Loading...
Searching...
No Matches
BinUtility.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 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 const std::size_t b = bins(ba); //can be zero, and is unsigned
133 if (b == 0){ //avoid integer overflow with b - 1
134 throw GaudiException("BinUtility", "integer overflow", StatusCode::FAILURE);
135 }
136 return (bEval > b - 1 ? b - 1 : bEval); // ST additional protection : DEBUG source
137 }
138
140 size_t entry(const Amg::Vector3D& position, size_t ba = 0) const
141 {
142 if (ba >= m_binningData.size()){
143 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
144 }
145 return m_binningData[ba].entry(position);
146 }
147
149 size_t next(const Amg::Vector3D& position, const Amg::Vector3D& direction, size_t ba = 0) const
150 {
151 if (ba >= m_binningData.size()){
152 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
153 }
154 return m_binningData[ba].next(position, direction);
155 }
156
158 std::pair<size_t, float> distanceToNext(const Amg::Vector3D& position,
160 size_t ba = 0) const
161 {
162 if (ba >= m_binningData.size()){
163 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
164 }
165 return m_binningData[ba].distanceToNext(position, direction);
166 }
167
170 {
171 if (ba >= m_binningData.size()){
172 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
173 }
174 return m_binningData[ba].orderDirection(position, direction);
175 }
176
181 size_t bin(const Amg::Vector2D& lposition, size_t ba = 0) const
182 {
183 if (ba >= m_binningData.size()){
184 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
185 }
186 return m_binningData[ba].searchLocal(lposition);
187 }
188
190 bool inside(const Amg::Vector3D& position) const
191 {
192 std::vector<BinningData>::const_iterator bdIter = m_binningData.begin();
193 for (; bdIter != m_binningData.end(); ++bdIter) {
194 if (!(*bdIter).inside(position))
195 return false;
196 }
197 return true;
198 }
199
201 bool inside(const Amg::Vector2D& /*lposition*/) const
202 {
203 return true;
204 }
205
207 size_t dimensions() const { return m_binningData.size(); }
208
210 size_t max(size_t ba = 0) const
211 {
212 if (ba >= m_binningData.size()){
213 return 0;
214 }
215 return (m_binningData[ba].bins - 1);
216 }
217
219 size_t bins(size_t ba = 0) const
220 {
221 if (ba >= m_binningData.size()){
222 return 0;
223 }
224 return (m_binningData[ba].bins);
225 }
226
228 BinningValue binningValue(size_t ba = 0) const
229 {
230 if (ba >= m_binningData.size()){
231 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
232 }
233 return (m_binningData[ba].binvalue);
234 }
235
237 float binPosition(size_t bin, float pos, size_t ba = 0) const
238 {
239 if (ba >= m_binningData.size()){
240 throw GaudiException("BinUtility", "dimension out of bounds", StatusCode::FAILURE);
241 }
242 return (m_binningData[ba].binPosition(bin, pos));
243 }
244
246 void clear() { m_binningData.clear(); }
247
249 MsgStream& dump(MsgStream& sl) const
250 {
251 sl << "BinUtility for " << m_binningData.size() << "-dimensional array:" << endmsg;
252 std::vector<BinningData>::const_iterator bdIter = m_binningData.begin();
253 for (size_t ibd = 0; bdIter != m_binningData.end(); ++bdIter, ++ibd) {
254 sl << "dimension : " << ibd << endmsg << endmsg;
255 sl << " - type : " << size_t((*bdIter).type) << endmsg;
256 sl << " - option : " << size_t((*bdIter).option) << endmsg;
257 sl << " - value : " << size_t((*bdIter).binvalue) << endmsg;
258 sl << " - bins : " << (*bdIter).bins << endmsg;
259 sl << " - min/max : " << (*bdIter).min << " / " << (*bdIter).max << endmsg;
260 sl << " - step/sub : " << (*bdIter).step << " / " << (*bdIter).subStep << endmsg;
261 sl << " - boundaries : | ";
262 std::vector<float>::const_iterator bIter = (*bdIter).boundaries.begin();
263 for (; bIter != (*bdIter).boundaries.end(); ++bIter)
264 sl << (*bIter) << " | ";
265 sl << endmsg;
266 }
267 return sl;
268 }
269
271 std::ostream& dump(std::ostream& sl) const
272 {
273 sl << "BinUtility for " << m_binningData.size() << "-dimensional array:" << std::endl;
274 std::vector<BinningData>::const_iterator bdIter = m_binningData.begin();
275 for (size_t ibd = 0; bdIter != m_binningData.end(); ++bdIter, ++ibd) {
276 sl << "dimension : " << ibd << std::endl;
277 sl << " - type : " << size_t((*bdIter).type) << std::endl;
278 sl << " - option : " << size_t((*bdIter).option) << std::endl;
279 sl << " - value : " << size_t((*bdIter).binvalue) << std::endl;
280 sl << " - bins : " << (*bdIter).bins << std::endl;
281 sl << " - min/max : " << (*bdIter).min << " / " << (*bdIter).max << std::endl;
282 sl << " - step/sub : " << (*bdIter).step << " / " << (*bdIter).subStep << std::endl;
283 sl << " - boundaries : | ";
284 std::vector<float>::const_iterator bIter = (*bdIter).boundaries.begin();
285 for (; bIter != (*bdIter).boundaries.end(); ++bIter)
286 sl << (*bIter) << " | ";
287 sl << std::endl;
288 }
289 return sl;
290 }
291
292private:
293 std::vector<BinningData> m_binningData;
294};
295
297MsgStream&
298operator<<(MsgStream& sl, const BinUtility& bgen);
299std::ostream&
300operator<<(std::ostream& sl, const BinUtility& bgen);
301
302} // end of namespace Trk
303
304#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:246
BinUtility(const BinUtility &sbu)=default
size_t bins(size_t ba=0) const
Number of bins.
Definition BinUtility.h:219
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:169
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:158
bool inside(const Amg::Vector2D &) const
Check if bin is inside from Vector3D.
Definition BinUtility.h:201
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:228
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:190
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:149
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:140
MsgStream & dump(MsgStream &sl) const
Output Method for MsgStream, to be overloaded by child classes.
Definition BinUtility.h:249
float binPosition(size_t bin, float pos, size_t ba=0) const
bin->BinningValue navigation : pos=+-1.
Definition BinUtility.h:237
std::ostream & dump(std::ostream &sl) const
Output Method for std::ostream, to be overloaded by child classes.
Definition BinUtility.h:271
size_t max(size_t ba=0) const
First bin maximal value.
Definition BinUtility.h:210
size_t dimensions() const
First bin maximal value.
Definition BinUtility.h:207
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:181
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:293
BinUtility * clone() const
Implicit 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:33
MsgStream & operator<<(MsgStream &sl, const AlignModule &alignModule)
overload of << operator for MsgStream for debug output
const Amg::Vector3D & direction() const
Method to retrieve the direction at the Intersection.
BinningOption
enum BinValue
Definition BinningType.h:39
@ open
Definition BinningType.h:40
@ closed
Definition BinningType.h:41
const Amg::Vector3D & position() const
Method to retrieve the position of the Intersection.
@ 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