Geant4_10
G4UserPhysicsListMessenger.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: G4UserPhysicsListMessenger.cc 71799 2013-06-24 14:45:59Z gcosmo $
28 //
29 //
30 //---------------------------------------------------------------
31 //
32 // G4UserPhysicsListMessenger.cc
33 // ------------------------------------------------------------
34 // History
35 // first version 09 Jan. 1998 by H.Kurashige
36 // add buildPhysicsTable command 13 Apr. 1999 by H.Kurashige
37 // add setStoredInAscii command 12 Mar. 2001 by H.Kurashige
38 // add dumpOrderingParam command 3 May. 2011 by H.Kurashige
39 // ------------------------------------------------------------
40 
41 #include <sstream>
42 
44 
45 #include "G4SystemOfUnits.hh"
46 #include "G4VUserPhysicsList.hh"
47 #include "G4PhysicsListHelper.hh"
48 #include "G4UIdirectory.hh"
50 #include "G4UIcmdWithAnInteger.hh"
52 #include "G4UIcmdWithAString.hh"
53 #include "G4ParticleTable.hh"
54 #include "G4ios.hh"
55 #include "G4Tokenizer.hh"
56 
57 G4UserPhysicsListMessenger::G4UserPhysicsListMessenger(G4VUserPhysicsList* pParticleList):thePhysicsList(pParticleList)
58 {
59  G4UIparameter* param = 0;
60  // /run/particle directory
61  theDirectory = new G4UIdirectory("/run/particle/");
62  theDirectory->SetGuidance("Commands for G4VUserPhysicsList.");
63 
64  // /run/particle/Verbose command
65  verboseCmd = new G4UIcmdWithAnInteger("/run/particle/verbose",this);
66  verboseCmd->SetGuidance("Set the Verbose level of G4VUserPhysicsList.");
67  verboseCmd->SetGuidance(" 0 : Silent (default)");
68  verboseCmd->SetGuidance(" 1 : Display warning messages");
69  verboseCmd->SetGuidance(" 2 : Display more");
70  verboseCmd->SetParameterName("level",true);
71  verboseCmd->SetDefaultValue(0);
72  verboseCmd->SetRange("level >=0 && level <=3");
73 
74  // /run/setCut command
75  setCutCmd = new G4UIcmdWithADoubleAndUnit("/run/setCut",this);
76  setCutCmd->SetGuidance("Set default cut value ");
77  setCutCmd->SetParameterName("cut",false);
78  setCutCmd->SetDefaultValue(1.0);
79  setCutCmd->SetRange("cut >=0.0");
80  setCutCmd->SetDefaultUnit("mm");
82 
83  // /run/setCutForAGivenParticle command
84  setCutForAGivenParticleCmd = new G4UIcommand("/run/setCutForAGivenParticle",this) ;
85  setCutForAGivenParticleCmd->SetGuidance("Set a cut value to a specific particle ") ;
86  setCutForAGivenParticleCmd->SetGuidance("Usage: /run/setCutForAGivenParticle gamma 1. mm") ;
87  param = new G4UIparameter("particleName",'s',false) ;
88  param->SetParameterCandidates("e- e+ gamma proton");
89  setCutForAGivenParticleCmd->SetParameter(param) ;
90  param = new G4UIparameter("cut",'d',false) ;
91  param->SetDefaultValue("1.") ;
92  param->SetParameterRange("cut>=0.0") ;
93  setCutForAGivenParticleCmd->SetParameter(param) ;
94  param = new G4UIparameter("unit",'s',false) ;
95  param->SetDefaultValue("mm") ;
96  setCutForAGivenParticleCmd->SetParameter(param) ;
97  setCutForAGivenParticleCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
98 
99  // /run/getCutForAGivenParticle command
100  getCutForAGivenParticleCmd = new G4UIcmdWithAString("/run/getCutForAGivenParticle",this) ;
101  getCutForAGivenParticleCmd->SetGuidance("Get a cut value to a specific particle ") ;
102  getCutForAGivenParticleCmd->SetGuidance("Usage: /run/getCutForAGivenParticle gamma ") ;
103  getCutForAGivenParticleCmd->SetParameterName("particleName",false,false) ;
104  getCutForAGivenParticleCmd->SetCandidates("e- e+ gamma proton");
106 
107  // /run/setCutForRegion command
108  setCutRCmd = new G4UIcommand("/run/setCutForRegion",this);
109  setCutRCmd->SetGuidance("Set cut value for a region");
110  param = new G4UIparameter("Region",'s',false);
111  setCutRCmd->SetParameter(param);
112  param = new G4UIparameter("cut",'d',false);
113  param->SetParameterRange("cut >=0.0");
114  setCutRCmd->SetParameter(param);
115  param = new G4UIparameter("Unit",'s',true);
116  param->SetDefaultValue("mm");
117  param->SetParameterCandidates(setCutRCmd->UnitsList(setCutRCmd->CategoryOf("mm")));
118  setCutRCmd->SetParameter(param);
119  setCutRCmd->AvailableForStates(G4State_Idle);
120 
121  // /run/particle/DumpList command
122  dumpListCmd = new G4UIcmdWithoutParameter("/run/particle/dumpList",this);
123  dumpListCmd->SetGuidance("Dump List of particles in G4VUserPhysicsList. ");
124 
125  // /run/particle/addProcManager command
126  addProcManCmd = new G4UIcmdWithAString("/run/particle/addProcManager", this);
127  addProcManCmd->SetToBeBroadcasted(false);
128  addProcManCmd->SetGuidance("add process manager to specified particle type");
129  addProcManCmd->SetParameterName("particleType", true);
130  addProcManCmd->SetDefaultValue("");
132 
133  // /run/particle/buildPhysicsTable command
134  buildPTCmd = new G4UIcmdWithAString("/run/particle/buildPhysicsTable", this);
135  buildPTCmd->SetGuidance("build physics table of specified particle type");
136  buildPTCmd->SetParameterName("particleType", true);
137  buildPTCmd->SetDefaultValue("");
139 
140  // /run/particle/storePhysicsTable command
141  storeCmd = new G4UIcmdWithAString("/run/particle/storePhysicsTable",this);
142  storeCmd->SetGuidance("Store Physics Table");
143  storeCmd->SetGuidance(" Enter directory name");
144  storeCmd->SetParameterName("dirName",true);
145  storeCmd->SetDefaultValue("");
146  storeCmd->AvailableForStates(G4State_Idle);
147 
148  // /run/particle/retrievePhysicsTable command
149  retrieveCmd = new G4UIcmdWithAString("/run/particle/retrievePhysicsTable",this);
150  retrieveCmd->SetGuidance("Retrieve Physics Table");
151  retrieveCmd->SetGuidance(" Enter directory name or OFF to switch off");
152  retrieveCmd->SetParameterName("dirName",true);
153  retrieveCmd->SetDefaultValue("");
155 
156  // /run/particle/setStoredInAscii command
157  asciiCmd = new G4UIcmdWithAnInteger("/run/particle/setStoredInAscii",this);
158  asciiCmd->SetGuidance("Switch on/off ascii mode in store/retreive Physics Table");
159  asciiCmd->SetGuidance(" Enter 0(binary) or 1(ascii)");
160  asciiCmd->SetParameterName("ascii",true);
161  asciiCmd->SetDefaultValue(0);
163  asciiCmd->SetRange("ascii ==0 || ascii ==1");
164 
165  //Commnad /run/particle/applyCuts command
166  applyCutsCmd = new G4UIcommand("/run/particle/applyCuts",this);
167  applyCutsCmd->SetGuidance("Set applyCuts flag for a particle.");
168  applyCutsCmd->SetGuidance(" Some EM processes which do not have infrared divergence");
169  applyCutsCmd->SetGuidance("may generate gamma, e- and/or e+ with kinetic energies");
170  applyCutsCmd->SetGuidance("below the production threshold. By setting this flag,");
171  applyCutsCmd->SetGuidance("such secondaries below threshold are eliminated and");
172  applyCutsCmd->SetGuidance("kinetic energies of such secondaries are accumulated");
173  applyCutsCmd->SetGuidance("to the energy deposition of their mother.");
174  applyCutsCmd->SetGuidance(" Note that 'applyCuts' makes sense only for gamma,");
175  applyCutsCmd->SetGuidance("e- and e+. If this command is issued for other particle,");
176  applyCutsCmd->SetGuidance("a warning message is displayed and the command is");
177  applyCutsCmd->SetGuidance("ignored.");
178  applyCutsCmd->SetGuidance(" If particle name is 'all', this command affects on");
179  applyCutsCmd->SetGuidance("gamma, e- and e+.");
180  param = new G4UIparameter("Flag",'s',true);
181  param->SetDefaultValue("true");
182  applyCutsCmd->SetParameter(param);
183  param = new G4UIparameter("Particle",'s',true);
184  param->SetDefaultValue("all");
185  applyCutsCmd->SetParameter(param);
187 
188  // /run/particle/dumpCutValues command
189  dumpCutValuesCmd = new G4UIcmdWithAString("/run/particle/dumpCutValues",this);
190  dumpCutValuesCmd->SetGuidance("Dump a list of production threshold values in range and energy");
191  dumpCutValuesCmd->SetGuidance("for all registered material-cuts-couples.");
192  dumpCutValuesCmd->SetGuidance("Dumping a list takes place when you issue 'beamOn' and");
193  dumpCutValuesCmd->SetGuidance("actual conversion tables from range to energy are available.");
194  dumpCutValuesCmd->SetGuidance("If you want a list 'immediately', use '/run/dumpRegion' for threshold");
195  dumpCutValuesCmd->SetGuidance("list given in gange only. Also, '/run/dumpCouples' gives you the");
196  dumpCutValuesCmd->SetGuidance("current list if you have already issued 'run/beamOn' at least once.");
197  dumpCutValuesCmd->SetParameterName("particle",true);
198  dumpCutValuesCmd->SetDefaultValue("all");
199  dumpCutValuesCmd->AvailableForStates(G4State_Idle);
200 
201  // /run/particle/dumpCutValues command
202  dumpOrdParamCmd = new G4UIcmdWithAnInteger("/run/particle/dumpOrderingParam",this);
203  dumpOrdParamCmd->SetGuidance("Dump a list of ordering parameter ");
204  dumpOrdParamCmd->SetParameterName("subtype",true);
205  dumpOrdParamCmd->SetDefaultValue(-1);
207 }
208 
210 {
211  delete setCutCmd;
212  delete setCutRCmd;
213  delete setCutForAGivenParticleCmd;
214  delete getCutForAGivenParticleCmd;
215  delete verboseCmd;
216  delete dumpListCmd;
217  delete addProcManCmd;
218  delete buildPTCmd;
219  delete storeCmd;
220  delete retrieveCmd;
221  delete asciiCmd;
222  delete applyCutsCmd;
223  delete dumpCutValuesCmd;
224  delete dumpOrdParamCmd;
225  delete theDirectory;
226 }
227 
229 {
230  if( command==setCutCmd ){
231  G4double newCut = setCutCmd->GetNewDoubleValue(newValue);
234 
235  } else if( command==setCutForAGivenParticleCmd ){
236  G4String particleName, unit ; G4double cut ;
237  std::istringstream str (newValue) ;
238  str >> particleName >> cut >> unit ;
239  thePhysicsList->SetCutValue(cut*G4UIcommand::ValueOf(unit), particleName) ;
240 
241  } else if( command==getCutForAGivenParticleCmd ){
242  G4cout << thePhysicsList->GetCutValue(newValue)/mm <<"[mm]" << G4endl ;
243 
244  } else if( command==setCutRCmd ){
245  std::istringstream is(newValue);
246  G4String regName;
247  G4String uniName;
248  G4double cVal = -1.0;
249  is >> regName >> cVal >> uniName;
250  if (is.fail()) {
251  G4cout << "illegal arguments : try again " << G4endl;
252  return;
253  }
254  thePhysicsList->SetCutsForRegion(cVal*(setCutRCmd->ValueOf(uniName)),regName);
255 
256  } else if( command==verboseCmd ) {
257  thePhysicsList->SetVerboseLevel(verboseCmd->GetNewIntValue(newValue));
258 
259  } else if( command==dumpListCmd ){
261 
262  } else if( command==dumpOrdParamCmd ){
263  G4int stype = dumpOrdParamCmd->GetNewIntValue(newValue);
265 
266  } else if( command == addProcManCmd ){
267  G4ParticleDefinition* particle = (G4ParticleTable::GetParticleTable())->FindParticle(newValue);
268  if (particle == 0) return;
269  if (particle->GetProcessManager() != 0) return;
271 
272  } else if( command == buildPTCmd ){
273  G4ParticleDefinition* particle = (G4ParticleTable::GetParticleTable())->FindParticle(newValue);
274  if (particle == 0) return;
277 
278  } else if ( command == storeCmd ){
280 
281  } else if( command == retrieveCmd ) {
282  if ((newValue == "OFF") || (newValue == "off") ){
284  } else {
286  }
287 
288  } else if( command == asciiCmd ) {
289  if (asciiCmd->GetNewIntValue(newValue) == 0) {
291  } else {
293  }
294 
295  } else if( command == applyCutsCmd ) {
296  G4Tokenizer next( newValue );
297 
298  // check 1st argument
299  G4String temp = G4String(next());
300  G4bool flag = (temp =="true" || temp=="TRUE");
301 
302  // check 2nd argument
303  G4String name = G4String(next());
304 
305  thePhysicsList->SetApplyCuts(flag, name);
306 
307  } else if( command == dumpCutValuesCmd ) {
309 
310  }
311 }
312 
314 {
315  G4String cv;
316  G4String candidates("none");
318 
319  if( command==setCutCmd ) {
320  cv = setCutCmd->ConvertToString( thePhysicsList->GetDefaultCutValue(), "mm" );
321 
322  } else if( command==verboseCmd ){
323  cv = verboseCmd->ConvertToString(thePhysicsList->GetVerboseLevel());
324 
325  } else if( command== addProcManCmd ){
326  // set candidate list
327  piter -> reset();
328  while( (*piter)() ){
329  G4ParticleDefinition *particle = piter->value();
330  candidates += " " + particle->GetParticleName();
331  }
332  addProcManCmd->SetCandidates(candidates);
333  cv = "";
334 
335  } else if( command== buildPTCmd ){
336  // set candidate list
337  piter -> reset();
338  while( (*piter)() ){
339  G4ParticleDefinition *particle = piter->value();
340  candidates += " " + particle->GetParticleName();
341  }
342  addProcManCmd->SetCandidates(candidates);
343  cv = "";
344 
345  } else if ( command == storeCmd ){
347 
348  }else if( command == retrieveCmd ) {
351  } else {
352  cv = "OFF";
353  }
354 
355  } else if( command==asciiCmd ){
357  cv = "1";
358  } else {
359  cv = "0";
360  }
361 
362 // } else if( command == applyCutsCmd ) {
363 // if (thePhysicsList->GetApplyCuts("gamma")){
364 // cv = "true";
365 // } else {
366 // cv = "false";
367 // }
368  }
369 
370  return cv;
371 }
G4double GetCutValue(const G4String &pname) const
void SetParameterName(const char *theName, G4bool omittable, G4bool currentAsDefault=false)
void SetDefaultCutValue(G4double newCutValue)
void SetParameter(G4UIparameter *const newParameter)
Definition: G4UIcommand.hh:152
void SetApplyCuts(G4bool value, const G4String &name)
void SetCutValue(G4double aCut, const G4String &pname)
void SetParameterName(const char *theName, G4bool omittable, G4bool currentAsDefault=false)
static G4int GetNewIntValue(const char *paramString)
void PreparePhysicsTable(G4ParticleDefinition *)
void SetParameterRange(const char *theRange)
void SetParameterCandidates(const char *theString)
const G4String & GetPhysicsTableDirectory() const
void SetToBeBroadcasted(G4bool val)
Definition: G4UIcommand.hh:184
void SetDefaultValue(const char *theDefaultValue)
static G4String ConvertToString(G4bool boolVal)
Definition: G4UIcommand.cc:357
const XML_Char * name
Definition: expat.h:151
void SetCutsForRegion(G4double aCut, const G4String &rname)
static G4double GetNewDoubleValue(const char *paramString)
G4ProcessManager * GetProcessManager() const
int G4int
Definition: G4Types.hh:78
const G4String & GetParticleName() const
G4int GetVerboseLevel() const
void DumpOrdingParameterTable(G4int subType=-1) const
void SetPhysicsTableRetrieved(const G4String &directory="")
void DumpCutValuesTable(G4int flag=1)
void AddProcessManager(G4ParticleDefinition *newParticle, G4ProcessManager *newManager=0)
G4double GetDefaultCutValue() const
G4GLOB_DLL std::ostream G4cout
static G4String UnitsList(const char *unitCategory)
Definition: G4UIcommand.cc:306
bool G4bool
Definition: G4Types.hh:79
virtual void SetNewValue(G4UIcommand *command, G4String newValues)
void SetRange(const char *rs)
Definition: G4UIcommand.hh:125
void SetGuidance(const char *aGuidance)
Definition: G4UIcommand.hh:161
void SetVerboseLevel(G4int value)
G4bool IsPhysicsTableRetrieved() const
void AvailableForStates(G4ApplicationState s1)
Definition: G4UIcommand.cc:225
G4bool StorePhysicsTable(const G4String &directory=".")
static G4ParticleTable * GetParticleTable()
void SetDefaultValue(const char *defVal)
static G4double ValueOf(const char *unitName)
Definition: G4UIcommand.cc:294
void SetDefaultUnit(const char *defUnit)
static G4PhysicsListHelper * GetPhysicsListHelper()
G4bool IsStoredInAscii() const
void SetCandidates(const char *candidateList)
#define G4endl
Definition: G4ios.hh:61
virtual G4String GetCurrentValue(G4UIcommand *command)
void SetDefaultValue(G4int defVal)
double G4double
Definition: G4Types.hh:76
static G4String CategoryOf(const char *unitName)
Definition: G4UIcommand.cc:301
void SetParameterName(const char *theName, G4bool omittable, G4bool currentAsDefault=false)