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 // ------------------------------------------- 26 // ------------------------------------------------------------------- >> 27 // $Id: PhysicsList.cc,v 1.1 2012-09-21 mraine Exp $ 27 // ------------------------------------------- 28 // ------------------------------------------------------------------- 28 29 29 //....oooOO0OOooo........oooOO0OOooo........oo 30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 30 31 31 #include "PhysicsList.hh" 32 #include "PhysicsList.hh" 32 #include "G4SystemOfUnits.hh" 33 #include "G4SystemOfUnits.hh" 33 34 34 // Geant4-MicroElec MODELS << 35 << 36 #include "G4MicroElecElastic.hh" << 37 #include "G4MicroElecElasticModel.hh" << 38 << 39 #include "G4MicroElecInelastic.hh" << 40 #include "G4MicroElecInelasticModel.hh" << 41 // << 42 << 43 #include "G4LossTableManager.hh" << 44 #include "G4EmConfigurator.hh" << 45 #include "G4VEmModel.hh" << 46 #include "G4DummyModel.hh" << 47 #include "G4eIonisation.hh" << 48 #include "G4hIonisation.hh" << 49 #include "G4ionIonisation.hh" << 50 #include "G4eMultipleScattering.hh" << 51 #include "G4hMultipleScattering.hh" << 52 #include "G4BraggModel.hh" << 53 #include "G4BraggIonModel.hh" << 54 #include "G4BetheBlochModel.hh" << 55 #include "G4UrbanMscModel.hh" << 56 #include "G4MollerBhabhaModel.hh" << 57 #include "G4IonFluctuations.hh" << 58 #include "G4UniversalFluctuation.hh" << 59 << 60 #include "G4ElectronCapture.hh" << 61 << 62 #include "G4UAtomicDeexcitation.hh" << 63 << 64 //....oooOO0OOooo........oooOO0OOooo........oo 35 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 65 36 66 PhysicsList::PhysicsList(): G4VUserPhysicsLis 37 PhysicsList::PhysicsList(): G4VUserPhysicsList() 67 { 38 { 68 defaultCutValue = 1*micrometer; 39 defaultCutValue = 1*micrometer; 69 cutForGamma = defaultCutValue; 40 cutForGamma = defaultCutValue; 70 cutForElectron = defaultCutValue; 41 cutForElectron = defaultCutValue; 71 cutForPositron = defaultCutValue; 42 cutForPositron = defaultCutValue; 72 cutForProton = defaultCutValue; 43 cutForProton = defaultCutValue; 73 44 74 SetVerboseLevel(1); 45 SetVerboseLevel(1); 75 } 46 } 76 47 77 //....oooOO0OOooo........oooOO0OOooo........oo 48 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 78 49 79 PhysicsList::~PhysicsList() 50 PhysicsList::~PhysicsList() 80 {} 51 {} 81 52 82 //....oooOO0OOooo........oooOO0OOooo........oo 53 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 83 54 84 void PhysicsList::ConstructParticle() 55 void PhysicsList::ConstructParticle() 85 { 56 { 86 ConstructBosons(); 57 ConstructBosons(); 87 ConstructLeptons(); 58 ConstructLeptons(); 88 ConstructBarions(); 59 ConstructBarions(); 89 } 60 } 90 61 91 //....oooOO0OOooo........oooOO0OOooo........oo 62 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 92 63 93 void PhysicsList::ConstructBosons() 64 void PhysicsList::ConstructBosons() 94 { 65 { 95 // gamma 66 // gamma 96 G4Gamma::GammaDefinition(); 67 G4Gamma::GammaDefinition(); 97 } 68 } 98 //....oooOO0OOooo........oooOO0OOooo........o 69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 99 70 100 void PhysicsList::ConstructLeptons() 71 void PhysicsList::ConstructLeptons() 101 { 72 { 102 // leptons 73 // leptons 103 G4Electron::ElectronDefinition(); 74 G4Electron::ElectronDefinition(); 104 G4Positron::PositronDefinition(); 75 G4Positron::PositronDefinition(); 105 } 76 } 106 77 107 //....oooOO0OOooo........oooOO0OOooo........oo 78 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 108 79 109 void PhysicsList::ConstructBarions() 80 void PhysicsList::ConstructBarions() 110 { 81 { 111 // baryons 82 // baryons 112 G4Proton::ProtonDefinition(); 83 G4Proton::ProtonDefinition(); 113 G4GenericIon::GenericIonDefinition(); 84 G4GenericIon::GenericIonDefinition(); 114 } 85 } 115 86 116 //....oooOO0OOooo........oooOO0OOooo........oo 87 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 117 88 118 void PhysicsList::ConstructProcess() 89 void PhysicsList::ConstructProcess() 119 { 90 { 120 AddTransportation(); 91 AddTransportation(); 121 ConstructEM(); 92 ConstructEM(); 122 ConstructGeneral(); 93 ConstructGeneral(); 123 } 94 } 124 95 125 //....oooOO0OOooo........oooOO0OOooo........oo 96 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 126 97 >> 98 // Geant4-MicroElec MODELS >> 99 >> 100 #include "G4MicroElecElastic.hh" >> 101 #include "G4MicroElecElasticModel.hh" >> 102 >> 103 #include "G4MicroElecInelastic.hh" >> 104 #include "G4MicroElecInelasticModel.hh" >> 105 // >> 106 >> 107 #include "G4LossTableManager.hh" >> 108 #include "G4EmConfigurator.hh" >> 109 #include "G4VEmModel.hh" >> 110 #include "G4DummyModel.hh" >> 111 #include "G4eIonisation.hh" >> 112 #include "G4hIonisation.hh" >> 113 #include "G4ionIonisation.hh" >> 114 #include "G4eMultipleScattering.hh" >> 115 #include "G4hMultipleScattering.hh" >> 116 #include "G4BraggModel.hh" >> 117 #include "G4BraggIonModel.hh" >> 118 #include "G4BetheBlochModel.hh" >> 119 #include "G4UrbanMscModel.hh" >> 120 #include "G4MollerBhabhaModel.hh" >> 121 #include "G4IonFluctuations.hh" >> 122 #include "G4UniversalFluctuation.hh" >> 123 >> 124 #include "G4ElectronCapture.hh" >> 125 >> 126 #include "G4UAtomicDeexcitation.hh" >> 127 >> 128 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 129 127 void PhysicsList::ConstructEM() 130 void PhysicsList::ConstructEM() 128 { 131 { 129 132 130 auto particleIterator=GetParticleIterator(); << 133 theParticleIterator->reset(); 131 particleIterator->reset(); << 132 134 133 while( (*particleIterator)() ) << 135 while( (*theParticleIterator)() ) 134 { 136 { 135 137 136 G4ParticleDefinition* particle = particleI << 138 G4ParticleDefinition* particle = theParticleIterator->value(); 137 G4ProcessManager* pmanager = particle->Get 139 G4ProcessManager* pmanager = particle->GetProcessManager(); 138 G4String particleName = particle->GetParti 140 G4String particleName = particle->GetParticleName(); 139 141 140 // ********************************* 142 // ********************************* 141 // 1) Processes for the World region 143 // 1) Processes for the World region 142 // ********************************* 144 // ********************************* 143 145 144 if (particleName == "e-") { 146 if (particleName == "e-") { 145 147 146 // STANDARD msc is active in the world 148 // STANDARD msc is active in the world 147 G4eMultipleScattering* msc = new G4eMult 149 G4eMultipleScattering* msc = new G4eMultipleScattering(); 148 msc->AddEmModel(1, new G4UrbanMscModel() << 150 pmanager->AddProcess(msc, -1, 1, 1); 149 pmanager->AddProcess(msc, -1, 1, -1); << 150 151 151 // STANDARD ionisation is active in the 152 // STANDARD ionisation is active in the world 152 G4eIonisation* eion = new G4eIonisation( 153 G4eIonisation* eion = new G4eIonisation(); 153 pmanager->AddProcess(eion, -1, 2, 2); 154 pmanager->AddProcess(eion, -1, 2, 2); 154 155 155 // MicroElec elastic is not active in th 156 // MicroElec elastic is not active in the world 156 G4MicroElecElastic* theMicroElecElasticP 157 G4MicroElecElastic* theMicroElecElasticProcess = new G4MicroElecElastic("e-_G4MicroElecElastic"); 157 theMicroElecElasticProcess->SetEmModel(n << 158 theMicroElecElasticProcess->SetEmModel(new G4DummyModel(),1); 158 pmanager->AddDiscreteProcess(theMicroEle 159 pmanager->AddDiscreteProcess(theMicroElecElasticProcess); 159 160 160 // MicroElec ionisation is not active in 161 // MicroElec ionisation is not active in the world 161 G4MicroElecInelastic* microelecioni = ne 162 G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("e-_G4MicroElecInelastic"); 162 microelecioni->SetEmModel(new G4DummyMod << 163 microelecioni->SetEmModel(new G4DummyModel(),1); 163 pmanager->AddDiscreteProcess(microelecio 164 pmanager->AddDiscreteProcess(microelecioni); 164 165 165 // THE FOLLOWING PROCESS WILL KILL ALL E 166 // THE FOLLOWING PROCESS WILL KILL ALL ELECTRONS BELOW A SELECTED ENERY THRESHOLD 166 // Capture of low-energy e- 167 // Capture of low-energy e- 167 G4ElectronCapture* ecap = new G4Electron 168 G4ElectronCapture* ecap = new G4ElectronCapture("Target", 16.7*eV); 168 pmanager->AddDiscreteProcess(ecap); 169 pmanager->AddDiscreteProcess(ecap); 169 170 170 } else if ( particleName == "proton" ) { 171 } else if ( particleName == "proton" ) { 171 172 172 // STANDARD msc is active in the world 173 // STANDARD msc is active in the world 173 G4hMultipleScattering* msc = new G4hMult 174 G4hMultipleScattering* msc = new G4hMultipleScattering(); 174 msc->AddEmModel(1, new G4UrbanMscModel() << 175 pmanager->AddProcess(msc, -1, 1, 1); 175 pmanager->AddProcess(msc, -1, 1, -1); << 176 176 177 // STANDARD ionisation is active in the 177 // STANDARD ionisation is active in the world 178 G4hIonisation* hion = new G4hIonisation( 178 G4hIonisation* hion = new G4hIonisation(); 179 pmanager->AddProcess(hion, -1, 2, 2); 179 pmanager->AddProcess(hion, -1, 2, 2); 180 180 181 // MicroElec ionisation is not active in 181 // MicroElec ionisation is not active in the world 182 G4MicroElecInelastic* microelecioni = ne 182 G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("p_G4MicroElecInelastic"); 183 microelecioni->SetEmModel(new G4DummyMod << 183 microelecioni->SetEmModel(new G4DummyModel(),1); 184 microelecioni->SetEmModel(new G4DummyMod << 184 microelecioni->SetEmModel(new G4DummyModel(),2); 185 pmanager->AddDiscreteProcess(microelecio 185 pmanager->AddDiscreteProcess(microelecioni); 186 186 187 } else if (particleName == "GenericIon") { 187 } else if (particleName == "GenericIon") { 188 188 189 // STANDARD msc is active in the world 189 // STANDARD msc is active in the world 190 G4hMultipleScattering* msc = new G4hMult << 190 pmanager->AddProcess(new G4hMultipleScattering, -1, 1, 1); 191 msc->AddEmModel(1, new G4UrbanMscModel() << 192 pmanager->AddProcess(new G4hMultipleScat << 193 191 194 // STANDARD ionisation is active in the 192 // STANDARD ionisation is active in the world 195 G4ionIonisation* hion = new G4ionIonisat 193 G4ionIonisation* hion = new G4ionIonisation(); 196 pmanager->AddProcess(hion, -1, 2, 2); 194 pmanager->AddProcess(hion, -1, 2, 2); 197 195 198 // MicroElec ionisation is not active in 196 // MicroElec ionisation is not active in the world 199 G4MicroElecInelastic* microelecioni = ne 197 G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("ion_G4MicroElecInelastic"); 200 microelecioni->SetEmModel(new G4DummyMod << 198 microelecioni->SetEmModel(new G4DummyModel(),1); 201 microelecioni->SetEmModel(new G4DummyMod << 199 microelecioni->SetEmModel(new G4DummyModel(),2); 202 pmanager->AddDiscreteProcess(microelecio 200 pmanager->AddDiscreteProcess(microelecioni); 203 } 201 } 204 } 202 } 205 203 206 // ************************************** 204 // ************************************** 207 // 2) Define processes for Target region 205 // 2) Define processes for Target region 208 // ************************************** 206 // ************************************** 209 207 210 // STANDARD EM processes should be inactivat 208 // STANDARD EM processes should be inactivated when corresponding MicroElec processes are used 211 // - STANDARD EM e- processes are inactivate 209 // - STANDARD EM e- processes are inactivated below 100 MeV 212 // - STANDARD EM proton & ion processes are 210 // - STANDARD EM proton & ion processes are inactivated below standEnergyLimit 213 // 211 // 214 G4EmConfigurator* em_config = G4LossTableMan 212 G4EmConfigurator* em_config = G4LossTableManager::Instance()->EmConfigurator(); 215 213 216 G4VEmModel* mod; 214 G4VEmModel* mod; 217 // *** e- 215 // *** e- 218 216 219 // ---> STANDARD EM processes are inactivate 217 // ---> STANDARD EM processes are inactivated below 100 MeV 220 218 221 G4UrbanMscModel* msc = new G4UrbanMscModel( 219 G4UrbanMscModel* msc = new G4UrbanMscModel(); 222 msc->SetActivationLowEnergyLimit(100*MeV); 220 msc->SetActivationLowEnergyLimit(100*MeV); 223 em_config->SetExtraEmModel("e-","msc",msc,"T 221 em_config->SetExtraEmModel("e-","msc",msc,"Target"); 224 222 225 mod = new G4MollerBhabhaModel(); 223 mod = new G4MollerBhabhaModel(); 226 mod->SetActivationLowEnergyLimit(100*MeV); << 224 mod->SetActivationLowEnergyLimit(99.99*MeV); 227 em_config->SetExtraEmModel("e-","eIoni",mod, 225 em_config->SetExtraEmModel("e-","eIoni",mod,"Target",0.0,10*TeV, new G4UniversalFluctuation()); 228 226 229 // ---> MicroElec processes activated 227 // ---> MicroElec processes activated 230 228 231 mod = new G4MicroElecElasticModel(); 229 mod = new G4MicroElecElasticModel(); 232 em_config->SetExtraEmModel("e-","e-_G4MicroE 230 em_config->SetExtraEmModel("e-","e-_G4MicroElecElastic",mod,"Target",0.0,100*MeV); 233 231 234 mod = new G4MicroElecInelasticModel(); 232 mod = new G4MicroElecInelasticModel(); 235 em_config->SetExtraEmModel("e-","e-_G4MicroE 233 em_config->SetExtraEmModel("e-","e-_G4MicroElecInelastic",mod,"Target",16.7*eV,100*MeV); 236 234 237 // *** proton 235 // *** proton 238 236 239 // ---> STANDARD EM processes inactivated be 237 // ---> STANDARD EM processes inactivated below standEnergyLimit 240 238 241 // STANDARD msc is still active 239 // STANDARD msc is still active 242 // Inactivate following STANDARD processes 240 // Inactivate following STANDARD processes 243 241 244 mod = new G4BraggModel(); 242 mod = new G4BraggModel(); 245 mod->SetActivationHighEnergyLimit(50*keV); << 243 mod->SetActivationHighEnergyLimit(0.499); 246 em_config->SetExtraEmModel("proton","hIoni", 244 em_config->SetExtraEmModel("proton","hIoni",mod,"Target",0.0,2*MeV, new G4IonFluctuations()); 247 245 248 mod = new G4BetheBlochModel(); 246 mod = new G4BetheBlochModel(); 249 mod->SetActivationLowEnergyLimit(10*GeV); << 247 mod->SetActivationLowEnergyLimit(0.99*GeV); 250 em_config->SetExtraEmModel("proton","hIoni", << 248 em_config->SetExtraEmModel("proton","hIoni",mod,"Target",2*MeV,100*GeV, new G4IonFluctuations()); 251 249 252 // ---> MicroElec processes activated 250 // ---> MicroElec processes activated 253 mod = new G4MicroElecInelasticModel(); 251 mod = new G4MicroElecInelasticModel(); 254 mod->SetActivationLowEnergyLimit(50*keV); << 252 em_config->SetExtraEmModel("proton","p_G4MicroElecInelastic",mod,"Target",50*keV,10*GeV); 255 em_config->SetExtraEmModel("proton","p_G4Mic << 256 em_config->SetExtraEmModel("proton","p_G4Mic << 257 "Target",10*GeV,10*TeV); << 258 253 259 // *** ion 254 // *** ion 260 255 261 // ---> STANDARD EM processes inactivated be 256 // ---> STANDARD EM processes inactivated below standEnergyLimit 262 257 263 // STANDARD msc is still active 258 // STANDARD msc is still active 264 // Inactivate following STANDARD processes 259 // Inactivate following STANDARD processes 265 260 266 mod = new G4BraggIonModel(); 261 mod = new G4BraggIonModel(); 267 mod->SetActivationHighEnergyLimit(50*keV); << 262 mod->SetActivationHighEnergyLimit(49.9*keV); 268 em_config->SetExtraEmModel("GenericIon","ion 263 em_config->SetExtraEmModel("GenericIon","ionIoni",mod,"Target",0.0,2*MeV, new G4IonFluctuations()); 269 264 270 mod = new G4BetheBlochModel(); 265 mod = new G4BetheBlochModel(); 271 mod->SetActivationLowEnergyLimit(10*GeV); << 266 mod->SetActivationLowEnergyLimit(0.99*GeV); 272 em_config->SetExtraEmModel("GenericIon","ion << 267 em_config->SetExtraEmModel("GenericIon","ionIoni",mod,"Target",2*MeV,100*GeV, new G4IonFluctuations()); 273 268 274 // ---> MicroElec processes activated 269 // ---> MicroElec processes activated 275 mod = new G4MicroElecInelasticModel(); 270 mod = new G4MicroElecInelasticModel(); 276 mod->SetActivationLowEnergyLimit(50*keV); << 271 em_config->SetExtraEmModel("GenericIon","ion_G4MicroElecInelastic",mod,"Target",50*keV,10*GeV); 277 em_config->SetExtraEmModel("GenericIon","ion << 278 "Target",0.0,10*GeV); << 279 em_config->SetExtraEmModel("GenericIon","ion << 280 "Target",10*GeV,10*TeV); << 281 272 282 // Deexcitation 273 // Deexcitation 283 // 274 // 284 G4VAtomDeexcitation* de = new G4UAtomicDeexc 275 G4VAtomDeexcitation* de = new G4UAtomicDeexcitation(); 285 G4LossTableManager::Instance()->SetAtomDeexc 276 G4LossTableManager::Instance()->SetAtomDeexcitation(de); 286 de->SetFluo(true); 277 de->SetFluo(true); 287 de->SetAuger(true); 278 de->SetAuger(true); 288 de->SetPIXE(true); 279 de->SetPIXE(true); 289 de->InitialiseForNewRun(); 280 de->InitialiseForNewRun(); 290 281 291 282 292 } 283 } 293 284 294 //....oooOO0OOooo........oooOO0OOooo........oo 285 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 295 286 296 void PhysicsList::ConstructGeneral() 287 void PhysicsList::ConstructGeneral() 297 { } 288 { } 298 289 299 //....oooOO0OOooo........oooOO0OOooo........oo 290 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 300 291 301 void PhysicsList::SetCuts() 292 void PhysicsList::SetCuts() 302 { 293 { 303 if (verboseLevel >0) 294 if (verboseLevel >0) 304 { 295 { 305 G4cout << "PhysicsList::SetCuts:"; 296 G4cout << "PhysicsList::SetCuts:"; 306 G4cout << "CutLength : " << G4BestUnit(def 297 G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; 307 } 298 } 308 299 309 // set cut values for gamma at first and for 300 // set cut values for gamma at first and for e- second and next for e+, 310 // because some processes for e+/e- need cut 301 // because some processes for e+/e- need cut values for gamma 311 SetCutValue(cutForGamma, "gamma"); 302 SetCutValue(cutForGamma, "gamma"); 312 SetCutValue(cutForElectron, "e-"); 303 SetCutValue(cutForElectron, "e-"); 313 SetCutValue(cutForPositron, "e+"); 304 SetCutValue(cutForPositron, "e+"); 314 SetCutValue(cutForProton, "proton"); 305 SetCutValue(cutForProton, "proton"); 315 306 316 if (verboseLevel>0) { DumpCutValuesTable(); 307 if (verboseLevel>0) { DumpCutValuesTable(); } 317 } 308 } 318 309