EGSnrc C++ class library  Report PIRS-898 (2021)
Iwan Kawrakow, Ernesto Mainegra-Hing, Frederic Tessier, Reid Townson and Blake Walters
egs_application.h
Go to the documentation of this file.
1 /*
2 ###############################################################################
3 #
4 # EGSnrc egs++ application headers
5 # Copyright (C) 2015 National Research Council Canada
6 #
7 # This file is part of EGSnrc.
8 #
9 # EGSnrc is free software: you can redistribute it and/or modify it under
10 # the terms of the GNU Affero General Public License as published by the
11 # Free Software Foundation, either version 3 of the License, or (at your
12 # option) any later version.
13 #
14 # EGSnrc is distributed in the hope that it will be useful, but WITHOUT ANY
15 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
17 # more details.
18 #
19 # You should have received a copy of the GNU Affero General Public License
20 # along with EGSnrc. If not, see <http://www.gnu.org/licenses/>.
21 #
22 ###############################################################################
23 #
24 # Author: Iwan Kawrakow, 2005
25 #
26 # Contributors: Frederic Tessier
27 # Ernesto Mainegra-Hing
28 # Blake Walters
29 # Reid Townson
30 # Alexandre Demelo
31 # Hannah Gallop
32 #
33 ###############################################################################
34 */
35 
36 
42 #ifndef EGS_APPLICATION_
43 #define EGS_APPLICATION_
44 
45 #include "egs_base_geometry.h"
46 #include "egs_base_source.h"
47 #include "egs_simple_container.h"
48 #include "egs_interpolator.h"
49 #include "egs_input_struct.h"
50 #include "egs_run_control.h"
51 #include "egs_scoring.h"
52 #include "egs_rndm.h"
53 
54 #include <memory>
55 #include <string>
56 #include <iostream>
57 #include <dirent.h>
58 using namespace std;
59 
60 class EGS_Input;
61 class EGS_BaseSource;
63 class EGS_RunControl;
65 class EGS_AusgabObject;
66 class EGS_Interpolator;
67 //template <class T> class EGS_SimpleContainer;
68 
69 inline void addmcBlock(shared_ptr<EGS_InputStruct> blockPtr) {
70  shared_ptr<EGS_BlockInput> mcBlock = blockPtr->addBlockInput("MC transport parameter");
71  mcBlock->addSingleInput("Global ECUT", false, "Global electron transport cutoff");
72  mcBlock->addSingleInput("Global PCUT", false, "Global photon transport cutoff");
73  mcBlock->addSingleInput("Global SMAX", false, "Global maximum step-size restriction for e-transport");
74  mcBlock->addSingleInput("ESTEPE", false, "The maximum fractional energy loss in an electron step due to continuous energy loss. Defaults to 0.25");
75  mcBlock->addSingleInput("XIMAX", false, "Maximum first GS moment per step. Defaults to 0.5, maximum value is 1.");
76  mcBlock->addSingleInput("Boundary crossing algorithm", false, "Defaults to exact", {"exact", "PRESTA-I"});
77  mcBlock->addSingleInput("Skin depth for BCA", false, "The distance from a boundary to turn on electron single scattering, in mean free paths of the current medium. Set to a very large value to do a single scattering simulation. Defaults to 3 for exact boundary crossing");
78  mcBlock->addSingleInput("Electron-step algorithm", false, "Defaults to PRESTA-II", {"PRESTA_II", "PRESTA_I"});
79  mcBlock->addSingleInput("Spin effects", false, "Includes relativistic spin effects in electron scattering (On is highly recommended). Defaults to On", {"On", "Off"});
80  mcBlock->addSingleInput("Brems angular sampling", false, "Defaults to KM", {"KM", "Simple"});
81  mcBlock->addSingleInput("Brems cross sections", false, "Defaults to BH", {"BH", "NIST"});
82  mcBlock->addSingleInput("Pair angular sampling", false, "Defaults to Simple", {"Simple", "Off", "KM"});
83  mcBlock->addSingleInput("Pair cross sections", false, "Defaults to BH. Use NRC at low energies to consider asymmetry in positron-electron energy distribution.", {"BH", "NRC"});
84  mcBlock->addSingleInput("Triplet production", false, "Defaults to On", {"On", "Off"});
85  mcBlock->addSingleInput("Electron Impact Ionization", false, "For more accurate kV x-ray simulations, turn this on. Defaults to Off", {"On", "Off", "casnati", "kolbenstvedt", "gryzinski"});
86  mcBlock->addSingleInput("Bound Compton scattering", false, "Defaults to norej", {"On", "Off", "Simple", "norej"});
87  mcBlock->addSingleInput("Radiative Compton corrections", false, "Defaults to Off", {"On", "Off"});
88  mcBlock->addSingleInput("Rayleigh scattering", false, "Defaults to Off", {"On", "Off", "custom"});
89  mcBlock->addSingleInput("Photoelectron angular sampling", false, "Defaults to On", {"On", "Off"});
90  mcBlock->addSingleInput("Atomic relaxations", false, "Defaults to on", {"On", "Off"});
91  mcBlock->addSingleInput("Photon cross sections", false, "Defaults to xcom, can also be user-supplied", {"si", "epdl", "xcom"});
92  mcBlock->addSingleInput("Photon cross-sections output", false, "Defaults to Off", {"On", "Off"});
93  mcBlock->addSingleInput("Compton cross sections", false, "User-supplied, Defaults to comp-xsections");
94  mcBlock->addSingleInput("Photonuclear attenuation", false, "Defaults to Off", {"On", "Off"});
95  mcBlock->addSingleInput("Photonuclear cross sections", false, "Defaults to default, or is user-supplied", {"default"});
96 }
97 
98 inline void addMediaDefBlock(shared_ptr<EGS_InputStruct> blockPtr) {
99  shared_ptr<EGS_BlockInput> mediaBlockInput = blockPtr->addBlockInput("media definition");
100  mediaBlockInput->addSingleInput("ae", false, "Lowest energy for electron production (kinetic+0.511) in MeV. Minimum and most accurate value is 0.521.");
101  mediaBlockInput->addSingleInput("ap", false, "Lowest energy for photon production (kinetic) in MeV. Minimum and most accurate value is 0.001.");
102  mediaBlockInput->addSingleInput("ue", false, "Maximum energy for electrons (kinetic+0.511) in MeV. Set to just above the maximum source energy.");
103  mediaBlockInput->addSingleInput("up", false, "Maximum energy for photons (kinetic) in MeV. Set to just above the maximum source energy.");
104 
105  mediaBlockInput->addSingleInput("material data file", false, "The full file path to a file containing material data. See HEN_HOUSE/pegs4/data/material.dat for an example containing all the materials from 521ICRU.pegs4dat and 700ICRU.pegs4dat.");
106 
107  shared_ptr<EGS_BlockInput> mediumBlock = mediaBlockInput->addBlockInput("myMediumName");
108  mediumBlock->addSingleInput("elements", false, "A list of elements, separated by commas");
109  auto atomsPtr = mediumBlock->addSingleInput("number of atoms", false, "For each of the elements, the number of atoms in a molecule of the medium, separated by commas. If the medium is a mixture, use mass fractions instead.");
110  auto fractionsPtr = mediumBlock->addSingleInput("mass fractions", false, "For each of the elements, the mass fraction of that element in the mixture, comma separated.");
111  mediumBlock->addSingleInput("rho", false, "The bulk density of the medium in g/cm^3");
112  mediumBlock->addSingleInput("sterncid", false, "Material ID for the STERNHEIMER-SELTZER-BERGER (SSB) lookup table");
113  mediumBlock->addSingleInput("stopping powers", false, "This parameter allows various stopping powers to be calculated, rather than just the restricted total stopping powers. This allows for simulations that model various types of CSDA calculations. Defaults to restricted total.", {"restricted total", "unrestricted collision", "unrestricted collision and radiative", "unrestricted collision and restricted radiative", "restricted collision and unrestricted radiative", "unrestricted radiative"});
114  mediumBlock->addSingleInput("bremsstrahlung correction", false, "Corrections to apply to calculated bremsstrahlung cross-sections. Defaults to KM", {"KM", "NRC", "None"});
115  mediumBlock->addSingleInput("gas pressure", false, "The pressure in atm of this medium, assuming it is a gas. This is only applied if a density correction file is not used. To apply a gas pressure in that case, generate a new density correction file with the appropriately scaled density.");
116  mediumBlock->addSingleInput("e- stopping power output file", false, "An output filename to write electron stopping powers to.");
117 
118  atomsPtr->addDependency(fractionsPtr, "", true);
119  fractionsPtr->addDependency(atomsPtr, "", true);
120 }
121 
122 inline string addmcExample() {
123  string example = {
124  R"(
125 :start MC transport parameter:
126  Global ECUT = 0.521 # Global electron transport cutoff
127  Global PCUT = 0.001 # Global photon transport cutoff
128  Global SMAX = 1e10 # Global maximum step-size restriction for e- transport
129  ESTEPE = 0.25 # Defaults to 0.25
130  XIMAX = 0.5 # Defaults to 0.5, max. value is 1.
131  Boundary crossing algorithm = exact # exact (default), PRESTA-I
132  Skin depth for BCA = 3 # Default value is 3 for exact boundary crossing
133  Electron-step algorithm = PRESTA-II # PRESTA-II (default),PRESTA-I
134  Spin effects = On # On (default), Off
135  Brems angular sampling = KM # Simple, KM (default)
136  Brems cross sections = BH # BH (default), NIST, NRC
137  Pair angular sampling = Simple # Off, Simple (default), KM
138  Pair cross sections = BH # NRC, BH (default)
139  Triplet production = Off # On, Off (default)
140  Electron Impact Ionization = Off # On, Off (default), casnati, kolbenstvedt, gryzinski
141  Bound Compton scattering = norej # On, Off, Simple, norej (default)
142  Radiative Compton corrections = Off # On, Off (default)
143  Rayleigh scattering = Off # On, Off (default), custom
144  Photoelectron angular sampling = On # On (default), Off
145  Atomic relaxations = On # On (default), Off
146  Photon cross sections = xcom # si, epdl, xcom (default) or user-supplied
147  Photon cross-sections output = Off # Off (default), On
148  Compton cross sections = comp_xsections # User-supplied
149  Photonuclear attenuation = Off # Off (default), On
150  Photonuclear cross sections = default # default (default), user-supplied
151 :stop MC transport parameter:
152 )"};
153  return example;
154 }
155 
156 inline string addMediaExample() {
157  string example = {
158  // Not completed yet, need to fill in numbers for example
159  R"(
160 :start media definition:
161  ae = 0.521 # lowest energy for electron production (kinetic+0.511)
162  ap = 0.01 # lowest energy for photon production (kinetic)
163  ue = 50.511 # maximum energy for electrons (kinetic+0.511)
164  up = 50 # maximum energy for photons (kinetic) # maximum energy for photons (kinetic)
165 
166  # Here is an example for defining water
167  :start water:
168  density correction file = water_liquid
169  :stop water:
170 
171 :stop media definition:
172 )"};
173  return example;
174 }
175 
179 struct EGS_Particle {
180  int q;
181  int latch;
182  int ir;
183  EGS_Float E;
184  EGS_Float wt;
185  EGS_Vector x;
186  EGS_Vector u;
187 };
188 
383 
384 public:
385 
396  EGS_Application(int argc, char **argv);
397 
403  virtual ~EGS_Application();
404 
428  virtual int initSimulation();
429 
439  virtual void setSimulationChunk(EGS_I64 nstart, EGS_I64 nrun, int npar, int nchunk);
440 
462  virtual int runSimulation();
463 
472  virtual int finishSimulation();
473 
480  virtual void describeSimulation();
481 
496  virtual int simulateSingleShower();
497 
503  virtual void getCurrentResult(double &sum, double &sum2, double &norm,
504  double &count) {
505  sum = 0;
506  sum2 = 0;
507  norm = 1;
508  count = 0;
509  };
510 
516  virtual void analyzeResults() {};
517 
523  virtual void outputResults() {};
524 
538  virtual int combineResults();
539 
546  virtual int combinePartialResults();
547 
555  int howManyJobsDone();
556 
557 
573  virtual int outputData();
574 
589  virtual int readData();
590 
594  EGS_Input *getInput() {
595  return input;
596  };
597 
599  const string &getAppName() const {
600  return app_name;
601  };
602 
604  const string &getEgsHome() const {
605  return egs_home;
606  };
607 
609  const string &getHenHouse() const {
610  return hen_house;
611  };
612 
614  const string &getOutputFile() const {
615  return output_file;
616  };
617 
626  const string &getFinalOutputFile() const {
627  return final_output_file;
628  };
629 
637  string constructIOFileName(const char *extension, bool with_run_dir) const;
638 
640  const string &getAppDir() const {
641  return app_dir;
642  };
643 
645  const string &getRunDir() const {
646  return run_dir;
647  };
648 
650  const string &getWorkDir() const {
651  return run_dir;
652  };
653 
655  enum AusgabCall {
656  BeforeTransport = 0,
657  EgsCut = 1,
658  PegsCut = 2,
659  UserDiscard = 3,
660  ExtraEnergy = 4,
662  AfterTransport = 5,
663  BeforeBrems = 6,
664  AfterBrems = 7,
665  BeforeMoller = 8,
666  AfterMoller = 9,
667  BeforeBhabha = 10,
668  AfterBhabha = 11,
669  BeforeAnnihFlight = 12,
670  AfterAnnihFlight = 13,
671  BeforeAnnihRest = 28,
672  AfterAnnihRest = 14,
673  BeforePair = 15,
674  AfterPair = 16,
675  BeforeCompton = 17,
676  AfterCompton = 18,
677  BeforePhoto = 19,
678  AfterPhoto = 20,
679  EnteringUphi = 21,
680  LeavingUphi = 22,
682  BeforeRayleigh = 23,
683  AfterRayleigh = 24,
684  FluorescentEvent = 25,
685  CosterKronigEvent = 26,
686  AugerEvent = 27,
687  BeforePhotoNuc = 29,
688  AfterPhotoNuc = 30,
689  BeforeEII = 31,
690  AfterEII = 32,
691  AfterSubPhoton = 33,
692  AfterSubElectron = 34,
693  UnknownCall = 35
694  };
695 
701  virtual void setAusgabCall(AusgabCall call, bool on_or_off) {
702  ausgab_flag[call] = on_or_off;
703  };
704 
712  int getNparallel() const {
713  return n_parallel;
714  };
715 
722  int getIparallel() const {
723  return i_parallel;
724  };
725 
732  int getFirstParallel() const {
733  return first_parallel;
734  };
735 
740  inline int howfar(int ireg, const EGS_Vector &x, const EGS_Vector &u,
741  EGS_Float &t, int *newmed) {
742 
743  geometry->resetErrorFlag();
744  EGS_Float twant = t;
745  int inew = geometry->howfar(ireg,x,u,t,newmed);
746  storeGeometryStep(ireg,inew,x,u,twant,t);
747  if (geometry->getLastError()) {
748  reportGeometryError();
749  }
750  return inew;
751 
752  //return geometry->howfar(ireg,x,u,t,newmed);
753  };
754 
759  inline EGS_Float hownear(int ireg,const EGS_Vector &x) {
760  return geometry->hownear(ireg,x);
761  };
762 
764  inline int getMedium(int ireg) {
765  return geometry->medium(ireg);
766  };
767 
775  bool isRealRegion(int ireg) {
776  return geometry->isRealRegion(ireg);
777  }
778  int isWhere(EGS_Vector &r) {
779  return geometry->isWhere(r);
780  }
781 
783  int getGlobalRegionOffset(const string geomName) {
784  return geometry->getGlobalRegionOffset(geomName);
785  }
786 
802  void getNumberRegions(const string &str, vector<int> &regs) {
803  geometry->getNumberRegions(str, regs);
804  }
805 
814  void getLabelRegions(const string &str, vector<int> &regs) {
815  geometry->getLabelRegions(str, regs);
816  }
817 
826  EGS_Float getTimeIndex() {
827  return source->getTimeIndex();
828  }
829 
833  void setTimeIndex(EGS_Float temp_time) {
834  source->setTimeIndex(temp_time);
835  }
836 
843  int userScoring(int iarg, int ir=-1);
844 
850  virtual int ausgab(int) {
851  return 0;
852  };
853 
864  virtual void startNewParticle() { };
865 
884  virtual void enterNewRegion() { };
885 
894  virtual void fillRandomArray(int n, EGS_Float *rns);
895 
912  static EGS_Application *activeApplication();
913 
923  static void setActiveApplication(EGS_Application *);
924 
932  virtual EGS_I64 randomNumbersUsed() const;
933 
942  virtual void getElectronSteps(double &ch_steps, double &all_steps) const {
943  ch_steps = 0;
944  all_steps = 0;
945  };
946 
959  virtual int addState(istream &data);
960 
970  virtual void resetCounter();
971 
979  virtual void describeUserCode() const {};
980 
983  virtual void appInformation(const char *);
984 
987  virtual void appWarning(const char *);
988 
991  virtual void appFatal(const char *);
992 
995  void checkDeviceFull(FILE *);
996 
1006  static bool getArgument(int &argc, char **argv,
1007  const char *name1, const char *name2, string &arg);
1008 
1015  static void checkEnvironmentVar(int &argc, char **argv, const char *env,
1016  const char *n1, const char *n2, string &var);
1017 
1018 protected:
1019 
1033  virtual int initGeometry();
1048  virtual int initSource();
1049 
1064  virtual int initCrossSections() {
1065  return 0;
1066  };
1067 
1075  virtual int initScoring() {
1076  return 0;
1077  };
1078 
1095  virtual int initRunControl();
1096 
1108  virtual int initRNG();
1109 
1123  virtual int initEGSnrcBackEnd() {
1124  return 0;
1125  };
1126 
1134  void initAusgabObjects();
1135 
1137  void addAusgabObject(EGS_AusgabObject *o);
1138 
1147  virtual int startNewShower();
1156  virtual int finishShower() {
1157  return 0;
1158  };
1169  virtual int shower() {
1170  return 0;
1171  };
1172 
1173  virtual void finishRun() { };
1174 
1175  void storeGeometryStep(int ireg, int inew, const EGS_Vector &x,
1176  const EGS_Vector &u, EGS_Float twant, EGS_Float t);
1178  void reportGeometryError();
1179 
1180  EGS_Input *input;
1181  EGS_BaseGeometry *geometry;
1182  EGS_BaseSource *source;
1183  EGS_RandomGenerator *rndm;
1185 
1186  bool ausgab_flag[UnknownCall];
1187 
1188  string app_name;
1189  string egs_home;
1190  string hen_house;
1191  string app_dir;
1192  string run_dir;
1193  string egs_config;
1194  string input_file;
1195  string output_file;
1196  string final_output_file;
1197  string pegs_file;
1198  string abs_pegs_file;
1199 
1200  int n_parallel,
1201  i_parallel,
1202  first_parallel;
1203  bool batch_run;
1204  bool simple_run;
1205  bool uniform_run;
1206  bool is_pegsless;
1207 
1208  EGS_Particle p;
1210  EGS_I64 current_case;
1211  EGS_I64 last_case;
1212 
1218  ostream *data_out;
1219 
1225  istream *data_in;
1226 
1230  int app_index;
1231 
1234 
1237 
1238  EGS_GeometryHistory *ghistory;
1239 
1240 private:
1241 
1242  static int n_apps;
1243 
1244 public:
1245 
1246  EGS_Particle top_p;
1247  int Np;
1248  //************************************************************
1249  // Utility functions for use with ausgab dose scoring objects
1250  //************************************************************
1251  EGS_Float getFluence() {
1252  return source->getFluence();
1253  };
1254  int getnRegions() {
1255  return geometry->regions();
1256  };
1257  int getnMedia() {
1258  return geometry->nMedia();
1259  };
1260  const char *getMediumName(int ind) {
1261  return geometry->getMediumName(ind);
1262  };
1263  virtual EGS_Float getMediumRho(int ind) {
1264  (void)ind;
1265  return -1.0;
1266  };
1267  virtual EGS_Float getEdep() {
1268  return 0.0;
1269  };
1270  virtual void setEdep(EGS_Float edep) {
1271  (void)edep;
1272  };
1273  virtual EGS_Float getEcut() {
1274  return 0.0;
1275  };
1276  virtual EGS_Float getPcut() {
1277  return 0.0;
1278  };
1279  virtual EGS_Float getRM() {
1280  return -1.0;
1281  };
1282 
1283  //************************************************
1284  // For use with ausgab radiative splitting objects
1285  //************************************************
1286  virtual void setRadiativeSplitting(const EGS_Float &nsplit) {
1287  (void)nsplit;
1288  };
1289  virtual void setRussianRoulette(const EGS_Float &iSwitchRR) {
1290  (void)iSwitchRR;
1291  };
1292  virtual void splitTopParticleIsotropically(const EGS_Float &fsplit) {
1293  (void)fsplit;
1294  }
1295 
1296  //************************************************************
1297  // Utility functions for use with ausgab fluence scoring objects
1298  //************************************************************
1299  virtual EGS_Float getTVSTEP() {
1300  return 0.0;
1301  };
1302 
1303  virtual EGS_Interpolator *getDEDX(const int &imed, const int &iq) {
1304  (void)imed;
1305  (void)iq;
1306  return 0;
1307  };
1308 
1309  string sourceType() {
1310  return source->getObjectType();
1311  }
1312 
1313  int sourceCharge() {
1314  return source->getCharge();
1315  }
1316 
1317  int sourceEmax() {
1318  return source->getEmax();
1319  }
1320 
1321  virtual void setLatch(const int &ip, const int &latch) {
1322  (void)ip;
1323  (void)latch;
1324  };
1325 
1326  virtual void incLatch(const int &ip, const int &increment) {
1327  (void)ip;
1328  (void)increment;
1329  };
1330 
1331  virtual int getNp() {
1332  return 0;
1333  };
1334 
1335  virtual int getNpOld() {
1336  return 0;
1337  };
1338 
1339  //************************************************************
1340  // Utility function for ausgab phase space scoring objects
1341  //************************************************************
1342  virtual void setLatch(int latch) {
1343  (void)latch;
1344  };
1345 
1346  static unique_ptr<EGS_InputStruct> inputStructure;
1347 
1348  bool containsDynamic() {
1349  bool hasDynamic = false;
1350  geometry->containsDynamic(hasDynamic);
1351  if (!hasDynamic) {
1352  source->containsDynamic(hasDynamic);
1353  }
1354  return hasDynamic;
1355  }
1356 };
1357 
1358 #define APP_MAIN(app_name) \
1359  int main(int argc, char **argv) { \
1360  app_name app(argc,argv); \
1361  int err = app.initSimulation(); \
1362  if( err ) return err; \
1363  err = app.runSimulation(); \
1364  if( err < 0 ) return err; \
1365  return app.finishSimulation(); \
1366  }
1367 
1368 #define APP_SIMPLE_MAIN(app_name) \
1369  int main(int argc, char **argv) { \
1370  app_name app(argc,argv); \
1371  app.run(); \
1372  app.reportResults(); \
1373  app.finish(); \
1374  return 0; \
1375  }
1376 
1377 #define APP_LIB(app_name) \
1378  extern "C" {\
1379  APP_EXPORT EGS_Application* createApplication(int argc, char **argv) {\
1380  return new app_name(argc, argv);\
1381  }\
1382  APP_EXPORT shared_ptr<EGS_InputStruct> getAppInputs() {\
1383  shared_ptr<EGS_InputStruct> appInputStruct = make_shared<EGS_InputStruct>();\
1384  addmcBlock(appInputStruct);\
1385  addRngDefinitionBlock(appInputStruct);\
1386  addRunControlBlock(appInputStruct);\
1387  addMediaDefBlock(appInputStruct);\
1388  return appInputStruct;\
1389  }\
1390  APP_EXPORT string getmcExample() {\
1391  return addmcExample();\
1392  }\
1393  APP_EXPORT string getRunControlExample() {\
1394  return addRunControlExample();\
1395  }\
1396  APP_EXPORT string getRngDefinitionExample() {\
1397  return addRngDefinitionExample();\
1398  }\
1399  APP_EXPORT string getMediaExample() {\
1400  return addMediaExample();\
1401  }\
1402  }\
1403 
1404 #endif
Base class for advanced EGSnrc C++ applications.
AusgabCall
Possible calls to the user scoring function ausgab().
Base geometry class. Every geometry class must be derived from EGS_BaseGeometry.
static int nMedia()
Get the number of media registered so far by all geometries.
int regions() const
Returns the number of local regions in this geometry.
static const char * getMediumName(int ind)
Get the name of medium with index ind.
Base source class. All particle sources must be derived from this class.
virtual int getCharge() const
Get the charge of the source.
virtual EGS_Float getEmax() const =0
Return the maximum energy of this source.
virtual EGS_Float getFluence() const =0
Return the fluence this source has emitted so far.
A class for storing information in a tree-like structure of key-value pairs. This class is used throu...
Definition: egs_input.h:182
A class for fast run-time interpolations.
const string & getObjectType() const
Get the object type.
Base random number generator class. All random number generators should be derived from this class.
Definition: egs_rndm.h:90
A simple run control object for advanced EGSnrc C++ applications.
A class representing 3D vectors.
Definition: egs_vector.h:57
EGS_BaseGeometry class header file.
EGS_BaseSource class header file.
The input struct header file.
EGS_Interpolator class header file.
#define EGS_EXPORT
Export symbols from the egspp library.
Definition: egs_libconfig.h:90
EGS_RandomGenerator class header file.
EGS_RunControl and EGS_JCFControl class header file.
EGS_ScoringSingle and EGS_ScoringArray class header file.
EGS_SimpleContainer template class.
A structure holding the information of one particle.