Geant4 Cross Reference |
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 // 27 //--------------------------------------------------------------------------- 28 // 29 // ClassName: G4EmStandardPhysics 30 // 31 // Author: V.Ivanchenko 09.11.2005 32 // 33 // Modified: 34 // 35 //---------------------------------------------------------------------------- 36 // 37 38 #include "G4EmStandardPhysics.hh" 39 #include "G4SystemOfUnits.hh" 40 #include "G4ParticleDefinition.hh" 41 #include "G4EmParameters.hh" 42 #include "G4EmBuilder.hh" 43 #include "G4LossTableManager.hh" 44 45 #include "G4ComptonScattering.hh" 46 #include "G4KleinNishinaModel.hh" 47 #include "G4GammaConversion.hh" 48 #include "G4PhotoElectricEffect.hh" 49 #include "G4RayleighScattering.hh" 50 #include "G4LivermorePhotoElectricModel.hh" 51 #include "G4LivermorePolarizedRayleighModel.hh" 52 #include "G4PhotoElectricAngularGeneratorPolarized.hh" 53 #include "G4eplusTo2or3GammaModel.hh" 54 55 #include "G4hMultipleScattering.hh" 56 #include "G4CoulombScattering.hh" 57 #include "G4eCoulombScatteringModel.hh" 58 #include "G4WentzelVIModel.hh" 59 #include "G4UrbanMscModel.hh" 60 61 #include "G4eIonisation.hh" 62 #include "G4eBremsstrahlung.hh" 63 #include "G4eplusAnnihilation.hh" 64 65 #include "G4hIonisation.hh" 66 #include "G4ionIonisation.hh" 67 #include "G4NuclearStopping.hh" 68 69 #include "G4Gamma.hh" 70 #include "G4Electron.hh" 71 #include "G4Positron.hh" 72 #include "G4GenericIon.hh" 73 74 #include "G4PhysicsListHelper.hh" 75 #include "G4BuilderType.hh" 76 #include "G4EmModelActivator.hh" 77 #include "G4GammaGeneralProcess.hh" 78 79 // factory 80 #include "G4PhysicsConstructorFactory.hh" 81 // 82 G4_DECLARE_PHYSCONSTR_FACTORY(G4EmStandardPhysics); 83 84 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 85 86 G4EmStandardPhysics::G4EmStandardPhysics(G4int ver, const G4String&) 87 : G4VPhysicsConstructor("G4EmStandard") 88 { 89 SetVerboseLevel(ver); 90 G4EmParameters* param = G4EmParameters::Instance(); 91 param->SetDefaults(); 92 param->SetVerbose(ver); 93 param->SetGeneralProcessActive(true); 94 param->SetFluctuationType(fUrbanFluctuation); 95 SetPhysicsType(bElectromagnetic); 96 } 97 98 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 99 100 G4EmStandardPhysics::~G4EmStandardPhysics() = default; 101 102 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 103 104 void G4EmStandardPhysics::ConstructParticle() 105 { 106 // minimal set of particles for EM physics 107 G4EmBuilder::ConstructMinimalEmSet(); 108 } 109 110 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 111 112 void G4EmStandardPhysics::ConstructProcess() 113 { 114 if(verboseLevel > 1) { 115 G4cout << "### " << GetPhysicsName() << " Construct Processes " << G4endl; 116 } 117 G4EmBuilder::PrepareEMPhysics(); 118 119 G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper(); 120 G4EmParameters* param = G4EmParameters::Instance(); 121 122 // processes used by several particles 123 G4hMultipleScattering* hmsc = new G4hMultipleScattering("ionmsc"); 124 125 // nuclear stopping is enabled if th eenergy limit above zero 126 G4double nielEnergyLimit = param->MaxNIELEnergy(); 127 G4NuclearStopping* pnuc = nullptr; 128 if(nielEnergyLimit > 0.0) { 129 pnuc = new G4NuclearStopping(); 130 pnuc->SetMaxKinEnergy(nielEnergyLimit); 131 } 132 133 // high energy limit for e+- scattering models and bremsstrahlung 134 G4double highEnergyLimit = param->MscEnergyLimit(); 135 136 // Add gamma EM Processes 137 G4ParticleDefinition* particle = G4Gamma::Gamma(); 138 G4bool polar = param->EnablePolarisation(); 139 140 // Photoelectric 141 G4PhotoElectricEffect* pe = new G4PhotoElectricEffect(); 142 G4VEmModel* peModel = new G4LivermorePhotoElectricModel(); 143 pe->SetEmModel(peModel); 144 if(polar) { 145 peModel->SetAngularDistribution(new G4PhotoElectricAngularGeneratorPolarized()); 146 } 147 148 // Compton scattering 149 G4ComptonScattering* cs = new G4ComptonScattering; 150 if(polar) { 151 cs->SetEmModel(new G4KleinNishinaModel()); 152 } 153 154 // default Rayleigh scattering is Livermore 155 G4RayleighScattering* rl = new G4RayleighScattering(); 156 if(polar) { 157 rl->SetEmModel(new G4LivermorePolarizedRayleighModel()); 158 } 159 160 if(G4EmParameters::Instance()->GeneralProcessActive()) { 161 G4GammaGeneralProcess* sp = new G4GammaGeneralProcess(); 162 sp->AddEmProcess(pe); 163 sp->AddEmProcess(cs); 164 sp->AddEmProcess(new G4GammaConversion()); 165 sp->AddEmProcess(rl); 166 G4LossTableManager::Instance()->SetGammaGeneralProcess(sp); 167 ph->RegisterProcess(sp, particle); 168 169 } else { 170 ph->RegisterProcess(pe, particle); 171 ph->RegisterProcess(cs, particle); 172 ph->RegisterProcess(new G4GammaConversion(), particle); 173 ph->RegisterProcess(rl, particle); 174 } 175 176 // e- 177 particle = G4Electron::Electron(); 178 179 G4UrbanMscModel* msc1 = new G4UrbanMscModel(); 180 G4WentzelVIModel* msc2 = new G4WentzelVIModel(); 181 msc1->SetHighEnergyLimit(highEnergyLimit); 182 msc2->SetLowEnergyLimit(highEnergyLimit); 183 G4EmBuilder::ConstructElectronMscProcess(msc1, msc2, particle); 184 185 G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel(); 186 G4CoulombScattering* ss = new G4CoulombScattering(); 187 ss->SetEmModel(ssm); 188 ss->SetMinKinEnergy(highEnergyLimit); 189 ssm->SetLowEnergyLimit(highEnergyLimit); 190 ssm->SetActivationLowEnergyLimit(highEnergyLimit); 191 192 ph->RegisterProcess(new G4eIonisation(), particle); 193 ph->RegisterProcess(new G4eBremsstrahlung(), particle); 194 ph->RegisterProcess(ss, particle); 195 196 // e+ 197 particle = G4Positron::Positron(); 198 199 msc1 = new G4UrbanMscModel(); 200 msc2 = new G4WentzelVIModel(); 201 msc1->SetHighEnergyLimit(highEnergyLimit); 202 msc2->SetLowEnergyLimit(highEnergyLimit); 203 G4EmBuilder::ConstructElectronMscProcess(msc1, msc2, particle); 204 205 ssm = new G4eCoulombScatteringModel(); 206 ss = new G4CoulombScattering(); 207 ss->SetEmModel(ssm); 208 ss->SetMinKinEnergy(highEnergyLimit); 209 ssm->SetLowEnergyLimit(highEnergyLimit); 210 ssm->SetActivationLowEnergyLimit(highEnergyLimit); 211 212 // annihilation 213 auto anni = new G4eplusAnnihilation(); 214 if (param->Use3GammaAnnihilationOnFly()) { 215 anni->SetEmModel(new G4eplusTo2or3GammaModel()); 216 } 217 218 ph->RegisterProcess(new G4eIonisation(), particle); 219 ph->RegisterProcess(new G4eBremsstrahlung(), particle); 220 ph->RegisterProcess(anni, particle); 221 ph->RegisterProcess(ss, particle); 222 223 // generic ion 224 particle = G4GenericIon::GenericIon(); 225 G4ionIonisation* ionIoni = new G4ionIonisation(); 226 ph->RegisterProcess(hmsc, particle); 227 ph->RegisterProcess(ionIoni, particle); 228 if(nullptr != pnuc) { ph->RegisterProcess(pnuc, particle); } 229 230 // muons, hadrons ions 231 G4EmBuilder::ConstructCharged(hmsc, pnuc); 232 233 // extra configuration 234 G4EmModelActivator mact(GetPhysicsName()); 235 } 236 237 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 238