50 const G4double dydx[],
56 const G4double fcof =
eqOfM->FCof();
64 G4ThreeVector mom = G4ThreeVector(yIn[3], yIn[4], yIn[5]);
65 G4double momMag = mom.mag();
71 G4double kappa = fcof*
bPrime/momMag;
74 if(std::abs(kappa) < 1e-20)
81 G4ThreeVector pos = G4ThreeVector(yIn[0], yIn[1], yIn[2]);
82 G4ThreeVector momUnit = mom.unit();
87 G4double xp = localMomUnit.x();
88 G4double yp = localMomUnit.y();
89 G4double zp = localMomUnit.z();
100 G4double x0 = localPos.x();
101 G4double y0 = localPos.y();
102 G4double z0 = localPos.z();
105 G4ThreeVector localA;
108 localA.setZ( x0*xp - y0*yp);
111 G4double localAMag = localA.mag();
112 G4double radiusOfCurvature = std::numeric_limits<double>::max();
114 {radiusOfCurvature = 1./localAMag;}
135 G4double dc = h2/(8*radiusOfCurvature);
141 G4double rootK = std::sqrt(std::abs(kappa*zp));
142 if (std::isnan(rootK))
144 G4double rootKh = rootK*h*zp;
145 G4double X11=0,X12=0,X21=0,X22=0;
146 G4double Y11=0,Y12=0,Y21=0,Y22=0;
150 X11 = std::cos(rootKh);
151 X12 = std::sin(rootKh)/rootK;
152 X21 =-std::abs(kappa)*X12;
155 Y11 = std::cosh(rootKh);
156 Y12 = std::sinh(rootKh)/rootK;
157 Y21 = std::abs(kappa)*Y12;
163 X12 = sinh(rootKh)/rootK;
164 X21 = std::abs(kappa)*X12;
167 Y11 = std::cos(rootKh);
168 Y12 = std::sin(rootKh)/rootK;
169 Y21 = -std::abs(kappa)*Y12;
173 x1 = X11*x0 + X12*xp;
174 xp1 = X21*x0 + X22*xp;
176 y1 = Y11*y0 + Y12*yp;
177 yp1 = Y21*y0 + Y22*yp;
180 zp1 = std::sqrt(1 - xp1*xp1 - yp1*yp1);
185 G4double z1 = z0 + std::sqrt(h2 - std::pow(x1-x0,2) - std::pow(y1-y0,2));
190 localMomUnit.setX(xp1);
191 localMomUnit.setY(yp1);
192 localMomUnit.setZ(zp1);
195 G4ThreeVector localMomOut = localMomUnit * momMag;
198 BDSStep globalPosMom = CurvilinearToGlobal(localPos, localMomOut,
true);
199 G4ThreeVector globalPosOut = globalPosMom.
PreStepPoint();
203 G4ThreeVector globalMomOutU = globalMomOut.unit();
204 globalMomOutU *= 1e-8;
207 for (G4int i = 0; i < 3; i++)
209 yOut[i] = globalPosOut[i];
210 yOut[i+3] = globalMomOut[i];
211 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)