Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4UImanager.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#include "G4UImanager.hh"
33#include "G4UIcommandTree.hh"
34#include "G4UIcommand.hh"
35#include "G4UIsession.hh"
36#include "G4UIbatch.hh"
38#include "G4UnitsMessenger.hh"
39#include "G4ios.hh"
40#include "G4strstreambuf.hh"
41#include "G4StateManager.hh"
42#include "G4UIaliasList.hh"
43#include "G4Tokenizer.hh"
44
45#include <sstream>
46#include <fstream>
47
48G4UImanager * G4UImanager::fUImanager = 0;
49G4bool G4UImanager::fUImanagerHasBeenKilled = false;
50
52{
53 if(!fUImanager)
54 {
55 if(!fUImanagerHasBeenKilled)
56 {
57 fUImanager = new G4UImanager;
58 fUImanager->CreateMessenger();
59 }
60 }
61 return fUImanager;
62}
63
65 : G4VStateDependent(true),
66 UImessenger(0), UnitsMessenger(0)
67{
68 savedCommand = 0;
69 treeTop = new G4UIcommandTree("/");
70 aliasList = new G4UIaliasList;
71 G4String nullString;
72 savedParameters = nullString;
73 verboseLevel = 0;
74 saveHistory = false;
75 session = NULL;
76 g4UIWindow = NULL;
77 SetCoutDestination(session);
78 pauseAtBeginOfEvent = false;
79 pauseAtEndOfEvent = false;
80 maxHistSize = 20;
81 searchPath="";
82}
83
84void G4UImanager::CreateMessenger()
85{
86 UImessenger = new G4UIcontrolMessenger;
87 UnitsMessenger = new G4UnitsMessenger;
88}
89
91{
93 histVec.clear();
94 if(saveHistory) historyFile.close();
95 delete UImessenger;
96 delete UnitsMessenger;
97 delete treeTop;
98 delete aliasList;
99 fUImanagerHasBeenKilled = true;
100 fUImanager = NULL;
101}
102
104 : G4VStateDependent(true)
105{
106 UImessenger = ui.UImessenger;
107 UnitsMessenger = ui.UnitsMessenger;
108 aliasList = ui.aliasList;
109 g4UIWindow = ui.g4UIWindow;
110 savedCommand= ui.savedCommand;
111 session = ui.session;
112 treeTop = ui.treeTop;
113}
114
115const G4UImanager & G4UImanager::operator=(const G4UImanager &right)
116{ return right; }
117G4int G4UImanager::operator==(const G4UImanager &right) const
118{ return (this==&right); }
119G4int G4UImanager::operator!=(const G4UImanager &right) const
120{ return (this!=&right); }
121
123{
124 G4String theCommand = aCommand;
125 savedCommand = treeTop->FindPath( theCommand );
126 if( savedCommand == NULL )
127 {
128 G4cerr << "command not found" << G4endl;
129 return G4String();
130 }
131 return savedCommand->GetCurrentValue();
132}
133
135G4int parameterNumber, G4bool reGet)
136{
137 if(reGet || savedCommand == NULL)
138 {
139 savedParameters = GetCurrentValues( aCommand );
140 }
141 G4Tokenizer savedToken( savedParameters );
142 G4String token;
143 for(G4int i_thParameter=0;i_thParameter<parameterNumber;i_thParameter++)
144 {
145 token = savedToken();
146 if( token.isNull() ) return G4String();
147 if( token[(size_t)0] == '"' )
148 {
149 token.append(" ");
150 token.append(savedToken("\""));
151 }
152 }
153 return token;
154}
155
157const char * aParameterName, G4bool reGet)
158{
159 if(reGet || savedCommand == NULL)
160 {
161 G4String parameterValues = GetCurrentValues( aCommand );
162 }
163 for(G4int i=0;i<savedCommand->GetParameterEntries();i++)
164 {
165 if( aParameterName ==
166 savedCommand->GetParameter(i)->GetParameterName() )
167 return GetCurrentStringValue(aCommand,i+1,false);
168 }
169 return G4String();
170}
171
173const char * aParameterName, G4bool reGet)
174{
175 G4String targetParameter =
176 GetCurrentStringValue( aCommand, aParameterName, reGet );
177 G4int value;
178 const char* t = targetParameter;
179 std::istringstream is(t);
180 is >> value;
181 return value;
182}
183
185G4int parameterNumber, G4bool reGet)
186{
187 G4String targetParameter =
188 GetCurrentStringValue( aCommand, parameterNumber, reGet );
189 G4int value;
190 const char* t = targetParameter;
191 std::istringstream is(t);
192 is >> value;
193 return value;
194}
195
197const char * aParameterName, G4bool reGet)
198{
199 G4String targetParameter =
200 GetCurrentStringValue( aCommand, aParameterName, reGet );
201 G4double value;
202 const char* t = targetParameter;
203 std::istringstream is(t);
204 is >> value;
205 return value;
206}
207
209G4int parameterNumber, G4bool reGet)
210{
211 G4String targetParameter =
212 GetCurrentStringValue( aCommand, parameterNumber, reGet );
213 G4double value;
214 const char* t = targetParameter;
215 std::istringstream is(t);
216 is >> value;
217 return value;
218}
219
221{
222 treeTop->AddNewCommand( newCommand );
223}
224
226{
227 treeTop->RemoveCommand( aCommand );
228}
229
230void G4UImanager::ExecuteMacroFile(const char * fileName)
231{
232 G4UIsession* batchSession = new G4UIbatch(fileName,session);
233 session = batchSession;
234 G4UIsession* previousSession = session->SessionStart();
235 delete session;
236 session = previousSession;
237}
238
239void G4UImanager::LoopS(const char* valueList)
240{
241 G4String vl = valueList;
242 G4Tokenizer parameterToken(vl);
243 G4String mf = parameterToken();
244 G4String vn = parameterToken();
245 G4String c1 = parameterToken();
246 c1 += " ";
247 c1 += parameterToken();
248 c1 += " ";
249 c1 += parameterToken();
250 const char* t1 = c1;
251 std::istringstream is(t1);
252 G4double d1;
253 G4double d2;
254 G4double d3;
255 is >> d1 >> d2 >> d3;
256 Loop(mf,vn,d1,d2,d3);
257}
258
259void G4UImanager::Loop(const char * macroFile,const char * variableName,
260 G4double initialValue,G4double finalValue,G4double stepSize)
261{
262 G4String cd;
263 if (stepSize > 0) {
264 for(G4double d=initialValue;d<=finalValue;d+=stepSize)
265 {
266 std::ostringstream os;
267 os << d;
268 cd += os.str();
269 cd += " ";
270 }
271 } else {
272 for(G4double d=initialValue;d>=finalValue;d+=stepSize)
273 {
274 std::ostringstream os;
275 os << d;
276 cd += os.str();
277 cd += " ";
278 }
279 }
280 Foreach(macroFile,variableName,cd);
281}
282
283void G4UImanager::ForeachS(const char* valueList)
284{
285 G4String vl = valueList;
286 G4Tokenizer parameterToken(vl);
287 G4String mf = parameterToken();
288 G4String vn = parameterToken();
289 G4String c1 = parameterToken();
290 G4String ca;
291 while(!((ca=parameterToken()).isNull()))
292 {
293 c1 += " ";
294 c1 += ca;
295 }
296 Foreach(mf,vn,c1);
297}
298
299void G4UImanager::Foreach(const char * macroFile,const char * variableName,
300 const char * candidates)
301{
302 G4String candidatesString = candidates;
303 G4Tokenizer parameterToken( candidatesString );
304 G4String cd;
305 while(!((cd=parameterToken()).isNull()))
306 {
307 G4String vl = variableName;
308 vl += " ";
309 vl += cd;
310 SetAlias(vl);
311 ExecuteMacroFile(macroFile);
312 }
313}
314
315
317{
318 G4String aCommand = aCmd;
319 G4int ia = aCommand.index("{");
320 G4int iz = aCommand.index("#");
321 while((ia != G4int(std::string::npos))&&((iz==G4int(std::string::npos))||(ia<iz)))
322 {
323 G4int ibx = -1;
324 while(ibx<0)
325 {
326 G4int ib = aCommand.index("}");
327 if( ib == G4int(std::string::npos) )
328 {
329 G4cerr << aCommand << G4endl;
330 for(G4int i=0;i<ia;i++) G4cerr << " ";
331 G4cerr << "^" << G4endl;
332 G4cerr << "Unmatched alias parenthis -- command ignored" << G4endl;
333 G4String nullStr;
334 return nullStr;
335 }
336 G4String ps = aCommand(ia+1,aCommand.length()-(ia+1));
337 G4int ic = ps.index("{");
338 G4int id = ps.index("}");
339 if(ic!=G4int(std::string::npos) && ic < id)
340 { ia+=ic+1; }
341 else
342 { ibx = ib; }
343 }
344 //--- Here ia represents the position of innermost "{"
345 //--- and ibx represents corresponding "}"
346 G4String subs;
347 if(ia>0) subs = aCommand(0,ia);
348 G4String alis = aCommand(ia+1,ibx-ia-1);
349 G4String rems = aCommand(ibx+1,aCommand.length()-ibx);
350 // G4cout << "<" << subs << "> <" << alis << "> <" << rems << ">" << G4endl;
351 G4String* alVal = aliasList->FindAlias(alis);
352 if(!alVal)
353 {
354 G4cerr << "Alias <" << alis << "> not found -- command ignored" << G4endl;
355 G4String nullStr;
356 return nullStr;
357 }
358 aCommand = subs+(*alVal)+rems;
359 ia = aCommand.index("{");
360 }
361 return aCommand;
362}
363
365{
366 return ApplyCommand(aCmd.data());
367}
368
370{
371 G4String aCommand = SolveAlias(aCmd);
372 if(aCommand.isNull()) return fAliasNotFound;
373 if(verboseLevel) G4cout << aCommand << G4endl;
374 G4String commandString;
375 G4String commandParameter;
376
377 G4int i = aCommand.index(" ");
378 if( i != G4int(std::string::npos) )
379 {
380 commandString = aCommand(0,i);
381 commandParameter = aCommand(i+1,aCommand.length()-(i+1));
382 }
383 else
384 {
385 commandString = aCommand;
386 }
387
388 // remove doubled slash
389 G4int len = commandString.length();
390 G4int ll = 0;
391 G4String a1;
392 G4String a2;
393 while(ll<len-1)
394 {
395 if(commandString(ll,2)=="//")
396 {
397 if(ll==0)
398 { commandString.remove(ll,1); }
399 else
400 {
401 a1 = commandString(0,ll);
402 a2 = commandString(ll+1,len-ll-1);
403 commandString = a1+a2;
404 }
405 len--;
406 }
407 else
408 { ll++; }
409 }
410
411 G4UIcommand * targetCommand = treeTop->FindPath( commandString );
412 if( targetCommand == NULL )
413 { return fCommandNotFound; }
414
415 if(!(targetCommand->IsAvailable()))
416 { return fIllegalApplicationState; }
417
418 if(saveHistory) historyFile << aCommand << G4endl;
419 if( G4int(histVec.size()) >= maxHistSize )
420 { histVec.erase(histVec.begin()); }
421 histVec.push_back(aCommand);
422 return targetCommand->DoIt( commandParameter );
423}
424
425void G4UImanager::StoreHistory(const char* fileName)
426{ StoreHistory(true,fileName); }
427
428void G4UImanager::StoreHistory(G4bool historySwitch,const char* fileName)
429{
430 if(historySwitch)
431 {
432 if(saveHistory)
433 { historyFile.close(); }
434 historyFile.open((char*)fileName);
435 saveHistory = true;
436 }
437 else
438 {
439 historyFile.close();
440 saveHistory = false;
441 }
442 saveHistory = historySwitch;
443}
444
445void G4UImanager::PauseSession(const char* msg)
446{
447 if(session) session->PauseSessionStart(msg);
448}
449
450void G4UImanager::ListCommands(const char* direct)
451{
452 G4UIcommandTree* comTree = FindDirectory(direct);
453 if(comTree)
454 { comTree->List(); }
455 else
456 { G4cout << direct << " is not found." << G4endl; }
457}
458
459G4UIcommandTree* G4UImanager::FindDirectory(const char* dirName)
460{
461 G4String aDirName = dirName;
462 G4String targetDir = aDirName.strip(G4String::both);
463 if( targetDir( targetDir.length()-1 ) != '/' )
464 { targetDir += "/"; }
465 G4UIcommandTree* comTree = treeTop;
466 if( targetDir == "/" )
467 { return comTree; }
468 G4int idx = 1;
469 while( idx < G4int(targetDir.length())-1 )
470 {
471 G4int i = targetDir.index("/",idx);
472 G4String targetDirString = targetDir(0,i+1);
473 comTree = comTree->GetTree(targetDirString);
474 if( comTree == NULL )
475 { return NULL; }
476 idx = i+1;
477 }
478 return comTree;
479}
480
482{
483 //G4cout << G4StateManager::GetStateManager()->GetStateString(requestedState) << " <--- " << G4StateManager::GetStateManager()->GetStateString(G4StateManager::GetStateManager()->GetPreviousState()) << G4endl;
484 if(pauseAtBeginOfEvent)
485 {
486 if(requestedState==G4State_EventProc &&
488 { PauseSession("BeginOfEvent"); }
489 }
490 if(pauseAtEndOfEvent)
491 {
492 if(requestedState==G4State_GeomClosed &&
494 { PauseSession("EndOfEvent"); }
495 }
496 return true;
497}
498
499//void G4UImanager::Interact()
500//{
501// Interact(G4String("G4> "));
502//}
503
504//void G4UImanager::Interact(const char * pC)
505//{
506// G4cerr << "G4UImanager::Interact() is out of date and is not used anymore." << G4endl;
507// G4cerr << "This method will be removed shortly!!!" << G4endl;
508// G4cerr << "In case of main() use" << G4endl;
509// G4cerr << " G4UIsession * session = new G4UIterminal;" << G4endl;
510// G4cerr << " session->SessionStart();" << G4endl;
511// G4cerr << "In other cases use" << G4endl;
512// G4cerr << " G4StateManager::GetStateManager()->Pause();" << G4endl;
513//}
514
515
516
518{
521}
522
523void G4UImanager::SetAlias(const char * aliasLine)
524{
525 G4String aLine = aliasLine;
526 G4int i = aLine.index(" ");
527 G4String aliasName = aLine(0,i);
528 G4String aliasValue = aLine(i+1,aLine.length()-(i+1));
529 if(aliasValue(0)=='"')
530 {
531 G4String strippedValue;
532 if(aliasValue(aliasValue.length()-1)=='"')
533 { strippedValue = aliasValue(1,aliasValue.length()-2); }
534 else
535 { strippedValue = aliasValue(1,aliasValue.length()-1); }
536 aliasValue = strippedValue;
537 }
538
539 aliasList->ChangeAlias(aliasName,aliasValue);
540}
541
542void G4UImanager::RemoveAlias(const char * aliasName)
543{
544 G4String aL = aliasName;
545 G4String targetAlias = aL.strip(G4String::both);
546 aliasList->RemoveAlias(targetAlias);
547}
548
550{
551 aliasList->List();
552}
553
554void G4UImanager::CreateHTML(const char* dir)
555{
556 G4UIcommandTree* tr = FindDirectory(dir);
557 if(tr!=0)
558 { tr->CreateHTML(); }
559 else
560 { G4cerr << "Directory <" << dir << "> is not found." << G4endl; }
561}
562
564{
565 searchDirs.clear();
566
567 size_t idxfirst = 0;
568 size_t idxend = 0;
569 G4String pathstring = "";
570 while( (idxend = searchPath.index(':', idxfirst)) != G4String::npos) {
571 pathstring = searchPath.substr(idxfirst, idxend-idxfirst);
572 if(pathstring.size() != 0) searchDirs.push_back(pathstring);
573 idxfirst = idxend + 1;
574 }
575
576 pathstring = searchPath.substr(idxfirst, searchPath.size()-idxfirst);
577 if(pathstring.size() != 0) searchDirs.push_back(pathstring);
578}
579
580
581static G4bool FileFound(const G4String& fname)
582{
583 G4bool qopen = false;
584 std::ifstream fs;
585 fs.open(fname.c_str(), std::ios::in);
586 if(fs.good()) {
587 fs.close();
588 qopen = true;
589 }
590 return qopen;
591}
592
594{
595 G4String macrofile = fname;
596
597 for (size_t i = 0; i < searchDirs.size(); i++) {
598 G4String fullpath = searchDirs[i] + "/" + fname;
599 if ( FileFound(fullpath) ) {
600 macrofile = fullpath;
601 break;
602 }
603 }
604
605 return macrofile;
606}
G4ApplicationState
@ G4State_EventProc
@ G4State_GeomClosed
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
@ fCommandNotFound
@ fAliasNotFound
@ fIllegalApplicationState
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
G4DLLIMPORT G4strstreambuf G4coutbuf
Definition: G4ios.cc:42
G4DLLIMPORT G4strstreambuf G4cerrbuf
Definition: G4ios.cc:43
static G4StateManager * GetStateManager()
G4String & remove(str_size)
G4String & append(const G4String &)
str_size index(const char *, G4int pos=0) const
G4bool isNull() const
G4String strip(G4int strip_Type=trailing, char c=' ')
const char * data() const
G4String * FindAlias(const char *aliasName)
void ChangeAlias(const char *aliasName, const char *aliasValue)
void RemoveAlias(const char *aliasName)
G4UIcommandTree * GetTree(G4int i)
void List() const
void RemoveCommand(G4UIcommand *aCommand)
G4UIcommand * FindPath(const char *commandPath) const
void AddNewCommand(G4UIcommand *newCommand)
G4UIparameter * GetParameter(G4int i) const
Definition: G4UIcommand.hh:140
virtual G4int DoIt(G4String parameterList)
Definition: G4UIcommand.cc:104
G4int GetParameterEntries() const
Definition: G4UIcommand.hh:138
G4bool IsAvailable()
Definition: G4UIcommand.cc:269
G4String GetCurrentValue()
Definition: G4UIcommand.cc:214
void SetCoutDestination(G4UIsession *const value)
Definition: G4UImanager.cc:517
void ForeachS(const char *valueList)
Definition: G4UImanager.cc:283
void Foreach(const char *macroFile, const char *variableName, const char *candidates)
Definition: G4UImanager.cc:299
G4int ApplyCommand(const char *aCommand)
Definition: G4UImanager.cc:369
void CreateHTML(const char *dir="/")
Definition: G4UImanager.cc:554
void Loop(const char *macroFile, const char *variableName, G4double initialValue, G4double finalValue, G4double stepSize=1.0)
Definition: G4UImanager.cc:259
G4int GetCurrentIntValue(const char *aCommand, G4int parameterNumber=1, G4bool reGet=true)
Definition: G4UImanager.cc:184
void LoopS(const char *valueList)
Definition: G4UImanager.cc:239
void StoreHistory(const char *fileName="G4history.macro")
Definition: G4UImanager.cc:425
void ListCommands(const char *direc)
Definition: G4UImanager.cc:450
G4double GetCurrentDoubleValue(const char *aCommand, G4int parameterNumber=1, G4bool reGet=true)
Definition: G4UImanager.cc:208
void ExecuteMacroFile(const char *fileName)
Definition: G4UImanager.cc:230
G4String GetCurrentStringValue(const char *aCommand, G4int parameterNumber=1, G4bool reGet=true)
Definition: G4UImanager.cc:134
void AddNewCommand(G4UIcommand *newCommand)
Definition: G4UImanager.cc:220
G4String GetCurrentValues(const char *aCommand)
Definition: G4UImanager.cc:122
virtual G4bool Notify(G4ApplicationState requestedState)
Definition: G4UImanager.cc:481
void SetAlias(const char *aliasLine)
Definition: G4UImanager.cc:523
G4String FindMacroPath(const G4String &fname) const
Definition: G4UImanager.cc:593
void RemoveAlias(const char *aliasName)
Definition: G4UImanager.cc:542
G4String SolveAlias(const char *aCmd)
Definition: G4UImanager.cc:316
void ListAlias()
Definition: G4UImanager.cc:549
void RemoveCommand(G4UIcommand *aCommand)
Definition: G4UImanager.cc:225
void ParseMacroSearchPath()
Definition: G4UImanager.cc:563
static G4UImanager * GetUIpointer()
Definition: G4UImanager.cc:51
G4String GetParameterName() const
virtual void PauseSessionStart(const G4String &Prompt)
Definition: G4UIsession.cc:40
virtual G4UIsession * SessionStart()
Definition: G4UIsession.cc:38
void SetDestination(G4coutDestination *dest)