Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ITDecay.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26////////////////////////////////////////////////////////////////////////////////
27// //
28// File: G4ITDecay.cc //
29// Author: D.H. Wright (SLAC) //
30// Date: 14 November 2014 //
31// //
32////////////////////////////////////////////////////////////////////////////////
33
34#include "G4ITDecay.hh"
35#include "G4IonTable.hh"
36#include "G4ThreeVector.hh"
37#include "G4LorentzVector.hh"
38#include "G4DynamicParticle.hh"
39#include "G4DecayProducts.hh"
42#include "G4AtomicShells.hh"
43#include "G4Electron.hh"
44#include "G4LossTableManager.hh"
45#include "G4Fragment.hh"
46#include "G4SystemOfUnits.hh"
48
49
51 const G4double& branch, const G4double& Qvalue,
52 const G4double& excitationE, G4PhotonEvaporation* aPhotoEvap)
53 : G4NuclearDecay("IT decay", IT, excitationE, noFloat), transitionQ(Qvalue),
54 applyARM(true), photonEvaporation(aPhotoEvap)
55{
56 SetParent(theParentNucleus); // Store name of parent nucleus, delete G4MT_parent
57 SetBR(branch);
58
59 parentZ = theParentNucleus->GetAtomicNumber();
60 parentA = theParentNucleus->GetAtomicMass();
61
63 G4IonTable* theIonTable =
65 SetDaughter(0, theIonTable->GetIon(parentZ, parentA, excitationE, noFloat) );
66}
67
68
70{}
71
72
74{
75 // Fill G4MT_parent with theParentNucleus (stored by SetParent in ctor)
77
78 // Set up final state
79 // parentParticle is set at rest here because boost with correct momentum
80 // is done later
82 G4ThreeVector(0.,0.,0.) );
83 G4DynamicParticle parentParticle(G4MT_parent, atRest);
84 G4DecayProducts* products = new G4DecayProducts(parentParticle);
85
86 // Let G4PhotonEvaporation do the decay
87 G4Fragment parentNucleus(parentA, parentZ, atRest);
88
89 G4Fragment* eOrGamma = photonEvaporation->EmittedFragment(&parentNucleus);
90
91 // Modified nuclide is returned as dynDaughter
92 G4IonTable* theIonTable =
94 G4ParticleDefinition* daughterIon =
95 theIonTable->GetIon(parentZ, parentA, parentNucleus.GetExcitationEnergy(),
97 G4DynamicParticle* dynDaughter = new G4DynamicParticle(daughterIon,
98 parentNucleus.GetMomentum());
99
100 if (eOrGamma) {
101 G4DynamicParticle* eOrGammaDyn =
103 eOrGamma->GetMomentum() );
104 eOrGammaDyn->SetProperTime(eOrGamma->GetCreationTime() );
105 products->PushProducts(eOrGammaDyn);
106 delete eOrGamma;
107
108 // Now do atomic relaxation if e- is emitted
109 if (applyARM) {
110 G4int shellIndex = photonEvaporation->GetVacantShellNumber();
111 if (shellIndex > -1) {
112 G4VAtomDeexcitation* atomDeex =
114 if (atomDeex->IsFluoActive() && parentZ > 5 && parentZ < 105) {
115 G4int nShells = G4AtomicShells::GetNumberOfShells(parentZ);
116 if (shellIndex >= nShells) shellIndex = nShells;
118 const G4AtomicShell* shell = atomDeex->GetAtomicShell(parentZ, as);
119 std::vector<G4DynamicParticle*> armProducts;
120
121 // VI, SI
122 // Allows fixing of Bugzilla 1727
123 G4double deexLimit = 0.1*keV;
124 if (G4EmParameters::Instance()->DeexcitationIgnoreCut()) deexLimit =0.;
125 //
126
127 atomDeex->GenerateParticles(&armProducts, shell, parentZ, deexLimit,
128 deexLimit);
129 G4double productEnergy = 0.;
130 for (G4int i = 0; i < G4int(armProducts.size()); i++)
131 productEnergy += armProducts[i]->GetKineticEnergy();
132
133 G4double deficit = shell->BindingEnergy() - productEnergy;
134 if (deficit > 0.0) {
135 // Add a dummy electron to make up extra energy
136 G4double cosTh = 1.-2.*G4UniformRand();
137 G4double sinTh = std::sqrt(1.- cosTh*cosTh);
138 G4double phi = twopi*G4UniformRand();
139
140 G4ThreeVector electronDirection(sinTh*std::sin(phi),
141 sinTh*std::cos(phi), cosTh);
142 G4DynamicParticle* extra =
143 new G4DynamicParticle(G4Electron::Electron(), electronDirection,
144 deficit);
145 armProducts.push_back(extra);
146 }
147
148 std::size_t nArm = armProducts.size();
149 if (nArm > 0) {
150 G4ThreeVector bst = dynDaughter->Get4Momentum().boostVector();
151 for (std::size_t i = 0; i < nArm; ++i) {
152 G4DynamicParticle* dp = armProducts[i];
153 G4LorentzVector lv = dp->Get4Momentum().boost(bst);
154 dp->Set4Momentum(lv);
155 products->PushProducts(dp);
156 }
157 }
158 }
159 }
160 } // if ARM on
161 } // eOrGamma
162
163 products->PushProducts(dynDaughter);
164
165 // Energy conservation check
166 /*
167 G4int newSize = products->entries();
168 G4DynamicParticle* temp = 0;
169 G4double KEsum = 0.0;
170 for (G4int i = 0; i < newSize; i++) {
171 temp = products->operator[](i);
172 KEsum += temp->GetKineticEnergy();
173 }
174 G4double eCons = G4MT_parent->GetPDGMass() - dynDaughter->GetMass() - KEsum;
175 G4cout << " IT check: Ediff (keV) = " << eCons/keV << G4endl;
176 */
177 return products;
178}
179
180
182{
183 G4cout << " G4ITDecay for parent nucleus " << GetParentName() << G4endl;
184 G4cout << " decays to " << GetDaughterName(0)
185 << " + gammas (or electrons), with branching ratio " << GetBR()
186 << "% and Q value " << transitionQ << G4endl;
187}
188
G4AtomicShellEnumerator
#define noFloat
Definition: G4Ions.hh:112
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
G4double BindingEnergy() const
static G4int GetNumberOfShells(G4int Z)
G4int PushProducts(G4DynamicParticle *aParticle)
void SetProperTime(G4double)
G4LorentzVector Get4Momentum() const
void Set4Momentum(const G4LorentzVector &momentum)
static G4Electron * Electron()
Definition: G4Electron.cc:93
static G4EmParameters * Instance()
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:312
const G4LorentzVector & GetMomentum() const
Definition: G4Fragment.hh:322
G4double GetCreationTime() const
Definition: G4Fragment.hh:479
G4int GetFloatingLevelNumber() const
Definition: G4Fragment.hh:458
const G4ParticleDefinition * GetParticleDefinition() const
Definition: G4Fragment.hh:469
virtual G4DecayProducts * DecayIt(G4double)
Definition: G4ITDecay.cc:73
G4ITDecay(const G4ParticleDefinition *theParentNucleus, const G4double &theBR, const G4double &Qvalue, const G4double &excitation, G4PhotonEvaporation *aPhotonEvap)
Definition: G4ITDecay.cc:50
virtual ~G4ITDecay()
Definition: G4ITDecay.cc:69
virtual void DumpNuclearInfo()
Definition: G4ITDecay.cc:181
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
Definition: G4IonTable.cc:522
static G4Ions::G4FloatLevelBase FloatLevelBase(char flbChar)
Definition: G4Ions.cc:110
static G4LossTableManager * Instance()
G4VAtomDeexcitation * AtomDeexcitation()
G4int GetAtomicNumber() const
G4int GetAtomicMass() const
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
G4int GetVacantShellNumber() const
G4Fragment * EmittedFragment(G4Fragment *theNucleus) override
virtual const G4AtomicShell * GetAtomicShell(G4int Z, G4AtomicShellEnumerator shell)=0
void GenerateParticles(std::vector< G4DynamicParticle * > *secVect, const G4AtomicShell *, G4int Z, G4int coupleIndex)
G4double GetBR() const
const G4String & GetParentName() const
void SetBR(G4double value)
void SetNumberOfDaughters(G4int value)
G4ParticleDefinition * G4MT_parent
void SetDaughter(G4int anIndex, const G4ParticleDefinition *particle_type)
const G4String & GetDaughterName(G4int anIndex) const
void SetParent(const G4ParticleDefinition *particle_type)