10 #include <klm/bklm/modules/bklmTracking/BKLMTrackFitter.h>
13 #include <klm/bklm/geometry/GeometryPar.h>
14 #include <klm/bklm/geometry/Module.h>
17 #include <framework/logging/Logger.h>
20 #include <CLHEP/Matrix/DiagMatrix.h>
21 #include <CLHEP/Matrix/Matrix.h>
27 using namespace CLHEP;
29 using namespace Belle2::bklm;
32 enum { VX = 0, VY = 1, VZ = 2 };
35 enum { AY = 0, BY = 1, AZ = 2, BZ = 3 };
38 enum { MY = 0, MZ = 1 };
41 BKLMTrackFitter::BKLMTrackFitter():
65 if (listHitSector.size() < 2) {
72 HepSymMatrix error(2, 0);
73 HepVector gloEta(2, 0);
74 HepSymMatrix gloError(2, 0);
78 HepVector sectorPar(4, 0);
79 HepSymMatrix sectorErr(4, 0);
80 HepVector globalPar(4, 0);
81 HepSymMatrix globalErr(4, 0);
85 globalPar.sub(1, eta);
86 globalErr.sub(1, error);
89 sectorPar.sub(1, eta);
90 sectorErr.sub(1, error);
95 globalPar.sub(3, eta);
96 globalErr.sub(3, error);
99 sectorPar.sub(3, eta);
100 sectorErr.sub(3, error);
106 (*listHitSector.begin())->getSector(), 1);
108 Hep3Vector p1(0, 0, 0); Hep3Vector p2(0, 0, 0);
111 double y1 = sectorPar[0] + sectorPar[1] * x1;
112 double y2 = sectorPar[0] + sectorPar[1] * x2;
113 double z1 = sectorPar[2] + sectorPar[3] * x1;
114 double z2 = sectorPar[2] + sectorPar[3] * x2;
115 p1.setX(x1); p1.setY(y1); p1.setZ(z1);
116 p2.setX(x2); p2.setY(y2); p2.setZ(z2);
121 if (gl2[0] != gl1[0]) {
122 globalPar[1] = (gl2[1] - gl1[1]) / (gl2[0] - gl1[0]);
123 globalPar[0] = gl1[1] - globalPar[1] * gl1[0];
124 globalPar[3] = (gl2[2] - gl1[2]) / (gl2[0] - gl1[0]);
125 globalPar[2] = gl1[2] - globalPar[3] * gl1[0];
126 globalErr = sectorErr;
128 globalPar[1] = DBL_MAX;
129 globalPar[0] = DBL_MAX;
130 globalPar[3] = DBL_MAX;
131 globalPar[2] = DBL_MAX;
132 globalErr = sectorErr;
161 double x, y, z, dy, dz;
173 CLHEP::Hep3Vector globalPos(hit->getGlobalPosition()[0], hit->getGlobalPosition()[1], hit->getGlobalPosition()[2]);
186 double distance = sqrt(dy * dy + dz * dz);
192 HepMatrix errors(2, 2, 0);
193 HepMatrix A(2, 4, 0);
208 int nStrips = hit->getPhiStripMax() - hit->getPhiStripMin() + 1;
209 double dn = nStrips - 1.5;
210 double factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.60;
211 hit_localPhiErr = hit_localPhiErr * sqrt(factor);
213 nStrips = hit->getZStripMax() - hit->getZStripMin() + 1;
215 factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.55;
216 hit_localZErr = hit_localZErr * sqrt(factor);
219 error = sqrt(errors[ MY ][ MY ] +
221 pow(hit_localPhiErr, 2) +
222 pow(hit_localZErr, 2));
225 sigma = distance / error;
246 double x_mea = hit->getGlobalPosition()[0];
247 double y_mea = hit->getGlobalPosition()[1];
248 double z_mea = hit->getGlobalPosition()[2];
253 double dx = x_pre - x_mea;
254 double dz = z_pre - z_mea;
256 double distance = sqrt(dx * dx + dz * dz);
260 HepMatrix errors(2, 2, 0);
261 HepMatrix A(2, 4, 0);
279 int nStrips = hit->getPhiStripMax() - hit->getPhiStripMin() + 1;
280 double dn = nStrips - 1.5;
281 double factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.60;
282 hit_localPhiErr = hit_localPhiErr * sqrt(factor);
284 nStrips = hit->getZStripMax() - hit->getZStripMin() + 1;
286 factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.55;
287 hit_localZErr = hit_localZErr * sqrt(factor);
291 double sinphi = globalOrigin[1] / globalOrigin.mag();
292 double cosphi = globalOrigin[0] / globalOrigin.mag();
294 HepMatrix globalHitErr(3, 3, 0);
295 globalHitErr[0][0] = pow(hit_localPhiErr * sinphi, 2);
296 globalHitErr[0][1] = (hit_localPhiErr * sinphi) * (hit_localPhiErr * cosphi);
297 globalHitErr[0][2] = 0;
298 globalHitErr[1][1] = pow(hit_localPhiErr * cosphi, 2);;
299 globalHitErr[1][0] = (hit_localPhiErr * sinphi) * (hit_localPhiErr * cosphi);
300 globalHitErr[1][2] = 0;
301 globalHitErr[2][2] = pow(hit_localZErr, 2);
302 globalHitErr[2][0] = 0;
303 globalHitErr[2][1] = 0;
313 HepMatrix error_mea(2, 2, 0);
314 error = sqrt(errors[ MY ][ MY ] +
322 sigma = distance / error;
335 int depDir,
int indDir)
340 std::list< BKLMHit2d* >::iterator iHit;
342 Hep3Vector localHitPos;
343 HepMatrix localHitErr(3, 3, 0);
350 int noPoints = hitList.size();
353 HepMatrix A(noPoints, 2, 0);
356 HepVector y(noPoints, 0);
360 HepDiagMatrix V_y_inverse(noPoints, 0);
364 HepSymMatrix V_A, V_A_inverse;
366 iHit = hitList.begin();
368 int section = hit->getSection();
369 int sector = hit->getSector();
375 for (iHit = hitList.begin(); iHit != hitList.end(); ++iHit) {
378 if (hit->getSection() != section || hit->getSector() != sector) {
386 CLHEP::Hep3Vector globalPos;
387 globalPos[0] = hit->getGlobalPosition()[0];
388 globalPos[1] = hit->getGlobalPosition()[1];
389 globalPos[2] = hit->getGlobalPosition()[2];
397 int nStrips = hit->getPhiStripMax() - hit->getPhiStripMin() + 1;
398 double dn = nStrips - 1.5;
399 double factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.60;
400 hit_localPhiErr = hit_localPhiErr * sqrt(factor);
402 nStrips = hit->getZStripMax() - hit->getZStripMin() + 1;
404 factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.55;
405 hit_localZErr = hit_localZErr * sqrt(factor);
408 localHitErr[0][0] = 0.0;
409 localHitErr[0][1] = 0;
410 localHitErr[0][2] = 0;
411 localHitErr[1][1] = hit_localPhiErr;
412 localHitErr[1][0] = 0;
413 localHitErr[1][2] = 0;
414 localHitErr[2][2] = hit_localZErr;
415 localHitErr[2][0] = 0;
416 localHitErr[2][1] = 0;
421 indPos = localHitPos.x();
425 indPos = localHitPos.y();
429 indPos = localHitPos.z();
433 B2DEBUG(20,
"error in klm_trackSectorFit: illegal direction");
440 depPos = localHitPos.x();
444 depPos = localHitPos.y();
448 depPos = localHitPos.z();
452 B2DEBUG(20,
"error in klm_trackSectorFit: illegal direction");
458 A[ n ][ 1 ] = indPos;
462 if (localHitErr[ depDir ][ depDir ] > 0.0) {
463 V_y_inverse[ n ][ n ] = 1.0 / localHitErr[ depDir ][ depDir ];
465 V_y_inverse[ n ][ n ] = DBL_MAX;
470 V_A_inverse = V_y_inverse.similarityT(A);
473 V_A = V_A_inverse.inverse(ierr);
475 eta = V_A * A.T() * V_y_inverse * y;
479 HepMatrix residual = y - A * eta;
480 HepMatrix chisqr = residual.T() * V_y_inverse * residual;
482 return (chisqr.trace());
490 int depDir,
int indDir)
495 HepMatrix globalHitErr(3, 3, 0);
501 int noPoints = hitList.size();
504 HepMatrix A(noPoints, 2, 0);
507 HepVector y(noPoints, 0);
511 HepDiagMatrix V_y_inverse(noPoints, 0);
514 HepSymMatrix V_A, V_A_inverse;
520 for (std::list< BKLMHit2d* >::iterator iHit = hitList.begin(); iHit != hitList.end(); ++iHit) {
528 CLHEP::Hep3Vector globalPos;
529 globalPos[0] = hit->getGlobalPosition()[0];
530 globalPos[1] = hit->getGlobalPosition()[1];
531 globalPos[2] = hit->getGlobalPosition()[2];
539 int nStrips = hit->getPhiStripMax() - hit->getPhiStripMin() + 1;
540 double dn = nStrips - 1.5;
541 double factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.60;
542 hit_localPhiErr = hit_localPhiErr * sqrt(factor);
544 nStrips = hit->getZStripMax() - hit->getZStripMin() + 1;
546 factor = std::pow((0.9 + 0.4 * dn * dn), 1.5) * 0.55;
547 hit_localZErr = hit_localZErr * sqrt(factor);
551 double sinphi = globalOrigin[1] / globalOrigin.mag();
552 double cosphi = globalOrigin[0] / globalOrigin.mag();
554 globalHitErr[0][0] = pow(hit_localPhiErr * sinphi, 2);
555 globalHitErr[0][1] = (hit_localPhiErr * sinphi) * (hit_localPhiErr * cosphi);
556 globalHitErr[0][2] = 0;
557 globalHitErr[1][1] = pow(hit_localPhiErr * cosphi, 2);;
558 globalHitErr[1][0] = (hit_localPhiErr * sinphi) * (hit_localPhiErr * cosphi);
559 globalHitErr[1][2] = 0;
560 globalHitErr[2][2] = pow(hit_localZErr, 2);;
561 globalHitErr[2][0] = 0;
562 globalHitErr[2][1] = 0;
567 indPos = globalPos.x();
571 indPos = globalPos.y();
575 indPos = globalPos.z();
579 B2DEBUG(20,
"error in bklm trackFit: illegal direction");
586 depPos = globalPos.x();
590 depPos = globalPos.y();
594 depPos = globalPos.z();
598 B2DEBUG(20,
"error in bklm trackFit: illegal direction");
604 A[ n ][ 1 ] = indPos;
608 double error_raw = globalHitErr[indDir][indDir] + globalHitErr[depDir][depDir];
611 double weight = error_raw;
613 V_y_inverse[ n ][ n ] = 1.0 / weight;
615 V_y_inverse[ n ][ n ] = DBL_MAX;
623 V_A_inverse = V_y_inverse.similarityT(A);
626 V_A = V_A_inverse.inverse(ierr);
628 eta = V_A * A.T() * V_y_inverse * y;
632 HepMatrix residual = y - A * eta;
633 HepMatrix chisqr = residual.T() * V_y_inverse * residual;
635 return (chisqr.trace());
Store one BKLM strip hit as a ROOT object.
float m_Chi2
Chi square of fit.
int m_NumHit
the number of hits on this track
CLHEP::HepSymMatrix m_GlobalErr
track params errors in global system
CLHEP::HepVector m_GlobalPar
track params in global system
bklm::GeometryPar * m_GeoPar
pointer to GeometryPar singleton
CLHEP::HepVector m_SectorPar
track params in the sector local system
double fit1dTrack(std::list< BKLMHit2d * > hitList, CLHEP::HepVector &eta, CLHEP::HepSymMatrix &error, int depDir, int indDir)
do fit in the global system
CLHEP::HepSymMatrix m_SectorErr
track params errors in the sector local system
bool m_Valid
Is fit valid.
double fit(std::list< BKLMHit2d * > &listTrackPoint)
do fit and returns chi square of the fit.
bool m_globalFit
do fit in the local system or global system false: local sys; true: global sys.
double distanceToHit(BKLMHit2d *hit, double &error, double &sigma)
Distance from track to a hit in the plane of the module.
double globalDistanceToHit(BKLMHit2d *hit, double &error, double &sigma)
Distance from track to a hit in the global system.
~BKLMTrackFitter()
Destructor.
double fit1dSectorTrack(std::list< BKLMHit2d * > hitList, CLHEP::HepVector &eta, CLHEP::HepSymMatrix &error, int depDir, int indDir)
do fit in the y-x plane or z-x plane
const Module * findModule(int section, int sector, int layer) const
Get the pointer to the definition of a module.
Define the geometry of a BKLM module Each sector [octant] contains Modules.
const CLHEP::Hep3Vector globalToLocal(const CLHEP::Hep3Vector &v, bool reco=false) const
Transform space-point within this module from global to local coordinates.
double getPhiStripWidth() const
Get phi-strip width.
const CLHEP::Hep3Vector getGlobalOrigin() const
Return the position (in global coordinates) of this module's sensitive-volume origin.
const CLHEP::Hep3Vector localToGlobal(const CLHEP::Hep3Vector &v, bool reco=false) const
Transform space-point within this module from local to global coordinates.
double getZStripWidth() const
Get z-strip width.
Abstract base class for different kinds of events.