3 #include <G4ParticleTypes.hh>
5 #include <G4LeptonConstructor.hh>
6 #include <G4MesonConstructor.hh>
7 #include <G4BaryonConstructor.hh>
8 #include <G4ProcessManager.hh>
9 #include <G4PhotoElectricEffect.hh>
10 #include <G4ComptonScattering.hh>
11 #include <G4GammaConversion.hh>
12 #include <G4eMultipleScattering.hh>
13 #include <G4eIonisation.hh>
14 #include <G4eBremsstrahlung.hh>
15 #include <G4eplusAnnihilation.hh>
16 #include <G4MuMultipleScattering.hh>
17 #include <G4MuIonisation.hh>
18 #include <G4MuBremsstrahlung.hh>
19 #include <G4MuPairProduction.hh>
20 #include <G4MuonMinusCapture.hh>
21 #include <G4hMultipleScattering.hh>
22 #include <G4hIonisation.hh>
23 #include <G4OpAbsorption.hh>
24 #include <G4OpRayleigh.hh>
25 #include <G4OpBoundaryProcess.hh>
27 #include <G4Scintillation.hh>
28 #include <G4Cerenkov.hh>
39 namespace G4StationSimulatorOG {
43 fFastCerenkov(fastCerenkov),
44 fG4StationSimulator(sim)
52 G4Geantino::GeantinoDefinition();
53 G4ChargedGeantino::ChargedGeantinoDefinition();
55 G4Gamma::GammaDefinition();
57 G4OpticalPhoton::OpticalPhotonDefinition();
59 G4LeptonConstructor::ConstructParticle();
62 G4MesonConstructor::ConstructParticle();
63 G4BaryonConstructor::ConstructParticle();
70 G4VUserPhysicsList::AddTransportation();
74 const auto decayProcess =
new G4Decay;
76 auto& mumManager = *G4MuonMinus::MuonMinusDefinition()->GetProcessManager();
77 mumManager.AddDiscreteProcess(decayProcess);
78 mumManager.SetProcessOrdering(decayProcess, idxPostStep);
79 mumManager.SetProcessOrdering(decayProcess, idxAtRest);
81 auto& mupManager = *G4MuonPlus::MuonPlusDefinition()->GetProcessManager();
82 mupManager.AddDiscreteProcess(decayProcess);
83 mupManager.SetProcessOrdering(decayProcess, idxPostStep);
84 mupManager.SetProcessOrdering(decayProcess, idxAtRest);
89 auto& it = *G4ParticleTable::GetParticleTable()->GetIterator();
90 for (it.reset(); it(); ) {
91 const G4ParticleDefinition&
particle = *it.value();
92 auto& pManager = *particle.GetProcessManager();
94 if (particle == *G4Gamma::Gamma()) {
96 pManager.AddDiscreteProcess(
new G4PhotoElectricEffect);
97 pManager.AddDiscreteProcess(
new G4ComptonScattering);
98 pManager.AddDiscreteProcess(
new G4GammaConversion);
100 }
else if (particle == *G4Electron::Electron()) {
102 pManager.AddProcess(
new G4eMultipleScattering, -1, 1, 1);
103 pManager.AddProcess(
new G4eIonisation, -1, 2, 2);
104 pManager.AddProcess(
new G4eBremsstrahlung, -1, 3, 3);
106 }
else if (particle == *G4Positron::Positron()) {
108 pManager.AddProcess(
new G4eMultipleScattering, -1, 1, 1);
109 pManager.AddProcess(
new G4eIonisation, -1, 2, 2);
110 pManager.AddProcess(
new G4eBremsstrahlung, -1, 3, 3);
111 pManager.AddProcess(
new G4eplusAnnihilation, 0, -1, 4);
113 }
else if (particle == *G4MuonPlus::MuonPlus() ||
114 particle == *G4MuonMinus::MuonMinus()) {
116 pManager.AddProcess(
new G4MuMultipleScattering, -1, 1, 1);
117 pManager.AddProcess(
new G4MuIonisation, -1, 2, 2);
118 pManager.AddProcess(
new G4MuBremsstrahlung, -1, 3, 3);
119 pManager.AddProcess(
new G4MuPairProduction, -1, 4, 4);
120 if (particle == *G4MuonMinus::MuonMinus() &&
122 pManager.AddProcess(
new G4MuonMinusCapture);
124 }
else if (particle.GetPDGCharge() &&
125 particle != *G4ChargedGeantino::ChargedGeantino()) {
128 pManager.AddProcess(
new G4hMultipleScattering, -1, 1, 1);
129 pManager.AddProcess(
new G4hIonisation, -1, 2, 2);
136 const G4int maxNumPhotons = 3;
138 const auto absorption =
new G4OpAbsorption;
140 const auto rayleighScattering =
new G4OpRayleigh;
142 const auto boundary =
new G4OpBoundaryProcess;
143 boundary->SetVerboseLevel(0);
145 const auto wlsProcess =
new G4OpWLS;
146 wlsProcess->UseTimeProfile(
"exponential");
149 const auto scintProcess =
new G4Scintillation(
"Scintillation");
150 scintProcess->SetScintillationYieldFactor(1.);
151 scintProcess->SetTrackSecondariesFirst(
true);
152 scintProcess->SetVerboseLevel(0);
158 auto& it = *G4ParticleTable::GetParticleTable()->GetIterator();
163 const auto cerenkov =
new G4Cerenkov(
"Cerenkov");
166 cerenkov->SetTrackSecondariesFirst(
true);
167 cerenkov->SetMaxNumPhotonsPerStep(maxNumPhotons);
168 cerenkov->SetVerboseLevel(0);
170 for (it.reset(); it(); ) {
171 const G4ParticleDefinition&
particle = *it.value();
172 auto& pManager = *particle.GetProcessManager();
173 if (cerenkov->IsApplicable(particle)) {
174 pManager.AddProcess(cerenkov);
175 pManager.SetProcessOrdering(cerenkov, idxPostStep);
184 cerenkov->SetTrackSecondariesFirst(
true);
185 cerenkov->SetMaxNumPhotonsPerStep(maxNumPhotons);
186 G4Electron::Electron()->GetProcessManager()->AddContinuousProcess(cerenkov);
187 G4Positron::Positron()->GetProcessManager()->AddContinuousProcess(cerenkov);
188 G4MuonMinus::MuonMinusDefinition()->GetProcessManager()->AddContinuousProcess(cerenkov);
189 G4MuonPlus::MuonPlusDefinition()->GetProcessManager()->AddContinuousProcess(cerenkov);
194 for (it.reset(); it(); ) {
195 const G4ParticleDefinition&
particle = *it.value();
196 auto& pManager = *particle.GetProcessManager();
197 if (scintProcess->IsApplicable(particle)) {
198 pManager.AddProcess(scintProcess);
199 pManager.SetProcessOrderingToLast(scintProcess, idxAtRest);
200 pManager.SetProcessOrderingToLast(scintProcess, idxPostStep);
202 if (particle == *G4OpticalPhoton::OpticalPhoton()) {
203 pManager.AddDiscreteProcess(absorption);
204 pManager.AddDiscreteProcess(rayleighScattering);
205 pManager.AddDiscreteProcess(boundary);
206 pManager.AddDiscreteProcess(wlsProcess);
222 this->SetParticleCuts(cutForGamma, G4Gamma::Gamma());
225 this->SetParticleCuts(cutForElectron, G4Electron::Electron());
228 this->SetParticleCuts(cutForPositron, G4Positron::Positron());
231 this->SetParticleCuts(cutForMuonPlus, G4MuonPlus::MuonPlus());
234 this->SetParticleCuts(cutForMuonMinus, G4MuonMinus::MuonMinus());
237 this->SetParticleCuts(cutForOpticalPhotons, G4OpticalPhoton::OpticalPhoton());
239 this->SetVerboseLevel(0);
240 this->DumpCutValuesTable(0);
double fRangeCutOpticalPhoton
double fRangeCutMuonMinus
void ConstructParticle() override
class that handles Geant4 SD Station simulation adopted from G4TankSimulator
void ConstructProcess() override
struct particle_info particle[80]
G4StationSimulator & fG4StationSimulator