60{
61
62
63
64
65
66
69
77
83
85
86
87
88
89 if( (std::fabs(R_1) < 1e-10)||(Bmag<1e-12) )
90 {
92
93
94
98 }
99 else
100 {
101 Bnorm = (1.0/Bmag)*Bfld;
102
103
104
105 B_x_P = Bnorm.
cross(initTangent);
106
107
108
109 B_d_P = Bnorm.
dot(initTangent);
110
111 vpar = B_d_P * Bnorm;
112 vperp= initTangent - vpar;
113
114 B_v_P = std::sqrt( 1 - B_d_P * B_d_P);
115
116
117
118 Theta = R_1 * h;
119
120
121
122 if( std::fabs(Theta) > approc_limit )
123 {
124 SinT = std::sin(Theta);
125 CosT = std::cos(Theta);
126 }
127 else
128 {
132 SinT = Theta - 1.0/6.0 * Theta3;
133 CosT = 1 - 0.5 * Theta2 + 1.0/24.0 * Theta4;
134 }
135
136
137
139
140 positionMove = R * ( SinT * vperp + (1-CosT) * B_x_P) + h * vpar;
141 endTangent = CosT * vperp + SinT * B_x_P + vpar;
142
143
144
145 yHelix[0] = yIn[0] + positionMove.
x();
146 yHelix[1] = yIn[1] + positionMove.
y();
147 yHelix[2] = yIn[2] + positionMove.
z();
148 yHelix[3] = velocityVal * endTangent.x();
149 yHelix[4] = velocityVal * endTangent.y();
150 yHelix[5] = velocityVal * endTangent.z();
151
152
153
154 if(yHelix2 != nullptr)
155 {
156 SinT2 = 2.0 * SinT * CosT;
157 CosT2 = 1.0 - 2.0 * SinT * SinT;
158 endTangent = (CosT2 * vperp + SinT2 * B_x_P + vpar);
159 positionMove = R * ( SinT2 * vperp + (1-CosT2) * B_x_P) + h*2 * vpar;
160
161 yHelix2[0] = yIn[0] + positionMove.
x();
162 yHelix2[1] = yIn[1] + positionMove.
y();
163 yHelix2[2] = yIn[2] + positionMove.
z();
164 yHelix2[3] = velocityVal * endTangent.x();
165 yHelix2[4] = velocityVal * endTangent.y();
166 yHelix2[5] = velocityVal * endTangent.z();
167 }
168
169
170
172
173 G4double particleCharge = fPtrMagEqOfMot->
FCof() / (eplus*c_light);
174 R_Helix =std::abs( ptan/(fUnitConstant * particleCharge*Bmag));
175
179 }
180}
CLHEP::Hep3Vector G4ThreeVector
Hep3Vector cross(const Hep3Vector &) const
double dot(const Hep3Vector &) const
void SetCurve(const G4double Curve)
void SetRadHelix(const G4double Rad)
G4double GetInverseCurve(const G4double Momentum, const G4double Bmag)
void LinearStep(const G4double yIn[], G4double h, G4double yHelix[]) const
void SetAngCurve(const G4double Ang)