11 #include <tracking/modules/DATCON/DATCONTrackingModule.h>
17 DATCONTrackingModule::FindHoughSpaceCluster(
bool uSide)
22 int minimumClusterSize = 1;
23 int maximumClusterSize = 1000;
24 double unitX = 0., unitY = 0.;
25 double angleRange = 0., vertRange = 0.;
26 double left = 0., right = 0., up = 0., down = 0.;
27 vector<DATCONHoughSpaceClusterCand> HoughSpaceClusterCandCopy;
28 vector<unsigned int> idList;
29 vector<unsigned int> mergedList;
30 TVector2 CandidateCoordinates;
32 int** ArrayOfActiveHoughSpaceSectors;
34 if (m_usePhase2Simulation) {
35 B2WARNING(
"This mode is not yet implemented, nothing will happen! Return...");
39 angleSectors = m_nAngleSectorsU;
40 vertSectors = m_nVertSectorsU;
41 HoughSpaceClusterCandCopy = uHoughSpaceClusterCand;
42 ArrayOfActiveHoughSpaceSectors = ArrayOfActiveSectorsPhiHS;
43 minimumClusterSize = m_MinimumPhiHSClusterSize;
44 maximumClusterSize = m_MaximumPhiHSClusterSize;
50 angleSectors = m_nAngleSectorsV;
51 vertSectors = m_nVertSectorsV;
52 HoughSpaceClusterCandCopy = vHoughSpaceClusterCand;
53 ArrayOfActiveHoughSpaceSectors = ArrayOfActiveSectorsThetaHS;
54 minimumClusterSize = m_MinimumThetaHSClusterSize;
55 maximumClusterSize = m_MaximumThetaHSClusterSize;
63 angleRange = (right - left);
64 vertRange = (up - down);
65 unitX = angleRange / (double)(angleSectors);
66 unitY = vertRange / (double)(vertSectors);
75 for (
auto it = HoughSpaceClusterCandCopy.begin(); it != HoughSpaceClusterCandCopy.end(); it++) {
76 idList = it->getIdList();
78 CandidateCoordinates = it->getCoord();
79 int actualPositionX = (int)CandidateCoordinates.X();
80 int actualPositionY = (int)CandidateCoordinates.Y();
81 if (ArrayOfActiveHoughSpaceSectors[actualPositionY][actualPositionX] == -1) {
82 m_clusterInitialPosition.Set((
double)actualPositionX, (double)actualPositionY);
83 m_clusterCenterOfGravity.Set((
double)actualPositionX, (double)actualPositionY);
85 DepthFirstSearch(uSide, ArrayOfActiveHoughSpaceSectors, angleSectors, vertSectors,
86 actualPositionX, actualPositionY, mergedList);
88 if (m_clusterSize >= minimumClusterSize && m_clusterSize <= maximumClusterSize) {
89 double CoGX = left + unitX * (((double)m_clusterCenterOfGravity.X() / (double)(m_clusterSize)) + 0.5);
90 double CoGY = up - unitY * (((double)m_clusterCenterOfGravity.Y() / (double)(m_clusterSize)) + 0.5);
92 uTrackCand.push_back(
DATCONTrackCand(mergedList, TVector2(CoGX, CoGY)));
94 vTrackCand.push_back(
DATCONTrackCand(mergedList, TVector2(CoGX, CoGY)));
102 DATCONTrackingModule::DepthFirstSearch(
bool uSide,
int** ArrayOfActiveHoughSpaceSectors,
int angleSectors,
int vertSectors,
103 int actualPositionX,
int actualPositionY, vector<unsigned int>& mergedList)
105 vector<unsigned int> mergeMeIDList;
106 int maximumClusterSize;
107 int maximumClusterSizeX;
108 int maximumClusterSizeY;
109 vector<DATCONHoughSpaceClusterCand> HoughSpaceClusterCandCopy;
110 TVector2 CandidateCoordinates;
113 HoughSpaceClusterCandCopy = uHoughSpaceClusterCand;
114 maximumClusterSize = m_MaximumPhiHSClusterSize;
115 maximumClusterSizeX = m_MaximumPhiHSClusterSizeX;
116 maximumClusterSizeY = m_MaximumPhiHSClusterSizeY;
118 HoughSpaceClusterCandCopy = vHoughSpaceClusterCand;
119 maximumClusterSize = m_MaximumThetaHSClusterSize;
120 maximumClusterSizeX = m_MaximumThetaHSClusterSizeX;
121 maximumClusterSizeY = m_MaximumThetaHSClusterSizeY;
124 ArrayOfActiveHoughSpaceSectors[actualPositionY][actualPositionX] = m_clusterCount;
125 for (
int k = actualPositionY; k >= actualPositionY - 1; k--) {
126 for (
int l = actualPositionX; l <= actualPositionX + 1; l++) {
127 if (k >= 0 && k < vertSectors && l >= 0 && l < angleSectors) {
128 if (ArrayOfActiveHoughSpaceSectors[k][l] == -1) {
129 for (
auto it = HoughSpaceClusterCandCopy.begin(); it != HoughSpaceClusterCandCopy.end(); it++) {
130 mergeMeIDList = it->getIdList();
131 CandidateCoordinates = it->getCoord();
132 int j = (int)CandidateCoordinates.X();
133 int i = (int)CandidateCoordinates.Y();
134 if (j == l && i == k) {
138 mergeIdList(mergedList, mergeMeIDList);
140 m_clusterCenterOfGravity += TVector2(l, k);
142 if (m_clusterSize >= maximumClusterSize || abs((
int)m_clusterInitialPosition.X() - actualPositionX) >= maximumClusterSizeX
143 || abs((
int)m_clusterInitialPosition.Y() - actualPositionY) >= maximumClusterSizeY) {
146 DepthFirstSearch(uSide, ArrayOfActiveHoughSpaceSectors, angleSectors, vertSectors, l, k, mergedList);