269 G4double daughtermass[3], daughterwidth[3];
271 G4double sumofdaughterwidthsq = 0.0;
275 sumofdaughtermass += daughtermass[
index];
277 sumofdaughterwidthsq += daughterwidth[
index]*daughterwidth[
index];
278 withWidth = withWidth ||(daughterwidth[
index]>1.0e-3*daughtermass[
index]);
288 delete parentparticle;
292 G4double maxDev = (parentmass - sumofdaughtermass )/std::sqrt(sumofdaughterwidthsq) ;
296 G4cout <<
"G4PhaseSpaceDecayChannel::ThreeBodyDecayIt " 297 <<
"sum of daughter mass is larger than parent mass" <<
G4endl;
304 G4Exception(
"G4PhaseSpaceDecayChannel::ThreeBodyDecayIt",
306 "Can not create decay products: sum of daughter mass is larger than parent mass");
312 while (dm1+dm2+dm3>parentmass){
313 dm1=
DynamicalMass(daughtermass[0],daughterwidth[0], maxDev);
314 dm2=
DynamicalMass(daughtermass[1],daughterwidth[1], maxDev);
315 dm3=
DynamicalMass(daughtermass[2],daughterwidth[2], maxDev);
317 daughtermass[0] = dm1;
318 daughtermass[1] = dm2;
319 daughtermass[2] = dm3;
320 sumofdaughtermass = dm1+dm2+dm3;
327 sumofdaughtermass = daughtermass[0] + daughtermass[1] + daughtermass[2];
330 if (sumofdaughtermass >parentmass) {
333 G4cout <<
"G4PhaseSpaceDecayChannel::ThreeBodyDecayIt " 334 <<
"sum of daughter mass is larger than parent mass" <<
G4endl;
344 G4Exception(
"G4PhaseSpaceDecayChannel::ThreeBodyDecayIt",
346 "Can not create decay products: sum of daughter mass is larger than parent mass");
356 G4double momentummax=0.0, momentumsum = 0.0;
358 const size_t MAX_LOOP=10000;
360 for (
size_t loop_counter=0; loop_counter <MAX_LOOP; ++loop_counter){
371 energy = rd2*(parentmass - sumofdaughtermass);
372 daughtermomentum[0] = std::sqrt(energy*energy + 2.0*energy* daughtermass[0]);
373 if ( daughtermomentum[0] >momentummax )momentummax = daughtermomentum[0];
374 momentumsum += daughtermomentum[0];
376 energy = (1.-rd1)*(parentmass - sumofdaughtermass);
377 daughtermomentum[1] = std::sqrt(energy*energy + 2.0*energy* daughtermass[1]);
378 if ( daughtermomentum[1] >momentummax )momentummax = daughtermomentum[1];
379 momentumsum += daughtermomentum[1];
381 energy = (rd1-rd2)*(parentmass - sumofdaughtermass);
382 daughtermomentum[2] = std::sqrt(energy*energy + 2.0*energy* daughtermass[2]);
383 if ( daughtermomentum[2] >momentummax )momentummax = daughtermomentum[2];
384 momentumsum += daughtermomentum[2];
385 if (momentummax <= momentumsum - momentummax )
break;
391 G4cout <<
" daughter 0:" << daughtermomentum[0]/
GeV <<
"[GeV/c]" <<
G4endl;
392 G4cout <<
" daughter 1:" << daughtermomentum[1]/
GeV <<
"[GeV/c]" <<
G4endl;
393 G4cout <<
" daughter 2:" << daughtermomentum[2]/
GeV <<
"[GeV/c]" <<
G4endl;
399 G4double costheta, sintheta, phi, sinphi, cosphi;
400 G4double costhetan, sinthetan, phin, sinphin, cosphin;
402 sintheta = std::sqrt((1.0-costheta)*(1.0+costheta));
404 sinphi = std::sin(phi);
405 cosphi = std::cos(phi);
407 G4ThreeVector direction0(sintheta*cosphi,sintheta*sinphi,costheta);
408 G4double Ekin = std::sqrt(daughtermomentum[0]*daughtermomentum[0] + daughtermass[0]*daughtermass[0]) - daughtermass[0];
411 Ekin, daughtermass[0]);
414 costhetan = (daughtermomentum[1]*daughtermomentum[1]-daughtermomentum[2]*daughtermomentum[2]-daughtermomentum[0]*daughtermomentum[0])/(2.0*daughtermomentum[2]*daughtermomentum[0]);
415 sinthetan = std::sqrt((1.0-costhetan)*(1.0+costhetan));
417 sinphin = std::sin(phin);
418 cosphin = std::cos(phin);
420 direction2.
setX( sinthetan*cosphin*costheta*cosphi - sinthetan*sinphin*sinphi + costhetan*sintheta*cosphi);
421 direction2.
setY( sinthetan*cosphin*costheta*sinphi + sinthetan*sinphin*cosphi + costhetan*sintheta*sinphi);
422 direction2.
setZ( -sinthetan*cosphin*sintheta + costhetan*costheta);
424 Ekin = std::sqrt(pmom.
mag2() + daughtermass[2]*daughtermass[2]) - daughtermass[2];
427 Ekin, daughtermass[2]);
430 pmom = (direction0*daughtermomentum[0] + direction2*(daughtermomentum[2]/direction2.
mag()))*(-1.0);
431 Ekin = std::sqrt(pmom.
mag2() + daughtermass[1]*daughtermass[1]) - daughtermass[1];
435 Ekin, daughtermass[1]);
440 G4cout <<
"G4PhaseSpaceDecayChannel::ThreeBodyDecayIt ";
441 G4cout <<
" create decay products in rest frame " <<
G4endl;
G4double * G4MT_daughters_mass
G4int PushProducts(G4DynamicParticle *aParticle)
G4double givenDaughterMasses[MAX_N_DAUGHTERS]
G4ParticleDefinition * G4MT_parent
G4Cache< G4double > current_parent_mass
G4ParticleDefinition ** G4MT_daughters
G4double DynamicalMass(G4double massPDG, G4double width, G4double maxDev=+1.) const
G4bool useGivenDaughterMass
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
static const double twopi
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double * G4MT_daughters_width
G4int GetVerboseLevel() const