97{
101
102
103 G4double eMass = CLHEP::electron_mass_c2;
105
106
108
109 G4double muEnergy = muKinEnergy + muMass;
111
116
117 if (randNumbs[7] <
W[0]) {
118 G4double A1 = -(q2 - 2.*muEnergy*gEnergy);
119 G4double B1 = -(2.*gMomentum*muMomentum);
121
122 G4double costg = (-A1 + (A1 - B1)*
G4Exp(B1*tginterval*randNumbs[1]))/B1;
123 G4double sintg = std::sqrt((1.0 - costg)*(1.0 + costg));
124 G4double phig = CLHEP::twopi*randNumbs[2];
127
129 dirGamma.
set(sintg*cospg, sintg*sinpg, costg);
131
132 G4double cost5 = -1. + 2.*randNumbs[6];
133 G4double phi5 = CLHEP::twopi*randNumbs[8];
134
137
140
141 dirElectron = eFourMomentum.
vect().
unit();
142 dirPositron = pFourMomentum.
vect().
unit();
143
144 G4double phi = CLHEP::twopi*randNumbs[3];
147
148 }
else if (randNumbs[7] >=
W[0] && randNumbs[7] <
W[1]) {
149 G4double A3 = q2 + 2.*gEnergy*muFinalEnergy;
150 G4double B3 = -2.*gMomentum*muFinalMomentum;
151
153 G4double tQMG = (-A3 + (A3 - B3)*
G4Exp(B3*tQ3interval*randNumbs[0]))/B3;
154 G4double phiQP = CLHEP::twopi*randNumbs[2];
155
156 G4double sintQ3 = std::sqrt(1. - tQMG*tQMG);
159
160 G4double Ap = muMomentum*muMomentum + muFinalMomentum*muFinalMomentum + gMomentum*gMomentum;
161 G4double A = Ap + 2.*muFinalMomentum*gMomentum*tQMG;
162 G4double B = -2.*muMomentum*gMomentum*sintQ3*cospQP;
163 G4double C = -2.*muMomentum*gMomentum*tQMG - 2.*muMomentum*muFinalMomentum;
164
166 G4double t3interval = (1./(
A +
C + absB*mint3) - 1./(
A +
C + absB*maxt3))/absB;
167 G4double t3 = (-(
A +
C) + 1./(1./(
A +
C + absB*mint3) - absB*t3interval*randNumbs[0]))/absB;
170
171 G4double cost = -sint3*sintQ3*cospQP + cost3*tQMG;
172 G4double sint = std::sqrt((1. + cost)*(1. - cost));
173 G4double cosp = (sintQ3*cospQP*cost3 + sint3*tQMG)/sint;
175
177 dirGamma.
set(sint*cosp, sint*sinp, cost);
179
180 G4double cost5 = -1. + 2.*randNumbs[6];
181 G4double phi5 = CLHEP::twopi*randNumbs[8];
182
185
188
189 dirElectron = eFourMomentum.
vect().
unit();
190 dirPositron = pFourMomentum.
vect().
unit();
191
192 G4double phi = CLHEP::twopi*randNumbs[3];
195
196 }
else if (randNumbs[7] >=
W[1] && randNumbs[7] <
W[2]) {
197 G4double phi3 = CLHEP::twopi*randNumbs[0];
198 G4double phi5 = CLHEP::twopi*randNumbs[1];
199 G4double phi6 = CLHEP::twopi*randNumbs[2];
201 G4double muEnergyInterval = muEnergy - 2.*eMass - minmuFinalEnergy;
202 G4double muFEnergy = minmuFinalEnergy + muEnergyInterval*randNumbs[3];
203
205 G4double maxeEnergy = muEnergy - muFEnergy - eMass;
206 G4double eEnergyInterval = maxeEnergy - mineEnergy;
207 G4double eEnergy = mineEnergy + eEnergyInterval*randNumbs[4];
208
215
216 G4double muFMomentum = std::sqrt(muFEnergy*muFEnergy - muMass*muMass);
217 G4double eMomentum = std::sqrt(eEnergy*eEnergy - eMass*eMass);
218 G4double pEnergy = muEnergy - muFEnergy - eEnergy;
219 G4double pMomentum = std::sqrt(pEnergy*pEnergy - eMass*eMass);
220
221 G4double A3 = -2.*muMass*muMass + 2.*muEnergy*muFEnergy;
222 G4double B3 = -2.*std::sqrt(muEnergy*muEnergy - muMass*muMass)*muFMomentum;
223 G4double cost3interval =
G4Log((A3 + B3*Cmax)/(A3 + B3*Cmin))/B3;
224
225 G4double expanCost3r6 =
G4Exp(B3*cost3interval*randNumbs[5]);
226 G4double cost3 = A3*(expanCost3r6 - 1.)/B3 + Cmin*expanCost3r6;
227 G4double sint3 = std::sqrt((1. - cost3)*(1. + cost3));
228
229 G4ThreeVector muFinalMomentumVector(muFMomentum*sint3, 0., muFMomentum*cost3);
230
232 muFinalFourMomentum.set(muFinalMomentumVector, muFEnergy);
234 G4double A5 = auxVec1.
mag2() - 2.*eEnergy*(muEnergy - muFEnergy) +
235 2.*muMomentumVector[2]*eMomentum - 2.*muFMomentum*eMomentum*cost3;
236 G4double B5 = -2.*muFMomentum*eMomentum*(sint3*cosp3*cosp5 + sint3*sinp3*sinp5);
241 G4double t5interval =
G4Log((absA5 + absB5*maxt5)/(absA5 + absB5*mint5))/absB5;
242 G4double argexp = absB5*t5interval*randNumbs[6] +
G4Log(absA5 + absB5*mint5);
246
247 dirElectron.
set(sint5*cosp5, sint5*sinp5, cost5);
249
250 G4ThreeVector auxVec2 = muMomentumVector - muFinalMomentumVector - eMomentumVector;
252 G4double Bp = muFinalMomentum*(sint3*cosp3*cosp6 + sint3*sinp3*sinp6) +
253 eMomentum*(sint5*cosp5*cosp6 + sint5*sinp5*sinp6);
254 G4double Cp = -muMomentum + muFMomentum*cost3 + eMomentum*cost5;
255 G4double A6 = p1mp3mp52 + pMomentum*pMomentum;
260 G4double absA6C6 = std::abs(A6 + C6);
262 G4double t6interval = (1./(absA6C6 + absB6*mint6) - 1./(absA6C6 + absB6*maxt6))/absB6;
263 G4double t6 = (-absA6C6 + 1./(1./(absA6C6 + absB6*mint6) - absB6*t6interval*randNumbs[8]))/absB6;
266
267 dirPositron.
set(sint6*cosp6, sint6*sinp6, cost6);
268
271
272 }
else if (randNumbs[7] >=
W[2]) {
273 G4double phi3 = CLHEP::twopi*randNumbs[0];
274 G4double phi6 = CLHEP::twopi*randNumbs[1];
275 G4double phi5 = CLHEP::twopi*randNumbs[2];
277 G4double muFinalEnergyinterval = muEnergy - 2.*eMass - minmuFinalEnergy;
278 G4double muFEnergy = minmuFinalEnergy + muFinalEnergyinterval*randNumbs[3];
279
281 G4double maxpEnergy = muEnergy - muFEnergy - eMass;
282 G4double pEnergyinterval = maxpEnergy - minpEnergy;
283 G4double pEnergy = minpEnergy + pEnergyinterval*randNumbs[4];
284
291
292 G4double muFMomentum = std::sqrt(muFEnergy*muFEnergy - muMass*muMass);
293 G4double pMomentum = std::sqrt(pEnergy*pEnergy - eMass*eMass);
294 G4double eEnergy = muEnergy - muFEnergy - pEnergy;
295 G4double eMomentum = std::sqrt(eEnergy*eEnergy - eMass*eMass);
296
297 G4double A3 = -2.*muMass*muMass + 2.*muEnergy*muFEnergy;
298 G4double B3 = -2.*std::sqrt(muEnergy*muEnergy - muMass*muMass)*muFMomentum;
299 G4double cost3interval =
G4Log((A3 + B3*Cmax)/(A3 + B3*Cmin))/B3;
300
301 G4double expanCost3r6 =
G4Exp(B3*cost3interval*randNumbs[5]);
302 G4double cost3 = A3*(expanCost3r6 - 1.)/B3 + Cmin*expanCost3r6;
303 G4double sint3 = std::sqrt((1. - cost3)*(1. + cost3));
304
306 muFinalMomentumVector.
set(muFMomentum*sint3*cosp3, muFMomentum*sint3*sinp3,
307 muFMomentum*cost3);
308
310 muFinalFourMomentum.set(muFinalMomentumVector, muFEnergy);
312 G4double A6 = auxVec1.
mag2() - 2.*pEnergy*(muEnergy - muFEnergy) +
313 2.*muMomentumVector[2]*pMomentum - 2.*muFMomentum*pMomentum*cost3;
314 G4double B6 = -2.*muFMomentum*pMomentum*(sint3*cosp3*cosp6 + sint3*sinp3*sinp6);
319 G4double t6interval =
G4Log((absA6 + absB6*maxt6)/(absA6 + absB6*mint6))/absB6;
320 G4double argexp = absB6*t6interval*randNumbs[6] +
G4Log(absA6 + absB6*mint6);
324
325 dirPositron.
set(sint6*cosp6, sint6*sinp6, cost6);
327
328 G4ThreeVector auxVec2 = muMomentumVector - muFinalMomentumVector - pMomentumVector;
330 G4double Bp = muFMomentum*(sint3*cosp3*cosp5 + sint3*sinp3*sinp5) +
331 pMomentum*(sint6*cosp6*cosp5 + sint6*sinp6*sinp5);
332 G4double Cp = -muMomentum + muFMomentum*cost3 + pMomentum*cost6;
333 G4double A5 = p1mp3mp62 + eMomentum*eMomentum;
340 G4double t5interval = (1./(absA5C5 + absB5*mint5) - 1./(absA5C5 + absB5*maxt5))/absB5;
341 G4double t5 = (-absA5C5 + 1./(1./(absA5C5 + absB5*mint5) - absB5*t5interval*randNumbs[8]))/absB5;
344
345 dirElectron.set(sint5*cosp5, sint5*sinp5, cost5);
346
349 }
350}
G4double C(G4double temp)
G4double B(G4double temperature)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
CLHEP::Hep3Vector G4ThreeVector
void set(double x, double y, double z)
HepLorentzVector & boost(double, double, double)
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
G4ThreeVector GetMomentum() const
G4double GetPDGMass() const
void PhiRotation(G4ThreeVector &dir, G4double phi)
G4LorentzVector eDP2(G4double x1, G4double x2, G4double x3, G4double x4, G4double x5)
G4LorentzVector pDP2(G4double x3, const G4LorentzVector &x6)