117 FillDaughterNucleus (0, A, Z, theDaughterExcitation);
150 FillDaughterNucleus (1, A, Z, theDaughterExcitation);
187 FillDaughterNucleus(1, A, Z, theDaughterExcitation);
196void G4NuclearDecayChannel::FillDaughterNucleus(
G4int index,
G4int A,
G4int Z,
201 if (A<1 || Z<0 || theDaughterExcitation <0.0)
208 ed <<
"Inappropriate values of daughter A, Z or excitation: "
209 << A <<
" , " << Z <<
" , " << theDaughterExcitation*MeV <<
" MeV "
211 G4Exception(
"G4NuclearDecayChannel::FillDaughterNucleus()",
"HAD_RDM_006",
221 if (Z == 1 && A == 1) {
223 }
else if (Z == 0 && A == 1) {
251 if (
decayMode == 2) theParentMass -= 2*0.511 * MeV;
256 G4cout <<
"the decay mass = " << theParentMass <<
G4endl;
269 G4cerr <<
"G4NuclearDecayChannel::DecayIt ";
279 products = BetaDecayIt();
289 G4Exception(
"G4NuclearDecayChannel::DecayIt()",
"HAD_RDM_007",
297 G4Exception(
"G4NuclearDecayChannel::DecayIt()",
"HAD_RDM_008",
306 G4int shellIndex = -1;
348 gammas = deexcitation->
BreakUp(nucleus);
350 gammas = deexcitation->
BreakItUp(nucleus);
355 G4int nGammas=gammas->size()-1;
360 for (
G4int ig = 0; ig < nGammas; ig++) {
363 gammas->operator[](ig)->GetMomentum());
364 theGammaRay -> SetProperTime(gammas->operator[](ig)->GetCreationTime());
369 G4double finalDaughterExcitation = gammas->operator[](nGammas)->GetExcitationEnergy();
371 if (finalDaughterExcitation <= 1.0*keV) finalDaughterExcitation = 0;
386 while (!gammas->empty()) {
387 delete *(gammas->end()-1);
421 G4Exception(
"G4NuclearDecayChannel::DecayIt()",
"HAD_RDM_009",
446 std::vector<G4DynamicParticle*> armProducts;
449 size_t narm = armProducts.size();
455 for (
size_t i = 0; i<narm; ++i) {
532 for (
G4int index=0; index<3; index++)
535 sumofdaughtermass += daughtermass[index];
544 delete parentparticle;
546 G4double Q = pmass - sumofdaughtermass;
553 daughtermomentum[0] = std::sqrt(daughterenergy[0]*daughterenergy[0] +
554 2.0*daughterenergy[0] * daughtermass[0]);
560 G4double K=0.5-daughtermass[1]*daughtermass[1]/(2*Mme*Mme-4*pmass*daughterenergy[0]);
562 daughterenergy[2]=K*(Mme-daughterenergy[0]+rd*daughtermomentum[0]);
563 daughtermomentum[2] = daughterenergy[2] ;
566 daughterenergy[1] = Q-daughterenergy[0]-daughterenergy[2];
567 G4double recoilmomentumsquared = daughterenergy[1]*daughterenergy[1] +
568 2.0*daughterenergy[1] * daughtermass[1];
569 if (recoilmomentumsquared < 0.0) recoilmomentumsquared = 0.0;
570 daughtermomentum[1] = std::sqrt(recoilmomentumsquared);
574 G4cout <<
" daughter 0:" <<daughtermomentum[0]/GeV <<
"[GeV/c]" <<
G4endl;
575 G4cout <<
" daughter 1:" <<daughtermomentum[1]/GeV <<
"[GeV/c]" <<
G4endl;
576 G4cout <<
" daughter 2:" <<daughtermomentum[2]/GeV <<
"[GeV/c]" <<
G4endl;
579 G4double costheta, sintheta, phi, sinphi, cosphi;
580 G4double costhetan, sinthetan, phin, sinphin, cosphin;
582 sintheta = std::sqrt((1.0-costheta)*(1.0+costheta));
584 sinphi = std::sin(phi);
585 cosphi = std::cos(phi);
591 costhetan = (daughtermomentum[1]*daughtermomentum[1]-
592 daughtermomentum[2]*daughtermomentum[2]-
593 daughtermomentum[0]*daughtermomentum[0])/
594 (2.0*daughtermomentum[2]*daughtermomentum[0]);
597 if (costhetan > 1.) costhetan = 1.;
598 if (costhetan < -1.) costhetan = -1.;
599 sinthetan = std::sqrt((1.0-costhetan)*(1.0+costhetan));
601 sinphin = std::sin(phin);
602 cosphin = std::cos(phin);
604 direction2.
setX(sinthetan*cosphin*costheta*cosphi -
605 sinthetan*sinphin*sinphi + costhetan*sintheta*cosphi);
606 direction2.
setY(sinthetan*cosphin*costheta*sinphi +
607 sinthetan*sinphin*cosphi + costhetan*sintheta*sinphi);
608 direction2.
setZ(-sinthetan*cosphin*sintheta + costhetan*costheta);
610 direction2*(daughtermomentum[2]/direction2.
mag()));
615 (direction0*daughtermomentum[0] +
616 direction2*(daughtermomentum[2]/direction2.
mag()))*(-1.0));
620 G4cout <<
"G4NuclearDecayChannel::BetaDecayIt ";
621 G4cout <<
" create decay products in rest frame " <<
G4endl;
std::vector< G4Fragment * > G4FragmentVector
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
static G4int GetNumberOfShells(G4int Z)
G4DynamicParticle * PopProducts()
G4int PushProducts(G4DynamicParticle *aParticle)
G4LorentzVector Get4Momentum() const
void Set4Momentum(const G4LorentzVector &momentum)
G4DecayProducts * OneBodyDecayIt()
void SetParentMass(const G4double aParentMass)
G4DecayProducts * TwoBodyDecayIt()
G4double GetParentMass() const
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int J=0)
static G4LossTableManager * Instance()
G4VAtomDeexcitation * AtomDeexcitation()
static G4Neutron * Definition()
G4ParticleDefinition * daughterNucleus
G4RadioactiveDecayMode decayMode
G4NuclearDecayChannel(const G4RadioactiveDecayMode &, G4int Verbose)
G4double halflifethreshold
CLHEP::RandGeneral * RandomEnergy
G4DynamicParticle * dynamicDaughter
static const G4double levelTolerance
G4DecayProducts * DecayIt(G4double theParentMass)
static const G4double pTolerance
G4double daughterExcitation
G4double GetPDGMass() const
static G4ParticleTable * GetParticleTable()
G4IonTable * GetIonTable()
virtual G4FragmentVector * BreakItUp(const G4Fragment &nucleus)
void SetMaxHalfLife(G4double)
G4int GetVacantShellNumber()
virtual G4FragmentVector * BreakUp(const G4Fragment &nucleus)
void SetVerboseLevel(G4int verbose)
static G4Proton * Definition()
virtual const G4AtomicShell * GetAtomicShell(G4int Z, G4AtomicShellEnumerator shell)=0
void GenerateParticles(std::vector< G4DynamicParticle * > *secVect, const G4AtomicShell *, G4int Z, G4int coupleIndex)
G4bool IsFluoActive() const
void SetBR(G4double value)
G4int GetVerboseLevel() const
void SetNumberOfDaughters(G4int value)
void SetDaughter(G4int anIndex, const G4ParticleDefinition *particle_type)
G4ParticleDefinition * parent
G4ParticleDefinition ** daughters
void SetParent(const G4ParticleDefinition *particle_type)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
std::ostringstream G4ExceptionDescription