14 Double_t w = (C[0]+
V[0])*(C[2]+
V[2]) - (C[1]+
V[1])*(C[1]+
V[1]);
15 if( w<1.E-20 || !finite(w)) {
20 if( !finite(w) )
return 1;
22 Double_t
W[3] = { w*(C[2]+
V[2]), -w*(C[1]+
V[1]), w*(C[0]+
V[0])};
23 Double_t zeta[2] = { T[0] -
x, T[1] -
y };
25 track.
GetRefChi2() += zeta[0]*zeta[0]*
W[0] + 2*zeta[0]*zeta[1]*
W[1] + zeta[1]*zeta[1]*
W[2];
28 Double_t K[5][2] = { { C[ 0]*
W[ 0] + C[ 1]*
W[ 1], C[ 0]*
W[ 1] + C[ 1]*
W[ 2] },
29 { C[ 1]*
W[ 0] + C[ 2]*
W[ 1], C[ 1]*
W[ 1] + C[ 2]*
W[ 2] },
30 { C[ 3]*
W[ 0] + C[ 4]*
W[ 1], C[ 3]*
W[ 1] + C[ 4]*
W[ 2] },
31 { C[ 6]*
W[ 0] + C[ 7]*
W[ 1], C[ 6]*
W[ 1] + C[ 7]*
W[ 2] },
32 { C[10]*
W[ 0] + C[11]*
W[ 1], C[10]*
W[ 1] + C[11]*
W[ 2] }, };
34 T[0]-= K[0][0]*zeta[0] + K[0][1]*zeta[1];
35 T[1]-= K[1][0]*zeta[0] + K[1][1]*zeta[1];
36 T[2]-= K[2][0]*zeta[0] + K[2][1]*zeta[1];
37 T[3]-= K[3][0]*zeta[0] + K[3][1]*zeta[1];
38 T[4]-= K[4][0]*zeta[0] + K[4][1]*zeta[1];
40 Double_t KHC[15] = { C[0]*K[0][0] + C[1]*K[0][1],
41 C[0]*K[1][0] + C[1]*K[1][1], C[1]*K[1][0] + C[2]*K[1][1],
43 C[0]*K[2][0] + C[1]*K[2][1], C[1]*K[2][0] + C[2]*K[2][1],
44 C[3]*K[2][0] + C[4]*K[2][1],
46 C[0]*K[3][0] + C[1]*K[3][1], C[1]*K[3][0] + C[2]*K[3][1],
47 C[3]*K[3][0] + C[4]*K[3][1], C[6]*K[3][0] + C[7]*K[3][1],
49 C[0]*K[4][0] + C[1]*K[4][1], C[1]*K[4][0] + C[2]*K[4][1],
50 C[3]*K[4][0] + C[4]*K[4][1], C[6]*K[4][0] + C[7]*K[4][1],
51 C[10]*K[4][0] + C[11]*K[4][1] };
86 vector<CbmKFPixelMeasurement*> &vm,
87 double gateX,
double gateY,
88 vector<double> &vProb )
90 const double Pdetect=0.90;
91 const double gateEff=0.99;
97 double gateArea=gateX*gateY;
101 vector<double> vResidX;
102 vector<double> vResidY;
103 vector<double> vChi2;
107 cout<<
"PDAF: "<<vm->size()<<
" hits validated"<<endl;
108 cout<<
"Initial params: x="<<T[0]<<
" y="<<T[1]<<
" tx="<<T[2]
109 <<
" ty="<<T[3]<<
" Q="<<T[4]<<endl;
110 cout<<
"GateX="<<gateX<<
" GateY="<<gateY<<endl;
114 vExp.clear();vResidX.clear();vResidY.clear();
118 const double *
V = (*vm.begin())->
V;
122 Sk=(C[0]+
V[0])*(C[2]+
V[2]) - (C[1]+
V[1])*(C[1]+
V[1]);
126 double Lambda = 1./1.;
128 Ck=2.0*3.1415926*
sqrt(Sk)*(1.0-Pdetect*gateEff)/(gateArea*Pdetect*gateEff)*Lambda;
131 if ( w<1.E-20 )
return;
136 double W[3] = { w*(C[2]+
V[2]), -w*(C[1]+
V[1]), w*(C[0]+
V[0])};
139 { C[ 0]*
W[ 0] + C[ 1]*
W[ 1], C[ 0]*
W[ 1] + C[ 1]*
W[ 2] },
140 { C[ 1]*
W[ 0] + C[ 2]*
W[ 1], C[ 1]*
W[ 1] + C[ 2]*
W[ 2] },
141 { C[ 3]*
W[ 0] + C[ 4]*
W[ 1], C[ 3]*
W[ 1] + C[ 4]*
W[ 2] },
142 { C[ 6]*
W[ 0] + C[ 7]*
W[ 1], C[ 6]*
W[ 1] + C[ 7]*
W[ 2] },
143 { C[10]*
W[ 0] + C[11]*
W[ 1], C[10]*
W[ 1] + C[11]*
W[ 2] },
148 for(vector<CbmKFPixelMeasurement*>::iterator pmIt=vm.begin();
149 pmIt!=vm.end();++pmIt)
151 double resX=(*pmIt)->x-T[0];
152 double resY=(*pmIt)->y-T[1];
153 chi2=resX*resX*
W[0]+2*resY*resX*
W[1] + resY*resY*
W[2];
155 cout<<
"resX="<<resX<<
" resY="<<resY <<
" chi2dist="<<chi2<<endl;
157 vChi2.push_back(chi2);
158 vResidX.push_back(resX);
159 vResidY.push_back(resY);
160 vExp.push_back(
exp(-0.5*chi2));
166 vector<double>::iterator eIt;
167 for(eIt=vExp.begin();eIt!=vExp.end();++eIt)
174 cout<<
"No-detect probability = "<<P0<<endl;
176 for(eIt=vExp.begin();eIt!=vExp.end();++eIt)
178 vProb.push_back(Sum*(*eIt));
183 zeta[0]=0.0;zeta[1]=0.0;idx=0;chi2=0.0;
185 for(eIt=vProb.begin();eIt!=vProb.end();++eIt)
187 zeta[0]+=vResidX[idx]*(*eIt);
188 zeta[1]+=vResidY[idx]*(*eIt);
189 chi2+=vChi2[idx]*(*eIt);
191 cout<<
"Hit "<<idx<<
" Assignment probability = "<<(*eIt)<<endl;
196 cout<<
"Merged resX="<<zeta[0]<<
" resY="<<zeta[1]<<endl;
202 CR[0][0]=-zeta[0]*zeta[0];
203 CR[0][1]=-zeta[0]*zeta[1];
204 CR[1][0]=-zeta[1]*zeta[0];
205 CR[1][1]=-zeta[1]*zeta[1];
207 for(eIt=vProb.begin();eIt!=vProb.end();++eIt)
209 CR[0][0]+=(*eIt)*vResidX[idx]*vResidX[idx];
210 CR[0][1]+=(*eIt)*vResidX[idx]*vResidY[idx];
211 CR[1][0]+=(*eIt)*vResidY[idx]*vResidX[idx];
212 CR[1][1]+=(*eIt)*vResidY[idx]*vResidY[idx];
220 for(k=0;k<2;k++) KD[
i][j]+=K[
i][k]*CR[k][j];
230 for(k=0;k<2;k++) Ga[
i][j]+=KD[
i][k]*K[j][k];
236 T[0]+= K[0][0]*zeta[0] + K[0][1]*zeta[1];
237 T[1]+= K[1][0]*zeta[0] + K[1][1]*zeta[1];
238 T[2]+= K[2][0]*zeta[0] + K[2][1]*zeta[1];
239 T[3]+= K[3][0]*zeta[0] + K[3][1]*zeta[1];
240 T[4]+= K[4][0]*zeta[0] + K[4][1]*zeta[1];
244 C[0]*K[0][0] + C[1]*K[0][1],
245 C[0]*K[1][0] + C[1]*K[1][1], C[1]*K[1][0] + C[2]*K[1][1],
247 C[0]*K[2][0] + C[1]*K[2][1], C[1]*K[2][0] + C[2]*K[2][1],
248 C[3]*K[2][0] + C[4]*K[2][1],
250 C[0]*K[3][0] + C[1]*K[3][1], C[1]*K[3][0] + C[2]*K[3][1],
251 C[3]*K[3][0] + C[4]*K[3][1], C[6]*K[3][0] + C[7]*K[3][1],
253 C[0]*K[4][0] + C[1]*K[4][1], C[1]*K[4][0] + C[2]*K[4][1],
254 C[3]*K[4][0] + C[4]*K[4][1], C[6]*K[4][0] + C[7]*K[4][1],
255 C[10]*K[4][0] + C[11]*K[4][1]
259 for(
i=0;
i<15;
i++) Gs[
i]=C[
i];
263 Gs[ 0]-= KHC[ 0];Gs[ 1]-= KHC[ 1];Gs[ 2]-= KHC[ 2];Gs[ 3]-= KHC[ 3];
264 Gs[ 4]-= KHC[ 4];Gs[ 5]-= KHC[ 5];Gs[ 6]-= KHC[ 6];Gs[ 7]-= KHC[ 7];
265 Gs[ 8]-= KHC[ 8];Gs[ 9]-= KHC[ 9];Gs[10]-= KHC[10];Gs[11]-= KHC[11];
266 Gs[12]-= KHC[12];Gs[13]-= KHC[13];Gs[14]-= KHC[14];
275 C[idx]=P0*C[idx]+(1-P0)*Gs[idx]+Ga[
i][j];
279 cout<<
"Updated params: x="<<T[0]<<
" y="<<T[1]<<
" tx="<<T[2]
280 <<
" ty="<<T[3]<<
" Q="<<T[4]<<endl;
281 cout<<
"chi2 contrib.="<<chi2<<endl;