File indexing completed on 2025-02-23 09:20:23
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 #include "MicroElecSiPhysics.hh"
0032 #include "G4SystemOfUnits.hh"
0033
0034
0035
0036 #include "G4MicroElecElastic.hh"
0037 #include "G4MicroElecElasticModel.hh"
0038
0039 #include "G4MicroElecInelastic.hh"
0040 #include "G4MicroElecInelasticModel.hh"
0041
0042
0043 #include "G4LossTableManager.hh"
0044 #include "G4EmConfigurator.hh"
0045 #include "G4VEmModel.hh"
0046 #include "G4DummyModel.hh"
0047 #include "G4eIonisation.hh"
0048 #include "G4hIonisation.hh"
0049 #include "G4ionIonisation.hh"
0050 #include "G4eMultipleScattering.hh"
0051 #include "G4hMultipleScattering.hh"
0052 #include "G4BraggModel.hh"
0053 #include "G4BraggIonModel.hh"
0054 #include "G4BetheBlochModel.hh"
0055 #include "G4UrbanMscModel.hh"
0056 #include "G4MollerBhabhaModel.hh"
0057 #include "G4IonFluctuations.hh"
0058 #include "G4UniversalFluctuation.hh"
0059
0060 #include "ElectronCapture.hh"
0061
0062 #include "G4UAtomicDeexcitation.hh"
0063
0064
0065
0066 MicroElecSiPhysics::MicroElecSiPhysics(): G4VUserPhysicsList()
0067 {
0068 defaultCutValue = 1*micrometer;
0069 cutForGamma = defaultCutValue;
0070 cutForElectron = defaultCutValue;
0071 cutForPositron = defaultCutValue;
0072 cutForProton = defaultCutValue;
0073
0074 SetVerboseLevel(1);
0075 }
0076
0077
0078
0079 MicroElecSiPhysics::~MicroElecSiPhysics()
0080 {}
0081
0082
0083
0084 void MicroElecSiPhysics::ConstructParticle()
0085 {
0086 ConstructBosons();
0087 ConstructLeptons();
0088 ConstructBarions();
0089 }
0090
0091
0092
0093 void MicroElecSiPhysics::ConstructBosons()
0094 {
0095
0096 G4Gamma::GammaDefinition();
0097 }
0098
0099
0100 void MicroElecSiPhysics::ConstructLeptons()
0101 {
0102
0103 G4Electron::ElectronDefinition();
0104 G4Positron::PositronDefinition();
0105 }
0106
0107
0108
0109 void MicroElecSiPhysics::ConstructBarions()
0110 {
0111
0112 G4Proton::ProtonDefinition();
0113 G4GenericIon::GenericIonDefinition();
0114 }
0115
0116
0117
0118 void MicroElecSiPhysics::ConstructProcess()
0119 {
0120 AddTransportation();
0121 ConstructEM();
0122 ConstructGeneral();
0123 }
0124
0125
0126
0127 void MicroElecSiPhysics::ConstructEM()
0128 {
0129
0130 auto particleIterator=GetParticleIterator();
0131 particleIterator->reset();
0132
0133 while( (*particleIterator)() )
0134 {
0135
0136 G4ParticleDefinition* particle = particleIterator->value();
0137 G4ProcessManager* pmanager = particle->GetProcessManager();
0138 G4String particleName = particle->GetParticleName();
0139
0140
0141
0142
0143
0144 if (particleName == "e-") {
0145
0146
0147 G4eMultipleScattering* msc = new G4eMultipleScattering();
0148 msc->AddEmModel(1, new G4UrbanMscModel());
0149 pmanager->AddProcess(msc, -1, 1, -1);
0150
0151
0152 G4eIonisation* eion = new G4eIonisation();
0153 pmanager->AddProcess(eion, -1, 2, 2);
0154
0155
0156 G4MicroElecElastic* theMicroElecElasticProcess = new G4MicroElecElastic("e-_G4MicroElecElastic");
0157 theMicroElecElasticProcess->SetEmModel(new G4DummyModel());
0158 pmanager->AddDiscreteProcess(theMicroElecElasticProcess);
0159
0160
0161 G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("e-_G4MicroElecInelastic");
0162 microelecioni->SetEmModel(new G4DummyModel());
0163 pmanager->AddDiscreteProcess(microelecioni);
0164
0165
0166
0167 ElectronCapture* ecap = new ElectronCapture("Target", 16.7*eV);
0168 pmanager->AddDiscreteProcess(ecap);
0169
0170 } else if ( particleName == "proton" ) {
0171
0172
0173 G4hMultipleScattering* msc = new G4hMultipleScattering();
0174 msc->AddEmModel(1, new G4UrbanMscModel());
0175 pmanager->AddProcess(msc, -1, 1, -1);
0176
0177
0178 G4hIonisation* hion = new G4hIonisation();
0179 pmanager->AddProcess(hion, -1, 2, 2);
0180
0181
0182 G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("p_G4MicroElecInelastic");
0183 microelecioni->SetEmModel(new G4DummyModel());
0184 microelecioni->SetEmModel(new G4DummyModel());
0185 pmanager->AddDiscreteProcess(microelecioni);
0186
0187 } else if (particleName == "GenericIon") {
0188
0189
0190 G4hMultipleScattering* msc = new G4hMultipleScattering();
0191 msc->AddEmModel(1, new G4UrbanMscModel());
0192 pmanager->AddProcess(new G4hMultipleScattering, -1, 1, -1);
0193
0194
0195 G4ionIonisation* hion = new G4ionIonisation();
0196 pmanager->AddProcess(hion, -1, 2, 2);
0197
0198
0199 G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("ion_G4MicroElecInelastic");
0200 microelecioni->SetEmModel(new G4DummyModel());
0201 microelecioni->SetEmModel(new G4DummyModel());
0202 pmanager->AddDiscreteProcess(microelecioni);
0203 }
0204 }
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 G4EmConfigurator* em_config = G4LossTableManager::Instance()->EmConfigurator();
0215
0216 G4VEmModel* mod;
0217
0218
0219
0220
0221 G4UrbanMscModel* msc = new G4UrbanMscModel();
0222 msc->SetActivationLowEnergyLimit(100*MeV);
0223 em_config->SetExtraEmModel("e-","msc",msc,"Target");
0224
0225 mod = new G4MollerBhabhaModel();
0226 mod->SetActivationLowEnergyLimit(100*MeV);
0227 em_config->SetExtraEmModel("e-","eIoni",mod,"Target",0.0,10*TeV, new G4UniversalFluctuation());
0228
0229
0230
0231 mod = new G4MicroElecElasticModel();
0232 em_config->SetExtraEmModel("e-","e-_G4MicroElecElastic",mod,"Target",0.0,100*MeV);
0233
0234 mod = new G4MicroElecInelasticModel();
0235 em_config->SetExtraEmModel("e-","e-_G4MicroElecInelastic",mod,"Target",16.7*eV,100*MeV);
0236
0237
0238
0239
0240
0241
0242
0243
0244 mod = new G4BraggModel();
0245 mod->SetActivationHighEnergyLimit(50*keV);
0246 em_config->SetExtraEmModel("proton","hIoni",mod,"Target",0.0,2*MeV, new G4IonFluctuations());
0247
0248 mod = new G4BetheBlochModel();
0249 mod->SetActivationLowEnergyLimit(10*GeV);
0250 em_config->SetExtraEmModel("proton","hIoni",mod,"Target",2*MeV,10*TeV, new G4IonFluctuations());
0251
0252
0253 mod = new G4MicroElecInelasticModel();
0254 mod->SetActivationLowEnergyLimit(50*keV);
0255 em_config->SetExtraEmModel("proton","p_G4MicroElecInelastic",mod,"Target",0.0,10*GeV);
0256 em_config->SetExtraEmModel("proton","p_G4MicroElecInelastic",new G4DummyModel,
0257 "Target",10*GeV,10*TeV);
0258
0259
0260
0261
0262
0263
0264
0265
0266 mod = new G4BraggIonModel();
0267 mod->SetActivationHighEnergyLimit(50*keV);
0268 em_config->SetExtraEmModel("GenericIon","ionIoni",mod,"Target",0.0,2*MeV, new G4IonFluctuations());
0269
0270 mod = new G4BetheBlochModel();
0271 mod->SetActivationLowEnergyLimit(10*GeV);
0272 em_config->SetExtraEmModel("GenericIon","ionIoni",mod,"Target",2*MeV,10*TeV, new G4IonFluctuations());
0273
0274
0275 mod = new G4MicroElecInelasticModel();
0276 mod->SetActivationLowEnergyLimit(50*keV);
0277 em_config->SetExtraEmModel("GenericIon","ion_G4MicroElecInelastic",mod,
0278 "Target",0.0,10*GeV);
0279 em_config->SetExtraEmModel("GenericIon","ion_G4MicroElecInelastic",new G4DummyModel,
0280 "Target",10*GeV,10*TeV);
0281
0282
0283
0284 G4VAtomDeexcitation* de = new G4UAtomicDeexcitation();
0285 G4LossTableManager::Instance()->SetAtomDeexcitation(de);
0286 de->SetFluo(true);
0287 de->SetAuger(true);
0288 de->SetPIXE(true);
0289 de->InitialiseForNewRun();
0290
0291
0292 }
0293
0294
0295
0296 void MicroElecSiPhysics::ConstructGeneral()
0297 { }
0298
0299
0300
0301 void MicroElecSiPhysics::SetCuts()
0302 {
0303 if (verboseLevel >0)
0304 {
0305 G4cout << "MicroElecSiPhysics::SetCuts:";
0306 G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl;
0307 }
0308
0309
0310
0311 SetCutValue(cutForGamma, "gamma");
0312 SetCutValue(cutForElectron, "e-");
0313 SetCutValue(cutForPositron, "e+");
0314 SetCutValue(cutForProton, "proton");
0315
0316 if (verboseLevel>0) { DumpCutValuesTable(); }
0317 }