G4GDMLReadSolids.cc

Go to the documentation of this file.
00001 //
00002 // ********************************************************************
00003 // * License and Disclaimer                                           *
00004 // *                                                                  *
00005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
00006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
00007 // * conditions of the Geant4 Software License,  included in the file *
00008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
00009 // * include a list of copyright holders.                             *
00010 // *                                                                  *
00011 // * Neither the authors of this software system, nor their employing *
00012 // * institutes,nor the agencies providing financial support for this *
00013 // * work  make  any representation or  warranty, express or implied, *
00014 // * regarding  this  software system or assume any liability for its *
00015 // * use.  Please see the license in the file  LICENSE  and URL above *
00016 // * for the full disclaimer and the limitation of liability.         *
00017 // *                                                                  *
00018 // * This  code  implementation is the result of  the  scientific and *
00019 // * technical work of the GEANT4 collaboration.                      *
00020 // * By using,  copying,  modifying or  distributing the software (or *
00021 // * any work based  on the software)  you  agree  to acknowledge its *
00022 // * use  in  resulting  scientific  publications,  and indicate your *
00023 // * acceptance of all terms of the Geant4 Software license.          *
00024 // ********************************************************************
00025 //
00026 // $Id$
00027 //
00028 // class G4GDMLReadSolids Implementation
00029 //
00030 // Original author: Zoltan Torzsok, November 2007
00031 //
00032 // --------------------------------------------------------------------
00033 
00034 #include "G4GDMLReadSolids.hh"
00035 
00036 #include "G4Box.hh"
00037 #include "G4Cons.hh"
00038 #include "G4Ellipsoid.hh"
00039 #include "G4EllipticalCone.hh"
00040 #include "G4EllipticalTube.hh"
00041 #include "G4Hype.hh"
00042 #include "G4IntersectionSolid.hh"
00043 #include "G4Orb.hh"
00044 #include "G4Para.hh"
00045 #include "G4Paraboloid.hh"
00046 #include "G4Polycone.hh"
00047 #include "G4Polyhedra.hh"
00048 #include "G4QuadrangularFacet.hh"
00049 #include "G4ReflectedSolid.hh"
00050 #include "G4Sphere.hh"
00051 #include "G4SolidStore.hh"
00052 #include "G4SubtractionSolid.hh"
00053 #include "G4GenericTrap.hh"
00054 #include "G4TessellatedSolid.hh"
00055 #include "G4Tet.hh"
00056 #include "G4Torus.hh"
00057 #include "G4Transform3D.hh"
00058 #include "G4Trap.hh"
00059 #include "G4Trd.hh"
00060 #include "G4TriangularFacet.hh"
00061 #include "G4Tubs.hh"
00062 #include "G4CutTubs.hh"
00063 #include "G4TwistedBox.hh"
00064 #include "G4TwistedTrap.hh"
00065 #include "G4TwistedTrd.hh"
00066 #include "G4TwistedTubs.hh"
00067 #include "G4UnionSolid.hh"
00068 #include "G4OpticalSurface.hh"
00069 #include "G4SurfaceProperty.hh"
00070 
00071 G4GDMLReadSolids::G4GDMLReadSolids() : G4GDMLReadMaterials()
00072 {
00073 }
00074 
00075 G4GDMLReadSolids::~G4GDMLReadSolids()
00076 {
00077 }
00078 
00079 void G4GDMLReadSolids::
00080 BooleanRead(const xercesc::DOMElement* const booleanElement, const BooleanOp op)
00081 {
00082    G4String name;
00083    G4String first;
00084    G4String scnd;
00085    G4ThreeVector position(0.0,0.0,0.0);
00086    G4ThreeVector rotation(0.0,0.0,0.0);
00087    G4ThreeVector firstposition(0.0,0.0,0.0);
00088    G4ThreeVector firstrotation(0.0,0.0,0.0);
00089 
00090    const xercesc::DOMNamedNodeMap* const attributes
00091          = booleanElement->getAttributes();
00092    XMLSize_t attributeCount = attributes->getLength();
00093 
00094    for (XMLSize_t attribute_index=0;
00095         attribute_index<attributeCount; attribute_index++)
00096    {
00097       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00098 
00099       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00100         { continue; }
00101 
00102       const xercesc::DOMAttr* const attribute
00103             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00104       if (!attribute)
00105       {
00106         G4Exception("G4GDMLReadSolids::BooleanRead()",
00107                     "InvalidRead", FatalException, "No attribute found!");
00108         return;
00109       }
00110       const G4String attName = Transcode(attribute->getName());
00111       const G4String attValue = Transcode(attribute->getValue());
00112 
00113       if (attName=="name")  { name = GenerateName(attValue); }
00114    }
00115 
00116    for (xercesc::DOMNode* iter = booleanElement->getFirstChild();
00117         iter != 0;iter = iter->getNextSibling())
00118    {
00119       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE)  { continue; }
00120 
00121       const xercesc::DOMElement* const child
00122             = dynamic_cast<xercesc::DOMElement*>(iter);
00123       if (!child)
00124       {
00125         G4Exception("G4GDMLReadSolids::BooleanRead()",
00126                     "InvalidRead", FatalException, "No child found!");
00127         return;
00128       }
00129       const G4String tag = Transcode(child->getTagName());
00130 
00131       if (tag=="first") { first = RefRead(child); } else
00132       if (tag=="second") { scnd = RefRead(child); } else
00133       if (tag=="position") { VectorRead(child,position); } else
00134       if (tag=="rotation") { VectorRead(child,rotation); } else
00135       if (tag=="positionref")
00136         { position = GetPosition(GenerateName(RefRead(child))); } else
00137       if (tag=="rotationref")
00138         { rotation = GetRotation(GenerateName(RefRead(child))); } else
00139       if (tag=="firstposition") { VectorRead(child,firstposition); } else
00140       if (tag=="firstrotation") { VectorRead(child,firstrotation); } else
00141       if (tag=="firstpositionref")
00142         { firstposition = GetPosition(GenerateName(RefRead(child))); } else
00143       if (tag=="firstrotationref")
00144         { firstrotation = GetRotation(GenerateName(RefRead(child))); } 
00145       else
00146       {
00147         G4String error_msg = "Unknown tag in boolean solid: " + tag;
00148         G4Exception("G4GDMLReadSolids::BooleanRead()", "ReadError",
00149                     FatalException, error_msg);
00150       }
00151    }
00152 
00153    G4VSolid* firstSolid = GetSolid(GenerateName(first));
00154    G4VSolid* secondSolid = GetSolid(GenerateName(scnd));
00155 
00156    G4Transform3D transform(GetRotationMatrix(rotation),position);
00157 
00158    if (( (firstrotation.x()!=0.0) || (firstrotation.y()!=0.0)
00159                                   || (firstrotation.z()!=0.0))
00160     || ( (firstposition.x()!=0.0) || (firstposition.y()!=0.0)
00161                                   || (firstposition.z()!=0.0)))
00162    { 
00163       G4Transform3D firsttransform(GetRotationMatrix(firstrotation),
00164                                    firstposition);
00165       firstSolid = new G4DisplacedSolid(GenerateName("displaced_"+first),
00166                                         firstSolid, firsttransform);
00167    }
00168 
00169    if (op==UNION)
00170      { new G4UnionSolid(name,firstSolid,secondSolid,transform); } else
00171    if (op==SUBTRACTION)
00172      { new G4SubtractionSolid(name,firstSolid,secondSolid,transform); } else
00173    if (op==INTERSECTION)
00174      { new G4IntersectionSolid(name,firstSolid,secondSolid,transform); }
00175 }
00176 
00177 void G4GDMLReadSolids::BoxRead(const xercesc::DOMElement* const boxElement)
00178 {
00179    G4String name;
00180    G4double lunit = 1.0;
00181    G4double x = 0.0;
00182    G4double y = 0.0;
00183    G4double z = 0.0;
00184 
00185    const xercesc::DOMNamedNodeMap* const attributes
00186          = boxElement->getAttributes();
00187    XMLSize_t attributeCount = attributes->getLength();
00188 
00189    for (XMLSize_t attribute_index=0;
00190         attribute_index<attributeCount; attribute_index++)
00191    {
00192       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00193 
00194       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00195         { continue; }
00196 
00197       const xercesc::DOMAttr* const attribute
00198             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00199       if (!attribute)
00200       {
00201         G4Exception("G4GDMLReadSolids::BoxRead()",
00202                     "InvalidRead", FatalException, "No attribute found!");
00203         return;
00204       }
00205       const G4String attName = Transcode(attribute->getName());
00206       const G4String attValue = Transcode(attribute->getValue());
00207 
00208       if (attName=="name") { name = GenerateName(attValue); } else
00209       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00210       if (attName=="x") { x = eval.Evaluate(attValue); } else
00211       if (attName=="y") { y = eval.Evaluate(attValue); } else
00212       if (attName=="z") { z = eval.Evaluate(attValue); }
00213    }
00214 
00215    x *= 0.5*lunit;
00216    y *= 0.5*lunit;
00217    z *= 0.5*lunit;
00218 
00219    new G4Box(name,x,y,z);
00220 }
00221 
00222 void G4GDMLReadSolids::ConeRead(const xercesc::DOMElement* const coneElement)
00223 {
00224    G4String name;
00225    G4double lunit = 1.0;
00226    G4double aunit = 1.0;
00227    G4double rmin1 = 0.0;
00228    G4double rmax1 = 0.0;
00229    G4double rmin2 = 0.0;
00230    G4double rmax2 = 0.0;
00231    G4double z = 0.0;
00232    G4double startphi = 0.0;
00233    G4double deltaphi = 0.0;
00234 
00235    const xercesc::DOMNamedNodeMap* const attributes
00236          = coneElement->getAttributes();
00237    XMLSize_t attributeCount = attributes->getLength();
00238 
00239    for (XMLSize_t attribute_index=0;
00240         attribute_index<attributeCount; attribute_index++)
00241    {
00242       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00243 
00244       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00245         { continue; }
00246 
00247       const xercesc::DOMAttr* const attribute
00248             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00249       if (!attribute)
00250       {
00251         G4Exception("G4GDMLReadSolids::ConeRead()",
00252                     "InvalidRead", FatalException, "No attribute found!");
00253         return;
00254       }
00255       const G4String attName = Transcode(attribute->getName());
00256       const G4String attValue = Transcode(attribute->getValue());
00257 
00258       if (attName=="name") { name = GenerateName(attValue); } else
00259       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00260       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
00261       if (attName=="rmin1") { rmin1 = eval.Evaluate(attValue); } else
00262       if (attName=="rmax1") { rmax1 = eval.Evaluate(attValue); } else
00263       if (attName=="rmin2") { rmin2 = eval.Evaluate(attValue); } else
00264       if (attName=="rmax2") { rmax2 = eval.Evaluate(attValue); } else
00265       if (attName=="z") { z = eval.Evaluate(attValue); } else
00266       if (attName=="startphi") { startphi = eval.Evaluate(attValue); } else
00267       if (attName=="deltaphi") { deltaphi = eval.Evaluate(attValue); }
00268    }
00269 
00270    rmin1 *= lunit;
00271    rmax1 *= lunit;
00272    rmin2 *= lunit;
00273    rmax2 *= lunit;
00274    z *= 0.5*lunit;
00275    startphi *= aunit;
00276    deltaphi *= aunit;
00277 
00278    new G4Cons(name,rmin1,rmax1,rmin2,rmax2,z,startphi,deltaphi);
00279 }
00280 
00281 void G4GDMLReadSolids::
00282 ElconeRead(const xercesc::DOMElement* const elconeElement)
00283 {
00284    G4String name;
00285    G4double lunit = 1.0;
00286    G4double dx = 0.0;
00287    G4double dy = 0.0;
00288    G4double zmax = 0.0;
00289    G4double zcut = 0.0;
00290 
00291    const xercesc::DOMNamedNodeMap* const attributes
00292          = elconeElement->getAttributes();
00293    XMLSize_t attributeCount = attributes->getLength();
00294 
00295    for (XMLSize_t attribute_index=0;
00296         attribute_index<attributeCount; attribute_index++)
00297    {
00298       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00299 
00300       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00301         { continue; }
00302 
00303       const xercesc::DOMAttr* const attribute
00304             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00305       if (!attribute)
00306       {
00307         G4Exception("G4GDMLReadSolids::ElconeRead()",
00308                     "InvalidRead", FatalException, "No attribute found!");
00309         return;
00310       }
00311       const G4String attName = Transcode(attribute->getName());
00312       const G4String attValue = Transcode(attribute->getValue());
00313 
00314       if (attName=="name") { name = GenerateName(attValue); } else
00315       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00316       if (attName=="dx") { dx = eval.Evaluate(attValue); } else
00317       if (attName=="dy") { dy = eval.Evaluate(attValue); } else
00318       if (attName=="zmax") { zmax = eval.Evaluate(attValue); } else
00319       if (attName=="zcut") { zcut = eval.Evaluate(attValue); }
00320    }
00321 
00322    zmax *= lunit;
00323    zcut *= lunit;
00324 
00325    new G4EllipticalCone(name,dx,dy,zmax,zcut);
00326 }
00327 
00328 void G4GDMLReadSolids::
00329 EllipsoidRead(const xercesc::DOMElement* const ellipsoidElement)
00330 {
00331    G4String name;
00332    G4double lunit = 1.0;
00333    G4double ax = 0.0;
00334    G4double by = 0.0;
00335    G4double cz = 0.0;
00336    G4double zcut1 = 0.0;
00337    G4double zcut2 = 0.0; 
00338 
00339    const xercesc::DOMNamedNodeMap* const attributes
00340          = ellipsoidElement->getAttributes();
00341    XMLSize_t attributeCount = attributes->getLength();
00342 
00343    for (XMLSize_t attribute_index=0;
00344         attribute_index<attributeCount; attribute_index++)
00345    {
00346       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00347 
00348       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00349         { continue; }
00350 
00351       const xercesc::DOMAttr* const attribute
00352             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00353       if (!attribute)
00354       {
00355         G4Exception("G4GDMLReadSolids::EllipsoidRead()",
00356                     "InvalidRead", FatalException, "No attribute found!");
00357         return;
00358       }
00359       const G4String attName = Transcode(attribute->getName());
00360       const G4String attValue = Transcode(attribute->getValue());
00361 
00362       if (attName=="name") { name  = GenerateName(attValue); } else
00363       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00364       if (attName=="ax") { ax = eval.Evaluate(attValue); } else
00365       if (attName=="by") { by = eval.Evaluate(attValue); } else
00366       if (attName=="cz") { cz = eval.Evaluate(attValue); } else
00367       if (attName=="zcut1") { zcut1 = eval.Evaluate(attValue); } else
00368       if (attName=="zcut2") { zcut2 = eval.Evaluate(attValue); }
00369    }
00370 
00371    ax *= lunit;
00372    by *= lunit;
00373    cz *= lunit;
00374    zcut1 *= lunit;
00375    zcut2 *= lunit; 
00376 
00377    new G4Ellipsoid(name,ax,by,cz,zcut1,zcut2);
00378 }
00379 
00380 void G4GDMLReadSolids::
00381 EltubeRead(const xercesc::DOMElement* const eltubeElement)
00382 {
00383    G4String name;
00384    G4double lunit = 1.0;
00385    G4double dx = 0.0;
00386    G4double dy = 0.0;
00387    G4double dz = 0.0;
00388 
00389    const xercesc::DOMNamedNodeMap* const attributes
00390          = eltubeElement->getAttributes();
00391    XMLSize_t attributeCount = attributes->getLength();
00392 
00393    for (XMLSize_t attribute_index=0;
00394         attribute_index<attributeCount; attribute_index++)
00395    {
00396       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00397 
00398       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00399         { continue; }
00400 
00401       const xercesc::DOMAttr* const attribute
00402             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00403       if (!attribute)
00404       {
00405         G4Exception("G4GDMLReadSolids::EltubeRead()",
00406                     "InvalidRead", FatalException, "No attribute found!");
00407         return;
00408       }
00409       const G4String attName = Transcode(attribute->getName());
00410       const G4String attValue = Transcode(attribute->getValue());
00411 
00412       if (attName=="name") { name = GenerateName(attValue); } else
00413       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00414       if (attName=="dx") { dx = eval.Evaluate(attValue); } else
00415       if (attName=="dy") { dy = eval.Evaluate(attValue); } else
00416       if (attName=="dz") { dz = eval.Evaluate(attValue); }
00417    }
00418 
00419    dx *= lunit;
00420    dy *= lunit;
00421    dz *= lunit;
00422 
00423    new G4EllipticalTube(name,dx,dy,dz);
00424 }
00425 
00426 void G4GDMLReadSolids::XtruRead(const xercesc::DOMElement* const xtruElement)
00427 {
00428    G4String name;
00429    G4double lunit = 1.0;
00430 
00431    const xercesc::DOMNamedNodeMap* const attributes
00432          = xtruElement->getAttributes();
00433    XMLSize_t attributeCount = attributes->getLength();
00434 
00435    for (XMLSize_t attribute_index=0;
00436         attribute_index<attributeCount; attribute_index++)
00437    {
00438       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00439 
00440       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00441         { continue; } 
00442 
00443       const xercesc::DOMAttr* const attribute
00444             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00445       if (!attribute)
00446       {
00447         G4Exception("G4GDMLReadSolids::XtruRead()",
00448                     "InvalidRead", FatalException, "No attribute found!");
00449         return;
00450       }
00451       const G4String attName = Transcode(attribute->getName());
00452       const G4String attValue = Transcode(attribute->getValue());
00453 
00454       if (attName=="name") { name = GenerateName(attValue); } else
00455       if (attName=="lunit") { lunit = eval.Evaluate(attValue); }
00456    }
00457 
00458    std::vector<G4TwoVector> twoDimVertexList;
00459    std::vector<G4ExtrudedSolid::ZSection> sectionList;
00460 
00461    for (xercesc::DOMNode* iter = xtruElement->getFirstChild();
00462         iter != 0; iter = iter->getNextSibling())
00463    {
00464       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
00465 
00466       const xercesc::DOMElement* const child
00467             = dynamic_cast<xercesc::DOMElement*>(iter);
00468       if (!child)
00469       {
00470         G4Exception("G4GDMLReadSolids::XtruRead()",
00471                     "InvalidRead", FatalException, "No child found!");
00472         return;
00473       }
00474       const G4String tag = Transcode(child->getTagName());
00475 
00476       if (tag=="twoDimVertex")
00477         { twoDimVertexList.push_back(TwoDimVertexRead(child,lunit)); } else
00478       if (tag=="section")
00479         { sectionList.push_back(SectionRead(child,lunit)); }
00480    }
00481 
00482    new G4ExtrudedSolid(name,twoDimVertexList,sectionList);
00483 }
00484 
00485 void G4GDMLReadSolids::HypeRead(const xercesc::DOMElement* const hypeElement)
00486 {
00487    G4String name;
00488    G4double lunit = 1.0;
00489    G4double aunit = 1.0;
00490    G4double rmin = 0.0;
00491    G4double rmax = 0.0;
00492    G4double inst = 0.0;
00493    G4double outst = 0.0;
00494    G4double z = 0.0;
00495 
00496    const xercesc::DOMNamedNodeMap* const attributes
00497          = hypeElement->getAttributes();
00498    XMLSize_t attributeCount = attributes->getLength();
00499 
00500    for (XMLSize_t attribute_index=0;
00501         attribute_index<attributeCount; attribute_index++)
00502    {
00503       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00504 
00505       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00506         { continue; }
00507 
00508       const xercesc::DOMAttr* const attribute
00509             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00510       if (!attribute)
00511       {
00512         G4Exception("G4GDMLReadSolids::HypeRead()",
00513                     "InvalidRead", FatalException, "No attribute found!");
00514         return;
00515       }
00516       const G4String attName = Transcode(attribute->getName());
00517       const G4String attValue = Transcode(attribute->getValue());
00518 
00519       if (attName=="name") { name = GenerateName(attValue); } else
00520       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00521       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
00522       if (attName=="rmin") { rmin = eval.Evaluate(attValue); } else
00523       if (attName=="rmax") { rmax = eval.Evaluate(attValue); } else
00524       if (attName=="inst") { inst = eval.Evaluate(attValue); } else
00525       if (attName=="outst") { outst = eval.Evaluate(attValue); } else
00526       if (attName=="z") { z = eval.Evaluate(attValue); }
00527    }
00528 
00529    rmin *= lunit;
00530    rmax *= lunit;
00531    inst *= aunit;
00532    outst *= aunit;
00533    z *= 0.5*lunit;
00534 
00535    new G4Hype(name,rmin,rmax,inst,outst,z);
00536 }
00537 
00538 void G4GDMLReadSolids::OrbRead(const xercesc::DOMElement* const orbElement)
00539 {
00540    G4String name;
00541    G4double lunit = 1.0;
00542    G4double r = 0.0;
00543 
00544    const xercesc::DOMNamedNodeMap* const attributes
00545          = orbElement->getAttributes();
00546    XMLSize_t attributeCount = attributes->getLength();
00547 
00548    for (XMLSize_t attribute_index=0;
00549         attribute_index<attributeCount; attribute_index++)
00550    {
00551       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00552 
00553       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00554         { continue; }
00555 
00556       const xercesc::DOMAttr* const attribute
00557             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00558       if (!attribute)
00559       {
00560         G4Exception("G4GDMLReadSolids::OrbRead()",
00561                     "InvalidRead", FatalException, "No attribute found!");
00562         return;
00563       }
00564       const G4String attName = Transcode(attribute->getName());
00565       const G4String attValue = Transcode(attribute->getValue());
00566 
00567       if (attName=="name") { name = GenerateName(attValue); } else
00568       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00569       if (attName=="r") { r = eval.Evaluate(attValue); }
00570    }
00571 
00572    r *= lunit;
00573 
00574    new G4Orb(name,r);
00575 }
00576 
00577 void G4GDMLReadSolids::ParaRead(const xercesc::DOMElement* const paraElement)
00578 {
00579    G4String name;
00580    G4double lunit = 1.0;
00581    G4double aunit = 1.0;
00582    G4double x = 0.0;
00583    G4double y = 0.0;
00584    G4double z = 0.0;
00585    G4double alpha = 0.0;
00586    G4double theta = 0.0;
00587    G4double phi = 0.0;
00588 
00589    const xercesc::DOMNamedNodeMap* const attributes
00590          = paraElement->getAttributes();
00591    XMLSize_t attributeCount = attributes->getLength();
00592 
00593    for (XMLSize_t attribute_index=0;
00594         attribute_index<attributeCount; attribute_index++)
00595    {
00596       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00597 
00598       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00599         { continue; }
00600 
00601       const xercesc::DOMAttr* const attribute
00602             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00603       if (!attribute)
00604       {
00605         G4Exception("G4GDMLReadSolids::ParaRead()",
00606                     "InvalidRead", FatalException, "No attribute found!");
00607         return;
00608       }
00609       const G4String attName = Transcode(attribute->getName());
00610       const G4String attValue = Transcode(attribute->getValue());
00611 
00612       if (attName=="name") { name = GenerateName(attValue); } else
00613       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00614       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
00615       if (attName=="x") { x = eval.Evaluate(attValue); } else
00616       if (attName=="y") { y = eval.Evaluate(attValue); } else
00617       if (attName=="z") { z = eval.Evaluate(attValue); } else
00618       if (attName=="alpha") { alpha = eval.Evaluate(attValue); } else
00619       if (attName=="theta") { theta = eval.Evaluate(attValue); } else
00620       if (attName=="phi") { phi = eval.Evaluate(attValue); }
00621    }
00622 
00623    x *= 0.5*lunit;
00624    y *= 0.5*lunit;
00625    z *= 0.5*lunit;
00626    alpha *= aunit;
00627    theta *= aunit;
00628    phi *= aunit;
00629 
00630    new G4Para(name,x,y,z,alpha,theta,phi);
00631 }
00632 
00633 void G4GDMLReadSolids::
00634 ParaboloidRead(const xercesc::DOMElement* const paraElement)
00635 {
00636    G4String name;
00637    G4double lunit = 1.0;
00638    G4double rlo = 0.0;
00639    G4double rhi = 0.0;
00640    G4double dz = 0.0;
00641   
00642    const xercesc::DOMNamedNodeMap* const attributes
00643          = paraElement->getAttributes();
00644    XMLSize_t attributeCount = attributes->getLength();
00645 
00646    for (XMLSize_t attribute_index=0;
00647         attribute_index<attributeCount; attribute_index++)
00648    {
00649       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00650 
00651       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00652         { continue; }
00653 
00654       const xercesc::DOMAttr* const attribute
00655             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00656       if (!attribute)
00657       {
00658         G4Exception("G4GDMLReadSolids::ParaboloidRead()",
00659                     "InvalidRead", FatalException, "No attribute found!");
00660         return;
00661       }
00662       const G4String attName = Transcode(attribute->getName());
00663       const G4String attValue = Transcode(attribute->getValue());
00664 
00665       if (attName=="name")  { name = GenerateName(attValue); } else
00666       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00667       if (attName=="rlo")   { rlo =  eval.Evaluate(attValue); } else
00668       if (attName=="rhi")   { rhi = eval.Evaluate(attValue); } else
00669       if (attName=="dz")    { dz = eval.Evaluate(attValue); } 
00670    }     
00671 
00672    rlo *= 1.*lunit;
00673    rhi *= 1.*lunit;
00674    dz *= 1.*lunit;
00675   
00676    new G4Paraboloid(name,dz,rlo,rhi);
00677 }
00678 
00679 void G4GDMLReadSolids::
00680 PolyconeRead(const xercesc::DOMElement* const polyconeElement) 
00681 {
00682    G4String name;
00683    G4double lunit = 1.0;
00684    G4double aunit = 1.0;
00685    G4double startphi = 0.0;
00686    G4double deltaphi = 0.0;
00687 
00688    const xercesc::DOMNamedNodeMap* const attributes
00689          = polyconeElement->getAttributes();
00690    XMLSize_t attributeCount = attributes->getLength();
00691 
00692    for (XMLSize_t attribute_index=0;
00693         attribute_index<attributeCount; attribute_index++)
00694    {
00695       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00696 
00697       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00698         { continue; }
00699 
00700       const xercesc::DOMAttr* const attribute
00701             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00702       if (!attribute)
00703       {
00704         G4Exception("G4GDMLReadSolids::PolyconeRead()",
00705                     "InvalidRead", FatalException, "No attribute found!");
00706         return;
00707       }
00708       const G4String attName = Transcode(attribute->getName());
00709       const G4String attValue = Transcode(attribute->getValue());
00710 
00711       if (attName=="name") { name = GenerateName(attValue); } else
00712       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00713       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
00714       if (attName=="startphi") { startphi = eval.Evaluate(attValue); }else
00715       if (attName=="deltaphi") { deltaphi = eval.Evaluate(attValue); }
00716    }
00717 
00718    startphi *= aunit;
00719    deltaphi *= aunit;
00720 
00721    std::vector<zplaneType> zplaneList;
00722 
00723    for (xercesc::DOMNode* iter = polyconeElement->getFirstChild();
00724         iter != 0; iter = iter->getNextSibling())
00725    {
00726       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
00727 
00728       const xercesc::DOMElement* const child
00729             = dynamic_cast<xercesc::DOMElement*>(iter);
00730       if (!child)
00731       {
00732         G4Exception("G4GDMLReadSolids::PolyconeRead()",
00733                     "InvalidRead", FatalException, "No child found!");
00734         return;
00735       }
00736       const G4String tag = Transcode(child->getTagName());
00737 
00738       if (tag=="zplane") { zplaneList.push_back(ZplaneRead(child)); }
00739    }
00740 
00741    G4int numZPlanes = zplaneList.size();
00742 
00743    G4double* rmin_array = new G4double[numZPlanes];
00744    G4double* rmax_array = new G4double[numZPlanes];
00745    G4double* z_array    = new G4double[numZPlanes];
00746 
00747    for (G4int i=0; i<numZPlanes; i++)
00748    { 
00749       rmin_array[i] = zplaneList[i].rmin*lunit;
00750       rmax_array[i] = zplaneList[i].rmax*lunit;
00751       z_array[i]    = zplaneList[i].z*lunit;
00752    }
00753 
00754    new G4Polycone(name,startphi,deltaphi,numZPlanes,
00755                   z_array,rmin_array,rmax_array);
00756 }
00757 
00758 void G4GDMLReadSolids::
00759 PolyhedraRead(const xercesc::DOMElement* const polyhedraElement)
00760 {
00761    G4String name;
00762    G4double lunit = 1.0;
00763    G4double aunit = 1.0;
00764    G4double startphi = 0.0;
00765    G4double deltaphi = 0.0;
00766    G4int numsides = 0;
00767 
00768    const xercesc::DOMNamedNodeMap* const attributes
00769          = polyhedraElement->getAttributes();
00770    XMLSize_t attributeCount = attributes->getLength();
00771 
00772    for (XMLSize_t attribute_index=0;
00773         attribute_index<attributeCount; attribute_index++)
00774    {
00775       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00776 
00777       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00778         { continue; }
00779 
00780       const xercesc::DOMAttr* const attribute
00781             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00782       if (!attribute)
00783       {
00784         G4Exception("G4GDMLReadSolids::PolyhedraRead()",
00785                     "InvalidRead", FatalException, "No attribute found!");
00786         return;
00787       }
00788       const G4String attName = Transcode(attribute->getName());
00789       const G4String attValue = Transcode(attribute->getValue());
00790 
00791       if (attName=="name") { name = GenerateName(attValue); } else
00792       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00793       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
00794       if (attName=="startphi") { startphi = eval.Evaluate(attValue); } else
00795       if (attName=="deltaphi") { deltaphi = eval.Evaluate(attValue); } else
00796       if (attName=="numsides") { numsides = eval.EvaluateInteger(attValue); }
00797    }
00798 
00799    startphi *= aunit;
00800    deltaphi *= aunit;
00801 
00802    std::vector<zplaneType> zplaneList;
00803 
00804    for (xercesc::DOMNode* iter = polyhedraElement->getFirstChild();
00805         iter != 0; iter = iter->getNextSibling())
00806    {
00807       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE)  { continue; }
00808 
00809       const xercesc::DOMElement* const child
00810             = dynamic_cast<xercesc::DOMElement*>(iter);
00811       if (!child)
00812       {
00813         G4Exception("G4GDMLReadSolids::PolyhedraRead()",
00814                     "InvalidRead", FatalException, "No child found!");
00815         return;
00816       }
00817       const G4String tag = Transcode(child->getTagName());
00818 
00819       if (tag=="zplane") { zplaneList.push_back(ZplaneRead(child)); }
00820    }
00821 
00822    G4int numZPlanes = zplaneList.size();
00823 
00824    G4double* rmin_array = new G4double[numZPlanes];
00825    G4double* rmax_array = new G4double[numZPlanes];
00826    G4double* z_array = new G4double[numZPlanes];
00827 
00828    for (G4int i=0; i<numZPlanes; i++)
00829    { 
00830       rmin_array[i] = zplaneList[i].rmin*lunit;
00831       rmax_array[i] = zplaneList[i].rmax*lunit;
00832       z_array[i] = zplaneList[i].z*lunit;
00833    }
00834 
00835    new G4Polyhedra(name,startphi,deltaphi,numsides,numZPlanes,
00836                    z_array,rmin_array,rmax_array);
00837 
00838 }
00839 
00840 G4QuadrangularFacet* G4GDMLReadSolids::
00841 QuadrangularRead(const xercesc::DOMElement* const quadrangularElement)
00842 {
00843    G4ThreeVector vertex1;
00844    G4ThreeVector vertex2;
00845    G4ThreeVector vertex3;
00846    G4ThreeVector vertex4;
00847    G4FacetVertexType type = ABSOLUTE;
00848    G4double lunit = 1.0;
00849 
00850    const xercesc::DOMNamedNodeMap* const attributes
00851          = quadrangularElement->getAttributes();
00852    XMLSize_t attributeCount = attributes->getLength();
00853 
00854    for (XMLSize_t attribute_index=0;
00855         attribute_index<attributeCount; attribute_index++)
00856    {
00857       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00858 
00859       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00860         { continue; }
00861 
00862       const xercesc::DOMAttr* const attribute
00863             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00864       if (!attribute)
00865       {
00866         G4Exception("G4GDMLReadSolids::QuadrangularRead()",
00867                     "InvalidRead", FatalException, "No attribute found!");
00868         return 0;
00869       }
00870       const G4String attName = Transcode(attribute->getName());
00871       const G4String attValue = Transcode(attribute->getValue());
00872 
00873       if (attName=="vertex1")
00874         { vertex1 = GetPosition(GenerateName(attValue)); } else
00875       if (attName=="vertex2")
00876         { vertex2 = GetPosition(GenerateName(attValue)); } else
00877       if (attName=="vertex3")
00878         { vertex3 = GetPosition(GenerateName(attValue)); } else
00879       if (attName=="vertex4")
00880         { vertex4 = GetPosition(GenerateName(attValue)); } else
00881       if (attName=="lunit")
00882         { lunit = eval.Evaluate(attValue); } else
00883       if (attName=="type")
00884         { if (attValue=="RELATIVE") { type = RELATIVE; } }
00885    }
00886 
00887    return new G4QuadrangularFacet(vertex1*lunit,vertex2*lunit,
00888                                   vertex3*lunit,vertex4*lunit,type);
00889 }
00890 
00891 void G4GDMLReadSolids::
00892 ReflectedSolidRead(const xercesc::DOMElement* const reflectedSolidElement)
00893 {
00894    G4String name;
00895    G4double lunit = 1.0;
00896    G4double aunit = 1.0;
00897    G4String solid;
00898    G4ThreeVector scale(1.0,1.0,1.0);
00899    G4ThreeVector rotation;
00900    G4ThreeVector position;
00901 
00902    const xercesc::DOMNamedNodeMap* const attributes
00903          = reflectedSolidElement->getAttributes();
00904    XMLSize_t attributeCount = attributes->getLength();
00905 
00906    for (XMLSize_t attribute_index=0;
00907         attribute_index<attributeCount; attribute_index++)
00908    {
00909       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00910 
00911       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00912         { continue; }
00913 
00914       const xercesc::DOMAttr* const attribute
00915             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00916       if (!attribute)
00917       {
00918         G4Exception("G4GDMLReadSolids::ReflectedSolidRead()",
00919                     "InvalidRead", FatalException, "No attribute found!");
00920         return;
00921       }
00922       const G4String attName = Transcode(attribute->getName());
00923       const G4String attValue = Transcode(attribute->getValue());
00924 
00925       if (attName=="name") { name = GenerateName(attValue); } else
00926       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
00927       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
00928       if (attName=="solid") { solid = GenerateName(attValue); } else
00929       if (attName=="sx") { scale.setX(eval.Evaluate(attValue)); } else
00930       if (attName=="sy") { scale.setY(eval.Evaluate(attValue)); } else
00931       if (attName=="sz") { scale.setZ(eval.Evaluate(attValue)); } else
00932       if (attName=="rx") { rotation.setX(eval.Evaluate(attValue)); } else
00933       if (attName=="ry") { rotation.setY(eval.Evaluate(attValue)); } else
00934       if (attName=="rz") { rotation.setZ(eval.Evaluate(attValue)); } else
00935       if (attName=="dx") { position.setX(eval.Evaluate(attValue)); } else
00936       if (attName=="dy") { position.setY(eval.Evaluate(attValue)); } else
00937       if (attName=="dz") { position.setZ(eval.Evaluate(attValue)); }
00938    }
00939 
00940    rotation *= aunit;
00941    position *= lunit;
00942 
00943    G4Transform3D transform(GetRotationMatrix(rotation),position);
00944    transform = transform*G4Scale3D(scale.x(),scale.y(),scale.z());
00945           
00946    new G4ReflectedSolid(name,GetSolid(solid),transform);
00947 }
00948 
00949 G4ExtrudedSolid::ZSection G4GDMLReadSolids::
00950 SectionRead(const xercesc::DOMElement* const sectionElement,G4double lunit) 
00951 {
00952    G4double zPosition = 0.0;
00953    G4TwoVector Offset;
00954    G4double scalingFactor = 1.0;
00955 
00956    const xercesc::DOMNamedNodeMap* const attributes
00957          = sectionElement->getAttributes();
00958    XMLSize_t attributeCount = attributes->getLength();
00959 
00960    for (XMLSize_t attribute_index=0;
00961         attribute_index<attributeCount; attribute_index++)
00962    {
00963       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
00964 
00965       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00966         { continue; }
00967 
00968       const xercesc::DOMAttr* const attribute
00969             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
00970       if (!attribute)
00971       {
00972         G4Exception("G4GDMLReadSolids::SectionRead()",
00973                     "InvalidRead", FatalException, "No attribute found!");
00974         return G4ExtrudedSolid::ZSection(zPosition,Offset,scalingFactor);
00975       }
00976       const G4String attName = Transcode(attribute->getName());
00977       const G4String attValue = Transcode(attribute->getValue());
00978 
00979       if (attName=="zPosition")
00980         { zPosition = eval.Evaluate(attValue)*lunit; } else
00981       if (attName=="xOffset")
00982         { Offset.setX(eval.Evaluate(attValue)*lunit); } else
00983       if (attName=="yOffset")
00984         { Offset.setY(eval.Evaluate(attValue)*lunit); } else
00985       if (attName=="scalingFactor")
00986         { scalingFactor = eval.Evaluate(attValue); }
00987    }
00988 
00989    return G4ExtrudedSolid::ZSection(zPosition,Offset,scalingFactor);
00990 }
00991 
00992 void G4GDMLReadSolids::
00993 SphereRead(const xercesc::DOMElement* const sphereElement)
00994 {
00995    G4String name;
00996    G4double lunit = 1.0;
00997    G4double aunit = 1.0;
00998    G4double rmin = 0.0;
00999    G4double rmax = 0.0;
01000    G4double startphi = 0.0;
01001    G4double deltaphi = 0.0;
01002    G4double starttheta = 0.0;
01003    G4double deltatheta = 0.0;
01004 
01005    const xercesc::DOMNamedNodeMap* const attributes
01006          = sphereElement->getAttributes();
01007    XMLSize_t attributeCount = attributes->getLength();
01008 
01009    for (XMLSize_t attribute_index=0;
01010         attribute_index<attributeCount; attribute_index++)
01011    {
01012       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01013 
01014       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01015         { continue; }
01016 
01017       const xercesc::DOMAttr* const attribute
01018             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01019       if (!attribute)
01020       {
01021         G4Exception("G4GDMLReadSolids::SphereRead()",
01022                     "InvalidRead", FatalException, "No attribute found!");
01023         return;
01024       }
01025       const G4String attName = Transcode(attribute->getName());
01026       const G4String attValue = Transcode(attribute->getValue());
01027 
01028       if (attName=="name") { name = GenerateName(attValue); } else
01029       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01030       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
01031       if (attName=="rmin") { rmin = eval.Evaluate(attValue); } else
01032       if (attName=="rmax") { rmax = eval.Evaluate(attValue); } else
01033       if (attName=="startphi") { startphi = eval.Evaluate(attValue); } else
01034       if (attName=="deltaphi") { deltaphi = eval.Evaluate(attValue); } else
01035       if (attName=="starttheta") { starttheta = eval.Evaluate(attValue); } else
01036       if (attName=="deltatheta") { deltatheta = eval.Evaluate(attValue); }
01037    }
01038 
01039    rmin *= lunit;
01040    rmax *= lunit;
01041    startphi *= aunit;
01042    deltaphi *= aunit;
01043    starttheta *= aunit;
01044    deltatheta *= aunit;
01045 
01046    new G4Sphere(name,rmin,rmax,startphi,deltaphi,starttheta,deltatheta);
01047 }
01048 
01049 void G4GDMLReadSolids::
01050 TessellatedRead(const xercesc::DOMElement* const tessellatedElement)
01051 {
01052    G4String name;
01053 
01054    const xercesc::DOMNamedNodeMap* const attributes
01055          = tessellatedElement->getAttributes();
01056    XMLSize_t attributeCount = attributes->getLength();
01057 
01058    for (XMLSize_t attribute_index=0;
01059         attribute_index<attributeCount; attribute_index++)
01060    {
01061       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01062 
01063       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01064         { continue; }
01065 
01066       const xercesc::DOMAttr* const attribute
01067             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01068       if (!attribute)
01069       {
01070         G4Exception("G4GDMLReadSolids::TessellatedRead()",
01071                     "InvalidRead", FatalException, "No attribute found!");
01072         return;
01073       }
01074       const G4String attName = Transcode(attribute->getName());
01075       const G4String attValue = Transcode(attribute->getValue());
01076 
01077       if (attName=="name")  { name = GenerateName(attValue); }
01078    }
01079    
01080    G4TessellatedSolid *tessellated = new G4TessellatedSolid(name);
01081 
01082    for (xercesc::DOMNode* iter = tessellatedElement->getFirstChild();
01083         iter != 0; iter = iter->getNextSibling())
01084    {
01085       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
01086 
01087       const xercesc::DOMElement* const child
01088             = dynamic_cast<xercesc::DOMElement*>(iter);
01089       if (!child)
01090       {
01091         G4Exception("G4GDMLReadSolids::TessellatedRead()",
01092                     "InvalidRead", FatalException, "No child found!");
01093         return;
01094       }
01095       const G4String tag = Transcode(child->getTagName());
01096 
01097       if (tag=="triangular")
01098         { tessellated->AddFacet(TriangularRead(child)); } else
01099       if (tag=="quadrangular")
01100         { tessellated->AddFacet(QuadrangularRead(child)); }
01101    }
01102 
01103    tessellated->SetSolidClosed(true);
01104 }
01105 
01106 void G4GDMLReadSolids::TetRead(const xercesc::DOMElement* const tetElement)
01107 {
01108    G4String name;
01109    G4ThreeVector vertex1;
01110    G4ThreeVector vertex2;
01111    G4ThreeVector vertex3;
01112    G4ThreeVector vertex4;
01113    G4double lunit = 1.0;
01114    
01115    const xercesc::DOMNamedNodeMap* const attributes
01116          = tetElement->getAttributes();
01117    XMLSize_t attributeCount = attributes->getLength();
01118 
01119    for (XMLSize_t attribute_index=0;
01120         attribute_index<attributeCount;attribute_index++)
01121    {
01122       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01123 
01124       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01125         { continue; }
01126 
01127       const xercesc::DOMAttr* const attribute
01128             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01129       if (!attribute)
01130       {
01131         G4Exception("G4GDMLReadSolids::TetRead()",
01132                     "InvalidRead", FatalException, "No attribute found!");
01133         return;
01134       }
01135       const G4String attName = Transcode(attribute->getName());
01136       const G4String attValue = Transcode(attribute->getValue());
01137 
01138       if (attName=="name")
01139         { name = GenerateName(attValue); } else
01140       if (attName=="lunit")
01141         { lunit = eval.Evaluate(attValue); } else
01142       if (attName=="vertex1")
01143         { vertex1 = GetPosition(GenerateName(attValue)); } else
01144       if (attName=="vertex2")
01145         { vertex2 = GetPosition(GenerateName(attValue)); } else
01146       if (attName=="vertex3")
01147         { vertex3 = GetPosition(GenerateName(attValue)); } else
01148       if (attName=="vertex4")
01149         { vertex4 = GetPosition(GenerateName(attValue)); }
01150    }
01151 
01152    new G4Tet(name,vertex1*lunit,vertex2*lunit,vertex3*lunit,vertex4*lunit);
01153 }
01154 
01155 void G4GDMLReadSolids::TorusRead(const xercesc::DOMElement* const torusElement)
01156 {
01157    G4String name;
01158    G4double lunit = 1.0;
01159    G4double aunit = 1.0;
01160    G4double rmin = 0.0;
01161    G4double rmax = 0.0;
01162    G4double rtor = 0.0;
01163    G4double startphi = 0.0;
01164    G4double deltaphi = 0.0;
01165 
01166    const xercesc::DOMNamedNodeMap* const attributes
01167          = torusElement->getAttributes();
01168    XMLSize_t attributeCount = attributes->getLength();
01169 
01170    for (XMLSize_t attribute_index=0;
01171         attribute_index<attributeCount; attribute_index++)
01172    {
01173       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01174 
01175       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01176         { continue; }
01177 
01178       const xercesc::DOMAttr* const attribute
01179             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01180       if (!attribute)
01181       {
01182         G4Exception("G4GDMLReadSolids::TorusRead()",
01183                     "InvalidRead", FatalException, "No attribute found!");
01184         return;
01185       }
01186       const G4String attName = Transcode(attribute->getName());
01187       const G4String attValue = Transcode(attribute->getValue());
01188 
01189       if (attName=="name") { name = GenerateName(attValue); } else
01190       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01191       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
01192       if (attName=="rmin") { rmin = eval.Evaluate(attValue); } else
01193       if (attName=="rmax") { rmax = eval.Evaluate(attValue); } else
01194       if (attName=="rtor") { rtor = eval.Evaluate(attValue); } else
01195       if (attName=="startphi") { startphi = eval.Evaluate(attValue); } else
01196       if (attName=="deltaphi") { deltaphi = eval.Evaluate(attValue); }
01197    }
01198 
01199    rmin *= lunit;
01200    rmax *= lunit;
01201    rtor *= lunit;
01202    startphi *= aunit;
01203    deltaphi *= aunit;
01204 
01205    new G4Torus(name,rmin,rmax,rtor,startphi,deltaphi);
01206 }
01207 
01208 void G4GDMLReadSolids::
01209 GenTrapRead(const xercesc::DOMElement* const gtrapElement)
01210 {
01211    G4String name;
01212    G4double lunit = 1.0;
01213    G4double dz =0.0;
01214    G4double v1x=0.0, v1y=0.0, v2x=0.0, v2y=0.0, v3x=0.0, v3y=0.0,
01215             v4x=0.0, v4y=0.0, v5x=0.0, v5y=0.0, v6x=0.0, v6y=0.0,
01216             v7x=0.0, v7y=0.0, v8x=0.0, v8y=0.0;
01217 
01218    const xercesc::DOMNamedNodeMap* const attributes
01219          = gtrapElement->getAttributes();
01220    XMLSize_t attributeCount = attributes->getLength();
01221 
01222    for (XMLSize_t attribute_index=0;
01223         attribute_index<attributeCount; attribute_index++)
01224    {
01225       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01226 
01227       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01228         { continue; }
01229 
01230       const xercesc::DOMAttr* const attribute
01231             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01232       if (!attribute)
01233       {
01234         G4Exception("G4GDMLReadSolids::GenTrapRead()",
01235                     "InvalidRead", FatalException, "No attribute found!");
01236         return;
01237       }
01238       const G4String attName = Transcode(attribute->getName());
01239       const G4String attValue = Transcode(attribute->getValue());
01240 
01241       if (attName=="name") { name = GenerateName(attValue); } else
01242       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01243       if (attName=="dz") { dz = eval.Evaluate(attValue); } else
01244       if (attName=="v1x") { v1x = eval.Evaluate(attValue); } else
01245       if (attName=="v1y") { v1y = eval.Evaluate(attValue); } else
01246       if (attName=="v2x") { v2x = eval.Evaluate(attValue); } else
01247       if (attName=="v2y") { v2y = eval.Evaluate(attValue); } else
01248       if (attName=="v3x") { v3x = eval.Evaluate(attValue); } else
01249       if (attName=="v3y") { v3y = eval.Evaluate(attValue); } else
01250       if (attName=="v4x") { v4x = eval.Evaluate(attValue); } else
01251       if (attName=="v4y") { v4y = eval.Evaluate(attValue); } else
01252       if (attName=="v5x") { v5x = eval.Evaluate(attValue); } else
01253       if (attName=="v5y") { v5y = eval.Evaluate(attValue); } else
01254       if (attName=="v6x") { v6x = eval.Evaluate(attValue); } else
01255       if (attName=="v6y") { v6y = eval.Evaluate(attValue); } else
01256       if (attName=="v7x") { v7x = eval.Evaluate(attValue); } else
01257       if (attName=="v7y") { v7y = eval.Evaluate(attValue); } else
01258       if (attName=="v8x") { v8x = eval.Evaluate(attValue); } else
01259       if (attName=="v8y") { v8y = eval.Evaluate(attValue); }
01260    }
01261 
01262    dz *= lunit;
01263    std::vector<G4TwoVector> vertices;
01264    vertices.push_back(G4TwoVector(v1x*lunit,v1y*lunit));
01265    vertices.push_back(G4TwoVector(v2x*lunit,v2y*lunit));
01266    vertices.push_back(G4TwoVector(v3x*lunit,v3y*lunit));
01267    vertices.push_back(G4TwoVector(v4x*lunit,v4y*lunit));
01268    vertices.push_back(G4TwoVector(v5x*lunit,v5y*lunit));
01269    vertices.push_back(G4TwoVector(v6x*lunit,v6y*lunit));
01270    vertices.push_back(G4TwoVector(v7x*lunit,v7y*lunit));
01271    vertices.push_back(G4TwoVector(v8x*lunit,v8y*lunit));
01272    new G4GenericTrap(name,dz,vertices);
01273 }
01274 
01275 void G4GDMLReadSolids::TrapRead(const xercesc::DOMElement* const trapElement)
01276 {
01277    G4String name;
01278    G4double lunit = 1.0;
01279    G4double aunit = 1.0;
01280    G4double z = 0.0;
01281    G4double theta = 0.0;
01282    G4double phi = 0.0;
01283    G4double y1 = 0.0;
01284    G4double x1 = 0.0;
01285    G4double x2 = 0.0;
01286    G4double alpha1 = 0.0;
01287    G4double y2 = 0.0;
01288    G4double x3 = 0.0;
01289    G4double x4 = 0.0;
01290    G4double alpha2 = 0.0;
01291 
01292    const xercesc::DOMNamedNodeMap* const attributes
01293          = trapElement->getAttributes();
01294    XMLSize_t attributeCount = attributes->getLength();
01295 
01296    for (XMLSize_t attribute_index=0;
01297         attribute_index<attributeCount; attribute_index++)
01298    {
01299       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01300 
01301       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01302         { continue; }
01303 
01304       const xercesc::DOMAttr* const attribute
01305             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01306       if (!attribute)
01307       {
01308         G4Exception("G4GDMLReadSolids::TrapRead()",
01309                     "InvalidRead", FatalException, "No attribute found!");
01310         return;
01311       }
01312       const G4String attName = Transcode(attribute->getName());
01313       const G4String attValue = Transcode(attribute->getValue());
01314 
01315       if (attName=="name") { name = GenerateName(attValue); } else
01316       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01317       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
01318       if (attName=="z") { z = eval.Evaluate(attValue); } else
01319       if (attName=="theta") { theta = eval.Evaluate(attValue); } else
01320       if (attName=="phi") { phi = eval.Evaluate(attValue); } else
01321       if (attName=="y1") { y1 = eval.Evaluate(attValue); } else
01322       if (attName=="x1") { x1 = eval.Evaluate(attValue); } else
01323       if (attName=="x2") { x2 = eval.Evaluate(attValue); } else
01324       if (attName=="alpha1") { alpha1 = eval.Evaluate(attValue); } else
01325       if (attName=="y2") { y2 = eval.Evaluate(attValue); } else
01326       if (attName=="x3") { x3 = eval.Evaluate(attValue); } else
01327       if (attName=="x4") { x4 = eval.Evaluate(attValue); } else
01328       if (attName=="alpha2") { alpha2 = eval.Evaluate(attValue); }
01329    }
01330 
01331    z *= 0.5*lunit;
01332    theta *= aunit;
01333    phi *= aunit;
01334    y1 *= 0.5*lunit;
01335    x1 *= 0.5*lunit;
01336    x2 *= 0.5*lunit;
01337    alpha1 *= aunit;
01338    y2 *= 0.5*lunit;
01339    x3 *= 0.5*lunit;
01340    x4 *= 0.5*lunit;
01341    alpha2 *= aunit;
01342 
01343    new G4Trap(name,z,theta,phi,y1,x1,x2,alpha1,y2,x3,x4,alpha2);
01344 }
01345 
01346 void G4GDMLReadSolids::TrdRead(const xercesc::DOMElement* const trdElement)
01347 {
01348    G4String name;
01349    G4double lunit = 1.0;
01350    G4double x1 = 0.0;
01351    G4double x2 = 0.0;
01352    G4double y1 = 0.0;
01353    G4double y2 = 0.0;
01354    G4double z = 0.0;
01355 
01356    const xercesc::DOMNamedNodeMap* const attributes = trdElement->getAttributes();
01357    XMLSize_t attributeCount = attributes->getLength();
01358 
01359    for (XMLSize_t attribute_index=0;
01360         attribute_index<attributeCount; attribute_index++)
01361    {
01362       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01363 
01364       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01365         { continue; }
01366 
01367       const xercesc::DOMAttr* const attribute
01368             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01369       if (!attribute)
01370       {
01371         G4Exception("G4GDMLReadSolids::TrdRead()",
01372                     "InvalidRead", FatalException, "No attribute found!");
01373         return;
01374       }
01375       const G4String attName = Transcode(attribute->getName());
01376       const G4String attValue = Transcode(attribute->getValue());
01377 
01378       if (attName=="name") { name = GenerateName(attValue); } else
01379       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01380       if (attName=="x1") { x1 = eval.Evaluate(attValue); } else
01381       if (attName=="x2") { x2 = eval.Evaluate(attValue); } else
01382       if (attName=="y1") { y1 = eval.Evaluate(attValue); } else
01383       if (attName=="y2") { y2 = eval.Evaluate(attValue); } else
01384       if (attName=="z") { z = eval.Evaluate(attValue); }
01385    }
01386 
01387    x1 *= 0.5*lunit;
01388    x2 *= 0.5*lunit;
01389    y1 *= 0.5*lunit;
01390    y2 *= 0.5*lunit;
01391    z *= 0.5*lunit;
01392 
01393    new G4Trd(name,x1,x2,y1,y2,z);
01394 }
01395 
01396 G4TriangularFacet* G4GDMLReadSolids::
01397 TriangularRead(const xercesc::DOMElement* const triangularElement)
01398 {
01399    G4ThreeVector vertex1;
01400    G4ThreeVector vertex2;
01401    G4ThreeVector vertex3;
01402    G4FacetVertexType type = ABSOLUTE;
01403    G4double lunit = 1.0;
01404 
01405    const xercesc::DOMNamedNodeMap* const attributes
01406          = triangularElement->getAttributes();
01407    XMLSize_t attributeCount = attributes->getLength();
01408 
01409    for (XMLSize_t attribute_index=0;
01410         attribute_index<attributeCount; attribute_index++)
01411    {
01412       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01413 
01414       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01415         { continue; }
01416 
01417       const xercesc::DOMAttr* const attribute
01418             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01419       if (!attribute)
01420       {
01421         G4Exception("G4GDMLReadSolids::TriangularRead()",
01422                     "InvalidRead", FatalException, "No attribute found!");
01423         return 0;
01424       }
01425       const G4String attName = Transcode(attribute->getName());
01426       const G4String attValue = Transcode(attribute->getValue());
01427 
01428       if (attName=="vertex1")
01429         { vertex1 = GetPosition(GenerateName(attValue)); } else
01430       if (attName=="vertex2")
01431         { vertex2 = GetPosition(GenerateName(attValue)); } else
01432       if (attName=="vertex3")
01433         { vertex3 = GetPosition(GenerateName(attValue)); } else
01434       if (attName=="lunit")
01435         { lunit = eval.Evaluate(attValue); } else
01436       if (attName=="type")
01437         { if (attValue=="RELATIVE") { type = RELATIVE; } }
01438    }
01439 
01440    return new G4TriangularFacet(vertex1*lunit,vertex2*lunit,vertex3*lunit,type);
01441 }
01442 
01443 void G4GDMLReadSolids::TubeRead(const xercesc::DOMElement* const tubeElement)
01444 {
01445    G4String name;
01446    G4double lunit = 1.0;
01447    G4double aunit = 1.0;
01448    G4double rmin = 0.0;
01449    G4double rmax = 0.0;
01450    G4double z = 0.0;
01451    G4double startphi = 0.0;
01452    G4double deltaphi = 0.0;
01453 
01454    const xercesc::DOMNamedNodeMap* const attributes
01455          = tubeElement->getAttributes();
01456    XMLSize_t attributeCount = attributes->getLength();
01457 
01458    for (XMLSize_t attribute_index=0;
01459         attribute_index<attributeCount; attribute_index++)
01460    {
01461       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01462 
01463       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01464         { continue; }
01465 
01466       const xercesc::DOMAttr* const attribute
01467             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01468       if (!attribute)
01469       {
01470         G4Exception("G4GDMLReadSolids::TubeRead()",
01471                     "InvalidRead", FatalException, "No attribute found!");
01472         return;
01473       }
01474       const G4String attName = Transcode(attribute->getName());
01475       const G4String attValue = Transcode(attribute->getValue());
01476 
01477       if (attName=="name") { name = GenerateName(attValue); } else
01478       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01479       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
01480       if (attName=="rmin") { rmin = eval.Evaluate(attValue); } else
01481       if (attName=="rmax") { rmax = eval.Evaluate(attValue); } else
01482       if (attName=="z") { z = eval.Evaluate(attValue); } else
01483       if (attName=="startphi") { startphi = eval.Evaluate(attValue); } else
01484       if (attName=="deltaphi") { deltaphi = eval.Evaluate(attValue); }
01485    }
01486 
01487    rmin *= lunit;
01488    rmax *= lunit;
01489    z *= 0.5*lunit;
01490    startphi *= aunit;
01491    deltaphi *= aunit;
01492 
01493    new G4Tubs(name,rmin,rmax,z,startphi,deltaphi);
01494 }
01495 
01496 void G4GDMLReadSolids::CutTubeRead(const xercesc::DOMElement* const cuttubeElement)
01497 {
01498    G4String name;
01499    G4double lunit = 1.0;
01500    G4double aunit = 1.0;
01501    G4double rmin = 0.0;
01502    G4double rmax = 0.0;
01503    G4double z = 0.0;
01504    G4double startphi = 0.0;
01505    G4double deltaphi = 0.0;
01506    G4ThreeVector lowNorm(0);
01507    G4ThreeVector highNorm(0);
01508 
01509    const xercesc::DOMNamedNodeMap* const attributes
01510          = cuttubeElement->getAttributes();
01511    XMLSize_t attributeCount = attributes->getLength();
01512 
01513    for (XMLSize_t attribute_index=0;
01514         attribute_index<attributeCount; attribute_index++)
01515    {
01516       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01517 
01518       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01519         { continue; }
01520 
01521       const xercesc::DOMAttr* const attribute
01522             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01523       if (!attribute)
01524       {
01525         G4Exception("G4GDMLReadSolids::CutTubeRead()",
01526                     "InvalidRead", FatalException, "No attribute found!");
01527         return;
01528       }
01529       const G4String attName = Transcode(attribute->getName());
01530       const G4String attValue = Transcode(attribute->getValue());
01531 
01532       if (attName=="name") { name = GenerateName(attValue); } else
01533       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01534       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
01535       if (attName=="rmin") { rmin = eval.Evaluate(attValue); } else
01536       if (attName=="rmax") { rmax = eval.Evaluate(attValue); } else
01537       if (attName=="z") { z = eval.Evaluate(attValue); } else
01538       if (attName=="startphi") { startphi = eval.Evaluate(attValue); } else
01539       if (attName=="deltaphi") { deltaphi = eval.Evaluate(attValue); } else
01540       if (attName=="lowX") { lowNorm.setX (eval.Evaluate(attValue)); } else
01541       if (attName=="lowY") { lowNorm.setY (eval.Evaluate(attValue)); } else
01542       if (attName=="lowZ") { lowNorm.setZ (eval.Evaluate(attValue)); } else
01543       if (attName=="highX") { highNorm.setX (eval.Evaluate(attValue)); } else
01544       if (attName=="highY") { highNorm.setY (eval.Evaluate(attValue)); } else
01545       if (attName=="highZ") { highNorm.setZ (eval.Evaluate(attValue)); } 
01546    
01547    }
01548 
01549    rmin *= lunit;
01550    rmax *= lunit;
01551    z *= 0.5*lunit;
01552    startphi *= aunit;
01553    deltaphi *= aunit;
01554 
01555    new G4CutTubs(name,rmin,rmax,z,startphi,deltaphi,lowNorm,highNorm);
01556 }
01557 
01558 void G4GDMLReadSolids::
01559 TwistedboxRead(const xercesc::DOMElement* const twistedboxElement)
01560 {
01561    G4String name;
01562    G4double lunit = 1.0;
01563    G4double aunit = 1.0;
01564    G4double PhiTwist = 0.0;
01565    G4double x = 0.0;
01566    G4double y = 0.0;
01567    G4double z = 0.0;
01568 
01569    const xercesc::DOMNamedNodeMap* const attributes
01570          = twistedboxElement->getAttributes();
01571    XMLSize_t attributeCount = attributes->getLength();
01572 
01573    for (XMLSize_t attribute_index=0;
01574         attribute_index<attributeCount; attribute_index++)
01575    {
01576       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01577 
01578       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01579         { continue; }
01580 
01581       const xercesc::DOMAttr* const attribute
01582             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01583       if (!attribute)
01584       {
01585         G4Exception("G4GDMLReadSolids::TwistedboxRead()",
01586                     "InvalidRead", FatalException, "No attribute found!");
01587         return;
01588       }
01589       const G4String attName = Transcode(attribute->getName());
01590       const G4String attValue = Transcode(attribute->getValue());
01591 
01592       if (attName=="name") { name = GenerateName(attValue); } else
01593       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01594       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
01595       if (attName=="PhiTwist") { PhiTwist = eval.Evaluate(attValue); } else
01596       if (attName=="x") { x = eval.Evaluate(attValue); } else
01597       if (attName=="y") { y = eval.Evaluate(attValue); } else
01598       if (attName=="z") { z = eval.Evaluate(attValue); }
01599    }
01600 
01601    PhiTwist *= aunit;
01602    x *= 0.5*lunit;
01603    y *= 0.5*lunit;
01604    z *= 0.5*lunit;
01605 
01606    new G4TwistedBox(name,PhiTwist,x,y,z);
01607 }
01608 
01609 void G4GDMLReadSolids::
01610 TwistedtrapRead(const xercesc::DOMElement* const twistedtrapElement)
01611 {
01612    G4String name;
01613    G4double lunit = 1.0;
01614    G4double aunit = 1.0;
01615    G4double PhiTwist = 0.0;
01616    G4double z = 0.0;
01617    G4double Theta = 0.0;
01618    G4double Phi = 0.0;
01619    G4double y1 = 0.0;
01620    G4double x1 = 0.0;
01621    G4double x2 = 0.0;
01622    G4double y2 = 0.0;
01623    G4double x3 = 0.0;
01624    G4double x4 = 0.0;
01625    G4double Alph = 0.0;
01626 
01627    const xercesc::DOMNamedNodeMap* const attributes
01628          = twistedtrapElement->getAttributes();
01629    XMLSize_t attributeCount = attributes->getLength();
01630 
01631    for (XMLSize_t attribute_index=0;
01632         attribute_index<attributeCount; attribute_index++)
01633    {
01634       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01635 
01636       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01637         { continue; }
01638 
01639       const xercesc::DOMAttr* const attribute
01640             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01641       if (!attribute)
01642       {
01643         G4Exception("G4GDMLReadSolids::TwistedtrapRead()",
01644                     "InvalidRead", FatalException, "No attribute found!");
01645         return;
01646       }
01647       const G4String attName = Transcode(attribute->getName());
01648       const G4String attValue = Transcode(attribute->getValue());
01649 
01650       if (attName=="name") { name = GenerateName(attValue); } else
01651       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01652       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
01653       if (attName=="PhiTwist") { PhiTwist = eval.Evaluate(attValue); } else
01654       if (attName=="z") { z = eval.Evaluate(attValue); } else
01655       if (attName=="Theta") { Theta = eval.Evaluate(attValue); } else
01656       if (attName=="Phi") { Phi = eval.Evaluate(attValue); } else
01657       if (attName=="y1") { y1 = eval.Evaluate(attValue); } else
01658       if (attName=="x1") { x1 = eval.Evaluate(attValue); } else
01659       if (attName=="x2") { x2 = eval.Evaluate(attValue); } else
01660       if (attName=="y2") { y2 = eval.Evaluate(attValue); } else
01661       if (attName=="x3") { x3 = eval.Evaluate(attValue); } else
01662       if (attName=="x4") { x4 = eval.Evaluate(attValue); } else
01663       if (attName=="Alph") { Alph = eval.Evaluate(attValue); }
01664    }
01665 
01666 
01667    PhiTwist *= aunit;
01668    z *= 0.5*lunit;
01669    Theta *= aunit;
01670    Phi *= aunit;
01671    Alph *= aunit;
01672    y1 *= 0.5*lunit;
01673    x1 *= 0.5*lunit;
01674    x2 *= 0.5*lunit;
01675    y2 *= 0.5*lunit;
01676    x3 *= 0.5*lunit;
01677    x4 *= 0.5*lunit;
01678 
01679    new G4TwistedTrap(name,PhiTwist,z,Theta,Phi,y1,x1,x2,y2,x3,x4,Alph);
01680 }
01681 
01682 void G4GDMLReadSolids::
01683 TwistedtrdRead(const xercesc::DOMElement* const twistedtrdElement)
01684 {
01685    G4String name;
01686    G4double lunit = 1.0;
01687    G4double aunit = 1.0;
01688    G4double x1 = 0.0;
01689    G4double x2 = 0.0;
01690    G4double y1 = 0.0;
01691    G4double y2 = 0.0;
01692    G4double z = 0.0;
01693    G4double PhiTwist = 0.0;
01694 
01695    const xercesc::DOMNamedNodeMap* const attributes
01696          = twistedtrdElement->getAttributes();
01697    XMLSize_t attributeCount = attributes->getLength();
01698 
01699    for (XMLSize_t attribute_index=0;
01700         attribute_index<attributeCount; attribute_index++)
01701    {
01702       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01703 
01704       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01705         { continue; }
01706 
01707       const xercesc::DOMAttr* const attribute
01708             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01709       if (!attribute)
01710       {
01711         G4Exception("G4GDMLReadSolids::TwistedtrdRead()",
01712                     "InvalidRead", FatalException, "No attribute found!");
01713         return;
01714       }
01715       const G4String attName = Transcode(attribute->getName());
01716       const G4String attValue = Transcode(attribute->getValue());
01717 
01718       if (attName=="name") { name = GenerateName(attValue); } else
01719       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01720       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
01721       if (attName=="x1") { x1 = eval.Evaluate(attValue); } else
01722       if (attName=="x2") { x2 = eval.Evaluate(attValue); } else
01723       if (attName=="y1") { y1 = eval.Evaluate(attValue); } else
01724       if (attName=="y2") { y2 = eval.Evaluate(attValue); } else
01725       if (attName=="z") { z = eval.Evaluate(attValue); } else
01726       if (attName=="PhiTwist") { PhiTwist = eval.Evaluate(attValue); }
01727    }
01728 
01729    x1 *= 0.5*lunit;
01730    x2 *= 0.5*lunit;
01731    y1 *= 0.5*lunit;
01732    y2 *= 0.5*lunit;
01733    z *= 0.5*lunit;
01734    PhiTwist *= aunit;
01735 
01736    new G4TwistedTrd(name,x1,x2,y1,y2,z,PhiTwist);
01737 }
01738 
01739 void G4GDMLReadSolids::
01740 TwistedtubsRead(const xercesc::DOMElement* const twistedtubsElement)
01741 {
01742    G4String name;
01743    G4double lunit = 1.0;
01744    G4double aunit = 1.0;
01745    G4double twistedangle = 0.0;
01746    G4double endinnerrad = 0.0;
01747    G4double endouterrad = 0.0;
01748    G4double zlen = 0.0;
01749    G4double phi = 0.0;
01750 
01751    const xercesc::DOMNamedNodeMap* const attributes
01752          = twistedtubsElement->getAttributes();
01753    XMLSize_t attributeCount = attributes->getLength();
01754 
01755    for (XMLSize_t attribute_index=0;
01756         attribute_index<attributeCount; attribute_index++)
01757    {
01758       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01759 
01760       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01761         { continue; }
01762 
01763       const xercesc::DOMAttr* const attribute
01764             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01765       if (!attribute)
01766       {
01767         G4Exception("G4GDMLReadSolids::TwistedtubsRead()",
01768                     "InvalidRead", FatalException, "No attribute found!");
01769         return;
01770       }
01771       const G4String attName = Transcode(attribute->getName());
01772       const G4String attValue = Transcode(attribute->getValue());
01773 
01774       if (attName=="name") { name = GenerateName(attValue); } else
01775       if (attName=="lunit") { lunit = eval.Evaluate(attValue); } else
01776       if (attName=="aunit") { aunit = eval.Evaluate(attValue); } else
01777       if (attName=="twistedangle") { twistedangle=eval.Evaluate(attValue); } else
01778       if (attName=="endinnerrad")  { endinnerrad=eval.Evaluate(attValue);  } else
01779       if (attName=="endouterrad")  { endouterrad=eval.Evaluate(attValue);  } else
01780       if (attName=="zlen") { zlen = eval.Evaluate(attValue); } else
01781       if (attName=="phi") { phi = eval.Evaluate(attValue); }
01782    }
01783 
01784    twistedangle *= aunit;
01785    endinnerrad *= lunit;
01786    endouterrad *= lunit;
01787    zlen *= 0.5*lunit;
01788    phi *= aunit;
01789 
01790    new G4TwistedTubs(name,twistedangle,endinnerrad,endouterrad,zlen,phi);
01791 }
01792 
01793 G4TwoVector G4GDMLReadSolids::
01794 TwoDimVertexRead(const xercesc::DOMElement* const element, G4double lunit)
01795 {
01796    G4TwoVector vec;
01797    
01798    const xercesc::DOMNamedNodeMap* const attributes = element->getAttributes();
01799    XMLSize_t attributeCount = attributes->getLength();
01800 
01801    for (XMLSize_t attribute_index=0;
01802         attribute_index<attributeCount; attribute_index++)
01803    {
01804       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01805 
01806       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01807         { continue; }
01808 
01809       const xercesc::DOMAttr* const attribute
01810             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01811       if (!attribute)
01812       {
01813         G4Exception("G4GDMLReadSolids::TwoDimVertexRead()",
01814                     "InvalidRead", FatalException, "No attribute found!");
01815         return vec;
01816       }
01817       const G4String attName = Transcode(attribute->getName());
01818       const G4String attValue = Transcode(attribute->getValue());
01819 
01820       if (attName=="x") { vec.setX(eval.Evaluate(attValue)*lunit); } else
01821       if (attName=="y") { vec.setY(eval.Evaluate(attValue)*lunit); }
01822    }
01823 
01824    return vec;
01825 }
01826 
01827 G4GDMLReadSolids::zplaneType G4GDMLReadSolids::
01828 ZplaneRead(const xercesc::DOMElement* const zplaneElement)
01829 {
01830    zplaneType zplane = {0.,0.,0.};
01831 
01832    const xercesc::DOMNamedNodeMap* const attributes
01833          = zplaneElement->getAttributes();
01834    XMLSize_t attributeCount = attributes->getLength();
01835 
01836    for (XMLSize_t attribute_index=0;
01837         attribute_index<attributeCount; attribute_index++)
01838    {
01839       xercesc::DOMNode* node = attributes->item(attribute_index);
01840 
01841       if (node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE) { continue; }
01842 
01843       const xercesc::DOMAttr* const attribute
01844             = dynamic_cast<xercesc::DOMAttr*>(node);   
01845       if (!attribute)
01846       {
01847         G4Exception("G4GDMLReadSolids::ZplaneRead()",
01848                     "InvalidRead", FatalException, "No attribute found!");
01849         return zplane;
01850       }
01851       const G4String attName = Transcode(attribute->getName());
01852       const G4String attValue = Transcode(attribute->getValue());
01853 
01854       if (attName=="rmin") { zplane.rmin = eval.Evaluate(attValue); } else
01855       if (attName=="rmax") { zplane.rmax = eval.Evaluate(attValue); } else
01856       if (attName=="z") { zplane.z = eval.Evaluate(attValue); }
01857    }
01858 
01859    return zplane;
01860 }
01861 
01862 void G4GDMLReadSolids::
01863 OpticalSurfaceRead(const xercesc::DOMElement* const opticalsurfaceElement)
01864 {
01865    G4String name;
01866    G4String smodel;
01867    G4String sfinish;
01868    G4String stype;
01869    G4double value = 0.0;
01870 
01871    const xercesc::DOMNamedNodeMap* const attributes
01872          = opticalsurfaceElement->getAttributes();
01873    XMLSize_t attributeCount = attributes->getLength();
01874 
01875    for (XMLSize_t attribute_index=0;
01876         attribute_index<attributeCount; attribute_index++)
01877    {
01878       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
01879 
01880       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
01881         { continue; }
01882 
01883       const xercesc::DOMAttr* const attribute
01884             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
01885       if (!attribute)
01886       {
01887         G4Exception("G4GDMLReadSolids::OpticalSurfaceRead()",
01888                     "InvalidRead", FatalException, "No attribute found!");
01889         return;
01890       }
01891       const G4String attName = Transcode(attribute->getName());
01892       const G4String attValue = Transcode(attribute->getValue());
01893 
01894       if (attName=="name") { name = GenerateName(attValue); } else
01895       if (attName=="model") { smodel = attValue; } else
01896       if (attName=="finish") { sfinish = attValue; } else
01897       if (attName=="type") { stype = attValue; } else
01898       if (attName=="value") { value = eval.Evaluate(attValue); }
01899    }
01900 
01901    G4OpticalSurfaceModel model; 
01902    G4OpticalSurfaceFinish finish;
01903    G4SurfaceType type;   
01904    
01905    if ((smodel=="glisur") || (smodel=="0")) { model = glisur; } else
01906    if ((smodel=="unified") || (smodel=="1")) { model = unified; }
01907    else { model = LUT; }
01908 
01909    if ((sfinish=="polished") || (sfinish=="0"))
01910       { finish = polished; } else
01911    if ((sfinish=="polishedfrontpainted") || (sfinish=="1"))
01912       { finish = polishedfrontpainted; } else
01913    if ((sfinish=="polishedbackpainted") || (sfinish=="2"))
01914       { finish = polishedbackpainted; } else
01915    if ((sfinish=="ground") || (sfinish=="3"))
01916       { finish = ground; } else
01917    if ((sfinish=="groundfrontpainted") || (sfinish=="4"))
01918       { finish = groundfrontpainted; } else
01919    if ((sfinish=="groundbackpainted") || (sfinish=="5"))
01920       { finish = groundbackpainted; } else
01921    if ((sfinish=="polishedlumirrorair") || (sfinish=="6"))
01922       { finish = polishedlumirrorair; } else
01923    if ((sfinish=="polishedlumirrorglue") || (sfinish=="7"))
01924       { finish = polishedlumirrorglue; } else
01925    if ((sfinish=="polishedair") || (sfinish=="8"))
01926       { finish = polishedair; } else
01927    if ((sfinish=="polishedteflonair") || (sfinish=="9"))
01928       { finish = polishedteflonair; } else
01929    if ((sfinish=="polishedtioair") || (sfinish=="10"))
01930       { finish = polishedtioair; } else
01931    if ((sfinish=="polishedtyvekair") || (sfinish=="11"))
01932       { finish = polishedtyvekair; } else
01933    if ((sfinish=="polishedvm2000air") || (sfinish=="12"))
01934       { finish = polishedvm2000air; } else
01935    if ((sfinish=="polishedvm2000glue") || (sfinish=="13"))
01936       { finish = polishedvm2000glue; } else
01937    if ((sfinish=="etchedlumirrorair") || (sfinish=="14"))
01938       { finish = etchedlumirrorair; } else
01939    if ((sfinish=="etchedlumirrorglue") || (sfinish=="15"))
01940       { finish = etchedlumirrorglue; } else
01941    if ((sfinish=="etchedair") || (sfinish=="16"))
01942       { finish = etchedair; } else
01943    if ((sfinish=="etchedteflonair") || (sfinish=="17"))
01944       { finish = etchedteflonair; } else
01945    if ((sfinish=="etchedtioair") || (sfinish=="18"))
01946       { finish = etchedtioair; } else
01947    if ((sfinish=="etchedtyvekair") || (sfinish=="19"))
01948       { finish = etchedtyvekair; } else
01949    if ((sfinish=="etchedvm2000air") || (sfinish=="20"))
01950       { finish = etchedvm2000air; } else
01951    if ((sfinish=="etchedvm2000glue") || (sfinish=="21"))
01952       { finish = etchedvm2000glue; } else
01953    if ((sfinish=="groundlumirrorair") || (sfinish=="22"))
01954       { finish = groundlumirrorair; } else
01955    if ((sfinish=="groundlumirrorglue") || (sfinish=="23"))
01956       { finish = groundlumirrorglue; } else
01957    if ((sfinish=="groundair") || (sfinish=="24"))
01958       { finish = groundair; } else
01959    if ((sfinish=="groundteflonair") || (sfinish=="25"))
01960       { finish = groundteflonair; } else
01961    if ((sfinish=="groundtioair") || (sfinish=="26"))
01962       { finish = groundtioair; } else
01963    if ((sfinish=="groundtyvekair") || (sfinish=="27"))
01964       { finish = groundtyvekair; } else
01965    if ((sfinish=="groundvm2000air") || (sfinish=="28"))
01966       { finish = groundvm2000air; }
01967    else { finish = groundvm2000glue; }
01968 
01969    if ((stype=="dielectric_metal") || (stype=="0"))
01970       { type = dielectric_metal; } else
01971    if ((stype=="dielectric_dielectric") || (stype=="1"))
01972       { type = dielectric_dielectric; } else
01973    if ((stype=="dielectric_LUT") || (stype=="2"))
01974       { type = dielectric_LUT; } else
01975    if ((stype=="firsov") || (stype=="3"))
01976       { type = firsov; }
01977    else { type = x_ray; }
01978 
01979    new G4OpticalSurface(name,model,finish,type,value);
01980 }
01981 
01982 void G4GDMLReadSolids::SolidsRead(const xercesc::DOMElement* const solidsElement)
01983 {
01984    G4cout << "G4GDML: Reading solids..." << G4endl;
01985 
01986    for (xercesc::DOMNode* iter = solidsElement->getFirstChild();
01987         iter != 0; iter = iter->getNextSibling())
01988    {
01989       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE)  { continue; }
01990 
01991       const xercesc::DOMElement* const child
01992             = dynamic_cast<xercesc::DOMElement*>(iter);
01993       if (!child)
01994       {
01995         G4Exception("G4GDMLReadSolids::SolidsRead()",
01996                     "InvalidRead", FatalException, "No child found!");
01997         return;
01998       }
01999       const G4String tag = Transcode(child->getTagName());
02000       if (tag=="define") { DefineRead(child);  }  else 
02001       if (tag=="box")    { BoxRead(child); } else
02002       if (tag=="cone")   { ConeRead(child); } else
02003       if (tag=="elcone") { ElconeRead(child); } else
02004       if (tag=="ellipsoid") { EllipsoidRead(child); }else
02005       if (tag=="eltube") { EltubeRead(child); } else
02006       if (tag=="xtru") { XtruRead(child); } else
02007       if (tag=="hype") { HypeRead(child); } else
02008       if (tag=="intersection") { BooleanRead(child,INTERSECTION); } else
02009       if (tag=="orb") { OrbRead(child); } else
02010       if (tag=="para") { ParaRead(child); } else
02011       if (tag=="paraboloid") { ParaboloidRead(child); } else
02012       if (tag=="polycone") { PolyconeRead(child); } else
02013       if (tag=="polyhedra") { PolyhedraRead(child); } else
02014       if (tag=="reflectedSolid") { ReflectedSolidRead(child); } else
02015       if (tag=="sphere") { SphereRead(child); } else
02016       if (tag=="subtraction") { BooleanRead(child,SUBTRACTION); } else
02017       if (tag=="tessellated") { TessellatedRead(child); } else
02018       if (tag=="tet") { TetRead(child); } else
02019       if (tag=="torus") { TorusRead(child); } else
02020       if (tag=="arb8") { GenTrapRead(child); } else
02021       if (tag=="trap") { TrapRead(child); } else
02022       if (tag=="trd") { TrdRead(child); } else
02023       if (tag=="tube") { TubeRead(child); } else
02024       if (tag=="cutTube") { CutTubeRead(child); } else
02025       if (tag=="twistedbox") { TwistedboxRead(child); } else
02026       if (tag=="twistedtrap") { TwistedtrapRead(child); } else
02027       if (tag=="twistedtrd") { TwistedtrdRead(child); } else
02028       if (tag=="twistedtubs") { TwistedtubsRead(child); } else
02029       if (tag=="union") { BooleanRead(child,UNION); } else
02030       if (tag=="opticalsurface") { OpticalSurfaceRead(child); } else
02031       if (tag=="loop") { LoopRead(child,&G4GDMLRead::SolidsRead); }
02032       else
02033       {
02034         G4String error_msg = "Unknown tag in solids: " + tag;
02035         G4Exception("G4GDMLReadSolids::SolidsRead()", "ReadError",
02036                     FatalException, error_msg);
02037       }
02038    }
02039 }
02040 
02041 G4VSolid* G4GDMLReadSolids::GetSolid(const G4String& ref) const
02042 {
02043    G4VSolid* solidPtr = G4SolidStore::GetInstance()->GetSolid(ref,false);
02044 
02045    if (!solidPtr)
02046    {
02047      G4String error_msg = "Referenced solid '" + ref + "' was not found!";
02048      G4Exception("G4GDMLReadSolids::GetSolid()", "ReadError",
02049                  FatalException, error_msg);
02050    }
02051 
02052    return solidPtr;
02053 }
02054 
02055 G4SurfaceProperty* G4GDMLReadSolids::
02056 GetSurfaceProperty(const G4String& ref) const
02057 {
02058    const G4SurfacePropertyTable* surfaceList
02059          = G4SurfaceProperty::GetSurfacePropertyTable();
02060    const size_t surfaceCount = surfaceList->size();
02061 
02062    for (size_t i=0; i<surfaceCount; i++)
02063    {
02064       if ((*surfaceList)[i]->GetName() == ref)  { return (*surfaceList)[i]; }
02065    }
02066 
02067    G4String error_msg = "Referenced optical surface '" + ref + "' was not found!";
02068    G4Exception("G4GDMLReadSolids::GetSurfaceProperty()", "ReadError",
02069                FatalException, error_msg);
02070 
02071    return 0;
02072 }

Generated on Mon May 27 17:48:20 2013 for Geant4 by  doxygen 1.4.7