97 const G4double theDaughterExcitation)
99 Qtransition(theQtransition), RandomEnergy(0)
103 G4cout <<
"G4NuclearDecayChannel constructor for " <<
G4int(theMode)
128 const G4double theDaughterExcitation,
131 Qtransition(theQtransition), RandomEnergy(0)
135 G4cout <<
"G4NuclearDecayChannel constructor for " <<
G4int(theMode)
164 const G4double theDaughterExcitation,
168 Qtransition(theQtransition)
172 G4cout <<
"G4NuclearDecayChannel constructor for " <<
G4int(theMode)
196 const G4double theDaughterExcitation)
200 if (A < 1 || Z < 0 || theDaughterExcitation < 0.0) {
202 ed <<
"Inappropriate values of daughter A, Z or excitation: "
203 << A <<
" , " << Z <<
" , " << theDaughterExcitation*
MeV <<
" MeV "
205 G4Exception(
"G4NuclearDecayChannel::FillDaughterNucleus()",
"HAD_RDM_006",
213 if (Z == 1 && A == 1) {
215 }
else if (Z == 0 && A == 1) {
232 deltaM = CLHEP::electron_mass_c2;
234 deltaM = 2.*CLHEP::electron_mass_c2;
235 }
else if (decayMode < 6 && decayMode > 2) {
236 deltaM = -CLHEP::electron_mass_c2;
256 ed <<
" No daughters defined " <<
G4endl;
257 G4Exception(
"G4NuclearDecayChannel::DecayIt()",
"HAD_RDM_005",
275 G4Exception(
"G4NuclearDecayChannel::DecayIt()",
"HAD_RDM_007",
283 G4Exception(
"G4NuclearDecayChannel::DecayIt()",
"HAD_RDM_008",
291 G4int shellIndex = -1;
301 daughterMomentum.setE(daughterMomentum.e() + exe);
348 ed << nFrags <<
" No fragments produced by photon evaporation. " <<
G4endl;
349 G4Exception(
"G4NuclearDecayChannel::DecayIt()",
"HAD_RDM_012",
351 }
else if (nFrags > 1) {
356 for (
G4int i = 0; i < nFrags - 1; i++) {
357 eOrGamma = gammas->operator[](i);
367 gammas->operator[](nFrags-1)->GetExcitationEnergy();
368 if (finalDaughterExcitation <= 1.0*
keV) finalDaughterExcitation = 0;
373 daughterMomentum.setE(daughterMomentum.e() - eOrGammaEnergy);
376 while (!gammas->empty() ) {
377 delete *(gammas->end()-1);
383 G4ThreeVector const daughterMomentum1(static_cast<const G4LorentzVector> (daughterMomentum));
417 G4Exception(
"G4NuclearDecayChannel::DecayIt()",
"HAD_RDM_009",
442 std::vector<G4DynamicParticle*> armProducts;
452 size_t narm = armProducts.size();
458 for (
size_t i = 0; i<narm; ++i) {
531 for (
G4int index = 0; index < 3; index++) {
549 daughtermomentum[0] = std::sqrt(daughterenergy[0]*(daughterenergy[0] + 2.*daughtermass[0]) );
555 G4double K = 0.5 - daughtermass[1]*daughtermass[1]/(2*Mme*Mme-4*pmass*daughterenergy[0]);
557 daughterenergy[2] = K * (Mme - daughterenergy[0] + rd*daughtermomentum[0]);
558 daughtermomentum[2] = daughterenergy[2];
561 daughterenergy[1] = Qtransition - daughterenergy[0] - daughterenergy[2];
563 daughterenergy[1]*(daughterenergy[1] + 2.0*daughtermass[1]);
564 if (recoilmomentumsquared < 0.0) recoilmomentumsquared = 0.0;
565 daughtermomentum[1] = std::sqrt(recoilmomentumsquared);
569 G4cout <<
" G4NuclearDecayChannel::BetaDecayIt() " <<
G4endl;
570 G4cout <<
" e- momentum: " <<daughtermomentum[0]/
GeV <<
" [GeV/c]" <<
G4endl;
571 G4cout <<
" daughter momentum: " <<daughtermomentum[1]/
GeV <<
" [GeV/c]" <<
G4endl;
572 G4cout <<
" nu momentum: " <<daughtermomentum[2]/
GeV <<
" [GeV/c]" <<
G4endl;
573 G4cout <<
" e- energy: " << daughtermass[0] + daughterenergy[0] <<
G4endl;
574 G4cout <<
" daughter energy: " << daughtermass[1] + daughterenergy[1] <<
G4endl;
575 G4cout <<
" nu energy: " << daughtermass[2] + daughterenergy[2] <<
G4endl;
576 G4cout <<
" total of daughter energies: " << daughtermass[0] + daughtermass[1] +
577 daughtermass[2] + daughterenergy[0] + daughterenergy[1] + daughterenergy[2]
581 G4double costheta, sintheta, phi, sinphi, cosphi;
582 G4double costhetan, sinthetan, phin, sinphin, cosphin;
584 sintheta = std::sqrt((1.0-costheta)*(1.0+costheta));
586 sinphi = std::sin(phi);
587 cosphi = std::cos(phi);
594 costhetan = (daughtermomentum[1]*daughtermomentum[1]-
595 daughtermomentum[2]*daughtermomentum[2]-
596 daughtermomentum[0]*daughtermomentum[0])/
597 (2.0*daughtermomentum[2]*daughtermomentum[0]);
599 if (costhetan > 1.) costhetan = 1.;
600 if (costhetan < -1.) costhetan = -1.;
601 sinthetan = std::sqrt((1.0-costhetan)*(1.0+costhetan));
603 sinphin = std::sin(phin);
604 cosphin = std::cos(phin);
606 direction2.setX(sinthetan*cosphin*costheta*cosphi -
607 sinthetan*sinphin*sinphi + costhetan*sintheta*cosphi);
608 direction2.setY(sinthetan*cosphin*costheta*sinphi +
609 sinthetan*sinphin*cosphi + costhetan*sintheta*sinphi);
610 direction2.setZ(-sinthetan*cosphin*sintheta + costhetan*costheta);
612 direction2*(daughtermomentum[2]/direction2.mag()));
617 (direction0*daughtermomentum[0] +
618 direction2*(daughtermomentum[2]/direction2.mag()))*(-1.0));
622 G4cout <<
"G4NuclearDecayChannel::BetaDecayIt ";
623 G4cout <<
" create decay products in rest frame " <<
G4endl;
virtual void SetICM(G4bool)
void CheckAndFillDaughters()
void SetBR(G4double value)
static G4LossTableManager * Instance()
G4bool IsFluoActive() const
std::ostringstream G4ExceptionDescription
CLHEP::Hep3Vector G4ThreeVector
virtual void RDMForced(G4bool)
G4int PushProducts(G4DynamicParticle *aParticle)
G4ParticleDefinition * G4MT_parent
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
G4double GetParentMass() const
G4ParticleDefinition ** G4MT_daughters
const G4ParticleDefinition * GetParticleDefinition() const
G4RandGeneral * RandomEnergy
G4double G4MT_parent_mass
virtual ~G4NuclearDecayChannel()
const G4RadioactiveDecayMode decayMode
const G4double Qtransition
virtual G4FragmentVector * BreakUp(const G4Fragment &theNucleus)
static G4Proton * Definition()
virtual const G4AtomicShell * GetAtomicShell(G4int Z, G4AtomicShellEnumerator shell)=0
G4IonTable * GetIonTable() const
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
G4double GetCreationTime() const
void SetNumberOfDaughters(G4int value)
const G4LorentzVector & GetMomentum() const
static const double twopi
std::vector< G4Fragment * > G4FragmentVector
G4DecayProducts * TwoBodyDecayIt()
G4LorentzVector Get4Momentum() const
G4int GetVacantShellNumber() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
void Set4Momentum(const G4LorentzVector &momentum)
G4double halflifethreshold
static const double nanosecond
G4int GetVerboseLevel() const
G4double GetPDGMass() const
static G4ParticleTable * GetParticleTable()
G4NuclearDecayChannel(const G4RadioactiveDecayMode &theMode, G4int Verbose)
G4DecayProducts * OneBodyDecayIt()
void SetParent(const G4ParticleDefinition *particle_type)
static G4EmParameters * Instance()
G4DynamicParticle * PopProducts()
void SetDaughter(G4int anIndex, const G4ParticleDefinition *particle_type)
G4DecayProducts * BetaDecayIt()
static G4Neutron * Definition()
G4ParticleDefinition * daughterNucleus
static G4ThreadLocal G4DynamicParticle * dynamicDaughter
G4VAtomDeexcitation * AtomDeexcitation()
static const G4double levelTolerance
void GenerateParticles(std::vector< G4DynamicParticle * > *secVect, const G4AtomicShell *, G4int Z, G4int coupleIndex)
G4double daughterExcitation
G4ThreeVector G4ParticleMomentum
void SetProperTime(G4double)
void SetParentMass(const G4double aParentMass)
G4DecayProducts * DecayIt(G4double)
void SetVerboseLevel(G4int verbose)
void CheckAndFillParent()
static const G4double pTolerance
CLHEP::HepLorentzVector G4LorentzVector
void FillDaughterNucleus(G4int index, G4int A, G4int Z, const G4double theDaughterExcitation)
static G4int GetNumberOfShells(G4int Z)