File indexing completed on 2025-08-05 08:18:30
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include "HelixTrackModel.h"
0021 #include <FieldManager.h>
0022
0023 #include <assert.h>
0024 #include <math.h>
0025
0026 namespace genfit {
0027
0028 HelixTrackModel::HelixTrackModel(const TVector3& pos, const TVector3& mom, double charge) {
0029
0030 mom_ = mom.Mag();
0031
0032 TVector3 B = genfit::FieldManager::getInstance()->getFieldVal(pos);
0033
0034
0035 assert(B.X() == 0);
0036 assert(B.Y() == 0);
0037
0038 double Bz = B.Z();
0039
0040
0041 TVector3 dir2D(mom);
0042 dir2D.SetZ(0);
0043 dir2D.SetMag(1.);
0044 R_ = 100.*mom.Perp()/(0.0299792458*Bz) / fabs(charge);
0045 sgn_ = 1;
0046 if (charge<0) sgn_=-1.;
0047 center_ = pos + sgn_ * R_ * dir2D.Orthogonal();
0048 alpha0_ = (pos-center_).Phi();
0049
0050 theta_ = mom.Theta();
0051
0052
0053
0054
0055 }
0056
0057
0058 TVector3 HelixTrackModel::getPos(double tracklength) const {
0059
0060 TVector3 pos;
0061
0062 double angle = alpha0_ - sgn_ * tracklength / R_ * sin(theta_);
0063
0064 TVector3 radius(R_,0,0);
0065 radius.SetPhi(angle);
0066 pos = center_ + radius;
0067 pos.SetZ(center_.Z() - sgn_ * ((alpha0_-angle)*R_ * tan(theta_-M_PI/2.)) );
0068
0069 return pos;
0070 }
0071
0072 void HelixTrackModel::getPosMom(double tracklength, TVector3& pos, TVector3& mom) const {
0073
0074 double angle = alpha0_ - sgn_ * tracklength / R_ * sin(theta_);
0075
0076 TVector3 radius(R_,0,0);
0077 radius.SetPhi(angle);
0078 pos = center_ + radius;
0079 pos.SetZ(center_.Z() - sgn_ * ((alpha0_-angle)*R_ * tan(theta_-M_PI/2.)) );
0080
0081 mom.SetXYZ(1,1,1);
0082 mom.SetTheta(theta_);
0083 mom.SetPhi(angle - sgn_*M_PI/2.);
0084 mom.SetMag(mom_);
0085
0086
0087
0088
0089
0090
0091
0092 }
0093
0094
0095 }