49 const G4double dydx[],
55 const G4double fcof =
eqOfM->FCof();
63 G4ThreeVector mom = G4ThreeVector(yIn[3], yIn[4], yIn[5]);
64 G4double momMag = mom.mag();
70 G4double kappa = fcof*
bPrime/momMag;
73 if(std::abs(kappa) < 1e-20)
80 G4ThreeVector pos = G4ThreeVector(yIn[0], yIn[1], yIn[2]);
81 G4ThreeVector momUnit = mom.unit();
86 G4double xp = localMomUnit.x();
87 G4double yp = localMomUnit.y();
88 G4double zp = localMomUnit.z();
99 G4double x0 = localPos.x();
100 G4double y0 = localPos.y();
101 G4double z0 = localPos.z();
104 G4ThreeVector localA;
107 localA.setZ( x0*xp - y0*yp);
110 G4double localAMag = localA.mag();
111 G4double radiusOfCurvature = std::numeric_limits<double>::max();
113 {radiusOfCurvature = 1./localAMag;}
134 G4double dc = h2/(8*radiusOfCurvature);
140 G4double rootK = std::sqrt(std::abs(kappa*zp));
141 if (std::isnan(rootK))
143 G4double rootKh = rootK*h*zp;
144 G4double X11=0,X12=0,X21=0,X22=0;
145 G4double Y11=0,Y12=0,Y21=0,Y22=0;
149 X11 = std::cos(rootKh);
150 X12 = std::sin(rootKh)/rootK;
151 X21 =-std::abs(kappa)*X12;
154 Y11 = std::cosh(rootKh);
155 Y12 = std::sinh(rootKh)/rootK;
156 Y21 = std::abs(kappa)*Y12;
162 X12 = sinh(rootKh)/rootK;
163 X21 = std::abs(kappa)*X12;
166 Y11 = std::cos(rootKh);
167 Y12 = std::sin(rootKh)/rootK;
168 Y21 = -std::abs(kappa)*Y12;
172 x1 = X11*x0 + X12*xp;
173 xp1 = X21*x0 + X22*xp;
175 y1 = Y11*y0 + Y12*yp;
176 yp1 = Y21*y0 + Y22*yp;
179 zp1 = std::sqrt(1 - xp1*xp1 - yp1*yp1);
184 G4double z1 = z0 + std::sqrt(std::abs(h2 - std::pow(x1-x0,2) - std::pow(y1-y0,2)));
189 localMomUnit.setX(xp1);
190 localMomUnit.setY(yp1);
191 localMomUnit.setZ(zp1);
194 G4ThreeVector localMomOut = localMomUnit * momMag;
197 BDSStep globalPosMom = CurvilinearToGlobal(localPos, localMomOut,
true);
198 G4ThreeVector globalPosOut = globalPosMom.
PreStepPoint();
202 G4ThreeVector globalMomOutU = globalMomOut.unit();
203 globalMomOutU *= 1e-8;
206 for (G4int i = 0; i < 3; i++)
208 yOut[i] = globalPosOut[i];
209 yOut[i+3] = globalMomOut[i];
210 yErr[i] = globalMomOutU[i]*1e-10;
BDSStep GlobalToCurvilinear(const G4double fieldArcLength, const G4ThreeVector &unitField, const G4double angle, const G4ThreeVector &position, const G4ThreeVector &unitMomentum, const G4double h, const G4bool useCurvilinearWorld, const G4double FCof, const G4double tilt=0)