Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VGammaDeexcitation.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// $Id$
27//
28// -------------------------------------------------------------------
29// GEANT 4 class file
30//
31// CERN, Geneva, Switzerland
32//
33// File name: G4VGammaDeexcitation
34//
35// Author: Maria Grazia Pia ([email protected])
36//
37// Creation date: 23 October 1998
38//
39// Modifications:
40//
41// 21 Nov 2001, Fan Lei ([email protected])
42// Modified GenerateGamma() and UpdateUncleus() for implementation
43// of Internal Conversion processs
44//
45// 15 April 1999, Alessandro Brunengo ([email protected])
46// Added creation time evaluation for products of evaporation
47//
48// 19 April 2010, J. M. Quesada calculations in CM system
49// pending final boost to lab system (not critical)
50//
51// 23 April 2010, V.Ivanchenko rewite kinematic part using PDG formula
52// for 2-body decay
53//
54// 07 May 2011, V.Ivanchenko implement check ICM flag - produce or not e-
55//
56// -------------------------------------------------------------------
57
59
60#include "globals.hh"
62#include "Randomize.hh"
63#include "G4Gamma.hh"
64#include "G4Electron.hh"
65#include "G4LorentzVector.hh"
66#include "G4VGammaTransition.hh"
67#include "G4Fragment.hh"
68#include "G4FragmentVector.hh"
69
70#include "G4ParticleTable.hh"
71#include "G4IonTable.hh"
72
74
75
76G4VGammaDeexcitation::G4VGammaDeexcitation(): _transition(0), _verbose(0),
77 _electronO (0), _vSN(-1)
78{
79 _nucleus = 0;
80 fTimeLimit = DBL_MAX;
81}
82
84{
85 if (_transition != 0) { delete _transition; }
86}
87
89{
90 Initialize();
91 G4FragmentVector* products = new G4FragmentVector();
92
93 if (CanDoTransition())
94 {
95 G4Fragment* gamma = GenerateGamma();
96 if (gamma != 0) { products->push_back(gamma); }
97 }
98
99 if (_verbose > 1) {
100 G4cout << "G4VGammaDeexcitation::DoTransition - Transition deleted " << G4endl;
101 }
102
103 return products;
104}
105
107{
108 if (_verbose > 1) { G4cout << "G4VGammaDeexcitation::DoChain" << G4endl; }
109 const G4double tolerance = CLHEP::keV;
110
111 Initialize();
112 G4FragmentVector* products = new G4FragmentVector();
113
114 while (CanDoTransition())
115 {
117 G4Fragment* gamma = GenerateGamma();
118 if (gamma != 0)
119 {
120 products->push_back(gamma);
121 //G4cout << "Eex(keV)= " << _nucleus->GetExcitationEnergy()/keV << G4endl;
122 if(_nucleus->GetExcitationEnergy() <= tolerance) { break; }
123 Update();
124 }
125 }
126
127 if (_verbose > 1) {
128 G4cout << "G4VGammaDeexcitation::DoChain - Transition deleted, end of chain " << G4endl;
129 }
130
131 return products;
132}
133
135{
136 // 23/04/10 V.Ivanchenko rewrite complitely
137 G4double eGamma = 0.;
138
139 if (_transition) {
140 _transition->SelectGamma(); // it can be conversion electron too
141 eGamma = _transition->GetGammaEnergy();
142 //G4cout << "G4VGammaDeexcitation::GenerateGamma - Egam(MeV)= "
143 // << eGamma << G4endl;
144 if(eGamma <= 0.0) { return 0; }
145 } else { return 0; }
146
147 G4double excitation = _nucleus->GetExcitationEnergy() - eGamma;
148 if(excitation < 0.0) { excitation = 0.0; }
149 if (_verbose > 1)
150 {
151 G4cout << "G4VGammaDeexcitation::GenerateGamma - Edeexc(MeV)= " << eGamma
152 << " ** left Eexc(MeV)= " << excitation
153 << G4endl;
154 }
155
157
158 // Do complete Lorentz computation
159 G4LorentzVector lv = _nucleus->GetMomentum();
160 G4double Mass = _nucleus->GetGroundStateMass() + excitation;
161
162 // select secondary
164
165 G4DiscreteGammaTransition* dtransition =
166 dynamic_cast <G4DiscreteGammaTransition*> (_transition);
167
168 G4bool eTransition = false;
169 if (dtransition && !( dtransition->IsAGamma()) ) {
170 eTransition = true;
171 gamma = G4Electron::Electron();
172 _vSN = dtransition->GetOrbitNumber();
173 _electronO.RemoveElectron(_vSN);
174 lv += G4LorentzVector(0.0,0.0,0.0,CLHEP::electron_mass_c2 - dtransition->GetBondEnergy());
175 }
176
177 G4double cosTheta = 1. - 2. * G4UniformRand();
178 G4double sinTheta = std::sqrt(1. - cosTheta * cosTheta);
179 G4double phi = twopi * G4UniformRand();
180
181 G4double eMass = gamma->GetPDGMass();
182 G4LorentzVector Gamma4P;
183
184 //G4cout << "Egamma= " << eGamma << " Mass= " << eMass << " t= " << gammaTime
185 // << " tlim= " << fTimeLimit << G4endl;
186
187 if(gammaTime > fTimeLimit) {
188 // shortcut for long lived levels
189 // not correct position of stopping ion gamma emission
190 // 4-momentum balance is breaked
191 G4double e = eGamma + eMass;
192 G4double mom = std::sqrt(eGamma*(eGamma + 2*eMass));
193 Gamma4P.set(mom * sinTheta * std::cos(phi),
194 mom * sinTheta * std::sin(phi),
195 mom * cosTheta, e);
196 lv -= Gamma4P;
197 e = lv.e();
198 if(e < Mass) { e = Mass; }
199 mom = std::sqrt((e - Mass)*(e + Mass));
200 G4ThreeVector v = lv.vect().unit();
201 lv.set(mom*v.x(), mom*v.y(), mom*v.z(), e);
202
203 } else {
204 // 2-body decay in rest frame
205 G4double Ecm = lv.mag();
206 G4ThreeVector bst = lv.boostVector();
207
208 G4double GammaEnergy = 0.5*((Ecm - Mass)*(Ecm + Mass) + eMass*eMass)/Ecm;
209 if(GammaEnergy <= eMass) { return 0; }
210
211 G4double mom = std::sqrt((GammaEnergy - eMass)*(GammaEnergy + eMass));
212 Gamma4P.set(mom * sinTheta * std::cos(phi),
213 mom * sinTheta * std::sin(phi),
214 mom * cosTheta,
215 GammaEnergy);
216
217 Gamma4P.boost(bst);
218 lv -= Gamma4P;
219 }
220
221 // modified primary fragment
222 gammaTime += _nucleus->GetCreationTime();
223
224 _nucleus->SetMomentum(lv);
225 _nucleus->SetCreationTime(gammaTime);
226
227 // e- is not produced
228 if(eTransition && !dtransition->GetICM()) { return 0; }
229
230 // gamma or e- are produced
231 G4Fragment * thePhoton = new G4Fragment(Gamma4P,gamma);
232 thePhoton->SetCreationTime(gammaTime);
233
234 //G4cout << "G4VGammaDeexcitation::GenerateGamma : " << thePhoton << G4endl;
235 //G4cout << " Left nucleus: " << _nucleus << G4endl;
236 return thePhoton;
237}
238
240{
241 if (_transition != 0)
242 {
243 delete _transition;
244 _transition = 0;
245 if (_verbose > 1) {
246 G4cout << "G4VGammaDeexcitation::Update - Transition deleted " << G4endl;
247 }
248 }
249
251 if (_transition != 0)
252 {
254 // if ( _vSN != -1) (dynamic_cast <G4DiscreteGammaTransition*> (_transition))->SetICM(false);
255 // the above line is commented out for bug fix #952. It was intruduced for reason that
256 // the k-shell electron is most likely one to be kicked out and there is no time for
257 // the atom to deexcite before the next IC. But this limitation is causing other problems as
258 // reported in #952
259 }
260
261 return;
262}
std::vector< G4Fragment * > G4FragmentVector
Definition: G4Fragment.hh:65
CLHEP::HepLorentzVector G4LorentzVector
double G4double
Definition: G4Types.hh:64
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
double z() const
Hep3Vector unit() const
double x() const
double y() const
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
Hep3Vector vect() const
void set(double x, double y, double z, double t)
G4int RemoveElectron(G4int orbit, G4int number=1)
static G4Electron * Electron()
Definition: G4Electron.cc:94
G4double GetGroundStateMass() const
Definition: G4Fragment.hh:240
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:235
const G4LorentzVector & GetMomentum() const
Definition: G4Fragment.hh:251
G4double GetCreationTime() const
Definition: G4Fragment.hh:378
void SetCreationTime(G4double time)
Definition: G4Fragment.hh:383
void SetMomentum(const G4LorentzVector &value)
Definition: G4Fragment.hh:256
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
G4FragmentVector * DoChain()
G4FragmentVector * DoTransition()
virtual G4VGammaTransition * CreateTransition()=0
G4VGammaTransition * _transition
virtual G4bool CanDoTransition()=0
virtual G4double GetGammaEnergy()=0
virtual void SelectGamma()=0
virtual void SetEnergyFrom(G4double energy)=0
virtual G4double GetGammaCreationTime()=0
#define DBL_MAX
Definition: templates.hh:83