Belle II Software development
SectorsOnSensor.h
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#pragma once
10
11#include "tracking/dataobjects/FullSecID.h"
12#include <map>
13#include <vector>
14#include <cfloat>
15
16namespace Belle2 {
21
22
25 template< class sectorID >
27
29 typedef unsigned char index_t;
30
32 std::map<double, index_t> m_normalizedUsup;
33
35 std::map<double, index_t> m_normalizedVsup;
36
39 std::vector< std::vector < FullSecID > > m_fullSecIDs;
40
43 std::vector< sectorID > m_compactSecIDs;
44
45 public:
46
49
52 const std::vector< double >& normalizedUsup,
53 const std::vector< double >& normalizedVsup,
54 const std::vector< std::vector< FullSecID > >& fullSecIDs)
55 {
56 index_t index = 0;
57
58 for (auto Vsup : normalizedVsup)
59 m_normalizedVsup.insert({Vsup, index++});
60 m_normalizedVsup.insert({FLT_MAX, index++});
61
62 index = 0;
63 for (auto Usup : normalizedUsup)
64 m_normalizedUsup.insert({Usup, index++});
65 m_normalizedUsup.insert({FLT_MAX, index++});
66
67 m_fullSecIDs = fullSecIDs;
68
69 }
70
73
76 FullSecID operator()(double normalizedU, double normalizedV) const
77 {
78
79 if (normalizedU < 0. or normalizedU > 1.)
80 return FullSecID(0);
81 if (normalizedV < 0. or normalizedV > 1.)
82 return FullSecID(0);
83
84 auto uKeyVal = m_normalizedUsup.upper_bound(normalizedU);
85 if (uKeyVal == m_normalizedUsup.end())
86 return FullSecID(0);
87
88 auto vKeyVal = m_normalizedVsup.upper_bound(normalizedV);
89 if (vKeyVal == m_normalizedVsup.end())
90 return FullSecID(0);
91
92
93 auto uIndex = uKeyVal->second;
94 auto vIndex = vKeyVal->second;
95
96 return m_fullSecIDs[ uIndex ][ vIndex ];
97 }
98
99
100
101
106 void get(std::vector< double >* normalizedUsup,
107 std::vector< double >* normalizedVsup,
108 std::vector< std::vector< unsigned int > >* secID) const
109 {
110 // let us copy the sorted map Usup
111 for (auto uIndexPair : m_normalizedUsup)
112 if (uIndexPair.first != FLT_MAX)
113 normalizedUsup->push_back(uIndexPair.first);
114
115 // let us copy the sorted map Vsup
116 for (auto vIndexPair : m_normalizedVsup)
117 if (vIndexPair.first != FLT_MAX)
118 normalizedVsup->push_back(vIndexPair.first);
119
120 // and finally we copy the array of full sec ids
121 for (auto col : m_fullSecIDs) {
122 std::vector< unsigned int > tmp_col;
123 for (auto id : col)
124 tmp_col.push_back(id);
125 secID->push_back(tmp_col);
126 }
127 }
128
130 bool areCoordinatesValid(double normalizedU, double normalizedV) const
131 {
132 // check u and v
133 if ((normalizedU < 0.) or (normalizedU > 1.)) return false;
134 if ((normalizedV < 0.) or (normalizedV > 1.)) return false;
135 // check internal map for problems:
136 if (m_normalizedUsup.upper_bound(normalizedU) == m_normalizedUsup.end())
137 return false;
138
139 if (m_normalizedVsup.upper_bound(normalizedV) == m_normalizedVsup.end())
140 return false;
141
142 return true;
143 }
144
145
148 sectorID& operator[](int index) { return m_compactSecIDs[index] ;};
149
151 const sectorID& operator[](int index) const { return m_compactSecIDs[index] ;};
152
154 size_t size() const { return m_compactSecIDs.size(); };
155
157 void resize(size_t n) { m_compactSecIDs.resize(n); };
158
159
163 bool updateSubLayerID(FullSecID sector, int sublayer)
164 {
165 for (auto& v : m_fullSecIDs) {
166 for (FullSecID& thisSecID : v) {
168 if (sector.equalIgnoreSubLayerID(thisSecID)) {
169 thisSecID = FullSecID(thisSecID.getVxdID(), (bool)sublayer, thisSecID.getSecID());
170 return true;
171 }
172 }
173 }
174 return false;
175 }
176
178 const std::vector< sectorID >& getCompactSecIDs() const { return m_compactSecIDs; }
179
180 };
181
183}
Class to identify a sector inside of the VXD.
Definition FullSecID.h:33
std::map< double, index_t > m_normalizedVsup
Upper limits of the sectors in normalized V coordinates.
std::vector< std::vector< FullSecID > > m_fullSecIDs
The 2D array of the full sec ID is stored in this member.
size_t size() const
minimal vector semantics to get the size of the compactSecIDs vector
sectorID & operator[](int index)
minimal vector semantics to access the compactSecIDs vector using the sector
bool areCoordinatesValid(double normalizedU, double normalizedV) const
check if using operator() would be safe (true if it is safe):
SectorsOnSensor()
Default constructor needed for the vector traits.
unsigned char index_t
Typedef for the internal numbering of rows and columns of the sectors.
void resize(size_t n)
minimal vector semantics to resize the compactSecIDs vector
FullSecID operator()(double normalizedU, double normalizedV) const
Returns the Full Sector ID of the sector on this sensor that contains the point at normalized coordin...
std::map< double, index_t > m_normalizedUsup
Upper limits of the sectors in normalized U coordinates.
SectorsOnSensor(const std::vector< double > &normalizedUsup, const std::vector< double > &normalizedVsup, const std::vector< std::vector< FullSecID > > &fullSecIDs)
Useful constructor.
~SectorsOnSensor()
Destructor of the object.
const std::vector< sectorID > & getCompactSecIDs() const
JKL: for testing - get all compactSecIDs:
std::vector< sectorID > m_compactSecIDs
The 1D array of the compact ID is stored in this member.
bool updateSubLayerID(FullSecID sector, int sublayer)
update the sublayer id for the sector with the given FullSecID, the sublayer id is ignored when searc...
const sectorID & operator[](int index) const
minimal vector semantics to access the compactSecIDs vector
void get(std::vector< double > *normalizedUsup, std::vector< double > *normalizedVsup, std::vector< std::vector< unsigned int > > *secID) const
copy the vector members on the vector pointed from the arguments.
Abstract base class for different kinds of events.