51                           parentmass(0.), theDaughterMasses(0)
    58                                        G4int           theNumberOfDaughters,
    85                                        G4int           theNumberOfDaughters,
   104                                        G4int           theNumberOfDaughters,
   111                                theNumberOfDaughters,
   124                                        G4int           theNumberOfDaughters,
   132                                theNumberOfDaughters,
   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;
   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
 
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()
 
HepLorentzVector & boost(double, double, double)
 
static const double twopi
 
G4DecayProducts * TwoBodyDecayIt()
 
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)
 
static G4double Pmx(G4double e, G4double p1, G4double p2)
 
G4DecayProducts * OneBodyDecayIt()
 
G4double GetPDGMass() const
 
G4LorentzVector Get4Momentum() const
 
G4int GetVerboseLevel() const
 
G4String ** daughters_name
 
void CheckAndFillParent()