Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ProcessTableMessenger.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// G4ProcessTableMessenger class implementation
27//
28// Author: H.Kurashige, 15 August 1998
29// --------------------------------------------------------------------
30
32
33#include "G4UImanager.hh"
34#include "G4UIdirectory.hh"
37#include "G4UIcmdWithAString.hh"
38
39#include "G4VProcess.hh"
40#include "G4ProcessManager.hh"
41#include "G4ProcessTable.hh"
42#include "G4ParticleTable.hh"
43
44#include "G4ios.hh"
45#include "G4Tokenizer.hh"
46#include <iomanip>
47#include <sstream>
48
49G4ThreadLocal G4int G4ProcessTableMessenger::NumberOfProcessType = 10;
50
51// --------------------------------------------------------------------
53 : theProcessTable(pTable)
54{
55 // Command /particle/process
56 thisDirectory = new G4UIdirectory("/process/");
57 thisDirectory->SetGuidance("Process Table control commands.");
58
59 // Command /particle/process/list
60 listCmd = new G4UIcmdWithAString("/process/list",this);
61 listCmd->SetGuidance("List up process names");
62 listCmd->SetGuidance(" list [type] ");
63 listCmd->SetGuidance(" type: process type [all:for all processes]");
64 listCmd->SetParameterName("type", true);
65 listCmd->SetDefaultValue("all");
66 SetNumberOfProcessType();
67
68 G4String candidates("all");
69 for (G4int idx = 0; idx < NumberOfProcessType ; ++idx )
70 {
71 candidates += " " + G4VProcess::GetProcessTypeName(G4ProcessType(idx));
72 }
73 listCmd->SetCandidates((const char*)(candidates));
74
75 // Command /particle/process/verbose
76 verboseCmd = new G4UIcmdWithAnInteger("/process/verbose",this);
77 verboseCmd->SetGuidance("Set Verbose Level for Process Table");
78 verboseCmd->SetGuidance(" verbose [level]");
79 verboseCmd->SetGuidance(" level: verbose level");
80 verboseCmd->SetParameterName("verbose", true);
81 verboseCmd->SetDefaultValue(1);
82 verboseCmd->SetRange("verbose >=0");
84
85 // Command /particle/process/setVerbose
86 procVerboseCmd = new G4UIcommand("/process/setVerbose",this);
87 procVerboseCmd->SetGuidance("Set verbose level for processes");
88 procVerboseCmd->SetGuidance(" setVerbose level [type or name] ");
89 procVerboseCmd->SetGuidance(" level: verbose level ");
90 procVerboseCmd->SetGuidance(" name : process name ");
91 procVerboseCmd->SetGuidance(" type : process type ");
92 procVerboseCmd->SetGuidance(" [all] for all processes ");
93 G4UIparameter* param = new G4UIparameter("verbose",'i',false);
94 procVerboseCmd->SetParameter(param);
95 param = new G4UIparameter("type",'s',true);
96 param->SetDefaultValue("all");
97 procVerboseCmd->SetParameter(param);
99
100 // Command /particle/process/dump
101 dumpCmd = new G4UIcommand("/process/dump",this);
102 dumpCmd->SetGuidance("Dump process information");
103 dumpCmd->SetGuidance(" dump name [particle]");
104 dumpCmd->SetGuidance(" name: process name or type name");
105 dumpCmd->SetGuidance(" particle: particle name [all: for all particles]");
106 param = new G4UIparameter("procName",'s',false);
107 dumpCmd->SetParameter(param);
108 param = new G4UIparameter("particle",'s',true);
109 param->SetDefaultValue("all");
110 dumpCmd->SetParameter(param);
112
113 // Command /process/activate
114 activateCmd = new G4UIcommand("/process/activate",this);
115 activateCmd->SetGuidance("Activate processes ");
116 activateCmd->SetGuidance(" Activate name [particle]");
117 activateCmd->SetGuidance(" name: process name or type name");
118 activateCmd->SetGuidance(" particle: particle name [all: for all particles]");
119 param = new G4UIparameter("procName",'s',false);
120 activateCmd->SetParameter(param);
121 param = new G4UIparameter("particle",'s',true);
122 param->SetDefaultValue("all");
123 activateCmd->SetParameter(param);
124 activateCmd->AvailableForStates(G4State_Idle);
125
126 // Command /process/inactivate
127 inactivateCmd = new G4UIcommand("/process/inactivate",this);
128 inactivateCmd->SetGuidance("Inactivate process ");
129 inactivateCmd->SetGuidance("Inactivate processes ");
130 inactivateCmd->SetGuidance(" Inactivate name [particle]");
131 inactivateCmd->SetGuidance(" name: process name or type name");
132 inactivateCmd->SetGuidance(" particle: particle name [all: for all particles]");
133 param = new G4UIparameter("procName",'s',false);
134 inactivateCmd->SetParameter(param);
135 param = new G4UIparameter("particle",'s',true);
136 param->SetDefaultValue("all");
137 inactivateCmd->SetParameter(param);
138 inactivateCmd->AvailableForStates(G4State_Idle);
139}
140
141// --------------------------------------------------------------------
143{
144 delete activateCmd;
145 delete inactivateCmd;
146 delete verboseCmd;
147 delete dumpCmd;
148 delete listCmd;
149 delete procVerboseCmd;
150 delete thisDirectory;
151}
152
153// --------------------------------------------------------------------
154void
156{
157 G4ProcessTable::G4ProcNameVector* procNameVector
158 = theProcessTable->GetNameList();
159 G4int type = -1;
161
162 if( command == listCmd )
163 {
164 // Command /process/list
165 type = -1;
166 if (newValue == "all")
167 {
168 currentProcessTypeName = newValue;
169 }
170 else
171 {
172 type = GetProcessType(newValue);
173 if (type <0)
174 {
175 G4cout << " illegal type !!! " << G4endl;
176 }
177 else
178 {
179 currentProcessTypeName = newValue;
180 }
181 }
182 G4int counter = 0;
183 for (auto itr=procNameVector->cbegin(); itr!=procNameVector->cend(); ++itr)
184 {
185 G4ProcessVector* tmpVector = theProcessTable->FindProcesses(*itr);
186 if ( (type <0) || ( ((*tmpVector)(0)->GetProcessType()) == type) )
187 {
188 if ( counter%4 != 0) G4cout << ",";
189 G4cout << std::setw(19) << *itr;
190 if ((counter++)%4 == 3)
191 {
192 G4cout << G4endl;
193 }
194 }
195 delete tmpVector;
196 }
197 G4cout << G4endl;
198 }
199 else if( command==procVerboseCmd )
200 {
201 // Command /process/setVerbose
202 G4Tokenizer next( newValue );
203
204 // check 1st argument
205 G4String tmpS = G4String(next());
206 // inputstream for newValues
207 const char* temp = (const char*)(tmpS);
208 std::istringstream is((char*)temp);
209 G4int level;
210 is >>level;
211
212 // check 2nd argument
213 currentProcessTypeName = G4String(next());
214 if (currentProcessTypeName.empty()) currentProcessTypeName = "all";
215 G4bool isProcName = false;
216 G4bool isAll = false;
217 type = -1;
218
219 if (currentProcessTypeName == "all")
220 {
221 isAll = true;
222 }
223 else
224 {
225 type = GetProcessType(currentProcessTypeName);
226 if (type<0)
227 {
228 isProcName = true;
229 currentProcessName = currentProcessTypeName;
230 currentProcessTypeName = "";
231 }
232 }
233 for (auto itr=procNameVector->cbegin(); itr!=procNameVector->cend(); ++itr)
234 {
235 G4ProcessVector* tmpVector = theProcessTable->FindProcesses(*itr);
236 G4VProcess* p = (*tmpVector)(0);
237 if ( isAll ||
238 (!isProcName && ( p->GetProcessType() == type) ) ||
239 ( isProcName && ( p->GetProcessName()== currentProcessName) ) )
240 {
241 p->SetVerboseLevel(level);
242 }
243 delete tmpVector;
244 }
245 }
246 else if( command==verboseCmd )
247 {
248 // Command /process/verbose
249 theProcessTable->SetVerboseLevel(verboseCmd->GetNewIntValue(newValue));
250 }
251 else
252 {
253 G4Tokenizer next( newValue );
254
255 // check 1st argument
256 currentProcessName = G4String(next());
257 G4bool isProcName = false;
258 for (auto itr=procNameVector->cbegin(); itr!=procNameVector->cend(); ++itr)
259 {
260 if ( (*itr) == currentProcessName )
261 {
262 isProcName = true;
263 break;
264 }
265 }
266 if (!isProcName)
267 {
268 type = GetProcessType(currentProcessName);
269 if (type <0 )
270 {
271 // no processes with specified name
272 ed << " illegal process (or type) name ["
273 << currentProcessName << "]";
274 command->CommandFailed(ed);
275 currentProcessName = "";
276 return;
277 }
278 }
279
280 // check 2nd argument
281 currentParticleName = G4String(next());
282 G4bool isParticleFound = false;
283 G4ParticleDefinition* currentParticle = nullptr;
284 if ( currentParticleName == "all" )
285 {
286 isParticleFound = true;
287 }
288 else
289 {
290 isParticleFound = G4ParticleTable::GetParticleTable()
291 ->contains(currentParticleName);
292 if (isParticleFound)
293 {
294 currentParticle = G4ParticleTable::GetParticleTable()
295 ->FindParticle(currentParticleName);
296 }
297 }
298
299 if ( !isParticleFound )
300 {
301 // no particle with specified name
302 ed << " illegal particle name [" << currentParticleName << "]";
303 command->CommandFailed(ed);
304 currentParticleName = "";
305 return;
306 }
307
308 if( command==dumpCmd )
309 {
310 // process/dump
311 G4ProcessVector* tmpVector;
312 if (isProcName)
313 {
314 tmpVector = theProcessTable->FindProcesses(currentProcessName);
315 }
316 else
317 {
318 tmpVector = theProcessTable->FindProcesses(G4ProcessType(type));
319 }
320 for (G4int i=0; i<(G4int)tmpVector->length(); ++i)
321 {
322 theProcessTable->DumpInfo( (*tmpVector)(i), currentParticle );
323 }
324 delete tmpVector;
325 }
326 else if ( (command==activateCmd) || (command==inactivateCmd))
327 {
328 // process/activate , inactivate
329 G4bool fActive = (command==activateCmd);
330 if (isProcName)
331 {
332 if ( currentParticle == nullptr )
333 {
334 theProcessTable->SetProcessActivation(currentProcessName,
335 fActive);
336 }
337 else
338 {
339 theProcessTable->SetProcessActivation(currentProcessName,
340 currentParticle,
341 fActive);
342 }
343 }
344 else
345 {
346 if ( currentParticle == nullptr )
347 {
348 theProcessTable->SetProcessActivation(G4ProcessType(type),
349 fActive);
350 }
351 else
352 {
353 theProcessTable->SetProcessActivation(G4ProcessType(type),
354 currentParticle,
355 fActive);
356 }
357 }
358 G4UImanager::GetUIpointer()->ApplyCommand("/run/physicsModified");
359 }
360 }
361}
362
363// --------------------------------------------------------------------
365{
366 if( command==verboseCmd )
367 {
368 // Command /process/verbose
369 return verboseCmd->ConvertToString(theProcessTable->GetVerboseLevel());
370 }
371 else if ( command==listCmd )
372 {
373 // Command /process/list
374 return currentProcessTypeName;
375 }
376 else
377 {
378 // Command /process/dump, activate, inactivate
379 return (currentProcessName + " " + currentParticleName);
380 }
381
382 return "";
383}
384
385// --------------------------------------------------------------------
386G4String G4ProcessTableMessenger::GetProcessTypeName(G4ProcessType aType) const
387{
388 return G4VProcess::GetProcessTypeName(aType);
389}
390
391// --------------------------------------------------------------------
392G4int G4ProcessTableMessenger::GetProcessType(const G4String& aTypeName) const
393{
394 G4int type = -1;
395 for (G4int idx = 0; idx < NumberOfProcessType ; ++idx )
396 {
397 if (aTypeName == G4VProcess::GetProcessTypeName(G4ProcessType(idx)) )
398 {
399 type = idx;
400 break;
401 }
402 }
403 return type;
404}
405
406// --------------------------------------------------------------------
407void G4ProcessTableMessenger::SetNumberOfProcessType()
408{
409 G4bool isFoundEndMark = false;
410 G4int idx;
411 for (idx = 0; idx < 1000 ; ++idx )
412 {
414 isFoundEndMark = G4StrUtil::contains(typeName, "---");
415 if ( isFoundEndMark ) break;
416 }
417 if ( isFoundEndMark )
418 {
419 NumberOfProcessType = idx;
420 }
421 else
422 {
423 G4Exception("G4ProcessTableMessenger::SetNumberOfProcessType()",
424 "ProcMan014", FatalException, "No End Mark");
425 }
426}
@ G4State_EventProc
@ G4State_Init
@ G4State_Idle
@ G4State_GeomClosed
@ G4State_PreInit
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
G4ProcessType
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4bool contains(const G4ParticleDefinition *particle) const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
G4ProcessTableMessenger(G4ProcessTable *pTable)
virtual void SetNewValue(G4UIcommand *command, G4String newValues)
virtual G4String GetCurrentValue(G4UIcommand *command)
void DumpInfo(G4VProcess *process, const G4ParticleDefinition *particle=nullptr)
G4ProcNameVector * GetNameList()
G4int GetVerboseLevel() const
void SetProcessActivation(const G4String &processName, G4bool fActive)
G4ProcessVector * FindProcesses()
void SetVerboseLevel(G4int value)
std::vector< G4String > G4ProcNameVector
std::size_t length() const
void SetCandidates(const char *candidateList)
void SetParameterName(const char *theName, G4bool omittable, G4bool currentAsDefault=false)
void SetDefaultValue(const char *defVal)
void SetParameterName(const char *theName, G4bool omittable, G4bool currentAsDefault=false)
static G4int GetNewIntValue(const char *paramString)
void SetDefaultValue(G4int defVal)
static G4String ConvertToString(G4bool boolVal)
Definition: G4UIcommand.cc:446
void SetParameter(G4UIparameter *const newParameter)
Definition: G4UIcommand.hh:147
void SetGuidance(const char *aGuidance)
Definition: G4UIcommand.hh:157
void CommandFailed(G4int errCode, G4ExceptionDescription &ed)
Definition: G4UIcommand.hh:179
void SetRange(const char *rs)
Definition: G4UIcommand.hh:121
void AvailableForStates(G4ApplicationState s1)
Definition: G4UIcommand.cc:287
G4int ApplyCommand(const char *aCommand)
Definition: G4UImanager.cc:495
static G4UImanager * GetUIpointer()
Definition: G4UImanager.cc:77
void SetDefaultValue(const char *theDefaultValue)
static const G4String & GetProcessTypeName(G4ProcessType)
Definition: G4VProcess.cc:134
void SetVerboseLevel(G4int value)
Definition: G4VProcess.hh:416
G4ProcessType GetProcessType() const
Definition: G4VProcess.hh:392
const G4String & GetProcessName() const
Definition: G4VProcess.hh:386
G4bool contains(const G4String &str, std::string_view ss)
Check if a string contains a given substring.
#define G4ThreadLocal
Definition: tls.hh:77