Belle II Software  release-06-02-00
MultiHoughSpaceFastInterceptFinder.cc
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 #include <tracking/vxdHoughTracking/findlets/MultiHoughSpaceFastInterceptFinder.h>
9 #include <tracking/vxdHoughTracking/entities/VXDHoughState.h>
10 #include <tracking/spacePointCreation/SpacePoint.h>
11 #include <tracking/spacePointCreation/SpacePointTrackCand.h>
12 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
13 #include <tracking/trackFindingCDC/utilities/Algorithms.h>
14 #include <vxd/dataobjects/VxdID.h>
15 #include <framework/core/ModuleParamList.h>
16 #include <framework/core/ModuleParamList.templateDetails.h>
17 
18 using namespace Belle2;
19 using namespace TrackFindingCDC;
20 using namespace vxdHoughTracking;
21 
22 MultiHoughSpaceFastInterceptFinder::MultiHoughSpaceFastInterceptFinder() : Super()
23 {
25 }
26 
27 void MultiHoughSpaceFastInterceptFinder::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
28 {
29  Super::exposeParameters(moduleParamList, prefix);
30 
31  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "maximumRecursionLevel"), m_param_maxRecursionLevel,
32  "Maximum recursion level for the fast Hough trafo algorithm.", m_param_maxRecursionLevel);
33 
34  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "nAngleSectors"), m_param_nAngleSectors,
35  "Number of angle sectors (= x-axis) dividing the Hough space.", m_param_nAngleSectors);
36 
37  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "nVerticalSectors"), m_param_nVerticalSectors,
38  "Number of vertical sectors (= y-axis) dividing the Hough space.", m_param_nVerticalSectors);
39 
40  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "verticalHoughSpaceSize"), m_param_verticalHoughSpaceSize,
41  "Vertical size of the Hough space.", m_param_verticalHoughSpaceSize);
42 
43  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "HoughSpaceMinimumX"), m_param_minimumX,
44  "Minimum x value of the Hough space.", m_param_minimumX);
45 
46  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "HoughSpaceMaximumX"), m_param_maximumX,
47  "Maximum x value of the Hough space.", m_param_maximumX);
48 
49  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minimumHSClusterSize"), m_param_MinimumHSClusterSize,
50  "Maximum x value of the Hough space.", m_param_MinimumHSClusterSize);
51 
52  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "maximumHSClusterSize"), m_param_MaximumHSClusterSize,
53  "Maximum x value of the Hough space.", m_param_MaximumHSClusterSize);
54 
55  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "maximumHSClusterSizeX"), m_param_MaximumHSClusterSizeX,
56  "Maximum x value of the Hough space.", m_param_MaximumHSClusterSizeX);
57 
58  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "maximumHSClusterSizeY"), m_param_MaximumHSClusterSizeY,
59  "Maximum x value of the Hough space.", m_param_MaximumHSClusterSizeY);
60 
61 }
62 
64 {
66 
68  B2ASSERT("The maximum number of recursions (maximumRecursionLevel) must not be larger than 14, but it is " <<
70  ", please choose a smaller value for maximumRecursionLevel, and / or for nAngleSectors and / or nVerticalSectors.",
73  for (uint i = 0; i < m_param_nAngleSectors; i++) {
74  double x = m_param_minimumX + m_unitX * (double)i;
75  double xc = x + 0.5 * m_unitX;
76 
77  m_HSXLUT[i] = x;
78  m_HSSinValuesLUT[i] = sin(x);
79  m_HSCosValuesLUT[i] = cos(x);
80  m_HSCenterSinValuesLUT[i] = sin(xc);
81  m_HSCenterCosValuesLUT[i] = cos(xc);
82  m_HSXCenterLUT[i] = xc;
83  }
87 
89  for (uint i = 0; i <= m_param_nVerticalSectors; i++) {
92  }
93  B2DEBUG(29, "HS size x: " << (m_param_maximumX - m_param_minimumX) << " HS size y: " << m_param_verticalHoughSpaceSize <<
94  " unitX: " << m_unitX << " unitY: " << m_unitY);
95 
97 
98 }
99 
100 
101 void MultiHoughSpaceFastInterceptFinder::apply(std::vector<VXDHoughState>& hits,
102  std::vector<std::vector<VXDHoughState*>>& rawTrackCandidates)
103 {
104  m_trackCandidates.clear();
105 
106  for (auto& friends : m_fullFriendMap) {
107  m_activeSectors.clear();
108  m_currentSensorsHitList.clear();
109 
110  m_HitSelector.apply(hits, friends.second, m_currentSensorsHitList);
111 
113 
115  }
116 
117  for (auto& trackCand : m_trackCandidates) {
118  // sort for layer, and 2D radius in case of same layer before storing as SpacePointTrackCand
119  // outer hit goes first, as later on tracks are build from outside to inside
120  std::sort(trackCand.begin(), trackCand.end(),
121  [](const VXDHoughState * a, const VXDHoughState * b) {
122  return
123  (a->getDataCache().layer > b->getDataCache().layer) or
124  (a->getDataCache().layer == b->getDataCache().layer
125  and a->getHit()->getPosition().Perp() > b->getHit()->getPosition().Perp());
126  });
127 
128  rawTrackCandidates.emplace_back(trackCand);
129  }
130 
131  B2DEBUG(29, "m_trackCandidates.size: " << m_trackCandidates.size());
132 
133 }
134 
136 {
137  const std::vector<VxdID> friends6XX1 = {VxdID(3, 0, 1), VxdID(3, 0, 2), VxdID(4, 0, 1), VxdID(4, 0, 2), VxdID(5, 0, 1), VxdID(5, 0, 2), VxdID(5, 0, 3), VxdID(6, 0, 2), VxdID(6, 0, 3)};
138  const std::vector<VxdID> friends6XX5 = {VxdID(3, 0, 2), VxdID(4, 0, 2), VxdID(4, 0, 3), VxdID(5, 0, 3), VxdID(5, 0, 4), VxdID(6, 0, 3), VxdID(6, 0, 4)};
139 
140  friendSensorMap thetaFriends;
141  thetaFriends.insert(std::make_pair(VxdID(6, 0, 1), friends6XX1));
142  thetaFriends.insert(std::make_pair(VxdID(6, 0, 5), friends6XX5));
143 
144  const std::vector<VxdID> friends601X = {VxdID(3, 1, 0), VxdID(3, 6, 0), VxdID(3, 7, 0), VxdID(4, 1, 0), VxdID(4, 2, 0), VxdID(4, 10, 0), VxdID(5, 1, 0), VxdID(5, 2, 0), VxdID(5, 12, 0), VxdID(6, 1, 0)};
145  const std::vector<VxdID> friends602X = {VxdID(3, 1, 0), VxdID(3, 2, 0), VxdID(3, 7, 0), VxdID(4, 1, 0), VxdID(4, 2, 0), VxdID(4, 10, 0), VxdID(5, 1, 0), VxdID(5, 2, 0), VxdID(5, 3, 0), VxdID(6, 2, 0)};
146  const std::vector<VxdID> friends603X = {VxdID(3, 1, 0), VxdID(3, 2, 0), VxdID(3, 7, 0), VxdID(4, 1, 0), VxdID(4, 2, 0), VxdID(4, 3, 0), VxdID(5, 2, 0), VxdID(5, 3, 0), VxdID(6, 3, 0)};
147  const std::vector<VxdID> friends604X = {VxdID(3, 1, 0), VxdID(3, 2, 0), VxdID(4, 2, 0), VxdID(4, 3, 0), VxdID(5, 3, 0), VxdID(5, 4, 0), VxdID(6, 4, 0)};
148  const std::vector<VxdID> friends605X = {VxdID(3, 1, 0), VxdID(3, 2, 0), VxdID(3, 3, 0), VxdID(4, 2, 0), VxdID(4, 3, 0), VxdID(4, 4, 0), VxdID(5, 3, 0), VxdID(5, 4, 0), VxdID(5, 5, 0), VxdID(6, 5, 0)};
149  const std::vector<VxdID> friends606X = {VxdID(3, 2, 0), VxdID(3, 3, 0), VxdID(4, 3, 0), VxdID(4, 4, 0), VxdID(4, 5, 0), VxdID(5, 4, 0), VxdID(5, 5, 0), VxdID(5, 6, 0), VxdID(6, 6, 0)};
150  const std::vector<VxdID> friends607X = {VxdID(3, 2, 0), VxdID(3, 3, 0), VxdID(3, 4, 0), VxdID(4, 4, 0), VxdID(4, 5, 0), VxdID(5, 5, 0), VxdID(5, 6, 0), VxdID(6, 7, 0)};
151  const std::vector<VxdID> friends608X = {VxdID(3, 2, 0), VxdID(3, 3, 0), VxdID(3, 4, 0), VxdID(4, 4, 0), VxdID(4, 5, 0), VxdID(4, 6, 0), VxdID(5, 6, 0), VxdID(5, 7, 0), VxdID(6, 8, 0)};
152  const std::vector<VxdID> friends609X = {VxdID(3, 3, 0), VxdID(3, 4, 0), VxdID(3, 5, 0), VxdID(4, 5, 0), VxdID(4, 6, 0), VxdID(4, 7, 0), VxdID(5, 6, 0), VxdID(5, 7, 0), VxdID(5, 8, 0), VxdID(6, 9, 0)};
153  const std::vector<VxdID> friends610X = {VxdID(3, 3, 0), VxdID(3, 4, 0), VxdID(3, 5, 0), VxdID(4, 5, 0), VxdID(4, 6, 0), VxdID(4, 7, 0), VxdID(5, 7, 0), VxdID(5, 8, 0), VxdID(5, 9, 0), VxdID(6, 10, 0)};
154  const std::vector<VxdID> friends611X = {VxdID(3, 4, 0), VxdID(3, 5, 0), VxdID(4, 6, 0), VxdID(4, 7, 0), VxdID(4, 8, 0), VxdID(5, 8, 0), VxdID(5, 9, 0), VxdID(6, 11, 0)};
155  const std::vector<VxdID> friends612X = {VxdID(3, 4, 0), VxdID(3, 5, 0), VxdID(3, 6, 0), VxdID(4, 7, 0), VxdID(4, 8, 0), VxdID(5, 9, 0), VxdID(5, 10, 0), VxdID(6, 12, 0)};
156  const std::vector<VxdID> friends613X = {VxdID(3, 5, 0), VxdID(3, 6, 0), VxdID(4, 7, 0), VxdID(4, 8, 0), VxdID(4, 9, 0), VxdID(5, 9, 0), VxdID(5, 10, 0), VxdID(5, 11, 0), VxdID(6, 13, 0)};
157  const std::vector<VxdID> friends614X = {VxdID(3, 5, 0), VxdID(3, 6, 0), VxdID(3, 7, 0), VxdID(4, 8, 0), VxdID(4, 9, 0), VxdID(4, 10, 0), VxdID(5, 10, 0), VxdID(5, 11, 0), VxdID(5, 12, 0), VxdID(6, 14, 0)};
158  const std::vector<VxdID> friends615X = {VxdID(3, 6, 0), VxdID(3, 7, 0), VxdID(4, 9, 0), VxdID(4, 10, 0), VxdID(5, 11, 0), VxdID(5, 12, 0), VxdID(6, 15, 0)};
159  const std::vector<VxdID> friends616X = {VxdID(3, 1, 0), VxdID(3, 7, 0), VxdID(4, 1, 0), VxdID(4, 9, 0), VxdID(4, 10, 0), VxdID(5, 1, 0), VxdID(5, 12, 0), VxdID(6, 16, 0)};
160 
161  friendSensorMap phiFriends;
162  phiFriends.insert(std::make_pair(VxdID(6, 1, 0), friends601X));
163  phiFriends.insert(std::make_pair(VxdID(6, 2, 0), friends602X));
164  phiFriends.insert(std::make_pair(VxdID(6, 3, 0), friends603X));
165  phiFriends.insert(std::make_pair(VxdID(6, 4, 0), friends604X));
166  phiFriends.insert(std::make_pair(VxdID(6, 5, 0), friends605X));
167  phiFriends.insert(std::make_pair(VxdID(6, 6, 0), friends606X));
168  phiFriends.insert(std::make_pair(VxdID(6, 7, 0), friends607X));
169  phiFriends.insert(std::make_pair(VxdID(6, 8, 0), friends608X));
170  phiFriends.insert(std::make_pair(VxdID(6, 9, 0), friends609X));
171  phiFriends.insert(std::make_pair(VxdID(6, 10, 0), friends610X));
172  phiFriends.insert(std::make_pair(VxdID(6, 11, 0), friends611X));
173  phiFriends.insert(std::make_pair(VxdID(6, 12, 0), friends612X));
174  phiFriends.insert(std::make_pair(VxdID(6, 13, 0), friends613X));
175  phiFriends.insert(std::make_pair(VxdID(6, 14, 0), friends614X));
176  phiFriends.insert(std::make_pair(VxdID(6, 15, 0), friends615X));
177  phiFriends.insert(std::make_pair(VxdID(6, 16, 0), friends616X));
178 
179  std::vector<VxdID> friendSensors;
180 
181  // loop over all phiFriends containing layer 6 ladders
182  for (auto& phiFriendPair : phiFriends) {
183  // get the according vector friends6XX0 for this phiFriendPair
184  std::vector<VxdID> phiFriendLadders = phiFriendPair.second;
185  unsigned short layer6Ladder = phiFriendPair.first.getLadderNumber();
186  // loop over all thetafriends containing layer 6 sensors
187  for (auto& thetaFriendPair : thetaFriends) {
188  friendSensors.clear();
189  // get the according vector friends600Y
190  std::vector<VxdID> thetaFriendSensors = thetaFriendPair.second;
191  unsigned short layer6Sensor = thetaFriendPair.first.getSensorNumber();
192 
193  // loop over all the layers/ladders in this phifriends vector, one specific friends6XX0
194  for (auto& phiFriend : phiFriendLadders) {
195  // loop over all sensor number in the different layers 3-5, one specific friends600Y
196  for (auto& thetaFriend : thetaFriendSensors) {
197  if (phiFriend.getLayerNumber() == thetaFriend.getLayerNumber()) {
198  // get layer number of either phiFriend or thetaFriend, ladder number from phiFriend, and the sensor number from the thetaFriend
199  friendSensors.emplace_back(VxdID(phiFriend.getLayerNumber(), phiFriend.getLadderNumber(), thetaFriend.getSensorNumber()));
200  }
201  }
202  }
203  // add the layer 6 sensor to the list of its own friends to check the vector with std::find in fillThisSensorsHitMap
204  friendSensors.emplace_back(VxdID(6, layer6Ladder, layer6Sensor));
205  m_fullFriendMap.insert(std::make_pair(VxdID(6, layer6Ladder, layer6Sensor), friendSensors));
206  }
207  }
208 }
209 
210 
211 void MultiHoughSpaceFastInterceptFinder::fastInterceptFinder2d(const std::vector<VXDHoughState*>& hits, uint xmin, uint xmax,
212  uint ymin,
213  uint ymax, uint currentRecursion)
214 {
215  std::vector<VXDHoughState*> containedHits;
216  containedHits.reserve(hits.size());
217  std::bitset<8> layerHits; /* For layer filter */
218 
219  if (currentRecursion == m_param_maxRecursionLevel + 1) return;
220 
221  // these int-divisions can cause {min, center} or {center, max} to be the same, which is a desired behaviour
222  const uint centerx = xmin + (uint)((xmax - xmin) / 2);
223  const uint centery = ymin + (uint)((ymax - ymin) / 2);
224  const uint xIndexCache[3] = {xmin, centerx, xmax};
225  const uint yIndexCache[3] = {ymin, centery, ymax};
226 
227  for (int i = 0; i < 2 ; ++i) {
228  const uint left = xIndexCache[i];
229  const uint right = xIndexCache[i + 1];
230  const uint localIndexX = left;
231 
232  if (left == right) continue;
233 
234  const double& sinLeft = m_HSSinValuesLUT[left];
235  const double& cosLeft = m_HSCosValuesLUT[left];
236  const double& sinRight = m_HSSinValuesLUT[right];
237  const double& cosRight = m_HSCosValuesLUT[right];
238 
239  // the sin and cos of the current center can't be stored in a LUT, as the number of possible centers
240  // is quite large and the logic would become rather complex
241  const double sinCenter = m_HSCenterSinValuesLUT[(left + right) / 2];
242  const double cosCenter = m_HSCenterCosValuesLUT[(left + right) / 2];
243 
244  for (int j = 0; j < 2; ++j) {
245  const uint lowerIndex = yIndexCache[j];
246  const uint upperIndex = yIndexCache[j + 1];
247 
248  if (lowerIndex == upperIndex) continue;
249 
250  const uint localIndexY = lowerIndex;
251  const double& localUpperCoordinate = m_HSYLUT[lowerIndex];
252  const double& localLowerCoordinate = m_HSYLUT[upperIndex];
253 
254  // reset layerHits and containedHits
255  layerHits = 0;
256  containedHits.clear();
257  for (VXDHoughState* hit : hits) {
258 
259  const VXDHoughState::DataCache& hitData = hit->getDataCache();
260  const double& m = hitData.xConformal;
261  const double& a = hitData.yConformal;
262 
263  const double derivativeyLeft = m * -sinLeft + a * cosLeft;
264  const double derivativeyRight = m * -sinRight + a * cosRight;
265  const double derivativeyCenter = m * -sinCenter + a * cosCenter;
266 
267  // Only interested in the rising arm of the sinosoidal curves.
268  // Thus if derivative on both sides of the cell is negative, ignore and continue.
269  if (derivativeyLeft < 0 and derivativeyRight < 0 and derivativeyCenter < 0) continue;
270 
271  const double yLeft = m * cosLeft + a * sinLeft;
272  const double yRight = m * cosRight + a * sinRight;
273  const double yCenter = m * cosCenter + a * sinCenter;
274 
275  /* Check if HS-parameter curve is inside (or outside) actual sub-HS */
276  if ((yLeft <= localUpperCoordinate and yRight >= localLowerCoordinate) or
277  (yCenter <= localUpperCoordinate and yLeft >= localLowerCoordinate and yRight >= localLowerCoordinate) or
278  (yCenter >= localLowerCoordinate and yLeft <= localUpperCoordinate and yRight <= localUpperCoordinate)) {
279  layerHits[hitData.layer] = true;
280  containedHits.emplace_back(hit);
281  }
282  }
283 
284  if (layerFilter(layerHits) > 0) {
285  // recursive call of fastInterceptFinder2d, until currentRecursion == m_param_maxRecursionLevel
286  if (currentRecursion < m_param_maxRecursionLevel) {
287  fastInterceptFinder2d(containedHits, left, right, lowerIndex, upperIndex, currentRecursion + 1);
288  } else {
289  m_activeSectors.insert({std::make_pair(localIndexX, localIndexY), std::make_pair(-layerFilter(layerHits), containedHits) });
290  }
291  }
292  }
293  }
294 }
295 
296 
298 {
299  m_clusterCount = 1;
300 
301  for (auto& currentCell : m_activeSectors) {
302 
303  // cell content meanings:
304  // -3, -4 : active sector, not yet visited
305  // 0 : non-active sector (will never be visited, only checked)
306  // 1,2,3...: index of the clusters
307  if (currentCell.second.first > -1) continue;
308 
309  m_clusterInitialPosition = std::make_pair(currentCell.first.first, currentCell.first.second);
310  m_clusterSize = 1;
311  currentCell.second.first = m_clusterCount;
312 
313  m_currentTrackCandidate.clear();
314  for (VXDHoughState* hit : currentCell.second.second) {
315  m_currentTrackCandidate.emplace_back(hit);
316  }
317 
318  // Check for HS sectors connected to each other which could form a cluster
319  DepthFirstSearch(currentCell.first.first, currentCell.first.second);
320  // if cluster valid (i.e. not too small and not too big): finalize!
322 
324  m_currentTrackCandidate.clear();
325  }
326  m_clusterCount++;
327  }
328 }
329 
330 void MultiHoughSpaceFastInterceptFinder::DepthFirstSearch(uint lastIndexX, uint lastIndexY)
331 {
333 
334  for (uint currentIndexY = lastIndexY; currentIndexY >= lastIndexY - 1; currentIndexY--) {
335  if (abs((int)m_clusterInitialPosition.second - (int)currentIndexY) >= m_param_MaximumHSClusterSizeY or
337  for (uint currentIndexX = lastIndexX; currentIndexX <= lastIndexX + 1; currentIndexX++) {
338  if (abs((int)m_clusterInitialPosition.first - (int)currentIndexX) >= m_param_MaximumHSClusterSizeX or
340 
341  // The cell (currentIndexX, currentIndexY) is the current one has already been checked, so continue
342  if (lastIndexX == currentIndexX && lastIndexY == currentIndexY) continue;
343 
344  // first check bounds to avoid out-of-bound array access
345  // as they are uints, they are always >= 0, and in case of an overflow they would be too large
346  if (currentIndexX < m_param_nAngleSectors and currentIndexY < m_param_nVerticalSectors) {
347 
348  auto activeSector = m_activeSectors.find({currentIndexX, currentIndexY});
349  // Only continue searching if the current cluster is smaller than the maximum cluster size
350  if (activeSector != m_activeSectors.end() and activeSector->second.first < 0 /*and m_clusterSize < m_param_MaximumHSClusterSize*/) {
351  activeSector->second.first = m_clusterCount;
352  m_clusterSize++;
353 
354  // No need to check whether currentIndex exists as a key in m_activeSectors as they were created at the same time
355  // so it's certain the key exists.
356  for (VXDHoughState* hit : activeSector->second.second) {
357  if (not TrackFindingCDC::is_in(hit, m_currentTrackCandidate)) {
358  m_currentTrackCandidate.emplace_back(hit);
359  }
360  }
361  // search in the next Hough Space cells...
362  DepthFirstSearch(currentIndexX, currentIndexY);
363  }
364  }
365  }
366  }
367 }
The Module parameter list class.
void initialize() override
Receive and dispatch signal before the start of the event processing.
void addProcessingSignalListener(ProcessingSignalListener *psl)
Register a processing signal listener to be notified.
virtual void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix)
Forward prefixed parameters of this findlet to the module parameter list.
Definition: Findlet.h:69
Interface for an algorithm part that needs to receive the module processing signals.
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:33
baseType getLadderNumber() const
Get the ladder id.
Definition: VxdID.h:98
void apply(std::vector< VXDHoughState > &hits, const std::vector< VxdID > &friendSensorList, std::vector< VXDHoughState * > &selectedHits) override
Load the hits in a sensor friend list for a given L6 sensor from hits and store them in selectedHits,...
Definition: HitSelector.h:33
std::array< double, 16384 > m_HSCenterSinValuesLUT
sine values of the Hough Space sector center coordinates
std::vector< VXDHoughState * > m_currentSensorsHitList
hits that are in the acceptance region (= on friend sensors) for the current L6 senosr
uint m_param_MinimumHSClusterSize
minimum cluster size of sectors belonging to intercepts in the Hough Space
unsigned short layerFilter(std::bitset< 8 > &layer)
layer filter, checks if at least hits from 3 layers are in a set of hits
double m_param_maximumX
maximum x value of the Hough Space, defaults to the value for u-side
std::map< VxdID, std::vector< VxdID > > friendSensorMap
Map that contains the "friend" sensors for each SVD L6 sensor.
std::array< double, 16384 > m_HSYCenterLUT
y values of the Hough Space sector centers
std::array< double, 16385 > m_HSYLUT
y values of the Hough Space sector boarders
std::array< double, 16384 > m_HSCenterCosValuesLUT
cosine values of the Hough Space sector center coordinates
std::map< std::pair< uint, uint >, std::pair< int, std::vector< VXDHoughState * > >, paircompare > m_activeSectors
Map containing only active HS sectors, i.e.
HitSelector m_HitSelector
Use the friend map to just fill the hits in the acceptance region of the current L6 sensor into the m...
std::array< double, 16385 > m_HSXLUT
x values of the Hough Space sector boarders
std::vector< std::vector< VXDHoughState * > > m_trackCandidates
vector containing track candidates, consisting of the found intersection values in the Hough Space
uint m_param_nVerticalSectors
number of sectors of the Hough Space on the vertical axis
void DepthFirstSearch(uint lastIndexX, uint lastIndexY)
Perform depth first search recursive algorithm to find clusters in the Hough Space.
uint m_param_maxRecursionLevel
maximum number of recursive calls of fastInterceptFinder2d
std::pair< uint, uint > m_clusterInitialPosition
start cell of the recursive cluster finding in the Hough Space
void fastInterceptFinder2d(const std::vector< VXDHoughState * > &hits, uint xmin, uint xmax, uint ymin, uint ymax, uint currentRecursion)
find intercepts in the 2D Hough Space by recursively calling itself until no hits are assinged to a g...
double m_param_minimumX
minimum x value of the Hough Space, defaults to the value for u-side
uint m_param_nAngleSectors
number of sectors of the Hough Space on the horizontal axis
double m_param_verticalHoughSpaceSize
vertical size of the Hough Space, defaults to the value for u-side
std::array< double, 16385 > m_HSSinValuesLUT
Look-Up-Tables for values as cache to speed up calculation sine values of the Hough Space sector boar...
uint m_param_MaximumHSClusterSizeX
maximum cluster size in x of sectors belonging to intercepts in the Hough Space
void apply(std::vector< VXDHoughState > &hits, std::vector< std::vector< VXDHoughState * >> &rawTrackCandidates) override
Load in the prepared hits and create track candidates for further processing like hit filtering and f...
uint m_param_MaximumHSClusterSize
maximum cluster size of sectors belonging to intercepts in the Hough Space
std::vector< VXDHoughState * > m_currentTrackCandidate
the current track candidate
void initializeSectorFriendMap()
fill the map of friend sensors for each L6 sensor to
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) override
Expose the parameters of the sub findlets.
std::array< double, 16385 > m_HSCosValuesLUT
cosine values of the Hough Space sector boarder coordinates
std::array< double, 16384 > m_HSXCenterLUT
x values of the Hough Space sector centers
friendSensorMap m_fullFriendMap
friendMap for all the SVD L6 sensors
uint m_param_MaximumHSClusterSizeY
maximum cluster size in y of sectors belonging to intercepts in the Hough Space
Simple container for hit information to be used during intercept finding.
Definition: VXDHoughState.h:24
void addParameter(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
Abstract base class for different kinds of events.
Cache containing the most important information of this state which will often be needed.
Definition: VXDHoughState.h:70
float yConformal
conformal transformed y coordinate of this hit
Definition: VXDHoughState.h:80
unsigned short layer
Geometrical Layer this state is based on.
Definition: VXDHoughState.h:96
float xConformal
conformal transformed x coordinate of this hit
Definition: VXDHoughState.h:78