EGSnrc C++ class library  Report PIRS-898 (2021)
Iwan Kawrakow, Ernesto Mainegra-Hing, Frederic Tessier, Reid Townson and Blake Walters
egs_cones.cpp
Go to the documentation of this file.
1 /*
2 ###############################################################################
3 #
4 # EGSnrc egs++ cones geometry
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 # Marc Chamberland
28 # Randle Taylor
29 # Ernesto Mainegra-Hing
30 # Reid Townson
31 #
32 ###############################################################################
33 */
34 
35 
41 #include "egs_cones.h"
42 #include "egs_input.h"
43 
44 #include <vector>
45 using std::vector;
46 
47 #ifndef M_PI
48  #define M_PI 3.14159265358979323846
49 #endif
50 
51 string EGS_SimpleCone::type = "EGS_SimpleCone";
52 string EGS_ParallelCones::type = "EGS_ParallelCones";
53 string EGS_ConeSet::type = "EGS_ConeSet";
54 string EGS_ConeStack::type = "EGS_ConeStack";
55 
56 static bool EGS_CONES_LOCAL inputSet = false;
57 
58 void EGS_ConeStack::clear(bool all) {
59  if (nltot > 0) {
60  if (all) {
61  for (int j=0; j<nl; j++) {
62  for (int i=0; i<nr[j]; i++)
63  if (!cones[j][i]->deref()) {
64  delete cones[j][i];
65  }
66  delete [] cones[j];
67  }
68  nl = 0;
69  }
70  delete [] cones;
71  delete [] pos;
72  delete [] nr;
73  delete [] flag;
74  nltot = 0;
75  }
76 }
77 
78 #define N_CS_GROW 50
79 void EGS_ConeStack::resize() {
80  int nnew = nltot + N_CS_GROW;
81  int *new_nr = new int [nnew], *new_flag = new int [nnew];
82  EGS_Float *new_pos = new EGS_Float [nnew+1];
83  EGS_SimpleCone ***new_cones = new EGS_SimpleCone **[nnew];
84  for (int j=0; j<nl; j++) {
85  new_nr[j] = nr[j];
86  new_flag[j] = flag[j];
87  new_pos[j] = pos[j];
88  new_cones[j] = cones[j];
89  }
90  if (nl > 0) {
91  new_pos[nl] = pos[nl];
92  }
93  clear(false);
94  nr = new_nr;
95  pos = new_pos;
96  flag = new_flag;
97  cones = new_cones;
98  nltot = nnew;
99 }
100 
101 void EGS_ConeStack::addLayer(EGS_Float thick, const vector<EGS_Float> &rtop,
102  const vector<EGS_Float> &rbottom,
103  const vector<string> &med_names) {
104  int this_nr = rbottom.size();
105  if (!this_nr) {
106  egsWarning("EGS_ConeStack::addLayer: no bottom radii?\n");
107  egsWarning(" --> ignoring layer\n");
108  return;
109  }
110  if ((int)med_names.size() != this_nr) {
111  egsWarning("EGS_ConeStack::addLayer: number of cone radii (%d) is"
112  " different from number of media (%d)\n",this_nr,med_names.size());
113  egsWarning(" --> ignoting layer\n");
114  return;
115  }
116  bool same_radii = false;
117  if (rtop.size() != rbottom.size()) {
118  if (!rtop.size()) {
119  if (!nl) {
120  egsWarning("EGS_ConeStack::addLayer: zero top radii does not"
121  " work for the first layer\n");
122  egsWarning(" --> ignoting layer\n");
123  return;
124  }
125  same_radii = true;
126  }
127  else {
128  egsWarning("EGS_ConeStack::addLayer: number of bottom radii (%d)"
129  " is different from number of top radii (%d)\n",this_nr,
130  rtop.size());
131  egsWarning(" --> ignoting layer\n");
132  return;
133  }
134  }
135  if (nl >= nltot) {
136  resize();
137  }
138  if (!nl) {
139  pos[nl] = xo*a;
140  Rout = rbottom[this_nr-1];
141  Rout2 = Rout*Rout;
142  if (fabs(rtop[this_nr-1]-Rout) > boundaryTolerance) {
143  same_Rout = false;
144  is_convex = false;
145  }
146  }
147 
148  cones[nl] = new EGS_SimpleCone * [this_nr];
149  nr[nl] = this_nr;
150  pos[nl+1] = pos[nl] + thick;
151  EGS_Vector x(xo+a*(pos[nl]-pos[0]));
152  //egsInformation(" layer %d x = (%g,%g,%g)\n",nl,x.x,x.y,x.z);
153  for (int ir=0; ir<this_nr; ir++) {
154  EGS_Float Rtop = same_radii ? cones[nl-1][ir]->getRadius(x) : rtop[ir];
155  cones[nl][ir] = new EGS_SimpleCone(x,a,thick,Rtop,rbottom[ir]);
156  cones[nl][ir]->setMedium(med_names[ir]);
157  cones[nl][ir]->ref();
158  if (ir == this_nr-1) {
159  if (fabs(rbottom[this_nr-1]-Rout) > boundaryTolerance) {
160  same_Rout = false;
161  is_convex = false;
162  }
163  if (fabs(Rtop-Rout) > boundaryTolerance) {
164  same_Rout = false;
165  is_convex = false;
166  }
167  }
168  }
169  if (same_radii) {
170  flag[nl-1] += 2;
171  flag[nl] = 1;
172  }
173  else {
174  flag[nl] = 0;
175  }
176  if (this_nr > nmax) {
177  nmax = this_nr;
178  }
179  ++nl;
180  nreg = nl*nmax;
181  //egsInformation("addLayer: the following layers are defined:\n");
182  //for(int j=0; j<nl; j++) egsInformation(" %g %g %d %d\n",pos[j],pos[j+1],
183  // nr[j],flag[j]);
184 }
185 
186 void EGS_ConeStack::printInfo() const {
188  egsInformation("number of layers: %d\n",nl);
189  for (int il=0; il<nl; il++) {
190  egsInformation("*** layer %d: top = %g bottom = %g\n",il,
191  pos[il],pos[il+1]);
192  egsInformation(" top radii: ");
193  int i;
194  EGS_Vector x(xo+a*(pos[il]-pos[0]));
195  for (i=0; i<nr[il]; i++) {
196  egsInformation("%g ",cones[il][i]->getRadius(x));
197  }
198  egsInformation("\n bottom radii: ");
199  x = xo + a*(pos[il+1]-pos[0]);
200  for (i=0; i<nr[il]; i++) {
201  egsInformation("%g ",cones[il][i]->getRadius(x));
202  }
203  egsInformation("\n media: ");
204  for (i=0; i<nr[il]; i++) {
205  egsInformation("%d ",cones[il][i]->medium(0));
206  }
207  egsInformation("\n");
208  }
209  egsInformation("=====================================================\n");
210 }
211 
212 void EGS_SimpleCone::printInfo() const {
214  egsInformation(" cone apex = (%g,%g,%g)\n",xo.x,xo.y,xo.z);
215  egsInformation(" cone axis = (%g,%g,%g)\n",a.x,a.y,a.z);
216  egsInformation(" opening angle = %g degrees\n",180*atan(gamma)/M_PI);
217  if (open) {
218  egsInformation(" cone is open\n");
219  }
220  else {
221  egsInformation(" cone height %g\n",-d1);
222  }
223  egsInformation("=====================================================\n");
224 }
225 
226 void EGS_ParallelCones::printInfo() const {
228  egsInformation(" cone axis = (%g,%g,%g)\n",a.x,a.y,a.z);
229  egsInformation(" opening angle = %g degrees\n",180*atan(gamma)/M_PI);
230  egsInformation(" number of cones = %d\n",nc);
231  egsInformation(" cone apexes:\n ");
232  for (int j=0; j<nc; j++) {
233  egsInformation("(%g,%g,%g) ",xo[j].x,xo[j].y,xo[j].z);
234  }
235  egsInformation("\n=====================================================\n");
236 }
237 
238 void EGS_ConeSet::printInfo() const {
240  egsInformation(" cone apex = (%g,%g,%g)\n",xo.x,xo.y,xo.z);
241  egsInformation(" cone axis = (%g,%g,%g)\n",a.x,a.y,a.z);
242  egsInformation(" flag = %d\n",flag);
243  egsInformation(" opening angles (degrees)=\n ");
244  for (int j=0; j<nc; j++) {
245  egsInformation("%g ",180*atan(gamma[j])/M_PI);
246  }
247  egsInformation("\n=====================================================\n");
248 }
249 
250 
251 extern "C" {
252 
253  static void setInputs() {
254  inputSet = true;
255 
256  setBaseGeometryInputs(false);
257 
258  geomBlockInput->getSingleInput("library")->setValues({"egs_cones"});
259 
260  // Format: name, isRequired, description, vector string of allowed values
261  auto typePtr = geomBlockInput->addSingleInput("type", true, "The type of cone.", {"EGS_ConeStack", "EGS_SimpleCone", "EGS_ParallelCones", "EGS_ConeSet"});
262 
263  geomBlockInput->addSingleInput("axis", false, "The unit vector defining the axis along the length of the cones. Layers or cones are added sequentially in the vector direction.");
264 
265  auto inpPtr = geomBlockInput->addSingleInput("apex", false, "The position of the cone apex (x, y, z). For EGS_ParallelCones, this is the position of the first cone apex.");
266  inpPtr->addDependency(typePtr, "EGS_SimpleCone");
267  inpPtr->addDependency(typePtr, "EGS_ParallelCones");
268  inpPtr->addDependency(typePtr, "EGS_ConeSet");
269  inpPtr->addDependency(typePtr, "EGS_ConeStack", true);
270 
271  // EGS_ConeStack
272  auto blockPtr = geomBlockInput->addBlockInput("layer");
273  blockPtr->addDependency(typePtr, "EGS_ConeStack");
274  blockPtr->addSingleInput("thickness", true, "The thickness of the layer.");
275  blockPtr->addSingleInput("top radii", false, "A list of the top cone radii. If omitted, the top radii are assumed to be the same as a bottom radii from the previous layer. This improves the algorithm efficiency.");
276  blockPtr->addSingleInput("bottom radii", true, "A list of the bottom cone radii.");
277  blockPtr->addSingleInput("media", true, "A list of media names, one for each region.");
278 
279  // EGS_ConeSet
280  auto anglesPtr = geomBlockInput->addSingleInput("opening angles", false, "A list of angles in degrees.");
281  anglesPtr->addDependency(typePtr, "EGS_ConeSet");
282  auto anglesRadPtr = geomBlockInput->addSingleInput("opening angles in radian", false, "A list of angles in radians.");
283  anglesRadPtr->addDependency(typePtr, "EGS_ConeSet");
284  // Only one of these inputs two can be included
285  anglesRadPtr->addDependency(anglesPtr, "", true);
286  anglesPtr->addDependency(anglesRadPtr, "", true);
287  geomBlockInput->addSingleInput("flag", false, "0 or 1 or 2. This input affects the region numbering algorithm; see the documentation for details.")->addDependency(typePtr, "EGS_ConeSet");
288  auto mediaPtr = geomBlockInput->addBlockInput("media input");
289  mediaPtr->addDependency(typePtr, "EGS_ConeSet");
290  mediaPtr->addSingleInput("media", true, "");
291  mediaPtr->addSingleInput("set medium", false, "");
292 
293  // EGS_SimpleCone
294  auto anglePtr = geomBlockInput->addSingleInput("opening angle", false, "The opening angle of the cone in degrees.");
295  anglePtr->addDependency(typePtr, "EGS_SimpleCone");
296  anglePtr->addDependency(typePtr, "EGS_ParallelCones");
297  auto heightPtr = geomBlockInput->addSingleInput("height", false, "The height of the cone.");
298  heightPtr->addDependency(typePtr, "EGS_SimpleCone");
299  auto mediaPtr2 = geomBlockInput->addBlockInput("media input");
300  mediaPtr2->addDependency(typePtr, "EGS_SimpleCone");
301  mediaPtr2->addDependency(typePtr, "EGS_ParallelCones");
302  mediaPtr2->addSingleInput("media", true, "");
303  mediaPtr2->addSingleInput("set medium", false, "");
304 
305  // EGS_ParallelCones
306  auto apexPtr = geomBlockInput->addSingleInput("apex distances", false, "A list of distances from the first apex.");
307  apexPtr->addDependency(typePtr, "EGS_ParallelCones");
308  }
309 
310  EGS_CONES_EXPORT string getExample() {
311  string example;
312  example = {
313  R"(
314  # Examples of each of the egs_cones types follow
315  # Simply uncomment the :start line for the example that you
316  # wish to use
317 
318  # EGS_ConeStack example
319  #:start geometry:
320  library = egs_cones
321  type = EGS_ConeStack
322  name = my_conestack
323  axis = 1.2417 0 0 -1 0 0
324  :start layer:
325  thickness = 0.0417
326  top radii = 0.
327  bottom radii = 0.0858
328  media = water
329  :stop layer:
330  :start layer:
331  thickness = 0.1283
332  top radii = 0. 0.0858
333  bottom radii = 0.3125 0.35
334  media = air water
335  :stop layer:
336  :start layer:
337  thickness = 0.2217
338  bottom radii = 0.3125 0.35
339  media = air water
340  :stop layer:
341  :start layer:
342  thickness = 2.05
343  top radii = 0.050 0.3125 0.35
344  bottom radii = 0.050 0.3125 0.35
345  media = water air water
346  :stop layer:
347  :stop geometry:
348 
349  # EGS_SimpleCone example
350  #:start geometry:
351  library = egs_cones
352  type = EGS_SimpleCone
353  name = my_simple_cone
354  apex = 0 0 3
355  axis = 0 0 -1
356  height = 4
357  opening angle = 30 # deg
358  :start media input:
359  media = water
360  :stop media input:
361  :stop geometry:
362 
363  # EGS_ParallelCones example
364  #:start geometry:
365  library = egs_cones
366  type = EGS_ParallelCones
367  name = my_parallel_cones
368  apex = 0 0 6
369  axis = 0 0 -1
370  apex distances = 1 2 3
371  opening angle = 30 # deg
372  :stop geometry:
373 
374  # EGS_ConeSet example
375  #:start geometry:
376  name = my_coneset
377  library = egs_cones
378  type = EGS_ConeSet
379  apex = 0 0 3
380  axis = 0 0 -1
381  opening angles = 10 20 30
382  :start media input:
383  media = water air water
384  set medium = 1 1
385  set medium = 2 2
386  :stop media input:
387  :stop geometry:
388 )"};
389  return example;
390  }
391 
392  EGS_CONES_EXPORT shared_ptr<EGS_BlockInput> getInputs() {
393  if(!inputSet) {
394  setInputs();
395  }
396  return geomBlockInput;
397  }
398 
399  EGS_CONES_EXPORT EGS_BaseGeometry *createGeometry(EGS_Input *input) {
400 
401  if (!input) {
402  egsWarning("createGeometry(cones): null input?\n");
403  return 0;
404  }
405  string type;
406  int err = input->getInput("type",type);
407  if (err) {
408  egsWarning("createGeometry(cones): object type not specified\n");
409  return 0;
410  }
411  if (type == "EGS_ConeStack") {
412  vector<EGS_Float> axis;
413  err = input->getInput("axis",axis);
414  if (err) {
415  egsWarning("createGeometry(EGS_ConeStack): no axis input\n");
416  return 0;
417  }
418  if (axis.size() != 6) {
419  egsWarning("createGeometry(EGS_ConeStack): wrong axis input"
420  " (expecting 6 instead of %d inputs)\n",axis.size());
421  return 0;
422  }
423  EGS_ConeStack *g = new EGS_ConeStack(
424  EGS_Vector(axis[0],axis[1],axis[2]),
425  EGS_Vector(axis[3],axis[4],axis[5]),"");
426  EGS_Input *layer;
427  int nl = 0;
428  vector<int> layerLabels;
429  while ((layer = input->takeInputItem("layer"))) {
430  vector<EGS_Float> rtop, rbottom;
431  vector<string> media;
432  EGS_Float thickness;
433  err = layer->getInput("thickness",thickness);
434  if (err)
435  egsWarning("createGeometry(EGS_ConeStack): missing 'thickness'"
436  " input for layer %d\n --> layer ignored\n",nl);
437  else {
438  err = layer->getInput("top radii",rtop);
439  err = layer->getInput("bottom radii",rbottom);
440  if (err) egsWarning("createGeometry(EGS_ConeStack): missing "
441  "'bottom radii' input for layer %d\n",nl);
442  int err1 = layer->getInput("media",media);
443  if (err1) egsWarning("createGeometry(EGS_ConeStack): missing "
444  "'media' input for layer %d\n",nl);
445  if (err || err1) {
446  egsWarning(" --> layer ignored\n");
447  }
448  else {
449  g->addLayer(thickness,rtop,rbottom,media);
450  }
451  }
452  layerLabels.push_back(g->setLabels(layer));
453  delete layer;
454  ++nl;
455  }
456  if (!g->nLayer()) {
457  egsWarning("createGeometry(EGS_ConeStack): zero layers\n");
458  delete g;
459  return 0;
460  }
461 
462  // adjust label region numbering in each layer
463  int count=0;
464  for (size_t i=0; i<layerLabels.size(); i++) {
465  for (int j=0; j<layerLabels[i]; j++) {
466  g->shiftLabelRegions(count,i);
467  count++;
468  }
469  }
470 
471  g->setName(input);
472  g->setBoundaryTolerance(input);
473  g->setLabels(input);
474  g->setBScaling(input); // Perhaps add density scaling as well?
475  return g;
476  }
477 
478  // get cone apex position
479  vector<EGS_Float> tmp;
480  EGS_Vector Xo;
481  err = input->getInput("apex",tmp);
482  if (err || tmp.size() != 3)
483  egsWarning("createGeometry(cones): no 'apex' input, "
484  "assuming (0,0,0)\n");
485  else {
486  Xo.x = tmp[0];
487  Xo.y = tmp[1];
488  Xo.z = tmp[2];
489  }
490  tmp.clear();
491 
492  // get cone axis
493  EGS_Vector axis(0,0,1);
494  err = input->getInput("axis",tmp);
495  if (err || tmp.size() != 3)
496  egsWarning("createGeometry(cones): no 'axis' input, assuming "
497  "(0,0,1)\n");
498  else {
499  axis.x = tmp[0];
500  axis.y = tmp[1];
501  axis.z = tmp[2];
502  }
503 
504  EGS_BaseGeometry *g;
505  if (input->compare(type,"EGS_ConeSet")) {
506  vector<EGS_Float> angles;
507  err = input->getInput("opening angles",angles);
508  bool is_radian = false;
509  if (err) {
510  angles.clear();
511  err = input->getInput("opening angles in radian",angles);
512  if (err) {
513  egsWarning("createGeometry(cones): no 'opening angles' or "
514  "'opening angles in radian' input\n");
515  return 0;
516  }
517  is_radian = true;
518  }
519  int flag = 0;
520  err = input->getInput("flag",flag);
521  int nc = angles.size();
522  EGS_Float *gamma = new EGS_Float [nc];
523  for (int j=0; j<nc; j++) {
524  if (angles[j] <= 0) {
525  egsWarning("createGeometry(cones): opening angles must be"
526  " positive\n");
527  delete [] gamma;
528  return 0;
529  }
530  EGS_Float a = angles[j];
531  if (!is_radian) {
532  a *= (M_PI/180);
533  }
534  if (a >= M_PI/2) {
535  egsWarning("createGeometry(cones): opening angles can not be"
536  " greater than Pi/2\n");
537  delete [] gamma;
538  return 0;
539  }
540  if (j > 0) {
541  if (angles[j] <= angles[j-1]) {
542  egsWarning("createGeometry(cones): opening angles must be"
543  " in increasing order\n");
544  delete [] gamma;
545  return 0;
546  }
547  }
548  gamma[j] = tan(a);
549  }
550  g = new EGS_ConeSet(Xo,axis,nc,gamma,flag);
551  delete [] gamma;
552  }
553 
554  else {
555  // get opening angle
556  EGS_Float angle;
557  err = input->getInput("opening angle",angle);
558  if (err) {
559  err = input->getInput("opening angle in radian",angle);
560  if (err) {
561  egsWarning("createGeometry(cones): no 'opening angle' or "
562  "'opening angle in radian' input\n");
563  return 0;
564  }
565  }
566  else {
567  angle *= (M_PI/180);
568  }
569  if (angle >= M_PI/2) {
570  egsWarning("createGeometry(cones): it is not allowed to have"
571  " an opening angle greater than Pi/2, your input was %g\n",angle);
572  return 0;
573  }
574  EGS_Float gamma = tan(angle);
575  if (input->compare(type,"EGS_SimpleCone")) {
576  EGS_Float height;
577  EGS_Float *h = 0;
578  err = input->getInput("height",height);
579  if (!err) {
580  if (height <= 0)
581  egsWarning("createGeometry(cones): the cone height"
582  " must be greater than zero, your input was %g\n",height);
583  else {
584  h = &height;
585  }
586  }
587  g = new EGS_SimpleCone(Xo,axis,gamma,h,"");
588  }
589  else if (input->compare(type,"EGS_ParallelCones")) {
590  vector<EGS_Float> d;
591  err = input->getInput("apex distances",d);
592  EGS_Float *dist=0;
593  int nc=1;
594  if (!err && d.size() > 0) {
595  dist = new EGS_Float [d.size()];
596  for (size_t j=0; j<d.size(); j++) {
597  dist[j] = d[j];
598  }
599  nc = 1 + d.size();
600  }
601  g = new EGS_ParallelCones(nc,Xo,axis,gamma,dist);
602  if (dist) {
603  delete [] dist;
604  }
605  }
606  else {
607  egsWarning("createGeometry(cones): unknown object type %s\n",
608  type.c_str());
609  return 0;
610  }
611  }
612 
613  g->setName(input);
614  g->setMedia(input);
615  g->setLabels(input);
616  return g;
617  }
618 
619 }
Base geometry class. Every geometry class must be derived from EGS_BaseGeometry.
int deref()
Decrease the reference count to this geometry.
virtual void setBScaling(int start, int end, EGS_Float bf)
Set the B field scaling factor in regions.
void setMedia(EGS_Input *inp)
Set the media in the geometry from the input pointed to by inp.
int nreg
Number of local regions in this geometry.
bool is_convex
Is this geometry convex?
EGS_Float boundaryTolerance
Boundary tolerance for geometries that need it.
void setName(EGS_Input *inp)
Set the name of the geometry from the input inp.
void setMedium(const string &Name)
Set all regions to a medium with name Name.
int setLabels(EGS_Input *input)
Set the labels from an input block.
virtual void printInfo() const
Print information about this geometry.
int ref()
Increase the reference count to this geometry.
void setBoundaryTolerance(EGS_Input *inp)
Set the value of the boundary tolerance from the input inp.
A set of cones with different opening angles but the same axis and apexes.
Definition: egs_cones.h:1061
A cone stack.
Definition: egs_cones.h:1463
A class for storing information in a tree-like structure of key-value pairs. This class is used throu...
Definition: egs_input.h:182
EGS_Input * takeInputItem(const string &key, bool self=true)
Get the property named key.
Definition: egs_input.cpp:229
static bool compare(const string &s1, const string &s2)
Definition: egs_input.cpp:1173
int getInput(const string &key, vector< string > &values) const
Assign values to an array of strings from an input identified by key.
Definition: egs_input.cpp:341
A set of "parallel cones" (i.e. cones with the same axis and opening angles but different apexes)
Definition: egs_cones.h:741
A single cone that may be open (i.e. extends to infinity or closed by a plane perpendicular to the co...
Definition: egs_cones.h:126
A class representing 3D vectors.
Definition: egs_vector.h:57
EGS_Float y
y-component
Definition: egs_vector.h:62
EGS_Float z
z-component
Definition: egs_vector.h:63
EGS_Float x
x-component
Definition: egs_vector.h:61
Various cone geometries: header.
EGS_GLIB_EXPORT EGS_BaseGeometry * createGeometry(EGS_Input *input)
Definition: egs_glib.cpp:84
EGS_Input class header file.
EGS_InfoFunction EGS_EXPORT egsInformation
Always use this function for reporting the progress of a simulation and any other type of information...
EGS_InfoFunction EGS_EXPORT egsWarning
Always use this function for reporting warnings.