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(),
31 TG4Verbose("physicsList") {
33 defaultCutValue = fgkDefaultCutValue;
35 SetVerboseLevel(VerboseLevel());
38 //_____________________________________________________________________________
39 TG4ModularPhysicsList::TG4ModularPhysicsList(const TG4ModularPhysicsList& right)
40 : TG4Verbose("physicsList") {
42 TG4Globals::Exception("TG4ModularPhysicsList is protected from copying.");
45 //_____________________________________________________________________________
46 TG4ModularPhysicsList::~TG4ModularPhysicsList() {
49 // fExtDecayer is deleted in G4Decay destructor
54 //_____________________________________________________________________________
55 TG4ModularPhysicsList&
56 TG4ModularPhysicsList::operator=(const TG4ModularPhysicsList &right)
58 // check assignement to self
59 if (this == &right) return *this;
61 TG4Globals::Exception("TG4ModularPhysicsList is protected from assigning.");
68 //_____________________________________________________________________________
69 void TG4ModularPhysicsList::SetProcessActivation(
70 G4ProcessManager* processManager,
71 G4int processId, G4bool activation)
73 // Sets process activation for the given process.
76 G4String strActivation = "activation";
77 if (!activation) strActivation = "inactivation";
79 if (VerboseLevel() > 1) {
80 G4cout << "Set process " << strActivation << " for "
81 << (*processManager->GetProcessList())[processId]->GetProcessName()
85 processManager->SetProcessActivation(processId, activation);
90 //_____________________________________________________________________________
91 void TG4ModularPhysicsList::ConstructParticle()
93 // In this method, static member functions should be called
94 // for all particles which you want to use.
95 // This ensures that objects of these particle types will be
96 // created in the program.
99 // lock physics manager
100 TG4G3PhysicsManager* g3PhysicsManager = TG4G3PhysicsManager::Instance();
101 g3PhysicsManager->Lock();
103 // create particles for registered physics
104 G4VModularPhysicsList::ConstructParticle();
107 //_____________________________________________________________________________
108 void TG4ModularPhysicsList::ConstructProcess()
110 // Constructs all processes.
113 // create processes for registered physics
114 G4VModularPhysicsList::ConstructProcess();
117 if (verboseLevel>1) DumpAllProcesses();
123 //_____________________________________________________________________________
124 void TG4ModularPhysicsList::SetCuts()
126 // Sets the default cut value for all particle types
128 // The cut value for e-/e+ is high in oredr to supress
129 // tracking of delta electrons.
132 // SetCutsWithDefault();
133 // "G4VUserPhysicsList::SetCutsWithDefault" method sets
134 // the default cut value for all particle types.
137 G4double cut = defaultCutValue;
138 //G4double ecut = 10.*m;
142 if (VerboseLevel() > 1) {
143 G4cout << "TG4ModularPhysicsList::SetCutsWithDefault:";
144 G4cout << "CutLength : " << cut/mm << " (mm)" << G4endl;
148 // set cut values for gamma at first and for e- second and next for e+,
149 // because some processes for e+/e- need cut values for gamma
150 SetCutValue(cut, "gamma");
151 SetCutValue(ecut, "e-");
152 SetCutValue(ecut, "e+");
154 // set cut values for proton and anti_proton before all other hadrons
155 // because some processes for hadrons need cut values for proton/anti_proton
156 SetCutValue(cut, "proton");
157 SetCutValue(cut, "anti_proton");
159 SetCutValueForOthers(cut);
161 if (verboseLevel>1) {
162 DumpCutValuesTable();
166 //_____________________________________________________________________________
167 void TG4ModularPhysicsList::SetProcessActivation()
169 // (In)Activates built processes according
170 // to the setup in TG4G3PhysicsManager::fControlVector.
173 TG4G3ControlVector* controlVector
174 = TG4G3PhysicsManager::Instance()->GetControlVector();
176 G4bool specialControls
177 = TG4GeometryServices::Instance()->IsSpecialControls();
179 if (!specialControls)
180 if (VerboseLevel() > 0) {
182 << "### No special controls in user limits are set." << G4endl;
185 if (!controlVector) {
186 G4String text = "TG4ModularPhysicsList::SetProcessActivation: \n";
187 text = text + " Vector of processes controls is not set.";
188 TG4Globals::Warning(text);
192 theParticleIterator->reset();
193 while ((*theParticleIterator)())
195 G4ProcessManager* processManager
196 = theParticleIterator->value()->GetProcessManager();
198 G4ProcessVector* processVector = processManager->GetProcessList();
200 // set processes controls
201 for (G4int i=0; i<processVector->length(); i++) {
203 TG4G3ControlValue control
204 = controlVector->GetControlValue((*processVector)[i]);
205 G4bool activation = processManager->GetProcessActivation(i);
207 if (control != kUnset) {
208 if (!TG4Globals::Compare(activation, control)) {
210 // set new process activation
212 if (control == kInActivate) activate = false;
213 else activate = true;
215 SetProcessActivation(processManager, i, activate);
220 if ((*processVector)[i]->GetProcessName().find("specialControl")
223 SetProcessActivation(processManager, i, specialControls);
230 //_____________________________________________________________________________
231 void TG4ModularPhysicsList::PrintAllProcesses() const
233 // Prints all processes.
236 G4cout << "TG4ModularPhysicsList processes: " << G4endl;
237 G4cout << "================================ " << G4endl;
239 G4ProcessTable* processTable = G4ProcessTable::GetProcessTable();
240 G4ProcessTable::G4ProcNameVector* processNameList
241 = processTable->GetNameList();
243 for (G4int i=0; i <processNameList->size(); i++){
244 G4cout << " " << (*processNameList)[i] << G4endl;
248 //_____________________________________________________________________________
249 void TG4ModularPhysicsList::DumpAllProcesses() const
251 // Dumps all particles and their processes.
254 G4cout << "TG4ModularPhysicsList particles and processes: " << G4endl;
255 G4cout << "============================================== " << G4endl;
257 theParticleIterator->reset();
258 while ((*theParticleIterator)())
260 // print particle name
261 G4cout << "Particle: "
262 << theParticleIterator->value()->GetParticleName()
265 // dump particle processes
266 G4ProcessVector* processVector
267 = theParticleIterator->value()->GetProcessManager()->GetProcessList();
268 for (G4int i=0; i<processVector->length(); i++)
269 (*processVector)[i]->DumpInfo();