Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/persistency/gdml/src/G4GDMLReadMaterials.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/G4GDMLReadMaterials.cc (Version 11.3.0) and /persistency/gdml/src/G4GDMLReadMaterials.cc (Version 9.2.p3)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // G4GDMLReadMaterials implementation          << 
 27 //                                                 26 //
 28 // Author: Zoltan Torzsok, November 2007       <<  27 // $Id: G4GDMLReadMaterials.cc,v 1.16.2.1 2009/08/11 08:27:49 gcosmo Exp $
                                                   >>  28 // GEANT4 tag $ Name:$
                                                   >>  29 //
                                                   >>  30 // class G4GDMLReadMaterials Implementation
                                                   >>  31 //
                                                   >>  32 // Original author: Zoltan Torzsok, November 2007
                                                   >>  33 //
 29 // -------------------------------------------     34 // --------------------------------------------------------------------
 30                                                    35 
 31 #include "G4GDMLReadMaterials.hh"                  36 #include "G4GDMLReadMaterials.hh"
 32                                                    37 
 33 #include "G4PhysicalConstants.hh"              <<  38 G4GDMLReadMaterials::G4GDMLReadMaterials() : G4GDMLReadDefine()
 34 #include "G4SystemOfUnits.hh"                  << 
 35 #include "G4UnitsTable.hh"                     << 
 36 #include "G4Element.hh"                        << 
 37 #include "G4Isotope.hh"                        << 
 38 #include "G4Material.hh"                       << 
 39 #include "G4NistManager.hh"                    << 
 40                                                << 
 41 // ------------------------------------------- << 
 42 G4GDMLReadMaterials::G4GDMLReadMaterials()     << 
 43   : G4GDMLReadDefine()                         << 
 44 {                                                  39 {
 45 }                                                  40 }
 46                                                    41 
 47 // ------------------------------------------- << 
 48 G4GDMLReadMaterials::~G4GDMLReadMaterials()        42 G4GDMLReadMaterials::~G4GDMLReadMaterials()
 49 {                                                  43 {
 50 }                                                  44 }
 51                                                    45 
 52 // ------------------------------------------- <<  46 G4double
 53 G4double G4GDMLReadMaterials::AtomRead(        <<  47 G4GDMLReadMaterials::AtomRead(const xercesc::DOMElement* const atomElement)
 54   const xercesc::DOMElement* const atomElement << 
 55 {                                                  48 {
 56   G4double value = 0.0;                        <<  49    G4double value = 0.0;
 57   G4double unit  = g / mole;                   <<  50    G4double unit = g/mole;
 58                                                    51 
 59   const xercesc::DOMNamedNodeMap* const attrib <<  52    const xercesc::DOMNamedNodeMap* const attributes
 60     atomElement->getAttributes();              <<  53          = atomElement->getAttributes();
 61   XMLSize_t attributeCount = attributes->getLe <<  54    XMLSize_t attributeCount = attributes->getLength();
 62                                                << 
 63   for(XMLSize_t attribute_index = 0; attribute << 
 64       ++attribute_index)                       << 
 65   {                                            << 
 66     xercesc::DOMNode* attribute_node = attribu << 
 67                                                << 
 68     if(attribute_node->getNodeType() != xerces << 
 69     {                                          << 
 70       continue;                                << 
 71     }                                          << 
 72                                                << 
 73     const xercesc::DOMAttr* const attribute =  << 
 74       dynamic_cast<xercesc::DOMAttr*>(attribut << 
 75     if(attribute == nullptr)                   << 
 76     {                                          << 
 77       G4Exception("G4GDMLReadMaterials::AtomRe << 
 78                   FatalException, "No attribut << 
 79       return value;                            << 
 80     }                                          << 
 81     const G4String attName  = Transcode(attrib << 
 82     const G4String attValue = Transcode(attrib << 
 83                                                << 
 84     if(attName == "value")                     << 
 85     {                                          << 
 86       value = eval.Evaluate(attValue);         << 
 87     }                                          << 
 88     else if(attName == "unit")                 << 
 89     {                                          << 
 90       unit = G4UnitDefinition::GetValueOf(attV << 
 91       if(G4UnitDefinition::GetCategory(attValu << 
 92       {                                        << 
 93         G4Exception("G4GDMLReadMaterials::Atom << 
 94                     FatalException, "Invalid u << 
 95       }                                        << 
 96     }                                          << 
 97   }                                            << 
 98                                                    55 
 99   return value * unit;                         <<  56    for (XMLSize_t attribute_index=0;
100 }                                              <<  57         attribute_index<attributeCount; attribute_index++)
                                                   >>  58    {
                                                   >>  59       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
101                                                    60 
102 // ------------------------------------------- <<  61       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
103 G4int G4GDMLReadMaterials::CompositeRead(      <<  62       { continue; }
104   const xercesc::DOMElement* const compositeEl << 
105 {                                              << 
106   G4int n = 0;                                 << 
107                                                << 
108   const xercesc::DOMNamedNodeMap* const attrib << 
109     compositeElement->getAttributes();         << 
110   XMLSize_t attributeCount = attributes->getLe << 
111                                                << 
112   for(XMLSize_t attribute_index = 0; attribute << 
113       ++attribute_index)                       << 
114   {                                            << 
115     xercesc::DOMNode* attribute_node = attribu << 
116                                                << 
117     if(attribute_node->getNodeType() != xerces << 
118     {                                          << 
119       continue;                                << 
120     }                                          << 
121                                                << 
122     const xercesc::DOMAttr* const attribute =  << 
123       dynamic_cast<xercesc::DOMAttr*>(attribut << 
124     if(attribute == nullptr)                   << 
125     {                                          << 
126       G4Exception("G4GDMLReadMaterials::Compos << 
127                   FatalException, "No attribut << 
128       return n;                                << 
129     }                                          << 
130     const G4String attName  = Transcode(attrib << 
131     const G4String attValue = Transcode(attrib << 
132                                                << 
133     if(attName == "n")                         << 
134     {                                          << 
135       n = eval.EvaluateInteger(attValue);      << 
136     }                                          << 
137     else if(attName == "ref")                  << 
138     {                                          << 
139       ref = attValue;                          << 
140     }                                          << 
141   }                                            << 
142                                                << 
143   return n;                                    << 
144 }                                              << 
145                                                << 
146 // ------------------------------------------- << 
147 G4double G4GDMLReadMaterials::DRead(const xerc << 
148 {                                              << 
149   G4double value = 0.0;                        << 
150   G4double unit  = g / cm3;                    << 
151                                                    63 
152   const xercesc::DOMNamedNodeMap* const attrib <<  64       const xercesc::DOMAttr* const attribute
153   XMLSize_t attributeCount                     <<  65             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
                                                   >>  66       const G4String attName = Transcode(attribute->getName());
                                                   >>  67       const G4String attValue = Transcode(attribute->getValue());
154                                                    68 
155   for(XMLSize_t attribute_index = 0; attribute <<  69       if (attName=="value") { value = eval.Evaluate(attValue); } else
156       ++attribute_index)                       <<  70       if (attName=="unit")  { unit = eval.Evaluate(attValue); }
157   {                                            <<  71    }
158     xercesc::DOMNode* attribute_node = attribu << 
159                                                << 
160     if(attribute_node->getNodeType() != xerces << 
161     {                                          << 
162       continue;                                << 
163     }                                          << 
164                                                << 
165     const xercesc::DOMAttr* const attribute =  << 
166       dynamic_cast<xercesc::DOMAttr*>(attribut << 
167     if(attribute == nullptr)                   << 
168     {                                          << 
169       G4Exception("G4GDMLReadMaterials::DRead( << 
170                   "No attribute found!");      << 
171       return value;                            << 
172     }                                          << 
173     const G4String attName  = Transcode(attrib << 
174     const G4String attValue = Transcode(attrib << 
175                                                << 
176     if(attName == "value")                     << 
177     {                                          << 
178       value = eval.Evaluate(attValue);         << 
179     }                                          << 
180     else if(attName == "unit")                 << 
181     {                                          << 
182       unit = G4UnitDefinition::GetValueOf(attV << 
183       if(G4UnitDefinition::GetCategory(attValu << 
184       {                                        << 
185         G4Exception("G4GDMLReadMaterials::DRea << 
186                     FatalException, "Invalid u << 
187       }                                        << 
188     }                                          << 
189   }                                            << 
190                                                    72 
191   return value * unit;                         <<  73    return value*unit;
192 }                                                  74 }
193                                                    75 
194 // ------------------------------------------- <<  76 G4int G4GDMLReadMaterials::
195 G4double G4GDMLReadMaterials::PRead(const xerc <<  77 CompositeRead(const xercesc::DOMElement* const compositeElement,G4String& ref)
196 {                                              << 
197   G4double value = STP_Pressure;               << 
198   G4double unit  = hep_pascal;                 << 
199                                                << 
200   const xercesc::DOMNamedNodeMap* const attrib << 
201   XMLSize_t attributeCount                     << 
202                                                << 
203   for(XMLSize_t attribute_index = 0; attribute << 
204       ++attribute_index)                       << 
205   {                                            << 
206     xercesc::DOMNode* attribute_node = attribu << 
207                                                << 
208     if(attribute_node->getNodeType() != xerces << 
209     {                                          << 
210       continue;                                << 
211     }                                          << 
212                                                << 
213     const xercesc::DOMAttr* const attribute =  << 
214       dynamic_cast<xercesc::DOMAttr*>(attribut << 
215     if(attribute == nullptr)                   << 
216     {                                          << 
217       G4Exception("G4GDMLReadMaterials::PRead( << 
218                   "No attribute found!");      << 
219       return value;                            << 
220     }                                          << 
221     const G4String attName  = Transcode(attrib << 
222     const G4String attValue = Transcode(attrib << 
223                                                << 
224     if(attName == "value")                     << 
225     {                                          << 
226       value = eval.Evaluate(attValue);         << 
227     }                                          << 
228     else if(attName == "unit")                 << 
229     {                                          << 
230       unit = G4UnitDefinition::GetValueOf(attV << 
231       if(G4UnitDefinition::GetCategory(attValu << 
232       {                                        << 
233         G4Exception("G4GDMLReadMaterials::PRea << 
234                     FatalException, "Invalid u << 
235       }                                        << 
236     }                                          << 
237   }                                            << 
238                                                << 
239   return value * unit;                         << 
240 }                                              << 
241                                                << 
242 // ------------------------------------------- << 
243 G4double G4GDMLReadMaterials::TRead(const xerc << 
244 {                                                  78 {
245   G4double value = NTP_Temperature;            <<  79    G4int n = 0;
246   G4double unit  = kelvin;                     << 
247                                                << 
248   const xercesc::DOMNamedNodeMap* const attrib << 
249   XMLSize_t attributeCount                     << 
250                                                    80 
251   for(XMLSize_t attribute_index = 0; attribute <<  81    const xercesc::DOMNamedNodeMap* const attributes
252       ++attribute_index)                       <<  82          = compositeElement->getAttributes();
253   {                                            <<  83    XMLSize_t attributeCount = attributes->getLength();
254     xercesc::DOMNode* attribute_node = attribu << 
255                                                << 
256     if(attribute_node->getNodeType() != xerces << 
257     {                                          << 
258       continue;                                << 
259     }                                          << 
260                                                << 
261     const xercesc::DOMAttr* const attribute =  << 
262       dynamic_cast<xercesc::DOMAttr*>(attribut << 
263     if(attribute == nullptr)                   << 
264     {                                          << 
265       G4Exception("G4GDMLReadMaterials::TRead( << 
266                   "No attribute found!");      << 
267       return value;                            << 
268     }                                          << 
269     const G4String attName  = Transcode(attrib << 
270     const G4String attValue = Transcode(attrib << 
271                                                << 
272     if(attName == "value")                     << 
273     {                                          << 
274       value = eval.Evaluate(attValue);         << 
275     }                                          << 
276     else if(attName == "unit")                 << 
277     {                                          << 
278       unit = G4UnitDefinition::GetValueOf(attV << 
279       if(G4UnitDefinition::GetCategory(attValu << 
280       {                                        << 
281         G4Exception("G4GDMLReadMaterials::TRea << 
282                     FatalException, "Invalid u << 
283       }                                        << 
284     }                                          << 
285   }                                            << 
286                                                    84 
287   return value * unit;                         <<  85    for (XMLSize_t attribute_index=0;
288 }                                              <<  86         attribute_index<attributeCount; attribute_index++)
                                                   >>  87    {
                                                   >>  88       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
289                                                    89 
290 // ------------------------------------------- <<  90       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
291 G4double G4GDMLReadMaterials::MEERead(const xe <<  91       { continue; }
292 {                                              << 
293   G4double value = -1;                         << 
294   G4double unit  = eV;                         << 
295                                                    92 
296   const xercesc::DOMNamedNodeMap* const attrib <<  93       const xercesc::DOMAttr* const attribute
297   XMLSize_t attributeCount                     <<  94             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
                                                   >>  95       const G4String attName = Transcode(attribute->getName());
                                                   >>  96       const G4String attValue = Transcode(attribute->getValue());
298                                                    97 
299   for(XMLSize_t attribute_index = 0; attribute <<  98       if (attName=="n")  { n = eval.EvaluateInteger(attValue); } else
300       ++attribute_index)                       <<  99       if (attName=="ref") { ref = attValue; }
301   {                                            << 100    }
302     xercesc::DOMNode* attribute_node = attribu << 
303                                                << 
304     if(attribute_node->getNodeType() != xerces << 
305     {                                          << 
306       continue;                                << 
307     }                                          << 
308                                                << 
309     const xercesc::DOMAttr* const attribute =  << 
310       dynamic_cast<xercesc::DOMAttr*>(attribut << 
311     if(attribute == nullptr)                   << 
312     {                                          << 
313       G4Exception("G4GDMLReadMaterials::MEERea << 
314                   FatalException, "No attribut << 
315       return value;                            << 
316     }                                          << 
317     const G4String attName  = Transcode(attrib << 
318     const G4String attValue = Transcode(attrib << 
319                                                << 
320     if(attName == "value")                     << 
321     {                                          << 
322       value = eval.Evaluate(attValue);         << 
323     }                                          << 
324     else if(attName == "unit")                 << 
325     {                                          << 
326       unit = G4UnitDefinition::GetValueOf(attV << 
327       if(G4UnitDefinition::GetCategory(attValu << 
328       {                                        << 
329         G4Exception("G4GDMLReadMaterials::MEER << 
330                     FatalException, "Invalid u << 
331       }                                        << 
332     }                                          << 
333   }                                            << 
334                                                   101 
335   return value * unit;                         << 102    return n;
336 }                                                 103 }
337                                                   104 
338 // ------------------------------------------- << 105 G4double G4GDMLReadMaterials::DRead(const xercesc::DOMElement* const DElement)
339 void G4GDMLReadMaterials::ElementRead(         << 
340   const xercesc::DOMElement* const elementElem << 
341 {                                              << 
342   G4String name;                               << 
343   G4String formula;                            << 
344   G4double a = 0.0;                            << 
345   G4double Z = 0.0;                            << 
346                                                << 
347   const xercesc::DOMNamedNodeMap* const attrib << 
348     elementElement->getAttributes();           << 
349   XMLSize_t attributeCount = attributes->getLe << 
350                                                << 
351   for(XMLSize_t attribute_index = 0; attribute << 
352       ++attribute_index)                       << 
353   {                                            << 
354     xercesc::DOMNode* attribute_node = attribu << 
355                                                << 
356     if(attribute_node->getNodeType() != xerces << 
357     {                                          << 
358       continue;                                << 
359     }                                          << 
360                                                << 
361     const xercesc::DOMAttr* const attribute =  << 
362       dynamic_cast<xercesc::DOMAttr*>(attribut << 
363     if(attribute == nullptr)                   << 
364     {                                          << 
365       G4Exception("G4GDMLReadMaterials::Elemen << 
366                   FatalException, "No attribut << 
367       return;                                  << 
368     }                                          << 
369     const G4String attName  = Transcode(attrib << 
370     const G4String attValue = Transcode(attrib << 
371                                                << 
372     if(attName == "name")                      << 
373     {                                          << 
374       name = GenerateName(attValue);           << 
375     }                                          << 
376     else if(attName == "formula")              << 
377     {                                          << 
378       formula = attValue;                      << 
379     }                                          << 
380     else if(attName == "Z")                    << 
381     {                                          << 
382       Z = eval.Evaluate(attValue);             << 
383     }                                          << 
384   }                                            << 
385                                                << 
386   G4int nComponents = 0;                       << 
387                                                << 
388   for(xercesc::DOMNode* iter = elementElement- << 
389       iter                   = iter->getNextSi << 
390   {                                            << 
391     if(iter->getNodeType() != xercesc::DOMNode << 
392     {                                          << 
393       continue;                                << 
394     }                                          << 
395                                                << 
396     const xercesc::DOMElement* const child =   << 
397       dynamic_cast<xercesc::DOMElement*>(iter) << 
398     if(child == nullptr)                       << 
399     {                                          << 
400       G4Exception("G4GDMLReadMaterials::Elemen << 
401                   FatalException, "No child fo << 
402       return;                                  << 
403     }                                          << 
404     const G4String tag = Transcode(child->getT << 
405                                                << 
406     if(tag == "atom")                          << 
407     {                                          << 
408       a = AtomRead(child);                     << 
409     }                                          << 
410     else if(tag == "fraction")                 << 
411     {                                          << 
412       nComponents++;                           << 
413     }                                          << 
414   }                                            << 
415                                                << 
416   if(nComponents > 0)                          << 
417   {                                            << 
418     MixtureRead(elementElement,                << 
419                 new G4Element(Strip(name), for << 
420   }                                            << 
421   else                                         << 
422   {                                            << 
423     new G4Element(Strip(name), formula, Z, a); << 
424   }                                            << 
425 }                                              << 
426                                                << 
427 // ------------------------------------------- << 
428 G4double G4GDMLReadMaterials::FractionRead(    << 
429   const xercesc::DOMElement* const fractionEle << 
430 {                                                 106 {
431   G4double n = 0.0;                            << 107    G4double value = 0.0;
432                                                << 108    G4double unit = g/cm3;
433   const xercesc::DOMNamedNodeMap* const attrib << 
434     fractionElement->getAttributes();          << 
435   XMLSize_t attributeCount = attributes->getLe << 
436                                                << 
437   for(XMLSize_t attribute_index = 0; attribute << 
438       ++attribute_index)                       << 
439   {                                            << 
440     xercesc::DOMNode* attribute_node = attribu << 
441                                                << 
442     if(attribute_node->getNodeType() != xerces << 
443     {                                          << 
444       continue;                                << 
445     }                                          << 
446                                                << 
447     const xercesc::DOMAttr* const attribute =  << 
448       dynamic_cast<xercesc::DOMAttr*>(attribut << 
449     if(attribute == nullptr)                   << 
450     {                                          << 
451       G4Exception("G4GDMLReadMaterials::Fracti << 
452                   FatalException, "No attribut << 
453       return n;                                << 
454     }                                          << 
455     const G4String attName  = Transcode(attrib << 
456     const G4String attValue = Transcode(attrib << 
457                                                << 
458     if(attName == "n")                         << 
459     {                                          << 
460       n = eval.Evaluate(attValue);             << 
461     }                                          << 
462     else if(attName == "ref")                  << 
463     {                                          << 
464       ref = attValue;                          << 
465     }                                          << 
466   }                                            << 
467                                                   109 
468   return n;                                    << 110    const xercesc::DOMNamedNodeMap* const attributes
469 }                                              << 111          = DElement->getAttributes();
470                                                << 112    XMLSize_t attributeCount = attributes->getLength();
471 // ------------------------------------------- << 113 
472 void G4GDMLReadMaterials::IsotopeRead(         << 114    for (XMLSize_t attribute_index=0;
473   const xercesc::DOMElement* const isotopeElem << 115         attribute_index<attributeCount; attribute_index++)
474 {                                              << 116    {
475   G4String name;                               << 117       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
476   G4int Z    = 0;                              << 118 
477   G4int N    = 0;                              << 119       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
478   G4double a = 0.0;                            << 120       { continue; }
479                                                << 121 
480   const xercesc::DOMNamedNodeMap* const attrib << 122       const xercesc::DOMAttr* const attribute
481     isotopeElement->getAttributes();           << 123             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
482   XMLSize_t attributeCount = attributes->getLe << 124       const G4String attName = Transcode(attribute->getName());
483                                                << 125       const G4String attValue = Transcode(attribute->getValue());
484   for(XMLSize_t attribute_index = 0; attribute << 126 
485       ++attribute_index)                       << 127       if (attName=="value") { value = eval.Evaluate(attValue); } else
486   {                                            << 128       if (attName=="unit")  { unit = eval.Evaluate(attValue); }
487     xercesc::DOMNode* attribute_node = attribu << 129    }
488                                                << 
489     if(attribute_node->getNodeType() != xerces << 
490     {                                          << 
491       continue;                                << 
492     }                                          << 
493                                                << 
494     const xercesc::DOMAttr* const attribute =  << 
495       dynamic_cast<xercesc::DOMAttr*>(attribut << 
496     if(attribute == nullptr)                   << 
497     {                                          << 
498       G4Exception("G4GDMLReadMaterials::Isotop << 
499                   FatalException, "No attribut << 
500       return;                                  << 
501     }                                          << 
502     const G4String attName  = Transcode(attrib << 
503     const G4String attValue = Transcode(attrib << 
504                                                << 
505     if(attName == "name")                      << 
506     {                                          << 
507       name = GenerateName(attValue);           << 
508     }                                          << 
509     else if(attName == "Z")                    << 
510     {                                          << 
511       Z = eval.EvaluateInteger(attValue);      << 
512     }                                          << 
513     else if(attName == "N")                    << 
514     {                                          << 
515       N = eval.EvaluateInteger(attValue);      << 
516     }                                          << 
517   }                                            << 
518                                                << 
519   for(xercesc::DOMNode* iter = isotopeElement- << 
520       iter                   = iter->getNextSi << 
521   {                                            << 
522     if(iter->getNodeType() != xercesc::DOMNode << 
523     {                                          << 
524       continue;                                << 
525     }                                          << 
526                                                << 
527     const xercesc::DOMElement* const child =   << 
528       dynamic_cast<xercesc::DOMElement*>(iter) << 
529     if(child == nullptr)                       << 
530     {                                          << 
531       G4Exception("G4GDMLReadMaterials::Isotop << 
532                   FatalException, "No child fo << 
533       return;                                  << 
534     }                                          << 
535     const G4String tag = Transcode(child->getT << 
536                                                << 
537     if(tag == "atom")                          << 
538     {                                          << 
539       a = AtomRead(child);                     << 
540     }                                          << 
541   }                                            << 
542                                                   130 
543   new G4Isotope(Strip(name), Z, N, a);         << 131    return value*unit;
544 }                                                 132 }
545                                                   133 
546 // ------------------------------------------- << 134 G4double G4GDMLReadMaterials::PRead(const xercesc::DOMElement* const PElement)
547 void G4GDMLReadMaterials::MaterialRead(        << 
548   const xercesc::DOMElement* const materialEle << 
549 {                                                 135 {
550   G4String name;                               << 136    G4double value = STP_Pressure;
551   G4double Z    = 0.0;                         << 137    G4double unit = pascal;
552   G4double a    = 0.0;                         << 
553   G4double D    = 0.0;                         << 
554   G4State state = kStateUndefined;             << 
555   G4double T    = NTP_Temperature;             << 
556   G4double P    = STP_Pressure;                << 
557   G4double MEE  = -1.0;                        << 
558                                                << 
559   const xercesc::DOMNamedNodeMap* const attrib << 
560     materialElement->getAttributes();          << 
561   XMLSize_t attributeCount = attributes->getLe << 
562                                                << 
563   for(XMLSize_t attribute_index = 0; attribute << 
564       ++attribute_index)                       << 
565   {                                            << 
566     xercesc::DOMNode* attribute_node = attribu << 
567                                                << 
568     if(attribute_node->getNodeType() != xerces << 
569     {                                          << 
570       continue;                                << 
571     }                                          << 
572                                                << 
573     const xercesc::DOMAttr* const attribute =  << 
574       dynamic_cast<xercesc::DOMAttr*>(attribut << 
575     if(attribute == nullptr)                   << 
576     {                                          << 
577       G4Exception("G4GDMLReadMaterials::Materi << 
578                   FatalException, "No attribut << 
579       return;                                  << 
580     }                                          << 
581     const G4String attName  = Transcode(attrib << 
582     const G4String attValue = Transcode(attrib << 
583                                                << 
584     if(attName == "name")                      << 
585     {                                          << 
586       name = GenerateName(attValue);           << 
587     }                                          << 
588     else if(attName == "Z")                    << 
589     {                                          << 
590       Z = eval.Evaluate(attValue);             << 
591     }                                          << 
592     else if(attName == "state")                << 
593     {                                          << 
594       if(attValue == "solid")                  << 
595       {                                        << 
596         state = kStateSolid;                   << 
597       }                                        << 
598       else if(attValue == "liquid")            << 
599       {                                        << 
600         state = kStateLiquid;                  << 
601       }                                        << 
602       else if(attValue == "gas")               << 
603       {                                        << 
604         state = kStateGas;                     << 
605       }                                        << 
606     }                                          << 
607   }                                            << 
608                                                   138 
609   std::size_t nComponents = 0;                 << 139    const xercesc::DOMNamedNodeMap* const attributes = PElement->getAttributes();
                                                   >> 140    XMLSize_t attributeCount = attributes->getLength();
610                                                   141 
611   for(xercesc::DOMNode* iter = materialElement << 142    for (XMLSize_t attribute_index=0;
612                         iter != nullptr; iter  << 143         attribute_index<attributeCount; attribute_index++)
613   {                                            << 144    {
614     if(iter->getNodeType() != xercesc::DOMNode << 145       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
615     {                                          << 146 
616       continue;                                << 147       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
617     }                                          << 148       { continue; }
618                                                << 149 
619     const xercesc::DOMElement* const child =   << 150       const xercesc::DOMAttr* const attribute
620       dynamic_cast<xercesc::DOMElement*>(iter) << 151             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
621     if(child == nullptr)                       << 152       const G4String attName = Transcode(attribute->getName());
622     {                                          << 153       const G4String attValue = Transcode(attribute->getValue());
623       G4Exception("G4GDMLReadMaterials::Materi << 154 
624                   FatalException, "No child fo << 155       if (attName=="value") { value = eval.Evaluate(attValue); } else
625       return;                                  << 156       if (attName=="unit")  { unit = eval.Evaluate(attValue); }
626     }                                          << 157    }
627     const G4String tag = Transcode(child->getT << 
628                                                << 
629     if(tag == "atom")                          << 
630     {                                          << 
631       a = AtomRead(child);                     << 
632     }                                          << 
633     else if(tag == "Dref")                     << 
634     {                                          << 
635       D = GetQuantity(GenerateName(RefRead(chi << 
636     }                                          << 
637     else if(tag == "Pref")                     << 
638     {                                          << 
639       P = GetQuantity(GenerateName(RefRead(chi << 
640     }                                          << 
641     else if(tag == "Tref")                     << 
642     {                                          << 
643       T = GetQuantity(GenerateName(RefRead(chi << 
644     }                                          << 
645     else if(tag == "MEEref")                   << 
646     {                                          << 
647       MEE = GetQuantity(GenerateName(RefRead(c << 
648     }                                          << 
649     else if(tag == "D")                        << 
650     {                                          << 
651       D = DRead(child);                        << 
652     }                                          << 
653     else if(tag == "P")                        << 
654     {                                          << 
655       P = PRead(child);                        << 
656     }                                          << 
657     else if(tag == "T")                        << 
658     {                                          << 
659       T = TRead(child);                        << 
660     }                                          << 
661     else if(tag == "MEE")                      << 
662     {                                          << 
663       MEE = MEERead(child);                    << 
664     }                                          << 
665     else if(tag == "fraction" || tag == "compo << 
666     {                                          << 
667       nComponents++;                           << 
668     }                                          << 
669   }                                            << 
670                                                << 
671   G4Material* material = nullptr;              << 
672                                                << 
673   if(nComponents == 0)                         << 
674   {                                            << 
675     material = new G4Material(Strip(name), Z,  << 
676   }                                            << 
677   else                                         << 
678   {                                            << 
679     material = new G4Material(Strip(name), D,  << 
680     MixtureRead(materialElement, material);    << 
681   }                                            << 
682   if(MEE != -1)  // ionisation potential (mean << 
683   {                                            << 
684     material->GetIonisation()->SetMeanExcitati << 
685   }                                            << 
686                                                << 
687   for(xercesc::DOMNode* iter = materialElement << 
688                         iter != nullptr; iter  << 
689   {                                            << 
690     if(iter->getNodeType() != xercesc::DOMNode << 
691     {                                          << 
692       continue;                                << 
693     }                                          << 
694                                                << 
695     const xercesc::DOMElement* const child =   << 
696       dynamic_cast<xercesc::DOMElement*>(iter) << 
697     if(child == nullptr)                       << 
698     {                                          << 
699       G4Exception("G4GDMLReadMaterials::Materi << 
700                   FatalException, "No child fo << 
701       return;                                  << 
702     }                                          << 
703     const G4String tag = Transcode(child->getT << 
704                                                << 
705     if(tag == "property")                      << 
706     {                                          << 
707       PropertyRead(child, material);           << 
708     }                                          << 
709   }                                            << 
710 }                                              << 
711                                                   158 
712 // ------------------------------------------- << 159    return value*unit;
713 void G4GDMLReadMaterials::MixtureRead(         << 
714   const xercesc::DOMElement* const mixtureElem << 
715 {                                              << 
716   for(xercesc::DOMNode* iter = mixtureElement- << 
717       iter                   = iter->getNextSi << 
718   {                                            << 
719     if(iter->getNodeType() != xercesc::DOMNode << 
720     {                                          << 
721       continue;                                << 
722     }                                          << 
723                                                << 
724     const xercesc::DOMElement* const child =   << 
725       dynamic_cast<xercesc::DOMElement*>(iter) << 
726     if(child == nullptr)                       << 
727     {                                          << 
728       G4Exception("G4GDMLReadMaterials::Mixtur << 
729                   FatalException, "No child fo << 
730       return;                                  << 
731     }                                          << 
732     const G4String tag = Transcode(child->getT << 
733                                                << 
734     if(tag == "fraction")                      << 
735     {                                          << 
736       G4String ref;                            << 
737       G4double n = FractionRead(child, ref);   << 
738       element->AddIsotope(GetIsotope(GenerateN << 
739     }                                          << 
740   }                                            << 
741 }                                                 160 }
742                                                   161 
743 // ------------------------------------------- << 162 G4double G4GDMLReadMaterials::TRead(const xercesc::DOMElement* const TElement)
744 void G4GDMLReadMaterials::MixtureRead(         << 
745   const xercesc::DOMElement* const mixtureElem << 
746 {                                                 163 {
747   for(xercesc::DOMNode* iter = mixtureElement- << 164    G4double value = STP_Temperature;
748       iter                   = iter->getNextSi << 165    G4double unit = kelvin;
749   {                                            << 
750     if(iter->getNodeType() != xercesc::DOMNode << 
751     {                                          << 
752       continue;                                << 
753     }                                          << 
754                                                << 
755     const xercesc::DOMElement* const child =   << 
756       dynamic_cast<xercesc::DOMElement*>(iter) << 
757     if(child == nullptr)                       << 
758     {                                          << 
759       G4Exception("G4GDMLReadMaterials::Mixtur << 
760                   FatalException, "No child fo << 
761       return;                                  << 
762     }                                          << 
763     const G4String tag = Transcode(child->getT << 
764                                                << 
765     if(tag == "fraction")                      << 
766     {                                          << 
767       G4String ref;                            << 
768       G4double n = FractionRead(child, ref);   << 
769                                                << 
770       G4Material* materialPtr = GetMaterial(Ge << 
771       G4Element* elementPtr   = GetElement(Gen << 
772                                                   166 
773       if(elementPtr != nullptr)                << 167    const xercesc::DOMNamedNodeMap* const attributes = TElement->getAttributes();
774       {                                        << 168    XMLSize_t attributeCount = attributes->getLength();
775         material->AddElement(elementPtr, n);   << 
776       }                                        << 
777       else if(materialPtr != nullptr)          << 
778       {                                        << 
779         material->AddMaterial(materialPtr, n); << 
780       }                                        << 
781                                                   169 
782       if((materialPtr == nullptr) && (elementP << 170    for (XMLSize_t attribute_index=0;
                                                   >> 171         attribute_index<attributeCount; attribute_index++)
                                                   >> 172    {
                                                   >> 173       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
                                                   >> 174 
                                                   >> 175       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
                                                   >> 176       { continue; }
                                                   >> 177 
                                                   >> 178       const xercesc::DOMAttr* const attribute
                                                   >> 179             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
                                                   >> 180       const G4String attName = Transcode(attribute->getName());
                                                   >> 181       const G4String attValue = Transcode(attribute->getValue());
                                                   >> 182 
                                                   >> 183       if (attName=="value") { value = eval.Evaluate(attValue); } else
                                                   >> 184       if (attName=="unit")  { unit = eval.Evaluate(attValue); }
                                                   >> 185    }
                                                   >> 186 
                                                   >> 187    return value*unit;
                                                   >> 188 }
                                                   >> 189 
                                                   >> 190 void G4GDMLReadMaterials::
                                                   >> 191 ElementRead(const xercesc::DOMElement* const elementElement) 
                                                   >> 192 {
                                                   >> 193    G4String name;
                                                   >> 194    G4String formula;
                                                   >> 195    G4double a = 0.0;
                                                   >> 196    G4double Z = 0.0;
                                                   >> 197 
                                                   >> 198    const xercesc::DOMNamedNodeMap* const attributes
                                                   >> 199          = elementElement->getAttributes();
                                                   >> 200    XMLSize_t attributeCount = attributes->getLength();
                                                   >> 201 
                                                   >> 202    for (XMLSize_t attribute_index=0;
                                                   >> 203         attribute_index<attributeCount; attribute_index++)
                                                   >> 204    {
                                                   >> 205       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
                                                   >> 206 
                                                   >> 207       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
                                                   >> 208       { continue; }
                                                   >> 209 
                                                   >> 210       const xercesc::DOMAttr* const attribute
                                                   >> 211             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
                                                   >> 212       const G4String attName = Transcode(attribute->getName());
                                                   >> 213       const G4String attValue = Transcode(attribute->getValue());
                                                   >> 214 
                                                   >> 215       if (attName=="name") { name = GenerateName(attValue); } else
                                                   >> 216       if (attName=="formula") { formula = attValue; } else
                                                   >> 217       if (attName=="Z") { Z = eval.Evaluate(attValue); }
                                                   >> 218    }
                                                   >> 219 
                                                   >> 220    G4int nComponents = 0;
                                                   >> 221 
                                                   >> 222    for (xercesc::DOMNode* iter = elementElement->getFirstChild();
                                                   >> 223         iter != 0; iter = iter->getNextSibling())
                                                   >> 224    {
                                                   >> 225       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
                                                   >> 226 
                                                   >> 227       const xercesc::DOMElement* const child
                                                   >> 228             = dynamic_cast<xercesc::DOMElement*>(iter);
                                                   >> 229       const G4String tag = Transcode(child->getTagName());
                                                   >> 230 
                                                   >> 231       if (tag=="atom") { a = AtomRead(child); }  else
                                                   >> 232       if (tag=="fraction") { nComponents++; }
                                                   >> 233    }
                                                   >> 234 
                                                   >> 235    if (nComponents>0)
                                                   >> 236    {
                                                   >> 237      MixtureRead(elementElement,
                                                   >> 238                  new G4Element(Strip(name),formula,nComponents));
                                                   >> 239    }
                                                   >> 240    else
                                                   >> 241    {
                                                   >> 242      new G4Element(Strip(name),formula,Z,a);
                                                   >> 243    }
                                                   >> 244 }
                                                   >> 245 
                                                   >> 246 G4double G4GDMLReadMaterials::
                                                   >> 247 FractionRead(const xercesc::DOMElement* const fractionElement, G4String& ref)
                                                   >> 248 {
                                                   >> 249    G4double n = 0.0;
                                                   >> 250 
                                                   >> 251    const xercesc::DOMNamedNodeMap* const attributes
                                                   >> 252          = fractionElement->getAttributes();
                                                   >> 253    XMLSize_t attributeCount = attributes->getLength();
                                                   >> 254 
                                                   >> 255    for (XMLSize_t attribute_index=0;
                                                   >> 256         attribute_index<attributeCount; attribute_index++)
                                                   >> 257    {
                                                   >> 258       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
                                                   >> 259 
                                                   >> 260       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
                                                   >> 261       { continue; }
                                                   >> 262 
                                                   >> 263       const xercesc::DOMAttr* const attribute
                                                   >> 264             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
                                                   >> 265       const G4String attName = Transcode(attribute->getName());
                                                   >> 266       const G4String attValue = Transcode(attribute->getValue());
                                                   >> 267 
                                                   >> 268       if (attName=="n")   { n = eval.Evaluate(attValue); } else
                                                   >> 269       if (attName=="ref") { ref = attValue; }
                                                   >> 270    }
                                                   >> 271 
                                                   >> 272    return n;
                                                   >> 273 }
                                                   >> 274 
                                                   >> 275 void G4GDMLReadMaterials::
                                                   >> 276 IsotopeRead(const xercesc::DOMElement* const isotopeElement)
                                                   >> 277 {
                                                   >> 278    G4String name;
                                                   >> 279    G4int Z = 0;
                                                   >> 280    G4int N = 0;
                                                   >> 281    G4double a = 0.0;
                                                   >> 282 
                                                   >> 283    const xercesc::DOMNamedNodeMap* const attributes
                                                   >> 284          = isotopeElement->getAttributes();
                                                   >> 285    XMLSize_t attributeCount = attributes->getLength();
                                                   >> 286 
                                                   >> 287    for (XMLSize_t attribute_index=0;
                                                   >> 288         attribute_index<attributeCount;attribute_index++)
                                                   >> 289    {
                                                   >> 290       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
                                                   >> 291 
                                                   >> 292       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
                                                   >> 293       { continue; }
                                                   >> 294 
                                                   >> 295       const xercesc::DOMAttr* const attribute
                                                   >> 296             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
                                                   >> 297       const G4String attName = Transcode(attribute->getName());
                                                   >> 298       const G4String attValue = Transcode(attribute->getValue());
                                                   >> 299 
                                                   >> 300       if (attName=="name") { name = GenerateName(attValue); } else
                                                   >> 301       if (attName=="Z") { Z = eval.EvaluateInteger(attValue); } else
                                                   >> 302       if (attName=="N") { N = eval.EvaluateInteger(attValue); }
                                                   >> 303    }
                                                   >> 304 
                                                   >> 305    for (xercesc::DOMNode* iter = isotopeElement->getFirstChild();
                                                   >> 306         iter != 0; iter = iter->getNextSibling())
                                                   >> 307    {
                                                   >> 308       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
                                                   >> 309 
                                                   >> 310       const xercesc::DOMElement* const child
                                                   >> 311             = dynamic_cast<xercesc::DOMElement*>(iter);
                                                   >> 312       const G4String tag = Transcode(child->getTagName());
                                                   >> 313 
                                                   >> 314       if (tag=="atom")  { a = AtomRead(child); }
                                                   >> 315    }
                                                   >> 316 
                                                   >> 317    new G4Isotope(Strip(name),Z,N,a);
                                                   >> 318 }
                                                   >> 319 
                                                   >> 320 void G4GDMLReadMaterials::
                                                   >> 321 MaterialRead(const xercesc::DOMElement* const materialElement)
                                                   >> 322 {
                                                   >> 323    G4String name;
                                                   >> 324    G4double Z = 0.0;
                                                   >> 325    G4double a = 0.0;
                                                   >> 326    G4double D = 0.0;
                                                   >> 327    G4State state = kStateUndefined;
                                                   >> 328    G4double T = STP_Temperature;
                                                   >> 329    G4double P = STP_Pressure;
                                                   >> 330 
                                                   >> 331    const xercesc::DOMNamedNodeMap* const attributes
                                                   >> 332          = materialElement->getAttributes();
                                                   >> 333    XMLSize_t attributeCount = attributes->getLength();
                                                   >> 334 
                                                   >> 335    for (XMLSize_t attribute_index=0;
                                                   >> 336         attribute_index<attributeCount; attribute_index++)
                                                   >> 337    {
                                                   >> 338       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
                                                   >> 339 
                                                   >> 340       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
                                                   >> 341       { continue; }
                                                   >> 342 
                                                   >> 343       const xercesc::DOMAttr* const attribute
                                                   >> 344             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
                                                   >> 345       const G4String attName = Transcode(attribute->getName());
                                                   >> 346       const G4String attValue = Transcode(attribute->getValue());
                                                   >> 347 
                                                   >> 348       if (attName=="name") { name = GenerateName(attValue); } else
                                                   >> 349       if (attName=="Z") { Z = eval.Evaluate(attValue); } else
                                                   >> 350       if (attName=="state")
                                                   >> 351       {
                                                   >> 352          if (attValue=="solid")  { state = kStateSolid;  } else
                                                   >> 353          if (attValue=="liquid") { state = kStateLiquid; } else
                                                   >> 354          if (attValue=="gas")    { state = kStateGas; }
                                                   >> 355       }
                                                   >> 356    }
                                                   >> 357 
                                                   >> 358    size_t nComponents = 0;
                                                   >> 359 
                                                   >> 360    for (xercesc::DOMNode* iter = materialElement->getFirstChild();
                                                   >> 361         iter != 0; iter = iter->getNextSibling())
                                                   >> 362    {
                                                   >> 363       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
                                                   >> 364 
                                                   >> 365       const xercesc::DOMElement* const child
                                                   >> 366             = dynamic_cast<xercesc::DOMElement*>(iter);
                                                   >> 367       const G4String tag = Transcode(child->getTagName());
                                                   >> 368 
                                                   >> 369       if (tag=="atom") { a = AtomRead(child); } else
                                                   >> 370       if (tag=="Dref") { D = GetQuantity(GenerateName(RefRead(child))); } else
                                                   >> 371       if (tag=="Pref") { P = GetQuantity(GenerateName(RefRead(child))); } else
                                                   >> 372       if (tag=="Tref") { T = GetQuantity(GenerateName(RefRead(child))); } else
                                                   >> 373       if (tag=="D") { D = DRead(child); } else
                                                   >> 374       if (tag=="P") { P = PRead(child); } else
                                                   >> 375       if (tag=="T") { T = TRead(child); } else
                                                   >> 376       if (tag=="fraction" || tag=="composite")  { nComponents++; }
                                                   >> 377    }
                                                   >> 378 
                                                   >> 379    G4Material* material =  0;
                                                   >> 380 
                                                   >> 381    if (nComponents==0)
                                                   >> 382    {
                                                   >> 383      material = new G4Material(Strip(name),Z,a,D,state,T,P);
                                                   >> 384    }
                                                   >> 385    else
                                                   >> 386    {
                                                   >> 387      material = new G4Material(Strip(name),D,nComponents,state,T,P);
                                                   >> 388      MixtureRead(materialElement, material);
                                                   >> 389    }
                                                   >> 390 
                                                   >> 391    for (xercesc::DOMNode* iter = materialElement->getFirstChild();
                                                   >> 392         iter != 0; iter = iter->getNextSibling())
                                                   >> 393    {
                                                   >> 394       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
                                                   >> 395 
                                                   >> 396       const xercesc::DOMElement* const child
                                                   >> 397             = dynamic_cast<xercesc::DOMElement*>(iter);
                                                   >> 398       const G4String tag = Transcode(child->getTagName());
                                                   >> 399 
                                                   >> 400       if (tag=="property") { PropertyRead(child,material); }
                                                   >> 401    }
                                                   >> 402 }
                                                   >> 403 
                                                   >> 404 void G4GDMLReadMaterials::
                                                   >> 405 MixtureRead(const xercesc::DOMElement *const mixtureElement, G4Element *element)
                                                   >> 406 {
                                                   >> 407    for (xercesc::DOMNode* iter = mixtureElement->getFirstChild();
                                                   >> 408         iter != 0; iter = iter->getNextSibling())
                                                   >> 409    {
                                                   >> 410       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
                                                   >> 411 
                                                   >> 412       const xercesc::DOMElement* const child
                                                   >> 413             = dynamic_cast<xercesc::DOMElement*>(iter);
                                                   >> 414       const G4String tag = Transcode(child->getTagName());
                                                   >> 415 
                                                   >> 416       if (tag=="fraction")
                                                   >> 417       {
                                                   >> 418          G4String ref;
                                                   >> 419          G4double n = FractionRead(child,ref);
                                                   >> 420          element->AddIsotope(GetIsotope(GenerateName(ref,true)),n);
                                                   >> 421       }
                                                   >> 422    }
                                                   >> 423 }
                                                   >> 424 
                                                   >> 425 void G4GDMLReadMaterials::
                                                   >> 426 MixtureRead(const xercesc::DOMElement *const mixtureElement,
                                                   >> 427             G4Material *material)
                                                   >> 428 {
                                                   >> 429    for (xercesc::DOMNode* iter = mixtureElement->getFirstChild();
                                                   >> 430         iter != 0; iter = iter->getNextSibling())
                                                   >> 431    {
                                                   >> 432       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
                                                   >> 433 
                                                   >> 434       const xercesc::DOMElement* const child
                                                   >> 435             = dynamic_cast<xercesc::DOMElement*>(iter);
                                                   >> 436       const G4String tag = Transcode(child->getTagName());
                                                   >> 437 
                                                   >> 438       if (tag=="fraction")
                                                   >> 439       {
                                                   >> 440          G4String ref;
                                                   >> 441          G4double n = FractionRead(child,ref);
                                                   >> 442          
                                                   >> 443          G4Material *materialPtr = GetMaterial(GenerateName(ref,true), false);
                                                   >> 444          G4Element *elementPtr = GetElement(GenerateName(ref,true), false);
                                                   >> 445 
                                                   >> 446          if (materialPtr != 0) { material->AddMaterial(materialPtr,n); } else
                                                   >> 447          if (elementPtr != 0)  { material->AddElement(elementPtr,n); }
                                                   >> 448 
                                                   >> 449          if ((materialPtr == 0) && (elementPtr == 0))
                                                   >> 450          {
                                                   >> 451             G4String error_msg = "Referenced material/element '"
                                                   >> 452                                + GenerateName(ref,true) + "' was not found!";
                                                   >> 453             G4Exception("G4GDMLReadMaterials::MixtureRead()", "InvalidSetup",
                                                   >> 454                         FatalException, error_msg);   
                                                   >> 455          }
                                                   >> 456       } 
                                                   >> 457       else if (tag=="composite")
                                                   >> 458       {
                                                   >> 459          G4String ref;
                                                   >> 460          G4int n = CompositeRead(child,ref);
                                                   >> 461 
                                                   >> 462          G4Element *elementPtr = GetElement(GenerateName(ref,true));
                                                   >> 463          material->AddElement(elementPtr,n);
                                                   >> 464       }
                                                   >> 465    }
                                                   >> 466 }
                                                   >> 467 
                                                   >> 468 void G4GDMLReadMaterials::
                                                   >> 469 PropertyRead(const xercesc::DOMElement* const propertyElement,
                                                   >> 470              G4Material* material)
                                                   >> 471 {
                                                   >> 472    G4String name;
                                                   >> 473    G4String ref;
                                                   >> 474    G4GDMLMatrix matrix;
                                                   >> 475 
                                                   >> 476    const xercesc::DOMNamedNodeMap* const attributes
                                                   >> 477          = propertyElement->getAttributes();
                                                   >> 478    XMLSize_t attributeCount = attributes->getLength();
                                                   >> 479 
                                                   >> 480    for (XMLSize_t attribute_index=0;
                                                   >> 481         attribute_index<attributeCount; attribute_index++)
                                                   >> 482    {
                                                   >> 483       xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
                                                   >> 484 
                                                   >> 485       if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
                                                   >> 486       { continue; }
                                                   >> 487 
                                                   >> 488       const xercesc::DOMAttr* const attribute
                                                   >> 489             = dynamic_cast<xercesc::DOMAttr*>(attribute_node);   
                                                   >> 490       const G4String attName = Transcode(attribute->getName());
                                                   >> 491       const G4String attValue = Transcode(attribute->getValue());
                                                   >> 492 
                                                   >> 493       if (attName=="name") { name = GenerateName(attValue); } else
                                                   >> 494       if (attName=="ref")  { matrix = GetMatrix(ref=attValue); }
                                                   >> 495    }
                                                   >> 496 
                                                   >> 497    if (matrix.GetCols() != 2)
                                                   >> 498    {
                                                   >> 499      G4String error_msg = "Referenced matrix '" + ref
                                                   >> 500             + "' should have \n two columns as a property table for material: "
                                                   >> 501             + material->GetName();
                                                   >> 502      G4Exception("G4GDMLReadMaterials::PropertyRead()", "InvalidRead",
                                                   >> 503                  FatalException, error_msg);
                                                   >> 504    }
                                                   >> 505    if (matrix.GetRows() == 0) { return; }
                                                   >> 506 
                                                   >> 507    G4MaterialPropertiesTable* matprop = material->GetMaterialPropertiesTable();
                                                   >> 508    if (!matprop)
                                                   >> 509    {
                                                   >> 510      material->SetMaterialPropertiesTable(
                                                   >> 511                matprop = new G4MaterialPropertiesTable());
                                                   >> 512    }
                                                   >> 513    G4MaterialPropertyVector* propvect = new G4MaterialPropertyVector(0,0,0);
                                                   >> 514    for (size_t i=0; i<matrix.GetRows(); i++)
                                                   >> 515    {
                                                   >> 516      propvect->AddElement(matrix.Get(i,0),matrix.Get(i,1));
                                                   >> 517    }
                                                   >> 518    matprop->AddProperty(Strip(name),propvect);
                                                   >> 519 }
                                                   >> 520 
                                                   >> 521 void G4GDMLReadMaterials::
                                                   >> 522 MaterialsRead(const xercesc::DOMElement* const materialsElement)
                                                   >> 523 {
                                                   >> 524    G4cout << "G4GDML: Reading materials..." << G4endl;
                                                   >> 525 
                                                   >> 526    for (xercesc::DOMNode* iter = materialsElement->getFirstChild();
                                                   >> 527         iter != 0; iter = iter->getNextSibling())
                                                   >> 528    {
                                                   >> 529       if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
                                                   >> 530 
                                                   >> 531       const xercesc::DOMElement* const child
                                                   >> 532             = dynamic_cast<xercesc::DOMElement*>(iter);
                                                   >> 533       const G4String tag = Transcode(child->getTagName());
                                                   >> 534       
                                                   >> 535       if (tag=="define")   { DefineRead(child);  }  else 
                                                   >> 536       if (tag=="element")  { ElementRead(child); }  else 
                                                   >> 537       if (tag=="isotope")  { IsotopeRead(child); }  else 
                                                   >> 538       if (tag=="material") { MaterialRead(child); }
                                                   >> 539       else
783       {                                           540       {
784         G4String error_msg = "Referenced mater << 541         G4String error_msg = "Unknown tag in materials: " + tag;
785                              GenerateName(ref, << 542         G4Exception("G4GDMLReadMaterials::MaterialsRead()", "InvalidSetup",
786         G4Exception("G4GDMLReadMaterials::Mixt << 
787                     FatalException, error_msg)    543                     FatalException, error_msg);
788       }                                           544       }
789     }                                          << 545    }
790     else if(tag == "composite")                << 
791     {                                          << 
792       G4String ref;                            << 
793       G4int n = CompositeRead(child, ref);     << 
794                                                << 
795       G4Element* elementPtr = GetElement(Gener << 
796       material->AddElement(elementPtr, n);     << 
797     }                                          << 
798   }                                            << 
799 }                                              << 
800                                                << 
801 // ------------------------------------------- << 
802 void G4GDMLReadMaterials::PropertyRead(        << 
803   const xercesc::DOMElement* const propertyEle << 
804 {                                              << 
805   G4String name;                               << 
806   G4String ref;                                << 
807   G4GDMLMatrix matrix;                         << 
808                                                << 
809   const xercesc::DOMNamedNodeMap* const attrib << 
810     propertyElement->getAttributes();          << 
811   XMLSize_t attributeCount = attributes->getLe << 
812                                                << 
813   for(XMLSize_t attribute_index = 0; attribute << 
814       ++attribute_index)                       << 
815   {                                            << 
816     xercesc::DOMNode* attribute_node = attribu << 
817                                                << 
818     if(attribute_node->getNodeType() != xerces << 
819     {                                          << 
820       continue;                                << 
821     }                                          << 
822                                                << 
823     const xercesc::DOMAttr* const attribute =  << 
824       dynamic_cast<xercesc::DOMAttr*>(attribut << 
825     if(attribute == nullptr)                   << 
826     {                                          << 
827       G4Exception("G4GDMLReadMaterials::Proper << 
828                   FatalException, "No attribut << 
829       return;                                  << 
830     }                                          << 
831     const G4String attName  = Transcode(attrib << 
832     const G4String attValue = Transcode(attrib << 
833                                                << 
834     if(attName == "name")                      << 
835     {                                          << 
836       name = GenerateName(attValue);           << 
837     }                                          << 
838     else if(attName == "ref")                  << 
839     {                                          << 
840       matrix = GetMatrix(ref = attValue);      << 
841     }                                          << 
842   }                                            << 
843                                                << 
844   /*                                           << 
845   if (matrix.GetCols() != 2)                   << 
846   {                                            << 
847     G4String error_msg = "Referenced matrix '" << 
848            + "' should have \n two columns as  << 
849            + material->GetName();              << 
850     G4Exception("G4GDMLReadMaterials::Property << 
851                 FatalException, error_msg);    << 
852   }                                            << 
853   */                                           << 
854                                                << 
855   if(matrix.GetRows() == 0)                    << 
856   {                                            << 
857     return;                                    << 
858   }                                            << 
859                                                << 
860   G4MaterialPropertiesTable* matprop = materia << 
861   if(matprop == nullptr)                       << 
862   {                                            << 
863     matprop = new G4MaterialPropertiesTable(); << 
864     material->SetMaterialPropertiesTable(matpr << 
865   }                                            << 
866   if(matrix.GetCols() == 1)  // constant prope << 
867   {                                            << 
868     matprop->AddConstProperty(Strip(name), mat << 
869   }                                            << 
870   else  // build the material properties vecto << 
871   {                                            << 
872     G4MaterialPropertyVector* propvect = new G << 
873     for(std::size_t i = 0; i < matrix.GetRows( << 
874     {                                          << 
875       propvect->InsertValues(matrix.Get(i, 0), << 
876     }                                          << 
877     matprop->AddProperty(Strip(name), propvect << 
878   }                                            << 
879 }                                                 546 }
880                                                   547 
881 // ------------------------------------------- << 548 G4Element* G4GDMLReadMaterials::
882 void G4GDMLReadMaterials::MaterialsRead(       << 549 GetElement(const G4String& ref, G4bool verbose) const
883   const xercesc::DOMElement* const materialsEl << 
884 {                                                 550 {
885 #ifdef G4VERBOSE                               << 551    G4Element* elementPtr = G4Element::GetElement(ref,false);
886   G4cout << "G4GDML: Reading materials..." <<  << 
887 #endif                                         << 
888   for(xercesc::DOMNode* iter = materialsElemen << 
889                         iter != nullptr; iter  << 
890   {                                            << 
891     if(iter->getNodeType() != xercesc::DOMNode << 
892     {                                          << 
893       continue;                                << 
894     }                                          << 
895                                                << 
896     const xercesc::DOMElement* const child =   << 
897       dynamic_cast<xercesc::DOMElement*>(iter) << 
898     if(child == nullptr)                       << 
899     {                                          << 
900       G4Exception("G4GDMLReadMaterials::Materi << 
901                   FatalException, "No child fo << 
902       return;                                  << 
903     }                                          << 
904     const G4String tag = Transcode(child->getT << 
905                                                << 
906     if(tag == "define")                        << 
907     {                                          << 
908       DefineRead(child);                       << 
909     }                                          << 
910     else if(tag == "element")                  << 
911     {                                          << 
912       ElementRead(child);                      << 
913     }                                          << 
914     else if(tag == "isotope")                  << 
915     {                                          << 
916       IsotopeRead(child);                      << 
917     }                                          << 
918     else if(tag == "material")                 << 
919     {                                          << 
920       MaterialRead(child);                     << 
921     }                                          << 
922     else                                       << 
923     {                                          << 
924       G4String error_msg = "Unknown tag in mat << 
925       G4Exception("G4GDMLReadMaterials::Materi << 
926                   FatalException, error_msg);  << 
927     }                                          << 
928   }                                            << 
929 }                                              << 
930                                                   552 
931 // ------------------------------------------- << 553    if (!elementPtr)
932 G4Element* G4GDMLReadMaterials::GetElement(con << 554    {
933                                            G4b << 555      elementPtr = G4NistManager::Instance()->FindOrBuildElement(ref);
934 {                                              << 556    }
935   G4Element* elementPtr = G4Element::GetElemen << 
936                                                   557 
937   if(elementPtr == nullptr)                    << 558    if (verbose && !elementPtr)
938   {                                            << 559    {
939     elementPtr = G4NistManager::Instance()->Fi << 560      G4String error_msg = "Referenced element '" + ref + "' was not found!";
940   }                                            << 561      G4Exception("G4GDMLReadMaterials::GetElement()", "InvalidRead",
941                                                << 562                  FatalException, error_msg);
942   if(verbose && elementPtr == nullptr)         << 563    }
943   {                                            << 
944     G4String error_msg = "Referenced element ' << 
945     G4Exception("G4GDMLReadMaterials::GetEleme << 
946                 FatalException, error_msg);    << 
947   }                                            << 
948                                                   564 
949   return elementPtr;                           << 565    return elementPtr;
950 }                                                 566 }
951                                                   567 
952 // ------------------------------------------- << 
953 G4Isotope* G4GDMLReadMaterials::GetIsotope(con    568 G4Isotope* G4GDMLReadMaterials::GetIsotope(const G4String& ref,
954                                            G4b    569                                            G4bool verbose) const
955 {                                                 570 {
956   G4Isotope* isotopePtr = G4Isotope::GetIsotop << 571    G4Isotope* isotopePtr = G4Isotope::GetIsotope(ref,false);
957                                                   572 
958   if(verbose && isotopePtr == nullptr)         << 573    if (verbose && !isotopePtr)
959   {                                            << 574    {
960     G4String error_msg = "Referenced isotope ' << 575      G4String error_msg = "Referenced isotope '" + ref + "' was not found!";
961     G4Exception("G4GDMLReadMaterials::GetIsoto << 576      G4Exception("G4GDMLReadMaterials::GetIsotope()", "InvalidRead",
962                 FatalException, error_msg);    << 577                  FatalException, error_msg);
963   }                                            << 578    }
964                                                   579 
965   return isotopePtr;                           << 580    return isotopePtr;
966 }                                                 581 }
967                                                   582 
968 // ------------------------------------------- << 
969 G4Material* G4GDMLReadMaterials::GetMaterial(c    583 G4Material* G4GDMLReadMaterials::GetMaterial(const G4String& ref,
970                                              G    584                                              G4bool verbose) const
971 {                                                 585 {
972   G4Material* materialPtr = G4Material::GetMat << 586    G4Material *materialPtr = G4Material::GetMaterial(ref,false);
973                                                   587 
974   if(materialPtr == nullptr)                   << 588    if (!materialPtr)
975   {                                            << 589    {
976     materialPtr = G4NistManager::Instance()->F << 590      materialPtr = G4NistManager::Instance()->FindOrBuildMaterial(ref);
977   }                                            << 591    }
978                                                << 592 
979   if(verbose && materialPtr == nullptr)        << 593    if (verbose && !materialPtr)
980   {                                            << 594    {
981     G4String error_msg = "Referenced material  << 595      G4String error_msg = "Referenced material '" + ref + "' was not found!";
982     G4Exception("G4GDMLReadMaterials::GetMater << 596      G4Exception("G4GDMLReadMaterials::GetMaterial()", "InvalidRead",
983                 FatalException, error_msg);    << 597                  FatalException, error_msg);
984   }                                            << 598    }
985                                                   599 
986   return materialPtr;                          << 600    return materialPtr;
987 }                                                 601 }
988                                                   602