Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4DiscreteGammaTransition.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: G4DiscreteGammaTransition
34 //
35 // Author: Maria Grazia Pia (pia@genova.infn.it)
36 //
37 // Creation date: 23 October 1998
38 //
39 // Modifications:
40 // 15 April 1999, Alessandro Brunengo (Alessandro.Brunengo@ge.infn.it)
41 // Added creation time evaluation for products of evaporation
42 //
43 // 21 Nov. 2001, Fan Lei (flei@space.qinetiq.com)
44 // i) added G4int _nucleusZ initialise it through the constructor
45 // ii) modified SelectGamma() to allow the generation of conversion electrons
46 // iii) added #include G4AtomicShells.hh
47 //
48 // 09 Sep. 2002, Fan Lei (flei@space.qinetiq.com)
49 // Added renormalization to determine whether transition leads to
50 // electron or gamma in SelectGamma()
51 //
52 // 19 April 2010, J. M. Quesada.
53 // Corrections added for taking into account mismatch between tabulated
54 // gamma energies and level energy differences (fake photons eliminated)
55 //
56 // 9 May 2010, V.Ivanchenko
57 // Removed unphysical corretions of gamma energy; fixed default particle
58 // as gamma; do not subtract bounding energy in case of electron emmision
59 //
60 // 03 November 2011, L. Desorgher
61 // Extend the use of the code for Z>100 by not calling G4AtomicShells::GetBindingEnergy for Z>100
62 // For Z>100 the binding energy is set to 0, the atomic relaxation is not simulated in G4RadDecay
63 //
64 // -------------------------------------------------------------------
65 
67 #include "G4SystemOfUnits.hh"
68 #include "Randomize.hh"
69 #include "G4RandGeneralTmp.hh"
70 #include "G4AtomicShells.hh"
71 #include "G4NuclearLevel.hh"
72 #include "G4NuclearLevelStore.hh"
73 #include "G4Pow.hh"
74 
76  _nucleusZ(Z), _orbitE(-1), _bondE(0.), _aGamma(true), _icm(false), _gammaEnergy(0.),
77  _level(level), _excitation(0.), _gammaCreationTime(0.),_A(A),_Z(Z)
78 {
79  _levelManager = 0;
80  _verbose = 0;
81  //JMQ: added tolerence in the mismatch
82  //VI: increased tolerence
83  _tolerance = 10*CLHEP::keV;
84 }
85 
87 {}
88 
90 {
91  // default gamma
92  _aGamma = true;
93  _gammaEnergy = 0.;
94 
95  G4int nGammas = _level.NumberOfGammas();
96  if (nGammas > 0)
97  {
98  G4int iGamma = 0;
99  if(1 < nGammas) {
100  G4double random = G4UniformRand();
101 
102  //G4cout << "G4DiscreteGammaTransition::SelectGamma N= "
103  // << nGammas << " rand= " << random << G4endl;
104  for(iGamma=0; iGamma<nGammas; ++iGamma)
105  {
106  //G4cout << iGamma << " prob= "
107  // << (_level.GammaCumulativeProbabilities())[iGamma] << G4endl;
108  if(random <= (_level.GammaCumulativeProbabilities())[iGamma])
109  { break; }
110  }
111  }
112  /*
113  G4cout << "Elevel(MeV)= " << _level.Energy()/MeV
114  << " Etran(MeV)= " << (_level.GammaEnergies())[iGamma]/MeV
115  << " Eexc(MeV)= " << _excitation/MeV << G4endl;
116  */
117 
118  // VI: do not apply correction here in order do not make
119  // double correction
120  //G4double eCorrection = _level.Energy() - _excitation;
121  //_gammaEnergy = (_level.GammaEnergies())[iGamma] - eCorrection;
122  _gammaEnergy = (_level.GammaEnergies())[iGamma];
123 
124  //JMQ:
125  //1)If chosen gamma energy is close enough to excitation energy,
126  // the later is used instead for gamma dacey to gs (it guarantees
127  // energy conservation)
128  //2)For energy conservation, level energy differences instead of
129  // tabulated gamma energies must be used (origin of final fake photons)
130 
131  // VI: remove fake photons - applied only for the last transition
132  // do not applied on each transition
133  if(std::fabs(_excitation - _gammaEnergy) < _tolerance) {
134  _gammaEnergy =_excitation;
135  }
136 
137  // JMQ: Warning: the following check is needed to avoid loops:
138  // Due essentially to missing nuclear levels in data files, it is
139  // possible that _gammaEnergy is so low as the nucleus doesn't change
140  // its level after the transition.
141  // When such case is found, force the full deexcitation of the nucleus.
142  //
143  // NOTE: you should force the transition to the next lower level,
144  // but this change needs a more complex revision of actual
145  // design.
146  // I leave this for a later revision.
147 
148  // VI: the check has no sence and we make this very simple
149  if (_gammaEnergy < _tolerance) {
150  _gammaEnergy = _excitation;
151  }
152 
153  //G4cout << "G4DiscreteGammaTransition::SelectGamma: " << _gammaEnergy
154  // << " _icm: " << _icm << G4endl;
155 
156  // now decide whether Internal Coversion electron should be emitted instead
157  if (_icm) {
158  G4double random = G4UniformRand();
159  if ( random <= (_level.TotalConvertionProbabilities())[iGamma]
160  *(_level.GammaWeights())[iGamma]
161  /((_level.TotalConvertionProbabilities())[iGamma]*(_level.GammaWeights())[iGamma]
162  +(_level.GammaWeights())[iGamma]))
163  {
164  G4int iShell = 9;
165  random = G4UniformRand() ;
166  if ( random <= (_level.KConvertionProbabilities())[iGamma])
167  { iShell = 0;}
168  else if ( random <= (_level.L1ConvertionProbabilities())[iGamma])
169  { iShell = 1;}
170  else if ( random <= (_level.L2ConvertionProbabilities())[iGamma])
171  { iShell = 2;}
172  else if ( random <= (_level.L3ConvertionProbabilities())[iGamma])
173  { iShell = 3;}
174  else if ( random <= (_level.M1ConvertionProbabilities())[iGamma])
175  { iShell = 4;}
176  else if ( random <= (_level.M2ConvertionProbabilities())[iGamma])
177  { iShell = 5;}
178  else if ( random <= (_level.M3ConvertionProbabilities())[iGamma])
179  { iShell = 6;}
180  else if ( random <= (_level.M4ConvertionProbabilities())[iGamma])
181  { iShell = 7;}
182  else if ( random <= (_level.M5ConvertionProbabilities())[iGamma])
183  { iShell = 8;}
184  // the following is needed to match the ishell to that used in G4AtomicShells
185  if ( iShell == 9) {
186  if ( (_nucleusZ < 28) && (_nucleusZ > 20)) {
187  iShell--;
188  } else if ( _nucleusZ == 20 || _nucleusZ == 19 ) {
189  iShell = iShell -2;
190  }
191  }
192  //L.Desorgher 02/11/2011
193  //Atomic shell information is available in Geant4 only up top Z=100
194  //To extend the photo evaporation code to Z>100 the call
195  // to G4AtomicShells::GetBindingEnergy should be forbidden for Z>100
196  _bondE = 0.;
197  if (_nucleusZ <=100)
198  _bondE = G4AtomicShells::GetBindingEnergy(_nucleusZ, iShell);
199  if (_verbose > 0) {
200  G4cout << "G4DiscreteGammaTransition: _nucleusZ = " <<_nucleusZ
201  << " , iShell = " << iShell
202  << " , Shell binding energy = " << _bondE/keV
203  << " keV " << G4endl;
204  }
205 
206  // 09.05.2010 VI : it is an error - cannot subtract bond energy from
207  // transition energy here
208  //_gammaEnergy = _gammaEnergy - _bondE;
209  //G4cout << "_gammaEnergy = " << _gammaEnergy << G4endl;
210 
211  _orbitE = iShell;
212  _aGamma = false ; // emitted is not a gamma now
213  }
214  }
215 
216  G4double tau = _level.HalfLife() / G4Pow::GetInstance()->logZ(2);
217 
218  //09.05.2010 VI rewrite samling of decay time
219  // assuming ordinary exponential low
220  _gammaCreationTime = 0.;
221  if(tau > 0.0) { _gammaCreationTime = -tau*std::log(G4UniformRand()); }
222 
223  }
224  return;
225 }
226 
228 {
229  return _gammaEnergy;
230 }
231 
233 {
234  return _gammaCreationTime;
235 }
236 
238 {
239  _excitation = energy;
240 }
241 
242 
243 
244 
245 
246