GEMC  2.3
Geant4 Monte-Carlo Framework
gdml_solids.cc
Go to the documentation of this file.
1 
2 // c++ headers
3 #include <string>
4 #include "utils.h"
5 #include "gdml_det_factory.h"
6 
7 using namespace std;
8 
9 // Qt4 headers
10 #include <QDomDocument>
11 
12 
13 string rad_to_deg (string radValue) //converts a radian value to a degree value
14 {
15  string newValue = radValue;
16 
17  if (radValue == "TWOPI")
18  {
19  newValue = "360";
20 
21  }
22  if (radValue == "PI")
23  {
24  newValue = "180";
25 
26  }
27  if (radValue == "HALFPI")
28  {
29  newValue = "90";
30 
31  }
32 
33  return newValue;
34 
35 
36 }
37 
38 string rad_to_deg_u (string radValue, string radUnit)
39 {
40  string newUnit = radUnit;
41 
42  if (radValue == "360" || radValue == "180" || radValue == "90" )
43  {
44  newUnit = "deg";
45 
46  }
47 
48 
49  return newUnit;
50 
51 
52 }
53 
54 //This function parses solid nodes and get values using gconstantMap and resolve_string.
55 //Return value is a string with dimension values and units.
56 string get_dimensions(QDomNode solidNode, map<string, double> gconstantMap)
57 {
58  string dimension;
59 
60  QDomElement ee = solidNode.toElement();
61 
62 
63  if(ee.tagName().toStdString() == "box"){
64 
65  string x = assignAttribute(ee, "x", "0");
66  string y = assignAttribute(ee, "y", "0");
67  string z = assignAttribute(ee, "z", "0");
68 
69  string c_x = stringify(resolve_string(x, gconstantMap));
70  string c_y = stringify(resolve_string(y, gconstantMap));
71  string c_z = stringify(resolve_string(z, gconstantMap));
72 
73  string lunits = assignAttribute(ee, "lunit", "mm");
74 
75  dimension = c_x + "*" + lunits + " " + c_y + "*" + lunits + " " + c_z + "*" + lunits;
76 
77  }
78  if(ee.tagName().toStdString() == "cone"){
79 
80  string rmin1 = assignAttribute(ee, "rmin1", "0");
81  string rmax1 = assignAttribute(ee, "rmax1", "0");
82  string rmin2 = assignAttribute(ee, "rmin2", "0");
83  string rmax2 = assignAttribute(ee, "rmax2", "0");
84  string z = assignAttribute(ee, "z", "0");
85 
86  string startphi = rad_to_deg (assignAttribute(ee, "startphi", "0"));
87  string deltaphi = rad_to_deg (assignAttribute(ee, "deltaphi", "0"));
88 
89  string c_rmin1 = stringify(resolve_string(rmin1, gconstantMap));
90  string c_rmax1 = stringify(resolve_string(rmax1, gconstantMap));
91  string c_rmin2 = stringify(resolve_string(rmin2, gconstantMap));
92  string c_rmax2 = stringify(resolve_string(rmax2, gconstantMap));
93  string c_z = stringify(resolve_string(z, gconstantMap));
94  string c_startphi = stringify(resolve_string(startphi, gconstantMap));
95  string c_deltaphi = stringify(resolve_string(deltaphi, gconstantMap));
96 
97  string lunits = assignAttribute(ee, "lunit", "mm");
98  string aunits = assignAttribute(ee, "aunit", "deg");
99 
100  if(rad_to_deg_u (c_startphi, aunits) == "deg" || rad_to_deg_u (c_deltaphi, aunits) == "deg")
101  aunits = "deg";
102 
103  dimension = c_rmin1 + "*" + lunits + " " + c_rmax1 + "*" + lunits + " " + c_rmin2 + "*" + lunits + " "+ c_rmax2 + "*" + lunits + " " + c_z + "*" + lunits + " " +
104  c_startphi + "*" + aunits + " " + c_deltaphi + "*" + aunits;
105  }
106 
107  if(ee.tagName().toStdString() == "para"){
108 
109  string x = assignAttribute(ee, "x", "0");
110  string y = assignAttribute(ee, "y", "0");
111  string z = assignAttribute(ee, "z", "0");
112 
113  string alpha = rad_to_deg (assignAttribute(ee, "alpha", "0"));
114  string theta = rad_to_deg (assignAttribute(ee, "theta", "0"));
115  string phi = rad_to_deg (assignAttribute(ee, "phi", "0"));
116 
117  string c_x = stringify(resolve_string(x, gconstantMap));
118  string c_y = stringify(resolve_string(y, gconstantMap));
119  string c_z = stringify(resolve_string(z, gconstantMap));
120  string c_alpha = stringify(resolve_string(alpha, gconstantMap));
121  string c_theta = stringify(resolve_string(theta, gconstantMap));
122  string c_phi= stringify(resolve_string(phi, gconstantMap));
123 
124  string lunits = assignAttribute(ee, "lunit", "mm");
125  string aunits = assignAttribute(ee, "aunit", "deg");
126 
127  if(rad_to_deg_u (c_alpha, aunits) == "deg" || rad_to_deg_u (c_theta, aunits) == "deg" || rad_to_deg_u (c_phi, aunits) == "deg")
128  aunits = "deg";
129 
130  dimension = c_x + "*" + lunits + " " + c_y +"*" + lunits + " " + c_z + "*" + lunits + " " + c_alpha + "*" + aunits + " " + c_theta + "*" + aunits + " " + c_phi + "*" + aunits;
131  }
132 
133  if(ee.tagName().toStdString() == "sphere"){
134 
135  string rmin = assignAttribute(ee, "rmin", "0");
136  string rmax = assignAttribute(ee, "rmax", "0");
137 
138  string startphi = rad_to_deg (assignAttribute(ee, "startphi", "0"));
139  string deltaphi =rad_to_deg ( assignAttribute(ee, "deltaphi", "0"));
140  string starttheta = rad_to_deg (assignAttribute(ee, "starttheta", "0"));
141  string deltatheta = rad_to_deg (assignAttribute(ee, "deltatheta", "0"));
142 
143  string c_rmin = stringify(resolve_string(rmin, gconstantMap));
144  string c_rmax = stringify(resolve_string(rmax, gconstantMap));
145  string c_startphi = stringify(resolve_string(startphi, gconstantMap));
146  string c_deltaphi = stringify(resolve_string(deltaphi, gconstantMap));
147  string c_starttheta = stringify(resolve_string(starttheta, gconstantMap));
148  string c_deltatheta = stringify(resolve_string(deltatheta, gconstantMap));
149 
150 
151  string lunits = assignAttribute(ee, "lunit", "mm");
152  string aunits = assignAttribute(ee, "aunit", "deg");
153 
154 
155  if(rad_to_deg_u (c_startphi, aunits) == "deg" || rad_to_deg_u (c_deltaphi, aunits) == "deg" || rad_to_deg_u (c_starttheta, aunits) == "deg" ||rad_to_deg_u (c_deltatheta, aunits)=="deg" )
156  aunits = "deg";
157 
158  dimension = c_rmin + "*" + lunits + " " + c_rmax + "*" + lunits + " "
159  + c_startphi + "*" + aunits + " " + c_deltaphi + "*" + aunits + " " + c_starttheta + "*" + aunits + " " + c_deltatheta + "*" + aunits;
160 
161  }
162 
163  //can't find arb8 and trap.
164 
165  if(ee.tagName().toStdString() == "trd"){
166 
167  string x1 = assignAttribute(ee, "x1", "0");
168  string y1 = assignAttribute(ee, "y1", "0");
169  string x2 = assignAttribute(ee, "x2", "0");
170  string y2 = assignAttribute(ee, "y2", "0");
171  string z = assignAttribute(ee, "z", "0");
172 
173  string c_x1 = stringify(resolve_string(x1, gconstantMap));
174  string c_y1 = stringify(resolve_string(y1, gconstantMap));
175  string c_x2 = stringify(resolve_string(x2, gconstantMap));
176  string c_y2 = stringify(resolve_string(y2, gconstantMap));
177  string c_z = stringify(resolve_string(z, gconstantMap));
178 
179  string lunits = assignAttribute(ee, "lunit", "mm");
180 
181  dimension = c_x1 + "*" + lunits + " " + c_y1 + "*" + lunits + " " + c_x2 + "*" + lunits + " " + c_y2 + "*" + lunits + " " + c_z + "*" + lunits;
182  }
183 
184  if(ee.tagName().toStdString() == "tube"){
185 
186  string rmin = assignAttribute(ee, "rmin", "0");
187  string rmax = assignAttribute(ee, "rmax", "0");
188  string z = assignAttribute(ee, "z", "0");
189 
190  string startphi = rad_to_deg (assignAttribute(ee, "startphi", "0"));
191  string deltaphi = rad_to_deg (assignAttribute(ee, "deltaphi", "0"));
192 
193  string c_rmin = stringify(resolve_string(rmin, gconstantMap));
194  string c_rmax = stringify(resolve_string(rmax, gconstantMap));
195  string c_z = stringify(resolve_string(z, gconstantMap));
196  string c_startphi = stringify(resolve_string(startphi, gconstantMap));
197  string c_deltaphi = stringify(resolve_string(deltaphi, gconstantMap));
198 
199  string lunits = assignAttribute(ee, "lunit", "mm");
200  string aunits = assignAttribute(ee, "aunit", "deg");
201 
202 
203  if(rad_to_deg_u (c_startphi, aunits) == "deg" || rad_to_deg_u (c_deltaphi, aunits) == "deg")
204  aunits = "deg";
205 
206 
207  dimension =c_rmin + "*" + lunits + " " + c_rmax + "*" + lunits + " " +c_z + "*" + lunits + " " + c_startphi + "*" + aunits + " " + c_deltaphi + "*" + aunits;
208  }
209 
210  //union, subtraction, polycone, telleselated
211 
212  if(ee.tagName().toStdString() == "torus"){
213 
214  string rmin = assignAttribute(ee, "rmin", "0");
215  string rmax = assignAttribute(ee, "rmax", "0");
216  string rtor = assignAttribute(ee, "rtor", "0");
217 
218  string startphi = rad_to_deg (assignAttribute(ee, "startphi", "0"));
219  string deltaphi = rad_to_deg (assignAttribute(ee, "deltaphi", "0"));
220 
221  string c_rmin = stringify(resolve_string(rmin, gconstantMap));
222  string c_rmax = stringify(resolve_string(rmax, gconstantMap));
223  string c_rtor = stringify(resolve_string(rtor, gconstantMap));
224  string c_startphi = stringify(resolve_string(startphi, gconstantMap));
225  string c_deltaphi = stringify(resolve_string(deltaphi, gconstantMap));
226 
227  string lunits = assignAttribute(ee, "lunit", "mm");
228  string aunits = assignAttribute(ee, "aunit", "deg");
229 
230  if(rad_to_deg_u (c_startphi, aunits) == "deg" || rad_to_deg_u (c_deltaphi, aunits) == "deg")
231  aunits = "deg";
232 
233 
234  dimension = c_rmin + "*" + lunits + " " + c_rmax + "*" + lunits + " " + c_rtor + "*" + lunits + " " + c_startphi + "*" + aunits + " " + c_deltaphi + "*" + aunits;
235  }
236 
237  if(ee.tagName().toStdString() == "orb"){
238 
239  string rmax = assignAttribute(ee, "rmax", "0");
240  string c_rmax = stringify(resolve_string(rmax, gconstantMap));
241 
242  string lunits = assignAttribute(ee, "lunit", "mm");
243 
244  dimension = c_rmax + "*" + lunits;
245  }
246  //polyhedra
247 
248  if(ee.tagName().toStdString() == "hype"){
249 
250  string rmin = assignAttribute(ee, "rmin", "0");
251  string rmax = assignAttribute(ee, "rmax", "0");
252 
253  string inst = rad_to_deg (assignAttribute(ee, "inst", "0"));
254  string outst = rad_to_deg (assignAttribute(ee, "outst", "0"));
255 
256  string z = assignAttribute(ee, "z", "0");
257 
258  string c_rmin = stringify(resolve_string(rmin, gconstantMap));
259  string c_rmax = stringify(resolve_string(rmax, gconstantMap));
260  string c_inst = stringify(resolve_string(inst, gconstantMap));
261  string c_outst = stringify(resolve_string(outst, gconstantMap));
262  string c_z = stringify(resolve_string(z, gconstantMap));
263 
264  string lunits = assignAttribute(ee, "lunit", "mm");
265  string aunits = assignAttribute(ee, "aunit", "deg");
266 
267  if(rad_to_deg_u (c_inst, aunits) == "deg" || rad_to_deg_u (c_outst, aunits) == "deg")
268  aunits = "deg";
269 
270 
271  dimension = c_rmin + "*" + lunits + " " + c_rmax + "*" + lunits + " " + c_inst + "*" + aunits + " " + c_outst + "*" + aunits + " " + c_z + "*" + lunits;
272  }
273 
274  if(ee.tagName().toStdString() == "eltube"){
275 
276  string x = assignAttribute(ee, "dx", "0");
277  string y = assignAttribute(ee, "dy", "0");
278  string z = assignAttribute(ee, "dz", "0");
279 
280  string c_x = stringify(resolve_string(x, gconstantMap));
281  string c_y = stringify(resolve_string(y, gconstantMap));
282  string c_z = stringify(resolve_string(z, gconstantMap));
283 
284  string lunits = assignAttribute(ee, "lunit", "mm");
285 
286  dimension = c_x + "*" + lunits + " " + c_y + "*" + lunits + " " + c_z + "*" + lunits;
287 
288  }
289 
290  if(ee.tagName().toStdString() == "ellipsoid"){
291 
292  string ax = assignAttribute(ee, "ax", "0");
293  string by = assignAttribute(ee, "by", "0");
294  string cz = assignAttribute(ee, "cz", "0");
295  string zcut1 = assignAttribute(ee, "zcut1", "0");
296  string zcut2 = assignAttribute(ee, "zcut2", "0");
297 
298  string c_ax = stringify(resolve_string(ax, gconstantMap));
299  string c_by = stringify(resolve_string(by, gconstantMap));
300  string c_cz = stringify(resolve_string(cz, gconstantMap));
301  string c_zcut1 = stringify(resolve_string(zcut1, gconstantMap));
302  string c_zcut2 = stringify(resolve_string(zcut2, gconstantMap));
303 
304  string lunits = assignAttribute(ee, "lunit", "mm");
305 
306  dimension = c_ax +"*" + lunits + " " + c_by + "*" + lunits + " " + c_cz + "*" + lunits+ " " + c_zcut1 + "*" + lunits + " " + c_zcut2 + "*" + lunits;
307 
308  }
309  //elcone
310 
311 //------------------------------followed parameters in solids.gdml
312 
313  if(ee.tagName().toStdString() == "paraboloid"){
314 
315  string rlo = assignAttribute(ee, "rlo", "0");
316  string rhi = assignAttribute(ee, "rhi", "0");
317  string z = assignAttribute(ee, "z", "0");
318 
319  string c_rlo = stringify(resolve_string(rlo, gconstantMap));
320  string c_rhi = stringify(resolve_string(rhi, gconstantMap));
321  string c_z = stringify(resolve_string(z, gconstantMap));
322 
323  string lunits = assignAttribute(ee, "lunit", "mm");
324 
325  dimension = c_rlo + "*" + lunits + " " + c_rhi + "*" + lunits + " " + c_z + "*" + lunits;
326 
327  }
328 
329  if(ee.tagName().toStdString() == "tet"){
330 
331  string vertex1 = assignAttribute(ee, "vertex1", "0");
332  string vertex2 = assignAttribute(ee, "vertex2", "0");
333  string vertex3 = assignAttribute(ee, "vertex3", "0");
334  string vertex4 = assignAttribute(ee, "vertex4", "0");
335 
336  string c_vertex1 = stringify(resolve_string(vertex1, gconstantMap));
337  string c_vertex2 = stringify(resolve_string(vertex2, gconstantMap));
338  string c_vertex3 = stringify(resolve_string(vertex3, gconstantMap));
339  string c_vertex4 = stringify(resolve_string(vertex4, gconstantMap));
340 
341  dimension = c_vertex1 + ", " + c_vertex2 + ", " + c_vertex3 + ", " + c_vertex4;
342  }
343 
344  if(ee.tagName().toStdString() == "twistedbox"){
345 
346  string PhiTwist = rad_to_deg (assignAttribute(ee, "PhiTwist", "0"));
347 
348  string x = assignAttribute(ee, "x", "0");
349  string y = assignAttribute(ee, "y", "0");
350  string z = assignAttribute(ee, "z", "0");
351 
352  string c_PhiTwist = stringify(resolve_string(PhiTwist, gconstantMap));
353  string c_x = stringify(resolve_string(x, gconstantMap));
354  string c_y = stringify(resolve_string(y, gconstantMap));
355  string c_z = stringify(resolve_string(z, gconstantMap));
356 
357  string lunits = assignAttribute(ee, "lunit", "mm");
358  string aunits = assignAttribute(ee, "aunit", "deg");
359 
360  rad_to_deg_u (c_PhiTwist, aunits);
361 
362  dimension = c_PhiTwist + "*" + aunits + " " + c_x + "*" + lunits + " " + c_y + "*" + lunits + " " + c_z + "*" + lunits;
363 
364  }
365 
366  if(ee.tagName().toStdString() == "twistedtrd"){
367 
368  string PhiTwist = rad_to_deg (assignAttribute(ee, "PhiTwist", "0"));
369 
370  string x1 = assignAttribute(ee, "x1", "0");
371  string y1 = assignAttribute(ee, "y1", "0");
372  string x2 = assignAttribute(ee, "x2", "0");
373  string y2 = assignAttribute(ee, "y2", "0");
374  string z = assignAttribute(ee, "z", "0");
375 
376  string c_PhiTwist = stringify(resolve_string(PhiTwist, gconstantMap));
377  string c_x1 = stringify(resolve_string(x1, gconstantMap));
378  string c_y1 = stringify(resolve_string(y1, gconstantMap));
379  string c_x2 = stringify(resolve_string(x2, gconstantMap));
380  string c_y2 = stringify(resolve_string(y2, gconstantMap));
381  string c_z = stringify(resolve_string(z, gconstantMap));
382 
383  string lunits = assignAttribute(ee, "lunit", "mm");
384  string aunits = assignAttribute(ee, "aunit", "deg");
385 
386  rad_to_deg_u (c_PhiTwist, aunits);
387 
388  dimension = c_PhiTwist + "*" + aunits + " " + c_x1 + "*" + lunits + " " + c_x2 + "*" + lunits + " " + c_y1 + "*" + lunits + " " + c_y2 + "*" + lunits + " " + c_z + "*" + lunits;
389 
390  }
391 
392  if(ee.tagName().toStdString() == "twistedtrap"){
393 
394  string PhiTwist = rad_to_deg (assignAttribute(ee, "PhiTwist", "0"));
395 
396  string z = assignAttribute(ee, "z", "0");
397  string theta = rad_to_deg (assignAttribute(ee, "theta", "0"));
398  string phi = rad_to_deg (assignAttribute(ee, "phi", "0"));
399 
400  string y1 = assignAttribute(ee, "y1", "0");
401  string y2= assignAttribute(ee, "y2", "0");
402  string x1 = assignAttribute(ee, "x1", "0");
403  string x2 = assignAttribute(ee, "x2", "0");
404  string x3 = assignAttribute(ee, "x3", "0");
405  string x4 = assignAttribute(ee, "x4", "0");
406 
407  string alpha = rad_to_deg (assignAttribute(ee, "alpha", "0"));
408 
409  string c_PhiTwist = stringify(resolve_string(PhiTwist, gconstantMap));
410  string c_z = stringify(resolve_string(z, gconstantMap));
411  string c_theta = stringify(resolve_string(theta, gconstantMap));
412  string c_phi = stringify(resolve_string(phi, gconstantMap));
413  string c_y1 = stringify(resolve_string(y1, gconstantMap));
414  string c_y2 = stringify(resolve_string(y2, gconstantMap));
415  string c_x1 = stringify(resolve_string(x1, gconstantMap));
416  string c_x2 = stringify(resolve_string(x2, gconstantMap));
417  string c_x3 = stringify(resolve_string(x3, gconstantMap));
418  string c_x4 = stringify(resolve_string(x4, gconstantMap));
419 
420  string lunits = assignAttribute(ee, "lunit", "mm");
421  string aunits = assignAttribute(ee, "aunit", "deg");
422 
423  if(rad_to_deg_u (c_PhiTwist, aunits) == "deg" || rad_to_deg_u (c_theta, aunits) == "deg" || rad_to_deg_u (c_phi, aunits) == "deg" || rad_to_deg_u (c_PhiTwist, aunits) == "deg")
424  aunits = "deg";
425 
426  dimension = c_PhiTwist + "*" + aunits + " " + c_z + "*" + lunits + " " + c_theta + "*" + aunits + " " + c_phi + "*" + aunits + " "
427  + c_y1 + "*" + lunits + " " + c_y2 + "*" + lunits + " " + c_x1 + "*" + lunits + " " + c_x2 + "*" + lunits + " "
428  + c_x3 + "*" + lunits + " " + c_x4 + "*" + lunits;
429 
430  }
431 
432  if(ee.tagName().toStdString() == "twistedtubs"){
433 
434  string endinnerrad = assignAttribute(ee, "endinnerrad", "0");
435  string endouterrad = assignAttribute(ee, "endouterrad", "0");
436  string zlen = assignAttribute(ee, "zlen", "0");
437 
438  string twistedangle = rad_to_deg (assignAttribute(ee, "twistedangle", "0"));
439  string phi = rad_to_deg (assignAttribute(ee, "phi", "0"));
440 
441  string c_endinnerrad = stringify(resolve_string(endinnerrad, gconstantMap));
442  string c_endouterrad = stringify(resolve_string(endouterrad, gconstantMap));
443  string c_zlen = stringify(resolve_string(zlen, gconstantMap));
444  string c_twistedangle = stringify(resolve_string(twistedangle, gconstantMap));
445  string c_phi = stringify(resolve_string(phi, gconstantMap));
446 
447  string lunits = assignAttribute(ee, "lunit", "mm");
448  string aunits = assignAttribute(ee, "aunit", "deg");
449 
450 
451  if(rad_to_deg_u (c_phi, aunits) == "deg" || rad_to_deg_u (c_twistedangle, aunits) == "deg" ) aunits = "deg";
452 
453  dimension = c_endinnerrad + "*mm " + c_endouterrad + "*mm " + c_zlen + "*mm " +c_phi + "*deg " + c_twistedangle + "*deg ";
454 
455  }
456 
457 
458  return dimension;
459 
460 
461 }
462 
463 
STL namespace.
string assignAttribute(QDomElement e, string attribute, string defaultValue)
Definition: utils.cc:294
string get_dimensions(QDomNode solidNode, map< string, double > gconstantMap)
Definition: gdml_solids.cc:56
string rad_to_deg(string radValue)
Definition: gdml_solids.cc:13
string stringify(double x)
double resolve_string(string constString, map< string, double > gconstantMap)
string rad_to_deg_u(string radValue, string radUnit)
converts the unit radian to degree if there is radian value.
Definition: gdml_solids.cc:38