12 #include <klm/bklm/modules/bklmTracking/BKLMTrackFitter.h>
15 #include <klm/bklm/geometry/GeometryPar.h>
16 #include <klm/bklm/geometry/Module.h>
19 #include <framework/logging/Logger.h>
22 #include <CLHEP/Matrix/DiagMatrix.h>
23 #include <CLHEP/Matrix/Matrix.h>
29 using namespace CLHEP;
31 using namespace Belle2::bklm;
34 enum { VX = 0, VY = 1, VZ = 2 };
37 enum { AY = 0, BY = 1, AZ = 2, BZ = 3 };
40 enum { MY = 0, MZ = 1 };
43 BKLMTrackFitter::BKLMTrackFitter():
67 if (listHitSector.size() < 2) {
74 HepSymMatrix error(2, 0);
75 HepVector gloEta(2, 0);
76 HepSymMatrix gloError(2, 0);
80 HepVector sectorPar(4, 0);
81 HepSymMatrix sectorErr(4, 0);
82 HepVector globalPar(4, 0);
83 HepSymMatrix globalErr(4, 0);
87 globalPar.sub(1, eta);
88 globalErr.sub(1, error);
91 sectorPar.sub(1, eta);
92 sectorErr.sub(1, error);
97 globalPar.sub(3, eta);
98 globalErr.sub(3, error);
101 sectorPar.sub(3, eta);
102 sectorErr.sub(3, error);
108 (*listHitSector.begin())->getSector(), 1);
110 Hep3Vector p1(0, 0, 0); Hep3Vector p2(0, 0, 0);
113 double y1 = sectorPar[0] + sectorPar[1] * x1;
114 double y2 = sectorPar[0] + sectorPar[1] * x2;
115 double z1 = sectorPar[2] + sectorPar[3] * x1;
116 double z2 = sectorPar[2] + sectorPar[3] * x2;
117 p1.setX(x1); p1.setY(y1); p1.setZ(z1);
118 p2.setX(x2); p2.setY(y2); p2.setZ(z2);
123 if (gl2[0] != gl1[0]) {
124 globalPar[1] = (gl2[1] - gl1[1]) / (gl2[0] - gl1[0]);
125 globalPar[0] = gl1[1] - globalPar[1] * gl1[0];
126 globalPar[3] = (gl2[2] - gl1[2]) / (gl2[0] - gl1[0]);
127 globalPar[2] = gl1[2] - globalPar[3] * gl1[0];
128 globalErr = sectorErr;
130 globalPar[1] = DBL_MAX;
131 globalPar[0] = DBL_MAX;
132 globalPar[3] = DBL_MAX;
133 globalPar[2] = DBL_MAX;
134 globalErr = sectorErr;
163 double x, y, z, dy, dz;
175 CLHEP::Hep3Vector globalPos(hit->getGlobalPosition()[0], hit->getGlobalPosition()[1], hit->getGlobalPosition()[2]);
188 double distance = sqrt(dy * dy + dz * dz);
194 HepMatrix errors(2, 2, 0);
195 HepMatrix A(2, 4, 0);
210 int nStrips = hit->getPhiStripMax() - hit->getPhiStripMin() + 1;
211 double dn = nStrips - 1.5;
212 double factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.60;
213 hit_localPhiErr = hit_localPhiErr * sqrt(factor);
215 nStrips = hit->getZStripMax() - hit->getZStripMin() + 1;
217 factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.55;
218 hit_localZErr = hit_localZErr * sqrt(factor);
221 error = sqrt(errors[ MY ][ MY ] +
223 pow(hit_localPhiErr, 2) +
224 pow(hit_localZErr, 2));
227 sigma = distance / error;
248 double x_mea = hit->getGlobalPosition()[0];
249 double y_mea = hit->getGlobalPosition()[1];
250 double z_mea = hit->getGlobalPosition()[2];
255 double dx = x_pre - x_mea;
256 double dz = z_pre - z_mea;
258 double distance = sqrt(dx * dx + dz * dz);
262 HepMatrix errors(2, 2, 0);
263 HepMatrix A(2, 4, 0);
281 int nStrips = hit->getPhiStripMax() - hit->getPhiStripMin() + 1;
282 double dn = nStrips - 1.5;
283 double factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.60;
284 hit_localPhiErr = hit_localPhiErr * sqrt(factor);
286 nStrips = hit->getZStripMax() - hit->getZStripMin() + 1;
288 factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.55;
289 hit_localZErr = hit_localZErr * sqrt(factor);
293 double sinphi = globalOrigin[1] / globalOrigin.mag();
294 double cosphi = globalOrigin[0] / globalOrigin.mag();
296 HepMatrix globalHitErr(3, 3, 0);
297 globalHitErr[0][0] = pow(hit_localPhiErr * sinphi, 2);
298 globalHitErr[0][1] = (hit_localPhiErr * sinphi) * (hit_localPhiErr * cosphi);
299 globalHitErr[0][2] = 0;
300 globalHitErr[1][1] = pow(hit_localPhiErr * cosphi, 2);;
301 globalHitErr[1][0] = (hit_localPhiErr * sinphi) * (hit_localPhiErr * cosphi);
302 globalHitErr[1][2] = 0;
303 globalHitErr[2][2] = pow(hit_localZErr, 2);
304 globalHitErr[2][0] = 0;
305 globalHitErr[2][1] = 0;
315 HepMatrix error_mea(2, 2, 0);
316 error = sqrt(errors[ MY ][ MY ] +
324 sigma = distance / error;
337 int depDir,
int indDir)
342 std::list< BKLMHit2d* >::iterator iHit;
344 Hep3Vector localHitPos;
345 HepMatrix localHitErr(3, 3, 0);
352 int noPoints = hitList.size();
355 HepMatrix A(noPoints, 2, 0);
358 HepVector y(noPoints, 0);
362 HepDiagMatrix V_y_inverse(noPoints, 0);
366 HepSymMatrix V_A, V_A_inverse;
368 iHit = hitList.begin();
370 int section = hit->getSection();
371 int sector = hit->getSector();
377 for (iHit = hitList.begin(); iHit != hitList.end(); ++iHit) {
380 if (hit->getSection() != section || hit->getSector() != sector) {
388 CLHEP::Hep3Vector globalPos;
389 globalPos[0] = hit->getGlobalPosition()[0];
390 globalPos[1] = hit->getGlobalPosition()[1];
391 globalPos[2] = hit->getGlobalPosition()[2];
399 int nStrips = hit->getPhiStripMax() - hit->getPhiStripMin() + 1;
400 double dn = nStrips - 1.5;
401 double factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.60;
402 hit_localPhiErr = hit_localPhiErr * sqrt(factor);
404 nStrips = hit->getZStripMax() - hit->getZStripMin() + 1;
406 factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.55;
407 hit_localZErr = hit_localZErr * sqrt(factor);
410 localHitErr[0][0] = 0.0;
411 localHitErr[0][1] = 0;
412 localHitErr[0][2] = 0;
413 localHitErr[1][1] = hit_localPhiErr;
414 localHitErr[1][0] = 0;
415 localHitErr[1][2] = 0;
416 localHitErr[2][2] = hit_localZErr;
417 localHitErr[2][0] = 0;
418 localHitErr[2][1] = 0;
423 indPos = localHitPos.x();
427 indPos = localHitPos.y();
431 indPos = localHitPos.z();
435 B2DEBUG(20,
"error in klm_trackSectorFit: illegal direction");
442 depPos = localHitPos.x();
446 depPos = localHitPos.y();
450 depPos = localHitPos.z();
454 B2DEBUG(20,
"error in klm_trackSectorFit: illegal direction");
460 A[ n ][ 1 ] = indPos;
464 if (localHitErr[ depDir ][ depDir ] > 0.0) {
465 V_y_inverse[ n ][ n ] = 1.0 / localHitErr[ depDir ][ depDir ];
467 V_y_inverse[ n ][ n ] = DBL_MAX;
472 V_A_inverse = V_y_inverse.similarityT(A);
475 V_A = V_A_inverse.inverse(ierr);
477 eta = V_A * A.T() * V_y_inverse * y;
481 HepMatrix residual = y - A * eta;
482 HepMatrix chisqr = residual.T() * V_y_inverse * residual;
484 return (chisqr.trace());
492 int depDir,
int indDir)
497 HepMatrix globalHitErr(3, 3, 0);
503 int noPoints = hitList.size();
506 HepMatrix A(noPoints, 2, 0);
509 HepVector y(noPoints, 0);
513 HepDiagMatrix V_y_inverse(noPoints, 0);
516 HepSymMatrix V_A, V_A_inverse;
522 for (std::list< BKLMHit2d* >::iterator iHit = hitList.begin(); iHit != hitList.end(); ++iHit) {
530 CLHEP::Hep3Vector globalPos;
531 globalPos[0] = hit->getGlobalPosition()[0];
532 globalPos[1] = hit->getGlobalPosition()[1];
533 globalPos[2] = hit->getGlobalPosition()[2];
541 int nStrips = hit->getPhiStripMax() - hit->getPhiStripMin() + 1;
542 double dn = nStrips - 1.5;
543 double factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.60;
544 hit_localPhiErr = hit_localPhiErr * sqrt(factor);
546 nStrips = hit->getZStripMax() - hit->getZStripMin() + 1;
548 factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.55;
549 hit_localZErr = hit_localZErr * sqrt(factor);
553 double sinphi = globalOrigin[1] / globalOrigin.mag();
554 double cosphi = globalOrigin[0] / globalOrigin.mag();
556 globalHitErr[0][0] = pow(hit_localPhiErr * sinphi, 2);
557 globalHitErr[0][1] = (hit_localPhiErr * sinphi) * (hit_localPhiErr * cosphi);
558 globalHitErr[0][2] = 0;
559 globalHitErr[1][1] = pow(hit_localPhiErr * cosphi, 2);;
560 globalHitErr[1][0] = (hit_localPhiErr * sinphi) * (hit_localPhiErr * cosphi);
561 globalHitErr[1][2] = 0;
562 globalHitErr[2][2] = pow(hit_localZErr, 2);;
563 globalHitErr[2][0] = 0;
564 globalHitErr[2][1] = 0;
569 indPos = globalPos.x();
573 indPos = globalPos.y();
577 indPos = globalPos.z();
581 B2DEBUG(20,
"error in bklm trackFit: illegal direction");
588 depPos = globalPos.x();
592 depPos = globalPos.y();
596 depPos = globalPos.z();
600 B2DEBUG(20,
"error in bklm trackFit: illegal direction");
606 A[ n ][ 1 ] = indPos;
610 double error_raw = globalHitErr[indDir][indDir] + globalHitErr[depDir][depDir];
613 double weight = error_raw;
615 V_y_inverse[ n ][ n ] = 1.0 / weight;
617 V_y_inverse[ n ][ n ] = DBL_MAX;
625 V_A_inverse = V_y_inverse.similarityT(A);
628 V_A = V_A_inverse.inverse(ierr);
630 eta = V_A * A.T() * V_y_inverse * y;
634 HepMatrix residual = y - A * eta;
635 HepMatrix chisqr = residual.T() * V_y_inverse * residual;
637 return (chisqr.trace());