Geant4  10.01
PhysicsList.cc
Go to the documentation of this file.
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 // This example is provided by the Geant4-DNA collaboration
27 // Any report or published results obtained using the Geant4-DNA software
28 // shall cite the following Geant4-DNA collaboration publication:
29 // Med. Phys. 37 (2010) 4692-4708
30 // The Geant4-DNA web site is available at http://geant4-dna.org
31 //
32 // $ID$
35 
36 #include "PhysicsList.hh"
37 #include "G4SystemOfUnits.hh"
38 
39 // Geant4-DNA MODELS
40 
41 #include "G4DNAElastic.hh"
44 
45 #include "G4DNAExcitation.hh"
48 
49 #include "G4DNAIonisation.hh"
52 
53 #include "G4DNAChargeDecrease.hh"
55 
56 #include "G4DNAChargeIncrease.hh"
58 
59 #include "G4DNAAttachment.hh"
61 
62 #include "G4DNAVibExcitation.hh"
64 
65 //
66 
67 #include "G4LossTableManager.hh"
68 #include "G4EmConfigurator.hh"
69 #include "G4VEmModel.hh"
70 #include "G4DummyModel.hh"
71 #include "G4eIonisation.hh"
72 #include "G4hIonisation.hh"
73 #include "G4ionIonisation.hh"
74 #include "G4eMultipleScattering.hh"
75 #include "G4hMultipleScattering.hh"
76 #include "G4BraggIonGasModel.hh"
78 #include "G4UrbanMscModel.hh"
79 #include "G4MollerBhabhaModel.hh"
80 #include "G4IonFluctuations.hh"
82 
83 #include "G4ElectronCapture.hh"
84 
85 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
86 
88 {
94 
95  SetVerboseLevel(1);
96 }
97 
98 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
99 
101 {}
102 
103 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
104 
105 
107 {
108  ConstructBosons();
111 }
112 
113 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
114 
116 {
117  // gamma
119 }
120 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
121 
123 {
124  // leptons
127 }
128 
129 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
130 
131 //DNA
133 //ENDDNA
134 
136 {
137  // baryons
140 
141  // Geant4 DNA new particles
142  G4DNAGenericIonsManager * genericIonsManager;
143  genericIonsManager=G4DNAGenericIonsManager::Instance();
144  genericIonsManager->GetIon("alpha++");
145  genericIonsManager->GetIon("alpha+");
146  genericIonsManager->GetIon("helium");
147  genericIonsManager->GetIon("hydrogen");
148 }
149 
150 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
151 
153 {
155  ConstructEM();
157 }
158 
159 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
160 
162 {
163 
164  theParticleIterator->reset();
165 
166  while( (*theParticleIterator)() )
167  {
168 
169  G4ParticleDefinition* particle = theParticleIterator->value();
170  G4ProcessManager* pmanager = particle->GetProcessManager();
171  G4String particleName = particle->GetParticleName();
172 
173  // *********************************
174  // 1) Processes for the World region
175  // *********************************
176 
177  if (particleName == "e-") {
178 
179  // STANDARD msc is active in the world
181  pmanager->AddProcess(msc, -1, 1, 1);
182 
183  // STANDARD ionisation is active in the world
184  G4eIonisation* eion = new G4eIonisation();
185  eion->SetEmModel(new G4MollerBhabhaModel(), 1);
186  pmanager->AddProcess(eion, -1, 2, 2);
187 
188  // DNA elastic is not active in the world
189  G4DNAElastic* theDNAElasticProcess = new G4DNAElastic("e-_G4DNAElastic");
190  theDNAElasticProcess->SetEmModel(new G4DummyModel(),1);
191  pmanager->AddDiscreteProcess(theDNAElasticProcess);
192 
193  // DNA excitation is not active in the world
194  G4DNAExcitation* dnaex = new G4DNAExcitation("e-_G4DNAExcitation");
195  dnaex->SetEmModel(new G4DummyModel(),1);
196  pmanager->AddDiscreteProcess(dnaex);
197 
198  // DNA ionisation is not active in the world
199  G4DNAIonisation* dnaioni = new G4DNAIonisation("e-_G4DNAIonisation");
200  dnaioni->SetEmModel(new G4DummyModel(),1);
201  pmanager->AddDiscreteProcess(dnaioni);
202 
203  // DNA attachment is not active in the world
204  G4DNAAttachment* dnaatt = new G4DNAAttachment("e-_G4DNAAttachment");
205  dnaatt->SetEmModel(new G4DummyModel(),1);
206  pmanager->AddDiscreteProcess(dnaatt);
207 
208  // DNA vib. excitation is not active in the world
209  G4DNAVibExcitation* dnavib =
210  new G4DNAVibExcitation("e-_G4DNAVibExcitation");
211  dnavib->SetEmModel(new G4DummyModel(),1);
212  pmanager->AddDiscreteProcess(dnavib);
213 
214  // THE FOLLOWING PROCESS WILL KILL ALL ELECTRONS BELOW A
215  // SELECTED ENERY THRESHOLD
216  // Capture of low-energy e-
217  G4ElectronCapture* ecap = new G4ElectronCapture("Target", 5.1*eV);
218  pmanager->AddDiscreteProcess(ecap);
219 
220  } else if ( particleName == "proton" ) {
221 
222  // STANDARD msc is active in the world
224  pmanager->AddProcess(msc, -1, 1, 1);
225 
226  // STANDARD ionisation is active in the world
227  G4hIonisation* hion = new G4hIonisation();
228  hion->SetEmModel(new G4BraggIonGasModel(), 1);
229  hion->SetEmModel(new G4BetheBlochIonGasModel(), 2);
230  pmanager->AddProcess(hion, -1, 2, 2);
231 
232  // DNA excitation is not active in the world
233  G4DNAExcitation* dnaex = new G4DNAExcitation("proton_G4DNAExcitation");
234  dnaex->SetEmModel(new G4DummyModel(),1);
235  dnaex->SetEmModel(new G4DummyModel(),2);
236  pmanager->AddDiscreteProcess(dnaex);
237 
238  // DNA ionisation is not active in the world
239  G4DNAIonisation* dnaioni = new G4DNAIonisation("proton_G4DNAIonisation");
240  dnaioni->SetEmModel(new G4DummyModel(),1);
241  dnaioni->SetEmModel(new G4DummyModel(),2);
242  pmanager->AddDiscreteProcess(dnaioni);
243 
244  // DNA charge decrease is ACTIVE in the world since
245  // no corresponding STANDARD process exist
246  pmanager->AddDiscreteProcess(
247  new G4DNAChargeDecrease("proton_G4DNAChargeDecrease"));
248 
249  } else if ( particleName == "hydrogen" ) {
250 
251  // DNA processes are ACTIVE in the world since
252  // no corresponding STANDARD processes exist
253  pmanager->AddDiscreteProcess(
254  new G4DNAIonisation("hydrogen_G4DNAIonisation"));
255  pmanager->AddDiscreteProcess(
256  new G4DNAExcitation("hydrogen_G4DNAExcitation"));
257  pmanager->AddDiscreteProcess(
258  new G4DNAChargeIncrease("hydrogen_G4DNAChargeIncrease"));
259 
260  } else if (particleName == "GenericIon")
261  { // THIS IS NEEDED FOR STANDARD ALPHA G4ionIonisation PROCESS
262 
263  // STANDARD msc is active in the world
264  pmanager->AddProcess(new G4hMultipleScattering, -1, 1, 1);
265 
266  // STANDARD ionisation is active in the world
267  G4ionIonisation* hion = new G4ionIonisation();
268  hion->SetEmModel(new G4BraggIonGasModel(),1);
269  hion->SetEmModel(new G4BetheBlochIonGasModel(), 2);
270  pmanager->AddProcess(hion, -1, 2, 2);
271 
272  } else if ( particleName == "alpha" ) {
273 
274  // STANDARD msc is active in the world
276  pmanager->AddProcess(msc, -1, 1, 1);
277 
278  // STANDARD ionisation is active in the world
279  G4ionIonisation* hion = new G4ionIonisation();
280  hion->SetEmModel(new G4BraggIonGasModel(),1);
281  hion->SetEmModel(new G4BetheBlochIonGasModel(), 2);
282  pmanager->AddProcess(hion, -1, 2, 2);
283 
284  // DNA excitation is not active in the world
285  G4DNAExcitation* dnaex = new G4DNAExcitation("alpha_G4DNAExcitation");
286  dnaex->SetEmModel(new G4DummyModel(),1);
287  pmanager->AddDiscreteProcess(dnaex);
288 
289  // DNA ionisation is not active in the world
290  G4DNAIonisation* dnaioni = new G4DNAIonisation("alpha_G4DNAIonisation");
291  dnaioni->SetEmModel(new G4DummyModel(),1);
292  pmanager->AddDiscreteProcess(dnaioni);
293 
294  // DNA charge decrease is ACTIVE in the world since no
295  // corresponding STANDARD process exist
296  pmanager->AddDiscreteProcess(
297  new G4DNAChargeDecrease("alpha_G4DNAChargeDecrease"));
298 
299  } else if ( particleName == "alpha+" ) {
300 
301  // DNA processes are ACTIVE in the world since no
302  // corresponding STANDARD processes exist
303  pmanager->AddDiscreteProcess(
304  new G4DNAExcitation("alpha+_G4DNAExcitation"));
305  pmanager->AddDiscreteProcess(
306  new G4DNAIonisation("alpha+_G4DNAIonisation"));
307  pmanager->AddDiscreteProcess(
308  new G4DNAChargeDecrease("alpha+_G4DNAChargeDecrease"));
309  pmanager->AddDiscreteProcess(
310  new G4DNAChargeIncrease("alpha+_G4DNAChargeIncrease"));
311 
312  } else if ( particleName == "helium" ) {
313 
314  // DNA processes are ACTIVE in the world since no
315  // corresponding STANDARD processes exist
316  pmanager->AddDiscreteProcess(
317  new G4DNAExcitation("helium_G4DNAExcitation"));
318  pmanager->AddDiscreteProcess(
319  new G4DNAIonisation("helium_G4DNAIonisation"));
320  pmanager->AddDiscreteProcess(
321  new G4DNAChargeIncrease("helium_G4DNAChargeIncrease"));
322 
323  }
324  }
325 
326  // **************************************
327  // 2) Define processes for Target region
328  // **************************************
329 
330  // STANDARD EM processes should be inactivated when
331  // corresponding DNA processes are used
332  // - STANDARD EM e- processes are inactivated below 1 MeV
333  // - STANDARD EM proton & alpha processes are inactivated below
334  // standEnergyLimit
335  G4double standEnergyLimit = 9.9*MeV;
336  //
337 
338  G4double massFactor = 1.0079/4.0026;
341 
342  G4VEmModel* mod;
343 
344  // *** e-
345 
346  // ---> STANDARD EM processes are inactivated below 1 MeV
347 
348  mod = new G4UrbanMscModel();
350  em_config->SetExtraEmModel("e-","msc",mod,"Target");
351 
352  mod = new G4MollerBhabhaModel();
354  em_config->SetExtraEmModel("e-",
355  "eIoni",
356  mod,
357  "Target",
358  0.0,
359  100*TeV,
360  new G4UniversalFluctuation());
361 
362  // ---> DNA processes activated
363 
364  mod = new G4DNAChampionElasticModel();
365  em_config->SetExtraEmModel("e-","e-_G4DNAElastic",
366  mod,"Target",0.0,1*MeV);
367 
368  mod = new G4DNABornIonisationModel();
369  em_config->SetExtraEmModel("e-","e-_G4DNAIonisation",
370  mod,"Target",11*eV,1*MeV);
371 
372  mod = new G4DNABornExcitationModel();
373  em_config->SetExtraEmModel("e-","e-_G4DNAExcitation",
374  mod,"Target",9*eV,1*MeV);
375 
376  mod = new G4DNAMeltonAttachmentModel();
377  em_config->SetExtraEmModel("e-","e-_G4DNAAttachment",
378  mod,"Target",4*eV,13*eV);
379 
380  mod = new G4DNASancheExcitationModel();
381  em_config->SetExtraEmModel("e-","e-_G4DNAVibExcitation",
382  mod,"Target",2*eV,100*eV);
383 
384  // *** proton
385 
386  // ---> STANDARD EM processes inactivated below standEnergyLimit
387 
388  // STANDARD msc is still active
389  // Inactivate following STANDARD processes
390 
391  mod = new G4BraggIonGasModel();
392  mod->SetActivationLowEnergyLimit(standEnergyLimit);
393  em_config->SetExtraEmModel("proton","hIoni",
394  mod,"Target",0.0,2*MeV, new G4IonFluctuations());
395 
396  mod = new G4BetheBlochIonGasModel();
397  mod->SetActivationLowEnergyLimit(standEnergyLimit);
398  em_config->SetExtraEmModel("proton","hIoni",
399  mod,"Target",2*MeV,100*TeV,
400  new G4UniversalFluctuation());
401 
402  // ---> DNA processes activated
403 
404  mod = new G4DNARuddIonisationModel();
405  em_config->SetExtraEmModel("proton","proton_G4DNAIonisation",
406  mod,"Target",0.0,0.5*MeV);
407 
408  mod = new G4DNABornIonisationModel();
409  em_config->SetExtraEmModel("proton","proton_G4DNAIonisation",
410  mod,"Target",0.5*MeV,10*MeV);
411 
413  em_config->SetExtraEmModel("proton","proton_G4DNAExcitation",
414  mod,"Target",10*eV,0.5*MeV);
415 
416  mod = new G4DNABornExcitationModel();
417  em_config->SetExtraEmModel("proton","proton_G4DNAExcitation",
418  mod,"Target",0.5*MeV,10*MeV);
419 
420  // *** alpha
421 
422  // ---> STANDARD EM processes inactivated below standEnergyLimit
423 
424  // STANDARD msc is still active
425  // Inactivate following STANDARD processes
426 
427  mod = new G4BraggIonGasModel();
428  mod->SetActivationLowEnergyLimit(standEnergyLimit);
429  em_config->SetExtraEmModel("alpha","ionIoni",
430  mod,"Target",0.0,2*MeV/massFactor,
431  new G4IonFluctuations());
432 
433  mod = new G4BetheBlochIonGasModel();
434  mod->SetActivationLowEnergyLimit(standEnergyLimit);
435  em_config->SetExtraEmModel("alpha","ionIoni",
436  mod,"Target",2*MeV/massFactor,100*TeV,
437  new G4UniversalFluctuation());
438 
439  // ---> DNA processes activated
440 
441  mod = new G4DNARuddIonisationModel();
442  em_config->SetExtraEmModel("alpha","alpha_G4DNAIonisation",
443  mod,"Target",0.0,10*MeV);
444 
446  em_config->SetExtraEmModel("alpha","alpha_G4DNAExcitation",
447  mod,"Target",1*keV,10*MeV);
448 
449 }
450 
451 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
452 
454 { }
455 
456 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
457 
459 {
460  if (verboseLevel >0)
461  {
462  G4cout << "PhysicsList::SetCuts:";
463  G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl;
464  }
465 
466  // set cut values for gamma at first and for e- second and next for e+,
467  // because some processes for e+/e- need cut values for gamma
468  SetCutValue(cutForGamma, "gamma");
471  SetCutValue(cutForProton, "proton");
472 
473  if (verboseLevel>0) { DumpCutValuesTable(); }
474 }
G4EmConfigurator * EmConfigurator()
static G4Electron * ElectronDefinition()
Definition: G4Electron.cc:89
static G4GenericIon * GenericIonDefinition()
Definition: G4GenericIon.cc:88
void ConstructParticle()
Definition: PhysicsList.cc:117
static const double MeV
Definition: G4SIunits.hh:193
static G4LossTableManager * Instance()
void SetCutValue(G4double aCut, const G4String &pname)
void ConstructBosons()
Definition: PhysicsList.cc:64
void ConstructLeptons()
Definition: PhysicsList.cc:71
static G4Proton * ProtonDefinition()
Definition: G4Proton.cc:88
G4int AddDiscreteProcess(G4VProcess *aProcess, G4int ord=ordDefault)
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
G4ProcessManager * GetProcessManager() const
G4EmConfigurator em_config
Definition: PhysicsList.hh:65
const G4String & GetParticleName() const
G4double cutForProton
Definition: PhysicsList.hh:75
G4double cutForElectron
Definition: PhysicsList.hh:64
void ConstructBarions()
Definition: PhysicsList.cc:80
void SetEmModel(G4VEmModel *, G4int index=1)
void DumpCutValuesTable(G4int flag=1)
G4GLOB_DLL std::ostream G4cout
G4int AddProcess(G4VProcess *aProcess, G4int ordAtRestDoIt=ordInActive, G4int ordAlongSteptDoIt=ordInActive, G4int ordPostStepDoIt=ordInActive)
static G4DNAGenericIonsManager * Instance(void)
void SetVerboseLevel(G4int value)
void SetCuts()
Definition: PhysicsList.cc:219
void SetActivationLowEnergyLimit(G4double)
Definition: G4VEmModel.hh:727
static G4Positron * PositronDefinition()
Definition: G4Positron.cc:89
static const double micrometer
Definition: G4SIunits.hh:90
static const double eV
Definition: G4SIunits.hh:194
G4double cutForGamma
Definition: PhysicsList.hh:63
void SetEmModel(G4VEmModel *, G4int index=1)
#define G4endl
Definition: G4ios.hh:61
static const double TeV
Definition: G4SIunits.hh:197
static const double keV
Definition: G4SIunits.hh:195
G4double cutForPositron
Definition: PhysicsList.hh:65
double G4double
Definition: G4Types.hh:76
void ConstructProcess()
Definition: PhysicsList.cc:170
void ConstructGeneral()
Definition: PhysicsList.cc:287
void ConstructEM()
Definition: PhysicsList.cc:120
void SetExtraEmModel(const G4String &particleName, const G4String &processName, G4VEmModel *, const G4String &regionName="", G4double emin=0.0, G4double emax=DBL_MAX, G4VEmFluctuationModel *fm=0)
#define theParticleIterator
G4ParticleDefinition * GetIon(const G4String &name)
static G4Gamma * GammaDefinition()
Definition: G4Gamma.cc:81