4 // Author: I. Hrivnacova
6 // Class TG4ModularPhysicsList
7 // ---------------------------
8 // See the class description in the header file.
10 #include "TG4ModularPhysicsList.h"
11 #include "TG4GeometryServices.h"
12 #include "TG4G3PhysicsManager.h"
13 #include "TG4G3ControlVector.h"
14 #include "TG4ProcessControlMap.h"
16 #include <G4ParticleDefinition.hh>
17 #include <G4ProcessManager.hh>
18 #include <G4BosonConstructor.hh>
19 #include <G4LeptonConstructor.hh>
20 #include <G4MesonConstructor.hh>
21 #include <G4BaryonConstructor.hh>
22 #include <G4IonConstructor.hh>
23 #include <G4ShortLivedConstructor.hh>
24 #include <G4ProcessTable.hh>
26 const G4double TG4ModularPhysicsList::fgkDefaultCutValue = 1.0 * mm;
28 //_____________________________________________________________________________
29 TG4ModularPhysicsList::TG4ModularPhysicsList()
30 : G4VModularPhysicsList() {
32 defaultCutValue = fgkDefaultCutValue;
37 //_____________________________________________________________________________
38 TG4ModularPhysicsList::TG4ModularPhysicsList(const TG4ModularPhysicsList& right)
41 TG4Globals::Exception("TG4ModularPhysicsList is protected from copying.");
44 //_____________________________________________________________________________
45 TG4ModularPhysicsList::~TG4ModularPhysicsList() {
48 // fExtDecayer is deleted in G4Decay destructor
53 //_____________________________________________________________________________
54 TG4ModularPhysicsList&
55 TG4ModularPhysicsList::operator=(const TG4ModularPhysicsList &right)
57 // check assignement to self
58 if (this == &right) return *this;
60 TG4Globals::Exception("TG4ModularPhysicsList is protected from assigning.");
67 //_____________________________________________________________________________
68 void TG4ModularPhysicsList::SetProcessActivation(
69 G4ProcessManager* processManager,
70 G4int processId, G4bool activation)
72 // Sets process activation for the given process.
75 G4String strActivation = "activation";
76 if (!activation) strActivation = "inactivation";
79 G4cout << "Set process " << strActivation << " for "
80 << (*processManager->GetProcessList())[processId]->GetProcessName()
84 processManager->SetProcessActivation(processId, activation);
89 //_____________________________________________________________________________
90 void TG4ModularPhysicsList::ConstructParticle()
92 // In this method, static member functions should be called
93 // for all particles which you want to use.
94 // This ensures that objects of these particle types will be
95 // created in the program.
98 // lock physics manager
99 TG4G3PhysicsManager* g3PhysicsManager = TG4G3PhysicsManager::Instance();
100 g3PhysicsManager->Lock();
102 // create particles for registered physics
103 G4VModularPhysicsList::ConstructParticle();
106 //_____________________________________________________________________________
107 void TG4ModularPhysicsList::ConstructProcess()
109 // Constructs all processes.
112 // create processes for registered physics
113 G4VModularPhysicsList::ConstructProcess();
116 if (verboseLevel>1) DumpAllProcesses();
122 //_____________________________________________________________________________
123 void TG4ModularPhysicsList::SetCuts()
125 // Sets the default cut value for all particle types
127 // The cut value for e-/e+ is high in oredr to supress
128 // tracking of delta electrons.
131 // SetCutsWithDefault();
132 // "G4VUserPhysicsList::SetCutsWithDefault" method sets
133 // the default cut value for all particle types.
136 G4double cut = defaultCutValue;
137 //G4double ecut = 10.*m;
141 if (verboseLevel >1){
142 G4cout << "TG4ModularPhysicsList::SetCutsWithDefault:";
143 G4cout << "CutLength : " << cut/mm << " (mm)" << G4endl;
147 // set cut values for gamma at first and for e- second and next for e+,
148 // because some processes for e+/e- need cut values for gamma
149 SetCutValue(cut, "gamma");
150 SetCutValue(ecut, "e-");
151 SetCutValue(ecut, "e+");
153 // set cut values for proton and anti_proton before all other hadrons
154 // because some processes for hadrons need cut values for proton/anti_proton
155 SetCutValue(cut, "proton");
156 SetCutValue(cut, "anti_proton");
158 SetCutValueForOthers(cut);
160 if (verboseLevel>1) {
161 DumpCutValuesTable();
165 //_____________________________________________________________________________
166 void TG4ModularPhysicsList::SetProcessActivation()
168 // (In)Activates built processes according
169 // to the setup in TG4G3PhysicsManager::fControlVector.
172 TG4G3ControlVector* controlVector
173 = TG4G3PhysicsManager::Instance()->GetControlVector();
175 G4bool specialControls
176 = TG4GeometryServices::Instance()->IsSpecialControls();
178 if (!specialControls)
180 << "### No special controls in user limits are set." << G4endl;
182 if (!controlVector) {
183 G4String text = "TG4ModularPhysicsList::SetProcessActivation: \n";
184 text = text + " Vector of processes controls is not set.";
185 TG4Globals::Warning(text);
189 theParticleIterator->reset();
190 while ((*theParticleIterator)())
192 G4ProcessManager* processManager
193 = theParticleIterator->value()->GetProcessManager();
195 G4ProcessVector* processVector = processManager->GetProcessList();
197 // set processes controls
198 for (G4int i=0; i<processVector->length(); i++) {
200 TG4G3ControlValue control
201 = controlVector->GetControlValue((*processVector)[i]);
202 G4bool activation = processManager->GetProcessActivation(i);
204 if (control != kUnset) {
205 if (!TG4Globals::Compare(activation, control)) {
207 // set new process activation
209 if (control == kInActivate) activate = false;
210 else activate = true;
212 SetProcessActivation(processManager, i, activate);
217 if ((*processVector)[i]->GetProcessName().find("specialControl")
220 SetProcessActivation(processManager, i, specialControls);
227 //_____________________________________________________________________________
228 void TG4ModularPhysicsList::PrintAllProcesses() const
230 // Prints all processes.
233 G4cout << "TG4ModularPhysicsList processes: " << G4endl;
234 G4cout << "================================ " << G4endl;
236 G4ProcessTable* processTable = G4ProcessTable::GetProcessTable();
237 G4ProcessTable::G4ProcNameVector* processNameList
238 = processTable->GetNameList();
240 for (G4int i=0; i <processNameList->size(); i++){
241 G4cout << " " << (*processNameList)[i] << G4endl;
245 //_____________________________________________________________________________
246 void TG4ModularPhysicsList::DumpAllProcesses() const
248 // Dumps all particles and their processes.
251 G4cout << "TG4ModularPhysicsList particles and processes: " << G4endl;
252 G4cout << "============================================== " << G4endl;
254 theParticleIterator->reset();
255 while ((*theParticleIterator)())
257 // print particle name
258 G4cout << "Particle: "
259 << theParticleIterator->value()->GetParticleName()
262 // dump particle processes
263 G4ProcessVector* processVector
264 = theParticleIterator->value()->GetProcessManager()->GetProcessList();
265 for (G4int i=0; i<processVector->length(); i++)
266 (*processVector)[i]->DumpInfo();