Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/persistency/gdml/src/G4GDMLReadSolids.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /persistency/gdml/src/G4GDMLReadSolids.cc (Version 11.3.0) and /persistency/gdml/src/G4GDMLReadSolids.cc (Version 8.1)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 // G4GDMLReadSolids implementation                
 27 //                                                
 28 // Author: Zoltan Torzsok, November 2007          
 29 // -------------------------------------------    
 30                                                   
 31 #include "G4GDMLReadSolids.hh"                    
 32 #include "G4Box.hh"                               
 33 #include "G4Cons.hh"                              
 34 #include "G4Ellipsoid.hh"                         
 35 #include "G4EllipticalCone.hh"                    
 36 #include "G4EllipticalTube.hh"                    
 37 #include "G4Hype.hh"                              
 38 #include "G4IntersectionSolid.hh"                 
 39 #include "G4Orb.hh"                               
 40 #include "G4Para.hh"                              
 41 #include "G4Paraboloid.hh"                        
 42 #include "G4Polycone.hh"                          
 43 #include "G4GenericPolycone.hh"                   
 44 #include "G4Polyhedra.hh"                         
 45 #include "G4QuadrangularFacet.hh"                 
 46 #include "G4ReflectedSolid.hh"                    
 47 #include "G4ScaledSolid.hh"                       
 48 #include "G4Sphere.hh"                            
 49 #include "G4SolidStore.hh"                        
 50 #include "G4SubtractionSolid.hh"                  
 51 #include "G4GenericTrap.hh"                       
 52 #include "G4TessellatedSolid.hh"                  
 53 #include "G4Tet.hh"                               
 54 #include "G4Torus.hh"                             
 55 #include "G4Transform3D.hh"                       
 56 #include "G4Trap.hh"                              
 57 #include "G4Trd.hh"                               
 58 #include "G4TriangularFacet.hh"                   
 59 #include "G4Tubs.hh"                              
 60 #include "G4CutTubs.hh"                           
 61 #include "G4TwistedBox.hh"                        
 62 #include "G4TwistedTrap.hh"                       
 63 #include "G4TwistedTrd.hh"                        
 64 #include "G4TwistedTubs.hh"                       
 65 #include "G4UnionSolid.hh"                        
 66 #include "G4OpticalSurface.hh"                    
 67 #include "G4UnitsTable.hh"                        
 68 #include "G4SurfaceProperty.hh"                   
 69                                                   
 70 // -------------------------------------------    
 71 G4GDMLReadSolids::G4GDMLReadSolids()              
 72   : G4GDMLReadMaterials()                         
 73 {                                                 
 74 }                                                 
 75                                                   
 76 // -------------------------------------------    
 77 G4GDMLReadSolids::~G4GDMLReadSolids()             
 78 {                                                 
 79 }                                                 
 80                                                   
 81 // -------------------------------------------    
 82 void G4GDMLReadSolids::BooleanRead(               
 83   const xercesc::DOMElement* const booleanElem    
 84 {                                                 
 85   G4String name;                                  
 86   G4String first;                                 
 87   G4String scnd;                                  
 88   G4ThreeVector position(0.0, 0.0, 0.0);          
 89   G4ThreeVector rotation(0.0, 0.0, 0.0);          
 90   G4ThreeVector firstposition(0.0, 0.0, 0.0);     
 91   G4ThreeVector firstrotation(0.0, 0.0, 0.0);     
 92                                                   
 93   const xercesc::DOMNamedNodeMap* const attrib    
 94     booleanElement->getAttributes();              
 95   XMLSize_t attributeCount = attributes->getLe    
 96                                                   
 97   for(XMLSize_t attribute_index = 0; attribute    
 98       ++attribute_index)                          
 99   {                                               
100     xercesc::DOMNode* attribute_node = attribu    
101                                                   
102     if(attribute_node->getNodeType() != xerces    
103     {                                             
104       continue;                                   
105     }                                             
106                                                   
107     const xercesc::DOMAttr* const attribute =     
108       dynamic_cast<xercesc::DOMAttr*>(attribut    
109     if(attribute == nullptr)                      
110     {                                             
111       G4Exception("G4GDMLReadSolids::BooleanRe    
112                   FatalException, "No attribut    
113       return;                                     
114     }                                             
115     const G4String attName  = Transcode(attrib    
116     const G4String attValue = Transcode(attrib    
117                                                   
118     if(attName == "name")                         
119     {                                             
120       name = GenerateName(attValue);              
121     }                                             
122   }                                               
123                                                   
124   for(xercesc::DOMNode* iter = booleanElement-    
125       iter                   = iter->getNextSi    
126   {                                               
127     if(iter->getNodeType() != xercesc::DOMNode    
128     {                                             
129       continue;                                   
130     }                                             
131                                                   
132     const xercesc::DOMElement* const child =      
133       dynamic_cast<xercesc::DOMElement*>(iter)    
134     if(child == nullptr)                          
135     {                                             
136       G4Exception("G4GDMLReadSolids::BooleanRe    
137                   FatalException, "No child fo    
138       return;                                     
139     }                                             
140     const G4String tag = Transcode(child->getT    
141                                                   
142     if(tag == "first")                            
143     {                                             
144       first = RefRead(child);                     
145     }                                             
146     else if(tag == "second")                      
147     {                                             
148       scnd = RefRead(child);                      
149     }                                             
150     else if(tag == "position")                    
151     {                                             
152       VectorRead(child, position);                
153     }                                             
154     else if(tag == "rotation")                    
155     {                                             
156       VectorRead(child, rotation);                
157     }                                             
158     else if(tag == "positionref")                 
159     {                                             
160       position = GetPosition(GenerateName(RefR    
161     }                                             
162     else if(tag == "rotationref")                 
163     {                                             
164       rotation = GetRotation(GenerateName(RefR    
165     }                                             
166     else if(tag == "firstposition")               
167     {                                             
168       VectorRead(child, firstposition);           
169     }                                             
170     else if(tag == "firstrotation")               
171     {                                             
172       VectorRead(child, firstrotation);           
173     }                                             
174     else if(tag == "firstpositionref")            
175     {                                             
176       firstposition = GetPosition(GenerateName    
177     }                                             
178     else if(tag == "firstrotationref")            
179     {                                             
180       firstrotation = GetRotation(GenerateName    
181     }                                             
182     else                                          
183     {                                             
184       G4String error_msg = "Unknown tag in boo    
185       G4Exception("G4GDMLReadSolids::BooleanRe    
186                   FatalException, error_msg);     
187     }                                             
188   }                                               
189                                                   
190   G4VSolid* firstSolid  = GetSolid(GenerateNam    
191   G4VSolid* secondSolid = GetSolid(GenerateNam    
192                                                   
193   G4Transform3D transform(GetRotationMatrix(ro    
194                                                   
195   if(((firstrotation.x() != 0.0) || (firstrota    
196       (firstrotation.z() != 0.0)) ||              
197      ((firstposition.x() != 0.0) || (firstposi    
198       (firstposition.z() != 0.0)))                
199   {                                               
200     G4Transform3D firsttransform(GetRotationMa    
201                                  firstposition    
202     firstSolid = new G4DisplacedSolid(Generate    
203                                       firstSol    
204   }                                               
205                                                   
206   if(op == UNION)                                 
207   {                                               
208     new G4UnionSolid(name, firstSolid, secondS    
209   }                                               
210   else if(op == SUBTRACTION)                      
211   {                                               
212     new G4SubtractionSolid(name, firstSolid, s    
213   }                                               
214   else if(op == INTERSECTION)                     
215   {                                               
216     new G4IntersectionSolid(name, firstSolid,     
217   }                                               
218 }                                                 
219                                                   
220 // -------------------------------------------    
221 void G4GDMLReadSolids::BoxRead(const xercesc::    
222 {                                                 
223   G4String name;                                  
224   G4double lunit = 1.0;                           
225   G4double x     = 0.0;                           
226   G4double y     = 0.0;                           
227   G4double z     = 0.0;                           
228                                                   
229   const xercesc::DOMNamedNodeMap* const attrib    
230     boxElement->getAttributes();                  
231   XMLSize_t attributeCount = attributes->getLe    
232                                                   
233   for(XMLSize_t attribute_index = 0; attribute    
234       ++attribute_index)                          
235   {                                               
236     xercesc::DOMNode* attribute_node = attribu    
237                                                   
238     if(attribute_node->getNodeType() != xerces    
239     {                                             
240       continue;                                   
241     }                                             
242                                                   
243     const xercesc::DOMAttr* const attribute =     
244       dynamic_cast<xercesc::DOMAttr*>(attribut    
245     if(attribute == nullptr)                      
246     {                                             
247       G4Exception("G4GDMLReadSolids::BoxRead()    
248                   "No attribute found!");         
249       return;                                     
250     }                                             
251     const G4String attName  = Transcode(attrib    
252     const G4String attValue = Transcode(attrib    
253                                                   
254     if(attName == "name")                         
255     {                                             
256       name = GenerateName(attValue);              
257     }                                             
258     else if(attName == "lunit")                   
259     {                                             
260       lunit = G4UnitDefinition::GetValueOf(att    
261       if(G4UnitDefinition::GetCategory(attValu    
262       {                                           
263         G4Exception("G4GDMLReadSolids::BoxRead    
264                     FatalException, "Invalid u    
265       }                                           
266     }                                             
267     else if(attName == "x")                       
268     {                                             
269       x = eval.Evaluate(attValue);                
270     }                                             
271     else if(attName == "y")                       
272     {                                             
273       y = eval.Evaluate(attValue);                
274     }                                             
275     else if(attName == "z")                       
276     {                                             
277       z = eval.Evaluate(attValue);                
278     }                                             
279   }                                               
280                                                   
281   x *= 0.5 * lunit;                               
282   y *= 0.5 * lunit;                               
283   z *= 0.5 * lunit;                               
284                                                   
285   new G4Box(name, x, y, z);                       
286 }                                                 
287                                                   
288 // -------------------------------------------    
289 void G4GDMLReadSolids::ConeRead(const xercesc:    
290 {                                                 
291   G4String name;                                  
292   G4double lunit    = 1.0;                        
293   G4double aunit    = 1.0;                        
294   G4double rmin1    = 0.0;                        
295   G4double rmax1    = 0.0;                        
296   G4double rmin2    = 0.0;                        
297   G4double rmax2    = 0.0;                        
298   G4double z        = 0.0;                        
299   G4double startphi = 0.0;                        
300   G4double deltaphi = 0.0;                        
301                                                   
302   const xercesc::DOMNamedNodeMap* const attrib    
303     coneElement->getAttributes();                 
304   XMLSize_t attributeCount = attributes->getLe    
305                                                   
306   for(XMLSize_t attribute_index = 0; attribute    
307       ++attribute_index)                          
308   {                                               
309     xercesc::DOMNode* attribute_node = attribu    
310                                                   
311     if(attribute_node->getNodeType() != xerces    
312     {                                             
313       continue;                                   
314     }                                             
315                                                   
316     const xercesc::DOMAttr* const attribute =     
317       dynamic_cast<xercesc::DOMAttr*>(attribut    
318     if(attribute == nullptr)                      
319     {                                             
320       G4Exception("G4GDMLReadSolids::ConeRead(    
321                   "No attribute found!");         
322       return;                                     
323     }                                             
324     const G4String attName  = Transcode(attrib    
325     const G4String attValue = Transcode(attrib    
326                                                   
327     if(attName == "name")                         
328     {                                             
329       name = GenerateName(attValue);              
330     }                                             
331     else if(attName == "lunit")                   
332     {                                             
333       lunit = G4UnitDefinition::GetValueOf(att    
334       if(G4UnitDefinition::GetCategory(attValu    
335       {                                           
336         G4Exception("G4GDMLReadSolids::ConeRea    
337                     FatalException, "Invalid u    
338       }                                           
339     }                                             
340     else if(attName == "aunit")                   
341     {                                             
342       aunit = G4UnitDefinition::GetValueOf(att    
343       if(G4UnitDefinition::GetCategory(attValu    
344       {                                           
345         G4Exception("G4GDMLReadSolids::ConeRea    
346                     FatalException, "Invalid u    
347       }                                           
348     }                                             
349     else if(attName == "rmin1")                   
350     {                                             
351       rmin1 = eval.Evaluate(attValue);            
352     }                                             
353     else if(attName == "rmax1")                   
354     {                                             
355       rmax1 = eval.Evaluate(attValue);            
356     }                                             
357     else if(attName == "rmin2")                   
358     {                                             
359       rmin2 = eval.Evaluate(attValue);            
360     }                                             
361     else if(attName == "rmax2")                   
362     {                                             
363       rmax2 = eval.Evaluate(attValue);            
364     }                                             
365     else if(attName == "z")                       
366     {                                             
367       z = eval.Evaluate(attValue);                
368     }                                             
369     else if(attName == "startphi")                
370     {                                             
371       startphi = eval.Evaluate(attValue);         
372     }                                             
373     else if(attName == "deltaphi")                
374     {                                             
375       deltaphi = eval.Evaluate(attValue);         
376     }                                             
377   }                                               
378                                                   
379   rmin1 *= lunit;                                 
380   rmax1 *= lunit;                                 
381   rmin2 *= lunit;                                 
382   rmax2 *= lunit;                                 
383   z *= 0.5 * lunit;                               
384   startphi *= aunit;                              
385   deltaphi *= aunit;                              
386                                                   
387   new G4Cons(name, rmin1, rmax1, rmin2, rmax2,    
388 }                                                 
389                                                   
390 // -------------------------------------------    
391 void G4GDMLReadSolids::ElconeRead(                
392   const xercesc::DOMElement* const elconeEleme    
393 {                                                 
394   G4String name;                                  
395   G4double lunit = 1.0;                           
396   G4double dx    = 0.0;                           
397   G4double dy    = 0.0;                           
398   G4double zmax  = 0.0;                           
399   G4double zcut  = 0.0;                           
400                                                   
401   const xercesc::DOMNamedNodeMap* const attrib    
402     elconeElement->getAttributes();               
403   XMLSize_t attributeCount = attributes->getLe    
404                                                   
405   for(XMLSize_t attribute_index = 0; attribute    
406       ++attribute_index)                          
407   {                                               
408     xercesc::DOMNode* attribute_node = attribu    
409                                                   
410     if(attribute_node->getNodeType() != xerces    
411     {                                             
412       continue;                                   
413     }                                             
414                                                   
415     const xercesc::DOMAttr* const attribute =     
416       dynamic_cast<xercesc::DOMAttr*>(attribut    
417     if(attribute == nullptr)                      
418     {                                             
419       G4Exception("G4GDMLReadSolids::ElconeRea    
420                   FatalException, "No attribut    
421       return;                                     
422     }                                             
423     const G4String attName  = Transcode(attrib    
424     const G4String attValue = Transcode(attrib    
425                                                   
426     if(attName == "name")                         
427     {                                             
428       name = GenerateName(attValue);              
429     }                                             
430     else if(attName == "lunit")                   
431     {                                             
432       lunit = G4UnitDefinition::GetValueOf(att    
433       if(G4UnitDefinition::GetCategory(attValu    
434       {                                           
435         G4Exception("G4GDMLReadSolids::ElconeR    
436                     FatalException, "Invalid u    
437       }                                           
438     }                                             
439     else if(attName == "dx")                      
440     {                                             
441       dx = eval.Evaluate(attValue);               
442     }                                             
443     else if(attName == "dy")                      
444     {                                             
445       dy = eval.Evaluate(attValue);               
446     }                                             
447     else if(attName == "zmax")                    
448     {                                             
449       zmax = eval.Evaluate(attValue);             
450     }                                             
451     else if(attName == "zcut")                    
452     {                                             
453       zcut = eval.Evaluate(attValue);             
454     }                                             
455   }                                               
456                                                   
457   zmax *= lunit;                                  
458   zcut *= lunit;                                  
459                                                   
460   new G4EllipticalCone(name, dx, dy, zmax, zcu    
461 }                                                 
462                                                   
463 // -------------------------------------------    
464 void G4GDMLReadSolids::EllipsoidRead(             
465   const xercesc::DOMElement* const ellipsoidEl    
466 {                                                 
467   G4String name;                                  
468   G4double lunit = 1.0;                           
469   G4double ax    = 0.0;                           
470   G4double by    = 0.0;                           
471   G4double cz    = 0.0;                           
472   G4double zcut1 = 0.0;                           
473   G4double zcut2 = 0.0;                           
474                                                   
475   const xercesc::DOMNamedNodeMap* const attrib    
476     ellipsoidElement->getAttributes();            
477   XMLSize_t attributeCount = attributes->getLe    
478                                                   
479   for(XMLSize_t attribute_index = 0; attribute    
480       ++attribute_index)                          
481   {                                               
482     xercesc::DOMNode* attribute_node = attribu    
483                                                   
484     if(attribute_node->getNodeType() != xerces    
485     {                                             
486       continue;                                   
487     }                                             
488                                                   
489     const xercesc::DOMAttr* const attribute =     
490       dynamic_cast<xercesc::DOMAttr*>(attribut    
491     if(attribute == nullptr)                      
492     {                                             
493       G4Exception("G4GDMLReadSolids::Ellipsoid    
494                   FatalException, "No attribut    
495       return;                                     
496     }                                             
497     const G4String attName  = Transcode(attrib    
498     const G4String attValue = Transcode(attrib    
499                                                   
500     if(attName == "name")                         
501     {                                             
502       name = GenerateName(attValue);              
503     }                                             
504     else if(attName == "lunit")                   
505     {                                             
506       lunit = G4UnitDefinition::GetValueOf(att    
507       if(G4UnitDefinition::GetCategory(attValu    
508       {                                           
509         G4Exception("G4GDMLReadSolids::Ellipso    
510                     FatalException, "Invalid u    
511       }                                           
512     }                                             
513     else if(attName == "ax")                      
514     {                                             
515       ax = eval.Evaluate(attValue);               
516     }                                             
517     else if(attName == "by")                      
518     {                                             
519       by = eval.Evaluate(attValue);               
520     }                                             
521     else if(attName == "cz")                      
522     {                                             
523       cz = eval.Evaluate(attValue);               
524     }                                             
525     else if(attName == "zcut1")                   
526     {                                             
527       zcut1 = eval.Evaluate(attValue);            
528     }                                             
529     else if(attName == "zcut2")                   
530     {                                             
531       zcut2 = eval.Evaluate(attValue);            
532     }                                             
533   }                                               
534                                                   
535   ax *= lunit;                                    
536   by *= lunit;                                    
537   cz *= lunit;                                    
538   zcut1 *= lunit;                                 
539   zcut2 *= lunit;                                 
540                                                   
541   new G4Ellipsoid(name, ax, by, cz, zcut1, zcu    
542 }                                                 
543                                                   
544 // -------------------------------------------    
545 void G4GDMLReadSolids::EltubeRead(                
546   const xercesc::DOMElement* const eltubeEleme    
547 {                                                 
548   G4String name;                                  
549   G4double lunit = 1.0;                           
550   G4double dx    = 0.0;                           
551   G4double dy    = 0.0;                           
552   G4double dz    = 0.0;                           
553                                                   
554   const xercesc::DOMNamedNodeMap* const attrib    
555     eltubeElement->getAttributes();               
556   XMLSize_t attributeCount = attributes->getLe    
557                                                   
558   for(XMLSize_t attribute_index = 0; attribute    
559       ++attribute_index)                          
560   {                                               
561     xercesc::DOMNode* attribute_node = attribu    
562                                                   
563     if(attribute_node->getNodeType() != xerces    
564     {                                             
565       continue;                                   
566     }                                             
567                                                   
568     const xercesc::DOMAttr* const attribute =     
569       dynamic_cast<xercesc::DOMAttr*>(attribut    
570     if(attribute == nullptr)                      
571     {                                             
572       G4Exception("G4GDMLReadSolids::EltubeRea    
573                   FatalException, "No attribut    
574       return;                                     
575     }                                             
576     const G4String attName  = Transcode(attrib    
577     const G4String attValue = Transcode(attrib    
578                                                   
579     if(attName == "name")                         
580     {                                             
581       name = GenerateName(attValue);              
582     }                                             
583     else if(attName == "lunit")                   
584     {                                             
585       lunit = G4UnitDefinition::GetValueOf(att    
586       if(G4UnitDefinition::GetCategory(attValu    
587       {                                           
588         G4Exception("G4GDMLReadSolids::EltubeR    
589                     FatalException, "Invalid u    
590       }                                           
591     }                                             
592     else if(attName == "dx")                      
593     {                                             
594       dx = eval.Evaluate(attValue);               
595     }                                             
596     else if(attName == "dy")                      
597     {                                             
598       dy = eval.Evaluate(attValue);               
599     }                                             
600     else if(attName == "dz")                      
601     {                                             
602       dz = eval.Evaluate(attValue);               
603     }                                             
604   }                                               
605                                                   
606   dx *= lunit;                                    
607   dy *= lunit;                                    
608   dz *= lunit;                                    
609                                                   
610   new G4EllipticalTube(name, dx, dy, dz);         
611 }                                                 
612                                                   
613 // -------------------------------------------    
614 void G4GDMLReadSolids::XtruRead(const xercesc:    
615 {                                                 
616   G4String name;                                  
617   G4double lunit = 1.0;                           
618                                                   
619   const xercesc::DOMNamedNodeMap* const attrib    
620     xtruElement->getAttributes();                 
621   XMLSize_t attributeCount = attributes->getLe    
622                                                   
623   for(XMLSize_t attribute_index = 0; attribute    
624       ++attribute_index)                          
625   {                                               
626     xercesc::DOMNode* attribute_node = attribu    
627                                                   
628     if(attribute_node->getNodeType() != xerces    
629     {                                             
630       continue;                                   
631     }                                             
632                                                   
633     const xercesc::DOMAttr* const attribute =     
634       dynamic_cast<xercesc::DOMAttr*>(attribut    
635     if(attribute == nullptr)                      
636     {                                             
637       G4Exception("G4GDMLReadSolids::XtruRead(    
638                   "No attribute found!");         
639       return;                                     
640     }                                             
641     const G4String attName  = Transcode(attrib    
642     const G4String attValue = Transcode(attrib    
643                                                   
644     if(attName == "name")                         
645     {                                             
646       name = GenerateName(attValue);              
647     }                                             
648     else if(attName == "lunit")                   
649     {                                             
650       lunit = G4UnitDefinition::GetValueOf(att    
651       if(G4UnitDefinition::GetCategory(attValu    
652       {                                           
653         G4Exception("G4GDMLReadSolids::XtruRea    
654                     FatalException, "Invalid u    
655       }                                           
656     }                                             
657   }                                               
658                                                   
659   std::vector<G4TwoVector> twoDimVertexList;      
660   std::vector<G4ExtrudedSolid::ZSection> secti    
661                                                   
662   for(xercesc::DOMNode* iter = xtruElement->ge    
663       iter                   = iter->getNextSi    
664   {                                               
665     if(iter->getNodeType() != xercesc::DOMNode    
666     {                                             
667       continue;                                   
668     }                                             
669                                                   
670     const xercesc::DOMElement* const child =      
671       dynamic_cast<xercesc::DOMElement*>(iter)    
672     if(child == nullptr)                          
673     {                                             
674       G4Exception("G4GDMLReadSolids::XtruRead(    
675                   "No child found!");             
676       return;                                     
677     }                                             
678     const G4String tag = Transcode(child->getT    
679                                                   
680     if(tag == "twoDimVertex")                     
681     {                                             
682       twoDimVertexList.push_back(TwoDimVertexR    
683     }                                             
684     else if(tag == "section")                     
685     {                                             
686       sectionList.push_back(SectionRead(child,    
687     }                                             
688   }                                               
689                                                   
690   new G4ExtrudedSolid(name, twoDimVertexList,     
691 }                                                 
692                                                   
693 // -------------------------------------------    
694 void G4GDMLReadSolids::HypeRead(const xercesc:    
695 {                                                 
696   G4String name;                                  
697   G4double lunit = 1.0;                           
698   G4double aunit = 1.0;                           
699   G4double rmin  = 0.0;                           
700   G4double rmax  = 0.0;                           
701   G4double inst  = 0.0;                           
702   G4double outst = 0.0;                           
703   G4double z     = 0.0;                           
704                                                   
705   const xercesc::DOMNamedNodeMap* const attrib    
706     hypeElement->getAttributes();                 
707   XMLSize_t attributeCount = attributes->getLe    
708                                                   
709   for(XMLSize_t attribute_index = 0; attribute    
710       ++attribute_index)                          
711   {                                               
712     xercesc::DOMNode* attribute_node = attribu    
713                                                   
714     if(attribute_node->getNodeType() != xerces    
715     {                                             
716       continue;                                   
717     }                                             
718                                                   
719     const xercesc::DOMAttr* const attribute =     
720       dynamic_cast<xercesc::DOMAttr*>(attribut    
721     if(attribute == nullptr)                      
722     {                                             
723       G4Exception("G4GDMLReadSolids::HypeRead(    
724                   "No attribute found!");         
725       return;                                     
726     }                                             
727     const G4String attName  = Transcode(attrib    
728     const G4String attValue = Transcode(attrib    
729                                                   
730     if(attName == "name")                         
731     {                                             
732       name = GenerateName(attValue);              
733     }                                             
734     else if(attName == "lunit")                   
735     {                                             
736       lunit = G4UnitDefinition::GetValueOf(att    
737       if(G4UnitDefinition::GetCategory(attValu    
738       {                                           
739         G4Exception("G4GDMLReadSolids::HypeRea    
740                     FatalException, "Invalid u    
741       }                                           
742     }                                             
743     else if(attName == "aunit")                   
744     {                                             
745       aunit = G4UnitDefinition::GetValueOf(att    
746       if(G4UnitDefinition::GetCategory(attValu    
747       {                                           
748         G4Exception("G4GDMLReadSolids::HypeRea    
749                     FatalException, "Invalid u    
750       }                                           
751     }                                             
752     else if(attName == "rmin")                    
753     {                                             
754       rmin = eval.Evaluate(attValue);             
755     }                                             
756     else if(attName == "rmax")                    
757     {                                             
758       rmax = eval.Evaluate(attValue);             
759     }                                             
760     else if(attName == "inst")                    
761     {                                             
762       inst = eval.Evaluate(attValue);             
763     }                                             
764     else if(attName == "outst")                   
765     {                                             
766       outst = eval.Evaluate(attValue);            
767     }                                             
768     else if(attName == "z")                       
769     {                                             
770       z = eval.Evaluate(attValue);                
771     }                                             
772   }                                               
773                                                   
774   rmin *= lunit;                                  
775   rmax *= lunit;                                  
776   inst *= aunit;                                  
777   outst *= aunit;                                 
778   z *= 0.5 * lunit;                               
779                                                   
780   new G4Hype(name, rmin, rmax, inst, outst, z)    
781 }                                                 
782                                                   
783 // -------------------------------------------    
784 void G4GDMLReadSolids::MultiUnionNodeRead(        
785   const xercesc::DOMElement* const unionNodeEl    
786   G4MultiUnion* const multiUnionSolid)            
787 {                                                 
788   G4String name;                                  
789   G4String solid;                                 
790   G4ThreeVector position(0.0, 0.0, 0.0);          
791   G4ThreeVector rotation(0.0, 0.0, 0.0);          
792                                                   
793   const xercesc::DOMNamedNodeMap* const attrib    
794     unionNodeElement->getAttributes();            
795   XMLSize_t attributeCount = attributes->getLe    
796                                                   
797   for(XMLSize_t attribute_index = 0; attribute    
798       ++attribute_index)                          
799   {                                               
800     xercesc::DOMNode* attribute_node = attribu    
801                                                   
802     if(attribute_node->getNodeType() != xerces    
803     {                                             
804       continue;                                   
805     }                                             
806                                                   
807     const xercesc::DOMAttr* const attribute =     
808       dynamic_cast<xercesc::DOMAttr*>(attribut    
809     if(attribute == nullptr)                      
810     {                                             
811       G4Exception("G4GDMLReadSolids::MultiUnio    
812                   FatalException, "No attribut    
813       return;                                     
814     }                                             
815     const G4String attName  = Transcode(attrib    
816     const G4String attValue = Transcode(attrib    
817                                                   
818     if(attName == "name")                         
819     {                                             
820       name = GenerateName(attValue);              
821     }                                             
822   }                                               
823                                                   
824   for(xercesc::DOMNode* iter = unionNodeElemen    
825                         iter != nullptr; iter     
826   {                                               
827     if(iter->getNodeType() != xercesc::DOMNode    
828     {                                             
829       continue;                                   
830     }                                             
831                                                   
832     const xercesc::DOMElement* const child =      
833       dynamic_cast<xercesc::DOMElement*>(iter)    
834     if(child == nullptr)                          
835     {                                             
836       G4Exception("G4GDMLReadSolids::MultiUnio    
837                   FatalException, "No child fo    
838       return;                                     
839     }                                             
840     const G4String tag = Transcode(child->getT    
841                                                   
842     if(tag == "position")                         
843     {                                             
844       VectorRead(child, position);                
845     }                                             
846     else if(tag == "rotation")                    
847     {                                             
848       VectorRead(child, rotation);                
849     }                                             
850     else if(tag == "positionref")                 
851     {                                             
852       position = GetPosition(GenerateName(RefR    
853     }                                             
854     else if(tag == "rotationref")                 
855     {                                             
856       rotation = GetRotation(GenerateName(RefR    
857     }                                             
858     else if(tag == "solid")                       
859     {                                             
860       solid = RefRead(child);                     
861     }                                             
862     else                                          
863     {                                             
864       G4String error_msg = "Unknown tag in Mul    
865       G4Exception("G4GDMLReadSolids::MultiUnio    
866                   FatalException, error_msg);     
867     }                                             
868   }                                               
869   G4VSolid* solidNode = GetSolid(GenerateName(    
870   G4Transform3D transform(GetRotationMatrix(ro    
871   multiUnionSolid->AddNode(*solidNode, transfo    
872 }                                                 
873                                                   
874 // -------------------------------------------    
875 void G4GDMLReadSolids::MultiUnionRead(            
876   const xercesc::DOMElement* const unionElemen    
877 {                                                 
878   G4String name;                                  
879                                                   
880   const xercesc::DOMNamedNodeMap* const attrib    
881     unionElement->getAttributes();                
882   XMLSize_t attributeCount = attributes->getLe    
883                                                   
884   for(XMLSize_t attribute_index = 0; attribute    
885       ++attribute_index)                          
886   {                                               
887     xercesc::DOMNode* attribute_node = attribu    
888                                                   
889     if(attribute_node->getNodeType() != xerces    
890     {                                             
891       continue;                                   
892     }                                             
893                                                   
894     const xercesc::DOMAttr* const attribute =     
895       dynamic_cast<xercesc::DOMAttr*>(attribut    
896     if(attribute == nullptr)                      
897     {                                             
898       G4Exception("G4GDMLReadSolids::MultiUnio    
899                   FatalException, "No attribut    
900       return;                                     
901     }                                             
902     const G4String attName  = Transcode(attrib    
903     const G4String attValue = Transcode(attrib    
904                                                   
905     if(attName == "name")                         
906     {                                             
907       name = GenerateName(attValue);              
908     }                                             
909   }                                               
910                                                   
911   G4MultiUnion* multiUnion = new G4MultiUnion(    
912                                                   
913   for(xercesc::DOMNode* iter = unionElement->g    
914       iter                   = iter->getNextSi    
915   {                                               
916     if(iter->getNodeType() != xercesc::DOMNode    
917     {                                             
918       continue;                                   
919     }                                             
920                                                   
921     const xercesc::DOMElement* const child =      
922       dynamic_cast<xercesc::DOMElement*>(iter)    
923     if(child == nullptr)                          
924     {                                             
925       G4Exception("G4GDMLReadSolids::MultiUnio    
926                   FatalException, "No child fo    
927       return;                                     
928     }                                             
929     const G4String tag = Transcode(child->getT    
930                                                   
931     if(tag == "multiUnionNode")                   
932     {                                             
933       MultiUnionNodeRead(child, multiUnion);      
934     }                                             
935     else                                          
936     {                                             
937       G4String error_msg = "Unknown tag in Mul    
938       G4Exception("G4GDMLReadSolids::MultiUnio    
939                   FatalException, error_msg);     
940     }                                             
941   }                                               
942   multiUnion->Voxelize();                         
943 }                                                 
944                                                   
945 // -------------------------------------------    
946 void G4GDMLReadSolids::OrbRead(const xercesc::    
947 {                                                 
948   G4String name;                                  
949   G4double lunit = 1.0;                           
950   G4double r     = 0.0;                           
951                                                   
952   const xercesc::DOMNamedNodeMap* const attrib    
953     orbElement->getAttributes();                  
954   XMLSize_t attributeCount = attributes->getLe    
955                                                   
956   for(XMLSize_t attribute_index = 0; attribute    
957       ++attribute_index)                          
958   {                                               
959     xercesc::DOMNode* attribute_node = attribu    
960                                                   
961     if(attribute_node->getNodeType() != xerces    
962     {                                             
963       continue;                                   
964     }                                             
965                                                   
966     const xercesc::DOMAttr* const attribute =     
967       dynamic_cast<xercesc::DOMAttr*>(attribut    
968     if(attribute == nullptr)                      
969     {                                             
970       G4Exception("G4GDMLReadSolids::OrbRead()    
971                   "No attribute found!");         
972       return;                                     
973     }                                             
974     const G4String attName  = Transcode(attrib    
975     const G4String attValue = Transcode(attrib    
976                                                   
977     if(attName == "name")                         
978     {                                             
979       name = GenerateName(attValue);              
980     }                                             
981     else if(attName == "lunit")                   
982     {                                             
983       lunit = G4UnitDefinition::GetValueOf(att    
984       if(G4UnitDefinition::GetCategory(attValu    
985       {                                           
986         G4Exception("G4GDMLReadSolids::OrbRead    
987                     FatalException, "Invalid u    
988       }                                           
989     }                                             
990     else if(attName == "r")                       
991     {                                             
992       r = eval.Evaluate(attValue);                
993     }                                             
994   }                                               
995                                                   
996   r *= lunit;                                     
997                                                   
998   new G4Orb(name, r);                             
999 }                                                 
1000                                                  
1001 // ------------------------------------------    
1002 void G4GDMLReadSolids::ParaRead(const xercesc    
1003 {                                                
1004   G4String name;                                 
1005   G4double lunit = 1.0;                          
1006   G4double aunit = 1.0;                          
1007   G4double x     = 0.0;                          
1008   G4double y     = 0.0;                          
1009   G4double z     = 0.0;                          
1010   G4double alpha = 0.0;                          
1011   G4double theta = 0.0;                          
1012   G4double phi   = 0.0;                          
1013                                                  
1014   const xercesc::DOMNamedNodeMap* const attri    
1015     paraElement->getAttributes();                
1016   XMLSize_t attributeCount = attributes->getL    
1017                                                  
1018   for(XMLSize_t attribute_index = 0; attribut    
1019       ++attribute_index)                         
1020   {                                              
1021     xercesc::DOMNode* attribute_node = attrib    
1022                                                  
1023     if(attribute_node->getNodeType() != xerce    
1024     {                                            
1025       continue;                                  
1026     }                                            
1027                                                  
1028     const xercesc::DOMAttr* const attribute =    
1029       dynamic_cast<xercesc::DOMAttr*>(attribu    
1030     if(attribute == nullptr)                     
1031     {                                            
1032       G4Exception("G4GDMLReadSolids::ParaRead    
1033                   "No attribute found!");        
1034       return;                                    
1035     }                                            
1036     const G4String attName  = Transcode(attri    
1037     const G4String attValue = Transcode(attri    
1038                                                  
1039     if(attName == "name")                        
1040     {                                            
1041       name = GenerateName(attValue);             
1042     }                                            
1043     else if(attName == "lunit")                  
1044     {                                            
1045       lunit = G4UnitDefinition::GetValueOf(at    
1046       if(G4UnitDefinition::GetCategory(attVal    
1047       {                                          
1048         G4Exception("G4GDMLReadSolids::ParaRe    
1049                     FatalException, "Invalid     
1050       }                                          
1051     }                                            
1052     else if(attName == "aunit")                  
1053     {                                            
1054       aunit = G4UnitDefinition::GetValueOf(at    
1055       if(G4UnitDefinition::GetCategory(attVal    
1056       {                                          
1057         G4Exception("G4GDMLReadSolids::ParaRe    
1058                     FatalException, "Invalid     
1059       }                                          
1060     }                                            
1061     else if(attName == "x")                      
1062     {                                            
1063       x = eval.Evaluate(attValue);               
1064     }                                            
1065     else if(attName == "y")                      
1066     {                                            
1067       y = eval.Evaluate(attValue);               
1068     }                                            
1069     else if(attName == "z")                      
1070     {                                            
1071       z = eval.Evaluate(attValue);               
1072     }                                            
1073     else if(attName == "alpha")                  
1074     {                                            
1075       alpha = eval.Evaluate(attValue);           
1076     }                                            
1077     else if(attName == "theta")                  
1078     {                                            
1079       theta = eval.Evaluate(attValue);           
1080     }                                            
1081     else if(attName == "phi")                    
1082     {                                            
1083       phi = eval.Evaluate(attValue);             
1084     }                                            
1085   }                                              
1086                                                  
1087   x *= 0.5 * lunit;                              
1088   y *= 0.5 * lunit;                              
1089   z *= 0.5 * lunit;                              
1090   alpha *= aunit;                                
1091   theta *= aunit;                                
1092   phi *= aunit;                                  
1093                                                  
1094   new G4Para(name, x, y, z, alpha, theta, phi    
1095 }                                                
1096                                                  
1097 // ------------------------------------------    
1098 void G4GDMLReadSolids::ParaboloidRead(           
1099   const xercesc::DOMElement* const paraElemen    
1100 {                                                
1101   G4String name;                                 
1102   G4double lunit = 1.0;                          
1103   G4double rlo   = 0.0;                          
1104   G4double rhi   = 0.0;                          
1105   G4double dz    = 0.0;                          
1106                                                  
1107   const xercesc::DOMNamedNodeMap* const attri    
1108     paraElement->getAttributes();                
1109   XMLSize_t attributeCount = attributes->getL    
1110                                                  
1111   for(XMLSize_t attribute_index = 0; attribut    
1112       ++attribute_index)                         
1113   {                                              
1114     xercesc::DOMNode* attribute_node = attrib    
1115                                                  
1116     if(attribute_node->getNodeType() != xerce    
1117     {                                            
1118       continue;                                  
1119     }                                            
1120                                                  
1121     const xercesc::DOMAttr* const attribute =    
1122       dynamic_cast<xercesc::DOMAttr*>(attribu    
1123     if(attribute == nullptr)                     
1124     {                                            
1125       G4Exception("G4GDMLReadSolids::Parabolo    
1126                   FatalException, "No attribu    
1127       return;                                    
1128     }                                            
1129     const G4String attName  = Transcode(attri    
1130     const G4String attValue = Transcode(attri    
1131                                                  
1132     if(attName == "name")                        
1133     {                                            
1134       name = GenerateName(attValue);             
1135     }                                            
1136     else if(attName == "lunit")                  
1137     {                                            
1138       lunit = G4UnitDefinition::GetValueOf(at    
1139       if(G4UnitDefinition::GetCategory(attVal    
1140       {                                          
1141         G4Exception("G4GDMLReadSolids::Parabo    
1142                     FatalException, "Invalid     
1143       }                                          
1144     }                                            
1145     else if(attName == "rlo")                    
1146     {                                            
1147       rlo = eval.Evaluate(attValue);             
1148     }                                            
1149     else if(attName == "rhi")                    
1150     {                                            
1151       rhi = eval.Evaluate(attValue);             
1152     }                                            
1153     else if(attName == "dz")                     
1154     {                                            
1155       dz = eval.Evaluate(attValue);              
1156     }                                            
1157   }                                              
1158                                                  
1159   rlo *= 1. * lunit;                             
1160   rhi *= 1. * lunit;                             
1161   dz *= 1. * lunit;                              
1162                                                  
1163   new G4Paraboloid(name, dz, rlo, rhi);          
1164 }                                                
1165                                                  
1166 // ------------------------------------------    
1167 void G4GDMLReadSolids::PolyconeRead(             
1168   const xercesc::DOMElement* const polyconeEl    
1169 {                                                
1170   G4String name;                                 
1171   G4double lunit    = 1.0;                       
1172   G4double aunit    = 1.0;                       
1173   G4double startphi = 0.0;                       
1174   G4double deltaphi = 0.0;                       
1175                                                  
1176   const xercesc::DOMNamedNodeMap* const attri    
1177     polyconeElement->getAttributes();            
1178   XMLSize_t attributeCount = attributes->getL    
1179                                                  
1180   for(XMLSize_t attribute_index = 0; attribut    
1181       ++attribute_index)                         
1182   {                                              
1183     xercesc::DOMNode* attribute_node = attrib    
1184                                                  
1185     if(attribute_node->getNodeType() != xerce    
1186     {                                            
1187       continue;                                  
1188     }                                            
1189                                                  
1190     const xercesc::DOMAttr* const attribute =    
1191       dynamic_cast<xercesc::DOMAttr*>(attribu    
1192     if(attribute == nullptr)                     
1193     {                                            
1194       G4Exception("G4GDMLReadSolids::Polycone    
1195                   FatalException, "No attribu    
1196       return;                                    
1197     }                                            
1198     const G4String attName  = Transcode(attri    
1199     const G4String attValue = Transcode(attri    
1200                                                  
1201     if(attName == "name")                        
1202     {                                            
1203       name = GenerateName(attValue);             
1204     }                                            
1205     else if(attName == "lunit")                  
1206     {                                            
1207       lunit = G4UnitDefinition::GetValueOf(at    
1208       if(G4UnitDefinition::GetCategory(attVal    
1209       {                                          
1210         G4Exception("G4GDMLReadSolids::Polyco    
1211                     FatalException, "Invalid     
1212       }                                          
1213     }                                            
1214     else if(attName == "aunit")                  
1215     {                                            
1216       aunit = G4UnitDefinition::GetValueOf(at    
1217       if(G4UnitDefinition::GetCategory(attVal    
1218       {                                          
1219         G4Exception("G4GDMLReadSolids::Polyco    
1220                     FatalException, "Invalid     
1221       }                                          
1222     }                                            
1223     else if(attName == "startphi")               
1224     {                                            
1225       startphi = eval.Evaluate(attValue);        
1226     }                                            
1227     else if(attName == "deltaphi")               
1228     {                                            
1229       deltaphi = eval.Evaluate(attValue);        
1230     }                                            
1231   }                                              
1232                                                  
1233   startphi *= aunit;                             
1234   deltaphi *= aunit;                             
1235                                                  
1236   std::vector<zplaneType> zplaneList;            
1237                                                  
1238   for(xercesc::DOMNode* iter = polyconeElemen    
1239       iter                   = iter->getNextS    
1240   {                                              
1241     if(iter->getNodeType() != xercesc::DOMNod    
1242     {                                            
1243       continue;                                  
1244     }                                            
1245                                                  
1246     const xercesc::DOMElement* const child =     
1247       dynamic_cast<xercesc::DOMElement*>(iter    
1248     if(child == nullptr)                         
1249     {                                            
1250       G4Exception("G4GDMLReadSolids::Polycone    
1251                   FatalException, "No child f    
1252       return;                                    
1253     }                                            
1254     const G4String tag = Transcode(child->get    
1255                                                  
1256     if(tag == "zplane")                          
1257     {                                            
1258       zplaneList.push_back(ZplaneRead(child))    
1259     }                                            
1260   }                                              
1261                                                  
1262   std::size_t numZPlanes = zplaneList.size();    
1263                                                  
1264   G4double* rmin_array = new G4double[numZPla    
1265   G4double* rmax_array = new G4double[numZPla    
1266   G4double* z_array    = new G4double[numZPla    
1267                                                  
1268   for(std::size_t i = 0; i < numZPlanes; ++i)    
1269   {                                              
1270     rmin_array[i] = zplaneList[i].rmin * luni    
1271     rmax_array[i] = zplaneList[i].rmax * luni    
1272     z_array[i]    = zplaneList[i].z * lunit;     
1273   }                                              
1274                                                  
1275   new G4Polycone(name, startphi, deltaphi, (G    
1276                  rmin_array, rmax_array);        
1277                                                  
1278   delete[] rmin_array;                           
1279   delete[] rmax_array;                           
1280   delete[] z_array;                              
1281 }                                                
1282                                                  
1283 // ------------------------------------------    
1284 void G4GDMLReadSolids::GenericPolyconeRead(      
1285   const xercesc::DOMElement* const polyconeEl    
1286 {                                                
1287   G4String name;                                 
1288   G4double lunit    = 1.0;                       
1289   G4double aunit    = 1.0;                       
1290   G4double startphi = 0.0;                       
1291   G4double deltaphi = 0.0;                       
1292                                                  
1293   const xercesc::DOMNamedNodeMap* const attri    
1294     polyconeElement->getAttributes();            
1295   XMLSize_t attributeCount = attributes->getL    
1296                                                  
1297   for(XMLSize_t attribute_index = 0; attribut    
1298       ++attribute_index)                         
1299   {                                              
1300     xercesc::DOMNode* attribute_node = attrib    
1301                                                  
1302     if(attribute_node->getNodeType() != xerce    
1303     {                                            
1304       continue;                                  
1305     }                                            
1306                                                  
1307     const xercesc::DOMAttr* const attribute =    
1308       dynamic_cast<xercesc::DOMAttr*>(attribu    
1309     if(attribute == nullptr)                     
1310     {                                            
1311       G4Exception("G4GDMLReadSolids::GenericP    
1312                   FatalException, "No attribu    
1313       return;                                    
1314     }                                            
1315     const G4String attName  = Transcode(attri    
1316     const G4String attValue = Transcode(attri    
1317                                                  
1318     if(attName == "name")                        
1319     {                                            
1320       name = GenerateName(attValue);             
1321     }                                            
1322     else if(attName == "lunit")                  
1323     {                                            
1324       lunit = G4UnitDefinition::GetValueOf(at    
1325       if(G4UnitDefinition::GetCategory(attVal    
1326       {                                          
1327         G4Exception("G4GDMLReadSolids::Generi    
1328                     FatalException, "Invalid     
1329       }                                          
1330     }                                            
1331     else if(attName == "aunit")                  
1332     {                                            
1333       aunit = G4UnitDefinition::GetValueOf(at    
1334       if(G4UnitDefinition::GetCategory(attVal    
1335       {                                          
1336         G4Exception("G4GDMLReadSolids::Generi    
1337                     FatalException, "Invalid     
1338       }                                          
1339     }                                            
1340     else if(attName == "startphi")               
1341     {                                            
1342       startphi = eval.Evaluate(attValue);        
1343     }                                            
1344     else if(attName == "deltaphi")               
1345     {                                            
1346       deltaphi = eval.Evaluate(attValue);        
1347     }                                            
1348   }                                              
1349                                                  
1350   startphi *= aunit;                             
1351   deltaphi *= aunit;                             
1352                                                  
1353   std::vector<rzPointType> rzPointList;          
1354                                                  
1355   for(xercesc::DOMNode* iter = polyconeElemen    
1356                         iter != nullptr; iter    
1357   {                                              
1358     if(iter->getNodeType() != xercesc::DOMNod    
1359     {                                            
1360       continue;                                  
1361     }                                            
1362                                                  
1363     const xercesc::DOMElement* const child =     
1364       dynamic_cast<xercesc::DOMElement*>(iter    
1365     if(child == nullptr)                         
1366     {                                            
1367       G4Exception("G4GDMLReadSolids::GenericP    
1368                   FatalException, "No child f    
1369       return;                                    
1370     }                                            
1371     const G4String tag = Transcode(child->get    
1372                                                  
1373     if(tag == "rzpoint")                         
1374     {                                            
1375       rzPointList.push_back(RZPointRead(child    
1376     }                                            
1377   }                                              
1378                                                  
1379   std::size_t numRZPoints = rzPointList.size(    
1380                                                  
1381   G4double* r_array = new G4double[numRZPoint    
1382   G4double* z_array = new G4double[numRZPoint    
1383                                                  
1384   for(std::size_t i = 0; i < numRZPoints; ++i    
1385   {                                              
1386     r_array[i] = rzPointList[i].r * lunit;       
1387     z_array[i] = rzPointList[i].z * lunit;       
1388   }                                              
1389   new G4GenericPolycone(name, startphi, delta    
1390                         r_array, z_array);       
1391   delete[] r_array;                              
1392   delete[] z_array;                              
1393 }                                                
1394                                                  
1395 // ------------------------------------------    
1396 void G4GDMLReadSolids::PolyhedraRead(            
1397   const xercesc::DOMElement* const polyhedraE    
1398 {                                                
1399   G4String name;                                 
1400   G4double lunit    = 1.0;                       
1401   G4double aunit    = 1.0;                       
1402   G4double startphi = 0.0;                       
1403   G4double deltaphi = 0.0;                       
1404   G4int numsides    = 0;                         
1405                                                  
1406   const xercesc::DOMNamedNodeMap* const attri    
1407     polyhedraElement->getAttributes();           
1408   XMLSize_t attributeCount = attributes->getL    
1409                                                  
1410   for(XMLSize_t attribute_index = 0; attribut    
1411       ++attribute_index)                         
1412   {                                              
1413     xercesc::DOMNode* attribute_node = attrib    
1414                                                  
1415     if(attribute_node->getNodeType() != xerce    
1416     {                                            
1417       continue;                                  
1418     }                                            
1419                                                  
1420     const xercesc::DOMAttr* const attribute =    
1421       dynamic_cast<xercesc::DOMAttr*>(attribu    
1422     if(attribute == nullptr)                     
1423     {                                            
1424       G4Exception("G4GDMLReadSolids::Polyhedr    
1425                   FatalException, "No attribu    
1426       return;                                    
1427     }                                            
1428     const G4String attName  = Transcode(attri    
1429     const G4String attValue = Transcode(attri    
1430                                                  
1431     if(attName == "name")                        
1432     {                                            
1433       name = GenerateName(attValue);             
1434     }                                            
1435     else if(attName == "lunit")                  
1436     {                                            
1437       lunit = G4UnitDefinition::GetValueOf(at    
1438       if(G4UnitDefinition::GetCategory(attVal    
1439       {                                          
1440         G4Exception("G4GDMLReadSolids::Polyhe    
1441                     FatalException, "Invalid     
1442       }                                          
1443     }                                            
1444     else if(attName == "aunit")                  
1445     {                                            
1446       aunit = G4UnitDefinition::GetValueOf(at    
1447       if(G4UnitDefinition::GetCategory(attVal    
1448       {                                          
1449         G4Exception("G4GDMLReadSolids::Polyhe    
1450                     FatalException, "Invalid     
1451       }                                          
1452     }                                            
1453     else if(attName == "startphi")               
1454     {                                            
1455       startphi = eval.Evaluate(attValue);        
1456     }                                            
1457     else if(attName == "deltaphi")               
1458     {                                            
1459       deltaphi = eval.Evaluate(attValue);        
1460     }                                            
1461     else if(attName == "numsides")               
1462     {                                            
1463       numsides = eval.EvaluateInteger(attValu    
1464     }                                            
1465   }                                              
1466                                                  
1467   startphi *= aunit;                             
1468   deltaphi *= aunit;                             
1469                                                  
1470   std::vector<zplaneType> zplaneList;            
1471                                                  
1472   for(xercesc::DOMNode* iter = polyhedraEleme    
1473                         iter != nullptr; iter    
1474   {                                              
1475     if(iter->getNodeType() != xercesc::DOMNod    
1476     {                                            
1477       continue;                                  
1478     }                                            
1479                                                  
1480     const xercesc::DOMElement* const child =     
1481       dynamic_cast<xercesc::DOMElement*>(iter    
1482     if(child == nullptr)                         
1483     {                                            
1484       G4Exception("G4GDMLReadSolids::Polyhedr    
1485                   FatalException, "No child f    
1486       return;                                    
1487     }                                            
1488     const G4String tag = Transcode(child->get    
1489                                                  
1490     if(tag == "zplane")                          
1491     {                                            
1492       zplaneList.push_back(ZplaneRead(child))    
1493     }                                            
1494   }                                              
1495                                                  
1496   std::size_t numZPlanes = zplaneList.size();    
1497                                                  
1498   G4double* rmin_array = new G4double[numZPla    
1499   G4double* rmax_array = new G4double[numZPla    
1500   G4double* z_array    = new G4double[numZPla    
1501                                                  
1502   for(std::size_t i = 0; i < numZPlanes; ++i)    
1503   {                                              
1504     rmin_array[i] = zplaneList[i].rmin * luni    
1505     rmax_array[i] = zplaneList[i].rmax * luni    
1506     z_array[i]    = zplaneList[i].z * lunit;     
1507   }                                              
1508                                                  
1509   new G4Polyhedra(name, startphi, deltaphi, n    
1510                   z_array, rmin_array, rmax_a    
1511                                                  
1512   delete[] rmin_array;                           
1513   delete[] rmax_array;                           
1514   delete[] z_array;                              
1515 }                                                
1516                                                  
1517 // ------------------------------------------    
1518 void G4GDMLReadSolids::GenericPolyhedraRead(     
1519   const xercesc::DOMElement* const polyhedraE    
1520 {                                                
1521   G4String name;                                 
1522   G4double lunit    = 1.0;                       
1523   G4double aunit    = 1.0;                       
1524   G4double startphi = 0.0;                       
1525   G4double deltaphi = 0.0;                       
1526   G4int numsides    = 0;                         
1527                                                  
1528   const xercesc::DOMNamedNodeMap* const attri    
1529     polyhedraElement->getAttributes();           
1530   XMLSize_t attributeCount = attributes->getL    
1531                                                  
1532   for(XMLSize_t attribute_index = 0; attribut    
1533       ++attribute_index)                         
1534   {                                              
1535     xercesc::DOMNode* attribute_node = attrib    
1536                                                  
1537     if(attribute_node->getNodeType() != xerce    
1538     {                                            
1539       continue;                                  
1540     }                                            
1541                                                  
1542     const xercesc::DOMAttr* const attribute =    
1543       dynamic_cast<xercesc::DOMAttr*>(attribu    
1544     if(attribute == nullptr)                     
1545     {                                            
1546       G4Exception("G4GDMLReadSolids::GenericP    
1547                   FatalException, "No attribu    
1548       return;                                    
1549     }                                            
1550     const G4String attName  = Transcode(attri    
1551     const G4String attValue = Transcode(attri    
1552                                                  
1553     if(attName == "name")                        
1554     {                                            
1555       name = GenerateName(attValue);             
1556     }                                            
1557     else if(attName == "lunit")                  
1558     {                                            
1559       lunit = G4UnitDefinition::GetValueOf(at    
1560       if(G4UnitDefinition::GetCategory(attVal    
1561       {                                          
1562         G4Exception("G4GDMLReadSolids::Generi    
1563                     FatalException, "Invalid     
1564       }                                          
1565     }                                            
1566     else if(attName == "aunit")                  
1567     {                                            
1568       aunit = G4UnitDefinition::GetValueOf(at    
1569       if(G4UnitDefinition::GetCategory(attVal    
1570       {                                          
1571         G4Exception("G4GDMLReadSolids::Generi    
1572                     FatalException, "Invalid     
1573       }                                          
1574     }                                            
1575     else if(attName == "startphi")               
1576     {                                            
1577       startphi = eval.Evaluate(attValue);        
1578     }                                            
1579     else if(attName == "deltaphi")               
1580     {                                            
1581       deltaphi = eval.Evaluate(attValue);        
1582     }                                            
1583     else if(attName == "numsides")               
1584     {                                            
1585       numsides = eval.EvaluateInteger(attValu    
1586     }                                            
1587   }                                              
1588                                                  
1589   startphi *= aunit;                             
1590   deltaphi *= aunit;                             
1591                                                  
1592   std::vector<rzPointType> rzpointList;          
1593                                                  
1594   for(xercesc::DOMNode* iter = polyhedraEleme    
1595                         iter != nullptr; iter    
1596   {                                              
1597     if(iter->getNodeType() != xercesc::DOMNod    
1598     {                                            
1599       continue;                                  
1600     }                                            
1601                                                  
1602     const xercesc::DOMElement* const child =     
1603       dynamic_cast<xercesc::DOMElement*>(iter    
1604     if(child == nullptr)                         
1605     {                                            
1606       G4Exception("G4GDMLReadSolids::GenericP    
1607                   FatalException, "No child f    
1608       return;                                    
1609     }                                            
1610     const G4String tag = Transcode(child->get    
1611                                                  
1612     if(tag == "rzpoint")                         
1613     {                                            
1614       rzpointList.push_back(RZPointRead(child    
1615     }                                            
1616   }                                              
1617                                                  
1618   std::size_t numRZPoints = rzpointList.size(    
1619                                                  
1620   G4double* r_array = new G4double[numRZPoint    
1621   G4double* z_array = new G4double[numRZPoint    
1622                                                  
1623   for(std::size_t i = 0; i < numRZPoints; ++i    
1624   {                                              
1625     r_array[i] = rzpointList[i].r * lunit;       
1626     z_array[i] = rzpointList[i].z * lunit;       
1627   }                                              
1628                                                  
1629   new G4Polyhedra(name, startphi, deltaphi, n    
1630                   r_array, z_array);             
1631                                                  
1632   delete[] r_array;                              
1633   delete[] z_array;                              
1634 }                                                
1635                                                  
1636 // ------------------------------------------    
1637 G4QuadrangularFacet* G4GDMLReadSolids::Quadra    
1638   const xercesc::DOMElement* const quadrangul    
1639 {                                                
1640   G4ThreeVector vertex1;                         
1641   G4ThreeVector vertex2;                         
1642   G4ThreeVector vertex3;                         
1643   G4ThreeVector vertex4;                         
1644   G4FacetVertexType type = ABSOLUTE;             
1645   G4double lunit         = 1.0;                  
1646                                                  
1647   const xercesc::DOMNamedNodeMap* const attri    
1648     quadrangularElement->getAttributes();        
1649   XMLSize_t attributeCount = attributes->getL    
1650                                                  
1651   for(XMLSize_t attribute_index = 0; attribut    
1652       ++attribute_index)                         
1653   {                                              
1654     xercesc::DOMNode* attribute_node = attrib    
1655                                                  
1656     if(attribute_node->getNodeType() != xerce    
1657     {                                            
1658       continue;                                  
1659     }                                            
1660                                                  
1661     const xercesc::DOMAttr* const attribute =    
1662       dynamic_cast<xercesc::DOMAttr*>(attribu    
1663     if(attribute == nullptr)                     
1664     {                                            
1665       G4Exception("G4GDMLReadSolids::Quadrang    
1666                   FatalException, "No attribu    
1667       return nullptr;                            
1668     }                                            
1669     const G4String attName  = Transcode(attri    
1670     const G4String attValue = Transcode(attri    
1671                                                  
1672     if(attName == "vertex1")                     
1673     {                                            
1674       vertex1 = GetPosition(GenerateName(attV    
1675     }                                            
1676     else if(attName == "vertex2")                
1677     {                                            
1678       vertex2 = GetPosition(GenerateName(attV    
1679     }                                            
1680     else if(attName == "vertex3")                
1681     {                                            
1682       vertex3 = GetPosition(GenerateName(attV    
1683     }                                            
1684     else if(attName == "vertex4")                
1685     {                                            
1686       vertex4 = GetPosition(GenerateName(attV    
1687     }                                            
1688     else if(attName == "lunit")                  
1689     {                                            
1690       lunit = G4UnitDefinition::GetValueOf(at    
1691       if(G4UnitDefinition::GetCategory(attVal    
1692       {                                          
1693         G4Exception("G4GDMLReadSolids::Quadra    
1694                     FatalException, "Invalid     
1695       }                                          
1696     }                                            
1697     else if(attName == "type")                   
1698     {                                            
1699       if(attValue == "RELATIVE")                 
1700       {                                          
1701         type = RELATIVE;                         
1702       }                                          
1703     }                                            
1704   }                                              
1705                                                  
1706   return new G4QuadrangularFacet(vertex1 * lu    
1707                                  vertex3 * lu    
1708 }                                                
1709                                                  
1710 // ------------------------------------------    
1711 void G4GDMLReadSolids::ReflectedSolidRead(       
1712   const xercesc::DOMElement* const reflectedS    
1713 {                                                
1714   G4String name;                                 
1715   G4double lunit = 1.0;                          
1716   G4double aunit = 1.0;                          
1717   G4String solid;                                
1718   G4ThreeVector scale(1.0, 1.0, 1.0);            
1719   G4ThreeVector rotation;                        
1720   G4ThreeVector position;                        
1721                                                  
1722   const xercesc::DOMNamedNodeMap* const attri    
1723     reflectedSolidElement->getAttributes();      
1724   XMLSize_t attributeCount = attributes->getL    
1725                                                  
1726   for(XMLSize_t attribute_index = 0; attribut    
1727       ++attribute_index)                         
1728   {                                              
1729     xercesc::DOMNode* attribute_node = attrib    
1730                                                  
1731     if(attribute_node->getNodeType() != xerce    
1732     {                                            
1733       continue;                                  
1734     }                                            
1735                                                  
1736     const xercesc::DOMAttr* const attribute =    
1737       dynamic_cast<xercesc::DOMAttr*>(attribu    
1738     if(attribute == nullptr)                     
1739     {                                            
1740       G4Exception("G4GDMLReadSolids::Reflecte    
1741                   FatalException, "No attribu    
1742       return;                                    
1743     }                                            
1744     const G4String attName  = Transcode(attri    
1745     const G4String attValue = Transcode(attri    
1746                                                  
1747     if(attName == "name")                        
1748     {                                            
1749       name = GenerateName(attValue);             
1750     }                                            
1751     else if(attName == "lunit")                  
1752     {                                            
1753       lunit = G4UnitDefinition::GetValueOf(at    
1754       if(G4UnitDefinition::GetCategory(attVal    
1755       {                                          
1756         G4Exception("G4GDMLReadSolids::Reflec    
1757                     FatalException, "Invalid     
1758       }                                          
1759     }                                            
1760     else if(attName == "aunit")                  
1761     {                                            
1762       aunit = G4UnitDefinition::GetValueOf(at    
1763       if(G4UnitDefinition::GetCategory(attVal    
1764       {                                          
1765         G4Exception("G4GDMLReadSolids::Reflec    
1766                     FatalException, "Invalid     
1767       }                                          
1768     }                                            
1769     else if(attName == "solid")                  
1770     {                                            
1771       solid = GenerateName(attValue);            
1772     }                                            
1773     else if(attName == "sx")                     
1774     {                                            
1775       scale.setX(eval.Evaluate(attValue));       
1776     }                                            
1777     else if(attName == "sy")                     
1778     {                                            
1779       scale.setY(eval.Evaluate(attValue));       
1780     }                                            
1781     else if(attName == "sz")                     
1782     {                                            
1783       scale.setZ(eval.Evaluate(attValue));       
1784     }                                            
1785     else if(attName == "rx")                     
1786     {                                            
1787       rotation.setX(eval.Evaluate(attValue));    
1788     }                                            
1789     else if(attName == "ry")                     
1790     {                                            
1791       rotation.setY(eval.Evaluate(attValue));    
1792     }                                            
1793     else if(attName == "rz")                     
1794     {                                            
1795       rotation.setZ(eval.Evaluate(attValue));    
1796     }                                            
1797     else if(attName == "dx")                     
1798     {                                            
1799       position.setX(eval.Evaluate(attValue));    
1800     }                                            
1801     else if(attName == "dy")                     
1802     {                                            
1803       position.setY(eval.Evaluate(attValue));    
1804     }                                            
1805     else if(attName == "dz")                     
1806     {                                            
1807       position.setZ(eval.Evaluate(attValue));    
1808     }                                            
1809   }                                              
1810                                                  
1811   rotation *= aunit;                             
1812   position *= lunit;                             
1813                                                  
1814   G4Transform3D transform(GetRotationMatrix(r    
1815   transform = transform * G4Scale3D(scale.x()    
1816                                                  
1817   new G4ReflectedSolid(name, GetSolid(solid),    
1818 }                                                
1819                                                  
1820 // ------------------------------------------    
1821 void G4GDMLReadSolids::ScaledSolidRead(          
1822   const xercesc::DOMElement* const scaledSoli    
1823 {                                                
1824   G4String name;                                 
1825   G4VSolid* solid = nullptr;                     
1826   G4ThreeVector scale(1.0, 1.0, 1.0);            
1827                                                  
1828   const xercesc::DOMNamedNodeMap* const attri    
1829     scaledSolidElement->getAttributes();         
1830   XMLSize_t attributeCount = attributes->getL    
1831                                                  
1832   for(XMLSize_t attribute_index = 0; attribut    
1833       ++attribute_index)                         
1834   {                                              
1835     xercesc::DOMNode* attribute_node = attrib    
1836                                                  
1837     if(attribute_node->getNodeType() != xerce    
1838     {                                            
1839       continue;                                  
1840     }                                            
1841                                                  
1842     const xercesc::DOMAttr* const attribute =    
1843       dynamic_cast<xercesc::DOMAttr*>(attribu    
1844     if(attribute == nullptr)                     
1845     {                                            
1846       G4Exception("G4GDMLReadSolids::ScaledSo    
1847                   FatalException, "No attribu    
1848       return;                                    
1849     }                                            
1850     const G4String attName  = Transcode(attri    
1851     const G4String attValue = Transcode(attri    
1852                                                  
1853     if(attName == "name")                        
1854     {                                            
1855       name = GenerateName(attValue);             
1856     }                                            
1857   }                                              
1858                                                  
1859   for(xercesc::DOMNode* iter = scaledSolidEle    
1860                         iter != nullptr; iter    
1861   {                                              
1862     if(iter->getNodeType() != xercesc::DOMNod    
1863     {                                            
1864       continue;                                  
1865     }                                            
1866                                                  
1867     const xercesc::DOMElement* const child =     
1868       dynamic_cast<xercesc::DOMElement*>(iter    
1869     if(child == nullptr)                         
1870     {                                            
1871       G4Exception("G4GDMLReadSolids::ScaledSo    
1872                   FatalException, "No child f    
1873       return;                                    
1874     }                                            
1875     const G4String tag = Transcode(child->get    
1876                                                  
1877     if(tag == "solidref")                        
1878     {                                            
1879       solid = GetSolid(GenerateName(RefRead(c    
1880     }                                            
1881     else if(tag == "scale")                      
1882     {                                            
1883       VectorRead(child, scale);                  
1884     }                                            
1885     else if(tag == "scaleref")                   
1886     {                                            
1887       scale = GetScale(GenerateName(RefRead(c    
1888     }                                            
1889     else                                         
1890     {                                            
1891       G4String error_msg = "Unknown tag in sc    
1892       G4Exception("G4GDMLReadSolids::ScaledSo    
1893                   FatalException, error_msg);    
1894       return;                                    
1895     }                                            
1896   }                                              
1897                                                  
1898   G4Scale3D transform = G4Scale3D(scale.x(),     
1899                                                  
1900   new G4ScaledSolid(name, solid, transform);     
1901 }                                                
1902                                                  
1903 // ------------------------------------------    
1904 G4ExtrudedSolid::ZSection G4GDMLReadSolids::S    
1905   const xercesc::DOMElement* const sectionEle    
1906 {                                                
1907   G4double zPosition = 0.0;                      
1908   G4TwoVector Offset;                            
1909   G4double scalingFactor = 1.0;                  
1910                                                  
1911   const xercesc::DOMNamedNodeMap* const attri    
1912     sectionElement->getAttributes();             
1913   XMLSize_t attributeCount = attributes->getL    
1914                                                  
1915   for(XMLSize_t attribute_index = 0; attribut    
1916       ++attribute_index)                         
1917   {                                              
1918     xercesc::DOMNode* attribute_node = attrib    
1919                                                  
1920     if(attribute_node->getNodeType() != xerce    
1921     {                                            
1922       continue;                                  
1923     }                                            
1924                                                  
1925     const xercesc::DOMAttr* const attribute =    
1926       dynamic_cast<xercesc::DOMAttr*>(attribu    
1927     if(attribute == nullptr)                     
1928     {                                            
1929       G4Exception("G4GDMLReadSolids::SectionR    
1930                   FatalException, "No attribu    
1931       return G4ExtrudedSolid::ZSection(zPosit    
1932     }                                            
1933     const G4String attName  = Transcode(attri    
1934     const G4String attValue = Transcode(attri    
1935                                                  
1936     if(attName == "zPosition")                   
1937     {                                            
1938       zPosition = eval.Evaluate(attValue) * l    
1939     }                                            
1940     else if(attName == "xOffset")                
1941     {                                            
1942       Offset.setX(eval.Evaluate(attValue) * l    
1943     }                                            
1944     else if(attName == "yOffset")                
1945     {                                            
1946       Offset.setY(eval.Evaluate(attValue) * l    
1947     }                                            
1948     else if(attName == "scalingFactor")          
1949     {                                            
1950       scalingFactor = eval.Evaluate(attValue)    
1951     }                                            
1952   }                                              
1953                                                  
1954   return G4ExtrudedSolid::ZSection(zPosition,    
1955 }                                                
1956                                                  
1957 // ------------------------------------------    
1958 void G4GDMLReadSolids::SphereRead(               
1959   const xercesc::DOMElement* const sphereElem    
1960 {                                                
1961   G4String name;                                 
1962   G4double lunit      = 1.0;                     
1963   G4double aunit      = 1.0;                     
1964   G4double rmin       = 0.0;                     
1965   G4double rmax       = 0.0;                     
1966   G4double startphi   = 0.0;                     
1967   G4double deltaphi   = 0.0;                     
1968   G4double starttheta = 0.0;                     
1969   G4double deltatheta = 0.0;                     
1970                                                  
1971   const xercesc::DOMNamedNodeMap* const attri    
1972     sphereElement->getAttributes();              
1973   XMLSize_t attributeCount = attributes->getL    
1974                                                  
1975   for(XMLSize_t attribute_index = 0; attribut    
1976       ++attribute_index)                         
1977   {                                              
1978     xercesc::DOMNode* attribute_node = attrib    
1979                                                  
1980     if(attribute_node->getNodeType() != xerce    
1981     {                                            
1982       continue;                                  
1983     }                                            
1984                                                  
1985     const xercesc::DOMAttr* const attribute =    
1986       dynamic_cast<xercesc::DOMAttr*>(attribu    
1987     if(attribute == nullptr)                     
1988     {                                            
1989       G4Exception("G4GDMLReadSolids::SphereRe    
1990                   FatalException, "No attribu    
1991       return;                                    
1992     }                                            
1993     const G4String attName  = Transcode(attri    
1994     const G4String attValue = Transcode(attri    
1995                                                  
1996     if(attName == "name")                        
1997     {                                            
1998       name = GenerateName(attValue);             
1999     }                                            
2000     else if(attName == "lunit")                  
2001     {                                            
2002       lunit = G4UnitDefinition::GetValueOf(at    
2003       if(G4UnitDefinition::GetCategory(attVal    
2004       {                                          
2005         G4Exception("G4GDMLReadSolids::Sphere    
2006                     FatalException, "Invalid     
2007       }                                          
2008     }                                            
2009     else if(attName == "aunit")                  
2010     {                                            
2011       aunit = G4UnitDefinition::GetValueOf(at    
2012       if(G4UnitDefinition::GetCategory(attVal    
2013       {                                          
2014         G4Exception("G4GDMLReadSolids::Sphere    
2015                     FatalException, "Invalid     
2016       }                                          
2017     }                                            
2018     else if(attName == "rmin")                   
2019     {                                            
2020       rmin = eval.Evaluate(attValue);            
2021     }                                            
2022     else if(attName == "rmax")                   
2023     {                                            
2024       rmax = eval.Evaluate(attValue);            
2025     }                                            
2026     else if(attName == "startphi")               
2027     {                                            
2028       startphi = eval.Evaluate(attValue);        
2029     }                                            
2030     else if(attName == "deltaphi")               
2031     {                                            
2032       deltaphi = eval.Evaluate(attValue);        
2033     }                                            
2034     else if(attName == "starttheta")             
2035     {                                            
2036       starttheta = eval.Evaluate(attValue);      
2037     }                                            
2038     else if(attName == "deltatheta")             
2039     {                                            
2040       deltatheta = eval.Evaluate(attValue);      
2041     }                                            
2042   }                                              
2043                                                  
2044   rmin *= lunit;                                 
2045   rmax *= lunit;                                 
2046   startphi *= aunit;                             
2047   deltaphi *= aunit;                             
2048   starttheta *= aunit;                           
2049   deltatheta *= aunit;                           
2050                                                  
2051   new G4Sphere(name, rmin, rmax, startphi, de    
2052 }                                                
2053                                                  
2054 // ------------------------------------------    
2055 void G4GDMLReadSolids::TessellatedRead(          
2056   const xercesc::DOMElement* const tessellate    
2057 {                                                
2058   G4String name;                                 
2059                                                  
2060   const xercesc::DOMNamedNodeMap* const attri    
2061     tessellatedElement->getAttributes();         
2062   XMLSize_t attributeCount = attributes->getL    
2063                                                  
2064   for(XMLSize_t attribute_index = 0; attribut    
2065       ++attribute_index)                         
2066   {                                              
2067     xercesc::DOMNode* attribute_node = attrib    
2068                                                  
2069     if(attribute_node->getNodeType() != xerce    
2070     {                                            
2071       continue;                                  
2072     }                                            
2073                                                  
2074     const xercesc::DOMAttr* const attribute =    
2075       dynamic_cast<xercesc::DOMAttr*>(attribu    
2076     if(attribute == nullptr)                     
2077     {                                            
2078       G4Exception("G4GDMLReadSolids::Tessella    
2079                   FatalException, "No attribu    
2080       return;                                    
2081     }                                            
2082     const G4String attName  = Transcode(attri    
2083     const G4String attValue = Transcode(attri    
2084                                                  
2085     if(attName == "name")                        
2086     {                                            
2087       name = GenerateName(attValue);             
2088     }                                            
2089   }                                              
2090                                                  
2091   G4TessellatedSolid* tessellated = new G4Tes    
2092                                                  
2093   for(xercesc::DOMNode* iter = tessellatedEle    
2094                         iter != nullptr; iter    
2095   {                                              
2096     if(iter->getNodeType() != xercesc::DOMNod    
2097     {                                            
2098       continue;                                  
2099     }                                            
2100                                                  
2101     const xercesc::DOMElement* const child =     
2102       dynamic_cast<xercesc::DOMElement*>(iter    
2103     if(child == nullptr)                         
2104     {                                            
2105       G4Exception("G4GDMLReadSolids::Tessella    
2106                   FatalException, "No child f    
2107       return;                                    
2108     }                                            
2109     const G4String tag = Transcode(child->get    
2110                                                  
2111     if(tag == "triangular")                      
2112     {                                            
2113       tessellated->AddFacet(TriangularRead(ch    
2114     }                                            
2115     else if(tag == "quadrangular")               
2116     {                                            
2117       tessellated->AddFacet(QuadrangularRead(    
2118     }                                            
2119   }                                              
2120                                                  
2121   tessellated->SetSolidClosed(true);             
2122 }                                                
2123                                                  
2124 // ------------------------------------------    
2125 void G4GDMLReadSolids::TetRead(const xercesc:    
2126 {                                                
2127   G4String name;                                 
2128   G4ThreeVector vertex1;                         
2129   G4ThreeVector vertex2;                         
2130   G4ThreeVector vertex3;                         
2131   G4ThreeVector vertex4;                         
2132   G4double lunit = 1.0;                          
2133                                                  
2134   const xercesc::DOMNamedNodeMap* const attri    
2135     tetElement->getAttributes();                 
2136   XMLSize_t attributeCount = attributes->getL    
2137                                                  
2138   for(XMLSize_t attribute_index = 0; attribut    
2139       ++attribute_index)                         
2140   {                                              
2141     xercesc::DOMNode* attribute_node = attrib    
2142                                                  
2143     if(attribute_node->getNodeType() != xerce    
2144     {                                            
2145       continue;                                  
2146     }                                            
2147                                                  
2148     const xercesc::DOMAttr* const attribute =    
2149       dynamic_cast<xercesc::DOMAttr*>(attribu    
2150     if(attribute == nullptr)                     
2151     {                                            
2152       G4Exception("G4GDMLReadSolids::TetRead(    
2153                   "No attribute found!");        
2154       return;                                    
2155     }                                            
2156     const G4String attName  = Transcode(attri    
2157     const G4String attValue = Transcode(attri    
2158                                                  
2159     if(attName == "name")                        
2160     {                                            
2161       name = GenerateName(attValue);             
2162     }                                            
2163     else if(attName == "lunit")                  
2164     {                                            
2165       lunit = G4UnitDefinition::GetValueOf(at    
2166       if(G4UnitDefinition::GetCategory(attVal    
2167       {                                          
2168         G4Exception("G4GDMLReadSolids::TetRea    
2169                     FatalException, "Invalid     
2170       }                                          
2171     }                                            
2172     else if(attName == "vertex1")                
2173     {                                            
2174       vertex1 = GetPosition(GenerateName(attV    
2175     }                                            
2176     else if(attName == "vertex2")                
2177     {                                            
2178       vertex2 = GetPosition(GenerateName(attV    
2179     }                                            
2180     else if(attName == "vertex3")                
2181     {                                            
2182       vertex3 = GetPosition(GenerateName(attV    
2183     }                                            
2184     else if(attName == "vertex4")                
2185     {                                            
2186       vertex4 = GetPosition(GenerateName(attV    
2187     }                                            
2188   }                                              
2189                                                  
2190   new G4Tet(name, vertex1 * lunit, vertex2 *     
2191             vertex4 * lunit);                    
2192 }                                                
2193                                                  
2194 // ------------------------------------------    
2195 void G4GDMLReadSolids::TorusRead(const xerces    
2196 {                                                
2197   G4String name;                                 
2198   G4double lunit    = 1.0;                       
2199   G4double aunit    = 1.0;                       
2200   G4double rmin     = 0.0;                       
2201   G4double rmax     = 0.0;                       
2202   G4double rtor     = 0.0;                       
2203   G4double startphi = 0.0;                       
2204   G4double deltaphi = 0.0;                       
2205                                                  
2206   const xercesc::DOMNamedNodeMap* const attri    
2207     torusElement->getAttributes();               
2208   XMLSize_t attributeCount = attributes->getL    
2209                                                  
2210   for(XMLSize_t attribute_index = 0; attribut    
2211       ++attribute_index)                         
2212   {                                              
2213     xercesc::DOMNode* attribute_node = attrib    
2214                                                  
2215     if(attribute_node->getNodeType() != xerce    
2216     {                                            
2217       continue;                                  
2218     }                                            
2219                                                  
2220     const xercesc::DOMAttr* const attribute =    
2221       dynamic_cast<xercesc::DOMAttr*>(attribu    
2222     if(attribute == nullptr)                     
2223     {                                            
2224       G4Exception("G4GDMLReadSolids::TorusRea    
2225                   FatalException, "No attribu    
2226       return;                                    
2227     }                                            
2228     const G4String attName  = Transcode(attri    
2229     const G4String attValue = Transcode(attri    
2230                                                  
2231     if(attName == "name")                        
2232     {                                            
2233       name = GenerateName(attValue);             
2234     }                                            
2235     else if(attName == "lunit")                  
2236     {                                            
2237       lunit = G4UnitDefinition::GetValueOf(at    
2238       if(G4UnitDefinition::GetCategory(attVal    
2239       {                                          
2240         G4Exception("G4GDMLReadSolids::TorusR    
2241                     FatalException, "Invalid     
2242       }                                          
2243     }                                            
2244     else if(attName == "aunit")                  
2245     {                                            
2246       aunit = G4UnitDefinition::GetValueOf(at    
2247       if(G4UnitDefinition::GetCategory(attVal    
2248       {                                          
2249         G4Exception("G4GDMLReadSolids::TorusR    
2250                     FatalException, "Invalid     
2251       }                                          
2252     }                                            
2253     else if(attName == "rmin")                   
2254     {                                            
2255       rmin = eval.Evaluate(attValue);            
2256     }                                            
2257     else if(attName == "rmax")                   
2258     {                                            
2259       rmax = eval.Evaluate(attValue);            
2260     }                                            
2261     else if(attName == "rtor")                   
2262     {                                            
2263       rtor = eval.Evaluate(attValue);            
2264     }                                            
2265     else if(attName == "startphi")               
2266     {                                            
2267       startphi = eval.Evaluate(attValue);        
2268     }                                            
2269     else if(attName == "deltaphi")               
2270     {                                            
2271       deltaphi = eval.Evaluate(attValue);        
2272     }                                            
2273   }                                              
2274                                                  
2275   rmin *= lunit;                                 
2276   rmax *= lunit;                                 
2277   rtor *= lunit;                                 
2278   startphi *= aunit;                             
2279   deltaphi *= aunit;                             
2280                                                  
2281   new G4Torus(name, rmin, rmax, rtor, startph    
2282 }                                                
2283                                                  
2284 // ------------------------------------------    
2285 void G4GDMLReadSolids::GenTrapRead(              
2286   const xercesc::DOMElement* const gtrapEleme    
2287 {                                                
2288   G4String name;                                 
2289   G4double lunit = 1.0;                          
2290   G4double dz    = 0.0;                          
2291   G4double v1x = 0.0, v1y = 0.0, v2x = 0.0, v    
2292            v4x = 0.0, v4y = 0.0, v5x = 0.0, v    
2293            v7x = 0.0, v7y = 0.0, v8x = 0.0, v    
2294                                                  
2295   const xercesc::DOMNamedNodeMap* const attri    
2296     gtrapElement->getAttributes();               
2297   XMLSize_t attributeCount = attributes->getL    
2298                                                  
2299   for(XMLSize_t attribute_index = 0; attribut    
2300       ++attribute_index)                         
2301   {                                              
2302     xercesc::DOMNode* attribute_node = attrib    
2303                                                  
2304     if(attribute_node->getNodeType() != xerce    
2305     {                                            
2306       continue;                                  
2307     }                                            
2308                                                  
2309     const xercesc::DOMAttr* const attribute =    
2310       dynamic_cast<xercesc::DOMAttr*>(attribu    
2311     if(attribute == nullptr)                     
2312     {                                            
2313       G4Exception("G4GDMLReadSolids::GenTrapR    
2314                   FatalException, "No attribu    
2315       return;                                    
2316     }                                            
2317     const G4String attName  = Transcode(attri    
2318     const G4String attValue = Transcode(attri    
2319                                                  
2320     if(attName == "name")                        
2321     {                                            
2322       name = GenerateName(attValue);             
2323     }                                            
2324     else if(attName == "lunit")                  
2325     {                                            
2326       lunit = G4UnitDefinition::GetValueOf(at    
2327       if(G4UnitDefinition::GetCategory(attVal    
2328       {                                          
2329         G4Exception("G4GDMLReadSolids::GenTra    
2330                     FatalException, "Invalid     
2331       }                                          
2332     }                                            
2333     else if(attName == "dz")                     
2334     {                                            
2335       dz = eval.Evaluate(attValue);              
2336     }                                            
2337     else if(attName == "v1x")                    
2338     {                                            
2339       v1x = eval.Evaluate(attValue);             
2340     }                                            
2341     else if(attName == "v1y")                    
2342     {                                            
2343       v1y = eval.Evaluate(attValue);             
2344     }                                            
2345     else if(attName == "v2x")                    
2346     {                                            
2347       v2x = eval.Evaluate(attValue);             
2348     }                                            
2349     else if(attName == "v2y")                    
2350     {                                            
2351       v2y = eval.Evaluate(attValue);             
2352     }                                            
2353     else if(attName == "v3x")                    
2354     {                                            
2355       v3x = eval.Evaluate(attValue);             
2356     }                                            
2357     else if(attName == "v3y")                    
2358     {                                            
2359       v3y = eval.Evaluate(attValue);             
2360     }                                            
2361     else if(attName == "v4x")                    
2362     {                                            
2363       v4x = eval.Evaluate(attValue);             
2364     }                                            
2365     else if(attName == "v4y")                    
2366     {                                            
2367       v4y = eval.Evaluate(attValue);             
2368     }                                            
2369     else if(attName == "v5x")                    
2370     {                                            
2371       v5x = eval.Evaluate(attValue);             
2372     }                                            
2373     else if(attName == "v5y")                    
2374     {                                            
2375       v5y = eval.Evaluate(attValue);             
2376     }                                            
2377     else if(attName == "v6x")                    
2378     {                                            
2379       v6x = eval.Evaluate(attValue);             
2380     }                                            
2381     else if(attName == "v6y")                    
2382     {                                            
2383       v6y = eval.Evaluate(attValue);             
2384     }                                            
2385     else if(attName == "v7x")                    
2386     {                                            
2387       v7x = eval.Evaluate(attValue);             
2388     }                                            
2389     else if(attName == "v7y")                    
2390     {                                            
2391       v7y = eval.Evaluate(attValue);             
2392     }                                            
2393     else if(attName == "v8x")                    
2394     {                                            
2395       v8x = eval.Evaluate(attValue);             
2396     }                                            
2397     else if(attName == "v8y")                    
2398     {                                            
2399       v8y = eval.Evaluate(attValue);             
2400     }                                            
2401   }                                              
2402                                                  
2403   dz *= lunit;                                   
2404   std::vector<G4TwoVector> vertices;             
2405   vertices.push_back(G4TwoVector(v1x * lunit,    
2406   vertices.push_back(G4TwoVector(v2x * lunit,    
2407   vertices.push_back(G4TwoVector(v3x * lunit,    
2408   vertices.push_back(G4TwoVector(v4x * lunit,    
2409   vertices.push_back(G4TwoVector(v5x * lunit,    
2410   vertices.push_back(G4TwoVector(v6x * lunit,    
2411   vertices.push_back(G4TwoVector(v7x * lunit,    
2412   vertices.push_back(G4TwoVector(v8x * lunit,    
2413   new G4GenericTrap(name, dz, vertices);         
2414 }                                                
2415                                                  
2416 // ------------------------------------------    
2417 void G4GDMLReadSolids::TrapRead(const xercesc    
2418 {                                                
2419   G4String name;                                 
2420   G4double lunit  = 1.0;                         
2421   G4double aunit  = 1.0;                         
2422   G4double z      = 0.0;                         
2423   G4double theta  = 0.0;                         
2424   G4double phi    = 0.0;                         
2425   G4double y1     = 0.0;                         
2426   G4double x1     = 0.0;                         
2427   G4double x2     = 0.0;                         
2428   G4double alpha1 = 0.0;                         
2429   G4double y2     = 0.0;                         
2430   G4double x3     = 0.0;                         
2431   G4double x4     = 0.0;                         
2432   G4double alpha2 = 0.0;                         
2433                                                  
2434   const xercesc::DOMNamedNodeMap* const attri    
2435     trapElement->getAttributes();                
2436   XMLSize_t attributeCount = attributes->getL    
2437                                                  
2438   for(XMLSize_t attribute_index = 0; attribut    
2439       ++attribute_index)                         
2440   {                                              
2441     xercesc::DOMNode* attribute_node = attrib    
2442                                                  
2443     if(attribute_node->getNodeType() != xerce    
2444     {                                            
2445       continue;                                  
2446     }                                            
2447                                                  
2448     const xercesc::DOMAttr* const attribute =    
2449       dynamic_cast<xercesc::DOMAttr*>(attribu    
2450     if(attribute == nullptr)                     
2451     {                                            
2452       G4Exception("G4GDMLReadSolids::TrapRead    
2453                   "No attribute found!");        
2454       return;                                    
2455     }                                            
2456     const G4String attName  = Transcode(attri    
2457     const G4String attValue = Transcode(attri    
2458                                                  
2459     if(attName == "name")                        
2460     {                                            
2461       name = GenerateName(attValue);             
2462     }                                            
2463     else if(attName == "lunit")                  
2464     {                                            
2465       lunit = G4UnitDefinition::GetValueOf(at    
2466       if(G4UnitDefinition::GetCategory(attVal    
2467       {                                          
2468         G4Exception("G4GDMLReadSolids::TrapRe    
2469                     FatalException, "Invalid     
2470       }                                          
2471     }                                            
2472     else if(attName == "aunit")                  
2473     {                                            
2474       aunit = G4UnitDefinition::GetValueOf(at    
2475       if(G4UnitDefinition::GetCategory(attVal    
2476       {                                          
2477         G4Exception("G4GDMLReadSolids::TrapRe    
2478                     FatalException, "Invalid     
2479       }                                          
2480     }                                            
2481     else if(attName == "z")                      
2482     {                                            
2483       z = eval.Evaluate(attValue);               
2484     }                                            
2485     else if(attName == "theta")                  
2486     {                                            
2487       theta = eval.Evaluate(attValue);           
2488     }                                            
2489     else if(attName == "phi")                    
2490     {                                            
2491       phi = eval.Evaluate(attValue);             
2492     }                                            
2493     else if(attName == "y1")                     
2494     {                                            
2495       y1 = eval.Evaluate(attValue);              
2496     }                                            
2497     else if(attName == "x1")                     
2498     {                                            
2499       x1 = eval.Evaluate(attValue);              
2500     }                                            
2501     else if(attName == "x2")                     
2502     {                                            
2503       x2 = eval.Evaluate(attValue);              
2504     }                                            
2505     else if(attName == "alpha1")                 
2506     {                                            
2507       alpha1 = eval.Evaluate(attValue);          
2508     }                                            
2509     else if(attName == "y2")                     
2510     {                                            
2511       y2 = eval.Evaluate(attValue);              
2512     }                                            
2513     else if(attName == "x3")                     
2514     {                                            
2515       x3 = eval.Evaluate(attValue);              
2516     }                                            
2517     else if(attName == "x4")                     
2518     {                                            
2519       x4 = eval.Evaluate(attValue);              
2520     }                                            
2521     else if(attName == "alpha2")                 
2522     {                                            
2523       alpha2 = eval.Evaluate(attValue);          
2524     }                                            
2525   }                                              
2526                                                  
2527   z *= 0.5 * lunit;                              
2528   theta *= aunit;                                
2529   phi *= aunit;                                  
2530   y1 *= 0.5 * lunit;                             
2531   x1 *= 0.5 * lunit;                             
2532   x2 *= 0.5 * lunit;                             
2533   alpha1 *= aunit;                               
2534   y2 *= 0.5 * lunit;                             
2535   x3 *= 0.5 * lunit;                             
2536   x4 *= 0.5 * lunit;                             
2537   alpha2 *= aunit;                               
2538                                                  
2539   new G4Trap(name, z, theta, phi, y1, x1, x2,    
2540 }                                                
2541                                                  
2542 // ------------------------------------------    
2543 void G4GDMLReadSolids::TrdRead(const xercesc:    
2544 {                                                
2545   G4String name;                                 
2546   G4double lunit = 1.0;                          
2547   G4double x1    = 0.0;                          
2548   G4double x2    = 0.0;                          
2549   G4double y1    = 0.0;                          
2550   G4double y2    = 0.0;                          
2551   G4double z     = 0.0;                          
2552                                                  
2553   const xercesc::DOMNamedNodeMap* const attri    
2554     trdElement->getAttributes();                 
2555   XMLSize_t attributeCount = attributes->getL    
2556                                                  
2557   for(XMLSize_t attribute_index = 0; attribut    
2558       ++attribute_index)                         
2559   {                                              
2560     xercesc::DOMNode* attribute_node = attrib    
2561                                                  
2562     if(attribute_node->getNodeType() != xerce    
2563     {                                            
2564       continue;                                  
2565     }                                            
2566                                                  
2567     const xercesc::DOMAttr* const attribute =    
2568       dynamic_cast<xercesc::DOMAttr*>(attribu    
2569     if(attribute == nullptr)                     
2570     {                                            
2571       G4Exception("G4GDMLReadSolids::TrdRead(    
2572                   "No attribute found!");        
2573       return;                                    
2574     }                                            
2575     const G4String attName  = Transcode(attri    
2576     const G4String attValue = Transcode(attri    
2577                                                  
2578     if(attName == "name")                        
2579     {                                            
2580       name = GenerateName(attValue);             
2581     }                                            
2582     else if(attName == "lunit")                  
2583     {                                            
2584       lunit = G4UnitDefinition::GetValueOf(at    
2585       if(G4UnitDefinition::GetCategory(attVal    
2586       {                                          
2587         G4Exception("G4GDMLReadSolids::TrdRea    
2588                     FatalException, "Invalid     
2589       }                                          
2590     }                                            
2591     else if(attName == "x1")                     
2592     {                                            
2593       x1 = eval.Evaluate(attValue);              
2594     }                                            
2595     else if(attName == "x2")                     
2596     {                                            
2597       x2 = eval.Evaluate(attValue);              
2598     }                                            
2599     else if(attName == "y1")                     
2600     {                                            
2601       y1 = eval.Evaluate(attValue);              
2602     }                                            
2603     else if(attName == "y2")                     
2604     {                                            
2605       y2 = eval.Evaluate(attValue);              
2606     }                                            
2607     else if(attName == "z")                      
2608     {                                            
2609       z = eval.Evaluate(attValue);               
2610     }                                            
2611   }                                              
2612                                                  
2613   x1 *= 0.5 * lunit;                             
2614   x2 *= 0.5 * lunit;                             
2615   y1 *= 0.5 * lunit;                             
2616   y2 *= 0.5 * lunit;                             
2617   z *= 0.5 * lunit;                              
2618                                                  
2619   new G4Trd(name, x1, x2, y1, y2, z);            
2620 }                                                
2621                                                  
2622 // ------------------------------------------    
2623 G4TriangularFacet* G4GDMLReadSolids::Triangul    
2624   const xercesc::DOMElement* const triangular    
2625 {                                                
2626   G4ThreeVector vertex1;                         
2627   G4ThreeVector vertex2;                         
2628   G4ThreeVector vertex3;                         
2629   G4FacetVertexType type = ABSOLUTE;             
2630   G4double lunit         = 1.0;                  
2631                                                  
2632   const xercesc::DOMNamedNodeMap* const attri    
2633     triangularElement->getAttributes();          
2634   XMLSize_t attributeCount = attributes->getL    
2635                                                  
2636   for(XMLSize_t attribute_index = 0; attribut    
2637       ++attribute_index)                         
2638   {                                              
2639     xercesc::DOMNode* attribute_node = attrib    
2640                                                  
2641     if(attribute_node->getNodeType() != xerce    
2642     {                                            
2643       continue;                                  
2644     }                                            
2645                                                  
2646     const xercesc::DOMAttr* const attribute =    
2647       dynamic_cast<xercesc::DOMAttr*>(attribu    
2648     if(attribute == nullptr)                     
2649     {                                            
2650       G4Exception("G4GDMLReadSolids::Triangul    
2651                   FatalException, "No attribu    
2652       return nullptr;                            
2653     }                                            
2654     const G4String attName  = Transcode(attri    
2655     const G4String attValue = Transcode(attri    
2656                                                  
2657     if(attName == "vertex1")                     
2658     {                                            
2659       vertex1 = GetPosition(GenerateName(attV    
2660     }                                            
2661     else if(attName == "vertex2")                
2662     {                                            
2663       vertex2 = GetPosition(GenerateName(attV    
2664     }                                            
2665     else if(attName == "vertex3")                
2666     {                                            
2667       vertex3 = GetPosition(GenerateName(attV    
2668     }                                            
2669     else if(attName == "lunit")                  
2670     {                                            
2671       lunit = G4UnitDefinition::GetValueOf(at    
2672       if(G4UnitDefinition::GetCategory(attVal    
2673       {                                          
2674         G4Exception("G4GDMLReadSolids::Triang    
2675                     FatalException, "Invalid     
2676       }                                          
2677     }                                            
2678     else if(attName == "type")                   
2679     {                                            
2680       if(attValue == "RELATIVE")                 
2681       {                                          
2682         type = RELATIVE;                         
2683       }                                          
2684     }                                            
2685   }                                              
2686                                                  
2687   return new G4TriangularFacet(vertex1 * luni    
2688                                vertex3 * luni    
2689 }                                                
2690                                                  
2691 // ------------------------------------------    
2692 void G4GDMLReadSolids::TubeRead(const xercesc    
2693 {                                                
2694   G4String name;                                 
2695   G4double lunit    = 1.0;                       
2696   G4double aunit    = 1.0;                       
2697   G4double rmin     = 0.0;                       
2698   G4double rmax     = 0.0;                       
2699   G4double z        = 0.0;                       
2700   G4double startphi = 0.0;                       
2701   G4double deltaphi = 0.0;                       
2702                                                  
2703   const xercesc::DOMNamedNodeMap* const attri    
2704     tubeElement->getAttributes();                
2705   XMLSize_t attributeCount = attributes->getL    
2706                                                  
2707   for(XMLSize_t attribute_index = 0; attribut    
2708       ++attribute_index)                         
2709   {                                              
2710     xercesc::DOMNode* attribute_node = attrib    
2711                                                  
2712     if(attribute_node->getNodeType() != xerce    
2713     {                                            
2714       continue;                                  
2715     }                                            
2716                                                  
2717     const xercesc::DOMAttr* const attribute =    
2718       dynamic_cast<xercesc::DOMAttr*>(attribu    
2719     if(attribute == nullptr)                     
2720     {                                            
2721       G4Exception("G4GDMLReadSolids::TubeRead    
2722                   "No attribute found!");        
2723       return;                                    
2724     }                                            
2725     const G4String attName  = Transcode(attri    
2726     const G4String attValue = Transcode(attri    
2727                                                  
2728     if(attName == "name")                        
2729     {                                            
2730       name = GenerateName(attValue);             
2731     }                                            
2732     else if(attName == "lunit")                  
2733     {                                            
2734       lunit = G4UnitDefinition::GetValueOf(at    
2735       if(G4UnitDefinition::GetCategory(attVal    
2736       {                                          
2737         G4Exception("G4GDMLReadSolids::TubeRe    
2738                     FatalException, "Invalid     
2739       }                                          
2740     }                                            
2741     else if(attName == "aunit")                  
2742     {                                            
2743       aunit = G4UnitDefinition::GetValueOf(at    
2744       if(G4UnitDefinition::GetCategory(attVal    
2745       {                                          
2746         G4Exception("G4GDMLReadSolids::TubeRe    
2747                     FatalException, "Invalid     
2748       }                                          
2749     }                                            
2750     else if(attName == "rmin")                   
2751     {                                            
2752       rmin = eval.Evaluate(attValue);            
2753     }                                            
2754     else if(attName == "rmax")                   
2755     {                                            
2756       rmax = eval.Evaluate(attValue);            
2757     }                                            
2758     else if(attName == "z")                      
2759     {                                            
2760       z = eval.Evaluate(attValue);               
2761     }                                            
2762     else if(attName == "startphi")               
2763     {                                            
2764       startphi = eval.Evaluate(attValue);        
2765     }                                            
2766     else if(attName == "deltaphi")               
2767     {                                            
2768       deltaphi = eval.Evaluate(attValue);        
2769     }                                            
2770   }                                              
2771                                                  
2772   rmin *= lunit;                                 
2773   rmax *= lunit;                                 
2774   z *= 0.5 * lunit;                              
2775   startphi *= aunit;                             
2776   deltaphi *= aunit;                             
2777                                                  
2778   new G4Tubs(name, rmin, rmax, z, startphi, d    
2779 }                                                
2780                                                  
2781 // ------------------------------------------    
2782 void G4GDMLReadSolids::CutTubeRead(              
2783   const xercesc::DOMElement* const cuttubeEle    
2784 {                                                
2785   G4String name;                                 
2786   G4double lunit    = 1.0;                       
2787   G4double aunit    = 1.0;                       
2788   G4double rmin     = 0.0;                       
2789   G4double rmax     = 0.0;                       
2790   G4double z        = 0.0;                       
2791   G4double startphi = 0.0;                       
2792   G4double deltaphi = 0.0;                       
2793   G4ThreeVector lowNorm(0);                      
2794   G4ThreeVector highNorm(0);                     
2795                                                  
2796   const xercesc::DOMNamedNodeMap* const attri    
2797     cuttubeElement->getAttributes();             
2798   XMLSize_t attributeCount = attributes->getL    
2799                                                  
2800   for(XMLSize_t attribute_index = 0; attribut    
2801       ++attribute_index)                         
2802   {                                              
2803     xercesc::DOMNode* attribute_node = attrib    
2804                                                  
2805     if(attribute_node->getNodeType() != xerce    
2806     {                                            
2807       continue;                                  
2808     }                                            
2809                                                  
2810     const xercesc::DOMAttr* const attribute =    
2811       dynamic_cast<xercesc::DOMAttr*>(attribu    
2812     if(attribute == nullptr)                     
2813     {                                            
2814       G4Exception("G4GDMLReadSolids::CutTubeR    
2815                   FatalException, "No attribu    
2816       return;                                    
2817     }                                            
2818     const G4String attName  = Transcode(attri    
2819     const G4String attValue = Transcode(attri    
2820                                                  
2821     if(attName == "name")                        
2822     {                                            
2823       name = GenerateName(attValue);             
2824     }                                            
2825     else if(attName == "lunit")                  
2826     {                                            
2827       lunit = G4UnitDefinition::GetValueOf(at    
2828       if(G4UnitDefinition::GetCategory(attVal    
2829       {                                          
2830         G4Exception("G4GDMLReadSolids::CutTub    
2831                     FatalException, "Invalid     
2832       }                                          
2833     }                                            
2834     else if(attName == "aunit")                  
2835     {                                            
2836       aunit = G4UnitDefinition::GetValueOf(at    
2837       if(G4UnitDefinition::GetCategory(attVal    
2838       {                                          
2839         G4Exception("G4GDMLReadSolids::CutTub    
2840                     FatalException, "Invalid     
2841       }                                          
2842     }                                            
2843     else if(attName == "rmin")                   
2844     {                                            
2845       rmin = eval.Evaluate(attValue);            
2846     }                                            
2847     else if(attName == "rmax")                   
2848     {                                            
2849       rmax = eval.Evaluate(attValue);            
2850     }                                            
2851     else if(attName == "z")                      
2852     {                                            
2853       z = eval.Evaluate(attValue);               
2854     }                                            
2855     else if(attName == "startphi")               
2856     {                                            
2857       startphi = eval.Evaluate(attValue);        
2858     }                                            
2859     else if(attName == "deltaphi")               
2860     {                                            
2861       deltaphi = eval.Evaluate(attValue);        
2862     }                                            
2863     else if(attName == "lowX")                   
2864     {                                            
2865       lowNorm.setX(eval.Evaluate(attValue));     
2866     }                                            
2867     else if(attName == "lowY")                   
2868     {                                            
2869       lowNorm.setY(eval.Evaluate(attValue));     
2870     }                                            
2871     else if(attName == "lowZ")                   
2872     {                                            
2873       lowNorm.setZ(eval.Evaluate(attValue));     
2874     }                                            
2875     else if(attName == "highX")                  
2876     {                                            
2877       highNorm.setX(eval.Evaluate(attValue));    
2878     }                                            
2879     else if(attName == "highY")                  
2880     {                                            
2881       highNorm.setY(eval.Evaluate(attValue));    
2882     }                                            
2883     else if(attName == "highZ")                  
2884     {                                            
2885       highNorm.setZ(eval.Evaluate(attValue));    
2886     }                                            
2887   }                                              
2888                                                  
2889   rmin *= lunit;                                 
2890   rmax *= lunit;                                 
2891   z *= 0.5 * lunit;                              
2892   startphi *= aunit;                             
2893   deltaphi *= aunit;                             
2894                                                  
2895   new G4CutTubs(name, rmin, rmax, z, startphi    
2896 }                                                
2897                                                  
2898 // ------------------------------------------    
2899 void G4GDMLReadSolids::TwistedboxRead(           
2900   const xercesc::DOMElement* const twistedbox    
2901 {                                                
2902   G4String name;                                 
2903   G4double lunit    = 1.0;                       
2904   G4double aunit    = 1.0;                       
2905   G4double PhiTwist = 0.0;                       
2906   G4double x        = 0.0;                       
2907   G4double y        = 0.0;                       
2908   G4double z        = 0.0;                       
2909                                                  
2910   const xercesc::DOMNamedNodeMap* const attri    
2911     twistedboxElement->getAttributes();          
2912   XMLSize_t attributeCount = attributes->getL    
2913                                                  
2914   for(XMLSize_t attribute_index = 0; attribut    
2915       ++attribute_index)                         
2916   {                                              
2917     xercesc::DOMNode* attribute_node = attrib    
2918                                                  
2919     if(attribute_node->getNodeType() != xerce    
2920     {                                            
2921       continue;                                  
2922     }                                            
2923                                                  
2924     const xercesc::DOMAttr* const attribute =    
2925       dynamic_cast<xercesc::DOMAttr*>(attribu    
2926     if(attribute == nullptr)                     
2927     {                                            
2928       G4Exception("G4GDMLReadSolids::Twistedb    
2929                   FatalException, "No attribu    
2930       return;                                    
2931     }                                            
2932     const G4String attName  = Transcode(attri    
2933     const G4String attValue = Transcode(attri    
2934                                                  
2935     if(attName == "name")                        
2936     {                                            
2937       name = GenerateName(attValue);             
2938     }                                            
2939     else if(attName == "lunit")                  
2940     {                                            
2941       lunit = G4UnitDefinition::GetValueOf(at    
2942       if(G4UnitDefinition::GetCategory(attVal    
2943       {                                          
2944         G4Exception("G4GDMLReadSolids::Twiste    
2945                     FatalException, "Invalid     
2946       }                                          
2947     }                                            
2948     else if(attName == "aunit")                  
2949     {                                            
2950       aunit = G4UnitDefinition::GetValueOf(at    
2951       if(G4UnitDefinition::GetCategory(attVal    
2952       {                                          
2953         G4Exception("G4GDMLReadSolids::Twiste    
2954                     FatalException, "Invalid     
2955       }                                          
2956     }                                            
2957     else if(attName == "PhiTwist")               
2958     {                                            
2959       PhiTwist = eval.Evaluate(attValue);        
2960     }                                            
2961     else if(attName == "x")                      
2962     {                                            
2963       x = eval.Evaluate(attValue);               
2964     }                                            
2965     else if(attName == "y")                      
2966     {                                            
2967       y = eval.Evaluate(attValue);               
2968     }                                            
2969     else if(attName == "z")                      
2970     {                                            
2971       z = eval.Evaluate(attValue);               
2972     }                                            
2973   }                                              
2974                                                  
2975   PhiTwist *= aunit;                             
2976   x *= 0.5 * lunit;                              
2977   y *= 0.5 * lunit;                              
2978   z *= 0.5 * lunit;                              
2979                                                  
2980   new G4TwistedBox(name, PhiTwist, x, y, z);     
2981 }                                                
2982                                                  
2983 // ------------------------------------------    
2984 void G4GDMLReadSolids::TwistedtrapRead(          
2985   const xercesc::DOMElement* const twistedtra    
2986 {                                                
2987   G4String name;                                 
2988   G4double lunit    = 1.0;                       
2989   G4double aunit    = 1.0;                       
2990   G4double PhiTwist = 0.0;                       
2991   G4double z        = 0.0;                       
2992   G4double Theta    = 0.0;                       
2993   G4double Phi      = 0.0;                       
2994   G4double y1       = 0.0;                       
2995   G4double x1       = 0.0;                       
2996   G4double x2       = 0.0;                       
2997   G4double y2       = 0.0;                       
2998   G4double x3       = 0.0;                       
2999   G4double x4       = 0.0;                       
3000   G4double Alph     = 0.0;                       
3001                                                  
3002   const xercesc::DOMNamedNodeMap* const attri    
3003     twistedtrapElement->getAttributes();         
3004   XMLSize_t attributeCount = attributes->getL    
3005                                                  
3006   for(XMLSize_t attribute_index = 0; attribut    
3007       ++attribute_index)                         
3008   {                                              
3009     xercesc::DOMNode* attribute_node = attrib    
3010                                                  
3011     if(attribute_node->getNodeType() != xerce    
3012     {                                            
3013       continue;                                  
3014     }                                            
3015                                                  
3016     const xercesc::DOMAttr* const attribute =    
3017       dynamic_cast<xercesc::DOMAttr*>(attribu    
3018     if(attribute == nullptr)                     
3019     {                                            
3020       G4Exception("G4GDMLReadSolids::Twistedt    
3021                   FatalException, "No attribu    
3022       return;                                    
3023     }                                            
3024     const G4String attName  = Transcode(attri    
3025     const G4String attValue = Transcode(attri    
3026                                                  
3027     if(attName == "name")                        
3028     {                                            
3029       name = GenerateName(attValue);             
3030     }                                            
3031     else if(attName == "lunit")                  
3032     {                                            
3033       lunit = G4UnitDefinition::GetValueOf(at    
3034       if(G4UnitDefinition::GetCategory(attVal    
3035       {                                          
3036         G4Exception("G4GDMLReadSolids::Twiste    
3037                     FatalException, "Invalid     
3038       }                                          
3039     }                                            
3040     else if(attName == "aunit")                  
3041     {                                            
3042       aunit = G4UnitDefinition::GetValueOf(at    
3043       if(G4UnitDefinition::GetCategory(attVal    
3044       {                                          
3045         G4Exception("G4GDMLReadSolids::Twiste    
3046                     FatalException, "Invalid     
3047       }                                          
3048     }                                            
3049     else if(attName == "PhiTwist")               
3050     {                                            
3051       PhiTwist = eval.Evaluate(attValue);        
3052     }                                            
3053     else if(attName == "z")                      
3054     {                                            
3055       z = eval.Evaluate(attValue);               
3056     }                                            
3057     else if(attName == "Theta")                  
3058     {                                            
3059       Theta = eval.Evaluate(attValue);           
3060     }                                            
3061     else if(attName == "Phi")                    
3062     {                                            
3063       Phi = eval.Evaluate(attValue);             
3064     }                                            
3065     else if(attName == "y1")                     
3066     {                                            
3067       y1 = eval.Evaluate(attValue);              
3068     }                                            
3069     else if(attName == "x1")                     
3070     {                                            
3071       x1 = eval.Evaluate(attValue);              
3072     }                                            
3073     else if(attName == "x2")                     
3074     {                                            
3075       x2 = eval.Evaluate(attValue);              
3076     }                                            
3077     else if(attName == "y2")                     
3078     {                                            
3079       y2 = eval.Evaluate(attValue);              
3080     }                                            
3081     else if(attName == "x3")                     
3082     {                                            
3083       x3 = eval.Evaluate(attValue);              
3084     }                                            
3085     else if(attName == "x4")                     
3086     {                                            
3087       x4 = eval.Evaluate(attValue);              
3088     }                                            
3089     else if(attName == "Alph")                   
3090     {                                            
3091       Alph = eval.Evaluate(attValue);            
3092     }                                            
3093   }                                              
3094                                                  
3095   PhiTwist *= aunit;                             
3096   z *= 0.5 * lunit;                              
3097   Theta *= aunit;                                
3098   Phi *= aunit;                                  
3099   Alph *= aunit;                                 
3100   y1 *= 0.5 * lunit;                             
3101   x1 *= 0.5 * lunit;                             
3102   x2 *= 0.5 * lunit;                             
3103   y2 *= 0.5 * lunit;                             
3104   x3 *= 0.5 * lunit;                             
3105   x4 *= 0.5 * lunit;                             
3106                                                  
3107   new G4TwistedTrap(name, PhiTwist, z, Theta,    
3108                     Alph);                       
3109 }                                                
3110                                                  
3111 // ------------------------------------------    
3112 void G4GDMLReadSolids::TwistedtrdRead(           
3113   const xercesc::DOMElement* const twistedtrd    
3114 {                                                
3115   G4String name;                                 
3116   G4double lunit    = 1.0;                       
3117   G4double aunit    = 1.0;                       
3118   G4double x1       = 0.0;                       
3119   G4double x2       = 0.0;                       
3120   G4double y1       = 0.0;                       
3121   G4double y2       = 0.0;                       
3122   G4double z        = 0.0;                       
3123   G4double PhiTwist = 0.0;                       
3124                                                  
3125   const xercesc::DOMNamedNodeMap* const attri    
3126     twistedtrdElement->getAttributes();          
3127   XMLSize_t attributeCount = attributes->getL    
3128                                                  
3129   for(XMLSize_t attribute_index = 0; attribut    
3130       ++attribute_index)                         
3131   {                                              
3132     xercesc::DOMNode* attribute_node = attrib    
3133                                                  
3134     if(attribute_node->getNodeType() != xerce    
3135     {                                            
3136       continue;                                  
3137     }                                            
3138                                                  
3139     const xercesc::DOMAttr* const attribute =    
3140       dynamic_cast<xercesc::DOMAttr*>(attribu    
3141     if(attribute == nullptr)                     
3142     {                                            
3143       G4Exception("G4GDMLReadSolids::Twistedt    
3144                   FatalException, "No attribu    
3145       return;                                    
3146     }                                            
3147     const G4String attName  = Transcode(attri    
3148     const G4String attValue = Transcode(attri    
3149                                                  
3150     if(attName == "name")                        
3151     {                                            
3152       name = GenerateName(attValue);             
3153     }                                            
3154     else if(attName == "lunit")                  
3155     {                                            
3156       lunit = G4UnitDefinition::GetValueOf(at    
3157       if(G4UnitDefinition::GetCategory(attVal    
3158       {                                          
3159         G4Exception("G4GDMLReadSolids::Twiste    
3160                     FatalException, "Invalid     
3161       }                                          
3162     }                                            
3163     else if(attName == "aunit")                  
3164     {                                            
3165       aunit = G4UnitDefinition::GetValueOf(at    
3166       if(G4UnitDefinition::GetCategory(attVal    
3167       {                                          
3168         G4Exception("G4GDMLReadSolids::Twiste    
3169                     FatalException, "Invalid     
3170       }                                          
3171     }                                            
3172     else if(attName == "x1")                     
3173     {                                            
3174       x1 = eval.Evaluate(attValue);              
3175     }                                            
3176     else if(attName == "x2")                     
3177     {                                            
3178       x2 = eval.Evaluate(attValue);              
3179     }                                            
3180     else if(attName == "y1")                     
3181     {                                            
3182       y1 = eval.Evaluate(attValue);              
3183     }                                            
3184     else if(attName == "y2")                     
3185     {                                            
3186       y2 = eval.Evaluate(attValue);              
3187     }                                            
3188     else if(attName == "z")                      
3189     {                                            
3190       z = eval.Evaluate(attValue);               
3191     }                                            
3192     else if(attName == "PhiTwist")               
3193     {                                            
3194       PhiTwist = eval.Evaluate(attValue);        
3195     }                                            
3196   }                                              
3197                                                  
3198   x1 *= 0.5 * lunit;                             
3199   x2 *= 0.5 * lunit;                             
3200   y1 *= 0.5 * lunit;                             
3201   y2 *= 0.5 * lunit;                             
3202   z *= 0.5 * lunit;                              
3203   PhiTwist *= aunit;                             
3204                                                  
3205   new G4TwistedTrd(name, x1, x2, y1, y2, z, P    
3206 }                                                
3207                                                  
3208 // ------------------------------------------    
3209 void G4GDMLReadSolids::TwistedtubsRead(          
3210   const xercesc::DOMElement* const twistedtub    
3211 {                                                
3212   G4String name;                                 
3213   G4double lunit        = 1.0;                   
3214   G4double aunit        = 1.0;                   
3215   G4double twistedangle = 0.0;                   
3216   G4double endinnerrad  = 0.0;                   
3217   G4double endouterrad  = 0.0;                   
3218   G4double zlen         = 0.0;                   
3219   G4double phi          = 0.0;                   
3220   G4double totphi       = 0.0;                   
3221   G4double midinnerrad  = 0.0;                   
3222   G4double midouterrad  = 0.0;                   
3223   G4double positiveEndz = 0.0;                   
3224   G4double negativeEndz = 0.0;                   
3225   G4int nseg            = 0;                     
3226                                                  
3227   const xercesc::DOMNamedNodeMap* const attri    
3228     twistedtubsElement->getAttributes();         
3229   XMLSize_t attributeCount = attributes->getL    
3230                                                  
3231   for(XMLSize_t attribute_index = 0; attribut    
3232       ++attribute_index)                         
3233   {                                              
3234     xercesc::DOMNode* attribute_node = attrib    
3235                                                  
3236     if(attribute_node->getNodeType() != xerce    
3237     {                                            
3238       continue;                                  
3239     }                                            
3240                                                  
3241     const xercesc::DOMAttr* const attribute =    
3242       dynamic_cast<xercesc::DOMAttr*>(attribu    
3243     if(attribute == nullptr)                     
3244     {                                            
3245       G4Exception("G4GDMLReadSolids::Twistedt    
3246                   FatalException, "No attribu    
3247       return;                                    
3248     }                                            
3249     const G4String attName  = Transcode(attri    
3250     const G4String attValue = Transcode(attri    
3251                                                  
3252     if(attName == "name")                        
3253     {                                            
3254       name = GenerateName(attValue);             
3255     }                                            
3256     else if(attName == "lunit")                  
3257     {                                            
3258       lunit = G4UnitDefinition::GetValueOf(at    
3259       if(G4UnitDefinition::GetCategory(attVal    
3260       {                                          
3261         G4Exception("G4GDMLReadSolids::Twiste    
3262                     FatalException, "Invalid     
3263       }                                          
3264     }                                            
3265     else if(attName == "aunit")                  
3266     {                                            
3267       aunit = G4UnitDefinition::GetValueOf(at    
3268       if(G4UnitDefinition::GetCategory(attVal    
3269       {                                          
3270         G4Exception("G4GDMLReadSolids::Twiste    
3271                     FatalException, "Invalid     
3272       }                                          
3273     }                                            
3274     else if(attName == "twistedangle")           
3275     {                                            
3276       twistedangle = eval.Evaluate(attValue);    
3277     }                                            
3278     else if(attName == "endinnerrad")            
3279     {                                            
3280       endinnerrad = eval.Evaluate(attValue);     
3281     }                                            
3282     else if(attName == "endouterrad")            
3283     {                                            
3284       endouterrad = eval.Evaluate(attValue);     
3285     }                                            
3286     else if(attName == "zlen")                   
3287     {                                            
3288       zlen = eval.Evaluate(attValue);            
3289     }                                            
3290     else if(attName == "midinnerrad")            
3291     {                                            
3292       midinnerrad = eval.Evaluate(attValue);     
3293     }                                            
3294     else if(attName == "midouterrad")            
3295     {                                            
3296       midouterrad = eval.Evaluate(attValue);     
3297     }                                            
3298     else if(attName == "negativeEndz")           
3299     {                                            
3300       negativeEndz = eval.Evaluate(attValue);    
3301     }                                            
3302     else if(attName == "positiveEndz")           
3303     {                                            
3304       positiveEndz = eval.Evaluate(attValue);    
3305     }                                            
3306     else if(attName == "nseg")                   
3307     {                                            
3308       nseg = eval.Evaluate(attValue);            
3309     }                                            
3310     else if(attName == "totphi")                 
3311     {                                            
3312       totphi = eval.Evaluate(attValue);          
3313     }                                            
3314     else if(attName == "phi")                    
3315     {                                            
3316       phi = eval.Evaluate(attValue);             
3317     }                                            
3318   }                                              
3319                                                  
3320   twistedangle *= aunit;                         
3321   endinnerrad *= lunit;                          
3322   endouterrad *= lunit;                          
3323   zlen *= 0.5 * lunit;                           
3324   midinnerrad *= lunit;                          
3325   midouterrad *= lunit;                          
3326   positiveEndz *= lunit;                         
3327   negativeEndz *= lunit;                         
3328   phi *= aunit;                                  
3329   totphi *= aunit;                               
3330                                                  
3331   if(zlen != 0.0)                                
3332   {                                              
3333     if(nseg != 0)                                
3334       new G4TwistedTubs(name, twistedangle, e    
3335                         nseg, totphi);           
3336     else                                         
3337       new G4TwistedTubs(name, twistedangle, e    
3338                         phi);                    
3339   }                                              
3340   else                                           
3341   {                                              
3342     if(nseg != 0)                                
3343       new G4TwistedTubs(name, twistedangle, m    
3344                         negativeEndz, positiv    
3345     else                                         
3346       new G4TwistedTubs(name, twistedangle, m    
3347                         negativeEndz, positiv    
3348   }                                              
3349 }                                                
3350                                                  
3351 // ------------------------------------------    
3352 G4TwoVector G4GDMLReadSolids::TwoDimVertexRea    
3353   const xercesc::DOMElement* const element, G    
3354 {                                                
3355   G4TwoVector vec;                               
3356                                                  
3357   const xercesc::DOMNamedNodeMap* const attri    
3358   XMLSize_t attributeCount                       
3359                                                  
3360   for(XMLSize_t attribute_index = 0; attribut    
3361       ++attribute_index)                         
3362   {                                              
3363     xercesc::DOMNode* attribute_node = attrib    
3364                                                  
3365     if(attribute_node->getNodeType() != xerce    
3366     {                                            
3367       continue;                                  
3368     }                                            
3369                                                  
3370     const xercesc::DOMAttr* const attribute =    
3371       dynamic_cast<xercesc::DOMAttr*>(attribu    
3372     if(attribute == nullptr)                     
3373     {                                            
3374       G4Exception("G4GDMLReadSolids::TwoDimVe    
3375                   FatalException, "No attribu    
3376       return vec;                                
3377     }                                            
3378     const G4String attName  = Transcode(attri    
3379     const G4String attValue = Transcode(attri    
3380                                                  
3381     if(attName == "x")                           
3382     {                                            
3383       vec.setX(eval.Evaluate(attValue) * luni    
3384     }                                            
3385     else if(attName == "y")                      
3386     {                                            
3387       vec.setY(eval.Evaluate(attValue) * luni    
3388     }                                            
3389   }                                              
3390                                                  
3391   return vec;                                    
3392 }                                                
3393                                                  
3394 // ------------------------------------------    
3395 G4GDMLReadSolids::zplaneType G4GDMLReadSolids    
3396   const xercesc::DOMElement* const zplaneElem    
3397 {                                                
3398   zplaneType zplane = { 0., 0., 0. };            
3399                                                  
3400   const xercesc::DOMNamedNodeMap* const attri    
3401     zplaneElement->getAttributes();              
3402   XMLSize_t attributeCount = attributes->getL    
3403                                                  
3404   for(XMLSize_t attribute_index = 0; attribut    
3405       ++attribute_index)                         
3406   {                                              
3407     xercesc::DOMNode* node = attributes->item    
3408                                                  
3409     if(node->getNodeType() != xercesc::DOMNod    
3410     {                                            
3411       continue;                                  
3412     }                                            
3413                                                  
3414     const xercesc::DOMAttr* const attribute =    
3415       dynamic_cast<xercesc::DOMAttr*>(node);     
3416     if(attribute == nullptr)                     
3417     {                                            
3418       G4Exception("G4GDMLReadSolids::ZplaneRe    
3419                   FatalException, "No attribu    
3420       return zplane;                             
3421     }                                            
3422     const G4String attName  = Transcode(attri    
3423     const G4String attValue = Transcode(attri    
3424                                                  
3425     if(attName == "rmin")                        
3426     {                                            
3427       zplane.rmin = eval.Evaluate(attValue);     
3428     }                                            
3429     else if(attName == "rmax")                   
3430     {                                            
3431       zplane.rmax = eval.Evaluate(attValue);     
3432     }                                            
3433     else if(attName == "z")                      
3434     {                                            
3435       zplane.z = eval.Evaluate(attValue);        
3436     }                                            
3437   }                                              
3438                                                  
3439   return zplane;                                 
3440 }                                                
3441                                                  
3442 // ------------------------------------------    
3443 G4GDMLReadSolids::rzPointType G4GDMLReadSolid    
3444   const xercesc::DOMElement* const zplaneElem    
3445 {                                                
3446   rzPointType rzpoint = { 0., 0. };              
3447                                                  
3448   const xercesc::DOMNamedNodeMap* const attri    
3449     zplaneElement->getAttributes();              
3450   XMLSize_t attributeCount = attributes->getL    
3451                                                  
3452   for(XMLSize_t attribute_index = 0; attribut    
3453       ++attribute_index)                         
3454   {                                              
3455     xercesc::DOMNode* node = attributes->item    
3456                                                  
3457     if(node->getNodeType() != xercesc::DOMNod    
3458     {                                            
3459       continue;                                  
3460     }                                            
3461                                                  
3462     const xercesc::DOMAttr* const attribute =    
3463       dynamic_cast<xercesc::DOMAttr*>(node);     
3464     if(attribute == nullptr)                     
3465     {                                            
3466       G4Exception("G4GDMLReadSolids::RZPointR    
3467                   FatalException, "No attribu    
3468       return rzpoint;                            
3469     }                                            
3470     const G4String attName  = Transcode(attri    
3471     const G4String attValue = Transcode(attri    
3472                                                  
3473     if(attName == "r")                           
3474     {                                            
3475       rzpoint.r = eval.Evaluate(attValue);       
3476     }                                            
3477     else if(attName == "z")                      
3478     {                                            
3479       rzpoint.z = eval.Evaluate(attValue);       
3480     }                                            
3481   }                                              
3482                                                  
3483   return rzpoint;                                
3484 }                                                
3485                                                  
3486 // ------------------------------------------    
3487 void G4GDMLReadSolids::PropertyRead(             
3488   const xercesc::DOMElement* const propertyEl    
3489   G4OpticalSurface* opticalsurface)              
3490 {                                                
3491   G4String name;                                 
3492   G4String ref;                                  
3493   G4GDMLMatrix matrix;                           
3494                                                  
3495   const xercesc::DOMNamedNodeMap* const attri    
3496     propertyElement->getAttributes();            
3497   XMLSize_t attributeCount = attributes->getL    
3498                                                  
3499   for(XMLSize_t attribute_index = 0; attribut    
3500       ++attribute_index)                         
3501   {                                              
3502     xercesc::DOMNode* attribute_node = attrib    
3503                                                  
3504     if(attribute_node->getNodeType() != xerce    
3505     {                                            
3506       continue;                                  
3507     }                                            
3508                                                  
3509     const xercesc::DOMAttr* const attribute =    
3510       dynamic_cast<xercesc::DOMAttr*>(attribu    
3511     if(attribute == nullptr)                     
3512     {                                            
3513       G4Exception("G4GDMLReadSolids::Property    
3514                   FatalException, "No attribu    
3515       return;                                    
3516     }                                            
3517     const G4String attName  = Transcode(attri    
3518     const G4String attValue = Transcode(attri    
3519                                                  
3520     if(attName == "name")                        
3521     {                                            
3522       name = GenerateName(attValue);             
3523     }                                            
3524     else if(attName == "ref")                    
3525     {                                            
3526       matrix = GetMatrix(ref = attValue);        
3527     }                                            
3528   }                                              
3529                                                  
3530   /*                                             
3531   if (matrix.GetCols() != 2)                     
3532   {                                              
3533     G4String error_msg = "Referenced matrix '    
3534            + "' should have \n two columns as    
3535   opticalsurface: "                              
3536            + opticalsurface->GetName();          
3537     G4Exception("G4GDMLReadSolids::PropertyRe    
3538                 FatalException, error_msg);      
3539   }                                              
3540   */                                             
3541                                                  
3542   if(matrix.GetRows() == 0)                      
3543   {                                              
3544     return;                                      
3545   }                                              
3546                                                  
3547   G4MaterialPropertiesTable* matprop =           
3548     opticalsurface->GetMaterialPropertiesTabl    
3549   if(matprop == nullptr)                         
3550   {                                              
3551     matprop = new G4MaterialPropertiesTable()    
3552     opticalsurface->SetMaterialPropertiesTabl    
3553   }                                              
3554   if(matrix.GetCols() == 1)  // constant prop    
3555   {                                              
3556     matprop->AddConstProperty(Strip(name), ma    
3557   }                                              
3558   else  // build the material properties vect    
3559   {                                              
3560     G4MaterialPropertyVector* propvect;          
3561     G4String temp = name + ref;                  
3562     // first check if it was already built       
3563     if(mapOfMatPropVects.find(temp) == mapOfM    
3564     {                                            
3565       // if not create a new one                 
3566       propvect = new G4MaterialPropertyVector    
3567       for(size_t i = 0; i < matrix.GetRows();    
3568       {                                          
3569         propvect->InsertValues(matrix.Get(i,     
3570       }                                          
3571       // and add it to the list for potential    
3572       mapOfMatPropVects[temp] = propvect;        
3573     }                                            
3574     else                                         
3575     {                                            
3576       propvect = mapOfMatPropVects[temp];        
3577     }                                            
3578                                                  
3579     matprop->AddProperty(Strip(name), propvec    
3580   }                                              
3581 }                                                
3582                                                  
3583 // ------------------------------------------    
3584 void G4GDMLReadSolids::OpticalSurfaceRead(       
3585   const xercesc::DOMElement* const opticalsur    
3586 {                                                
3587   G4String name;                                 
3588   G4String smodel;                               
3589   G4String sfinish;                              
3590   G4String stype;                                
3591   G4double value = 0.0;                          
3592                                                  
3593   const xercesc::DOMNamedNodeMap* const attri    
3594     opticalsurfaceElement->getAttributes();      
3595   XMLSize_t attributeCount = attributes->getL    
3596                                                  
3597   for(XMLSize_t attribute_index = 0; attribut    
3598       ++attribute_index)                         
3599   {                                              
3600     xercesc::DOMNode* attribute_node = attrib    
3601                                                  
3602     if(attribute_node->getNodeType() != xerce    
3603     {                                            
3604       continue;                                  
3605     }                                            
3606                                                  
3607     const xercesc::DOMAttr* const attribute =    
3608       dynamic_cast<xercesc::DOMAttr*>(attribu    
3609     if(attribute == nullptr)                     
3610     {                                            
3611       G4Exception("G4GDMLReadSolids::OpticalS    
3612                   FatalException, "No attribu    
3613       return;                                    
3614     }                                            
3615     const G4String attName  = Transcode(attri    
3616     const G4String attValue = Transcode(attri    
3617                                                  
3618     if(attName == "name")                        
3619     {                                            
3620       name = GenerateName(attValue);             
3621     }                                            
3622     else if(attName == "model")                  
3623     {                                            
3624       smodel = attValue;                         
3625     }                                            
3626     else if(attName == "finish")                 
3627     {                                            
3628       sfinish = attValue;                        
3629     }                                            
3630     else if(attName == "type")                   
3631     {                                            
3632       stype = attValue;                          
3633     }                                            
3634     else if(attName == "value")                  
3635     {                                            
3636       value = eval.Evaluate(attValue);           
3637     }                                            
3638   }                                              
3639                                                  
3640   G4OpticalSurfaceModel model;                   
3641   G4OpticalSurfaceFinish finish;                 
3642   G4SurfaceType type;                            
3643                                                  
3644   if((smodel == "glisur") || (smodel == "0"))    
3645   {                                              
3646     model = glisur;                              
3647   }                                              
3648   else if((smodel == "unified") || (smodel ==    
3649   {                                              
3650     model = unified;                             
3651   }                                              
3652   else if((smodel == "LUT") || (smodel == "2"    
3653   {                                              
3654     model = LUT;                                 
3655   }                                              
3656   else if((smodel == "DAVIS") || (smodel == "    
3657   {                                              
3658     model = DAVIS;                               
3659   }                                              
3660   else                                           
3661   {                                              
3662     model = dichroic;                            
3663   }                                              
3664                                                  
3665   if((sfinish == "polished") || (sfinish == "    
3666   {                                              
3667     finish = polished;                           
3668   }                                              
3669   else if((sfinish == "polishedfrontpainted")    
3670   {                                              
3671     finish = polishedfrontpainted;               
3672   }                                              
3673   else if((sfinish == "polishedbackpainted")     
3674   {                                              
3675     finish = polishedbackpainted;                
3676   }                                              
3677   else if((sfinish == "ground") || (sfinish =    
3678   {                                              
3679     finish = ground;                             
3680   }                                              
3681   else if((sfinish == "groundfrontpainted") |    
3682   {                                              
3683     finish = groundfrontpainted;                 
3684   }                                              
3685   else if((sfinish == "groundbackpainted") ||    
3686   {                                              
3687     finish = groundbackpainted;                  
3688   }                                              
3689   else if((sfinish == "polishedlumirrorair")     
3690   {                                              
3691     finish = polishedlumirrorair;                
3692   }                                              
3693   else if((sfinish == "polishedlumirrorglue")    
3694   {                                              
3695     finish = polishedlumirrorglue;               
3696   }                                              
3697   else if((sfinish == "polishedair") || (sfin    
3698   {                                              
3699     finish = polishedair;                        
3700   }                                              
3701   else if((sfinish == "polishedteflonair") ||    
3702   {                                              
3703     finish = polishedteflonair;                  
3704   }                                              
3705   else if((sfinish == "polishedtioair") || (s    
3706   {                                              
3707     finish = polishedtioair;                     
3708   }                                              
3709   else if((sfinish == "polishedtyvekair") ||     
3710   {                                              
3711     finish = polishedtyvekair;                   
3712   }                                              
3713   else if((sfinish == "polishedvm2000air") ||    
3714   {                                              
3715     finish = polishedvm2000air;                  
3716   }                                              
3717   else if((sfinish == "polishedvm2000glue") |    
3718   {                                              
3719     finish = polishedvm2000glue;                 
3720   }                                              
3721   else if((sfinish == "etchedlumirrorair") ||    
3722   {                                              
3723     finish = etchedlumirrorair;                  
3724   }                                              
3725   else if((sfinish == "etchedlumirrorglue") |    
3726   {                                              
3727     finish = etchedlumirrorglue;                 
3728   }                                              
3729   else if((sfinish == "etchedair") || (sfinis    
3730   {                                              
3731     finish = etchedair;                          
3732   }                                              
3733   else if((sfinish == "etchedteflonair") || (    
3734   {                                              
3735     finish = etchedteflonair;                    
3736   }                                              
3737   else if((sfinish == "etchedtioair") || (sfi    
3738   {                                              
3739     finish = etchedtioair;                       
3740   }                                              
3741   else if((sfinish == "etchedtyvekair") || (s    
3742   {                                              
3743     finish = etchedtyvekair;                     
3744   }                                              
3745   else if((sfinish == "etchedvm2000air") || (    
3746   {                                              
3747     finish = etchedvm2000air;                    
3748   }                                              
3749   else if((sfinish == "etchedvm2000glue") ||     
3750   {                                              
3751     finish = etchedvm2000glue;                   
3752   }                                              
3753   else if((sfinish == "groundlumirrorair") ||    
3754   {                                              
3755     finish = groundlumirrorair;                  
3756   }                                              
3757   else if((sfinish == "groundlumirrorglue") |    
3758   {                                              
3759     finish = groundlumirrorglue;                 
3760   }                                              
3761   else if((sfinish == "groundair") || (sfinis    
3762   {                                              
3763     finish = groundair;                          
3764   }                                              
3765   else if((sfinish == "groundteflonair") || (    
3766   {                                              
3767     finish = groundteflonair;                    
3768   }                                              
3769   else if((sfinish == "groundtioair") || (sfi    
3770   {                                              
3771     finish = groundtioair;                       
3772   }                                              
3773   else if((sfinish == "groundtyvekair") || (s    
3774   {                                              
3775     finish = groundtyvekair;                     
3776   }                                              
3777   else if((sfinish == "groundvm2000air") || (    
3778   {                                              
3779     finish = groundvm2000air;                    
3780   }                                              
3781   else if((sfinish == "groundvm2000glue") ||     
3782   {                                              
3783     finish = groundvm2000glue;                   
3784   }                                              
3785   else if((sfinish == "Rough_LUT") || (sfinis    
3786   {                                              
3787     finish = Rough_LUT;                          
3788   }                                              
3789   else if((sfinish == "RoughTeflon_LUT") || (    
3790   {                                              
3791     finish = RoughTeflon_LUT;                    
3792   }                                              
3793   else if((sfinish == "RoughESR_LUT") || (sfi    
3794   {                                              
3795     finish = RoughESR_LUT;                       
3796   }                                              
3797   else if((sfinish == "RoughESRGrease_LUT") |    
3798   {                                              
3799     finish = RoughESRGrease_LUT;                 
3800   }                                              
3801   else if((sfinish == "Polished_LUT") || (sfi    
3802   {                                              
3803     finish = Polished_LUT;                       
3804   }                                              
3805   else if((sfinish == "PolishedTeflon_LUT") |    
3806   {                                              
3807     finish = PolishedTeflon_LUT;                 
3808   }                                              
3809   else if((sfinish == "PolishedESR_LUT") || (    
3810   {                                              
3811     finish = PolishedESR_LUT;                    
3812   }                                              
3813   else if((sfinish == "PolishedESRGrease_LUT"    
3814   {                                              
3815     finish = PolishedESRGrease_LUT;              
3816   }                                              
3817   else                                           
3818   {                                              
3819     finish = Detector_LUT;                       
3820   }                                              
3821                                                  
3822   if((stype == "dielectric_metal") || (stype     
3823   {                                              
3824     type = dielectric_metal;                     
3825   }                                              
3826   else if((stype == "dielectric_dielectric")     
3827   {                                              
3828     type = dielectric_dielectric;                
3829   }                                              
3830   else if((stype == "dielectric_LUT") || (sty    
3831   {                                              
3832     type = dielectric_LUT;                       
3833   }                                              
3834   else if((stype == "dielectric_LUTDAVIS") ||    
3835   {                                              
3836     type = dielectric_LUTDAVIS;                  
3837   }                                              
3838   else if((stype == "dielectric_dichroic") ||    
3839   {                                              
3840     type = dielectric_dichroic;                  
3841   }                                              
3842   else if((stype == "firsov") || (stype == "5    
3843   {                                              
3844     type = firsov;                               
3845   }                                              
3846   else                                           
3847   {                                              
3848     type = x_ray;                                
3849   }                                              
3850                                                  
3851   G4OpticalSurface* opticalsurface =             
3852     new G4OpticalSurface(name, model, finish,    
3853                                                  
3854   for(xercesc::DOMNode* iter = opticalsurface    
3855       iter != nullptr; iter = iter->getNextSi    
3856   {                                              
3857     if(iter->getNodeType() != xercesc::DOMNod    
3858     {                                            
3859       continue;                                  
3860     }                                            
3861                                                  
3862     const xercesc::DOMElement* const child =     
3863       dynamic_cast<xercesc::DOMElement*>(iter    
3864     if(child == nullptr)                         
3865     {                                            
3866       G4Exception("G4GDMLReadSolids::OpticalS    
3867                   FatalException, "No child f    
3868       return;                                    
3869     }                                            
3870     const G4String tag = Transcode(child->get    
3871                                                  
3872     if(tag == "property")                        
3873     {                                            
3874       PropertyRead(child, opticalsurface);       
3875     }                                            
3876   }                                              
3877 }                                                
3878                                                  
3879 // ------------------------------------------    
3880 void G4GDMLReadSolids::SolidsRead(               
3881   const xercesc::DOMElement* const solidsElem    
3882 {                                                
3883 #ifdef G4VERBOSE                                 
3884   G4cout << "G4GDML: Reading solids..." << G4    
3885 #endif                                           
3886   for(xercesc::DOMNode* iter = solidsElement-    
3887       iter                   = iter->getNextS    
3888   {                                              
3889     if(iter->getNodeType() != xercesc::DOMNod    
3890     {                                            
3891       continue;                                  
3892     }                                            
3893                                                  
3894     const xercesc::DOMElement* const child =     
3895       dynamic_cast<xercesc::DOMElement*>(iter    
3896     if(child == nullptr)                         
3897     {                                            
3898       G4Exception("G4GDMLReadSolids::SolidsRe    
3899                   FatalException, "No child f    
3900       return;                                    
3901     }                                            
3902     const G4String tag = Transcode(child->get    
3903     if(tag == "define")                          
3904     {                                            
3905       DefineRead(child);                         
3906     }                                            
3907     else if(tag == "box")                        
3908     {                                            
3909       BoxRead(child);                            
3910     }                                            
3911     else if(tag == "cone")                       
3912     {                                            
3913       ConeRead(child);                           
3914     }                                            
3915     else if(tag == "elcone")                     
3916     {                                            
3917       ElconeRead(child);                         
3918     }                                            
3919     else if(tag == "ellipsoid")                  
3920     {                                            
3921       EllipsoidRead(child);                      
3922     }                                            
3923     else if(tag == "eltube")                     
3924     {                                            
3925       EltubeRead(child);                         
3926     }                                            
3927     else if(tag == "xtru")                       
3928     {                                            
3929       XtruRead(child);                           
3930     }                                            
3931     else if(tag == "hype")                       
3932     {                                            
3933       HypeRead(child);                           
3934     }                                            
3935     else if(tag == "intersection")               
3936     {                                            
3937       BooleanRead(child, INTERSECTION);          
3938     }                                            
3939     else if(tag == "multiUnion")                 
3940     {                                            
3941       MultiUnionRead(child);                     
3942     }                                            
3943     else if(tag == "orb")                        
3944     {                                            
3945       OrbRead(child);                            
3946     }                                            
3947     else if(tag == "para")                       
3948     {                                            
3949       ParaRead(child);                           
3950     }                                            
3951     else if(tag == "paraboloid")                 
3952     {                                            
3953       ParaboloidRead(child);                     
3954     }                                            
3955     else if(tag == "polycone")                   
3956     {                                            
3957       PolyconeRead(child);                       
3958     }                                            
3959     else if(tag == "genericPolycone")            
3960     {                                            
3961       GenericPolyconeRead(child);                
3962     }                                            
3963     else if(tag == "polyhedra")                  
3964     {                                            
3965       PolyhedraRead(child);                      
3966     }                                            
3967     else if(tag == "genericPolyhedra")           
3968     {                                            
3969       GenericPolyhedraRead(child);               
3970     }                                            
3971     else if(tag == "reflectedSolid")             
3972     {                                            
3973       ReflectedSolidRead(child);                 
3974     }                                            
3975     else if(tag == "scaledSolid")                
3976     {                                            
3977       ScaledSolidRead(child);                    
3978     }                                            
3979     else if(tag == "sphere")                     
3980     {                                            
3981       SphereRead(child);                         
3982     }                                            
3983     else if(tag == "subtraction")                
3984     {                                            
3985       BooleanRead(child, SUBTRACTION);           
3986     }                                            
3987     else if(tag == "tessellated")                
3988     {                                            
3989       TessellatedRead(child);                    
3990     }                                            
3991     else if(tag == "tet")                        
3992     {                                            
3993       TetRead(child);                            
3994     }                                            
3995     else if(tag == "torus")                      
3996     {                                            
3997       TorusRead(child);                          
3998     }                                            
3999     else if(tag == "arb8")                       
4000     {                                            
4001       GenTrapRead(child);                        
4002     }                                            
4003     else if(tag == "trap")                       
4004     {                                            
4005       TrapRead(child);                           
4006     }                                            
4007     else if(tag == "trd")                        
4008     {                                            
4009       TrdRead(child);                            
4010     }                                            
4011     else if(tag == "tube")                       
4012     {                                            
4013       TubeRead(child);                           
4014     }                                            
4015     else if(tag == "cutTube")                    
4016     {                                            
4017       CutTubeRead(child);                        
4018     }                                            
4019     else if(tag == "twistedbox")                 
4020     {                                            
4021       TwistedboxRead(child);                     
4022     }                                            
4023     else if(tag == "twistedtrap")                
4024     {                                            
4025       TwistedtrapRead(child);                    
4026     }                                            
4027     else if(tag == "twistedtrd")                 
4028     {                                            
4029       TwistedtrdRead(child);                     
4030     }                                            
4031     else if(tag == "twistedtubs")                
4032     {                                            
4033       TwistedtubsRead(child);                    
4034     }                                            
4035     else if(tag == "union")                      
4036     {                                            
4037       BooleanRead(child, UNION);                 
4038     }                                            
4039     else if(tag == "opticalsurface")             
4040     {                                            
4041       OpticalSurfaceRead(child);                 
4042     }                                            
4043     else if(tag == "loop")                       
4044     {                                            
4045       LoopRead(child, &G4GDMLRead::SolidsRead    
4046     }                                            
4047     else                                         
4048     {                                            
4049       G4String error_msg = "Unknown tag in so    
4050       G4Exception("G4GDMLReadSolids::SolidsRe    
4051                   error_msg);                    
4052     }                                            
4053   }                                              
4054 }                                                
4055                                                  
4056 // ------------------------------------------    
4057 G4VSolid* G4GDMLReadSolids::GetSolid(const G4    
4058 {                                                
4059   G4VSolid* solidPtr = G4SolidStore::GetInsta    
4060                                     ->GetSoli    
4061                                                  
4062   if(solidPtr == nullptr)                        
4063   {                                              
4064     G4String error_msg = "Referenced solid '"    
4065     G4Exception("G4GDMLReadSolids::GetSolid()    
4066                 error_msg);                      
4067   }                                              
4068                                                  
4069   return solidPtr;                               
4070 }                                                
4071                                                  
4072 // ------------------------------------------    
4073 G4SurfaceProperty* G4GDMLReadSolids::GetSurfa    
4074   const G4String& ref) const                     
4075 {                                                
4076   const G4SurfacePropertyTable* surfaceList =    
4077     G4SurfaceProperty::GetSurfacePropertyTabl    
4078   const std::size_t surfaceCount = surfaceLis    
4079                                                  
4080   for(std::size_t i = 0; i < surfaceCount; ++    
4081   {                                              
4082     if((*surfaceList)[i]->GetName() == ref)      
4083     {                                            
4084       return (*surfaceList)[i];                  
4085     }                                            
4086   }                                              
4087                                                  
4088   G4String error_msg =                           
4089     "Referenced optical surface '" + ref + "'    
4090   G4Exception("G4GDMLReadSolids::GetSurfacePr    
4091               FatalException, error_msg);        
4092                                                  
4093   return nullptr;                                
4094 }                                                
4095