Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
G4EmCaptureCascade.cc
이 파일의 문서화 페이지로 가기
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: G4EmCaptureCascade.cc 101422 2016-11-17 10:41:23Z gcosmo $
27 //
28 //-----------------------------------------------------------------------------
29 //
30 // GEANT4 Class file
31 //
32 // File name: G4EmCaptureCascade
33 //
34 // Author: V.Ivanchenko (Vladimir.Ivantchenko@cern.ch)
35 //
36 // Creation date: 22 April 2012 on base of G4MuMinusCaptureCascade
37 //
38 //
39 //-----------------------------------------------------------------------------
40 //
41 // Modifications:
42 //
43 //-----------------------------------------------------------------------------
44 
45 #include "G4EmCaptureCascade.hh"
46 #include "G4PhysicalConstants.hh"
47 #include "G4SystemOfUnits.hh"
48 #include "Randomize.hh"
49 #include "G4MuonMinus.hh"
50 #include "G4Electron.hh"
51 #include "G4Gamma.hh"
52 #include "G4NucleiProperties.hh"
53 
54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
55 
57  : G4HadronicInteraction("emCaptureCascade")
58 {
62  fTime = 0.0;
63 
64  // Calculate the Energy of K Mesoatom Level for this Element using
65  // the Energy of Hydrogen Atom taken into account finite size of the
66  // nucleus
67  static const G4int nlevels = 28;
68  static const G4int listK[nlevels] = {
69  1, 2, 4, 6, 8, 11, 14, 17, 18, 21, 24,
70  26, 29, 32, 38, 40, 41, 44, 49, 53, 55,
71  60, 65, 70, 75, 81, 85, 92};
72  static const G4double listKEnergy[nlevels] = {
73  0.00275, 0.011, 0.043, 0.098, 0.173, 0.326,
74  0.524, 0.765, 0.853, 1.146, 1.472,
75  1.708, 2.081, 2.475, 3.323, 3.627,
76  3.779, 4.237, 5.016, 5.647, 5.966,
77  6.793, 7.602, 8.421, 9.249, 10.222,
78  10.923,11.984};
79 
80  fKLevelEnergy[0] = 0.0;
81  fKLevelEnergy[1] = listKEnergy[0];
82  G4int idx = 1;
83  for(G4int i=1; i<nlevels; ++i) {
84  G4int z1 = listK[idx];
85  G4int z2 = listK[i];
86  if(z1+1 < z2) {
87  G4double dz = G4double(z2 - z1);
88  G4double y1 = listKEnergy[idx]/G4double(z1*z1);
89  G4double y2 = listKEnergy[i]/G4double(z2*z2);
90  for(G4int z=z1+1; z<z2; ++z) {
91  fKLevelEnergy[z] = (y1 + (y2 - y1)*(z - z1)/dz)*z*z;
92  }
93  }
94  fKLevelEnergy[z2] = listKEnergy[i];
95  idx = i;
96  }
97  for(G4int i = 0; i<14; ++i) { fLevelEnergy[i] = 0.0; }
98 }
99 
100 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
101 
103 {}
104 
105 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
106 
109  G4Nucleus& targetNucleus)
110 {
111  result.Clear();
113  fTime = projectile.GetGlobalTime();
114 
115  G4int Z = targetNucleus.GetZ_asInt();
116  G4int A = targetNucleus.GetA_asInt();
118  G4double mass = fMuMass * massA / (fMuMass + massA) ;
119  G4double e = 13.6 * eV * (Z * Z) * mass/ electron_mass_c2;
120 
121  // precise corrections of energy only for K-shell
122  fLevelEnergy[0] = fKLevelEnergy[std::min(Z, 92)];
123  for(G4int i=1; i<14; ++i) {
124  fLevelEnergy[i] = e/(G4double)((i+1)*(i+1));
125  }
126 
127  G4int nElec = Z;
128  G4int nAuger = 1;
129  G4int nLevel = 13;
130  G4double pGamma = (Z*Z*Z*Z);
131 
132  // Capture on 14-th level
133  G4double edep = fLevelEnergy[13];
135  G4double deltaE;
136 
137  // Emit new photon or electron
138  // Simplified model for probabilities
139  // N.C.Mukhopadhyay Phy. Rep. 30 (1977) 1.
140  do {
141 
142  // case of Auger electrons
143  if((nAuger < nElec) && ((pGamma + 10000.0) * G4UniformRand() < 10000.0) ) {
144  ++nAuger;
145  deltaE = fLevelEnergy[nLevel-1] - fLevelEnergy[nLevel];
146  --nLevel;
147  AddNewParticle(theElectron, deltaE);
148 
149  } else {
150 
151  // Case of photon cascade, probabilities from
152  // C.S.Wu and L.Wilets, Ann. Rev. Nuclear Sci. 19 (1969) 527.
153 
154  G4double var = (10.0 + G4double(nLevel - 1) ) * G4UniformRand();
155  G4int iLevel = nLevel - 1 ;
156  if(var > 10.0) iLevel -= G4int(var-10.0) + 1;
157  if( iLevel < 0 ) iLevel = 0;
158  deltaE = fLevelEnergy[iLevel] - fLevelEnergy[nLevel];
159  nLevel = iLevel;
160  AddNewParticle(theGamma, deltaE);
161  }
162  edep += deltaE;
163 
164  // Loop checking, 06-Aug-2015, Vladimir Ivanchenko
165  } while( nLevel > 0 );
166 
168  return &result;
169 }
170 
171 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
172 
173 void G4EmCaptureCascade::ModelDescription(std::ostream& outFile) const
174 {
175  outFile << "Simulation of electromagnetic cascade from capture level"
176  << " to K-shell of the mesonic atom\n."
177  << "Probabilities of gamma and Auger transitions from\n"
178  << " N.C.Mukhopadhyay Phys. Rep. 30 (1977) 1.\n";
179 }
180 
181 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
virtual void ModelDescription(std::ostream &outFile) const
Float_t y1[n_points_granero]
Definition: compare.C:5
Double_t z
static G4MuonMinus * MuonMinus()
Definition: G4MuonMinus.cc:100
G4double GetPDGMass() const
Float_t y2[n_points_geant4]
Definition: compare.C:26
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
Float_t Z
G4ParticleDefinition * theGamma
G4HadFinalState result
double G4double
Definition: G4Types.hh:76
G4double GetGlobalTime() const
static constexpr double electron_mass_c2
#define G4UniformRand()
Definition: Randomize.hh:53
double A(double temperature)
static G4double GetNuclearMass(const G4double A, const G4double Z)
static constexpr double eV
Definition: G4SIunits.hh:215
static G4Electron * Electron()
Definition: G4Electron.cc:94
G4double fKLevelEnergy[93]
Double_t edep
int G4int
Definition: G4Types.hh:78
G4int GetA_asInt() const
Definition: G4Nucleus.hh:109
void SetLocalEnergyDeposit(G4double aE)
G4ParticleDefinition * theElectron
void AddNewParticle(G4ParticleDefinition *aParticle, G4double kinEnergy)
G4int GetZ_asInt() const
Definition: G4Nucleus.hh:115
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
void SetStatusChange(G4HadFinalStateStatus aS)