Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4UIcommandTree.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#include "G4UIcommandTree.hh"
31#include "G4StateManager.hh"
32#include <fstream>
33#include "G4ios.hh"
34
36:guidance(NULL)
37{ }
38
39G4UIcommandTree::G4UIcommandTree(const char * thePathName)
40:guidance(NULL)
41{
42 pathName = thePathName;
43}
44
46{
47 G4int i;
48 G4int n_treeEntry = tree.size();
49 for( i=0; i < n_treeEntry; i++ )
50 { delete tree[i]; }
51}
52
54{
55 return ( pathName == right.GetPathName() );
56}
57
59{
60 return ( pathName != right.GetPathName() );
61}
62
64{
65 G4String commandPath = newCommand->GetCommandPath();
66 G4String remainingPath = commandPath;
67 remainingPath.remove(0,pathName.length());
68 if( remainingPath.isNull() )
69 {
70 guidance = newCommand;
71 return;
72 }
73 G4int i = remainingPath.first('/');
74 if( i == G4int(std::string::npos) )
75 {
76 // Find command
77 G4int n_commandEntry = command.size();
78 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
79 {
80 if( remainingPath == command[i_thCommand]->GetCommandName() )
81 { return; }
82 }
83 command.push_back( newCommand );
84 return;
85 }
86 else
87 {
88 // Find path
89 G4String nextPath = pathName;
90 nextPath.append(remainingPath(0,i+1));
91 G4int n_treeEntry = tree.size();
92 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
93 {
94 if( nextPath == tree[i_thTree]->GetPathName() )
95 {
96 tree[i_thTree]->AddNewCommand( newCommand );
97 return;
98 }
99 }
100 G4UIcommandTree * newTree = new G4UIcommandTree( nextPath );
101 tree.push_back( newTree );
102 newTree->AddNewCommand( newCommand );
103 return;
104 }
105}
106
108{
109 G4String commandPath = aCommand->GetCommandPath();
110 G4String remainingPath = commandPath;
111 remainingPath.remove(0,pathName.length());
112 if( remainingPath.isNull() )
113 {
114 guidance = NULL;
115 }
116 else
117 {
118 G4int i = remainingPath.first('/');
119 if( i == G4int(std::string::npos) )
120 {
121 // Find command
122 G4int n_commandEntry = command.size();
123 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
124 {
125 if( remainingPath == command[i_thCommand]->GetCommandName() )
126 {
127 command.erase(command.begin()+i_thCommand);
128 break;
129 }
130 }
131 }
132 else
133 {
134 // Find path
135 G4String nextPath = pathName;
136 nextPath.append(remainingPath(0,i+1));
137 G4int n_treeEntry = tree.size();
138 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
139 {
140 if( nextPath == tree[i_thTree]->GetPathName() )
141 {
142 tree[i_thTree]->RemoveCommand( aCommand );
143 G4int n_commandRemain = tree[i_thTree]->GetCommandEntry();
144 G4int n_treeRemain = tree[i_thTree]-> GetTreeEntry();
145 if(n_commandRemain == 0 && n_treeRemain == 0)
146 {
147 G4UIcommandTree * emptyTree = tree[i_thTree];
148 tree.erase(tree.begin()+i_thTree);
149 delete emptyTree;
150 }
151 break;
152 }
153 }
154 }
155 }
156}
157
158// L. Garnier 01.28.08 This function has not a good name. In fact, it try
159// to match a command name, not a path. It should be rename as FindCommandName
160
161G4UIcommand * G4UIcommandTree::FindPath(const char* commandPath) const
162{
163 G4String remainingPath = commandPath;
164 if( remainingPath.index( pathName ) == std::string::npos )
165 { return NULL; }
166 remainingPath.remove(0,pathName.length());
167 G4int i = remainingPath.first('/');
168 if( i == G4int(std::string::npos) )
169 {
170 // Find command
171 G4int n_commandEntry = command.size();
172 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
173 {
174 if( remainingPath == command[i_thCommand]->GetCommandName() )
175 { return command[i_thCommand]; }
176 }
177 }
178 else
179 {
180 // Find path
181 G4String nextPath = pathName;
182 nextPath.append(remainingPath(0,i+1));
183 G4int n_treeEntry = tree.size();
184 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
185 {
186 if( nextPath == tree[i_thTree]->GetPathName() )
187 { return tree[i_thTree]->FindPath( commandPath ); }
188 }
189 }
190 return NULL;
191}
192
193
194/**
195 * Try to match a command or a path with the one given.
196 * @commandPath : command or path to match
197 * @return the commandTree found or NULL if not
198 */
200{
201 G4String remainingPath = commandPath;
202 if( remainingPath.index( pathName ) == std::string::npos )
203 { return NULL; }
204 remainingPath.remove(0,pathName.length());
205 G4int i = remainingPath.first('/');
206 if( i != G4int(std::string::npos) )
207 {
208 // Find path
209 G4String nextPath = pathName;
210 nextPath.append(remainingPath(0,i+1));
211 G4int n_treeEntry = tree.size();
212 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
213 {
214 if (tree[i_thTree]->GetPathName() == commandPath) {
215 return tree[i_thTree];
216 }
217 else if( nextPath == tree[i_thTree]->GetPathName() ) {
218 return tree[i_thTree]->FindCommandTree( commandPath );
219 }
220 }
221 } else {
222 return this;
223 }
224 return NULL;
225}
226
228{
229 G4String pName = aCommandPath;
230 G4String remainingPath = aCommandPath;
231 G4String empty = "";
232 G4String matchingPath = empty;
233
234 // find the tree
235 G4int jpre= pName.last('/');
236 if(jpre != G4int(G4String::npos)) pName.remove(jpre+1);
237 G4UIcommandTree* aTree = FindCommandTree(pName);
238
239 if (!aTree) {
240 return empty;
241 }
242
243 if( pName.index( pName ) == std::string::npos ) return empty;
244
245 std::vector<G4String> paths;
246
247 // list matched directories/commands
248 G4String strtmp;
249 G4int nMatch= 0;
250
251 int Ndir= aTree-> GetTreeEntry();
252 int Ncmd= aTree-> GetCommandEntry();
253
254 // directory ...
255 for(G4int idir=1; idir<=Ndir; idir++) {
256 G4String fpdir= aTree-> GetTree(idir)-> GetPathName();
257 // matching test
258 if( fpdir.index(remainingPath, 0) == 0) {
259 if(nMatch==0) {
260 matchingPath = fpdir;
261 } else {
262 matchingPath = GetFirstMatchedString(fpdir,matchingPath);
263 }
264 nMatch++;
265 paths.push_back(fpdir);
266 }
267 }
268
269 if (paths.size()>=2) {
270 G4cout << "Matching directories :" << G4endl;
271 for( unsigned int i_thCommand = 0; i_thCommand < paths.size(); i_thCommand++ ) {
272 G4cout << paths[i_thCommand] << G4endl;
273 }
274 }
275
276 // command ...
277 std::vector<G4String> commands;
278
279 for(G4int icmd=1; icmd<=Ncmd; icmd++){
280 G4String fpcmd= aTree-> GetPathName() +
281 aTree-> GetCommand(icmd) -> GetCommandName();
282 // matching test
283 if( fpcmd.index(remainingPath, 0) ==0) {
284 if(nMatch==0) {
285 matchingPath= fpcmd + " ";
286 } else {
287 strtmp= fpcmd + " ";
288 matchingPath= GetFirstMatchedString(matchingPath, strtmp);
289 }
290 nMatch++;
291 commands.push_back(fpcmd+" ");
292 }
293 }
294
295 if (commands.size()>=2) {
296 G4cout << "Matching commands :" << G4endl;
297 for( unsigned int i_thCommand = 0; i_thCommand < commands.size(); i_thCommand++ ) {
298 G4cout << commands[i_thCommand] << G4endl;
299 }
300 }
301
302 return matchingPath;
303}
304
305
306////////////////////////////////////////////////////////////////////
307G4String G4UIcommandTree::GetFirstMatchedString(const G4String& str1,
308 const G4String& str2) const
309////////////////////////////////////////////////////////////////////
310{
311 int nlen1= str1.length();
312 int nlen2= str2.length();
313
314 int nmin = nlen1<nlen2 ? nlen1 : nlen2;
315
316 G4String strMatched;
317 for(size_t i=0; G4int(i)<nmin; i++){
318 if(str1[i]==str2[i]) {
319 strMatched+= str1[i];
320 } else {
321 break;
322 }
323 }
324
325 return strMatched;
326}
327
329{
330 G4cout << "Command directory path : " << pathName << G4endl;
331 if( guidance != NULL ) guidance->List();
332 G4cout << " Sub-directories : " << G4endl;
333 G4int n_treeEntry = tree.size();
334 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
335 {
336 G4cout << " " << tree[i_thTree]->GetPathName()
337 << " " << tree[i_thTree]->GetTitle() << G4endl;
338 }
339 G4cout << " Commands : " << G4endl;
340 G4int n_commandEntry = command.size();
341 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
342 {
343 G4cout << " " << command[i_thCommand]->GetCommandName()
344 << " * " << command[i_thCommand]->GetTitle() << G4endl;
345 }
346}
347
349{
350 G4cout << "Command directory path : " << pathName << G4endl;
351 if( guidance != NULL ) guidance->List();
352 G4int i = 0;
353 G4cout << " Sub-directories : " << G4endl;
354 G4int n_treeEntry = tree.size();
355 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
356 {
357 i++;
358 G4cout << " " << i << ") " << tree[i_thTree]->GetPathName()
359 << " " << tree[i_thTree]->GetTitle() << G4endl;
360 }
361 G4cout << " Commands : " << G4endl;
362 G4int n_commandEntry = command.size();
363 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
364 {
365 i++;
366 G4cout << " " << i << ") " << command[i_thCommand]->GetCommandName()
367 << " * " << command[i_thCommand]->GetTitle() << G4endl;
368 }
369}
370
372{
373 ListCurrent();
374 G4int n_commandEntry = command.size();
375 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
376 {
377 command[i_thCommand]->List();
378 }
379 G4int n_treeEntry = tree.size();
380 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
381 {
382 tree[i_thTree]->List();
383 }
384}
385
386G4String G4UIcommandTree::CreateFileName(const char* pName)
387{
388 G4String fn = pName;
389 G4int idxs;
390 while((idxs=fn.index("/"))!=G4int(std::string::npos))
391 { fn(idxs) = '_'; }
392 fn += ".html";
393 return fn;
394}
395
396G4String G4UIcommandTree::ModStr(const char* strS)
397{
398 G4String sx;
399 G4String str = strS;
400 for(G4int i=0;i<G4int(str.length());i++)
401 {
402 char c = str(i);
403 switch(c)
404 {
405 case '<':
406 sx += "&lt;"; break;
407 case '>':
408 sx += "&gt;"; break;
409 case '&':
410 sx += "&amp;"; break;
411 default:
412 sx += c;
413 }
414 }
415 return sx;
416}
417
419{
420 G4String ofileName = CreateFileName(pathName);
421 std::ofstream oF(ofileName, std::ios::out);
422
423 oF << "<html><head><title>Commands in " << ModStr(pathName) << "</title></head>" << G4endl;
424 oF << "<body bgcolor=\"#ffffff\"><h2>" << ModStr(pathName) << "</h2><p>" << G4endl;
425
426 if( guidance != NULL )
427 {
428 for(G4int i=0;i<guidance->GetGuidanceEntries();i++)
429 { oF << ModStr(guidance->GetGuidanceLine(i)) << "<br>" << G4endl; }
430 }
431
432 oF << "<p><hr><p>" << G4endl;
433
434 oF << "<h2>Sub-directories : </h2><dl>" << G4endl;
435 for( G4int i_thTree = 0; i_thTree < G4int(tree.size()); i_thTree++ )
436 {
437 oF << "<p><br><p><dt><a href=\"" << CreateFileName(tree[i_thTree]->GetPathName())
438 << "\">" << ModStr(tree[i_thTree]->GetPathName()) << "</a>" << G4endl;
439 oF << "<p><dd>" << ModStr(tree[i_thTree]->GetTitle()) << G4endl;
440 tree[i_thTree]->CreateHTML();
441 }
442
443 oF << "</dl><p><hr><p>" << G4endl;
444
445 oF << "<h2>Commands : </h2><dl>" << G4endl;
446 for( G4int i_thCommand = 0; i_thCommand < G4int(command.size()); i_thCommand++ )
447 {
448 G4UIcommand* cmd = command[i_thCommand];
449 oF << "<p><br><p><dt><b>" << ModStr(cmd->GetCommandName());
450 if(cmd->GetParameterEntries()>0)
451 {
452 for(G4int i_thParam=0;i_thParam<cmd->GetParameterEntries();i_thParam++)
453 { oF << " [<i>" << ModStr(cmd->GetParameter(i_thParam)->GetParameterName()) << "</i>]"; }
454 }
455 oF << "</b>" << G4endl;
456 oF << "<p><dd>" << G4endl;
457 for(G4int i=0;i<cmd->GetGuidanceEntries();i++)
458 { oF << ModStr(cmd->GetGuidanceLine(i)) << "<br>" << G4endl; }
459 if(!(cmd->GetRange()).isNull())
460 { oF << "<p><dd>Range : " << ModStr(cmd->GetRange()) << G4endl; }
461 std::vector<G4ApplicationState>* availabelStateList = cmd->GetStateList();
462 if(availabelStateList->size()==6)
463 { oF << "<p><dd>Available at all Geant4 states." << G4endl; }
464 else
465 {
466 oF << "<p><dd>Available Geant4 state(s) : ";
467 for(G4int ias=0;ias<G4int(availabelStateList->size());ias++)
468 { oF << G4StateManager::GetStateManager()->GetStateString((*availabelStateList)[ias]) << " " << G4endl; }
469 }
470 if(cmd->GetParameterEntries()>0)
471 {
472 oF << "<p><dd>Parameters<table border=1>" << G4endl;
473 for(G4int i_thParam=0;i_thParam<cmd->GetParameterEntries();i_thParam++)
474 {
475 G4UIparameter* prm = cmd->GetParameter(i_thParam);
476 oF << "<tr><td>" << ModStr(prm->GetParameterName()) << G4endl;
477 oF << "<td>type " << prm->GetParameterType() << G4endl;
478 oF << "<td>";
479 if(prm->IsOmittable())
480 {
481 oF << "Omittable : ";
482 if(prm->GetCurrentAsDefault())
483 { oF << "current value is used as the default value." << G4endl; }
484 else
485 { oF << "default value = " << prm->GetDefaultValue() << G4endl; }
486 }
487 oF << "<td>";
488 if(!(prm->GetParameterRange()).isNull())
489 { oF << "Parameter range : " << ModStr(prm->GetParameterRange()) << G4endl; }
490 else if(!(prm->GetParameterCandidates()).isNull())
491 { oF << "Parameter candidates : " << ModStr(prm->GetParameterCandidates()) << G4endl; }
492 }
493 oF << "</table>" << G4endl;
494 }
495
496 }
497
498 oF << "</dl></body></html>" << G4endl;
499 oF.close();
500}
501
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
static G4StateManager * GetStateManager()
G4String GetStateString(G4ApplicationState aState) const
G4String & remove(str_size)
G4String & append(const G4String &)
str_size index(const char *, G4int pos=0) const
G4bool isNull() const
G4int first(char) const
G4int last(char) const
G4int GetCommandEntry() const
G4int operator!=(const G4UIcommandTree &right) const
G4UIcommand * GetCommand(G4int i)
G4int GetTreeEntry() const
const G4String GetPathName() const
G4UIcommandTree * GetTree(G4int i)
void List() const
void RemoveCommand(G4UIcommand *aCommand)
G4int operator==(const G4UIcommandTree &right) const
G4UIcommandTree * FindCommandTree(const char *commandPath)
void ListCurrentWithNum() const
const G4String GetTitle() const
G4String CompleteCommandPath(const G4String &commandPath)
G4UIcommand * FindPath(const char *commandPath) const
void ListCurrent() const
void AddNewCommand(G4UIcommand *newCommand)
const G4String & GetGuidanceLine(G4int i) const
Definition: G4UIcommand.hh:132
G4UIparameter * GetParameter(G4int i) const
Definition: G4UIcommand.hh:140
G4int GetGuidanceEntries() const
Definition: G4UIcommand.hh:130
const G4String & GetCommandPath() const
Definition: G4UIcommand.hh:134
G4int GetParameterEntries() const
Definition: G4UIcommand.hh:138
std::vector< G4ApplicationState > * GetStateList()
Definition: G4UIcommand.hh:142
virtual void List()
Definition: G4UIcommand.cc:328
const G4String & GetCommandName() const
Definition: G4UIcommand.hh:136
const G4String & GetRange() const
Definition: G4UIcommand.hh:128
G4String GetParameterRange() const
G4String GetDefaultValue() const
G4bool IsOmittable() const
G4String GetParameterCandidates() const
G4bool GetCurrentAsDefault() const
char GetParameterType() const
G4String GetParameterName() const