ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4DNAPTBAugerModel.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4DNAPTBAugerModel.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 // 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"
32 #include "G4PhysicalConstants.hh"
33 #include "G4SystemOfUnits.hh"
34 #include "Randomize.hh"
35 #include "G4Electron.hh"
36 
37 #include "G4Material.hh"
38 
39 using namespace std;
40 
41 G4DNAPTBAugerModel::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 
65 void 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 
188 void 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 }