File indexing completed on 2025-10-31 08:22:59
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012 
0013 
0014 
0015 
0016 
0017 
0018 
0019 
0020 
0021 
0022 
0023 
0024 
0025 
0026 
0027 
0028 
0029 
0030 
0031 
0032 
0033 #include "PhysicsList.hh"
0034 
0035 #include "PhysListEmStandard.hh"
0036 #include "PhysListEmStandardNR.hh"
0037 #include "PhysicsListMessenger.hh"
0038 #include "StepMax.hh"
0039 
0040 #include "G4BetheBlochIonGasModel.hh"
0041 #include "G4BraggIonGasModel.hh"
0042 #include "G4Decay.hh"
0043 #include "G4DecayPhysics.hh"
0044 #include "G4EmConfigurator.hh"
0045 #include "G4EmLivermorePhysics.hh"
0046 #include "G4EmLowEPPhysics.hh"
0047 #include "G4EmPenelopePhysics.hh"
0048 #include "G4EmStandardPhysics.hh"
0049 #include "G4EmStandardPhysicsGS.hh"
0050 #include "G4EmStandardPhysicsSS.hh"
0051 #include "G4EmStandardPhysicsWVI.hh"
0052 #include "G4EmStandardPhysics_option1.hh"
0053 #include "G4EmStandardPhysics_option2.hh"
0054 #include "G4EmStandardPhysics_option3.hh"
0055 #include "G4EmStandardPhysics_option4.hh"
0056 #include "G4HadronDElasticPhysics.hh"
0057 #include "G4HadronElasticPhysics.hh"
0058 #include "G4HadronHElasticPhysics.hh"
0059 #include "G4HadronInelasticQBBC.hh"
0060 #include "G4IonFluctuations.hh"
0061 #include "G4IonParametrisedLossModel.hh"
0062 #include "G4IonPhysics.hh"
0063 #include "G4LossTableManager.hh"
0064 #include "G4PhysicalConstants.hh"
0065 #include "G4ProcessManager.hh"
0066 #include "G4SystemOfUnits.hh"
0067 #include "G4UnitsTable.hh"
0068 #include "G4UniversalFluctuation.hh"
0069 
0070 
0071 
0072 PhysicsList::PhysicsList() : G4VModularPhysicsList(), fStepMaxProcess(nullptr)
0073 {
0074   fHelIsRegisted = false;
0075   fBicIsRegisted = false;
0076   fBiciIsRegisted = false;
0077 
0078   
0079   verboseLevel = 1;
0080 
0081   fMessenger = new PhysicsListMessenger(this);
0082 
0083   
0084   fEmName = G4String("emstandard_opt0");
0085   fEmPhysicsList = new G4EmStandardPhysics(verboseLevel);
0086 
0087   
0088   fDecPhysicsList = new G4DecayPhysics(verboseLevel);
0089 }
0090 
0091 
0092 
0093 PhysicsList::~PhysicsList()
0094 {
0095   delete fMessenger;
0096   delete fEmPhysicsList;
0097   delete fDecPhysicsList;
0098   for (size_t i = 0; i < fHadronPhys.size(); i++) {
0099     delete fHadronPhys[i];
0100   }
0101 }
0102 
0103 
0104 
0105 void PhysicsList::ConstructParticle()
0106 {
0107   fDecPhysicsList->ConstructParticle();
0108 }
0109 
0110 
0111 
0112 void PhysicsList::ConstructProcess()
0113 {
0114   
0115   
0116   AddTransportation();
0117 
0118   
0119   
0120   fEmPhysicsList->ConstructProcess();
0121 
0122   
0123   
0124   fDecPhysicsList->ConstructProcess();
0125 
0126   
0127   for (size_t i = 0; i < fHadronPhys.size(); i++) {
0128     fHadronPhys[i]->ConstructProcess();
0129   }
0130 
0131   
0132   
0133   AddStepMax();
0134 }
0135 
0136 
0137 
0138 void PhysicsList::AddPhysicsList(const G4String& name)
0139 {
0140   if (verboseLevel > 1) {
0141     G4cout << "PhysicsList::AddPhysicsList: <" << name << ">" << G4endl;
0142   }
0143 
0144   if (name == fEmName) return;
0145 
0146   if (name == "local") {
0147     fEmName = name;
0148     delete fEmPhysicsList;
0149     fEmPhysicsList = new PhysListEmStandard(name);
0150   }
0151   else if (name == "emstandard_opt0") {
0152     fEmName = name;
0153     delete fEmPhysicsList;
0154     fEmPhysicsList = new G4EmStandardPhysics(verboseLevel);
0155   }
0156   else if (name == "emstandard_opt1") {
0157     fEmName = name;
0158     delete fEmPhysicsList;
0159     fEmPhysicsList = new G4EmStandardPhysics_option1(verboseLevel);
0160   }
0161   else if (name == "emstandard_opt2") {
0162     fEmName = name;
0163     delete fEmPhysicsList;
0164     fEmPhysicsList = new G4EmStandardPhysics_option2(verboseLevel);
0165   }
0166   else if (name == "emstandard_opt3") {
0167     fEmName = name;
0168     delete fEmPhysicsList;
0169     fEmPhysicsList = new G4EmStandardPhysics_option3(verboseLevel);
0170   }
0171   else if (name == "emstandard_opt4") {
0172     fEmName = name;
0173     delete fEmPhysicsList;
0174     fEmPhysicsList = new G4EmStandardPhysics_option4(verboseLevel);
0175   }
0176   else if (name == "ionGasModels") {
0177     AddPhysicsList("emstandard_opt0");
0178     fEmName = name;
0179     AddIonGasModels();
0180   }
0181   else if (name == "standardNR") {
0182     fEmName = name;
0183     delete fEmPhysicsList;
0184     fEmPhysicsList = new PhysListEmStandardNR(name);
0185   }
0186   else if (name == "emlivermore") {
0187     fEmName = name;
0188     delete fEmPhysicsList;
0189     fEmPhysicsList = new G4EmLivermorePhysics(verboseLevel);
0190   }
0191   else if (name == "empenelope") {
0192     fEmName = name;
0193     delete fEmPhysicsList;
0194     fEmPhysicsList = new G4EmPenelopePhysics(verboseLevel);
0195   }
0196   else if (name == "emlowenergy") {
0197     fEmName = name;
0198     delete fEmPhysicsList;
0199     fEmPhysicsList = new G4EmLowEPPhysics(verboseLevel);
0200   }
0201   else if (name == "emstandardSS") {
0202     fEmName = name;
0203     delete fEmPhysicsList;
0204     fEmPhysicsList = new G4EmStandardPhysicsSS(verboseLevel);
0205   }
0206   else if (name == "emstandardWVI") {
0207     fEmName = name;
0208     delete fEmPhysicsList;
0209     fEmPhysicsList = new G4EmStandardPhysicsWVI(verboseLevel);
0210   }
0211   else if (name == "emstandardGS") {
0212     fEmName = name;
0213     delete fEmPhysicsList;
0214     fEmPhysicsList = new G4EmStandardPhysicsGS(verboseLevel);
0215   }
0216   else if (name == "elastic" && !fHelIsRegisted) {
0217     fHadronPhys.push_back(new G4HadronElasticPhysics(verboseLevel));
0218     fHelIsRegisted = true;
0219   }
0220   else if (name == "DElastic" && !fHelIsRegisted) {
0221     fHadronPhys.push_back(new G4HadronDElasticPhysics(verboseLevel));
0222     fHelIsRegisted = true;
0223   }
0224   else if (name == "HElastic" && !fHelIsRegisted) {
0225     fHadronPhys.push_back(new G4HadronHElasticPhysics(verboseLevel));
0226     fHelIsRegisted = true;
0227   }
0228   else if (name == "binary" && !fBicIsRegisted) {
0229     fHadronPhys.push_back(new G4HadronInelasticQBBC(verboseLevel));
0230     fBicIsRegisted = true;
0231   }
0232   else if (name == "binary_ion" && !fBiciIsRegisted) {
0233     fHadronPhys.push_back(new G4IonPhysics(verboseLevel));
0234     fBiciIsRegisted = true;
0235   }
0236   else {
0237     G4cout << "PhysicsList::AddPhysicsList: <" << name << ">"
0238            << " is not defined" << G4endl;
0239   }
0240 }
0241 
0242 
0243 
0244 void PhysicsList::AddStepMax()
0245 {
0246   
0247   fStepMaxProcess = new StepMax();
0248 
0249   auto particleIterator = GetParticleIterator();
0250   particleIterator->reset();
0251   while ((*particleIterator)()) {
0252     G4ParticleDefinition* particle = particleIterator->value();
0253     G4ProcessManager* pmanager = particle->GetProcessManager();
0254 
0255     if (fStepMaxProcess->IsApplicable(*particle) && pmanager) {
0256       pmanager->AddDiscreteProcess(fStepMaxProcess);
0257     }
0258   }
0259 }
0260 
0261 
0262 
0263 void PhysicsList::AddIonGasModels()
0264 {
0265   G4EmConfigurator* em_config = G4LossTableManager::Instance()->EmConfigurator();
0266   auto particleIterator = GetParticleIterator();
0267   particleIterator->reset();
0268   while ((*particleIterator)()) {
0269     G4ParticleDefinition* particle = particleIterator->value();
0270     G4String partname = particle->GetParticleName();
0271     if (partname == "alpha" || partname == "He3" || partname == "GenericIon") {
0272       G4BraggIonGasModel* mod1 = new G4BraggIonGasModel();
0273       G4BetheBlochIonGasModel* mod2 = new G4BetheBlochIonGasModel();
0274       G4double eth = 2. * MeV * particle->GetPDGMass() / proton_mass_c2;
0275       em_config->SetExtraEmModel(partname, "ionIoni", mod1, "", 0.0, eth, new G4IonFluctuations());
0276       em_config->SetExtraEmModel(partname, "ionIoni", mod2, "", eth, 100 * TeV,
0277                                  new G4UniversalFluctuation());
0278     }
0279   }
0280 }
0281 
0282