15 Double_t w = (C[0] +
V[0]) * (C[2] +
V[2]) - (C[1] +
V[1]) * (C[1] +
V[1]);
16 if (w < 1.E-20 || !finite(w)) {
24 Double_t W[3] = {w * (C[2] +
V[2]), -w * (C[1] +
V[1]), w * (C[0] +
V[0])};
27 track.
GetRefChi2() += zeta[0] * zeta[0] *
W[0] + 2 * zeta[0] * zeta[1] *
W[1] + zeta[1] * zeta[1] *
W[2];
31 {C[0] *
W[0] + C[1] *
W[1], C[0] *
W[1] + C[1] *
W[2]},
32 {C[1] *
W[0] + C[2] *
W[1], C[1] *
W[1] + C[2] *
W[2]},
33 {C[3] *
W[0] + C[4] *
W[1], C[3] *
W[1] + C[4] *
W[2]},
34 {C[6] *
W[0] + C[7] *
W[1], C[6] *
W[1] + C[7] *
W[2]},
35 {C[10] *
W[0] + C[11] *
W[1], C[10] *
W[1] + C[11] *
W[2]},
38 T[0] -= K[0][0] * zeta[0] + K[0][1] * zeta[1];
39 T[1] -= K[1][0] * zeta[0] + K[1][1] * zeta[1];
40 T[2] -= K[2][0] * zeta[0] + K[2][1] * zeta[1];
41 T[3] -= K[3][0] * zeta[0] + K[3][1] * zeta[1];
42 T[4] -= K[4][0] * zeta[0] + K[4][1] * zeta[1];
45 C[0] * K[0][0] + C[1] * K[0][1], C[0] * K[1][0] + C[1] * K[1][1], C[1] * K[1][0] + C[2] * K[1][1],
47 C[0] * K[2][0] + C[1] * K[2][1], C[1] * K[2][0] + C[2] * K[2][1], C[3] * K[2][0] + C[4] * K[2][1],
49 C[0] * K[3][0] + C[1] * K[3][1], C[1] * K[3][0] + C[2] * K[3][1], C[3] * K[3][0] + C[4] * K[3][1],
50 C[6] * K[3][0] + C[7] * K[3][1],
52 C[0] * K[4][0] + C[1] * K[4][1], C[1] * K[4][0] + C[2] * K[4][1], C[3] * K[4][0] + C[4] * K[4][1],
53 C[6] * K[4][0] + C[7] * K[4][1], C[10] * K[4][0] + C[11] * K[4][1]};
86 vector<CbmKFPixelMeasurement*>& vm,
89 vector<double>& vProb)
91 const double Pdetect = 0.90;
92 const double gateEff = 0.99;
98 double gateArea = gateX * gateY;
100 int ndf = 2, idx,
i, j, k;
102 vector<double> vResidX;
103 vector<double> vResidY;
104 vector<double> vChi2;
108 cout <<
"PDAF: " << vm->size() <<
" hits validated" << endl;
109 cout <<
"Initial params: x=" << T[0] <<
" y=" << T[1] <<
" tx=" << T[2] <<
" ty=" << T[3] <<
" Q=" << T[4] << endl;
110 cout <<
"GateX=" << gateX <<
" GateY=" << gateY << endl;
120 const double* V = (*vm.begin())->V;
124 Sk = (C[0] + V[0]) * (C[2] + V[2]) - (C[1] + V[1]) * (C[1] + V[1]);
128 double Lambda = 1. / 1.;
130 Ck = 2.0 * 3.1415926 *
sqrt(Sk) * (1.0 - Pdetect * gateEff) / (gateArea * Pdetect * gateEff) * Lambda;
139 double W[3] = {w * (C[2] + V[2]), -w * (C[1] + V[1]), w * (C[0] + V[0])};
141 {
C[0] *
W[0] +
C[1] *
W[1],
C[0] *
W[1] +
C[1] *
W[2]},
142 {
C[1] *
W[0] +
C[2] *
W[1],
C[1] *
W[1] +
C[2] *
W[2]},
143 {
C[3] *
W[0] +
C[4] *
W[1],
C[3] *
W[1] +
C[4] *
W[2]},
144 {
C[6] *
W[0] +
C[7] *
W[1],
C[6] *
W[1] +
C[7] *
W[2]},
145 {
C[10] *
W[0] +
C[11] *
W[1],
C[10] *
W[1] +
C[11] *
W[2]},
150 for (vector<CbmKFPixelMeasurement*>::iterator pmIt = vm.begin(); 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) {
171 double P0 = Ck *
Sum;
173 cout <<
"No-detect probability = " << P0 << endl;
175 for (eIt = vExp.begin(); eIt != vExp.end(); ++eIt) {
176 vProb.push_back(Sum * (*eIt));
186 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) {
208 CR[0][0] += (*eIt) * vResidX[idx] * vResidX[idx];
209 CR[0][1] += (*eIt) * vResidX[idx] * vResidY[idx];
210 CR[1][0] += (*eIt) * vResidY[idx] * vResidX[idx];
211 CR[1][1] += (*eIt) * vResidY[idx] * vResidY[idx];
215 for (
i = 0;
i < 5;
i++)
216 for (j = 0; j < 2; j++) {
218 for (k = 0; k < 2; k++)
219 KD[
i][j] += K[
i][k] * CR[k][j];
225 for (
i = 0;
i < 5;
i++)
226 for (j = 0; j < 5; j++) {
228 for (k = 0; k < 2; k++)
229 Ga[
i][j] += KD[
i][k] * K[j][k];
235 T[0] +=
K[0][0] * zeta[0] +
K[0][1] * zeta[1];
236 T[1] +=
K[1][0] * zeta[0] +
K[1][1] * zeta[1];
237 T[2] +=
K[2][0] * zeta[0] +
K[2][1] * zeta[1];
238 T[3] +=
K[3][0] * zeta[0] +
K[3][1] * zeta[1];
239 T[4] +=
K[4][0] * zeta[0] +
K[4][1] * zeta[1];
242 C[0] *
K[0][0] +
C[1] *
K[0][1],
C[0] *
K[1][0] +
C[1] *
K[1][1],
C[1] *
K[1][0] +
C[2] *
K[1][1],
244 C[0] *
K[2][0] +
C[1] *
K[2][1],
C[1] *
K[2][0] +
C[2] *
K[2][1],
C[3] *
K[2][0] +
C[4] *
K[2][1],
246 C[0] *
K[3][0] +
C[1] *
K[3][1],
C[1] *
K[3][0] +
C[2] *
K[3][1],
C[3] *
K[3][0] +
C[4] *
K[3][1],
247 C[6] *
K[3][0] +
C[7] *
K[3][1],
249 C[0] *
K[4][0] +
C[1] *
K[4][1],
C[1] *
K[4][0] +
C[2] *
K[4][1],
C[3] *
K[4][0] +
C[4] *
K[4][1],
250 C[6] *
K[4][0] +
C[7] *
K[4][1],
C[10] *
K[4][0] +
C[11] *
K[4][1]};
253 for (
i = 0;
i < 15;
i++)
278 for (
i = 0;
i < 5;
i++)
279 for (j = 0; j <=
i; j++) {
280 C[idx] = P0 *
C[idx] + (1 - P0) * Gs[idx] + Ga[
i][j];
284 cout <<
"Updated params: x=" <<
T[0] <<
" y=" <<
T[1] <<
" tx=" <<
T[2] <<
" ty=" <<
T[3] <<
" Q=" <<
T[4] << endl;
285 cout <<
"chi2 contrib.=" << chi2 << endl;
vector< Double_t > W(vector< Double_t > dist, Double_t sig)
Int_t Filter(CbmKFTrackInterface &track)
static void FilterPDAF(CbmKFTrackInterface &track, std::vector< CbmKFPixelMeasurement * > &vm, double gateX, double gateY, std::vector< double > &vProb)
virtual Double_t * GetTrack()
Is it electron.
virtual Int_t & GetRefNDF()
Chi^2 after fit.
virtual Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
virtual Double_t & GetRefChi2()
array[15] of covariance matrix
RVec< PromoteType< T > > sqrt(const RVec< T > &v)
RVec< PromoteType< T > > exp(const RVec< T > &v)
std::size_t Sum(const RVec< bool > &v, std::size_t zero=0ul)
RooConstVar & C(double value)