Geant4  10.03.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
66 
67 //
68 
69 #include "G4LossTableManager.hh"
70 #include "G4EmConfigurator.hh"
71 #include "G4VEmModel.hh"
72 #include "G4DummyModel.hh"
73 #include "G4eIonisation.hh"
74 #include "G4hIonisation.hh"
75 #include "G4ionIonisation.hh"
76 #include "G4eMultipleScattering.hh"
77 #include "G4hMultipleScattering.hh"
78 #include "G4BraggIonGasModel.hh"
80 #include "G4UrbanMscModel.hh"
81 #include "G4MollerBhabhaModel.hh"
82 #include "G4IonFluctuations.hh"
84 
85 #include "G4ElectronCapture.hh"
86 
87 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
88 
90 {
92  fCutForGamma = defaultCutValue;
93  fCutForElectron = defaultCutValue;
94  fCutForPositron = defaultCutValue;
95  fCutForProton = defaultCutValue;
96 
97  SetVerboseLevel(1);
98 }
99 
100 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
101 
103 {}
104 
105 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
106 
108 {
109  ConstructBosons();
112 }
113 
114 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
115 
117 {
118  // gamma
120 }
121 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
122 
124 {
125  // leptons
128 }
129 
130 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
131 
132 //DNA
134 //ENDDNA
135 
137 {
138  // baryons
141 
142  // Geant4 DNA new particles
143  G4DNAGenericIonsManager * genericIonsManager;
144  genericIonsManager=G4DNAGenericIonsManager::Instance();
145  genericIonsManager->GetIon("alpha++");
146  genericIonsManager->GetIon("alpha+");
147  genericIonsManager->GetIon("helium");
148  genericIonsManager->GetIon("hydrogen");
149 }
150 
151 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
152 
154 {
156  ConstructEM();
158 }
159 
160 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
161 
163 {
164 
166  particleIterator->reset();
167 
168  while( (*particleIterator)() )
169  {
170 
171  G4ParticleDefinition* particle = particleIterator->value();
172  G4ProcessManager* pmanager = particle->GetProcessManager();
173  G4String particleName = particle->GetParticleName();
174 
175  // *********************************
176  // 1) Processes for the World region
177  // *********************************
178 
179  if (particleName == "e-") {
180 
181  // STANDARD msc is active in the world
183  msc->AddEmModel(1,new G4UrbanMscModel());
184  pmanager->AddProcess(msc, -1, 1, -1);
185 
186  // STANDARD ionisation is active in the world
187  G4eIonisation* eion = new G4eIonisation();
188  eion->SetEmModel(new G4MollerBhabhaModel(), 1);
189  pmanager->AddProcess(eion, -1, 2, 2);
190 
191  // DNA elastic is not active in the world
192  G4DNAElastic* theDNAElasticProcess = new G4DNAElastic("e-_G4DNAElastic");
193  theDNAElasticProcess->SetEmModel(new G4DummyModel(),1);
194  pmanager->AddDiscreteProcess(theDNAElasticProcess);
195 
196  // DNA excitation is not active in the world
197  G4DNAExcitation* dnaex = new G4DNAExcitation("e-_G4DNAExcitation");
198  dnaex->SetEmModel(new G4DummyModel(),1);
199  pmanager->AddDiscreteProcess(dnaex);
200 
201  // DNA ionisation is not active in the world
202  G4DNAIonisation* dnaioni = new G4DNAIonisation("e-_G4DNAIonisation");
203  dnaioni->SetEmModel(new G4DummyModel(),1);
204  pmanager->AddDiscreteProcess(dnaioni);
205 
206  // DNA attachment is not active in the world
207  G4DNAAttachment* dnaatt = new G4DNAAttachment("e-_G4DNAAttachment");
208  dnaatt->SetEmModel(new G4DummyModel(),1);
209  pmanager->AddDiscreteProcess(dnaatt);
210 
211  // DNA vib. excitation is not active in the world
212  G4DNAVibExcitation* dnavib =
213  new G4DNAVibExcitation("e-_G4DNAVibExcitation");
214  dnavib->SetEmModel(new G4DummyModel(),1);
215  pmanager->AddDiscreteProcess(dnavib);
216 
217  // THE FOLLOWING PROCESS WILL KILL ALL ELECTRONS BELOW A
218  // SELECTED ENERY THRESHOLD
219  // Capture of low-energy e-
220  G4ElectronCapture* ecap = new G4ElectronCapture("Target", 7.4*eV);
221  pmanager->AddDiscreteProcess(ecap);
222  // 7.4 eV is compatible with the validity range of the Champion's model
223 
224  } else if ( particleName == "proton" ) {
225 
226  // STANDARD msc is active in the world
228  msc->AddEmModel(1,new G4UrbanMscModel());
229  pmanager->AddProcess(msc, -1, 1, -1);
230 
231  // STANDARD ionisation is active in the world
232  G4hIonisation* hion = new G4hIonisation();
233  hion->SetEmModel(new G4BraggIonGasModel(), 1);
234  hion->SetEmModel(new G4BetheBlochIonGasModel(), 2);
235  pmanager->AddProcess(hion, -1, 2, 2);
236 
237  // DNA excitation is not active in the world
238  G4DNAExcitation* dnaex = new G4DNAExcitation("proton_G4DNAExcitation");
239  dnaex->SetEmModel(new G4DummyModel(),1);
240  dnaex->SetEmModel(new G4DummyModel(),2);
241  pmanager->AddDiscreteProcess(dnaex);
242 
243  // DNA ionisation is not active in the world
244  G4DNAIonisation* dnaioni = new G4DNAIonisation("proton_G4DNAIonisation");
245  dnaioni->SetEmModel(new G4DummyModel(),1);
246  dnaioni->SetEmModel(new G4DummyModel(),2);
247  pmanager->AddDiscreteProcess(dnaioni);
248 
249  // DNA charge decrease is ACTIVE in the world since
250  // no corresponding STANDARD process exist
251  pmanager->AddDiscreteProcess(
252  new G4DNAChargeDecrease("proton_G4DNAChargeDecrease"));
253 
254  } else if ( particleName == "hydrogen" ) {
255 
256  // DNA processes are ACTIVE in the world since
257  // no corresponding STANDARD processes exist
258  pmanager->AddDiscreteProcess(
259  new G4DNAIonisation("hydrogen_G4DNAIonisation"));
260  pmanager->AddDiscreteProcess(
261  new G4DNAExcitation("hydrogen_G4DNAExcitation"));
262  pmanager->AddDiscreteProcess(
263  new G4DNAChargeIncrease("hydrogen_G4DNAChargeIncrease"));
264 
265  } else if (particleName == "GenericIon")
266  { // THIS IS NEEDED FOR STANDARD ALPHA G4ionIonisation PROCESS
267 
268  // STANDARD msc is active in the world
270  msc->AddEmModel(1, new G4UrbanMscModel());
271  pmanager->AddProcess(msc, -1, 1, -1);
272 
273  // STANDARD ionisation is active in the world
274  G4ionIonisation* hion = new G4ionIonisation();
275  hion->SetEmModel(new G4BraggIonGasModel(),1);
276  hion->SetEmModel(new G4BetheBlochIonGasModel(), 2);
277  pmanager->AddProcess(hion, -1, 2, 2);
278 
279  } else if ( particleName == "alpha" ) {
280 
281  // STANDARD msc is active in the world
283  msc->AddEmModel(1, new G4UrbanMscModel());
284  pmanager->AddProcess(msc, -1, 1, -1);
285 
286  // STANDARD ionisation is active in the world
287  G4ionIonisation* hion = new G4ionIonisation();
288  hion->SetEmModel(new G4BraggIonGasModel(),1);
289  hion->SetEmModel(new G4BetheBlochIonGasModel(), 2);
290  pmanager->AddProcess(hion, -1, 2, 2);
291 
292  // DNA excitation is not active in the world
293  G4DNAExcitation* dnaex = new G4DNAExcitation("alpha_G4DNAExcitation");
294  dnaex->SetEmModel(new G4DummyModel(),1);
295  pmanager->AddDiscreteProcess(dnaex);
296 
297  // DNA ionisation is not active in the world
298  G4DNAIonisation* dnaioni = new G4DNAIonisation("alpha_G4DNAIonisation");
299  dnaioni->SetEmModel(new G4DummyModel(),1);
300  pmanager->AddDiscreteProcess(dnaioni);
301 
302  // DNA charge decrease is ACTIVE in the world since no
303  // corresponding STANDARD process exist
304  pmanager->AddDiscreteProcess(
305  new G4DNAChargeDecrease("alpha_G4DNAChargeDecrease"));
306 
307  } else if ( particleName == "alpha+" ) {
308 
309  // DNA processes are ACTIVE in the world since no
310  // corresponding STANDARD processes exist
311  pmanager->AddDiscreteProcess(
312  new G4DNAExcitation("alpha+_G4DNAExcitation"));
313  pmanager->AddDiscreteProcess(
314  new G4DNAIonisation("alpha+_G4DNAIonisation"));
315  pmanager->AddDiscreteProcess(
316  new G4DNAChargeDecrease("alpha+_G4DNAChargeDecrease"));
317  pmanager->AddDiscreteProcess(
318  new G4DNAChargeIncrease("alpha+_G4DNAChargeIncrease"));
319 
320  } else if ( particleName == "helium" ) {
321 
322  // DNA processes are ACTIVE in the world since no
323  // corresponding STANDARD processes exist
324  pmanager->AddDiscreteProcess(
325  new G4DNAExcitation("helium_G4DNAExcitation"));
326  pmanager->AddDiscreteProcess(
327  new G4DNAIonisation("helium_G4DNAIonisation"));
328  pmanager->AddDiscreteProcess(
329  new G4DNAChargeIncrease("helium_G4DNAChargeIncrease"));
330 
331  }
332  }
333 
334  // **************************************
335  // 2) Define processes for Target region
336  // **************************************
337 
338  // STANDARD EM processes should be inactivated when
339  // corresponding DNA processes are used
340  // - STANDARD EM e- processes are inactivated below 1 MeV
341  // - STANDARD EM proton & alpha processes are inactivated below
342  // standEnergyLimit
343  G4double standEnergyLimit = 9.9*MeV;
344  //
345 
346  G4double massFactor = 1.0079/4.0026;
347  G4EmConfigurator* em_config =
349 
350  G4VEmModel* mod;
351 
352  // *** e-
353 
354  // ---> STANDARD EM processes are inactivated below 1 MeV
355 
356  mod = new G4UrbanMscModel();
358  em_config->SetExtraEmModel("e-","msc",mod,"Target");
359 
360  mod = new G4MollerBhabhaModel();
362  em_config->SetExtraEmModel("e-",
363  "eIoni",
364  mod,
365  "Target",
366  0.0,
367  100*TeV,
368  new G4UniversalFluctuation());
369 
370  // ---> DNA processes activated
371 
372  mod = new G4DNAChampionElasticModel();
373  em_config->SetExtraEmModel("e-","e-_G4DNAElastic",
374  mod,"Target",7.4*eV,1.*MeV);
375 
376  mod = new G4DNABornIonisationModel();
377  em_config->SetExtraEmModel("e-","e-_G4DNAIonisation",
378  mod,"Target",11.*eV,1.*MeV);
379  // Note: valid from 11 eV to 0.999.. MeV then switch to std models at
380  // higher energies ; same for other models
381 
382  mod = new G4DNABornExcitationModel();
383  em_config->SetExtraEmModel("e-","e-_G4DNAExcitation",
384  mod,"Target",9.*eV,1.*MeV);
385 
386  mod = new G4DNAMeltonAttachmentModel();
387  em_config->SetExtraEmModel("e-","e-_G4DNAAttachment",
388  mod,"Target",4.*eV,13.*eV);
389 
390  mod = new G4DNASancheExcitationModel();
391  em_config->SetExtraEmModel("e-","e-_G4DNAVibExcitation",
392  mod,"Target",2.*eV,100.*eV);
393 
394  // *** proton
395 
396  // ---> STANDARD EM processes inactivated below standEnergyLimit
397 
398  // STANDARD msc is still active
399  // Inactivate following STANDARD processes
400 
401  mod = new G4BraggIonGasModel();
402  mod->SetActivationLowEnergyLimit(standEnergyLimit);
403  em_config->SetExtraEmModel("proton","hIoni",
404  mod,"Target",0.0,2*MeV, new G4IonFluctuations());
405 
406  mod = new G4BetheBlochIonGasModel();
407  mod->SetActivationLowEnergyLimit(standEnergyLimit);
408  em_config->SetExtraEmModel("proton","hIoni",
409  mod,"Target",2*MeV,100*TeV,
410  new G4UniversalFluctuation());
411 
412  // ---> DNA processes activated
413 
414  mod = new G4DNARuddIonisationModel();
415  em_config->SetExtraEmModel("proton","proton_G4DNAIonisation",
416  mod,"Target",0.0,0.5*MeV);
417 
418  mod = new G4DNABornIonisationModel();
419  em_config->SetExtraEmModel("proton","proton_G4DNAIonisation",
420  mod,"Target",0.5*MeV,10*MeV);
421 
423  em_config->SetExtraEmModel("proton","proton_G4DNAExcitation",
424  mod,"Target",10*eV,0.5*MeV);
425 
426  mod = new G4DNABornExcitationModel();
427  em_config->SetExtraEmModel("proton","proton_G4DNAExcitation",
428  mod,"Target",0.5*MeV,10*MeV);
429 
430  // *** alpha
431 
432  // ---> STANDARD EM processes inactivated below standEnergyLimit
433 
434  // STANDARD msc is still active
435  // Inactivate following STANDARD processes
436 
437  mod = new G4BraggIonGasModel();
438  mod->SetActivationLowEnergyLimit(standEnergyLimit);
439  em_config->SetExtraEmModel("alpha","ionIoni",
440  mod,"Target",0.0,2*MeV/massFactor,
441  new G4IonFluctuations());
442 
443  mod = new G4BetheBlochIonGasModel();
444  mod->SetActivationLowEnergyLimit(standEnergyLimit);
445  em_config->SetExtraEmModel("alpha","ionIoni",
446  mod,"Target",2*MeV/massFactor,100*TeV,
447  new G4UniversalFluctuation());
448 
449  // ---> DNA processes activated
450 
451  mod = new G4DNARuddIonisationModel();
452  em_config->SetExtraEmModel("alpha","alpha_G4DNAIonisation",
453  mod,"Target",0.0,10*MeV);
454 
456  em_config->SetExtraEmModel("alpha","alpha_G4DNAExcitation",
457  mod,"Target",1*keV,10*MeV);
458 
459 }
460 
461 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
462 
464 { }
465 
466 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
467 
469 {
470  if (verboseLevel >0)
471  {
472  G4cout << "PhysicsList::SetCuts:";
473  G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl;
474  }
475 
476  // set cut values for gamma at first and for e- second and next for e+,
477  // because some processes for e+/e- need cut values for gamma
478  SetCutValue(fCutForGamma, "gamma");
479  SetCutValue(fCutForElectron, "e-");
480  SetCutValue(fCutForPositron, "e+");
481  SetCutValue(fCutForProton, "proton");
482 
483  if (verboseLevel>0) { DumpCutValuesTable(); }
484 }
G4EmConfigurator * EmConfigurator()
static G4Electron * ElectronDefinition()
Definition: G4Electron.cc:89
static G4GenericIon * GenericIonDefinition()
Definition: G4GenericIon.cc:88
void ConstructParticle()
Definition: PhysicsList.cc:117
#define G4DNABornIonisationModel
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)
void SetExtraEmModel(const G4String &particleName, const G4String &processName, G4VEmModel *, const G4String &regionName="", G4double emin=0.0, G4double emax=DBL_MAX, G4VEmFluctuationModel *fm=nullptr)
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
const G4String & GetParticleName() const
G4DNABornExcitationModel1 G4DNABornExcitationModel
static constexpr double TeV
Definition: G4SIunits.hh:218
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 constexpr double eV
Definition: G4SIunits.hh:215
static G4DNAGenericIonsManager * Instance(void)
void SetVerboseLevel(G4int value)
void SetCuts()
Definition: PhysicsList.cc:219
void SetActivationLowEnergyLimit(G4double)
Definition: G4VEmModel.hh:753
static G4Positron * PositronDefinition()
Definition: G4Positron.cc:89
G4ProcessManager * GetProcessManager() const
void SetEmModel(G4VEmModel *, G4int index=1)
void AddEmModel(G4int order, G4VEmModel *, const G4Region *region=nullptr)
std::vector< G4InuclElementaryParticle >::iterator particleIterator
Definition: G4BigBanger.cc:65
G4ParticleTable::G4PTblDicIterator * GetParticleIterator() const
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76
void ConstructProcess()
Definition: PhysicsList.cc:170
static constexpr double keV
Definition: G4SIunits.hh:216
static constexpr double micrometer
Definition: G4SIunits.hh:100
void ConstructGeneral()
Definition: PhysicsList.cc:299
void ConstructEM()
Definition: PhysicsList.cc:130
G4ParticleDefinition * GetIon(const G4String &name)
static G4Gamma * GammaDefinition()
Definition: G4Gamma.cc:81