51 parentmass(0.), theDaughterMasses(0)
58 G4int theNumberOfDaughters,
85 G4int theNumberOfDaughters,
95 parentmass(theParentMass),
104 G4int theNumberOfDaughters,
111 theNumberOfDaughters,
115 parentmass(theParentMass),
116 theDaughterMasses(masses)
124 G4int theNumberOfDaughters,
132 theNumberOfDaughters,
137 parentmass(theParentMass),
138 theDaughterMasses(masses)
158 G4cout <<
"G4GeneralPhaseSpaceDecay::DecayIt ";
176 G4cout <<
"G4GeneralPhaseSpaceDecay::DecayIt ";
195 delete parentparticle;
203 G4cout <<
"G4GeneralPhaseSpaceDecay::OneBodyDecayIt ";
204 G4cout <<
" create decay products in rest frame " <<
G4endl;
234 delete parentparticle;
237 daughtermomentum =
Pmx(
parentmass,daughtermass[0],daughtermass[1]);
239 G4double sintheta = std::sqrt((1.0 - costheta)*(1.0 + costheta));
244 G4double Etotal= std::sqrt(daughtermass[0]*daughtermass[0] + daughtermomentum*daughtermomentum);
247 Etotal= std::sqrt(daughtermass[1]*daughtermass[1] + daughtermomentum*daughtermomentum);
253 G4cout <<
"G4GeneralPhaseSpaceDecay::TwoBodyDecayIt ";
254 G4cout <<
" create decay products in rest frame " <<
G4endl;
268 for (
G4int index=0; index<3; index++)
276 sumofdaughtermass += daughtermass[index];
285 delete parentparticle;
291 G4double momentummax=0.0, momentumsum = 0.0;
293 const G4int maxNumberOfLoops = 10000;
294 G4int loopCounter = 0;
310 energy = rd2*(
parentmass - sumofdaughtermass);
311 daughtermomentum[0] = std::sqrt(energy*energy + 2.0*energy* daughtermass[0]);
312 if ( daughtermomentum[0] >momentummax )momentummax = daughtermomentum[0];
313 momentumsum += daughtermomentum[0];
316 energy = (1.-rd1)*(
parentmass - sumofdaughtermass);
317 daughtermomentum[1] = std::sqrt(energy*energy + 2.0*energy* daughtermass[1]);
318 if ( daughtermomentum[1] >momentummax )momentummax = daughtermomentum[1];
319 momentumsum += daughtermomentum[1];
322 energy = (rd1-rd2)*(
parentmass - sumofdaughtermass);
323 daughtermomentum[2] = std::sqrt(energy*energy + 2.0*energy* daughtermass[2]);
324 if ( daughtermomentum[2] >momentummax )momentummax = daughtermomentum[2];
325 momentumsum += daughtermomentum[2];
326 }
while ( ( momentummax > momentumsum - momentummax ) &&
327 ++loopCounter < maxNumberOfLoops );
328 if ( loopCounter >= maxNumberOfLoops ) {
330 ed <<
" Failed sampling after maxNumberOfLoops attempts : forced exit" <<
G4endl;
336 G4cout <<
" daughter 0:" << daughtermomentum[0]/
GeV <<
"[GeV/c]" <<
G4endl;
337 G4cout <<
" daughter 1:" << daughtermomentum[1]/
GeV <<
"[GeV/c]" <<
G4endl;
338 G4cout <<
" daughter 2:" << daughtermomentum[2]/
GeV <<
"[GeV/c]" <<
G4endl;
343 G4double costheta, sintheta, phi, sinphi, cosphi;
344 G4double costhetan, sinthetan, phin, sinphin, cosphin;
346 sintheta = std::sqrt((1.0-costheta)*(1.0+costheta));
348 sinphi = std::sin(phi);
349 cosphi = std::cos(phi);
351 G4double Etotal=std::sqrt( daughtermass[0]*daughtermass[0] + daughtermomentum[0]*daughtermomentum[0]);
356 costhetan = (daughtermomentum[1]*daughtermomentum[1]-daughtermomentum[2]*daughtermomentum[2]-daughtermomentum[0]*daughtermomentum[0])/(2.0*daughtermomentum[2]*daughtermomentum[0]);
357 sinthetan = std::sqrt((1.0-costhetan)*(1.0+costhetan));
359 sinphin = std::sin(phin);
360 cosphin = std::cos(phin);
362 direction2.setX( sinthetan*cosphin*costheta*cosphi - sinthetan*sinphin*sinphi + costhetan*sintheta*cosphi);
363 direction2.setY( sinthetan*cosphin*costheta*sinphi + sinthetan*sinphin*cosphi + costhetan*sintheta*sinphi);
364 direction2.setZ( -sinthetan*cosphin*sintheta + costhetan*costheta);
365 Etotal=std::sqrt( daughtermass[2]*daughtermass[2] + daughtermomentum[2]*daughtermomentum[2]/direction2.mag2());
368 G4ThreeVector mom=(direction0*daughtermomentum[0] + direction2*(daughtermomentum[2]/direction2.mag()))*(-1.0);
369 Etotal= std::sqrt( daughtermass[1]*daughtermass[1] + mom.mag2() );
375 G4cout <<
"G4GeneralPhaseSpaceDecay::ThreeBodyDecayIt ";
376 G4cout <<
" create decay products in rest frame " <<
G4endl;
403 sumofdaughtermass += daughtermass[index];
413 G4int numberOfTry = 0;
421 for(index1 =1; index1 < numberOfDaughters -1; index1++)
423 rd[ numberOfDaughters -1] = 0.0;
424 for(index1 =1; index1 < numberOfDaughters -1; index1++) {
426 if (rd[index1] < rd[index2]){
428 rd[index1] = rd[index2];
436 temp = sumofdaughtermass;
438 sm[index1] = rd[index1]*tmas + temp;
439 temp -= daughtermass[index1];
441 G4cout << index1 <<
" rundom number:" << rd[index1];
449 index1 =numberOfDaughters-1;
450 daughtermomentum[index1]=
Pmx( sm[index1-1],daughtermass[index1-1],sm[index1]);
453 G4cout <<
" momentum:" << daughtermomentum[index1]/
GeV <<
"[GeV/c]" <<
G4endl;
455 for(index1 =numberOfDaughters-2; index1>=0; index1--) {
457 daughtermomentum[index1]=
Pmx( sm[index1],daughtermass[index1], sm[index1 +1]);
458 if(daughtermomentum[index1] < 0.0) {
461 G4cout <<
"G4GeneralPhaseSpaceDecay::ManyBodyDecayIt ";
462 G4cout <<
" can not calculate daughter momentum " <<
G4endl;
466 G4cout <<
" mass:" << daughtermass[index1]/
GeV <<
"[GeV/c/c]" ;
467 G4cout <<
" mass:" << daughtermomentum[index1]/
GeV <<
"[GeV/c]" <<
G4endl;
470 delete [] daughtermass;
471 delete [] daughtermomentum;
476 weight *= daughtermomentum[index1]/sm[index1];
479 G4cout <<
" momentum:" << daughtermomentum[index1]/
GeV <<
"[GeV/c]" <<
G4endl;
488 if (numberOfTry++ >100) {
490 G4cout <<
"G4GeneralPhaseSpaceDecay::ManyBodyDecayIt: ";
491 G4cout <<
" can not determine Decay Kinematics " <<
G4endl;
494 delete [] daughtermass;
495 delete [] daughtermomentum;
500 G4cout <<
"Start calulation of daughters momentum vector "<<
G4endl;
507 index1 = numberOfDaughters -2;
509 sintheta = std::sqrt((1.0-costheta)*(1.0+costheta));
511 direction.setZ(costheta);
512 direction.setY(sintheta*std::sin(phi));
513 direction.setX(sintheta*std::cos(phi));
517 for (index1 = numberOfDaughters -3; index1 >= 0; index1--) {
520 sintheta = std::sqrt((1.0-costheta)*(1.0+costheta));
522 direction.setZ(costheta);
523 direction.setY(sintheta*std::sin(phi));
524 direction.setX(sintheta*std::cos(phi));
527 beta = daughtermomentum[index1];
528 beta /= std::sqrt( daughtermomentum[index1]*daughtermomentum[index1] + sm[index1+1]*sm[index1+1] );
535 p4.boost( direction.x()*beta, direction.y()*beta, direction.z()*beta);
546 direction.setX(1.0); direction.setY(0.0); direction.setZ(0.0);
549 delete parentparticle;
554 G4cout <<
"G4GeneralPhaseSpaceDecay::ManyBodyDecayIt ";
555 G4cout <<
" create decay products in rest frame " <<
G4endl;
559 delete [] daughterparticle;
560 delete [] daughtermomentum;
561 delete [] daughtermass;
void CheckAndFillDaughters()
std::ostringstream G4ExceptionDescription
CLHEP::Hep3Vector G4ThreeVector
G4int PushProducts(G4DynamicParticle *aParticle)
G4DecayProducts * ManyBodyDecayIt()
G4ParticleDefinition * G4MT_parent
G4ParticleDefinition ** G4MT_daughters
G4GeneralPhaseSpaceDecay(G4int Verbose=1)
G4DecayProducts * ThreeBodyDecayIt()
const G4double * theDaughterMasses
G4GLOB_DLL std::ostream G4cout
virtual ~G4GeneralPhaseSpaceDecay()
static const double twopi
G4DecayProducts * TwoBodyDecayIt()
G4LorentzVector Get4Momentum() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
virtual G4DecayProducts * DecayIt(G4double mass=0.0)
void Set4Momentum(const G4LorentzVector &momentum)
G4int GetVerboseLevel() const
static G4double Pmx(G4double e, G4double p1, G4double p2)
G4double GetPDGMass() const
G4double energy(const ThreeVector &p, const G4double m)
G4DecayProducts * OneBodyDecayIt()
G4ThreeVector G4ParticleMomentum
G4String ** daughters_name
void CheckAndFillParent()
CLHEP::HepLorentzVector G4LorentzVector