52 if (theParentName ==
"mu+") {
61 else if (theParentName ==
"mu-") {
73 G4cout <<
"G4RadiativeMuonDecayChannel::G4RadiativeMuonDecayChannel():";
74 G4cout <<
" parent particle is not muon but ";
127 for (
G4int index = 0; index < 4; ++index) {
140 delete parentparticle;
145 G4double cthetaE, cthetaG, cthetaGE, phiE, phiG;
146 const std::size_t MAX_LOOP = 10000;
148 for (std::size_t loop_counter1 = 0; loop_counter1 < MAX_LOOP; ++loop_counter1) {
149 for (std::size_t loop_counter2 = 0; loop_counter2 < MAX_LOOP; ++loop_counter2) {
161 rn3dim(xx, yy, zz, x);
163 if (std::fabs((xx * xx) + (yy * yy) + (zz * zz) - (x * x)) > 0.001) {
167 phiE = atan4(xx, yy);
169 G4double sthetaE = std::sqrt((xx * xx) + (yy * yy)) / x;
188 rn3dim(xx, yy, zz, y);
190 if (std::fabs((xx * xx) + (yy * yy) + (zz * zz) - (y * y)) > 0.001) {
194 phiG = atan4(xx, yy);
196 G4double sthetaG = std::sqrt((xx * xx) + (yy * yy)) / y;
213 cthetaGE = cthetaE * cthetaG + sthetaE * sthetaG * std::cos(phiE - phiG);
220 G4double term1 = x * ((1.0 - eps) * (1.0 - eps)) + 2.0 * eps;
222 std::sqrt(x * ((1.0 - eps) * (1.0 - eps)) * (x * ((1.0 - eps) * (1.0 - eps)) + 4.0 * eps))
224 G4double delta = 1.0 - beta * cthetaGE;
226 G4double term3 = y * (1.0 - (eps * eps));
227 G4double term6 = term1 * delta * term3;
229 G4double Qsqr = (1.0 - term1 - term3 + term0 + 0.5 * term6) / ((1.0 - eps) * (1.0 - eps));
233 if (Qsqr >= 0.0 && Qsqr <= 1.0)
break;
244 som0 = fron(Pmu, x, y, cthetaE, cthetaG, cthetaGE);
251 G4double E = EMMU / 2. * (x * ((1. - eps) * (1. - eps)) + 2. * eps);
252 G4double G = EMMU / 2. * y * (1. - eps * eps);
254 if (E < EMASS) E = EMASS;
259 daughtermomentum[0] = std::sqrt(E * E - EMASS * EMASS);
261 G4double sthetaE = std::sqrt(1. - cthetaE * cthetaE);
275 auto daughterparticle0 =
278 products->PushProducts(daughterparticle0);
280 daughtermomentum[1] = G;
282 G4double sthetaG = std::sqrt(1. - cthetaG * cthetaG);
288 px = sthetaG * cphiG;
289 py = sthetaG * sphiG;
296 auto daughterparticle1 =
299 products->PushProducts(daughterparticle1);
304 G4double energy2 = parentmass - E - G;
306 G4ThreeVector P34 = -1. * (daughtermomentum[0] * direction0 + daughtermomentum[1] * direction1);
311 G4double sinthetan = std::sqrt((1.0 - costhetan) * (1.0 + costhetan));
316 G4ThreeVector direction2(sinthetan * cosphin, sinthetan * sinphin, costhetan);
319 auto daughterparticle3 =
327 p4.
boost(direction34.
x() * beta, direction34.
y() * beta, direction34.
z() * beta);
328 daughterparticle2->Set4Momentum(p4);
330 p4 = daughterparticle3->Get4Momentum();
331 p4.
boost(direction34.
x() * beta, direction34.
y() * beta, direction34.
z() * beta);
332 daughterparticle3->Set4Momentum(p4);
334 products->PushProducts(daughterparticle2);
335 products->PushProducts(daughterparticle3);
337 daughtermomentum[2] = daughterparticle2->GetTotalMomentum();
338 daughtermomentum[3] = daughterparticle3->GetTotalMomentum();
343 G4cout <<
"G4MuonRadiativeDecayChannelWithSpin::DecayIt() -";
344 G4cout <<
" create decay products in rest frame " <<
G4endl;
345 G4double TT = daughterparticle0->GetTotalEnergy() + daughterparticle1->GetTotalEnergy()
346 + daughterparticle2->GetTotalEnergy() + daughterparticle3->GetTotalEnergy();
347 G4cout <<
"e :" << daughterparticle0->GetTotalEnergy() / MeV <<
G4endl;
348 G4cout <<
"gamma:" << daughterparticle1->GetTotalEnergy() / MeV <<
G4endl;
349 G4cout <<
"nu2 :" << daughterparticle2->GetTotalEnergy() / MeV <<
G4endl;
350 G4cout <<
"nu2 :" << daughterparticle3->GetTotalEnergy() / MeV <<
G4endl;
351 G4cout <<
"total:" << (TT - parentmass) / keV <<
G4endl;
353 products->DumpInfo();
378 * ((y * y) * (1.0 - y) + x * y * (2.0 - 3.0 * y) + 2.0 * (x * x) * (1.0 - 2.0 * y)
379 - 2.0 * (x * x * x));
381 * (-x * y * (2.0 - 3.0 * (y * y)) - 2.0 * (x * x) * (1.0 - y - 3.0 * (y * y))
382 + 2.0 * (x * x * x) * (1.0 + 2.0 * y));
384 3.0 * ((x * x) * y * (2.0 - 3.0 * y - 3.0 * (y * y)) - (x * x * x) * y * (4.0 + 3.0 * y));
385 G4double f2s = 1.5 * ((x * x * x) * (y * y) * (2.0 + y));
387 G4double f_1se = 12.0 * (x * y * (1.0 - y) + (x * x) * (2.0 - 3.0 * y) - 2.0 * (x * x * x));
388 G4double f0se = 6.0 * (-(x * x) * (2.0 - y - 2.0 * (y * y)) + (x * x * x) * (2.0 + 3.0 * y));
389 G4double f1se = -3.0 * (x * x * x) * y * (2.0 + y);
392 G4double f_1sg = 12.0 * ((y * y) * (1.0 - y) + x * y * (1.0 - 2.0 * y) - (x * x) * y);
394 6.0 * (-x * (y * y) * (2.0 - 3.0 * y) - (x * x) * y * (1.0 - 4.0 * y) + (x * x * x) * y);
395 G4double f1sg = 3.0 * ((x * x) * (y * y) * (1.0 - 3.0 * y) - 2.0 * (x * x * x) * (y * y));
396 G4double f2sg = 1.5 * (x * x * x) * (y * y * y);
399 * ((y * y) * (3.0 - 2.0 * y) + 6.0 * x * y * (1.0 - y)
400 + 2.0 * (x * x) * (3.0 - 4.0 * y) - 4.0 * (x * x * x));
402 * (-x * y * (3.0 - y - (y * y)) - (x * x) * (3.0 - y - 4.0 * (y * y))
403 + 2.0 * (x * x * x) * (1.0 + 2.0 * y));
405 2.0 * ((x * x) * y * (6.0 - 5.0 * y - 2.0 * (y * y)) - 2.0 * (x * x * x) * y * (4.0 + 3.0 * y));
406 G4double f2v = 2.0 * (x * x * x) * (y * y) * (2.0 + y);
409 8.0 * (x * y * (1.0 - 2.0 * y) + 2.0 * (x * x) * (1.0 - 3.0 * y) - 4.0 * (x * x * x));
411 4.0 * (-(x * x) * (2.0 - 3.0 * y - 4.0 * (y * y)) + 2.0 * (x * x * x) * (2.0 + 3.0 * y));
412 G4double f1ve = -4.0 * (x * x * x) * y * (2.0 + y);
415 G4double f_1vg = 8.0 * ((y * y) * (1.0 - 2.0 * y) + x * y * (1.0 - 4.0 * y) - 2.0 * (x * x) * y);
417 4.0 * (2.0 * x * (y * y) * (1.0 + y) - (x * x) * y * (1.0 - 4.0 * y) + 2.0 * (x * x * x) * y);
418 G4double f1vg = 2.0 * ((x * x) * (y * y) * (1.0 - 2.0 * y) - 4.0 * (x * x * x) * (y * y));
419 G4double f2vg = 2.0 * (x * x * x) * (y * y * y);
422 * ((y * y) * (3.0 - y) + 3.0 * x * y * (2.0 - y) + 2.0 * (x * x) * (3.0 - 2.0 * y)
423 - 2.0 * (x * x * x));
425 * (-x * y * (6.0 + (y * y)) - 2.0 * (x * x) * (3.0 + y - 3.0 * (y * y))
426 + 2.0 * (x * x * x) * (1.0 + 2.0 * y));
428 2.0 * ((x * x) * y * (6.0 - 5.0 * y + (y * y)) - (x * x * x) * y * (4.0 + 3.0 * y));
429 G4double f2t = (x * x * x) * (y * y) * (2.0 + y);
431 G4double f_1te = -8.0 * (x * y * (1.0 + 3.0 * y) + (x * x) * (2.0 + 3.0 * y) + 2.0 * (x * x * x));
432 G4double f0te = 4.0 * ((x * x) * (2.0 + 3.0 * y + 4.0 * (y * y)) + (x * x * x) * (2.0 + 3.0 * y));
433 G4double f1te = -2.0 * (x * x * x) * y * (2.0 + y);
436 G4double f_1tg = -8.0 * ((y * y) * (1.0 + y) + x * y + (x * x) * y);
437 G4double f0tg = 4.0 * (x * (y * y) * (2.0 - y) + (x * x) * y * (1.0 + 2.0 * y) + (x * x * x) * y);
438 G4double f1tg = -2.0 * ((x * x) * (y * y) * (1.0 - y) + 2.0 * (x * x * x) * y);
439 G4double f2tg = (x * x * x) * (y * y * y);
441 G4double term = delta + 2.0 * (me * me) / ((mu * mu) * (x * x));
444 G4double nss = term * f_1s + f0s + delta * f1s + (delta * delta) * f2s;
445 G4double nv = term * f_1v + f0v + delta * f1v + (delta * delta) * f2v;
446 G4double nt = term * f_1t + f0t + delta * f1t + (delta * delta) * f2t;
448 G4double nse = term * f_1se + f0se + delta * f1se + (delta * delta) * f2se;
449 G4double nve = term * f_1ve + f0ve + delta * f1ve + (delta * delta) * f2ve;
450 G4double nte = term * f_1te + f0te + delta * f1te + (delta * delta) * f2te;
452 G4double nsg = term * f_1sg + f0sg + delta * f1sg + (delta * delta) * f2sg;
453 G4double nvg = term * f_1vg + f0vg + delta * f1vg + (delta * delta) * f2vg;
454 G4double ntg = term * f_1tg + f0tg + delta * f1tg + (delta * delta) * f2tg;
457 G4double term2 = 2.0 * nss + nv - nt;
458 G4double term3 = 2.0 * nss - 2.0 * nv + nt;
460 G4double term1e = 1.0 / 3.0 * (1.0 - 4.0 / 3.0 * del);
461 G4double term2e = 2.0 * nse + 5.0 * nve - nte;
462 G4double term3e = 2.0 * nse - 2.0 * nve + nte;
464 G4double term1g = 1.0 / 3.0 * (1.0 - 4.0 / 3.0 * del);
465 G4double term2g = 2.0 * nsg + 5.0 * nvg - ntg;
466 G4double term3g = 2.0 * nsg - 2.0 * nvg + ntg;
468 G4double som00 = term1 + (1.0 - 4.0 / 3.0 * rho) * term2 + eps * term3;
470 * (cthetaE * (nve - term1e * term2e + kap * term3e)
471 + cthetaG * (nvg - term1g * term2g + kap * term3g));
473 G4double som0 = (som00 + som01) / y;
474 som0 = fine_structure_const / 8. / (twopi * twopi * twopi) * som0;
G4GLOB_DLL std::ostream G4cout
Hep3Vector & rotateUz(const Hep3Vector &)
HepLorentzVector & boost(double, double, double)
G4MuonRadiativeDecayChannelWithSpin & operator=(const G4MuonRadiativeDecayChannelWithSpin &)
G4MuonRadiativeDecayChannelWithSpin(const G4String &theParentName, G4double theBR)
G4DecayProducts * DecayIt(G4double) override
G4double GetPDGMass() const
G4ParticleDefinition ** G4MT_daughters
void CheckAndFillParent()
const G4String & GetParentName() const
void SetBR(G4double value)
G4String ** daughters_name
G4int GetVerboseLevel() const
void SetNumberOfDaughters(G4int value)
G4ParticleDefinition * G4MT_parent
void CheckAndFillDaughters()
void SetDaughter(G4int anIndex, const G4ParticleDefinition *particle_type)
void ClearDaughtersName()
G4ThreeVector parent_polarization
void SetParent(const G4ParticleDefinition *particle_type)