20#include "BDSIntegratorDipoleRodrigues.hh"
21#include "BDSGlobalConstants.hh"
22#include "BDSMagnetStrength.hh"
23#include "BDSPhysicalConstants.hh"
25#include "BDSUtilities.hh"
28#include "G4AffineTransform.hh"
29#include "G4Mag_EqRhs.hh"
30#include "G4ThreeVector.hh"
35BDSIntegratorDipoleRodrigues::BDSIntegratorDipoleRodrigues(
BDSMagnetStrength const* strengthIn,
37 G4Mag_EqRhs* eqOfMIn):
39 cOverGeV(
BDS::cOverGeV),
40 angle((*strengthIn)[
"angle"]),
41 length((*strengthIn)[
"length"]),
42 bField((*strengthIn)[
"field"]),
48 G4cout << __METHOD_NAME__ <<
"B Field " << bField << G4endl;
53 const G4double dydx[],
58 const G4double fcof =
eqOfM->FCof();
69 G4ThreeVector pos = G4ThreeVector(yIn[0], yIn[1], yIn[2]);
70 G4ThreeVector mom = G4ThreeVector(yIn[3], yIn[4], yIn[5]);
71 G4double charge = fcof/CLHEP::c_light;
72 G4double momMag = mom.mag();
73 G4double rho = momMag/CLHEP::GeV/(
cOverGeV *
bField/CLHEP::tesla * charge) * CLHEP::m;
86 G4ThreeVector localMomUnit = localMom.unit();
98 G4ThreeVector initialLocalPos = localPos;
99 G4ThreeVector intiialLocalMomUnit = localMomUnit;
102 std::pair<G4ThreeVector,G4ThreeVector> RandRp = UpdatePandR(rho,h,localPos,localMomUnit);
103 G4ThreeVector outputLocalPos = RandRp.first;
104 G4ThreeVector outputLocalMomUnit = RandRp.second;
106 G4double CosT_ov_2 = std::cos(h/rho/2.0);
107 G4double dc = std::abs(rho)*(1.-CosT_ov_2);
114 ConvertToGlobal(outputLocalPos, outputLocalMomUnit, yOut, yErr, momMag);
127 G4double momentumReduction = 0.98;
128 yOut[3] *= momentumReduction;
129 yOut[4] *= momentumReduction;
130 yOut[5] *= momentumReduction;
136 const G4double dydx[],
141 G4double err = 1e-10 * h;
148std::pair<G4ThreeVector,G4ThreeVector> BDSIntegratorDipoleRodrigues::UpdatePandR(G4double rho,
150 G4ThreeVector localPos,
151 G4ThreeVector localMomUnit)
153 G4ThreeVector yhat(0.,1.,0.);
154 G4ThreeVector vhat = localMomUnit;
155 G4ThreeVector vnorm = vhat.cross(yhat);
157 G4double Theta = h/rho;
159 G4double CosT_ov_2, SinT_ov_2, CosT, SinT;
160 CosT_ov_2 = std::cos(Theta/2);
161 SinT_ov_2 = std::sin(Theta/2);
163 CosT = (CosT_ov_2*CosT_ov_2) - (SinT_ov_2*SinT_ov_2);
164 SinT = 2*CosT_ov_2*SinT_ov_2;
166 G4ThreeVector dPos = rho*(SinT*vhat + (1-CosT)*vnorm);
167 G4ThreeVector outputLocalPos = localPos+dPos;
168 G4ThreeVector outputLocalMomUnit = CosT*vhat + SinT*vnorm;
170 return std::make_pair(outputLocalPos,outputLocalMomUnit);
BDSStep ConvertToLocal(G4Step const *const step, G4bool useCurvilinear=true) const
A class that holds global options and constants.
void AdvanceHelix(const G4double yIn[], const G4double dydx[], G4double h, G4double yOut[], G4double yErr[])
Calculate the new particle coordinates.
virtual void Stepper(const G4double yIn[], const G4double dydx[], const G4double h, G4double yOut[], G4double yErr[])
const G4double minimumRadiusOfCurvature
Minimum tolerable radius of curvature - used to prevent spiraling particles.
G4double bField
Uniform magnetic field in global Y direction.
G4double cOverGeV
Scaling factor in brho calculation.
void AdvanceDriftMag(const G4double yIn[], const G4double h, G4double yOut[], G4double yErr[]) const
Error array [6] all 0.
Common functionality to BDSIM integrators.
G4double backupStepperMomLimit
void SetDistChord(G4double distChordIn)
Setter for distChord to private member.
void ConvertToGlobal(const G4ThreeVector &localPos, const G4ThreeVector &localMom, G4double yOut[], G4double yErr[], const G4double momScaling=1.0)
scaling of momentum in case localMom is a unit vector
G4MagIntegratorStepper * backupStepper
const G4int nVariables
Cache of the number of variables.
Efficient storage of magnet strengths.
A simple class to represent the positions of a step.
G4ThreeVector PostStepPoint() const
Accessor.
G4ThreeVector PreStepPoint() const
Accessor.
Return either G4Tubs or G4CutTubs depending on flat face.
G4bool IsFinite(G4double value, G4double tolerance=std::numeric_limits< double >::epsilon())
G4bool IsFiniteStrength(G4double variable)