ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 
22 class MsgStream;
23 
24 namespace Trk {
25 
39 {
40 
41 public:
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.)
56  : m_binningData()
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)
68  : m_binningData()
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)
84  : m_binningData()
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 
294 private:
295  std::vector<BinningData> m_binningData;
296 };
297 
299 MsgStream&
300 operator<<(MsgStream& sl, const BinUtility& bgen);
301 std::ostream&
302 operator<<(std::ostream& sl, const BinUtility& bgen);
303 
304 } // end of namespace Trk
305 
306 #endif // TRKDETDESCRUTILS_GENERICBINUTILITY1D_H
Trk::BinUtility::BinUtility
BinUtility(size_t subbins, float substep, float min, float max, BinningOption opt=open, BinningValue value=binR)
Constructor for bi-equidistant.
Definition: BinUtility.h:67
Trk::BinUtility::entry
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
Trk::BinUtility::dimensions
size_t dimensions() const
First bin maximal value.
Definition: BinUtility.h:209
Trk::LayerOrder
LayerOrder
Definition: BinningData.h:31
Trk::equidistant
@ equidistant
Definition: BinningType.h:32
Trk::BinUtility::orderDirection
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
make_coralServer_rep.opt
opt
Definition: make_coralServer_rep.py:19
Trk::BinUtility::max
size_t max(size_t ba=0) const
First bin maximal value.
Definition: BinUtility.h:212
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
Trk::BinUtility::distanceToNext
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
bin
Definition: BinsDiffFromStripMedian.h:43
PlotCalibFromCool.ib
ib
Definition: PlotCalibFromCool.py:419
BinningType.h
Trk::biequidistant
@ biequidistant
Definition: BinningType.h:33
Trk::closed
@ closed
Definition: BinningType.h:41
athena.value
value
Definition: athena.py:124
Trk::BinUtility::BinUtility
BinUtility(float phiRef, std::vector< std::pair< int, float >> &bValues)
Constructor for binH.
Definition: BinUtility.h:101
Trk::BinUtility::clear
void clear()
Clear the data.
Definition: BinUtility.h:248
Trk::BinUtility::operator=
BinUtility & operator=(BinUtility &&sbu)=default
Trk::BinUtility::operator+=
BinUtility & operator+=(const BinUtility &gbu)
Operator++ to make multidimensional BinUtility.
Definition: BinUtility.h:109
Trk::BinUtility::BinUtility
BinUtility(const BinUtility &sbu)=default
Trk::BinUtility::BinUtility
BinUtility(BinUtility &&sbu)=default
Trk::BinUtility::bins
size_t bins(size_t ba=0) const
Number of bins.
Definition: BinUtility.h:221
Trk::BinUtility::BinUtility
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
Trk::BinUtility::BinUtility
BinUtility(std::vector< float > &bValues, BinningOption opt=closed, BinningValue value=binPhi)
Constructor for arbitrary.
Definition: BinUtility.h:83
Trk::arbitrary
@ arbitrary
Definition: BinningType.h:34
Trk::BinUtility::~BinUtility
~BinUtility()=default
GeoPrimitives.h
Trk::BinUtility::BinUtility
BinUtility()
Constructor for equidistant.
Definition: BinUtility.h:43
Trk::BinningValue
BinningValue
how to take the global / local position
Definition: BinningType.h:46
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
Trk::BinUtility::dump
MsgStream & dump(MsgStream &sl) const
Output Method for MsgStream, to be overloaded by child classes.
Definition: BinUtility.h:251
Trk::BinUtility::inside
bool inside(const Amg::Vector2D &lposition) const
Check if bin is inside from Vector3D.
Definition: BinUtility.h:197
Trk::BinUtility::bin
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
Trk::BinUtility::dump
std::ostream & dump(std::ostream &sl) const
Output Method for std::ostream, to be overloaded by child classes.
Definition: BinUtility.h:273
Trk::BinUtility::operator=
BinUtility & operator=(const BinUtility &sbu)=default
columnar::final
CM final
Definition: ColumnAccessor.h:106
Trk::BinUtility::binningValue
BinningValue binningValue(size_t ba=0) const
The type/value of the binning.
Definition: BinUtility.h:230
Trk::BinUtility
Definition: BinUtility.h:39
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
dumpTgcDigiJitter.nBins
list nBins
Definition: dumpTgcDigiJitter.py:29
Trk::BinUtility::inside
bool inside(const Amg::Vector3D &position) const
Check if bin is inside from Vector3D.
Definition: BinUtility.h:186
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
Trk::open
@ open
Definition: BinningType.h:40
Trk::binR
@ binR
Definition: BinningType.h:50
Trk::operator<<
MsgStream & operator<<(MsgStream &sl, const AlignModule &alignModule)
overload of << operator for MsgStream for debug output
Definition: AlignModule.cxx:204
Trk::BinUtility::m_binningData
std::vector< BinningData > m_binningData
Definition: BinUtility.h:295
Trk::BinUtility::clone
BinUtility * clone() const
Implizit Constructor.
Definition: BinUtility.h:120
LArCellBinning.step
step
Definition: LArCellBinning.py:158
BinningData.h
Trk::BinUtility::binPosition
float binPosition(size_t bin, float pos, size_t ba=0) const
bin->BinningValue navigation : pos=+-1.
Definition: BinUtility.h:239
Trk::BinUtility::bin
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
Trk::BinUtility::binningData
const std::vector< BinningData > & binningData() const
return the binning data
Definition: BinUtility.h:123
Trk::BinUtility::next
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
Trk::BinningOption
BinningOption
enum BinValue
Definition: BinningType.h:39
Trk::binPhi
@ binPhi
Definition: BinningType.h:51