BOSS 7.0.1
BESIII Offline Software System
Loading...
Searching...
No Matches
HTrackParameter.cxx
Go to the documentation of this file.
1#include "VertexFit/HTrackParameter.h"
2#include "VertexFit/WTrackParameter.h"
3#include "VertexFit/BField.h"
4#include "CLHEP/Units/PhysicalConstants.h"
5using namespace CLHEP;
6const double alpha = -0.00299792458;
7//const double bField = 1.0;
8
10 m_trackID = -1;
11 m_partID = -1;
12 m_hel = HepVector(5, 0);
13 m_eHel = HepSymMatrix(5, 0);
14}
15
17 m_trackID = htrk.m_trackID;
18 m_partID = htrk.m_partID;
19 m_hel = htrk.m_hel;
20 m_eHel = htrk.m_eHel;
21}
22
23HTrackParameter &HTrackParameter :: operator = (const HTrackParameter &htrk) {
24 m_trackID = htrk.m_trackID;
25 m_partID = htrk.m_partID;
26 m_hel = htrk.m_hel;
27 m_eHel = htrk.m_eHel;
28 return (*this);
29}
30
31//
32// for DstMdcKalTrack --> HTrackParameter
33//
34
35
36HTrackParameter::HTrackParameter(const HepVector h, const HepSymMatrix eH,
37 const int trackid, const int partid) {
38
39 m_hel = HepVector(5, 0);
40 m_eHel = HepSymMatrix(5, 0);
41
42 m_trackID = trackid;
43 m_partID = partid;
44 m_hel = h;
45 m_eHel = eH;
46
47}
48
49//
50// for DstMdcTrack --> HTrackParameter
51//
52
53
54HTrackParameter::HTrackParameter(const HepVector h, const double eH[],
55 const int trackid, const int partid) {
56
57 m_hel = HepVector(5, 0);
58 m_eHel = HepSymMatrix(5, 0);
59
60 m_trackID = trackid;
61 m_partID = partid;
62 m_hel = h;
63 int k = 0;
64 for(int i = 0; i < 5; i++){
65 for(int j = 0; j < 5; j++) {
66 m_eHel[i][j] = eH[k];
67 m_eHel[j][i] = eH[k];
68 k++;
69 }
70 }
71}
72
73//
74// WTrackParameter --> HTrackParameter
75//
76
78
79 HepVector p(3, 0);
80 HepVector x(3, 0);
81 for(int i = 0; i < 3; i++) {
82 p[i] = wtrk.w()[i];
83 x[i] = wtrk.w()[i+4];
84 }
85
86 HTrackParameter htrk(wtrk.charge(), p, x);
87 HepMatrix A(5, 3, 0);
88 HepMatrix B(5, 3, 0);
89
90 A = htrk.dHdx(p, x);
91 B = htrk.dHdp(p, x);
92 HepMatrix T(5, 7, 0);
93 for(int i = 0; i < 5; i++) {
94 for(int j = 0; j < 3; j++){
95 T[i][j] = B[i][j];
96 T[i][j+4] = A[i][j];
97 }
98 }
99
100 HepSymMatrix eH(5, 0);
101 eH = (wtrk.Ew()).similarity(T);
102 int m_trackID = -1;
103 double mass = (wtrk.p()).m();
104 int m_partID = -1;
105 for(int i = 0; i < 5; i++) {
106 if(fabs(mass - xmass(i)) < 0.01) {
107 m_partID = i;
108 break;
109 }
110 }
111 // htrk.setTrackID(trackID);
112 // htrk.setPartID(partID);
113 htrk.setEHel(eH);
114 m_hel = htrk.hel();
115 m_eHel = htrk.eHel();
116}
117
118//
119// radius and centers of Helix in xy plane
120//
121
123 double bField = VertexFitBField::instance()->getBFieldZ(x3());
124 int charge = m_hel[2] > 0 ? +1: -1;
125 double a = alpha * bField * charge;
126 double pxy = charge/m_hel[2];
127 return (pxy/a);
128}
129
131 double bField = VertexFitBField::instance()->getBFieldZ(x3());
132 int charge = m_hel[2] > 0 ? +1: -1;
133 double a = alpha * bField * charge;
134 double pxy = charge/m_hel[2];
135 double rad = pxy/a;
136 double x = (m_hel[0] + rad) * cos(m_hel[1]);
137 double y = (m_hel[0] + rad) * sin(m_hel[1]);
138 double z = 0.0;
139 return HepPoint3D(x, y, z);
140}
141
142//
143// Helix parameter from instantaneous position and momentum
144//
145
146HTrackParameter::HTrackParameter(const int charge, const HepVector p, const HepVector vx) {
147 m_trackID = -1;
148 m_partID = -1;
149 m_hel = HepVector(5, 0);
150 m_eHel = HepSymMatrix(5, 0);
151
152 HepPoint3D xyz(vx[0], vx[1], vx[2]);
153 double bField = VertexFitBField::instance()->getBFieldZ(xyz);
154 //std::cout << "bField in HTrackParameter(charge,p,vx) = " << bField << std::endl;
155
156 double a = alpha * bField * charge;
157 double px = p[0];
158 double py = p[1];
159 double pz = p[2];
160
161 double x = vx[0];
162 double y = vx[1];
163 double z = vx[2];
164
165 double pxy = sqrt(px*px+py*py);
166 double T = sqrt((px+a*y)*(px+a*y)+(py-a*x)*(py-a*x));
167 double J= (x*px+y*py)/T*a/pxy;
168
169 double drho = (pxy/a)-(T/a);
170 double phi0 = fmod((4*CLHEP::pi)+atan2(0-px-a*y, py-a*x), (2*CLHEP::pi));
171 double kappa = charge/pxy;
172 double dz = z - (pz/a) *asin(J);
173 double lambda = pz/pxy;
174
175 m_hel[0] = drho; m_hel[1] = phi0; m_hel[2] = kappa;
176 m_hel[3] = dz; m_hel[4] = lambda;
177}
178
179//
180// derivative Matrix, used in Kalman Vertex Fit A= dH/dx
181//
182
183HepMatrix HTrackParameter::dHdx(const HepVector p, const HepVector vx){
184 HepPoint3D xyz(vx[0], vx[1], vx[2]);
185 double bField = VertexFitBField::instance()->getBFieldZ(xyz);
186 //std::cout << "bField in dHdx(p,vx) = " << bField << std::endl;
187
188 double a = alpha * bField * charge();
189 double px = p[0];
190 double py = p[1];
191 double pz = p[2];
192
193 double x = vx[0];
194 double y = vx[1];
195 // double z = vx[2];
196
197 // double pxy = sqrt(px*px+py*py);
198 double T = sqrt((px+a*y)*(px+a*y)+(py-a*x)*(py-a*x));
199 // double J= (x*px+y*py)/T*a/pxy;
200
201 HepMatrix m_A(5, 3, 0);
202
203 m_A[0][0] = (py-a*x)/T;
204 m_A[0][1] = 0 -(px + a*y)/T;
205 m_A[1][0] = 0- a*(px + a*y)/T/T;
206 m_A[1][1] = 0 - a * (py - a*x)/T/T;
207 m_A[3][0] = 0 - (pz/T)*(px + a*y)/T;
208 m_A[3][1] = 0 - (pz/T)*(py - a*x)/T;
209 m_A[3][2] = 1;
210
211 return m_A;
212}
213
214//
215// derivative Matrix, used in Kalman Vertex Fit B= dH/dp
216//
217
218HepMatrix HTrackParameter::dHdp(const HepVector p, const HepVector vx){
219 HepPoint3D xyz(vx[0], vx[1], vx[2]);
220 double bField = VertexFitBField::instance()->getBFieldZ(xyz);
221
222 double a = alpha * bField * charge();
223 double px = p[0];
224 double py = p[1];
225 double pz = p[2];
226
227 double x = vx[0];
228 double y = vx[1];
229 // double z = vx[2];
230
231 double pxy = sqrt(px*px+py*py);
232 double T = sqrt((px+a*y)*(px+a*y)+(py-a*x)*(py-a*x));
233 double J= (x*px+y*py)/T*a/pxy;
234
235 HepMatrix m_B(5, 3, 0);
236
237 m_B[0][0] = (px/pxy - (px+a*y)/T)/a;
238 m_B[0][1] = (py/pxy - (py-a*x)/T)/a;
239 m_B[1][0] = 0 -(py-a*x)/T/T;
240 m_B[1][1] = (px + a*y)/T/T;
241 m_B[2][0] = 0-charge() *px/pxy/pxy/pxy;
242 m_B[2][1] = 0-charge() *py/pxy/pxy/pxy;
243 m_B[3][0] = (pz/a)*(py/pxy/pxy-(py-a*x)/T/T);
244 m_B[3][1] = 0-(pz/a)*(px/pxy/pxy-(px+a*y)/T/T);
245 m_B[3][2] = 0 - asin(J)/a;
246 m_B[4][0] = 0 - (px/pxy)*(pz/pxy)/pxy;
247 m_B[4][1] = 0 - (py/pxy)*(pz/pxy)/pxy;
248 m_B[4][2] = 1/pxy;
249
250 return m_B;
251}
252
253//
254// HTrackParameter --> WTrackParameter
255//
256
258
259 WTrackParameter wtrk;
260 wtrk.setCharge(charge());
261 HepVector w(7,0);
262 HepMatrix dWdh(7, 5, 0);
263
264 double ptrk = p3().rho(); double E = sqrt(ptrk*ptrk + mass * mass);
265 double px = p3().x();
266 double py = p3().y();
267 double pz = p3().z();
268 double x0 = x3().x();
269 double y0 = x3().y();
270 double z0 = x3().z();
271 w[0] = px; w[1] = py; w[2] = pz; w[3] = E;
272 w[4] = x0; w[5] = y0; w[6] = z0;
273 wtrk.setW(w);
274 dWdh[0][1] = -py; dWdh[0][2] = 0 - px/kappa();
275 dWdh[1][1] = px; dWdh[1][2] = 0 - py/kappa();
276 dWdh[2][2] = 0 - pz/kappa(); dWdh[2][4] = charge()/kappa();
277 dWdh[3][2] = 0 - (1 + lambda() * lambda())/ E / kappa() / kappa() / kappa();
278 dWdh[3][4] = lambda() / E / kappa() / kappa();
279 dWdh[4][0] = cos(phi0()); dWdh[4][1] = 0 - y0;
280 dWdh[5][0] = sin(phi0()); dWdh[5][1] = x0;
281 dWdh[6][3] = 1;
282 HepSymMatrix Ew(7, 0);
283 Ew = m_eHel.similarity(dWdh);
284 wtrk.setEw(Ew);
285 return wtrk;
286}
287
289 WTrackParameter wtrk;
290 if(m_partID > -1 && m_partID < 5) {
291 double mass = xmass(m_partID);
292 wtrk = wTrack(mass);
293 }
294 return wtrk;
295}
296
297//
298// Utilities functions
299//
300
301double HTrackParameter::xmass(int n) const {
302 double mass[5] = {0.000511, 0.105658, 0.139570,0.493677, 0.938272};
303 if(n < 0 || n >=5) return 0.0;
304 return mass[n];
305}
306
307
308//
309// Intersection position of two helice in xy plane
310//
312 double bField1 = VertexFitBField::instance()->getBFieldZ(x3());
313 double bField2 = VertexFitBField::instance()->getBFieldZ(htrk.x3());
314
315 HepPoint3D pos1 = x3();
316 HepPoint3D pos2 = htrk.x3();
317 double rad1 = radius();
318 double rad2 = htrk.radius();
319 HepPoint3D xc1 = center();
320 HepPoint3D xc2 = htrk.center();
321 //
322 // requires the solution of
323 // a * y**2 + b*y + c = 0
324 // and
325 // x = (rt - 2*yt * y) / (2 * xt)
326 // where
327 // xt = xc2.x() - xc1.x()
328 // yt = xc2.y() - xc1.y()
329 // rt = rad1*rad1-rad2*rad2-xc1.perp2()+xc2.perp2()
330 // a = 1 + yt*yt/(xt*xt);
331 // b = 2*xc1.x()*yt/xt-yt*rt/(xt*xt)-2*xc1.y();
332 // c = rt*rt/(4*xt*xt)-xc1.x()*rt/xt-rad1*rad1+xc1.perp2();
333 //
334
335 double xt = xc2.x() - xc1.x();
336 double yt = xc2.y() - xc1.y();
337 if(xt == 0 && yt == 0) return HepPoint3D(999,999,999);
338 double rt = rad1*rad1-rad2*rad2-xc1.perp2()+xc2.perp2();
339 double x1, y1, x2, y2;
340 if( xt != 0) {
341 double a = 1 + yt*yt/(xt*xt);
342 if(a == 0) return HepPoint3D(999,999,999);
343 double b = 2*xc1.x()*yt/xt-yt*rt/(xt*xt)-2*xc1.y();
344 double c = rt*rt/(4*xt*xt)-xc1.x()*rt/xt-rad1*rad1+xc1.perp2();
345 double d = b*b - 4 * a * c;
346 if( d < 0) return HepPoint3D(999,999,999);
347 d = sqrt(d);
348 // two solution of intersection points
349
350 y1 = (-b + d)/(2*a);
351 x1 = (rt - 2 * yt * y1)/(2*xt);
352
353 y2 = (-b - d)/(2*a);
354 x2 = (rt - 2 * yt * y2)/(2*xt);
355 } else {
356 double a = 1 + xt*xt/(yt*yt);
357 if(a == 0) return HepPoint3D(999,999,999);
358 double b = 2*xc1.y()*xt/yt-xt*rt/(yt*yt)-2*xc1.x();
359 double c = rt*rt/(4*yt*yt)-xc1.y()*rt/yt-rad1*rad1+xc1.perp2();
360 double d = b*b - 4 * a * c;
361 if( d < 0) return HepPoint3D(999,999,999);
362 d = sqrt(d);
363 // two solution of intersection points
364
365 x1 = (-b + d)/(2*a);
366 y1 = (rt - 2 * xt * x1)/(2*yt);
367
368 x2 = (-b - d)/(2*a);
369 y2 = (rt - 2 * xt * x2)/(2*yt);
370 }
371
372 double z1[2], z2[2], J1[2], J2[2];
373
374
375 double a1 = alpha * bField1 * charge();
376 double a2 = alpha * bField2 * htrk.charge();
377 // z for solotion one
378 J1[0] = a1*((x1-x3().x())*p3().x()+(y1-x3().y())*p3().y())/p3().perp2();
379 J1[1] = a2*((x1-htrk.x3().x())*htrk.p3().x()+(y1-htrk.x3().y())*htrk.p3().y())/htrk.p3().perp2();
380 z1[0] = x3().z()+p3().z()/a1*asin(J1[0]);
381 z1[1] = htrk.x3().z()+htrk.p3().z()/a2*asin(J1[1]);
382 // z for solotion two
383 J2[0] = a1*((x2-x3().x())*p3().x()+(y2-x3().y())*p3().y())/p3().perp2();
384 J2[1] = a2*((x2-htrk.x3().x())*htrk.p3().x()+(y2-htrk.x3().y())*htrk.p3().y())/htrk.p3().perp2();
385 z2[0] = x3().z()+p3().z()/a2*asin(J2[0]);
386 z2[1] = htrk.x3().z()+htrk.p3().z()/a2*asin(J2[1]);
387
388 // take the solution if delta z is small
389
390 if(fabs(z1[0]-z1[1]) < fabs(z2[0]-z2[1])) {
391 return HepPoint3D(x1, y1, 0.5*(z1[0]+z1[1]));
392 } else {
393 return HepPoint3D(x2, y2, 0.5*(z2[0]+z2[1]));
394 }
395}
396
397
398
399//
400// intersection position of helix and Plane
401//
402
404 return HepPoint3D(999,999,999);
405}
406
407//
408// intersection position of helix and a cylinder
409//
410
412 return HepPoint3D(999,999,999);
413}
414
415//
416// intersection position of helix and a cone
417//
418
420 return HepPoint3D(999,999,999);
421}
422
423//
424// Minimum distance of two helice
425//
426
428 int ifail;
429 double h = radius();
430 double g = G.radius();
431 double phiH0 = fmod((4*CLHEP::pi)+atan2(p3().y(), p3().x()), (2*CLHEP::pi));
432 double phiG0 = fmod((4*CLHEP::pi)+atan2(G.p3().y(), G.p3().x()), (2*CLHEP::pi));
433 double lamH = lambda();
434 double lamG = G.lambda();
435 double a = x3().x() - G.x3().x() + g*sin(phiG0) - h*sin(phiH0);
436 double b = x3().y() - G.x3().y() - g*cos(phiG0) + h*cos(phiH0);
437 double c1 = h*lamH*lamH;
438 double c2 = 0 - g*lamG*lamG;
439 double d1 = 0 - g*lamG*lamH;
440 double d2 = h*lamG*lamH;
441 double e1 = lamH*(x3().z() - G.x3().z() - h*phiH0*lamH + g*phiG0*lamG);
442 double e2 = lamG*(x3().z() - G.x3().z() - h*phiH0*lamH + g*phiG0*lamG);
443
444 HepVector phiE(2, 0);
445 phiE[0] = phiH0;
446 phiE[1] = phiG0;
447 for(int iter = 0; iter < 100; iter++) {
448 HepVector z(2, 0);
449 HepSymMatrix Omega(2, 0);
450 double phiH = phiE[0];
451 double phiG = phiE[1];
452 z[0] = cos(phiH)*(a-g*sin(phiG))+sin(phiH)*(b+g*cos(phiG))+c1*phiH+d1*phiG+e1;
453 z[1] = cos(phiG)*(a+h*sin(phiH))+sin(phiG)*(b-h*cos(phiH))+c2*phiG+d2*phiH+e2;
454 Omega[0][0] = 0-sin(phiH)*(a-g*sin(phiG))+cos(phiH)*(b+g*cos(phiG))+c1;
455 Omega[0][1] = -g*cos(phiH)*cos(phiG)-g*sin(phiH)*sin(phiG)+d1;
456 Omega[1][0] =h*cos(phiH)*cos(phiG)+h*sin(phiG)*sin(phiH)+d2;
457 Omega[1][1] = -sin(phiG)*(a+h*sin(phiH))+cos(phiG)*(b-h*cos(phiH))+c2;
458 HepVector phi(2, 0);
459 phi = phiE - Omega.inverse(ifail) * z;
460 if((fabs(phi[0]-phiE[0])<1E-3) && (fabs(phi[1]-phiE[1])<1E-3)) {
461 phiE = phi;
462 // std::cout << "number of iteration = " << iter <<std::endl;
463 break;
464 }
465 phiE = phi;
466 }
467
468 double phiH = phiE[0];
469 double phiG = phiE[1];
470 HepPoint3D posH = HepPoint3D(x3().x()+h*(sin(phiH)-sin(phiH0)), x3().y()+h*(cos(phiH0)-cos(phiH)), x3().z()+lamH*(phiH-phiH0));
471 HepPoint3D posG = HepPoint3D(G.x3().x()+g*(sin(phiG)-sin(phiG0)), G.x3().y()+g*(cos(phiG0)-cos(phiG)), G.x3().z()+lamG*(phiG-phiG0));
472 double dis = (posH-posG).rho();
473 mpos = 0.5*(posH+posG);
474 return dis;
475}
476//
477// Minimum distance of helix and a line
478//
double mass
const Int_t n
Double_t e1
Double_t e2
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
const double alpha
const double xmass[5]
Definition: Gam4pikp.cxx:50
const double alpha
double sin(const BesAngle a)
double cos(const BesAngle a)
HepGeom::Point3D< double > HepPoint3D
HepPoint3D positionCylinder(const double) const
HepPoint3D positionTwoHelix(const HTrackParameter) const
HepMatrix dHdp(const HepVector p, const HepVector x)
double minDistanceTwoHelix(const HTrackParameter G, HepPoint3D &pos)
HepMatrix dHdx(const HepVector p, const HepVector x)
double xmass(const int i) const
WTrackParameter wTrack() const
HepPoint3D positionPlane(const double) const
HepPoint3D center() const
double radius() const
HepPoint3D positionCone() const