Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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//
27// $Id$
28//
29//
30//---------------------------------------------------------------
31//
32// G4ProcessTableMessenger.cc
33//
34// Description:
35// This is a messenger class to interface to exchange information
36// between ProcessTable and UI.
37//
38//
39// History:
40// 15 Aug. 1998, H. Kurashige
41// Use STL vector instead of RW vector 1. Mar 00 H.Kurashige
42// 02 June 2006, add physicsModified in activate/inactivate (mma)
43//
44//---------------------------------------------------------------
45
47
48#include "G4UImanager.hh"
49#include "G4UIdirectory.hh"
52#include "G4UIcmdWithAString.hh"
53
54#include "G4VProcess.hh"
55#include "G4ProcessManager.hh"
56#include "G4ProcessTable.hh"
57#include "G4ParticleTable.hh"
58
59#include "G4ios.hh"
60#include "G4Tokenizer.hh"
61#include <iomanip>
62#include <sstream>
63
64/////////////////////////////////////////
65G4int G4ProcessTableMessenger::NumberOfProcessType = 10;
66
67//////////////////////////
69 :theProcessTable(pTable),
70 currentProcessTypeName("all"),
71 currentProcessName("all"),
72 currentParticleName("all")
73{
74 //Commnad /particle/process
75 thisDirectory = new G4UIdirectory("/process/");
76 thisDirectory->SetGuidance("Process Table control commands.");
77
78
79 //Commnad /particle/process/list
80 listCmd = new G4UIcmdWithAString("/process/list",this);
81 listCmd->SetGuidance("List up process names");
82 listCmd->SetGuidance(" list [type] ");
83 listCmd->SetGuidance(" type: process type [all:for all proceeses]");
84 listCmd->SetParameterName("type", true);
85 listCmd->SetDefaultValue("all");
86 SetNumberOfProcessType();
87
88 G4String candidates("all");
89 for (G4int idx = 0; idx < NumberOfProcessType ; idx ++ ) {
90 candidates += " " +
92 }
93 listCmd->SetCandidates((const char*)(candidates));
94
95 //Commnad /particle/process/Verbose
96 verboseCmd = new G4UIcmdWithAnInteger("/process/verbose",this);
97 verboseCmd->SetGuidance("Set Verbose Level for Process Table");
98 verboseCmd->SetGuidance(" verbose [level]");
99 verboseCmd->SetGuidance(" level: verbose level");
100 verboseCmd->SetParameterName("verbose", true);
101 verboseCmd->SetDefaultValue(1);
102 verboseCmd->SetRange("verbose >=0");
104
105 //Commnad /particle/process/setVerbose
106 procVerboseCmd = new G4UIcommand("/process/setVerbose",this);
107 procVerboseCmd->SetGuidance("Set verbose level for processes");
108 procVerboseCmd->SetGuidance(" setVerbose level [type or name] ");
109 procVerboseCmd->SetGuidance(" level: verbose level ");
110 procVerboseCmd->SetGuidance(" name : process name ");
111 procVerboseCmd->SetGuidance(" type : process type ");
112 procVerboseCmd->SetGuidance(" [all] for all proceeses ");
113 G4UIparameter* param = new G4UIparameter("verbose",'i',false);
114 procVerboseCmd->SetParameter(param);
115 param = new G4UIparameter("type",'s',true);
116 param->SetDefaultValue("all");
117 procVerboseCmd->SetParameter(param);
119
120 //Commnad /particle/process/dump
121 dumpCmd = new G4UIcommand("/process/dump",this);
122 dumpCmd->SetGuidance("Dump process information");
123 dumpCmd->SetGuidance(" dump name [particle]");
124 dumpCmd->SetGuidance(" name: process name or type name");
125 dumpCmd->SetGuidance(" particle: particle name [all: for all particles]");
126 param = new G4UIparameter("procName",'s',false);
127 dumpCmd->SetParameter(param);
128 param = new G4UIparameter("particle",'s',true);
129 param->SetDefaultValue("all");
130 dumpCmd->SetParameter(param);
132
133 //Commnad /particle/process/activate
134 activateCmd = new G4UIcommand("/process/activate",this);
135 activateCmd->SetGuidance("Activate processes ");
136 activateCmd->SetGuidance(" Activate name [particle]");
137 activateCmd->SetGuidance(" name: process name or type name");
138 activateCmd->SetGuidance(" particle: particle name [all: for all particles]");
139 param = new G4UIparameter("procName",'s',false);
140 activateCmd->SetParameter(param);
141 param = new G4UIparameter("particle",'s',true);
142 param->SetDefaultValue("all");
143 activateCmd->SetParameter(param);
145
146 //Commnad /particle/process/inactivate
147 inactivateCmd = new G4UIcommand("/process/inactivate",this);
148 inactivateCmd->SetGuidance("Inactivate process ");
149 inactivateCmd->SetGuidance("Inactivate processes ");
150 inactivateCmd->SetGuidance(" Inactivate name [particle]");
151 inactivateCmd->SetGuidance(" name: process name or type name");
152 inactivateCmd->SetGuidance(" particle: particle name [all: for all particles]");
153 param = new G4UIparameter("procName",'s',false);
154 inactivateCmd->SetParameter(param);
155 param = new G4UIparameter("particle",'s',true);
156 param->SetDefaultValue("all");
157 inactivateCmd->SetParameter(param);
159}
160
161//////////////////
163{
164 delete activateCmd;
165 delete inactivateCmd;
166 delete verboseCmd;
167 delete dumpCmd;
168 delete listCmd;
169 delete procVerboseCmd;
170 delete thisDirectory;
171}
172
173///////////////
175{
176 G4ProcessTable::G4ProcNameVector* procNameVector
177 = theProcessTable->GetNameList();
178 G4int idx;
179
180 G4int type = -1;
181
182 if( command == listCmd ){
183 //Commnad /process/list
184 type = -1;
185 if (newValue == "all") {
186 currentProcessTypeName = newValue;
187 } else {
188 type = GetProcessType(newValue);
189 if (type <0) {
190 G4cout << " illegal type !!! " << G4endl;
191 } else {
192 currentProcessTypeName = newValue;
193 }
194 }
195 G4int counter = 0;
196 idx =0;
197 G4ProcessTable::G4ProcNameVector::iterator itr;
198 for (itr=procNameVector->begin(); itr!=procNameVector->end(); ++itr) {
199 idx +=1;
200 G4ProcessVector* tmpVector = theProcessTable->FindProcesses(*itr);
201 if ( (type <0) || ( ((*tmpVector)(0)->GetProcessType()) == type) ) {
202 if ( counter%4 != 0) G4cout << ",";
203 G4cout << std::setw(19) <<*itr;
204 if ((counter++)%4 == 3) {
205 G4cout << G4endl;
206 }
207 }
208 delete tmpVector;
209 }
210 G4cout << G4endl;
211 //Commnad /process/list
212
213 } else if( command==procVerboseCmd ) {
214 //Commnad /process/setVerbose
215 G4Tokenizer next( newValue );
216
217 // check 1st argument
218 G4String tmpS = G4String(next());
219 // inputstream for newValues
220 const char* temp = (const char*)(tmpS);
221 std::istringstream is((char*)temp);
222 G4int level;
223 is >>level;
224
225 // check 2nd argument
226 currentProcessTypeName = G4String(next());
227 if (currentProcessTypeName.isNull()) currentProcessTypeName = "all";
228 G4bool isProcName = false;
229 G4bool isAll = false;
230 type = -1;
231
232 if (currentProcessTypeName == "all") {
233 isAll = true;
234 } else {
235 type = GetProcessType(currentProcessTypeName);
236 if (type<0) {
237 isProcName = true;
238 currentProcessName = currentProcessTypeName;
239 currentProcessTypeName = "";
240 }
241 }
242 idx =0;
243 G4ProcessTable::G4ProcNameVector::iterator itr;
244 for (itr=procNameVector->begin(); itr!=procNameVector->end(); ++itr) {
245 idx +=1;
246 G4ProcessVector* tmpVector = theProcessTable->FindProcesses(*itr);
247 G4VProcess* p = (*tmpVector)(0);
248 if ( isAll ||
249 (!isProcName && ( p->GetProcessType() == type) ) ||
250 ( isProcName && ( p->GetProcessName()== currentProcessName) ) ){
251 p->SetVerboseLevel(level);
252 }
253 delete tmpVector;
254 }
255 //Commnad /process/setVerbose
256
257 } else if( command==verboseCmd ) {
258 //Commnad /process/verbose
259 theProcessTable->SetVerboseLevel(verboseCmd->GetNewIntValue(newValue));
260 //Commnad /process/verbose
261
262 } else {
263 G4Tokenizer next( newValue );
264
265 // check 1st argument
266 currentProcessName = G4String(next());
267 G4bool isProcName = false;
268 G4ProcessTable::G4ProcNameVector::iterator itr;
269 for (itr=procNameVector->begin(); itr!=procNameVector->end(); ++itr) {
270 if ( (*itr) == currentProcessName ) {
271 isProcName = true;
272 break;
273 }
274 }
275 if (!isProcName) {
276 type = GetProcessType(currentProcessName);
277 if (type <0 ) {
278 // no processes with specifed name
279 G4cout << " illegal process (or type) name " << G4endl;
280 currentProcessName = "";
281 return;
282 }
283 }
284
285 // check 2nd argument
286 currentParticleName = G4String(next());
287 G4bool isParticleFound = false;
288 G4ParticleDefinition* currentParticle = 0;
289 if ( currentParticleName == "all" ) {
290 isParticleFound = true;
291
292 } else {
293 isParticleFound = G4ParticleTable::GetParticleTable()->contains(currentParticleName);
294 if (isParticleFound) {
295 currentParticle = G4ParticleTable::GetParticleTable()->FindParticle(currentParticleName);
296 }
297
298 }
299
300 if ( !isParticleFound ) {
301 // no particle with specifed name
302 G4cout << " illegal particle name " << G4endl;
303 currentParticleName = "";
304 return;
305 }
306
307 if( command==dumpCmd ) {
308 // process/dump
309 G4ProcessVector* tmpVector;
310 if (isProcName) {
311 tmpVector = theProcessTable->FindProcesses(currentProcessName);
312 } else {
313 tmpVector = theProcessTable->FindProcesses(G4ProcessType(type));
314 }
315 for (G4int i=0; i<tmpVector->length(); i++) {
316 theProcessTable->DumpInfo( (*tmpVector)(i), currentParticle );
317 }
318 delete tmpVector;
319 // process/dump
320
321 } else if ( (command==activateCmd) || (command==inactivateCmd)) {
322 // process/activate , inactivate
323 G4bool fActive = (command==activateCmd);
324 if (isProcName) {
325 if ( currentParticle == 0 ) {
326 theProcessTable->SetProcessActivation(currentProcessName,
327 fActive);
328 } else {
329 theProcessTable->SetProcessActivation(currentProcessName,
330 currentParticle,
331 fActive);
332 }
333 } else {
334 if ( currentParticle == 0 ) {
335 theProcessTable->SetProcessActivation(G4ProcessType(type),
336 fActive);
337 } else {
338 theProcessTable->SetProcessActivation(G4ProcessType(type),
339 currentParticle,
340 fActive);
341 }
342 }
343 G4UImanager::GetUIpointer()->ApplyCommand("/run/physicsModified");
344 // process/activate , inactivate
345 }
346 }
347}
348
349
350//////////////////
352{
353 G4ProcessTable::G4ProcNameVector* procNameVector
354 = theProcessTable->GetNameList();
355
356 G4String candidates;
357 G4String returnValue('\0');
358
359 std::ostringstream os;
360 G4UIparameter * param;
361
362 G4int idx;
363
364 if( command==verboseCmd ){
365 //Commnad /process/verbose
366 os << theProcessTable->GetVerboseLevel();
367 returnValue = os.str();
368
369 } else if ( command==listCmd ){
370 //Commnad /process/list
371 candidates = "all";
372 for (idx = 0; idx < NumberOfProcessType ; idx ++ ) {
373 candidates += " " +
375 }
376 listCmd->SetCandidates((const char*)(candidates));
377 returnValue = currentProcessTypeName;
378
379 } else {
380 //Commnad /process/dump, activate, inactivate
381 // process name
382 param = command->GetParameter(0);
383 candidates = "";
384 G4ProcessTable::G4ProcNameVector::iterator itr;
385 for (itr=procNameVector->begin(); itr!=procNameVector->end(); ++itr) {
386 candidates += " " + (*itr);
387 }
388 param->SetParameterCandidates((const char*)(candidates));
389 // particle name
390 param = command->GetParameter(1);
391 candidates = "all";
394 piter -> reset();
395 while( (*piter)() ){
396 G4ParticleDefinition *particle = piter->value();
397 candidates += " " + particle->GetParticleName();
398 }
399 param->SetParameterCandidates((const char*)(candidates));
400
401 returnValue = currentProcessName + " " + currentParticleName;
402
403 }
404
405 return returnValue;
406}
407
408/////////////////
409G4String G4ProcessTableMessenger::GetProcessTypeName(G4ProcessType aType) const
410{
411 return G4VProcess::GetProcessTypeName(aType);
412}
413
414/////////////////
415G4int G4ProcessTableMessenger::GetProcessType(const G4String& aTypeName) const
416{
417 G4int type = -1;
418 for (G4int idx = 0; idx < NumberOfProcessType ; idx ++ ) {
419 if (aTypeName == G4VProcess::GetProcessTypeName(G4ProcessType(idx)) ) {
420 type = idx;
421 break;
422 }
423 }
424 return type;
425}
426
427
428/////////////////
429void G4ProcessTableMessenger::SetNumberOfProcessType()
430{
431 G4bool isFoundEndMark = false;
432 G4int idx;
433 for (idx = 0; idx < 1000 ; idx ++ ) {
435 isFoundEndMark = typeName.contains("---");
436 if ( isFoundEndMark ) break;
437 }
438 if ( isFoundEndMark ) {
439 NumberOfProcessType = idx;
440 } else {
441 G4Exception("G4ProcessTableMessenger::SetNumberOfProcessType()","ProcMan014",
442 FatalException,"No End Mark");
443 }
444}
445
446
447
448
@ G4State_EventProc
@ G4State_Init
@ G4State_Idle
@ G4State_GeomClosed
@ G4State_PreInit
@ FatalException
G4ProcessType
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
const G4String & GetParticleName() const
G4PTblDicIterator * GetIterator()
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
G4bool contains(const G4ParticleDefinition *particle)
G4ProcessTableMessenger(G4ProcessTable *pTable)
virtual void SetNewValue(G4UIcommand *command, G4String newValues)
virtual G4String GetCurrentValue(G4UIcommand *command)
void DumpInfo(G4VProcess *process, G4ParticleDefinition *particle=0)
G4ProcNameVector * GetNameList()
G4int GetVerboseLevel() const
std::vector< G4String > G4ProcNameVector
void SetProcessActivation(const G4String &processName, G4bool fActive)
G4ProcessVector * FindProcesses()
void SetVerboseLevel(G4int value)
G4int length() const
G4bool isNull() const
G4bool contains(const std::string &) 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)
G4UIparameter * GetParameter(G4int i) const
Definition: G4UIcommand.hh:140
void SetParameter(G4UIparameter *const newParameter)
Definition: G4UIcommand.hh:147
void SetGuidance(const char *aGuidance)
Definition: G4UIcommand.hh:156
void SetRange(const char *rs)
Definition: G4UIcommand.hh:120
void AvailableForStates(G4ApplicationState s1)
Definition: G4UIcommand.cc:219
G4int ApplyCommand(const char *aCommand)
Definition: G4UImanager.cc:369
static G4UImanager * GetUIpointer()
Definition: G4UImanager.cc:51
void SetDefaultValue(const char *theDefaultValue)
void SetParameterCandidates(const char *theString)
static const G4String & GetProcessTypeName(G4ProcessType)
Definition: G4VProcess.cc:150
void SetVerboseLevel(G4int value)
Definition: G4VProcess.hh:408
G4ProcessType GetProcessType() const
Definition: G4VProcess.hh:385
const G4String & GetProcessName() const
Definition: G4VProcess.hh:379
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41