Geant4-11
G4DNAPTBAugerModel.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// Authors: S. Meylan and C. Villagrasa (IRSN, France)
27// Models come from
28// M. Bug et al, Rad. Phys and Chem. 130, 459-479 (2017)
29//
30
31#include "G4DNAPTBAugerModel.hh"
33#include "G4SystemOfUnits.hh"
34#include "Randomize.hh"
35#include "G4Electron.hh"
36
37#include "G4Material.hh"
38
39using namespace std;
40
41G4DNAPTBAugerModel::G4DNAPTBAugerModel(const G4String& modelAugerName): modelName(modelAugerName)
42{
43 // To inform the user that the Auger model is enabled
44 G4cout << modelName <<" is constructed" << G4endl;
45}
46
48{
49 if( verboseLevel>0 ) G4cout << modelName <<" is deleted" << G4endl;
50}
51
53{
54 verboseLevel = 0;
55
56 if( verboseLevel>0 )
57 {
58 G4cout << "PTB Auger model is initialised " << G4endl;
59 }
60
61}
62
63//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
64
65void G4DNAPTBAugerModel::ComputeAugerEffect(std::vector<G4DynamicParticle*>* fvect, const G4String& materialNameIni, G4double bindingEnergy)
66{
67 // Rename material if modified NIST material
68 // This is needed when material is obtained from G4MaterialCutsCouple
69 G4String materialName = materialNameIni;
70 if(materialName.find("_MODIFIED")){
71 materialName = materialName.substr(0,materialName.size()-9);
72 }
73
74 // check if there is a k-shell ionisation and find the ionised atom
75 G4int atomId(0);
76
77 atomId = DetermineIonisedAtom(atomId, materialName, bindingEnergy);
78
79 if(atomId!=0)
80 {
81 G4double kineticEnergy = CalculAugerEnergyFor(atomId);
82
83 if(kineticEnergy<0)
84 {
85 G4cerr<<"**************************"<<G4endl;
86 G4cerr<<"FatalError. Auger kineticEnergy: "<<kineticEnergy<<G4endl;
87 exit(EXIT_FAILURE);
88 }
89
90 if(atomId==1 || atomId==2 || atomId==3)
91 {
92 GenerateAugerWithRandomDirection(fvect, kineticEnergy);
93 }
94 else if(atomId==4)
95 {
96 GenerateAugerWithRandomDirection(fvect, kineticEnergy);
97 GenerateAugerWithRandomDirection(fvect, kineticEnergy);
98 }
99 }
100}
101
102//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
103
105{
106 if(materialName=="THF" || materialName=="backbone_THF"){
107 if(bindingEnergy==305.07){
108 atomId=1; //"carbon";
109 }
110 else if(bindingEnergy==557.94){
111 atomId=2; //"oxygen";
112 }
113 }
114 else if(materialName=="PY" || materialName=="PU"
115 || materialName=="cytosine_PY" || materialName=="thymine_PY"
116 || materialName=="adenine_PU" || materialName=="guanine_PU"
117 )
118 {
119 if(bindingEnergy==307.52){
120 atomId=1; //"carbon";
121 }
122 else if(bindingEnergy==423.44){
123 atomId=4; //"nitrogen";
124 }
125 }
126 else if(materialName=="TMP"|| materialName=="backbone_TMP"){
127 if(bindingEnergy==209.59 || bindingEnergy==152.4)
128 atomId=3; //"carbonTMP";
129 }
130
131 return atomId;
132}
133
134//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
135
137{
138 G4double kineticEnergy;
139
140 if(atomId==2) // oxygen
141 {
142 kineticEnergy = 495*eV;
143 }
144 else
145 {
146 G4double f1, f2, f3, g1, g2, Y;
147
148 Y = G4UniformRand();
149
150 if(atomId == 1){ // carbon
151 f1 = -7.331e-2;
152 f2 = -3.306e-5;
153 f3 = 2.433e0;
154 g1 = 4.838e-1;
155 g2 = 3.886e0;
156 }
157 else if(atomId == 4){ // nitrogen
158 f1 = -7.518e-2;
159 f2 = 1.178e-4;
160 f3 = 2.600e0;
161 g1 = 4.639e-1;
162 g2 = 3.770e0;
163 }
164 else// if(atomId == 3) // carbon_TMP
165 {
166 f1 = -5.700e-2;
167 f2 = 1.200e-4;
168 f3 = 2.425e0;
169 g1 = 5.200e-1;
170 g2 = 2.560e0;
171 }
172
173 kineticEnergy = pow(10, f1*pow( abs( log10(Y) ) , g1) + f2*pow( abs( log10(Y) ) , g2) + f3 )*eV;
174 }
175
176 return kineticEnergy;
177}
178
179//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
180
182{
183 minElectronEnergy = cut;
184}
185
186//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
187
188void G4DNAPTBAugerModel::GenerateAugerWithRandomDirection(std::vector<G4DynamicParticle*>* fvect, G4double kineticEnergy)
189{
190 // Isotropic angular distribution for the outcoming e-
191 G4double newcosTh = 1.-2.*G4UniformRand();
192 G4double newsinTh = std::sqrt(1.-newcosTh*newcosTh);
193 G4double newPhi = twopi*G4UniformRand();
194
195 G4double xDir = newsinTh*std::sin(newPhi);
196 G4double yDir = newsinTh*std::cos(newPhi);
197 G4double zDir = newcosTh;
198
199 G4ThreeVector ElectronDirection(xDir,yDir,zDir);
200
201 // generation of new particle
202 G4DynamicParticle* dp = new G4DynamicParticle (G4Electron::Electron(), ElectronDirection, kineticEnergy) ;
203 fvect->push_back(dp);
204}
G4double Y(G4double density)
static constexpr double twopi
Definition: G4SIunits.hh:56
static constexpr double eV
Definition: G4SIunits.hh:201
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
const G4String modelName
name of the auger model
virtual ~G4DNAPTBAugerModel()
~G4DNAPTBAugerModel Destructor
void GenerateAugerWithRandomDirection(std::vector< G4DynamicParticle * > *fvect, G4double kineticEnergy)
GenerateAugerWithRandomDirection Generates the auger particle.
G4int DetermineIonisedAtom(G4int atomId, const G4String &materialName, G4double bindingEnergy)
DetermineIonisedAtom.
void ComputeAugerEffect(std::vector< G4DynamicParticle * > *fvect, const G4String &materialNameIni, G4double bindingEnergy)
ComputeAugerEffect Main method to be called by the ionisation model.
void SetCutForAugerElectrons(G4double cut)
SetCutForAugerElectrons Set the cut for the auger electrons production.
G4double CalculAugerEnergyFor(G4int atomId)
CalculAugerEnergyFor.
virtual void Initialise()
Initialise Set the verbose value.
G4DNAPTBAugerModel(const G4String &modelName)
G4DNAPTBAugerModel Constructor.
static G4Electron * Electron()
Definition: G4Electron.cc:93
G4double bindingEnergy(G4int A, G4int Z)
def exit()
Definition: g4zmq.py:99