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 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 30 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 32 33 #include "MicroElecPhysics.hh" 34 #include "G4SystemOfUnits.hh" 35 36 37 // Geant4-MicroElec MODELS 38 39 #include "G4MicroElecElastic.hh" 40 #include "G4MicroElecElasticModel_new.hh" 41 42 #include "G4MicroElecInelastic.hh" 43 #include "G4MicroElecInelasticModel_new.hh" 44 45 #include "G4MicroElecLOPhononScattering.hh" 46 #include "G4MicroElecLOPhononModel.hh" 47 #include "G4MicroElecSurface.hh" 48 49 // 50 51 #include "G4LossTableManager.hh" 52 #include "G4EmConfigurator.hh" 53 #include "G4VEmModel.hh" 54 #include "G4DummyModel.hh" 55 #include "G4eIonisation.hh" 56 #include "G4hIonisation.hh" 57 #include "G4ionIonisation.hh" 58 #include "G4eMultipleScattering.hh" 59 #include "G4hMultipleScattering.hh" 60 #include "G4BraggModel.hh" 61 #include "G4BraggIonModel.hh" 62 #include "G4BetheBlochModel.hh" 63 #include "G4UrbanMscModel.hh" 64 #include "G4MollerBhabhaModel.hh" 65 #include "G4IonFluctuations.hh" 66 #include "G4UniversalFluctuation.hh" 67 68 #include "ElectronCapture.hh" 69 70 #include "G4UAtomicDeexcitation.hh" 71 72 73 74 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 75 76 MicroElecPhysics::MicroElecPhysics(): G4VUserPhysicsList() 77 { 78 defaultCutValue = 1*micrometer; 79 cutForGamma = defaultCutValue; 80 cutForElectron = defaultCutValue; 81 cutForPositron = defaultCutValue; 82 cutForProton = defaultCutValue; 83 84 SetVerboseLevel(1); 85 } 86 87 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 88 89 MicroElecPhysics::~MicroElecPhysics() 90 {} 91 92 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 93 94 void MicroElecPhysics::ConstructParticle() 95 { 96 ConstructBosons(); 97 ConstructLeptons(); 98 ConstructBarions(); 99 } 100 101 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 102 103 void MicroElecPhysics::ConstructBosons() 104 { 105 // gamma 106 G4Gamma::GammaDefinition(); 107 } 108 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 109 110 void MicroElecPhysics::ConstructLeptons() 111 { 112 // leptons 113 G4Electron::ElectronDefinition(); 114 G4Positron::PositronDefinition(); 115 } 116 117 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 118 119 void MicroElecPhysics::ConstructBarions() 120 { 121 // baryons 122 G4Proton::ProtonDefinition(); 123 G4GenericIon::GenericIonDefinition(); 124 } 125 126 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 127 128 void MicroElecPhysics::ConstructProcess() 129 { 130 AddTransportation(); 131 ConstructEM(); 132 ConstructGeneral(); 133 } 134 135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 136 137 138 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 139 140 void MicroElecPhysics::ConstructEM() 141 { 142 143 G4EmParameters* param = G4EmParameters::Instance(); 144 //param->SetDefaults(); 145 param->SetBuildCSDARange(true); 146 //param->SetMscStepLimitType(fUseSafetyPlus); 147 //param->SetMscStepLimitType(fUseDistanceToBoundary); 148 param->SetMscStepLimitType(fUseSafety); 149 param->RegionsMicroElec(); 150 // physicList ISS 151 param->SetDefaults(); 152 param->SetMinEnergy(0.1*eV); 153 param->SetMaxEnergy(10 * TeV); 154 param->SetLowestElectronEnergy(0 * eV); //<--- Energie de cut dans le vide!!! A fixer 0eV pour ne pas fausser les SEY 155 param->SetNumberOfBinsPerDecade(20); 156 param->ActivateAngularGeneratorForIonisation(true); 157 param->SetAugerCascade(true);//*/ 158 159 auto particleIterator=GetParticleIterator(); 160 particleIterator->reset(); 161 162 while( (*particleIterator)() ) 163 { 164 165 G4ParticleDefinition* particle = particleIterator->value(); 166 G4ProcessManager* pmanager = particle->GetProcessManager(); 167 G4String particleName = particle->GetParticleName(); 168 169 // ********************************* 170 // 1) Processes for the World region 171 // ********************************* 172 173 if (particleName == "e-") { 174 175 176 // STANDARD msc is active in the world 177 G4eMultipleScattering* msc = new G4eMultipleScattering(); 178 msc->AddEmModel(1, new G4UrbanMscModel()); 179 pmanager->AddProcess(msc, -1, 1, -1); 180 181 // STANDARD ionisation is active in the world 182 G4eIonisation* eion = new G4eIonisation(); 183 pmanager->AddProcess(eion, -1, 2, 2); 184 185 // MicroElec elastic is not active in the world 186 //G4MicroElecElasticCorrected* theMicroElecElasticProcess = new G4MicroElecElasticCorrected("e-_G4MicroElecElastic"); 187 //theMicroElecElasticProcess->SetEmModel(new G4DummyModel(),1); 188 //pmanager->AddDiscreteProcess(theMicroElecElasticProcess); 189 190 G4MicroElecElastic* theMicroElecElasticProcess = new G4MicroElecElastic("e-_G4MicroElecElastic"); 191 theMicroElecElasticProcess->SetEmModel(new G4DummyModel(),1); 192 // G4MicroElecElasticModel_new* mod = new G4MicroElecElasticModel_new(); 193 //theMicroElecElasticProcess->AddEmModel(0,mod); 194 pmanager->AddDiscreteProcess(theMicroElecElasticProcess); 195 196 // MicroElec ionisation is not active in the world 197 /*G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("e-_G4MicroElecInelastic"); 198 microelecioni->SetEmModel(new G4DummyModel(),1); 199 pmanager->AddDiscreteProcess(microelecioni);*/ 200 201 G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("e-_G4Dielectrics"); 202 microelecioni->SetEmModel(new G4DummyModel(),1); 203 pmanager->AddDiscreteProcess(microelecioni); 204 205 //Phonons for SiO2 206 207 G4MicroElecLOPhononScattering* opticalPhonon = new G4MicroElecLOPhononScattering("e-_G4LOPhononScattering"); 208 opticalPhonon->SetEmModel(new G4DummyModel(), 1); 209 pmanager->AddDiscreteProcess(opticalPhonon); 210 211 /*G4LOPhononScattering* LO60 = new G4LOPhononScattering("e-_G4LO60"); 212 LO60->SetEmModel(new G4DummyModel(), 1); 213 pmanager->AddDiscreteProcess(LO60);//*/ 214 215 216 217 G4MicroElecSurface* MicroElecSurf = new G4MicroElecSurface("e-_G4MicroElecSurface"); 218 MicroElecSurf->SetProcessManager(pmanager); 219 pmanager->AddDiscreteProcess(MicroElecSurf);//*/ 220 221 ElectronCapture* ecap = new ElectronCapture("Target",0.9*eV); //<--- Piges pour Al2O3 222 pmanager->AddDiscreteProcess(ecap);//*/ 223 224 } else if ( particleName == "proton" ) { 225 226 // STANDARD msc is active in the world 227 /*G4hMultipleScattering* msc = new G4hMultipleScattering(); 228 msc->AddEmModel(1, new G4UrbanMscModel()); 229 pmanager->AddProcess(msc, -1, 1, -1);*/ 230 231 232 // STANDARD ionisation is active in the world 233 G4hIonisation* hion = new G4hIonisation(); 234 pmanager->AddProcess(hion, -1, 2, 2); 235 236 // Dielectric ionisation is not active in the world 237 G4MicroElecInelastic* dielectricioni = new G4MicroElecInelastic("p_G4Dielectrics"); 238 dielectricioni->SetEmModel(new G4DummyModel(),1); 239 //dielectricioni->SetEmModel(new G4DummyModel(),2); 240 pmanager->AddDiscreteProcess(dielectricioni); 241 242 } else if(particleName == "alpha") { 243 244 245 // STANDARD ionisation is active in the world 246 G4ionIonisation* hion = new G4ionIonisation(); 247 pmanager->AddProcess(hion, -1, 2, 2); 248 // Dielectric ionisation is not active in the world 249 G4MicroElecInelastic* dielectricioni = new G4MicroElecInelastic("alpha_G4Dielectrics"); 250 dielectricioni->SetEmModel(new G4DummyModel(),1); 251 dielectricioni->SetEmModel(new G4DummyModel(),2); 252 pmanager->AddDiscreteProcess(dielectricioni); 253 254 } else if (particleName == "GenericIon") { 255 256 // STANDARD msc is active in the world 257 /*G4hMultipleScattering* msc = new G4hMultipleScattering(); 258 msc->AddEmModel(1, new G4UrbanMscModel()); 259 pmanager->AddProcess(new G4hMultipleScattering, -1, 1, -1);*/ 260 261 /*G4CoulombScattering* cs = new G4CoulombScattering(); 262 cs->AddEmModel(0, new G4IonCoulombScatteringModel()); 263 cs->SetBuildTableFlag(false); 264 pmanager->AddDiscreteProcess(cs);*/ 265 266 267 268 // STANDARD ionisation is active in the world 269 G4ionIonisation* hion = new G4ionIonisation(); 270 pmanager->AddProcess(hion, -1, 2, 2); 271 272 // Dielectric ionisation is not actived in the world 273 G4MicroElecInelastic* dielectricioni = new G4MicroElecInelastic("ion_G4Dielectrics"); 274 dielectricioni->SetEmModel(new G4DummyModel(),1); 275 dielectricioni->SetEmModel(new G4DummyModel(),2); 276 pmanager->AddDiscreteProcess(dielectricioni); 277 } 278 } 279 280 // ************************************** 281 // 2) Define processes for Target region 282 // ************************************** 283 284 // STANDARD EM processes should be inactivated when corresponding MicroElec processes are used 285 // - STANDARD EM e- processes are inactivated below 100 MeV 286 // - STANDARD EM proton & ion processes are inactivated below standEnergyLimit 287 // 288 G4EmConfigurator* em_config = G4LossTableManager::Instance()->EmConfigurator(); 289 290 G4VEmModel* mod; 291 // *** e- 292 293 // ---> STANDARD EM processes are inactivated below 100 MeV 294 295 G4UrbanMscModel* msc = new G4UrbanMscModel(); 296 msc->SetActivationLowEnergyLimit(100*MeV); 297 em_config->SetExtraEmModel("e-","msc",msc,"Target"); 298 299 300 mod = new G4MollerBhabhaModel(); 301 mod->SetActivationLowEnergyLimit(10*MeV); 302 em_config->SetExtraEmModel("e-","eIoni",mod,"Target",0.0,10*TeV, new G4UniversalFluctuation()); 303 304 305 // ---> MicroElec processes activated 306 307 308 mod = new G4MicroElecElasticModel_new(); 309 em_config->SetExtraEmModel("e-","e-_G4MicroElecElastic",mod,"Target",0.1*eV,100*MeV); 310 311 mod = new G4MicroElecInelasticModel_new(); 312 em_config->SetExtraEmModel("e-","e-_G4Dielectrics",mod,"Target",0.1*eV,10*MeV); 313 314 // G4double hw = 0.15*eV; 315 316 //Old phonon 317 318 /*mod = new LOPhononModel(0.153*eV,false); 319 em_config->SetExtraEmModel("e-", "e-_G4LOPhononScattering", mod, "Target", 0.153*eV, 10 * MeV); 320 321 mod = new LOPhononModel(0.063*eV,false); 322 em_config->SetExtraEmModel("e-", "e-_G4LO60", mod, "Target", 0.06*eV, 10 * MeV);//*/ 323 324 //Phonons LO pour sio2 et al2o3 325 326 mod = new G4MicroElecLOPhononModel(); 327 em_config->SetExtraEmModel("e-", "e-_G4LOPhononScattering", mod, "Target", 0.1 * eV, 10 * MeV);//*/ 328 329 330 // *** proton ---------------------------------------------------------- 331 332 // ---> STANDARD EM processes inactivated below standEnergyLimit 333 334 // STANDARD msc is still active 335 // Inactivate following STANDARD processes 336 337 // il faut desactiver Bragg puisque notre modle descend en-dessous de 50 keV 338 /*mod = new G4BraggModel(); 339 mod->SetActivationHighEnergyLimit(50*keV); 340 em_config->SetExtraEmModel("proton","hIoni",mod,"Target",0.0,2*MeV, new G4IonFluctuations());*/ 341 342 mod = new G4BetheBlochModel(); 343 mod->SetActivationLowEnergyLimit(10*MeV); 344 em_config->SetExtraEmModel("proton","hIoni",mod,"Target",2*MeV,10*TeV, new G4IonFluctuations()); 345 346 // ---> Dielectric processes activated 347 348 349 mod = new G4MicroElecInelasticModel_new(); 350 mod->SetActivationLowEnergyLimit(100*eV); 351 em_config->SetExtraEmModel("proton","p_G4Dielectrics",mod,"Target",100*eV,10*MeV); 352 //em_config->SetExtraEmModel("proton","p_G4Dielectrics",new G4DummyModel,"Target",10*MeV,10*TeV); 353 354 //*/ 355 356 357 // *** alpha ---------------------------------------------------------- 358 mod = new G4BetheBlochModel(); 359 mod->SetActivationLowEnergyLimit(10*MeV); 360 em_config->SetExtraEmModel("alpha","ionIoni",mod,"Target",10*MeV,10*TeV, new G4IonFluctuations()); 361 362 /*mod = new G4MicroElecInelasticModel_new(); 363 //mod->SetActivationLowEnergyLimit(100*eV); 364 em_config->SetExtraEmModel("alpha","alpha_G4Dielectrics",mod,"Target",0.0,10*MeV);//*/ 365 366 // *** ion ---------------------------------------------------------- 367 368 // ---> STANDARD EM processes inactivated below standEnergyLimit 369 370 // STANDARD msc is still active 371 // Inactivate following STANDARD processes 372 373 374 /*mod = new G4BraggIonModel(); 375 mod->SetActivationHighEnergyLimit(50*keV); 376 em_config->SetExtraEmModel("GenericIon","ionIoni",mod,"Target",0.0,2*MeV, new G4IonFluctuations());*/ 377 378 mod = new G4BetheBlochModel(); 379 mod->SetActivationLowEnergyLimit(10*MeV); 380 em_config->SetExtraEmModel("GenericIon","ionIoni",mod,"Target",10*MeV,10*TeV, new G4IonFluctuations()); 381 382 // ---> Dielectric processes activated 383 mod = new G4MicroElecInelasticModel_new(); 384 mod->SetActivationLowEnergyLimit(100*eV); 385 em_config->SetExtraEmModel("GenericIon","ion_G4Dielectrics",mod,"Target",0.0,10*MeV); 386 //em_config->SetExtraEmModel("GenericIon","ion_G4Dielectrics",new G4DummyModel,"Target",10*GeV,10*TeV); 387 388 // Deexcitation 389 // 390 G4VAtomDeexcitation* de = new G4UAtomicDeexcitation(); 391 G4LossTableManager::Instance()->SetAtomDeexcitation(de); 392 de->SetFluo(true); 393 de->SetAuger(true); 394 de->SetPIXE(true); 395 de->InitialiseForNewRun(); 396 397 // G4ProductionCutsTable::GetProductionCutsTable()->SetEnergyRange(5*eV, 100.0*GeV); 398 399 } 400 401 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 402 403 void MicroElecPhysics::ConstructGeneral() 404 { } 405 406 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 407 408 void MicroElecPhysics::SetCuts() 409 { 410 if (verboseLevel >0) 411 { 412 G4cout << "MicroElecPhysics::SetCuts:"; 413 G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; 414 } 415 416 // set cut values for gamma at first and for e- second and next for e+, 417 // because some processes for e+/e- need cut values for gamma 418 SetCutValue(cutForGamma, "gamma"); 419 SetCutValue(cutForElectron, "e-"); 420 SetCutValue(cutForPositron, "e+"); 421 SetCutValue(cutForProton, "proton"); 422 423 if (verboseLevel>0) { DumpCutValuesTable(); } 424 } 425