CbmRoot
Loading...
Searching...
No Matches
CbmRichRingFinderHoughSimd.cxx
Go to the documentation of this file.
1/* Copyright (C) 2008-2021 UGiessen/JINR-LIT, Giessen/Dubna
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Semen Lebedev [committer] */
4
12//#include "../L1/L1Algo/L1Types.h"
14
15#include "../L1/L1Algo/vectors/P4_F32vec4.h"
16
17#include <emmintrin.h>
18
20
21void CbmRichRingFinderHoughSimd::HoughTransformGroup(unsigned short int indmin, unsigned short int indmax, Int_t iPart)
22{
23 // Float_t r12, r13, r23;
24 // Float_t rx0, rx1, rx2, ry0, ry1,ry2; //rx[3], ry[3];//, x[3], y[3];
25 //Float_t xc, yc, r;
26 //Float_t xcs, ycs; // xcs = xc - fCurMinX
27 Int_t *intX, *intY, *intR;
28 Int_t* indXY;
29
30 unsigned short int iH11, iH12, iH13, iH14, iH2, iH3;
31 Int_t nofHitsNorm = fHitInd[0].size() + 1;
32 Int_t iPmulNofHits;
33
34 //Float_t t5, t10, t19, det, t6, t7;
35 Float_t dx = 1.0f / fDx, dy = 1.0f / fDy, dr = 1.0f / fDr;
36 //Float_t iH1X, iH1Y, iH2X, iH2Y, iH3X, iH3Y;
37
38 fvec xcs, ycs;
39 fvec fCurMinXV = fvec(fCurMinX), fCurMinYV = fvec(fCurMinY);
40 fvec xc, yc, r;
41 fvec r12, r13, r23;
42 fvec rx0, rx1, rx2, ry0, ry1, ry2; //rx[3], ry[3];//, x[3], y[3];
43 fvec t5, t10, t19, det, t6, t7;
44 fvec iH1X, iH1Y, iH2X, iH2Y, iH3X, iH3Y;
45 // fvec intXfv, intYfv, intRfv;
46
47 __m128i intXv, intYv, intRv, indXYv;
48 __m128i fNofBinsXv = _mm_set1_epi32(fNofBinsX);
49 __m128i fNofBinsXYv = _mm_set1_epi32(fNofBinsXY + 1);
50 __m128i m128i_0 = _mm_set1_epi32(0);
51 fvec fMinDistanceSqv = fvec(fMinDistanceSq);
52 fvec fMaxDistanceSqv = fvec(fMaxDistanceSq);
53 __m128i fNofBinsRv = _mm_set1_epi32(fNofBinsR + 1);
54 __m128i m128i_10 = _mm_set1_epi32(10);
55
56 fvec dxv = fvec(1.0f / fDx), dyv = fvec(1.0f / fDy), drv = fvec(1.0f / fDr);
57 fvec fvec05 = fvec(0.5f);
58 fvec fvec0 = fvec(0.f);
59 Int_t nofHits = fHitInd[iPart].size();
60 if (nofHits <= fMinNofHitsInArea) return;
61 iPmulNofHits = iPart * nofHitsNorm;
62
63 vector<unsigned short> hitIndPart;
64 hitIndPart.assign(fHitInd[iPart].begin(), fHitInd[iPart].end());
65
66 CbmRichHoughHitVec h2, h3;
67
68 for (unsigned short int iHit1 = 0; iHit1 < (nofHits & ~3); iHit1 += 4) {
69 iH11 = hitIndPart[iHit1];
70 iH12 = hitIndPart[iHit1 + 1];
71 iH13 = hitIndPart[iHit1 + 2];
72 iH14 = hitIndPart[iHit1 + 3];
73
74 iH1X = fvec(fData[iH11]->fX, fData[iH12]->fX, fData[iH13]->fX, fData[iH14]->fX);
75 iH1Y = fvec(fData[iH11]->fY, fData[iH12]->fY, fData[iH13]->fY, fData[iH14]->fY);
76
77 for (unsigned short int iHit2 = iHit1 + 1; iHit2 < nofHits; iHit2++) {
78 iH2 = hitIndPart[iHit2];
79 h2 = fDataV[iH2];
80 iH2X = h2.fX;
81 iH2Y = h2.fY;
82
83 rx0 = iH1X - iH2X; //rx12
84 ry0 = iH1Y - iH2Y; //ry12
85 r12 = rx0 * rx0 + ry0 * ry0;
86 if (_mm_comineq_ss(_mm_cmpgt_ss(r12, fMinDistanceSqv), fvec0) == 1) continue;
87 if (_mm_comineq_ss(_mm_cmplt_ss(r12, fMaxDistanceSqv), fvec0) == 1) continue;
88
89
90 t10 = fvec(fData[iH11]->fX2plusY2 - fData[iH2]->fX2plusY2, fData[iH12]->fX2plusY2 - fData[iH2]->fX2plusY2,
91 fData[iH13]->fX2plusY2 - fData[iH2]->fX2plusY2, fData[iH14]->fX2plusY2 - fData[iH2]->fX2plusY2);
92 for (unsigned short int iHit3 = iHit2 + 1; iHit3 < nofHits; iHit3++) {
93 //iH3 = hitIndPart[iHit3];
94 h3 = fDataV[hitIndPart[iHit3]];
95 // iH3X = h3.fX;
96 // iH3Y = h3.fY;
97 t5 = h2.fX2plusY2 - h3.fX2plusY2;
98
99 rx1 = iH1X - iH3X; //rx13
100 ry1 = iH1Y - iH3Y; //ry13
101 r13 = rx1 * rx1 + ry1 * ry1;
102 if (_mm_comineq_ss(_mm_cmpgt_ss(r13, fMinDistanceSqv), fvec0) == 1) continue;
103 if (_mm_comineq_ss(_mm_cmplt_ss(r13, fMaxDistanceSqv), fvec0) == 1) continue;
104
105 rx2 = iH2X - h3.fX; //rx23
106 ry2 = iH2Y - h3.fY; //ry23
107 r23 = rx2 * rx2 + ry2 * ry2;
108 if (_mm_comineq_ss(_mm_cmpgt_ss(r23, fMinDistanceSqv), fvec0) == 1) continue;
109 if (_mm_comineq_ss(_mm_cmplt_ss(r23, fMaxDistanceSqv), fvec0) == 1) continue;
110
111 t19 = fvec05 / (rx2 * ry0 - rx0 * ry2);
112
113 xc = (t5 * ry0 - t10 * ry2) * t19;
114 xcs = xc - fCurMinXV;
115 //intX = int( xcs *dx);
116 //if (intX < 0 || intX >= fNofBinsX ) continue;
117
118 yc = (t10 * rx2 - t5 * rx0) * t19;
119 ycs = yc - fCurMinYV;
120 //intY = int( ycs *dy);
121 //if (intY < 0 || intY >= fNofBinsY ) continue;
122
123 //radius calculation
124 t6 = iH1X - xc;
125 t7 = iH1Y - yc;
126 r = sqrt(t6 * t6 + t7 * t7);
127
128 //intR = int(r *dr);
129 //if (intR < 0 || intR > fNofBinsR) continue;
130 //indXY = intX * fNofBinsX + intY;
131 // intXfv = xcs *dxv;
132 // intYfv = ycs *dyv;
133 // intRfv = r *drv;
134 intRv = _mm_cvtps_epi32(r * drv);
135 // if (_mm_movemask_epi8( _mm_cmpgt_epi32(intRv, m128i_10) ) == 0x0000)continue;
136 // if (_mm_movemask_epi8( _mm_cmplt_epi32(intRv, fNofBinsRv) ) == 0x0000) continue;
137
138 intXv = _mm_cvtps_epi32(xcs * dxv);
139 intYv = _mm_cvtps_epi32(ycs * dyv);
140 indXYv = intXv * fNofBinsXv + intYv;
141
142 // if (_mm_movemask_epi8( _mm_cmpgt_epi32(indXYv, m128i_0) ) == 0x0000) continue;
143 // if (_mm_movemask_epi8( _mm_cmplt_epi32(indXYv, fNofBinsXYv) ) == 0x0000) continue;
144
145
146 indXY = (int*) &indXYv;
147 intR = (int*) &intRv;
148
149 if (intR[0] > 9 && intR[0] < fNofBinsR && indXY[0] > -1 && indXY[0] < fNofBinsXY) {
150 fHist[indXY[0]]++;
151 fHistR[intR[0]]++;
152 }
153 if (intR[1] > 9 && intR[1] < fNofBinsR && indXY[1] > -1 && indXY[1] < fNofBinsXY) {
154 fHist[indXY[1]]++;
155 fHistR[intR[1]]++;
156 }
157
158 if (intR[2] > 9 && intR[2] < fNofBinsR && indXY[2] > -1 && indXY[2] < fNofBinsXY) {
159 fHist[indXY[2]]++;
160 fHistR[intR[2]]++;
161 }
162
163 if (intR[3] > 9 && intR[3] < fNofBinsR && indXY[3] > -1 && indXY[3] < fNofBinsXY) {
164 fHist[indXY[3]]++;
165 fHistR[intR[3]]++;
166 }
167 } //iHit1
168 } //iHit2
169 } //iHit3
170}
171
172
174{
175 Int_t indmin, indmax;
176 Float_t x0, y0;
177
178 fDataV.clear();
179 fDataV.reserve(fData.size());
180 for (UInt_t iHit = 0; iHit < fData.size(); iHit++) {
182 h.fX = fvec(fData[iHit].fX);
183 h.fY = fvec(fData[iHit].fY);
184 h.fX2plusY2 = fvec(fData[iHit].fX2plusY2);
185 fDataV.push_back(h);
186 }
187
188 for (UInt_t iHit = 0; iHit < fData.size(); iHit++) {
189 if (fData[iHit].fIsUsed == true) continue;
190
191 x0 = fData[iHit].fX;
192 y0 = fData[iHit].fY;
193
194 fCurMinX = x0 - fMaxDistance;
195 fCurMinY = y0 - fMaxDistance;
196
197 DefineLocalAreaAndHits(x0, y0, &indmin, &indmax);
198 HoughTransform(indmin, indmax);
199 FindPeak(indmin, indmax);
200
201 } //main loop over hits
202}
SIMDized ring finder based on Hough Transform method.
friend fvec sqrt(const fvec &a)
fvec()
Definition KfSimdPseudo.h:6
vector< vector< unsigned int > > fHitInd
void FindPeak(int indmin, int indmax)
virtual void HoughTransform(unsigned int indmin, unsigned int indmax)
Run HoughTransformGroup for each group of hits.
virtual void DefineLocalAreaAndHits(float x0, float y0, int *indmin, int *indmax)
Find hits in a local area.
std::vector< CbmRichHoughHitVec > fDataV
virtual void HoughTransformGroup(unsigned short int indmin, unsigned short int indmax, Int_t iPart)
virtual void HoughTransformReconstruction()
Run HT for each hit.
Data class with information on a STS local track.