Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // Authors: S. Meylan and C. Villagrasa (IRSN, 26 // Authors: S. Meylan and C. Villagrasa (IRSN, France) 27 // Models come from 27 // Models come from 28 // M. Bug et al, Rad. Phys and Chem. 130, 459- 28 // M. Bug et al, Rad. Phys and Chem. 130, 459-479 (2017) 29 // 29 // 30 30 31 #include "G4DNAPTBAugerModel.hh" 31 #include "G4DNAPTBAugerModel.hh" 32 #include "G4PhysicalConstants.hh" 32 #include "G4PhysicalConstants.hh" 33 #include "G4SystemOfUnits.hh" 33 #include "G4SystemOfUnits.hh" 34 #include "Randomize.hh" 34 #include "Randomize.hh" 35 #include "G4Electron.hh" 35 #include "G4Electron.hh" 36 36 37 #include "G4Material.hh" 37 #include "G4Material.hh" 38 38 39 using namespace std; 39 using namespace std; 40 40 41 G4DNAPTBAugerModel::G4DNAPTBAugerModel(const G 41 G4DNAPTBAugerModel::G4DNAPTBAugerModel(const G4String& modelAugerName): modelName(modelAugerName) 42 { 42 { 43 verboseLevel = 0; 43 verboseLevel = 0; 44 minElectronEnergy = 0.0; 44 minElectronEnergy = 0.0; 45 // To inform the user that the Auger model 45 // To inform the user that the Auger model is enabled 46 G4cout << modelName <<" is constructed" << 46 G4cout << modelName <<" is constructed" << G4endl; 47 } 47 } 48 48 49 G4DNAPTBAugerModel::~G4DNAPTBAugerModel() 49 G4DNAPTBAugerModel::~G4DNAPTBAugerModel() 50 { 50 { 51 if( verboseLevel>0 ) G4cout << modelName < 51 if( verboseLevel>0 ) G4cout << modelName <<" is deleted" << G4endl; 52 } 52 } 53 53 54 void G4DNAPTBAugerModel::Initialise() 54 void G4DNAPTBAugerModel::Initialise() 55 { 55 { 56 verboseLevel = 0; 56 verboseLevel = 0; 57 57 58 if( verboseLevel>0 ) 58 if( verboseLevel>0 ) 59 { 59 { 60 G4cout << "PTB Auger model is initiali 60 G4cout << "PTB Auger model is initialised " << G4endl; 61 } 61 } 62 62 63 } 63 } 64 64 65 //....oooOO0OOooo........oooOO0OOooo........oo 65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 66 66 67 void G4DNAPTBAugerModel::ComputeAugerEffect(st 67 void G4DNAPTBAugerModel::ComputeAugerEffect(std::vector<G4DynamicParticle*>* fvect, const G4String& materialNameIni, G4double bindingEnergy) 68 { 68 { 69 // Rename material if modified NIST materi 69 // Rename material if modified NIST material 70 // This is needed when material is obtaine 70 // This is needed when material is obtained from G4MaterialCutsCouple 71 G4String materialName = materialNameIni; 71 G4String materialName = materialNameIni; 72 if(materialName.find("_MODIFIED") != 0u){ 72 if(materialName.find("_MODIFIED") != 0u){ 73 materialName = materialName.substr(0,m 73 materialName = materialName.substr(0,materialName.size()-9); 74 } 74 } 75 75 76 // check if there is a k-shell ionisation 76 // check if there is a k-shell ionisation and find the ionised atom 77 G4int atomId(0); 77 G4int atomId(0); 78 78 79 atomId = DetermineIonisedAtom(atomId, mate 79 atomId = DetermineIonisedAtom(atomId, materialName, bindingEnergy); 80 80 81 if(atomId!=0) 81 if(atomId!=0) 82 { 82 { 83 G4double kineticEnergy = CalculAugerEn 83 G4double kineticEnergy = CalculAugerEnergyFor(atomId); 84 84 85 if(kineticEnergy<0) 85 if(kineticEnergy<0) 86 { 86 { 87 G4cerr<<"************************* 87 G4cerr<<"**************************"<<G4endl; 88 G4cerr<<"FatalError. Auger kinetic 88 G4cerr<<"FatalError. Auger kineticEnergy: "<<kineticEnergy<<G4endl; 89 exit(EXIT_FAILURE); 89 exit(EXIT_FAILURE); 90 } 90 } 91 91 92 if(atomId==1 || atomId==2 || atomId==3 92 if(atomId==1 || atomId==2 || atomId==3) 93 { 93 { 94 GenerateAugerWithRandomDirection(f 94 GenerateAugerWithRandomDirection(fvect, kineticEnergy); 95 } 95 } 96 else if(atomId==4) 96 else if(atomId==4) 97 { 97 { 98 GenerateAugerWithRandomDirection(f 98 GenerateAugerWithRandomDirection(fvect, kineticEnergy); 99 GenerateAugerWithRandomDirection(f 99 GenerateAugerWithRandomDirection(fvect, kineticEnergy); 100 } 100 } 101 } 101 } 102 } 102 } 103 103 104 //....oooOO0OOooo........oooOO0OOooo........oo 104 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 105 105 106 G4int G4DNAPTBAugerModel::DetermineIonisedAtom 106 G4int G4DNAPTBAugerModel::DetermineIonisedAtom(G4int atomId, const G4String& materialName, G4double bindingEnergy) 107 { 107 { 108 if(materialName=="THF" || materialName=="b 108 if(materialName=="THF" || materialName=="backbone_THF"){ 109 if(bindingEnergy==305.07){ 109 if(bindingEnergy==305.07){ 110 atomId=1; //"carbon"; 110 atomId=1; //"carbon"; 111 } 111 } 112 else if(bindingEnergy==557.94){ 112 else if(bindingEnergy==557.94){ 113 atomId=2; //"oxygen"; 113 atomId=2; //"oxygen"; 114 } 114 } 115 } 115 } 116 else if(materialName=="PY" || materialName 116 else if(materialName=="PY" || materialName=="PU" 117 || materialName=="cytosine_PY" || 117 || materialName=="cytosine_PY" || materialName=="thymine_PY" 118 || materialName=="adenine_PU" || m 118 || materialName=="adenine_PU" || materialName=="guanine_PU" 119 ) 119 ) 120 { 120 { 121 if(bindingEnergy==307.52){ 121 if(bindingEnergy==307.52){ 122 atomId=1; //"carbon"; 122 atomId=1; //"carbon"; 123 } 123 } 124 else if(bindingEnergy==423.44){ 124 else if(bindingEnergy==423.44){ 125 atomId=4; //"nitrogen"; 125 atomId=4; //"nitrogen"; 126 } 126 } 127 } 127 } 128 else if(materialName=="TMP"|| materialName 128 else if(materialName=="TMP"|| materialName=="backbone_TMP"){ 129 if(bindingEnergy==209.59 || bindingEne 129 if(bindingEnergy==209.59 || bindingEnergy==152.4) 130 atomId=3; //"carbonTMP"; 130 atomId=3; //"carbonTMP"; 131 } 131 } 132 132 133 return atomId; 133 return atomId; 134 } 134 } 135 135 136 //....oooOO0OOooo........oooOO0OOooo........oo 136 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 137 137 138 G4double G4DNAPTBAugerModel::CalculAugerEnergy 138 G4double G4DNAPTBAugerModel::CalculAugerEnergyFor(G4int atomId) 139 { 139 { 140 G4double kineticEnergy; 140 G4double kineticEnergy; 141 141 142 if(atomId==2) // oxygen 142 if(atomId==2) // oxygen 143 { 143 { 144 kineticEnergy = 495*eV; 144 kineticEnergy = 495*eV; 145 } 145 } 146 else 146 else 147 { 147 { 148 G4double f1, f2, f3, g1, g2, Y; 148 G4double f1, f2, f3, g1, g2, Y; 149 149 150 Y = G4UniformRand(); 150 Y = G4UniformRand(); 151 151 152 if(atomId == 1){ // carbon 152 if(atomId == 1){ // carbon 153 f1 = -7.331e-2; 153 f1 = -7.331e-2; 154 f2 = -3.306e-5; 154 f2 = -3.306e-5; 155 f3 = 2.433e0; 155 f3 = 2.433e0; 156 g1 = 4.838e-1; 156 g1 = 4.838e-1; 157 g2 = 3.886e0; 157 g2 = 3.886e0; 158 } 158 } 159 else if(atomId == 4){ // nitrogen 159 else if(atomId == 4){ // nitrogen 160 f1 = -7.518e-2; 160 f1 = -7.518e-2; 161 f2 = 1.178e-4; 161 f2 = 1.178e-4; 162 f3 = 2.600e0; 162 f3 = 2.600e0; 163 g1 = 4.639e-1; 163 g1 = 4.639e-1; 164 g2 = 3.770e0; 164 g2 = 3.770e0; 165 } 165 } 166 else// if(atomId == 3) // carbon_TMP 166 else// if(atomId == 3) // carbon_TMP 167 { 167 { 168 f1 = -5.700e-2; 168 f1 = -5.700e-2; 169 f2 = 1.200e-4; 169 f2 = 1.200e-4; 170 f3 = 2.425e0; 170 f3 = 2.425e0; 171 g1 = 5.200e-1; 171 g1 = 5.200e-1; 172 g2 = 2.560e0; 172 g2 = 2.560e0; 173 } 173 } 174 174 175 kineticEnergy = pow(10, f1*pow( abs( l 175 kineticEnergy = pow(10, f1*pow( abs( log10(Y) ) , g1) + f2*pow( abs( log10(Y) ) , g2) + f3 )*eV; 176 } 176 } 177 177 178 return kineticEnergy; 178 return kineticEnergy; 179 } 179 } 180 180 181 //....oooOO0OOooo........oooOO0OOooo........oo 181 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 182 182 183 void G4DNAPTBAugerModel::SetCutForAugerElectro 183 void G4DNAPTBAugerModel::SetCutForAugerElectrons(G4double cut) 184 { 184 { 185 minElectronEnergy = cut; 185 minElectronEnergy = cut; 186 } 186 } 187 187 188 //....oooOO0OOooo........oooOO0OOooo........oo 188 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 189 189 190 void G4DNAPTBAugerModel::GenerateAugerWithRand 190 void G4DNAPTBAugerModel::GenerateAugerWithRandomDirection(std::vector<G4DynamicParticle*>* fvect, G4double kineticEnergy) 191 { 191 { 192 // Isotropic angular distribution for th 192 // Isotropic angular distribution for the outcoming e- 193 G4double newcosTh = 1.-2.*G4UniformRand( 193 G4double newcosTh = 1.-2.*G4UniformRand(); 194 G4double newsinTh = std::sqrt(1.-newcos 194 G4double newsinTh = std::sqrt(1.-newcosTh*newcosTh); 195 G4double newPhi = twopi*G4UniformRand(); 195 G4double newPhi = twopi*G4UniformRand(); 196 196 197 G4double xDir = newsinTh*std::sin(newPh 197 G4double xDir = newsinTh*std::sin(newPhi); 198 G4double yDir = newsinTh*std::cos(newPhi 198 G4double yDir = newsinTh*std::cos(newPhi); 199 G4double zDir = newcosTh; 199 G4double zDir = newcosTh; 200 200 201 G4ThreeVector ElectronDirection(xDir,yDi 201 G4ThreeVector ElectronDirection(xDir,yDir,zDir); 202 202 203 // generation of new particle 203 // generation of new particle 204 auto dp = new G4DynamicParticle (G4Elec 204 auto dp = new G4DynamicParticle (G4Electron::Electron(), ElectronDirection, kineticEnergy) ; 205 fvect->push_back(dp); 205 fvect->push_back(dp); 206 } 206 } 207 207