ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DMXPhysicsList.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file DMXPhysicsList.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 //
27 // --------------------------------------------------------------
28 // GEANT 4 - Underground Dark Matter Detector Advanced Example
29 //
30 // For information related to this code contact: Alex Howard
31 // e-mail: alexander.howard@cern.ch
32 // --------------------------------------------------------------
33 // Comments
34 //
35 // Underground Advanced
36 // by A. Howard and H. Araujo
37 // (27th November 2001)
38 //
39 // PhysicsList program
40 //
41 // Modified:
42 //
43 // 14-02-03 Fix bugs in msc and hIon instanciation + cut per region
44 //
45 // 05-02-05 AH - changes to G4Decay - added is not short lived protection
46 // and redefined particles to allow non-static creation
47 // i.e. changed construction to G4MesonConstructor, G4BaryonConstructor
48 //
49 // 23-10-09 LP - migrated EM physics from the LowEnergy processes (not supported) to
50 // the new G4Livermore model implementation. Results unchanged.
51 //
52 // --------------------------------------------------------------
53 
54 #include <iomanip>
55 
56 #include "DMXPhysicsList.hh"
57 
58 #include "globals.hh"
59 #include "G4SystemOfUnits.hh"
60 #include "G4ProcessManager.hh"
61 #include "G4ProcessVector.hh"
62 
63 #include "G4ParticleDefinition.hh"
64 #include "G4ParticleWithCuts.hh"
65 #include "G4ParticleTypes.hh"
66 #include "G4ParticleTable.hh"
67 
68 #include "G4ios.hh"
69 #include "G4UserLimits.hh"
70 
71 #include "G4MesonConstructor.hh"
72 #include "G4BaryonConstructor.hh"
73 #include "G4IonConstructor.hh"
75 
76 #include "DMXMaxTimeCuts.hh"
77 #include "DMXMinEkineCuts.hh"
78 #include "G4StepLimiter.hh"
79 
80 // gamma
81 #include "G4PhotoElectricEffect.hh"
83 
84 #include "G4ComptonScattering.hh"
86 
87 #include "G4GammaConversion.hh"
88 #include "G4BetheHeitler5DModel.hh"
89 
90 #include "G4RayleighScattering.hh"
92 
93 // e-
94 #include "G4eMultipleScattering.hh"
95 
96 #include "G4eIonisation.hh"
98 
99 #include "G4eBremsstrahlung.hh"
100 #include "G4UniversalFluctuation.hh"
101 
102 // e+
103 #include "G4eIonisation.hh"
104 #include "G4eBremsstrahlung.hh"
105 #include "G4eplusAnnihilation.hh"
106 
107 // alpha and GenericIon and deuterons, triton, He3:
108 //muon:
109 #include "G4MuIonisation.hh"
110 #include "G4MuBremsstrahlung.hh"
111 #include "G4MuPairProduction.hh"
112 #include "G4MuMultipleScattering.hh"
113 #include "G4MuonMinusCapture.hh"
114 
115 //OTHERS:
116 #include "G4hIonisation.hh"
117 #include "G4hMultipleScattering.hh"
118 #include "G4hBremsstrahlung.hh"
119 #include "G4ionIonisation.hh"
121 
122 //em process options to allow msc step-limitation to be switched off
123 #include "G4EmParameters.hh"
124 #include "G4VAtomDeexcitation.hh"
125 #include "G4UAtomicDeexcitation.hh"
126 #include "G4LossTableManager.hh"
127 
128 #include "G4Scintillation.hh"
129 #include "G4OpAbsorption.hh"
130 #include "G4OpBoundaryProcess.hh"
131 
132 // Elastic processes:
133 #include "G4HadronElasticProcess.hh"
134 #include "G4ChipsElasticModel.hh"
135 #include "G4ElasticHadrNucleusHE.hh"
136 
137 // Inelastic processes:
151 
152 // High energy FTFP model and Bertini cascade
153 #include "G4FTFModel.hh"
155 #include "G4ExcitedStringDecay.hh"
156 #include "G4PreCompoundModel.hh"
158 #include "G4TheoFSGenerator.hh"
159 #include "G4CascadeInterface.hh"
160 
161 // Cross sections
162 #include "G4VCrossSectionDataSet.hh"
164 
165 #include "G4CrossSectionElastic.hh"
167 #include "G4BGGPionElasticXS.hh"
168 #include "G4BGGPionInelasticXS.hh"
169 #include "G4AntiNuclElastic.hh"
170 
172 #include "G4CrossSectionPairGG.hh"
174 #include "G4BGGNucleonElasticXS.hh"
175 #include "G4NeutronInelasticXS.hh"
176 #include "G4NeutronElasticXS.hh"
180 
181 #include "G4HadronElastic.hh"
182 #include "G4HadronCaptureProcess.hh"
183 
184 // Neutron high-precision models: <20 MeV
185 #include "G4ParticleHPElastic.hh"
187 #include "G4ParticleHPCapture.hh"
189 #include "G4ParticleHPInelastic.hh"
191 
192 // Stopping processes
196 #include "G4HadronicParameters.hh"
197 
198 #include "G4Decay.hh"
199 #include "G4RadioactiveDecayBase.hh"
200 #include "G4PhysicsListHelper.hh"
201 #include "G4NuclideTable.hh"
202 #include "G4NuclearLevelData.hh"
203 
204 // Constructor /////////////////////////////////////////////////////////////
206 {
207 
208  defaultCutValue = 1.0*micrometer; //
212 
213  VerboseLevel = 1;
214  OpVerbLevel = 0;
215 
216  //set a finer grid of the physic tables in order to improve precision
217  //former LowEnergy models have 200 bins up to 100 GeV
219  param->SetMaxEnergy(100*GeV);
220  param->SetNumberOfBinsPerDecade(20);
222  param->SetFluo(true);
223  param->SetPixe(true);
224  param->SetAuger(true);
225 
226  G4EmParameters::Instance()->AddPhysics("World","G4RadioactiveDecay");
228  deex->SetStoreICLevelData(true);
229  deex->SetMaxLifeTime(G4NuclideTable::GetInstance()->GetThresholdOfHalfLife()
230  /std::log(2.));
232 }
233 
234 // Destructor //////////////////////////////////////////////////////////////
236 {;}
237 
238 // Construct Particles /////////////////////////////////////////////////////
240 {
241  // In this method, static member functions should be called
242  // for all particles which you want to use.
243  // This ensures that objects of these particle types will be
244  // created in the program.
245 
250 }
251 
252 // construct Bosons://///////////////////////////////////////////////////
254 {
255  // pseudo-particles
258 
259  // gamma
261 
262  //OpticalPhotons
264 
265 }
266 
267 // construct Leptons://///////////////////////////////////////////////////
269 {
270  // leptons
275 
280 }
281 
282 // construct Hadrons://///////////////////////////////////////////////////
284 {
285  // mesons
286  G4MesonConstructor mConstructor;
287  mConstructor.ConstructParticle();
288 
289  // baryons
290  G4BaryonConstructor bConstructor;
291  bConstructor.ConstructParticle();
292 
293  // ions
294  G4IonConstructor iConstructor;
295  iConstructor.ConstructParticle();
296 }
297 
298 // construct Shortliveds://///////////////////////////////////////////////////
300 {
301  G4ShortLivedConstructor slConstructor;
302  slConstructor.ConstructParticle();
303 }
304 
305 // Construct Processes //////////////////////////////////////////////////////
307 {
309 
310  ConstructEM();
311 
312  ConstructOp();
313 
314  ConstructHad();
315 
317 }
318 
319 // Transportation ///////////////////////////////////////////////////////////
321 
323 
325  particleIterator->reset();
326  while( (*particleIterator)() ){
328  G4ProcessManager* pmanager = particle->GetProcessManager();
329  G4String particleName = particle->GetParticleName();
330  // time cuts for ONLY neutrons:
331  if(particleName == "neutron")
332  pmanager->AddDiscreteProcess(new DMXMaxTimeCuts());
333  // Energy cuts to kill charged (embedded in method) particles:
334  pmanager->AddDiscreteProcess(new DMXMinEkineCuts());
335 
336  // Step limit applied to all particles:
337  pmanager->AddDiscreteProcess(new G4StepLimiter);
338  }
339 }
340 
341 // Electromagnetic Processes ////////////////////////////////////////////////
342 // all charged particles
344 
347 
349  particleIterator->reset();
350  while( (*particleIterator)() ){
352  G4ProcessManager* pmanager = particle->GetProcessManager();
353  G4String particleName = particle->GetParticleName();
354  G4String particleType = particle->GetParticleType();
355  G4double charge = particle->GetPDGCharge();
356 
357  if (particleName == "gamma")
358  {
359  //gamma
360  G4RayleighScattering* theRayleigh = new G4RayleighScattering();
361  pmanager->AddDiscreteProcess(theRayleigh);
362 
363  G4PhotoElectricEffect* thePhotoElectricEffect = new G4PhotoElectricEffect();
364  thePhotoElectricEffect->SetEmModel(new G4LivermorePhotoElectricModel());
365  pmanager->AddDiscreteProcess(thePhotoElectricEffect);
366 
367  G4ComptonScattering* theComptonScattering = new G4ComptonScattering();
368  theComptonScattering->SetEmModel(new G4LivermoreComptonModel());
369  pmanager->AddDiscreteProcess(theComptonScattering);
370 
371  G4GammaConversion* theGammaConversion = new G4GammaConversion();
372  theGammaConversion->SetEmModel(new G4BetheHeitler5DModel());
373  pmanager->AddDiscreteProcess(theGammaConversion);
374 
375  }
376  else if (particleName == "e-")
377  {
378  //electron
379  // process ordering: AddProcess(name, at rest, along step, post step)
380  // Multiple scattering
383  pmanager->AddProcess(msc,-1, 1, -1);
384 
385  // Ionisation
386  G4eIonisation* eIonisation = new G4eIonisation();
387  G4VEmModel* theIoniLiv = new G4LivermoreIonisationModel();
388  theIoniLiv->SetHighEnergyLimit(0.1*MeV);
389  eIonisation->AddEmModel(0, theIoniLiv, new G4UniversalFluctuation() );
390  eIonisation->SetStepFunction(0.2, 100*um); //improved precision in tracking
391  pmanager->AddProcess(eIonisation,-1, 2, 2);
392 
393  // Bremsstrahlung
394  G4eBremsstrahlung* eBremsstrahlung = new G4eBremsstrahlung();
395  pmanager->AddProcess(eBremsstrahlung, -1,-3, 3);
396  }
397  else if (particleName == "e+")
398  {
399  //positron
402  pmanager->AddProcess(msc,-1, 1, 1);
403 
404  // Ionisation
405  G4eIonisation* eIonisation = new G4eIonisation();
406  eIonisation->SetStepFunction(0.2, 100*um); //
407  pmanager->AddProcess(eIonisation, -1, 2, 2);
408 
409  //Bremsstrahlung (use default, no low-energy available)
410  pmanager->AddProcess(new G4eBremsstrahlung(), -1,-1, 3);
411 
412  //Annihilation
413  pmanager->AddProcess(new G4eplusAnnihilation(),0,-1, 4);
414  }
415  else if( particleName == "mu+" ||
416  particleName == "mu-" )
417  {
418  //muon
419  pmanager->AddProcess(new G4MuMultipleScattering, -1, 1,-1);
420  pmanager->AddProcess(new G4MuIonisation(), -1, 2, 1);
421  pmanager->AddProcess(new G4MuBremsstrahlung(), -1,-1, 2);
422  pmanager->AddProcess(new G4MuPairProduction(), -1,-1, 3);
423  if( particleName == "mu-" )
424  pmanager->AddProcess(new G4MuonMinusCapture(), 0,-1,-1);
425  }
426  else if (particleName == "proton" ||
427  particleName == "pi+" ||
428  particleName == "pi-")
429  {
430  //multiple scattering
431  pmanager->AddProcess(new G4hMultipleScattering, -1, 1, -1);
432 
433  //ionisation
434  G4hIonisation* hIonisation = new G4hIonisation();
435  hIonisation->SetStepFunction(0.2, 50*um);
436  pmanager->AddProcess(hIonisation, -1, 2, 1);
437 
438  //bremmstrahlung
439  pmanager->AddProcess(new G4hBremsstrahlung, -1,-3, 2);
440  }
441  else if(particleName == "alpha" ||
442  particleName == "deuteron" ||
443  particleName == "triton" ||
444  particleName == "He3")
445  {
446  //multiple scattering
447  pmanager->AddProcess(new G4hMultipleScattering,-1,1,-1);
448 
449  //ionisation
450  G4ionIonisation* ionIoni = new G4ionIonisation();
451  ionIoni->SetStepFunction(0.1, 20*um);
452  pmanager->AddProcess(ionIoni, -1, 2,-2);
453  }
454  else if (particleName == "GenericIon")
455  {
456  // OBJECT may be dynamically created as either a GenericIon or nucleus
457  // G4Nucleus exists and therefore has particle type nucleus
458  // genericIon:
459 
460  //multiple scattering
461  pmanager->AddProcess(new G4hMultipleScattering,-1,1,-1);
462 
463  //ionisation
464  G4ionIonisation* ionIoni = new G4ionIonisation();
465  ionIoni->SetEmModel(new G4IonParametrisedLossModel());
466  ionIoni->SetStepFunction(0.1, 20*um);
467  pmanager->AddProcess(ionIoni, -1, 2, 1);
468  }
469 
470  else if ((!particle->IsShortLived()) &&
471  (charge != 0.0) &&
472  (particle->GetParticleName() != "chargedgeantino"))
473  {
474  //all others charged particles except geantino
475  G4hMultipleScattering* aMultipleScattering = new G4hMultipleScattering();
476  G4hIonisation* ahadronIon = new G4hIonisation();
477 
478  //multiple scattering
479  pmanager->AddProcess(aMultipleScattering,-1,1,-1);
480 
481  //ionisation
482  pmanager->AddProcess(ahadronIon, -1,2,1);
483  }
484  }
485 }
486 
487 // Optical Processes ////////////////////////////////////////////////////////
489 {
490  // default scintillation process
491  G4Scintillation* theScintProcessDef = new G4Scintillation("Scintillation");
492  // theScintProcessDef->DumpPhysicsTable();
493  theScintProcessDef->SetTrackSecondariesFirst(true);
494  theScintProcessDef->SetScintillationYieldFactor(1.0); //
495  theScintProcessDef->SetScintillationExcitationRatio(0.0); //
496  theScintProcessDef->SetVerboseLevel(OpVerbLevel);
497 
498  // scintillation process for alpha:
499  G4Scintillation* theScintProcessAlpha = new G4Scintillation("Scintillation");
500  // theScintProcessNuc->DumpPhysicsTable();
501  theScintProcessAlpha->SetTrackSecondariesFirst(true);
502  theScintProcessAlpha->SetScintillationYieldFactor(1.1);
503  theScintProcessAlpha->SetScintillationExcitationRatio(1.0);
504  theScintProcessAlpha->SetVerboseLevel(OpVerbLevel);
505 
506  // scintillation process for heavy nuclei
507  G4Scintillation* theScintProcessNuc = new G4Scintillation("Scintillation");
508  // theScintProcessNuc->DumpPhysicsTable();
509  theScintProcessNuc->SetTrackSecondariesFirst(true);
510  theScintProcessNuc->SetScintillationYieldFactor(0.2);
511  theScintProcessNuc->SetScintillationExcitationRatio(1.0);
512  theScintProcessNuc->SetVerboseLevel(OpVerbLevel);
513 
514  // optical processes
515  G4OpAbsorption* theAbsorptionProcess = new G4OpAbsorption();
516  // G4OpRayleigh* theRayleighScatteringProcess = new G4OpRayleigh();
517  G4OpBoundaryProcess* theBoundaryProcess = new G4OpBoundaryProcess();
518  // theAbsorptionProcess->DumpPhysicsTable();
519  // theRayleighScatteringProcess->DumpPhysicsTable();
520  theAbsorptionProcess->SetVerboseLevel(OpVerbLevel);
521  // theRayleighScatteringProcess->SetVerboseLevel(OpVerbLevel);
522  theBoundaryProcess->SetVerboseLevel(OpVerbLevel);
523 
525  particleIterator->reset();
526  while( (*particleIterator)() )
527  {
529  G4ProcessManager* pmanager = particle->GetProcessManager();
530  G4String particleName = particle->GetParticleName();
531  if (theScintProcessDef->IsApplicable(*particle)) {
532  // if(particle->GetPDGMass() > 5.0*GeV)
533  if(particle->GetParticleName() == "GenericIon") {
534  pmanager->AddProcess(theScintProcessNuc); // AtRestDiscrete
535  pmanager->SetProcessOrderingToLast(theScintProcessNuc,idxAtRest);
536  pmanager->SetProcessOrderingToLast(theScintProcessNuc,idxPostStep);
537  }
538  else if(particle->GetParticleName() == "alpha") {
539  pmanager->AddProcess(theScintProcessAlpha);
540  pmanager->SetProcessOrderingToLast(theScintProcessAlpha,idxAtRest);
541  pmanager->SetProcessOrderingToLast(theScintProcessAlpha,idxPostStep);
542  }
543  else {
544  pmanager->AddProcess(theScintProcessDef);
545  pmanager->SetProcessOrderingToLast(theScintProcessDef,idxAtRest);
546  pmanager->SetProcessOrderingToLast(theScintProcessDef,idxPostStep);
547  }
548  }
549 
550  if (particleName == "opticalphoton") {
551  pmanager->AddDiscreteProcess(theAbsorptionProcess);
552  // pmanager->AddDiscreteProcess(theRayleighScatteringProcess);
553  pmanager->AddDiscreteProcess(theBoundaryProcess);
554  }
555  }
556 }
557 
558 // Hadronic processes ////////////////////////////////////////////////////////
559 
561 {
562  //Elastic models
563  G4HadronElastic* elastic_lhep0 = new G4HadronElastic();
564  G4ChipsElasticModel* elastic_chip = new G4ChipsElasticModel();
565  G4ElasticHadrNucleusHE* elastic_he = new G4ElasticHadrNucleusHE();
566 
567  // Inelastic scattering
568  const G4double theFTFMin0 = 0.0*GeV;
569  const G4double theFTFMin1 = 3.0*GeV;
571  const G4double theBERTMin0 = 0.0*GeV;
572  const G4double theBERTMin1 = 19.0*MeV;
573  const G4double theBERTMax = 6.0*GeV;
574  const G4double theHPMin = 0.0*GeV;
575  const G4double theHPMax = 20.0*MeV;
576 
577  G4FTFModel * theStringModel = new G4FTFModel;
579  theStringModel->SetFragmentationModel( theStringDecay );
580  G4PreCompoundModel * thePreEquilib = new G4PreCompoundModel( new G4ExcitationHandler );
581  G4GeneratorPrecompoundInterface * theCascade = new G4GeneratorPrecompoundInterface( thePreEquilib );
582 
583  G4TheoFSGenerator * theFTFModel0 = new G4TheoFSGenerator( "FTFP" );
584  theFTFModel0->SetHighEnergyGenerator( theStringModel );
585  theFTFModel0->SetTransport( theCascade );
586  theFTFModel0->SetMinEnergy( theFTFMin0 );
587  theFTFModel0->SetMaxEnergy( theFTFMax );
588 
589  G4TheoFSGenerator * theFTFModel1 = new G4TheoFSGenerator( "FTFP" );
590  theFTFModel1->SetHighEnergyGenerator( theStringModel );
591  theFTFModel1->SetTransport( theCascade );
592  theFTFModel1->SetMinEnergy( theFTFMin1 );
593  theFTFModel1->SetMaxEnergy( theFTFMax );
594 
595  G4CascadeInterface * theBERTModel0 = new G4CascadeInterface;
596  theBERTModel0->SetMinEnergy( theBERTMin0 );
597  theBERTModel0->SetMaxEnergy( theBERTMax );
598 
599  G4CascadeInterface * theBERTModel1 = new G4CascadeInterface;
600  theBERTModel1->SetMinEnergy( theBERTMin1 );
601  theBERTModel1->SetMaxEnergy( theBERTMax );
602 
604  G4ComponentGGNuclNuclXsc * ggNuclNuclXsec = new G4ComponentGGNuclNuclXsc();
605  G4VCrossSectionDataSet * theGGNuclNuclData = new G4CrossSectionInelastic(ggNuclNuclXsec);
606  G4VCrossSectionDataSet * theGGNNEl = new G4CrossSectionElastic(ggNuclNuclXsec);
608  G4VCrossSectionDataSet * theGGHNEl = new G4CrossSectionElastic(ggHNXsec);
609  G4VCrossSectionDataSet * theGGHNInel = new G4CrossSectionInelastic(ggHNXsec);
610 
612  particleIterator->reset();
613  while ((*particleIterator)())
614  {
616  G4ProcessManager* pmanager = particle->GetProcessManager();
617  G4String particleName = particle->GetParticleName();
618 
619  if (particleName == "pi+")
620  {
621  // Elastic scattering
622  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
623  theElasticProcess->AddDataSet( new G4BGGPionElasticXS( particle ) );
624  theElasticProcess->RegisterMe( elastic_he );
625  pmanager->AddDiscreteProcess( theElasticProcess );
626  //Inelastic scattering
627  G4PionPlusInelasticProcess* theInelasticProcess =
628  new G4PionPlusInelasticProcess("inelastic");
629  theInelasticProcess->AddDataSet( new G4BGGPionElasticXS( particle ) );
630  theInelasticProcess->RegisterMe( theFTFModel1 );
631  theInelasticProcess->RegisterMe( theBERTModel0 );
632  pmanager->AddDiscreteProcess( theInelasticProcess );
633  }
634 
635  else if (particleName == "pi-")
636  {
637  // Elastic scattering
638  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
639  theElasticProcess->AddDataSet( new G4BGGPionElasticXS( particle ) );
640  theElasticProcess->RegisterMe( elastic_he );
641  pmanager->AddDiscreteProcess( theElasticProcess );
642  //Inelastic scattering
643  G4PionMinusInelasticProcess* theInelasticProcess =
644  new G4PionMinusInelasticProcess("inelastic");
645  theInelasticProcess->AddDataSet( new G4BGGPionInelasticXS( particle ) );
646  theInelasticProcess->RegisterMe( theFTFModel1 );
647  theInelasticProcess->RegisterMe( theBERTModel0 );
648  pmanager->AddDiscreteProcess( theInelasticProcess );
649  //Absorption
651  }
652  else if (particleName == "kaon+")
653  {
654  // Elastic scattering
655  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
656  theElasticProcess->AddDataSet( theGGHNEl );
657  theElasticProcess->RegisterMe( elastic_lhep0 );
658  pmanager->AddDiscreteProcess( theElasticProcess );
659  // Inelastic scattering
660  G4KaonPlusInelasticProcess* theInelasticProcess =
661  new G4KaonPlusInelasticProcess("inelastic");
662  theInelasticProcess->AddDataSet( theGGHNInel );
663  theInelasticProcess->RegisterMe( theFTFModel1 );
664  theInelasticProcess->RegisterMe( theBERTModel0 );
665  pmanager->AddDiscreteProcess( theInelasticProcess );
666  }
667  else if (particleName == "kaon0S")
668  {
669  // Elastic scattering
670  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
671  theElasticProcess->AddDataSet( theGGHNEl );
672  theElasticProcess->RegisterMe( elastic_lhep0 );
673  pmanager->AddDiscreteProcess( theElasticProcess );
674  // Inelastic scattering
675  G4KaonZeroSInelasticProcess* theInelasticProcess =
676  new G4KaonZeroSInelasticProcess("inelastic");
677  theInelasticProcess->AddDataSet( theGGHNInel );
678  theInelasticProcess->RegisterMe( theFTFModel1 );
679  theInelasticProcess->RegisterMe( theBERTModel0 );
680  pmanager->AddDiscreteProcess( theInelasticProcess );
681  }
682 
683  else if (particleName == "kaon0L")
684  {
685  // Elastic scattering
686  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
687  theElasticProcess->AddDataSet( theGGHNEl );
688  theElasticProcess->RegisterMe( elastic_lhep0 );
689  pmanager->AddDiscreteProcess( theElasticProcess );
690  // Inelastic scattering
691  G4KaonZeroLInelasticProcess* theInelasticProcess =
692  new G4KaonZeroLInelasticProcess("inelastic");
693  theInelasticProcess->AddDataSet( theGGHNInel );
694  theInelasticProcess->RegisterMe( theFTFModel1 );
695  theInelasticProcess->RegisterMe( theBERTModel0 );
696  pmanager->AddDiscreteProcess( theInelasticProcess );
697  }
698 
699  else if (particleName == "kaon-")
700  {
701  // Elastic scattering
702  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
703  theElasticProcess->AddDataSet( theGGHNEl );
704  theElasticProcess->RegisterMe( elastic_lhep0 );
705  pmanager->AddDiscreteProcess( theElasticProcess );
706  // Inelastic scattering
707  G4KaonMinusInelasticProcess* theInelasticProcess =
708  new G4KaonMinusInelasticProcess("inelastic");
709  theInelasticProcess->AddDataSet( theGGHNInel );
710  theInelasticProcess->RegisterMe( theFTFModel1 );
711  theInelasticProcess->RegisterMe( theBERTModel0 );
712  pmanager->AddDiscreteProcess( theInelasticProcess );
714  }
715 
716  else if (particleName == "proton")
717  {
718  // Elastic scattering
719  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
720  theElasticProcess->AddDataSet( new G4BGGNucleonElasticXS( G4Proton::Proton() ) );
721  theElasticProcess->RegisterMe( elastic_chip );
722  pmanager->AddDiscreteProcess( theElasticProcess );
723  // Inelastic scattering
724  G4ProtonInelasticProcess* theInelasticProcess =
725  new G4ProtonInelasticProcess("inelastic");
726  theInelasticProcess->AddDataSet( new G4BGGNucleonInelasticXS( G4Proton::Proton() ) );
727  theInelasticProcess->RegisterMe( theFTFModel1 );
728  theInelasticProcess->RegisterMe( theBERTModel0 );
729  pmanager->AddDiscreteProcess( theInelasticProcess );
730  }
731  else if (particleName == "anti_proton")
732  {
733  // Elastic scattering
734  const G4double elastic_elimitAntiNuc = 100.0*MeV;
735  G4AntiNuclElastic* elastic_anuc = new G4AntiNuclElastic();
736  elastic_anuc->SetMinEnergy( elastic_elimitAntiNuc );
737  G4CrossSectionElastic* elastic_anucxs = new G4CrossSectionElastic( elastic_anuc->GetComponentCrossSection() );
738  G4HadronElastic* elastic_lhep2 = new G4HadronElastic();
739  elastic_lhep2->SetMaxEnergy( elastic_elimitAntiNuc );
740  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
741  theElasticProcess->AddDataSet( elastic_anucxs );
742  theElasticProcess->RegisterMe( elastic_lhep2 );
743  theElasticProcess->RegisterMe( elastic_anuc );
744  pmanager->AddDiscreteProcess( theElasticProcess );
745  // Inelastic scattering
746  G4AntiProtonInelasticProcess* theInelasticProcess =
747  new G4AntiProtonInelasticProcess("inelastic");
748  theInelasticProcess->AddDataSet( theAntiNucleonData );
749  theInelasticProcess->RegisterMe( theFTFModel0 );
750  pmanager->AddDiscreteProcess( theInelasticProcess );
751  // Absorption
753  }
754  else if (particleName == "neutron") {
755  // elastic scattering
756  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
757  theElasticProcess->AddDataSet(new G4NeutronElasticXS());
758  G4HadronElastic* elastic_neutronChipsModel = new G4ChipsElasticModel();
759  elastic_neutronChipsModel->SetMinEnergy( 19.0*MeV );
760  theElasticProcess->RegisterMe( elastic_neutronChipsModel );
761  G4ParticleHPElastic * theElasticNeutronHP = new G4ParticleHPElastic;
762  theElasticNeutronHP->SetMinEnergy( theHPMin );
763  theElasticNeutronHP->SetMaxEnergy( theHPMax );
764  theElasticProcess->RegisterMe( theElasticNeutronHP );
765  theElasticProcess->AddDataSet( new G4ParticleHPElasticData );
766  pmanager->AddDiscreteProcess( theElasticProcess );
767  // inelastic scattering
768  G4NeutronInelasticProcess* theInelasticProcess =
769  new G4NeutronInelasticProcess("inelastic");
770  theInelasticProcess->AddDataSet( new G4NeutronInelasticXS() );
771  theInelasticProcess->RegisterMe( theFTFModel1 );
772  theInelasticProcess->RegisterMe( theBERTModel1 );
773  G4ParticleHPInelastic * theNeutronInelasticHPModel = new G4ParticleHPInelastic;
774  theNeutronInelasticHPModel->SetMinEnergy( theHPMin );
775  theNeutronInelasticHPModel->SetMaxEnergy( theHPMax );
776  theInelasticProcess->RegisterMe( theNeutronInelasticHPModel );
777  theInelasticProcess->AddDataSet( new G4ParticleHPInelasticData );
778  pmanager->AddDiscreteProcess(theInelasticProcess);
779  // capture
780  G4HadronCaptureProcess* theCaptureProcess =
782  G4ParticleHPCapture * theLENeutronCaptureModel = new G4ParticleHPCapture;
783  theLENeutronCaptureModel->SetMinEnergy(theHPMin);
784  theLENeutronCaptureModel->SetMaxEnergy(theHPMax);
785  theCaptureProcess->RegisterMe(theLENeutronCaptureModel);
786  theCaptureProcess->AddDataSet( new G4ParticleHPCaptureData);
787  pmanager->AddDiscreteProcess(theCaptureProcess);
788  }
789  else if (particleName == "anti_neutron")
790  {
791  // Elastic scattering
792  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
793  theElasticProcess->AddDataSet( theGGHNEl );
794  theElasticProcess->RegisterMe( elastic_lhep0 );
795  pmanager->AddDiscreteProcess( theElasticProcess );
796  // Inelastic scattering (include annihilation on-fly)
797  G4AntiNeutronInelasticProcess* theInelasticProcess =
798  new G4AntiNeutronInelasticProcess("inelastic");
799  theInelasticProcess->AddDataSet( theAntiNucleonData );
800  theInelasticProcess->RegisterMe( theFTFModel0 );
801  pmanager->AddDiscreteProcess( theInelasticProcess );
802  }
803  else if (particleName == "deuteron")
804  {
805  // Elastic scattering
806  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
807  theElasticProcess->AddDataSet( theGGNNEl );
808  theElasticProcess->RegisterMe( elastic_lhep0 );
809  pmanager->AddDiscreteProcess( theElasticProcess );
810  // Inelastic scattering
811  G4DeuteronInelasticProcess* theInelasticProcess =
812  new G4DeuteronInelasticProcess("inelastic");
813  theInelasticProcess->AddDataSet( theGGNuclNuclData );
814  theInelasticProcess->RegisterMe( theFTFModel1 );
815  theInelasticProcess->RegisterMe( theBERTModel0 );
816  pmanager->AddDiscreteProcess( theInelasticProcess );
817  }
818  else if (particleName == "triton")
819  {
820  // Elastic scattering
821  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
822  theElasticProcess->AddDataSet( theGGNNEl );
823  theElasticProcess->RegisterMe( elastic_lhep0 );
824  pmanager->AddDiscreteProcess( theElasticProcess );
825  // Inelastic scattering
826  G4TritonInelasticProcess* theInelasticProcess =
827  new G4TritonInelasticProcess("inelastic");
828  theInelasticProcess->AddDataSet( theGGNuclNuclData );
829  theInelasticProcess->RegisterMe( theFTFModel1 );
830  theInelasticProcess->RegisterMe( theBERTModel0 );
831  pmanager->AddDiscreteProcess( theInelasticProcess );
832  }
833  else if (particleName == "alpha")
834  {
835  // Elastic scattering
836  G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess;
837  theElasticProcess->AddDataSet( theGGNNEl );
838  theElasticProcess->RegisterMe( elastic_lhep0 );
839  pmanager->AddDiscreteProcess( theElasticProcess );
840  // Inelastic scattering
841  G4AlphaInelasticProcess* theInelasticProcess =
842  new G4AlphaInelasticProcess("inelastic");
843  theInelasticProcess->AddDataSet( theGGNuclNuclData );
844  theInelasticProcess->RegisterMe( theFTFModel1 );
845  theInelasticProcess->RegisterMe( theBERTModel0 );
846  pmanager->AddDiscreteProcess( theInelasticProcess );
847  }
848  }
849 }
850 
851 // Decays ///////////////////////////////////////////////////////////////////
853 
854  // Add Decay Process
855  G4Decay* theDecayProcess = new G4Decay();
857  particleIterator->reset();
858  while( (*particleIterator)() )
859  {
861  G4ProcessManager* pmanager = particle->GetProcessManager();
862 
863  if (theDecayProcess->IsApplicable(*particle) && !particle->IsShortLived())
864  {
865  pmanager ->AddProcess(theDecayProcess);
866  // set ordering for PostStepDoIt and AtRestDoIt
867  pmanager ->SetProcessOrdering(theDecayProcess, idxPostStep);
868  pmanager ->SetProcessOrdering(theDecayProcess, idxAtRest);
869  }
870  }
871 
872  // Declare radioactive decay to the GenericIon in the IonTable.
875  if(!ad) {
877  ad = new G4UAtomicDeexcitation();
878  man->SetAtomDeexcitation(ad);
880  }
881 
884 }
885 
886 // Cuts /////////////////////////////////////////////////////////////////////
888 {
889 
890  if (verboseLevel >1)
891  G4cout << "DMXPhysicsList::SetCuts:";
892 
893  if (verboseLevel>0){
894  G4cout << "DMXPhysicsList::SetCuts:";
895  G4cout << "CutLength : "
896  << G4BestUnit(defaultCutValue,"Length") << G4endl;
897  }
898 
899  //special for low energy physics
900  G4double lowlimit=250*eV;
902 
903  // set cut values for gamma at first and for e- second and next for e+,
904  // because some processes for e+/e- need cut values for gamma
905  SetCutValue(cutForGamma, "gamma");
908 
910 }
911