ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
PhysicsList.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file PhysicsList.cc
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 //
29 
30 #include "PhysicsList.hh"
31 
32 #include "G4UIcmdWithAnInteger.hh"
33 #include "G4SystemOfUnits.hh"
34 
35 // Geant4-DNA MODELS
36 
37 #include "G4DNAElastic.hh"
40 
41 #include "G4DNAExcitation.hh"
44 
45 #include "G4DNAIonisation.hh"
48 
49 #include "G4DNAChargeDecrease.hh"
51 
52 #include "G4DNAChargeIncrease.hh"
54 
55 #include "G4DNAAttachment.hh"
57 
58 #include "G4DNAVibExcitation.hh"
60 
62 
63 //
64 
65 #include "G4LossTableManager.hh"
66 #include "G4EmConfigurator.hh"
67 #include "G4VEmModel.hh"
68 #include "G4DummyModel.hh"
69 #include "G4eIonisation.hh"
70 #include "G4hIonisation.hh"
71 #include "G4ionIonisation.hh"
72 #include "G4eMultipleScattering.hh"
73 #include "G4hMultipleScattering.hh"
74 #include "G4BraggIonGasModel.hh"
76 #include "G4UrbanMscModel.hh"
77 #include "G4MollerBhabhaModel.hh"
78 #include "G4IonFluctuations.hh"
80 
81 #include "G4ElectronCapture.hh"
82 
83 #include "SplitProcess.hh"
84 
85 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
86 
89 
90 {
91 
92  fpNumberOfSplit = new G4UIcmdWithAnInteger("/vrt/numberOfSplit", this);
93  fpNumberOfSplit->SetGuidance("Number of split for particle splitting");
94  fpNumberOfSplit->SetParameterName("NumberOfSplit",false);
96 
102 
103  SetVerboseLevel(1);
104 
105 // fNumberOfSplit = 1;
106 
107 }
108 
109 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
110 
112 {}
113 
114 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
116  G4String newValue) {
117  if ( command == fpNumberOfSplit )
119 }
120 
121 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
122 
124 {
125  ConstructBosons();
128 }
129 
130 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
131 
133 {
134  // gamma
136 }
137 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
138 
140 {
141  // leptons
144 }
145 
146 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
147 
148 //DNA
150 //ENDDNA
151 
153 {
154  // baryons
157 
158  // Geant4 DNA new particles
159  G4DNAGenericIonsManager * genericIonsManager;
160  genericIonsManager=G4DNAGenericIonsManager::Instance();
161  genericIonsManager->GetIon("alpha++");
162  genericIonsManager->GetIon("alpha+");
163  genericIonsManager->GetIon("helium");
164  genericIonsManager->GetIon("hydrogen");
165 }
166 
167 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
168 
170 {
172  ConstructEM();
174 }
175 
176 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
177 
179 {
180 
182  particleIterator->reset();
183  G4bool splitProcessActive = false;
184  // Only if particle split is larger than 1, VRT is set
185  if ( fNumberOfSplit > 1 )
186  splitProcessActive = true;
187 
188  while( (*particleIterator)() )
189  {
190 
192  G4ProcessManager* pmanager = particle->GetProcessManager();
193  G4String particleName = particle->GetParticleName();
194 
195  // *********************************
196  // 1) Processes for the World region
197  // *********************************
198 
199  if (particleName == "e-") {
200 
201  // STANDARD msc is active in the world
203  msc->AddEmModel(1,new G4UrbanMscModel());
204  pmanager->AddProcess(msc, -1, 1, -1);
205 
206  // STANDARD ionisation is active in the world
207  G4eIonisation* eion = new G4eIonisation();
208  eion->SetEmModel(new G4MollerBhabhaModel(), 1);
209  pmanager->AddProcess(eion, -1, 2, 2);
210 
211  // DNA elastic is not active in the world
212  G4DNAElastic* theDNAElasticProcess = new G4DNAElastic("e-_G4DNAElastic");
213  theDNAElasticProcess->SetEmModel(new G4DummyModel(),1);
214  pmanager->AddDiscreteProcess(theDNAElasticProcess);
215 
216  // DNA excitation is not active in the world
217  G4DNAExcitation* dnaex = new G4DNAExcitation("e-_G4DNAExcitation");
218  dnaex->SetEmModel(new G4DummyModel(),1);
219  pmanager->AddDiscreteProcess(dnaex);
220 
221  // DNA ionisation is not active in the world
222  G4DNAIonisation* dnaioni = new G4DNAIonisation("e-_G4DNAIonisation");
223  dnaioni->SetEmModel(new G4DummyModel(),1);
224 
225  // Variance reduction is set here
226  if (splitProcessActive) {
227  G4String splitRegion = "Target";
228  G4cout << "- Split for e-e created in e-_G4DNAIonisation process activated"
229  << "with split number " << fNumberOfSplit << " in region "
230  << splitRegion << "-- " << G4endl;
231  SplitProcess* splitProcess = new SplitProcess(splitRegion, fNumberOfSplit);
232  splitProcess->RegisterProcess(dnaioni);
233 
234  pmanager->AddDiscreteProcess(splitProcess);
235 
236  } else {
237  pmanager->AddDiscreteProcess(dnaioni);
238  }
239 
240  // DNA attachment is not active in the world
241  G4DNAAttachment* dnaatt = new G4DNAAttachment("e-_G4DNAAttachment");
242  dnaatt->SetEmModel(new G4DummyModel(),1);
243  pmanager->AddDiscreteProcess(dnaatt);
244 
245  // DNA vib. excitation is not active in the world
246  G4DNAVibExcitation* dnavib =
247  new G4DNAVibExcitation("e-_G4DNAVibExcitation");
248  dnavib->SetEmModel(new G4DummyModel(),1);
249  pmanager->AddDiscreteProcess(dnavib);
250 
251  // THE FOLLOWING PROCESS WILL KILL ALL ELECTRONS BELOW A
252  // SELECTED ENERY THRESHOLD
253  // Capture of low-energy e-
254  G4ElectronCapture* ecap = new G4ElectronCapture("Target", 7.4*eV);
255  pmanager->AddDiscreteProcess(ecap);
256  // 7.4 eV is compatible with the validity range of the Champion's model
257 
258  } else if ( particleName == "proton" ) {
259 
260  // STANDARD msc is active in the world
262  msc->AddEmModel(1,new G4UrbanMscModel());
263  pmanager->AddProcess(msc, -1, 1, -1);
264 
265  // STANDARD ionisation is active in the world
266  G4hIonisation* hion = new G4hIonisation();
267  hion->SetEmModel(new G4BraggIonGasModel(), 1);
268  hion->SetEmModel(new G4BetheBlochIonGasModel(), 2);
269  pmanager->AddProcess(hion, -1, 2, 2);
270 
271  // DNA excitation is not active in the world
272  G4DNAExcitation* dnaex = new G4DNAExcitation("proton_G4DNAExcitation");
273  dnaex->SetEmModel(new G4DummyModel(),1);
274  dnaex->SetEmModel(new G4DummyModel(),2);
275  pmanager->AddDiscreteProcess(dnaex);
276 
277  // DNA ionisation is not active in the world
278  G4DNAIonisation* dnaioni = new G4DNAIonisation("proton_G4DNAIonisation");
279  dnaioni->SetEmModel(new G4DummyModel(),1);
280  dnaioni->SetEmModel(new G4DummyModel(),2);
281  pmanager->AddDiscreteProcess(dnaioni);
282 
283  // DNA charge decrease is ACTIVE in the world since
284  // no corresponding STANDARD process exist
285  pmanager->AddDiscreteProcess(
286  new G4DNAChargeDecrease("proton_G4DNAChargeDecrease"));
287 
288  } else if ( particleName == "hydrogen" ) {
289 
290  // DNA processes are ACTIVE in the world since
291  // no corresponding STANDARD processes exist
292  pmanager->AddDiscreteProcess(
293  new G4DNAIonisation("hydrogen_G4DNAIonisation"));
294  pmanager->AddDiscreteProcess(
295  new G4DNAExcitation("hydrogen_G4DNAExcitation"));
296  pmanager->AddDiscreteProcess(
297  new G4DNAChargeIncrease("hydrogen_G4DNAChargeIncrease"));
298 
299  } else if (particleName == "GenericIon") {
300 
301  // THIS IS NEEDED FOR STANDARD ALPHA G4ionIonisation PROCESS
302 
303  // STANDARD msc is active in the world
305  msc->AddEmModel(1, new G4UrbanMscModel());
306  pmanager->AddProcess(msc, -1, 1, -1);
307 
308  // STANDARD ionisation is active in the world
309  G4ionIonisation* hion = new G4ionIonisation();
310  hion->SetEmModel(new G4BraggIonGasModel(),1);
311  hion->SetEmModel(new G4BetheBlochIonGasModel(), 2);
312  pmanager->AddProcess(hion, -1, 2, 2);
313 
314  } else if ( particleName == "alpha" ) {
315 
316  // STANDARD msc is active in the world
318  msc->AddEmModel(1, new G4UrbanMscModel());
319  pmanager->AddProcess(msc, -1, 1, -1);
320 
321  // STANDARD ionisation is active in the world
322  G4ionIonisation* hion = new G4ionIonisation();
323  hion->SetEmModel(new G4BraggIonGasModel(),1);
324  hion->SetEmModel(new G4BetheBlochIonGasModel(), 2);
325  pmanager->AddProcess(hion, -1, 2, 2);
326 
327  // DNA excitation is not active in the world
328  G4DNAExcitation* dnaex = new G4DNAExcitation("alpha_G4DNAExcitation");
329  dnaex->SetEmModel(new G4DummyModel(),1);
330  pmanager->AddDiscreteProcess(dnaex);
331 
332  // DNA ionisation is not active in the world
333  G4DNAIonisation* dnaioni = new G4DNAIonisation("alpha_G4DNAIonisation");
334  dnaioni->SetEmModel(new G4DummyModel(),1);
335  pmanager->AddDiscreteProcess(dnaioni);
336 
337  // DNA charge decrease is ACTIVE in the world since no
338  // corresponding STANDARD process exist
339  pmanager->AddDiscreteProcess(
340  new G4DNAChargeDecrease("alpha_G4DNAChargeDecrease"));
341 
342  } else if ( particleName == "alpha+" ) {
343 
344  // DNA processes are ACTIVE in the world since no
345  // corresponding STANDARD processes exist
346  pmanager->AddDiscreteProcess(
347  new G4DNAExcitation("alpha+_G4DNAExcitation"));
348  pmanager->AddDiscreteProcess(
349  new G4DNAIonisation("alpha+_G4DNAIonisation"));
350  pmanager->AddDiscreteProcess(
351  new G4DNAChargeDecrease("alpha+_G4DNAChargeDecrease"));
352  pmanager->AddDiscreteProcess(
353  new G4DNAChargeIncrease("alpha+_G4DNAChargeIncrease"));
354 
355  } else if ( particleName == "helium" ) {
356 
357  // DNA processes are ACTIVE in the world since no
358  // corresponding STANDARD processes exist
359  pmanager->AddDiscreteProcess(
360  new G4DNAExcitation("helium_G4DNAExcitation"));
361  pmanager->AddDiscreteProcess(
362  new G4DNAIonisation("helium_G4DNAIonisation"));
363  pmanager->AddDiscreteProcess(
364  new G4DNAChargeIncrease("helium_G4DNAChargeIncrease"));
365 
366  }
367  }
368 
369  // **************************************
370  // 2) Define processes for Target region
371  // **************************************
372 
373  // STANDARD EM processes should be inactivated when
374  // corresponding DNA processes are used
375  // - STANDARD EM e- processes are inactivated below 1 MeV
376  // - STANDARD EM proton & alpha processes are inactivated below
377  // standEnergyLimit
378  G4double standEnergyLimit = 9.9*MeV;
379  //
380 
381  G4double massFactor = 1.0079/4.0026;
384 
385  G4VEmModel* mod;
386 
387  // *** e-
388 
389  // ---> STANDARD EM processes are inactivated below 1 MeV
390 
391  mod = new G4UrbanMscModel();
393  em_config->SetExtraEmModel("e-","msc",mod,"Target");
394 
395  mod = new G4MollerBhabhaModel();
397  em_config->SetExtraEmModel("e-",
398  "eIoni",
399  mod,
400  "Target",
401  0.0,
402  100*TeV,
403  new G4UniversalFluctuation());
404 
405  // ---> DNA processes activated
406 
407  mod = new G4DNAChampionElasticModel();
408  em_config->SetExtraEmModel("e-","e-_G4DNAElastic",
409  mod,"Target",7.4*eV,1.*MeV);
410 
411  mod = new G4DNABornIonisationModel();
412  em_config->SetExtraEmModel("e-","e-_G4DNAIonisation",
413  mod,"Target",11.*eV,1.*MeV);
414  // Note: valid from 11 eV to 0.999.. MeV then switch to std models at
415  // higher energies ; same for other models
416 
417  mod = new G4DNABornExcitationModel();
418  em_config->SetExtraEmModel("e-","e-_G4DNAExcitation",
419  mod,"Target",9.*eV,1.*MeV);
420 
421  mod = new G4DNAMeltonAttachmentModel();
422  em_config->SetExtraEmModel("e-","e-_G4DNAAttachment",
423  mod,"Target",4.*eV,13.*eV);
424 
425  mod = new G4DNASancheExcitationModel();
426  em_config->SetExtraEmModel("e-","e-_G4DNAVibExcitation",
427  mod,"Target",2.*eV,100.*eV);
428 
429  // *** proton
430 
431  // ---> STANDARD EM processes inactivated below standEnergyLimit
432 
433  // STANDARD msc is still active
434  // Inactivate following STANDARD processes
435 
436  mod = new G4BraggIonGasModel();
437  mod->SetActivationLowEnergyLimit(standEnergyLimit);
438  em_config->SetExtraEmModel("proton","hIoni",
439  mod,"Target",0.0,2*MeV, new G4IonFluctuations());
440 
441  mod = new G4BetheBlochIonGasModel();
442  mod->SetActivationLowEnergyLimit(standEnergyLimit);
443  em_config->SetExtraEmModel("proton","hIoni",
444  mod,"Target",2*MeV,100*TeV,
445  new G4UniversalFluctuation());
446 
447  // ---> DNA processes activated
448 
449  mod = new G4DNARuddIonisationModel();
450  em_config->SetExtraEmModel("proton","proton_G4DNAIonisation",
451  mod,"Target",0.0,0.5*MeV);
452 
453  mod = new G4DNABornIonisationModel();
454  em_config->SetExtraEmModel("proton","proton_G4DNAIonisation",
455  mod,"Target",0.5*MeV,10*MeV);
456 
458  em_config->SetExtraEmModel("proton","proton_G4DNAExcitation",
459  mod,"Target",10*eV,0.5*MeV);
460 
461  mod = new G4DNABornExcitationModel();
462  em_config->SetExtraEmModel("proton","proton_G4DNAExcitation",
463  mod,"Target",0.5*MeV,10*MeV);
464 
465  // *** alpha
466 
467  // ---> STANDARD EM processes inactivated below standEnergyLimit
468 
469  // STANDARD msc is still active
470  // Inactivate following STANDARD processes
471 
472  mod = new G4BraggIonGasModel();
473  mod->SetActivationLowEnergyLimit(standEnergyLimit);
474  em_config->SetExtraEmModel("alpha","ionIoni",
475  mod,"Target",0.0,2*MeV/massFactor,
476  new G4IonFluctuations());
477 
478  mod = new G4BetheBlochIonGasModel();
479  mod->SetActivationLowEnergyLimit(standEnergyLimit);
480  em_config->SetExtraEmModel("alpha","ionIoni",
481  mod,"Target",2*MeV/massFactor,100*TeV,
482  new G4UniversalFluctuation());
483 
484  // ---> DNA processes activated
485 
486  mod = new G4DNARuddIonisationModel();
487  em_config->SetExtraEmModel("alpha","alpha_G4DNAIonisation",
488  mod,"Target",0.0,10*MeV);
489 
491  em_config->SetExtraEmModel("alpha","alpha_G4DNAExcitation",
492  mod,"Target",1*keV,10*MeV);
493 
494 }
495 
496 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
497 
499 { }
500 
501 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
502 
504 {
505  if (verboseLevel >0)
506  {
507  G4cout << "PhysicsList::SetCuts:";
508  G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl;
509  }
510 
511  // set cut values for gamma at first and for e- second and next for e+,
512  // because some processes for e+/e- need cut values for gamma
513  SetCutValue(fCutForGamma, "gamma");
516  SetCutValue(fCutForProton, "proton");
517 
518  if (verboseLevel>0) { DumpCutValuesTable(); }
519 }
520 
522  fNumberOfSplit = nb;
523 }
524 
526  return fNumberOfSplit;
527 }
528