50 memset(&
m_Cx[0][0], 0,
sizeof(
m_Cx));
51 memset(&
m_Cy[0][0], 0,
sizeof(
m_Cy));
126 new_ts.
m_vs.push_back(pS);
128 bool accepted =
update(pS, new_ts);
130 if(!accepted)
return;
134 std::list<TrigFTF_GNN_Edge*> lCont;
136 for(
int nIdx=0;nIdx<pS->
m_nNei;nIdx++) {
137 unsigned int nextSegmentIdx = pS->
m_vNei[nIdx];
141 if(pN->
m_level == -1)
continue;
160 float best_so_far = (*
m_stateVec.begin())->m_J;
161 if(new_ts.
m_J > best_so_far) {
179 const float sigma_t = 0.0003;
180 const float sigma_w = 0.00009;
182 const float sigmaMS = 0.016;
184 const float sigma_x = 0.25;
185 const float sigma_y = 2.5;
187 const float weight_x = 0.5;
188 const float weight_y = 0.5;
190 const float maxDChi2_x = 60.0;
191 const float maxDChi2_y = 60.0;
193 const float add_hit = 14.0;
195 if(
ts.m_Cx[2][2] < 0.0 ||
ts.m_Cx[1][1] < 0.0 ||
ts.m_Cx[0][0] < 0.0) {
196 std::cout<<
"Negative cov_x"<<std::endl;
199 if(
ts.m_Cy[1][1] < 0.0 ||
ts.m_Cy[0][0] < 0.0) {
200 std::cout<<
"Negative cov_y"<<std::endl;
205 ts.m_Cx[2][2] += sigma_w*sigma_w;
206 ts.m_Cx[1][1] += sigma_t*sigma_t;
210 float t2 = type1 == 0 ? 1.0 +
ts.m_Y[1]*
ts.m_Y[1] : 1.0 + 1.0/(
ts.m_Y[1]*
ts.m_Y[1]);
211 float s1 = sigmaMS*
t2;
221 float Cx[3][3], Cy[2][2];
223 float refX, refY,
mx,
my;
232 refX =
x*
ts.m_c +
y*
ts.m_s;
237 float A = refX -
ts.m_refX;
239 float dr = refY -
ts.m_refY;
241 X[0] =
ts.m_X[0] +
ts.m_X[1]*
A +
ts.m_X[2]*
B;
242 X[1] =
ts.m_X[1] +
ts.m_X[2]*
A;
245 Cx[0][0] =
ts.m_Cx[0][0] + 2*
ts.m_Cx[0][1]*
A + 2*
ts.m_Cx[0][2]*
B +
A*
A*
ts.m_Cx[1][1] + 2*
A*
B*
ts.m_Cx[1][2] +
B*
B*
ts.m_Cx[2][2];
246 Cx[0][1] = Cx[1][0] =
ts.m_Cx[0][1] +
ts.m_Cx[1][1]*
A +
ts.m_Cx[1][2]*
B +
ts.m_Cx[0][2]*
A +
A*
A*
ts.m_Cx[1][2] +
A*
B*
ts.m_Cx[2][2];
247 Cx[0][2] = Cx[2][0] =
ts.m_Cx[0][2] +
ts.m_Cx[1][2]*
A +
ts.m_Cx[2][2]*
B;
249 Cx[1][1] =
ts.m_Cx[1][1] + 2*
A*
ts.m_Cx[1][2] +
A*
A*
ts.m_Cx[2][2];
250 Cx[1][2] = Cx[2][1] =
ts.m_Cx[1][2] +
ts.m_Cx[2][2]*
A;
252 Cx[2][2] =
ts.m_Cx[2][2];
254 Y[0] =
ts.m_Y[0] +
ts.m_Y[1]*
dr;
257 Cy[0][0] =
ts.m_Cy[0][0] + 2*
ts.m_Cy[0][1]*
dr +
dr*
dr*
ts.m_Cy[1][1];
258 Cy[0][1] = Cy[1][0] =
ts.m_Cy[0][1] +
dr*
ts.m_Cy[1][1];
259 Cy[1][1] =
ts.m_Cy[1][1];
263 float resid_x =
mx -
X[0];
264 float resid_y =
my -
Y[0];
266 float CHx[3] = {Cx[0][0], Cx[0][1], Cx[0][2]};
267 float CHy[2] = {Cy[0][0], Cy[0][1]};
270 float sigma_rz = 0.0;
275 sigma_rz = sigma_y*sigma_y;
278 sigma_rz = sigma_y*
ts.m_Y[1];
279 sigma_rz = sigma_rz*sigma_rz;
282 float Dx = 1.0/(Cx[0][0] + sigma_x*sigma_x);
284 float Dy = 1.0/(Cy[0][0] + sigma_rz);
286 float dchi2_x = resid_x*resid_x*Dx;
287 float dchi2_y = resid_y*resid_y*Dy;
290 if(dchi2_x > maxDChi2_x || dchi2_y > maxDChi2_y) {
294 ts.m_J += add_hit - dchi2_x*weight_x - dchi2_y*weight_y;
298 float Kx[3] = {Dx*Cx[0][0], Dx*Cx[0][1], Dx*Cx[0][2]};
299 float Ky[2] = {Dy*Cy[0][0], Dy*Cy[0][1]};
301 for(
int i=0;
i<3;
i++)
ts.m_X[
i] =
X[
i] + Kx[
i]*resid_x;
302 for(
int i=0;
i<2;
i++)
ts.m_Y[
i] =
Y[
i] + Ky[
i]*resid_y;
304 for(
int i=0;
i<3;
i++) {
305 for(
int j=0;j<3;j++) {
306 ts.m_Cx[
i][j] = Cx[
i][j] - Kx[
i]*CHx[j];
310 for(
int i=0;
i<2;
i++) {
311 for(
int j=0;j<2;j++) {
312 ts.m_Cy[
i][j] = Cy[
i][j] - Ky[
i]*CHy[j];
321 return m_geo.at(
l).m_type;