File indexing completed on 2026-09-12 08:29:43
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 #include "ExUCNExtraPhysics.hh"
0030
0031 #include "G4Decay.hh"
0032 #include "G4DecayTable.hh"
0033 #include "G4NeutronBetaDecayChannel.hh"
0034 #include "G4ParticleDefinition.hh"
0035 #include "G4ProcessManager.hh"
0036 #include "G4StepLimiter.hh"
0037 #include "G4SystemOfUnits.hh"
0038 #include "G4Transportation.hh"
0039 #include "G4UCNAbsorption.hh"
0040 #include "G4UCNBoundaryProcess.hh"
0041 #include "G4UCNLoss.hh"
0042 #include "G4UCNMultiScattering.hh"
0043 #include "G4UserSpecialCuts.hh"
0044
0045
0046
0047 ExUCNExtraPhysics::ExUCNExtraPhysics() : G4VPhysicsConstructor("Extra")
0048 {
0049 ;
0050 }
0051
0052
0053
0054 ExUCNExtraPhysics::~ExUCNExtraPhysics()
0055 {
0056 ;
0057 }
0058
0059
0060
0061 void ExUCNExtraPhysics::ConstructParticle()
0062 {
0063 ;
0064 }
0065
0066
0067
0068 void ExUCNExtraPhysics::ConstructProcess()
0069 {
0070 auto particleIterator = GetParticleIterator();
0071 particleIterator->reset();
0072
0073 while ((*particleIterator)()) {
0074 G4ParticleDefinition* particle = particleIterator->value();
0075 G4ProcessManager* pmanager = particle->GetProcessManager();
0076 G4String particleName = particle->GetParticleName();
0077
0078 if (!pmanager) {
0079 std::ostringstream o;
0080 o << "Particle " << particleName << "without a Process Manager";
0081 G4Exception("ExUCNExtraPhysics::ConstructProcess()", "", FatalException, o.str().c_str());
0082 }
0083
0084 pmanager->AddDiscreteProcess(new G4StepLimiter());
0085 pmanager->AddDiscreteProcess(new G4UserSpecialCuts());
0086 }
0087
0088 ConstructUCN();
0089
0090
0091 G4Transportation::EnableGravity();
0092 }
0093
0094
0095
0096 void ExUCNExtraPhysics::ConstructUCN()
0097 {
0098 auto particleIterator = GetParticleIterator();
0099 particleIterator->reset();
0100 G4ProcessManager* pmanager = NULL;
0101
0102 while ((*particleIterator)()) {
0103 G4ParticleDefinition* particle = particleIterator->value();
0104 pmanager = particle->GetProcessManager();
0105 G4String particleName = particle->GetParticleName();
0106
0107 if (!pmanager) {
0108 std::ostringstream o;
0109 o << "Particle " << particleName << "without a Process Manager";
0110 G4Exception("ExUCNExtraPhysics::ConstructProcess()", "", FatalException, o.str().c_str());
0111 }
0112
0113 if (particleName == "neutron") {
0114 pmanager->AddDiscreteProcess(new G4UCNLoss());
0115 pmanager->AddDiscreteProcess(new G4UCNAbsorption());
0116 pmanager->AddDiscreteProcess(new G4UCNMultiScattering());
0117
0118 G4UCNBoundaryProcess* ucnBoundaryProcess = new G4UCNBoundaryProcess();
0119 ucnBoundaryProcess->SetMicroRoughness(true);
0120 ucnBoundaryProcess->SetVerboseLevel(0);
0121
0122 pmanager->AddDiscreteProcess(ucnBoundaryProcess);
0123 }
0124 }
0125 }
0126
0127