BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
BDSExecOptions.cc
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) Royal Holloway,
3University of London 2001 - 2022.
4
5This file is part of BDSIM.
6
7BDSIM is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published
9by the Free Software Foundation version 3 of the License.
10
11BDSIM is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with BDSIM. If not, see <http://www.gnu.org/licenses/>.
18*/
19#include "BDSExecOptions.hh"
20
21#include <cstdlib>
22#include <getopt.h>
23#include <iomanip>
24#include <string>
25
26#include "globals.hh" // geant4 types / globals
27
28#include "BDSDebug.hh"
29#include "BDSColourFromMaterial.hh"
30#include "BDSColours.hh"
31#include "BDSMaterials.hh"
32#include "BDSOutputLoader.hh"
33#include "BDSUtilities.hh"
34
35#include "parser/beam.h"
36#include "parser/getEnv.h"
37#include "parser/options.h"
38
39BDSExecOptions::BDSExecOptions(int argc, char **argv):
40 options(GMAD::Options()),
41 beam(GMAD::Beam()),
42 ignoreSIGINT(false)
43{
44 if (argc == 1)
45 {// require at least 1 executable option (--file) - else print help message
46 Usage();
47 exit(0);
48 }
49 Parse(argc, argv);
50
52 std::string bp = GetPath(options.inputFileName);
53 options.set_value("bdsimPath", bp);
54#ifdef BDSDEBUG
55 G4cout << __METHOD_NAME__ << "BDSIMPATH set to: " << options.bdsimPath << G4endl;
56#endif
57
58 if (options.recreate)
59 {
60 G4cout << __METHOD_NAME__ << "Recreation mode. Loading options from recreate file:\n\""
61 << options.recreateFileName << "\"\n" << G4endl;
62 bool runBatch = options.batch;
64 GMAD::Options recreateOptions = loader.Options();
65 GMAD::Beam recreateBeam = loader.Beam();
66 // Give precedence to exec options - only ones that have been set.
67 recreateOptions.Amalgamate(options, true);
68 recreateBeam.Amalgamate(beam, true, options.startFromEvent);
69 options = recreateOptions; // Now replace member.
70 options.batch = runBatch; // override batch flag to allow control
71 beam = recreateBeam;
72 }
73}
74
75void BDSExecOptions::Parse(int argc, char **argv)
76{
77 static struct option LongOptions[] = {{ "help" , 0, 0, 0 },
78 { "reference", 0, 0, 0},
79 { "citation", 0, 0, 0},
80 { "version", 0, 0, 0 },
81 { "versionGit", 0, 0, 0 },
82 { "verbose", 0, 0, 0 },
83 { "verbose_step", 0, 0, 0 }, // old
84 { "verboseSteppingBDSIM", 0, 0, 0 }, // new
85 { "verbose_event", 0, 0, 0 }, // old
86 { "verboseEventBDSIM", 0, 0, 0 }, // new
87 { "verbose_event_num", 1, 0, 0 }, // old
88 { "verboseEventNumber", 1, 0, 0 }, // new
89 { "verboseEventStart", 1, 0, 0 },
90 { "verboseEventContinueFor", 1, 0, 0 },
91 { "verbose_G4run", 1, 0, 0 }, // old
92 { "verboseRunLevel", 1, 0, 0}, // new
93 { "verbose_G4event", 1, 0, 0 }, // old
94 { "verboseEventLevel", 1, 0, 0}, // new
95 { "verbose_G4tracking", 1, 0, 0 }, // old
96 { "verboseTrackingLevel", 1, 0, 0 }, // new
97 { "verbose_G4stepping", 1, 0, 0 },
98 { "verboseSteppingLevel", 1, 0, 0 },
99 { "verboseSteppingEventStart", 1, 0, 0 },
100 { "verboseSteppingEventContinueFor", 1, 0, 0 },
101 { "verboseSteppingPrimaryOnly", 0, 0, 0 },
102 { "file", 1, 0, 0 },
103 { "distrFile", 1, 0, 0 },
104 { "distrFileNLinesSkip", 1, 0, 0 },
105 { "E0", 1, 0, 0},
106 { "P0", 1, 0, 0},
107 { "Ek0", 1, 0, 0},
108 { "vis_debug", 0, 0, 0 },
109 { "vis_mac", 1, 0, 0 },
110 { "geant4Macro", 1, 0, 0 }, // old
111 { "geant4MacroFileName", 1, 0, 0 },
112 { "geant4PhysicsMacroFileName", 1, 0, 0 },
113 { "output", 1, 0, 0 },
114 { "outfile", 1, 0, 0 },
115 { "batch", 0, 0, 0 },
116 { "colours", 0, 0, 0 },
117 { "materials", 0, 0, 0 },
118 { "circular", 0, 0, 0 },
119 { "seed", 1, 0, 0},
120 { "recreate", 1, 0, 0},
121 { "startFromEvent", 1, 0, 0},
122 { "writeSeedState", 0, 0, 0},
123 { "seedState", 1, 0, 0},
124 { "seedStateFileName", 1, 0, 0},
125 { "survey", 1, 0, 0 },
126 { "ngenerate", 1, 0, 0 },
127 { "nGenerate", 1, 0, 0 },
128 { "nturns", 1, 0, 0 },
129 { "nTurns", 1, 0, 0 },
130 { "printFractionEvents", 1, 0, 0},
131 { "printFractionTurns", 1, 0, 0},
132 { "printPhysicsProcesses", 0, 0, 0},
133 { "exportGeometryTo", 1, 0, 0 },
134 { "generatePrimariesOnly", 0, 0, 0 },
135 { "ignoresigint", 0, 0, 0},
136 { 0, 0, 0, 0 }};
137
138 int OptionIndex = 0;
139 int OptionNumber = 0;
140 const char* optionName;
141 // number conversion check
142 bool conversion = true;
143 for (;;)
144 {
145 OptionIndex = 0;
146
147 // see e.g. http://linux.die.net/man/3/getopt
148 int c = getopt_long(argc, argv, "Vv",
149 LongOptions, &OptionIndex );
150
151 if (c == -1) // end of options list
152 {break;}
153
154 switch (c)
155 {
156 case '?': // unrecognised option
157 {
158 G4cout << "invalid option for command " << argv[0] << G4endl << G4endl << G4endl;
159 Usage();
160 exit(1);
161 break;
162 }
163 case 0:
164 {
165 OptionNumber++;
166 optionName = LongOptions[OptionIndex].name;
167 if ( !strcmp(optionName , "help") )
168 {
169 Usage();
170 exit(0);
171 }
172 else if ( !strcmp(optionName, "reference") || !strcmp(optionName, "citation") )
173 {
175 exit(0);
176 }
177 else if ( !strcmp(optionName, "version") )
178 {
179 G4cout << "@BDSIM_VERSION@" << G4endl;
180 exit(0);
181 }
182 else if ( !strcmp(optionName, "versionGit") )
183 {
184 G4cout << "@BDSIM_VERSION@ based on git commit SHA1: @VERSION_SHA1@" << G4endl;
185 exit(0);
186 }
187 else if ( !strcmp(optionName , "batch") )
188 {options.set_value("batch",true);}
189 else if ( !strcmp(optionName , "verbose") )
190 {options.set_value("verbose", true);}
191 else if ( !strcmp(optionName , "verbose_step") || !strcmp(optionName , "verboseSteppingBDSIM"))
192 {// we shouldn't have verbose steps without (minimally) verbose events
193 options.set_value("verboseSteppingBDSIM", true);
194 options.set_value("verboseEventBDSIM", true);
195 }
196 else if ( !strcmp(optionName , "verbose_event") || !strcmp(optionName, "verboseEventBDSIM") )
197 {options.set_value("verboseEventBDSIM", true);}
198 else if ( !strcmp(optionName , "verbose_event_num") || !strcmp(optionName , "verboseEventNumber"))
199 {
200 int result = -1;
201 conversion = BDS::IsInteger(optarg, result);
202 options.set_value("verboseEventStart", result);
203 options.set_value("verboseEventContinueFor", 1);
204 }
205 else if ( !strcmp(optionName , "verboseEventStart") )
206 {
207 int result = 0;
208 conversion = BDS::IsInteger(optarg, result);
209 options.set_value("verboseEventStart", result);
210 }
211 else if ( !strcmp(optionName , "verboseEventContinueFor") )
212 {
213 int result = 0;
214 conversion = BDS::IsInteger(optarg, result);
215 options.set_value("verboseEventContinueFor", result);
216 }
217 else if ( !strcmp(optionName , "verbose_G4run") || !strcmp(optionName , "verboseRunLevel") )
218 {
219 int result = 0;
220 conversion = BDS::IsInteger(optarg, result);
221 options.set_value("verboseRunLevel", result);
222 }
223 else if ( !strcmp(optionName , "verbose_G4event") || !strcmp(optionName , "verboseEventLevel") )
224 {
225 int result = 0;
226 conversion = BDS::IsInteger(optarg, result);
227 options.set_value("verboseEventLevel", result);
228 }
229 else if ( !strcmp(optionName , "verbose_G4tracking") || !strcmp(optionName , "verboseTrackingLevel") )
230 {
231 int result = 0;
232 conversion = BDS::IsInteger(optarg, result);
233 options.set_value("verboseTrackingLevel", result);
234 }
235 else if ( !strcmp(optionName , "verbose_G4stepping") || !strcmp(optionName , "verboseSteppingLevel"))
236 {
237 int result = 0;
238 conversion = BDS::IsInteger(optarg, result);
239 options.set_value("verboseSteppingLevel", result);
240 }
241 else if ( !strcmp(optionName , "verboseSteppingEventStart") )
242 {
243 int result = 0;
244 conversion = BDS::IsInteger(optarg, result);
245 options.set_value("verboseSteppingEventStart", result);
246 }
247 else if ( !strcmp(optionName , "verboseSteppingEventContinueFor") )
248 {
249 int result = 0;
250 conversion = BDS::IsInteger(optarg, result);
251 options.set_value("verboseSteppingEventContinueFor", result);
252 }
253 else if ( !strcmp(optionName , "verboseSteppingPrimaryOnly") )
254 {options.set_value("verboseSteppingPrimaryOnly", true);}
255 else if ( !strcmp(optionName , "output") )
256 {options.set_value("outputFormat", std::string(optarg));}
257 else if ( !strcmp(optionName , "outfile") )
258 {options.set_value("outputFileName", std::string(optarg));}
259 else if ( !strcmp(optionName , "survey") )
260 {
261 options.set_value("surveyFileName", std::string(optarg));
262 options.set_value("survey", true);
263 }
264 else if ( !strcmp(optionName , "file") )
265 {options.set_value("inputFileName", std::string(optarg));}
266 else if ( !strcmp(optionName, "distrFile") )
267 {// build absolute path
268 beam.set_value("distrFile", std::string(optarg));
269 beam.set_value("distrFileFromExecOptions", true);
270 }
271 else if ( !strcmp(optionName, "distrFileNLinesSkip") )
272 {
273 int result = 0;
274 conversion = BDS::IsInteger(optarg, result);
275 beam.set_value("nlinesSkip", result);
276 }
277 else if (!strcmp(optionName, "E0") )
278 {
279 double result = 1;
280 conversion = BDS::IsNumber(optarg, result);
281 beam.set_value("E0", result);
282 }
283 else if (!strcmp(optionName, "P0") )
284 {
285 double result = 1;
286 conversion = BDS::IsNumber(optarg, result);
287 beam.set_value("P0", result);
288 }
289 else if (!strcmp(optionName, "Ek0") )
290 {
291 double result = 1;
292 conversion = BDS::IsNumber(optarg, result);
293 beam.set_value("Ek0", result);
294 }
295 else if ( !strcmp(optionName, "vis_debug") )
296 {options.set_value("visDebug", true);}
297 else if ( !strcmp(optionName, "vis_mac") )
298 {options.set_value("visMacroFileName", std::string(optarg));}
299 else if ( !strcmp(optionName, "geant4Macro") || !strcmp(optionName, "genat4MacroFileName") )
300 {options.set_value("geant4MacroFileName", std::string(optarg));}
301 else if ( !strcmp(optionName, "geant4PhysicsMacroFileName") )
302 {
303 options.set_value("geant4PhysicsMacroFileName", std::string(optarg));
304 options.set_value("geant4PhysicsMacroFileNameFromExecOptions", true);
305 }
306 else if ( !strcmp(optionName, "colours") )
307 {
308 BDSColourFromMaterial::Instance(); // force construction of extra colours
310 exit(0);// return after printing colour list
311 }
312 else if ( !strcmp(optionName, "materials") )
313 {
315 exit(0);// return after printing material list
316 }
317 else if ( !strcmp(optionName, "circular") )
318 {options.set_value("circular", true);}
319 else if ( !strcmp(optionName, "seed") )
320 {
321 int result = -1;
322 conversion = BDS::IsInteger(optarg, result);
323 options.set_value("seed", result);
324 }
325 else if ( !strcmp(optionName, "recreate") )
326 {
327 options.set_value("recreate", true);
328 options.set_value("recreateFileName", std::string(optarg));
329 }
330 else if ( !strcmp(optionName, "startFromEvent") )
331 {
332 int result = 0;
333 conversion = BDS::IsInteger(optarg, result);
334 options.set_value("startFromEvent", result);
335 }
336 else if ( !strcmp(optionName, "writeSeedState") )
337 {options.set_value("writeSeedState", true);}
338 else if ( !strcmp(optionName, "seedState") || !strcmp(optionName, "seedStateFileName"))
339 {
340 options.set_value("useASCIISeedState", true);
341 options.set_value("seedStateFileName", std::string(optarg));
342 }
343 else if ( !strcmp(optionName, "ngenerate") || !strcmp(optionName, "nGenerate"))
344 {
345 int result = 1;
346 conversion = BDS::IsInteger(optarg, result);
347 options.set_value("ngenerate", result);
348 beam.set_value("matchDistrFileLength", false); // ngenerate overrides.
349 }
350 else if ( !strcmp(optionName, "nturns") || !strcmp(optionName, "nTurns"))
351 {
352 int result = 1;
353 conversion = BDS::IsInteger(optarg, result);
354 options.set_value("nturns", result);
355 }
356 else if ( !strcmp(optionName, "printFractionEvents") )
357 {
358 double result = 1;
359 conversion = BDS::IsNumber(optarg, result);
360 options.set_value("printFractionEvents", result);
361 }
362 else if ( !strcmp(optionName, "printFractionTurns") )
363 {
364 double result = 1;
365 conversion = BDS::IsNumber(optarg, result);
366 options.set_value("printFractionTurns", result);
367 }
368 else if ( !strcmp(optionName, "printPhysicsProcesses") )
369 {options.set_value("printPhysicsProcesses", true);}
370 else if ( !strcmp(optionName, "generatePrimariesOnly") )
371 {options.set_value("generatePrimariesOnly", true);}
372 else if ( !strcmp(optionName, "ignoresigint") )
373 {ignoreSIGINT = true;}
374 else if ( !strcmp(optionName, "exportGeometryTo") )
375 {// TODO - this should be put into geometry classes
376 std::string fn = optarg;
377 if (fn.substr(fn.find_last_of(".") + 1) == "gdml")
378 {
379 options.set_value("exportType", std::string("gdml"));
380 options.set_value("exportFileName", fn);
381 }
382 else
383 {
384 G4cerr << __METHOD_NAME__ << "Unknown geometry format \""
385 << fn.substr(fn.find_last_of(".") + 1) << "\"\n"
386 << "Please specify a valid filename extension - options are: \"gdml\"" << G4endl;
387 exit(1);
388 }
389 options.set_value("exportGeometry", true);
390 }
391 // remember if you extend this to do it also in the usage print out
392
393 if (conversion == false)
394 {
395 // conversion from character string to number went wrong, exit
396 G4cerr << __METHOD_NAME__ << "Conversion to number (or integer) went wrong for \""
397 << optionName << "\" with value: \"" << optarg << "\"" << G4endl;
398 exit(1);
399 }
400
401 break;
402 }
403 default:
404 {
405 G4cout << "WARNING unknown returned character code " << c << G4endl;
406 break;
407 }
408 }
409 }
410 // there should be no remaining options
411 if (OptionNumber < argc - 1)
412 {
413 G4cout << __METHOD_NAME__ << "there are remaining unknown options: " << G4endl;
414 for (int i=1; i<argc; i++)
415 {
416 // options with '-' are ignored by getopt_long, other unknown options are covered
417 if (strncmp(argv[i], "-", 1))
418 {G4cout << "\"" << argv[i] << "\"" << G4endl;}
419 }
420
421 G4cout << "Please check your command line arguments" << G4endl;
422 exit(1);
423 }
424 }
425
427{
428 G4cout<<"Usage: bdsim [options]" << G4endl;
429 G4cout<<"Note options are case sensitive." << G4endl;
430 G4cout<<"bdsim --help : display this message" << G4endl;
431 G4cout<<"Options (alphabetically):" << G4endl;
432 G4cout<<"--file=<filename> : specify the input file " << G4endl
433 <<"--batch : batch mode - no graphics" << G4endl
434 <<"--reference or --citation : print the citation information then quit" << G4endl
435 <<"--circular : assume circular machine - turn control" << G4endl
436 <<"--colours : list available colours included in bdsim" << G4endl
437 <<" by default" << G4endl
438 <<"--exportGeometryTo=<filename.extension> : export the fully constructed geometry" << G4endl
439 <<" to a file. Only gdml extension supported." << G4endl
440 <<"--E0=N : set E0 for the bunch for this run (GeV only)" << G4endl
441 <<"--Ek0=N : set Ek0 for the bunch for this run (GeV only)" << G4endl
442 <<"--geant4MacroFileName=<filename> : macro run after visualisation" << G4endl
443 <<"--geant4PhysicsMacroFileName=<filename> : physics macro file name" << G4endl
444 <<"--generatePrimariesOnly : generate N primary particle coordinates" << G4endl
445 <<" without simulation then quit" << G4endl
446 <<"--materials : list materials included in bdsim by default" << G4endl
447 <<"--ngenerate=N : the number of primary events to simulate:" << G4endl
448 <<" overrides ngenerate option in the input gmad file" << G4endl
449 <<"--nturns=N : the number of turns to simulate:" << G4endl
450 <<" overrides nturns option in the input gmad file" << G4endl
451 <<"--output=<fmt> : output format (rootevent|none), default rootevent" << G4endl
452 <<"--outfile=<file> : output file name. Will be appended with _N" << G4endl
453 <<" where N = 0, 1, 2, 3... etc." << G4endl
454 <<"--printFractionEvents=N : fraction of events to print out (default 0.1)" << G4endl
455 <<" -1 is all, range [0-1]" << G4endl
456 <<"--printFractionTurns=N : fraction of turns to print out (default 0.2)" << G4endl
457 <<" -1 is all, range [0-1]" << G4endl
458 <<"--printPhysicsProcesses : print out every particle registered and all " << G4endl
459 <<" their processes - depends on physics list in input"<< G4endl
460 <<"--P0=N : set P0 for the bunch for this run (GeV only)" << G4endl
461 <<"--recreate=<file> : the rootevent file to recreate events from" << G4endl
462 <<"--seed=N : the seed to use for the random number generator" << G4endl
463 <<"--seedStateFileName=<file> : use this ASCII file seed state to run an event" << G4endl
464 <<"--startFromEvent=N : event offset to start from when recreating events" << G4endl
465 <<"--survey=<file> : print survey info to <file>" << G4endl
466 <<"--verbose : display general parameters before run" << G4endl
467 <<"--verboseRunLevel=N : set Geant4 verbosity at run level [0:5]" << G4endl
468 <<"--verboseEventLevel=N : set Geant4 event manager verbosity level" << G4endl
469 <<"--verboseEventStart=N : display tracking information from event number N" << G4endl
470 <<"--verboseEventContinueFor=N : number of events to continue verbose event info for" << G4endl
471 <<"--verboseTrackingLevel=N : set Geant4 verbosity about new tracks." << G4endl
472 <<"--verboseSteppingLevel=N : set Geant4 Stepping manager verbosity level [0:5]" << G4endl
473 <<"--verboseSteppingEventStart=N : event to start verbose stepping." << G4endl
474 <<"--verboseSteppingEventContinueFor=N : number of events to continue verbose stepping" << G4endl
475 <<" information for" << G4endl
476 <<"--verboseSteppingPrimaryOnly : only print out verbose stepping for primary particle" << G4endl
477 <<"--verboseEventBDSIM : display BDSIM information for every event " << G4endl
478 <<"--verboseSteppingBDSIM : display BDSIM tracking information after each step"<< G4endl
479 <<"--version : display version number" << G4endl
480 <<"--versionGit : display version number including git commit SHA1" << G4endl
481 <<"--vis_debug : display all volumes in visualiser" << G4endl
482 <<"--vis_mac=<file> : file with the visualisation macro script, default" << G4endl
483 <<" provided by BDSIM openGL (OGLSQt))" << G4endl
484 <<"--writeseedstate : write an ASCII file seed state for each event" << G4endl;
485}
486
488{
489 // Print header & program information
490 G4cout<<"BDSIM : version @BDSIM_VERSION@"<<G4endl;
491 G4cout<<" (C) 2001-@CURRENT_YEAR@ Royal Holloway University London - GPLv3" << G4endl;
492 G4cout<<G4endl;
493 G4cout<<" Reference: Computer Physics Communications, 107200 (2020)" << G4endl;
494 G4cout<<" https://doi.org/10.1016/j.cpc.2020.107200" << G4endl;
495 G4cout<<" https://arxiv.org/abs/1808.10745" << G4endl;
496 G4cout<<" Website: http://www.pp.rhul.ac.uk/bdsim"<<G4endl;
497 G4cout<<G4endl;
498}
499
501{
502 G4cout << "BDSIM: An accelerator tracking code with particle-matter interactions." << G4endl;
503 G4cout << "L.J. Nevay et al., Computer Physics Communications, 1070200 (2020)" << G4endl;
504 G4cout << "https://doi.org/10.1016/j.cpc.2020.107200" << G4endl << G4endl;
505 G4cout << R"(@article{NEVAY2020107200,)" << G4endl;
506 G4cout << R"(title = {BDSIM: An accelerator tracking code with particle–matter interactions},)" << G4endl;
507 G4cout << R"(journal = {Computer Physics Communications},)" << G4endl;
508 G4cout << R"(volume = {252},)" << G4endl;
509 G4cout << R"(pages = {107200},)" << G4endl;
510 G4cout << R"(year = {2020},)" << G4endl;
511 G4cout << R"(issn = {0010-4655},)" << G4endl;
512 G4cout << R"(doi = {https://doi.org/10.1016/j.cpc.2020.107200},)" << G4endl;
513 G4cout << R"(url = {https://www.sciencedirect.com/science/article/pii/S0010465520300400},)" << G4endl;
514 G4cout << R"(author = {L.J. Nevay and S.T. Boogert and J. Snuverink and A. Abramov and L.C. Deacon and H. Garcia-Morales and H. Lefebvre and S.M. Gibson and R. Kwee-Hinzmann and W. Shields and S.D. Walker},)" << G4endl;
515 G4cout << R"(})" << G4endl;
516}
517
519{
520 for (const auto& key : options.KeysOfSetValues())
521 {G4cout << "Executable option> " << std::setw(27) << std::left << key << ": " << std::setw(15) << std::left << options.get_value_string(key) << G4endl;}
522 for (const auto& key : beam.KeysOfSetValues())
523 {G4cout << "Executable option> " << std::setw(27) << std::left << key << ": " << std::setw(15) << std::left << beam.get_value_string(key) << G4endl;}
524}
525
526G4String BDSExecOptions::GetPath(G4String fileName)
527{
528 // Set fullPath to mirror what is done in parser.l (i.e. if no environment
529 // variable set, assume base filename path is that of the gmad file).
530 G4String fullPath = getEnv("BDSIMPATH");
531#ifdef BDSDEBUG
532 G4cout << __METHOD_NAME__ << "filename = " << fileName << G4endl;
533#endif
534 if (fullPath.empty())
535 {
536 G4String inputFilepath = "";
537 // get the path part of the supplied path to the main input file
538 G4String::size_type found = fileName.rfind("/"); // find the last '/'
539 if (found != G4String::npos)
540 {inputFilepath = fileName.substr(0,found);} // the path is the bit before that
541 // else remains empty string
542 // need to know whether it's an absolute or relative path
543 if ((fileName.substr(0,1)) == "/")
544 {// the main file has an absolute path
545 fullPath = inputFilepath;
546 }
547 else
548 {
549 G4String curDir = BDS::GetCurrentDir();
550 fullPath = curDir + "/" + inputFilepath;
551 }
552 }
553
554 if (fullPath.back() != '/') // ensure ends in '/'
555 {fullPath += "/";} // only add if needed
556#ifdef BDSDEBUG
557 G4cout << __METHOD_NAME__ << "fullpath = " << fullPath << G4endl;
558#endif
559 return fullPath;
560}
static BDSColourFromMaterial * Instance()
Singleton pattern.
static BDSColours * Instance()
singleton pattern
Definition: BDSColours.cc:33
void Print()
Definition: BDSColours.cc:179
GMAD::Options options
The options instance that is populated by parsing the command line options.
GMAD::Beam beam
The beam instance that is populated by parsing some command line options.
void Print() const
Print out the commands and their set values.
void PrintCitation() const
Print academic citation information.
G4bool ignoreSIGINT
Whether to ignore Ctrl-C or not - used for ctest.
void Usage() const
Print out the available executable commands (no exit).
void PrintCopyright() const
Print out the copyright information (no exit).
void Parse(int argc, char **argv)
G4String GetPath(G4String filename)
Helper method to set the BDSIMPath correctly.
BDSExecOptions()
Private default constructor to force use of provided one.
static BDSMaterials * Instance()
Singleton pattern access.
Definition: BDSMaterials.cc:38
void ListMaterials() const
output available materials
Loader of ROOT Event output for recreating events.
Beam loader.
Definition: Beam.hh:37
Beam class.
Definition: beam.h:44
void Amalgamate(const Beam &optionsIn, bool override, int startFromEvent=0)
Definition: beam.cc:97
void set_value(std::string name, T value)
set methods by property name
Definition: beam.h:76
std::string bdsimPath
Definition: optionsBase.h:110
bool batch
Flag for batch / interactive mode.
Definition: optionsBase.h:59
std::string inputFileName
Input filename.
Definition: optionsBase.h:40
std::string recreateFileName
The file path to recreate a run from.
Definition: optionsBase.h:93
int startFromEvent
Event to start from when recreating.
Definition: optionsBase.h:94
bool recreate
Whether to recreate from a file or not.
Definition: optionsBase.h:92
Options class.
Definition: options.h:44
void Amalgamate(const Options &optionsIn, bool override)
Definition: options.cc:98
void set_value(std::string name, T value)
set methods by property name
Definition: options.h:76
Options loader.
Definition: Options.hh:36
std::string GetCurrentDir()
Get the current dir the program was executed from.
G4bool IsNumber(const char *s, double &convertedNumber)
Check if character array is an integer, and returns the double by reference.
G4bool IsInteger(const char *s, int &convertedInteger)
Check if character array is an integer, and returns the integer by reference.
Parser namespace for GMAD language. Combination of Geant4 and MAD.