44 const G4double dydx[],
50 const G4double fcof =
eqOfM->FCof();
58 G4ThreeVector mom = G4ThreeVector(yIn[3], yIn[4], yIn[5]);
59 G4double momMag = mom.mag();
62 G4double kappa = 0.5*fcof*
bField/momMag / CLHEP::m;
65 if (std::abs(kappa)<1e-20)
72 G4ThreeVector pos = G4ThreeVector(yIn[0], yIn[1], yIn[2]);
73 G4ThreeVector momUnit = mom.unit();
78 G4ThreeVector localMomUnit = localMom.unit();
81 G4double x0 = localPos.x();
82 G4double y0 = localPos.y();
83 G4double z0 = localPos.z();
84 G4double xp0 = localMomUnit.x();
85 G4double yp0 = localMomUnit.y();
86 G4double zp0 = localMomUnit.z();
100 localA.setY( zp0*y0);
101 localA.setZ( x0*xp0 - y0*yp0);
105 G4double localAMag = localA.mag();
108 if (localAMag < 1e-15)
115 G4double radiusOfCurvature = std::numeric_limits<double>::max();
117 {radiusOfCurvature = 1./localAMag;}
120 G4double dc = h2/(8*radiusOfCurvature);
138 G4double C = std::cos(2 * kappa * h);
139 G4double S = std::sin(2 * kappa * h);
140 G4double S2oK = S / kappa;
141 G4double OmC2oK = (1.0 - C) / kappa;
143 G4double X11 = 1, X12 = 0.5*S2oK, X13 = 0, X14 = 0.5*OmC2oK;
144 G4double X21 = 0, X22 = C, X23 = 0, X24 = S;
145 G4double X31 = 0, X32 = -0.5*OmC2oK, X33 = 1, X34 = 0.5*S2oK;
146 G4double X41 = 0, X42 = -S, X43 = 0, X44 = C ;
148 G4double x1 = x0*X11 + xp0*X12 + y0*X13 + yp0*X14;
149 G4double xp1 = x0*X21 + xp0*X22 + y0*X23 + yp0*X24;
150 G4double y1 = x0*X31 + xp0*X32 + y0*X33 + yp0*X34;
151 G4double yp1 = x0*X41 + xp0*X42 + y0*X43 + yp0*X44;
153 G4double z1 = z0 + h;
155 G4double zp1 = std::sqrt(1 - xp1*xp1 - yp1*yp1);
162 localMomUnit.setX(xp1);
163 localMomUnit.setY(yp1);
164 localMomUnit.setZ(zp1);
167 G4ThreeVector localMomOut = localMomUnit * momMag;
170 BDSStep globalPosMom = CurvilinearToGlobal(localPos, localMomOut,
true);
171 G4ThreeVector globalPosOut = globalPosMom.
PreStepPoint();
175 G4ThreeVector globalMomOutU = globalMomOut.unit();
176 globalMomOutU *= 1e-8;
179 for (G4int i = 0; i < 3; i++)
181 yOut[i] = globalPosOut[i];
182 yOut[i+3] = globalMomOut[i];
183 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)