Belle II Software development
FastInterceptFinder2DFPGA.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#pragma once
9
10#include <tracking/trackFindingCDC/findlets/base/Findlet.h>
11#include <tracking/datcon/utilities/DATCONHelpers.h>
12
13#include <algorithm>
14#include <array>
15#include <cmath>
16#include <fstream>
17#include <iostream>
18#include <string>
19#include <vector>
20
21namespace Belle2 {
26 class ModuleParamList;
27 class VxdID;
28
34 TrackFindingCDC::Findlet<const std::pair<VxdID, std::pair<long, long>>, std::pair<double, double>> {
37
38 public:
41
43 void exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix) override;
44
46 void initialize() override;
47
49 void apply(const std::vector<std::pair<VxdID, std::pair<long, long>>>& hits,
50 std::vector<std::pair<double, double>>& tracks) override;
51
52 private:
53
56 inline unsigned short layerFilter(std::vector<bool> layer)
57 {
58 uint layercount = std::count(layer.begin(), layer.end(), true);
59 return (layercount >= 3 ? layercount : 0);
60 }
61
70 void fastInterceptFinder2d(const std::vector<std::pair<VxdID, std::pair<long, long>>>& hits,
71 uint xmin, uint xmax, uint ymin, uint ymax, uint currentRecursion);
72
76
80 void DepthFirstSearch(uint lastIndexX, uint lastIndexY);
81
83 void gnuplotoutput(const std::vector<std::pair<VxdID, std::pair<long, long>>>& hits);
84
85 // Parameters
87 bool m_param_isUFinder = true;
88
91
94
97
100
102 double m_param_minimumX = -3.168;
104 double m_param_maximumX = 3.168;
105
107 double m_unitX = 0;
109 double m_unitY = 0;
110
119
122 std::array<long, 16385> m_HSSinValuesLUT = {0};
124 std::array<long, 16385> m_HSCosValuesLUT = {0};
126 std::array<long, 16384> m_HSCenterSinValuesLUT = {0};
128 std::array<long, 16384> m_HSCenterCosValuesLUT = {0};
130 std::array<long, 16385> m_HSYLUT = {0};
132 std::array<long, 16384> m_HSYCenterLUT = {0};
134 std::array<double, 16385> m_HSXLUT = {0};
136 std::array<double, 16384> m_HSXCenterLUT = {0};
137
139 std::vector<int> m_SectorArray;
144 std::vector<std::pair<uint, uint>> m_activeSectorArray;
145
150
154 std::string m_param_gnuplotHSOutputFileName = "HSFPGA.plt";
156 std::string m_param_gnuplotHSRectOutputFileName = "HSFPGARect.plt";
158 std::string m_param_gnuplotHSCoGOutputFileName = "HSFPGACoG.plt";
160 std::ofstream m_rectoutstream;
162 std::ofstream m_cogoutstream;
164 const std::string m_const_rectColor[8] = {"blue", "cyan", "green", "yellow", "orange", "violet", "skyblue", "pink"};
167
169 std::pair<int, int> m_clusterInitialPosition = std::make_pair(0, 0);
171 std::pair<int, int> m_clusterCoG = std::make_pair(0, 0);
172
174 std::vector<std::pair<double, double>> m_trackCandidates;
175
176 };
178}
Findlet for finging intersections of sinosoidal curves in the 2D Hough space by iteratively calling f...
std::vector< int > m_SectorArray
vector containing only the 1D representation of active cells to speed up processing
uint m_param_MinimumHSClusterSize
minimum cluster size of sectors belonging to intercepts in the Hough Space
void gnuplotoutput(const std::vector< std::pair< VxdID, std::pair< long, long > > > &hits)
gnuplot output for debugging
const std::string m_const_rectColor[8]
color definition for the sector debug output
void FindHoughSpaceCluster()
Find Hough Space clusters.
double m_param_maximumX
maximum x value of the Hough Space, defaults to the value for u-side
uint m_clusterSize
size of the current cluster
void fastInterceptFinder2d(const std::vector< std::pair< VxdID, std::pair< long, long > > > &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 assigned to a g...
void initialize() override
Create the store arrays.
std::array< long, 16385 > m_HSYLUT
y values of the Hough Space sector boarders
std::array< double, 16385 > m_HSXLUT
x values of the Hough Space sector boarders
std::vector< std::pair< double, double > > m_trackCandidates
vector containing track candidates, consisting of the found intersection values in the Hough Space
std::string m_param_gnuplotHSRectOutputFileName
gnuplot HS sector output filename
uint m_param_nVerticalSectors
number of sectors of the Hough Space on the vertical axis
bool m_param_isUFinder
Is this the intercept finder for the u-side hits (r-phi) or v-side (r-z)?
long m_param_verticalHoughSpaceSize
vertical size of the Hough Space, defaults to the value for u-side
std::array< long, 16385 > m_HSCosValuesLUT
cosine values of the Hough Space sector boarder coordinates
void DepthFirstSearch(uint lastIndexX, uint lastIndexY)
Perform depth first search recursive algorithm to find clusters in the Hough Space.
std::array< long, 16385 > m_HSSinValuesLUT
Look-Up-Tables for values as cache to speed up calculation sine values of the Hough Space sector boar...
std::array< long, 16384 > m_HSCenterCosValuesLUT
cosine values of the Hough Space sector center coordinates
uint m_param_maxRecursionLevel
maximum number of recursive calls of fastInterceptFinder2d
std::ofstream m_rectoutstream
HS sector debug file.
std::ofstream m_cogoutstream
HS CoG debug file.
void apply(const std::vector< std::pair< VxdID, std::pair< long, long > > > &hits, std::vector< std::pair< double, double > > &tracks) override
Load in the prepared hits and create tracks for extrapolation to PXD.
std::pair< int, int > m_clusterCoG
center of gravity containing describing the current best track parameters in the Hough Space
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
std::string m_param_gnuplotHSOutputFileName
gnuplot HS output filename
std::vector< std::pair< uint, uint > > m_activeSectorArray
vector containing information for each cell whether it contained enough hits after m_maxRecursionLeve...
std::array< long, 16384 > m_HSYCenterLUT
y values of the Hough Space sector centers
uint m_param_MaximumHSClusterSizeX
maximum cluster size in x of sectors belonging to intercepts in the Hough Space
std::string m_param_gnuplotHSCoGOutputFileName
gnuplot HS sector output filename
uint m_param_MaximumHSClusterSize
maximum cluster size of sectors belonging to intercepts in the Hough Space
bool m_param_writeGnuplotOutput
use gnuplot output?
unsigned short layerFilter(std::vector< bool > layer)
Layer filter, checks if at least hits from 3 layers are in a set of hits.
FastInterceptFinder2DFPGA()
Find intercepts in the 2D Hough space.
uint m_rectcounter
count HS debug rectangles
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) override
Expose the parameters of the sub findlets.
std::array< double, 16384 > m_HSXCenterLUT
x values of the Hough Space sector centers
std::pair< int, int > m_clusterInitialPosition
start cell of the recursive cluster finding in the Hough Space
uint m_param_MaximumHSClusterSizeY
maximum cluster size in y of sectors belonging to intercepts in the Hough Space
std::array< long, 16384 > m_HSCenterSinValuesLUT
sine values of the Hough Space sector center coordinates
The Module parameter list class.
Interface for a minimal algorithm part that wants to expose some parameters to a module.
Definition: Findlet.h:26
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:33
long convertFloatToInt(double value, int power)
Convert float or double to long int for more similarity to the FPGA implementation.
Definition: DATCONHelpers.h:21
Abstract base class for different kinds of events.