Geant4  10.01.p02
G4GDMLReadStructure.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // $Id: G4GDMLReadStructure.cc 90777 2015-06-09 14:36:30Z gcosmo $
27 //
28 // class G4GDMLReadStructure Implementation
29 //
30 // Original author: Zoltan Torzsok, November 2007
31 //
32 // --------------------------------------------------------------------
33 
34 #include "G4GDMLReadStructure.hh"
35 
36 #include "G4UnitsTable.hh"
37 #include "G4LogicalVolume.hh"
38 #include "G4VPhysicalVolume.hh"
39 #include "G4PVPlacement.hh"
40 #include "G4LogicalVolumeStore.hh"
41 #include "G4PhysicalVolumeStore.hh"
42 #include "G4AssemblyVolume.hh"
43 #include "G4ReflectionFactory.hh"
44 #include "G4PVDivisionFactory.hh"
46 #include "G4LogicalSkinSurface.hh"
47 #include "G4VisAttributes.hh"
48 
50  : G4GDMLReadParamvol(), pMotherLogical(0), strip(false)
51 {
52 }
53 
55 {
56 }
57 
59 AuxiliaryRead(const xercesc::DOMElement* const auxiliaryElement)
60 {
61  G4GDMLAuxPairType auxpair = {"",""};
62 
63  const xercesc::DOMNamedNodeMap* const attributes
64  = auxiliaryElement->getAttributes();
65  XMLSize_t attributeCount = attributes->getLength();
66 
67  for (XMLSize_t attribute_index=0;
68  attribute_index<attributeCount; attribute_index++)
69  {
70  xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
71 
72  if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
73  { continue; }
74 
75  const xercesc::DOMAttr* const attribute
76  = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
77  if (!attribute)
78  {
79  G4Exception("G4GDMLReadStructure::AuxiliaryRead()",
80  "InvalidRead", FatalException, "No attribute found!");
81  return auxpair;
82  }
83  const G4String attName = Transcode(attribute->getName());
84  const G4String attValue = Transcode(attribute->getValue());
85 
86  if (attName=="auxtype") { auxpair.type = attValue; } else
87  // if (attName=="auxvalue") { auxpair.value = eval.Evaluate(attValue); }
88  if (attName=="auxvalue") { auxpair.value = attValue; }
89  }
90 
91  return auxpair;
92 }
93 
95 BorderSurfaceRead(const xercesc::DOMElement* const bordersurfaceElement)
96 {
97  G4String name;
98  G4VPhysicalVolume* pv1 = 0;
99  G4VPhysicalVolume* pv2 = 0;
100  G4SurfaceProperty* prop = 0;
101  G4int index = 0;
102 
103  const xercesc::DOMNamedNodeMap* const attributes
104  = bordersurfaceElement->getAttributes();
105  XMLSize_t attributeCount = attributes->getLength();
106 
107  for (XMLSize_t attribute_index=0;
108  attribute_index<attributeCount; attribute_index++)
109  {
110  xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
111 
112  if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
113  { continue; }
114 
115  const xercesc::DOMAttr* const attribute
116  = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
117  if (!attribute)
118  {
119  G4Exception("G4GDMLReadStructure::BorderSurfaceRead()",
120  "InvalidRead", FatalException, "No attribute found!");
121  return;
122  }
123  const G4String attName = Transcode(attribute->getName());
124  const G4String attValue = Transcode(attribute->getValue());
125 
126  if (attName=="name")
127  { name = GenerateName(attValue); } else
128  if (attName=="surfaceproperty")
129  { prop = GetSurfaceProperty(GenerateName(attValue)); }
130  }
131 
132  for (xercesc::DOMNode* iter = bordersurfaceElement->getFirstChild();
133  iter != 0; iter = iter->getNextSibling())
134  {
135  if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
136 
137  const xercesc::DOMElement* const child
138  = dynamic_cast<xercesc::DOMElement*>(iter);
139  if (!child)
140  {
141  G4Exception("G4GDMLReadStructure::BorderSurfaceRead()",
142  "InvalidRead", FatalException, "No child found!");
143  return;
144  }
145  const G4String tag = Transcode(child->getTagName());
146 
147  if (tag != "physvolref") { continue; }
148 
149  if (index==0)
150  { pv1 = GetPhysvol(GenerateName(RefRead(child))); index++; } else
151  if (index==1)
152  { pv2 = GetPhysvol(GenerateName(RefRead(child))); index++; } else
153  break;
154  }
155 
156  new G4LogicalBorderSurface(Strip(name),pv1,pv2,prop);
157 }
158 
160 DivisionvolRead(const xercesc::DOMElement* const divisionvolElement)
161 {
162  G4String name;
163  G4double unit = 1.0;
164  G4double width = 0.0;
165  G4double offset = 0.0;
166  G4int number = 0;
167  EAxis axis = kUndefined;
168  G4LogicalVolume* logvol = 0;
169 
170  const xercesc::DOMNamedNodeMap* const attributes
171  = divisionvolElement->getAttributes();
172  XMLSize_t attributeCount = attributes->getLength();
173 
174  for (XMLSize_t attribute_index=0;
175  attribute_index<attributeCount; attribute_index++)
176  {
177  xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
178 
179  if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
180  { continue; }
181 
182  const xercesc::DOMAttr* const attribute
183  = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
184  if (!attribute)
185  {
186  G4Exception("G4GDMLReadStructure::DivisionvolRead()",
187  "InvalidRead", FatalException, "No attribute found!");
188  return;
189  }
190  const G4String attName = Transcode(attribute->getName());
191  const G4String attValue = Transcode(attribute->getValue());
192 
193  if (attName=="name") { name = attValue; } else
194  if (attName=="unit") { unit = G4UnitDefinition::GetValueOf(attValue); } else
195  if (attName=="width") { width = eval.Evaluate(attValue); } else
196  if (attName=="offset") { offset = eval.Evaluate(attValue); } else
197  if (attName=="number") { number = eval.EvaluateInteger(attValue); } else
198  if (attName=="axis")
199  {
200  if (attValue=="kXAxis") { axis = kXAxis; } else
201  if (attValue=="kYAxis") { axis = kYAxis; } else
202  if (attValue=="kZAxis") { axis = kZAxis; } else
203  if (attValue=="kRho") { axis = kRho; } else
204  if (attValue=="kPhi") { axis = kPhi; }
205  }
206  }
207 
208  width *= unit;
209  offset *= unit;
210 
211  for (xercesc::DOMNode* iter = divisionvolElement->getFirstChild();
212  iter != 0;iter = iter->getNextSibling())
213  {
214  if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
215 
216  const xercesc::DOMElement* const child
217  = dynamic_cast<xercesc::DOMElement*>(iter);
218  if (!child)
219  {
220  G4Exception("G4GDMLReadStructure::DivisionvolRead()",
221  "InvalidRead", FatalException, "No child found!");
222  return;
223  }
224  const G4String tag = Transcode(child->getTagName());
225 
226  if (tag=="volumeref") { logvol = GetVolume(GenerateName(RefRead(child))); }
227  }
228 
229  if (!logvol) { return; }
230 
233 
234  G4String pv_name = logvol->GetName() + "_div";
235  if ((number != 0) && (width == 0.0))
236  {
238  ->Divide(pv_name,logvol,pMotherLogical,axis,number,offset);
239  }
240  else if ((number == 0) && (width != 0.0))
241  {
243  ->Divide(pv_name,logvol,pMotherLogical,axis,width,offset);
244  }
245  else
246  {
248  ->Divide(pv_name,logvol,pMotherLogical,axis,number,width,offset);
249  }
250 
251  if (pair.first != 0) { GeneratePhysvolName(name,pair.first); }
252  if (pair.second != 0) { GeneratePhysvolName(name,pair.second); }
253 }
254 
256 FileRead(const xercesc::DOMElement* const fileElement)
257 {
258  G4String name;
259  G4String volname;
260 
261  const xercesc::DOMNamedNodeMap* const attributes
262  = fileElement->getAttributes();
263  XMLSize_t attributeCount = attributes->getLength();
264 
265  for (XMLSize_t attribute_index=0;
266  attribute_index<attributeCount; attribute_index++)
267  {
268  xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
269 
270  if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
271  { continue; }
272 
273  const xercesc::DOMAttr* const attribute
274  = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
275  if (!attribute)
276  {
277  G4Exception("G4GDMLReadStructure::FileRead()",
278  "InvalidRead", FatalException, "No attribute found!");
279  return 0;
280  }
281  const G4String attName = Transcode(attribute->getName());
282  const G4String attValue = Transcode(attribute->getValue());
283 
284  if (attName=="name") { name = attValue; } else
285  if (attName=="volname") { volname = attValue; }
286  }
287 
288  const G4bool isModule = true;
289  G4GDMLReadStructure structure;
290  structure.Read(name,validate,isModule);
291 
292  // Register existing auxiliar information defined in child module
293  //
294  const G4GDMLAuxMapType* aux = structure.GetAuxMap();
295  if (!aux->empty())
296  {
297  G4GDMLAuxMapType::const_iterator pos;
298  for (pos = aux->begin(); pos != aux->end(); ++pos)
299  {
300  auxMap.insert(std::make_pair(pos->first,pos->second));
301  }
302  }
303 
304  // Return volume structure from child module
305  //
306  if (volname.empty())
307  {
308  return structure.GetVolume(structure.GetSetup("Default"));
309  }
310  else
311  {
312  return structure.GetVolume(structure.GenerateName(volname));
313  }
314 }
315 
317 PhysvolRead(const xercesc::DOMElement* const physvolElement,
318  G4AssemblyVolume* pAssembly)
319 {
320  G4String name;
321  G4LogicalVolume* logvol = 0;
322  G4AssemblyVolume* assembly = 0;
323  G4ThreeVector position(0.0,0.0,0.0);
324  G4ThreeVector rotation(0.0,0.0,0.0);
325  G4ThreeVector scale(1.0,1.0,1.0);
326 
327  const xercesc::DOMNamedNodeMap* const attributes
328  = physvolElement->getAttributes();
329  XMLSize_t attributeCount = attributes->getLength();
330 
331  for (XMLSize_t attribute_index=0;
332  attribute_index<attributeCount; attribute_index++)
333  {
334  xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
335 
336  if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
337  { continue; }
338 
339  const xercesc::DOMAttr* const attribute
340  = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
341  if (!attribute)
342  {
343  G4Exception("G4GDMLReadStructure::PhysvolRead()",
344  "InvalidRead", FatalException, "No attribute found!");
345  return;
346  }
347  const G4String attName = Transcode(attribute->getName());
348  const G4String attValue = Transcode(attribute->getValue());
349 
350  if (attName=="name") { name = attValue; }
351  }
352 
353  for (xercesc::DOMNode* iter = physvolElement->getFirstChild();
354  iter != 0; iter = iter->getNextSibling())
355  {
356  if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
357 
358  const xercesc::DOMElement* const child
359  = dynamic_cast<xercesc::DOMElement*>(iter);
360  if (!child)
361  {
362  G4Exception("G4GDMLReadStructure::PhysvolRead()",
363  "InvalidRead", FatalException, "No child found!");
364  return;
365  }
366  const G4String tag = Transcode(child->getTagName());
367 
368  if (tag=="volumeref")
369  {
370  const G4String& child_name = GenerateName(RefRead(child));
371  assembly = GetAssembly(child_name);
372  if (!assembly) { logvol = GetVolume(child_name); }
373  }
374  else if (tag=="file")
375  { logvol = FileRead(child); }
376  else if (tag=="position")
377  { VectorRead(child,position); }
378  else if (tag=="rotation")
379  { VectorRead(child,rotation); }
380  else if (tag=="scale")
381  { VectorRead(child,scale); }
382  else if (tag=="positionref")
383  { position = GetPosition(GenerateName(RefRead(child))); }
384  else if (tag=="rotationref")
385  { rotation = GetRotation(GenerateName(RefRead(child))); }
386  else if (tag=="scaleref")
387  { scale = GetScale(GenerateName(RefRead(child))); }
388  else
389  {
390  G4String error_msg = "Unknown tag in physvol: " + tag;
391  G4Exception("G4GDMLReadStructure::PhysvolRead()", "ReadError",
392  FatalException, error_msg);
393  return;
394  }
395  }
396 
397  G4Transform3D transform(GetRotationMatrix(rotation).inverse(),position);
398  transform = transform*G4Scale3D(scale.x(),scale.y(),scale.z());
399 
400  if (pAssembly) // Fill assembly structure
401  {
402  if (!logvol) { return; }
403  pAssembly->AddPlacedVolume(logvol, transform);
404  }
405  else // Generate physical volume tree or do assembly imprint
406  {
407  if (assembly)
408  {
409  assembly->MakeImprint(pMotherLogical, transform, 0, check);
410  }
411  else
412  {
413  if (!logvol) { return; }
414  G4String pv_name = logvol->GetName() + "_PV";
416  ->Place(transform,pv_name,logvol,pMotherLogical,false,0,check);
417 
418  if (pair.first != 0) { GeneratePhysvolName(name,pair.first); }
419  if (pair.second != 0) { GeneratePhysvolName(name,pair.second); }
420  }
421  }
422 }
423 
425 ReplicavolRead(const xercesc::DOMElement* const replicavolElement, G4int number)
426 {
427  G4LogicalVolume* logvol = 0;
428  for (xercesc::DOMNode* iter = replicavolElement->getFirstChild();
429  iter != 0; iter = iter->getNextSibling())
430  {
431  if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
432 
433  const xercesc::DOMElement* const child
434  = dynamic_cast<xercesc::DOMElement*>(iter);
435  if (!child)
436  {
437  G4Exception("G4GDMLReadStructure::ReplicavolRead()",
438  "InvalidRead", FatalException, "No child found!");
439  return;
440  }
441  const G4String tag = Transcode(child->getTagName());
442 
443  if (tag=="volumeref")
444  {
445  logvol = GetVolume(GenerateName(RefRead(child)));
446  }
447  else if (tag=="replicate_along_axis")
448  {
449  if (logvol) { ReplicaRead(child,logvol,number); }
450  }
451  else
452  {
453  G4String error_msg = "Unknown tag in ReplicavolRead: " + tag;
454  G4Exception("G4GDMLReadStructure::ReplicavolRead()",
455  "ReadError", FatalException, error_msg);
456  }
457  }
458 }
459 
461 ReplicaRead(const xercesc::DOMElement* const replicaElement,
462  G4LogicalVolume* logvol, G4int number)
463 {
464  G4double width = 0.0;
465  G4double offset = 0.0;
466  G4ThreeVector position(0.0,0.0,0.0);
467  G4ThreeVector rotation(0.0,0.0,0.0);
468  EAxis axis = kUndefined;
469  G4String name;
470 
471  for (xercesc::DOMNode* iter = replicaElement->getFirstChild();
472  iter != 0; iter = iter->getNextSibling())
473  {
474  if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
475 
476  const xercesc::DOMElement* const child
477  = dynamic_cast<xercesc::DOMElement*>(iter);
478  if (!child)
479  {
480  G4Exception("G4GDMLReadStructure::ReplicaRead()",
481  "InvalidRead", FatalException, "No child found!");
482  return;
483  }
484  const G4String tag = Transcode(child->getTagName());
485 
486  if (tag=="position")
487  { VectorRead(child,position); } else
488  if (tag=="rotation")
489  { VectorRead(child,rotation); } else
490  if (tag=="positionref")
491  { position = GetPosition(GenerateName(RefRead(child))); } else
492  if (tag=="rotationref")
493  { rotation = GetRotation(GenerateName(RefRead(child))); } else
494  if (tag=="direction")
495  { axis=AxisRead(child); } else
496  if (tag=="width")
497  { width=QuantityRead(child); } else
498  if (tag=="offset")
499  { offset=QuantityRead(child); }
500  else
501  {
502  G4String error_msg = "Unknown tag in ReplicaRead: " + tag;
503  G4Exception("G4GDMLReadStructure::ReplicaRead()", "ReadError",
504  FatalException, error_msg);
505  }
506  }
507 
508  G4String pv_name = logvol->GetName() + "_PV";
510  ->Replicate(pv_name,logvol,pMotherLogical,axis,number,width,offset);
511 
512  if (pair.first != 0) { GeneratePhysvolName(name,pair.first); }
513  if (pair.second != 0) { GeneratePhysvolName(name,pair.second); }
514 
515 }
516 
518 AxisRead(const xercesc::DOMElement* const axisElement)
519 {
520  EAxis axis = kUndefined;
521 
522  const xercesc::DOMNamedNodeMap* const attributes
523  = axisElement->getAttributes();
524  XMLSize_t attributeCount = attributes->getLength();
525 
526  for (XMLSize_t attribute_index=0;
527  attribute_index<attributeCount; attribute_index++)
528  {
529  xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
530 
531  if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
532  { continue; }
533 
534  const xercesc::DOMAttr* const attribute
535  = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
536  if (!attribute)
537  {
538  G4Exception("G4GDMLReadStructure::AxisRead()",
539  "InvalidRead", FatalException, "No attribute found!");
540  return axis;
541  }
542  const G4String attName = Transcode(attribute->getName());
543  const G4String attValue = Transcode(attribute->getValue());
544  if (attName=="x")
545  { if( eval.Evaluate(attValue)==1.) {axis=kXAxis;} }
546  else if (attName=="y")
547  { if( eval.Evaluate(attValue)==1.) {axis=kYAxis;} }
548  else if (attName=="z")
549  { if( eval.Evaluate(attValue)==1.) {axis=kZAxis;} }
550  else if (attName=="rho")
551  { if( eval.Evaluate(attValue)==1.) {axis=kRho;} }
552  else if (attName=="phi")
553  { if( eval.Evaluate(attValue)==1.) {axis=kPhi;} }
554  }
555 
556  return axis;
557 }
558 
560 QuantityRead(const xercesc::DOMElement* const readElement)
561 {
562  G4double value = 0.0;
563  G4double unit = 0.0;
564  const xercesc::DOMNamedNodeMap* const attributes
565  = readElement->getAttributes();
566  XMLSize_t attributeCount = attributes->getLength();
567 
568  for (XMLSize_t attribute_index=0;
569  attribute_index<attributeCount; attribute_index++)
570  {
571  xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
572 
573  if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
574  { continue; }
575  const xercesc::DOMAttr* const attribute
576  = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
577  if (!attribute)
578  {
579  G4Exception("G4GDMLReadStructure::QuantityRead()",
580  "InvalidRead", FatalException, "No attribute found!");
581  return value;
582  }
583  const G4String attName = Transcode(attribute->getName());
584  const G4String attValue = Transcode(attribute->getValue());
585 
586  if (attName=="unit") { unit = G4UnitDefinition::GetValueOf(attValue); } else
587  if (attName=="value"){ value= eval.Evaluate(attValue); }
588  }
589 
590  return value*unit;
591 }
592 
594 VolumeRead(const xercesc::DOMElement* const volumeElement)
595 {
596  G4VSolid* solidPtr = 0;
597  G4Material* materialPtr = 0;
598  G4GDMLAuxListType auxList;
599 
600  XMLCh *name_attr = xercesc::XMLString::transcode("name");
601  const G4String name = Transcode(volumeElement->getAttribute(name_attr));
602  xercesc::XMLString::release(&name_attr);
603 
604  for (xercesc::DOMNode* iter = volumeElement->getFirstChild();
605  iter != 0; iter = iter->getNextSibling())
606  {
607  if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
608 
609  const xercesc::DOMElement* const child
610  = dynamic_cast<xercesc::DOMElement*>(iter);
611  if (!child)
612  {
613  G4Exception("G4GDMLReadStructure::VolumeRead()",
614  "InvalidRead", FatalException, "No child found!");
615  return;
616  }
617  const G4String tag = Transcode(child->getTagName());
618 
619  if (tag=="auxiliary")
620  { auxList.push_back(AuxiliaryRead(child)); } else
621  if (tag=="materialref")
622  { materialPtr = GetMaterial(GenerateName(RefRead(child),true)); } else
623  if (tag=="solidref")
624  { solidPtr = GetSolid(GenerateName(RefRead(child))); }
625  }
626 
627  pMotherLogical = new G4LogicalVolume(solidPtr,materialPtr,
628  GenerateName(name),0,0,0);
629 
630  if (!auxList.empty()) { auxMap[pMotherLogical] = auxList; }
631 
632  Volume_contentRead(volumeElement);
633 }
634 
636 AssemblyRead(const xercesc::DOMElement* const assemblyElement)
637 {
638  XMLCh *name_attr = xercesc::XMLString::transcode("name");
639  const G4String name = Transcode(assemblyElement->getAttribute(name_attr));
640  xercesc::XMLString::release(&name_attr);
641 
642  G4AssemblyVolume* pAssembly = new G4AssemblyVolume();
643  assemblyMap.insert(std::make_pair(GenerateName(name), pAssembly));
644 
645  for (xercesc::DOMNode* iter = assemblyElement->getFirstChild();
646  iter != 0; iter = iter->getNextSibling())
647  {
648  if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
649  const xercesc::DOMElement* const child
650  = dynamic_cast<xercesc::DOMElement*>(iter);
651  if (!child)
652  {
653  G4Exception("G4GDMLReadStructure::AssemblyRead()",
654  "InvalidRead", FatalException, "No child found!");
655  return;
656  }
657  const G4String tag = Transcode(child->getTagName());
658 
659  if (tag=="physvol")
660  {
661  PhysvolRead(child, pAssembly);
662  }
663  else
664  {
665  G4cout << "Unsupported GDML tag '" << tag
666  << "' for Geant4 assembly structure !" << G4endl;
667  }
668  }
669 }
670 
672 SkinSurfaceRead(const xercesc::DOMElement* const skinsurfaceElement)
673 {
674  G4String name;
675  G4LogicalVolume* logvol = 0;
676  G4SurfaceProperty* prop = 0;
677 
678  const xercesc::DOMNamedNodeMap* const attributes
679  = skinsurfaceElement->getAttributes();
680  XMLSize_t attributeCount = attributes->getLength();
681 
682  for (XMLSize_t attribute_index=0;
683  attribute_index<attributeCount; attribute_index++)
684  {
685  xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
686 
687  if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
688  { continue; }
689 
690  const xercesc::DOMAttr* const attribute
691  = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
692  if (!attribute)
693  {
694  G4Exception("G4GDMLReadStructure::SkinsurfaceRead()",
695  "InvalidRead", FatalException, "No attribute found!");
696  return;
697  }
698  const G4String attName = Transcode(attribute->getName());
699  const G4String attValue = Transcode(attribute->getValue());
700 
701  if (attName=="name")
702  { name = GenerateName(attValue); } else
703  if (attName=="surfaceproperty")
704  { prop = GetSurfaceProperty(GenerateName(attValue)); }
705  }
706 
707  for (xercesc::DOMNode* iter = skinsurfaceElement->getFirstChild();
708  iter != 0; iter = iter->getNextSibling())
709  {
710  if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
711 
712  const xercesc::DOMElement* const child
713  = dynamic_cast<xercesc::DOMElement*>(iter);
714  if (!child)
715  {
716  G4Exception("G4GDMLReadStructure::SkinsurfaceRead()",
717  "InvalidRead", FatalException, "No child found!");
718  return;
719  }
720  const G4String tag = Transcode(child->getTagName());
721 
722  if (tag=="volumeref")
723  {
724  logvol = GetVolume(GenerateName(RefRead(child)));
725  }
726  else
727  {
728  G4String error_msg = "Unknown tag in skinsurface: " + tag;
729  G4Exception("G4GDMLReadStructure::SkinsurfaceRead()", "ReadError",
730  FatalException, error_msg);
731  }
732  }
733 
734  new G4LogicalSkinSurface(Strip(name),logvol,prop);
735 }
736 
738 Volume_contentRead(const xercesc::DOMElement* const volumeElement)
739 {
740  for (xercesc::DOMNode* iter = volumeElement->getFirstChild();
741  iter != 0; iter = iter->getNextSibling())
742  {
743  if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
744 
745  const xercesc::DOMElement* const child
746  = dynamic_cast<xercesc::DOMElement*>(iter);
747  if (!child)
748  {
749  G4Exception("G4GDMLReadStructure::Volume_contentRead()",
750  "InvalidRead", FatalException, "No child found!");
751  return;
752  }
753  const G4String tag = Transcode(child->getTagName());
754 
755  if ((tag=="auxiliary") || (tag=="materialref") || (tag=="solidref"))
756  {
757  // These are already processed in VolumeRead()
758  }
759  else if (tag=="paramvol")
760  {
762  }
763  else if (tag=="physvol")
764  {
765  PhysvolRead(child);
766  }
767  else if (tag=="replicavol")
768  {
769  G4int number = 1;
770  const xercesc::DOMNamedNodeMap* const attributes
771  = child->getAttributes();
772  XMLSize_t attributeCount = attributes->getLength();
773  for (XMLSize_t attribute_index=0;
774  attribute_index<attributeCount; attribute_index++)
775  {
776  xercesc::DOMNode* attribute_node
777  = attributes->item(attribute_index);
778  if (attribute_node->getNodeType()!=xercesc::DOMNode::ATTRIBUTE_NODE)
779  {
780  continue;
781  }
782  const xercesc::DOMAttr* const attribute
783  = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
784  if (!attribute)
785  {
786  G4Exception("G4GDMLReadStructure::Volume_contentRead()",
787  "InvalidRead", FatalException, "No attribute found!");
788  return;
789  }
790  const G4String attName = Transcode(attribute->getName());
791  const G4String attValue = Transcode(attribute->getValue());
792  if (attName=="number")
793  {
794  number = eval.EvaluateInteger(attValue);
795  }
796  }
797  ReplicavolRead(child,number);
798  }
799  else if (tag=="divisionvol")
800  {
801  DivisionvolRead(child);
802  }
803  else if (tag=="loop")
804  {
806  }
807  else
808  {
809  G4cout << "Treating unknown GDML tag in volume '" << tag
810  << "' as GDML extension..." << G4endl;
811  }
812  }
813 }
814 
816 StructureRead(const xercesc::DOMElement* const structureElement)
817 {
818  G4cout << "G4GDML: Reading structure..." << G4endl;
819 
820  for (xercesc::DOMNode* iter = structureElement->getFirstChild();
821  iter != 0; iter = iter->getNextSibling())
822  {
823  if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
824 
825  const xercesc::DOMElement* const child
826  = dynamic_cast<xercesc::DOMElement*>(iter);
827  if (!child)
828  {
829  G4Exception("G4GDMLReadStructure::StructureRead()",
830  "InvalidRead", FatalException, "No child found!");
831  return;
832  }
833  const G4String tag = Transcode(child->getTagName());
834 
835  if (tag=="bordersurface") { BorderSurfaceRead(child); } else
836  if (tag=="skinsurface") { SkinSurfaceRead(child); } else
837  if (tag=="volume") { VolumeRead(child); } else
838  if (tag=="assembly") { AssemblyRead(child); } else
839  if (tag=="loop") { LoopRead(child,&G4GDMLRead::StructureRead); }
840  else
841  {
842  G4String error_msg = "Unknown tag in structure: " + tag;
843  G4Exception("G4GDMLReadStructure::StructureRead()",
844  "ReadError", FatalException, error_msg);
845  }
846  }
847 }
848 
850 GetPhysvol(const G4String& ref) const
851 {
852  G4VPhysicalVolume* physvolPtr =
854 
855  if (!physvolPtr)
856  {
857  G4String error_msg = "Referenced physvol '" + ref + "' was not found!";
858  G4Exception("G4GDMLReadStructure::GetPhysvol()", "ReadError",
859  FatalException, error_msg);
860  }
861 
862  return physvolPtr;
863 }
864 
866 GetVolume(const G4String& ref) const
867 {
868  G4LogicalVolume *volumePtr
870 
871  if (!volumePtr)
872  {
873  G4String error_msg = "Referenced volume '" + ref + "' was not found!";
874  G4Exception("G4GDMLReadStructure::GetVolume()", "ReadError",
875  FatalException, error_msg);
876  }
877 
878  return volumePtr;
879 }
880 
882 GetAssembly(const G4String& ref) const
883 {
884  G4GDMLAssemblyMapType::const_iterator pos = assemblyMap.find(ref);
885  if (pos != assemblyMap.end()) { return pos->second; }
886  return 0;
887 }
888 
891 {
892  G4GDMLAuxMapType::const_iterator pos = auxMap.find(logvol);
893  if (pos != auxMap.end()) { return pos->second; }
894  else { return G4GDMLAuxListType(); }
895 }
896 
898 GetAuxMap() const
899 {
900  return &auxMap;
901 }
902 
904 GetWorldVolume(const G4String& setupName)
905 {
906  G4LogicalVolume* volume =
907  GetVolume(GenerateName(GetSetup(setupName), dostrip));
909 
910  G4VPhysicalVolume* pvWorld = 0;
911 
912  if(setuptoPV[setupName])
913  {
914  pvWorld = setuptoPV[setupName];
915  }
916  else
917  {
918  pvWorld = new G4PVPlacement(0,G4ThreeVector(0,0,0),volume,
919  volume->GetName()+"_PV",0,0,0);
920  setuptoPV[setupName] = pvWorld;
921  }
922  return pvWorld;
923 }
924 
926 {
927  eval.Clear();
928  setuptoPV.clear();
929 }
G4PhysicalVolumesPair Divide(const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, EAxis axis, G4int nofDivisions, G4double width, G4double offset)
static int release(statusMessageReporting *smr, xDataType *xDT)
Definition: xData_1d_x.cc:179
Definition: geomdefs.hh:54
G4AssemblyVolume * GetAssembly(const G4String &) const
G4LogicalVolume * FileRead(const xercesc::DOMElement *const)
G4int EvaluateInteger(const G4String &)
void MakeImprint(G4LogicalVolume *pMotherLV, G4ThreeVector &translationInMother, G4RotationMatrix *pRotationInMother, G4int copyNumBase=0, G4bool surfCheck=false)
G4GDMLEvaluator eval
Definition: G4GDMLRead.hh:144
virtual void ParamvolRead(const xercesc::DOMElement *const, G4LogicalVolume *)
G4String GetName() const
CLHEP::Hep3Vector G4ThreeVector
G4Material * GetMaterial(const G4String &, G4bool verbose=true) const
G4int first(char) const
G4String name
Definition: TRTMaterials.hh:40
virtual void Volume_contentRead(const xercesc::DOMElement *const)=0
Definition: xmlparse.cc:179
G4bool dostrip
Definition: G4GDMLRead.hh:147
G4double QuantityRead(const xercesc::DOMElement *const readElement)
void DivisionvolRead(const xercesc::DOMElement *const)
#define width
G4String Transcode(const XMLCh *const)
Definition: G4GDMLRead.cc:55
G4GDMLAuxPairType AuxiliaryRead(const xercesc::DOMElement *const)
G4ThreeVector GetScale(const G4String &)
G4SurfaceProperty * GetSurfaceProperty(const G4String &) const
void ReplicavolRead(const xercesc::DOMElement *const, G4int number)
G4PhysicalVolumesPair Replicate(const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, EAxis axis, G4int nofReplicas, G4double width, G4double offset=0)
void GeneratePhysvolName(const G4String &, G4VPhysicalVolume *)
Definition: G4GDMLRead.cc:81
int G4int
Definition: G4Types.hh:78
G4VPhysicalVolume * GetPhysvol(const G4String &) const
G4LogicalVolume * GetVolume(const G4String &name, G4bool verbose=true) const
static G4ReflectionFactory * Instance()
G4VSolid * GetSolid(const G4String &) const
virtual void StructureRead(const xercesc::DOMElement *const)=0
static G4PhysicalVolumeStore * GetInstance()
G4String RefRead(const xercesc::DOMElement *const)
static G4PVDivisionFactory * GetInstance()
void LoopRead(const xercesc::DOMElement *const, void(G4GDMLRead::*)(const xercesc::DOMElement *const))
Definition: G4GDMLRead.cc:176
static G4double GetValueOf(const G4String &)
#define position
Definition: xmlparse.cc:605
G4GLOB_DLL std::ostream G4cout
G4PhysicalVolumesPair Place(const G4Transform3D &transform3D, const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, G4bool isMany, G4int copyNo, G4bool surfCheck=false)
G4GDMLAssemblyMapType assemblyMap
G4LogicalVolume * GetVolume(const G4String &) const
bool G4bool
Definition: G4Types.hh:79
void ReplicaRead(const xercesc::DOMElement *const replicaElement, G4LogicalVolume *logvol, G4int number)
static G4LogicalVolumeStore * GetInstance()
HepGeom::Transform3D G4Transform3D
HepGeom::Scale3D G4Scale3D
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
G4LogicalVolume * pMotherLogical
const G4GDMLAuxMapType * GetAuxMap() const
std::vector< G4GDMLAuxPairType > G4GDMLAuxListType
G4String GenerateName(const G4String &name, G4bool strip=false)
Definition: G4GDMLRead.cc:68
std::map< std::string, G4VPhysicalVolume * > setuptoPV
void BorderSurfaceRead(const xercesc::DOMElement *const)
void AddPlacedVolume(G4LogicalVolume *pPlacedVolume, G4ThreeVector &translation, G4RotationMatrix *rotation)
EAxis
Definition: geomdefs.hh:54
G4String Strip(const G4String &) const
Definition: G4GDMLRead.cc:97
G4VPhysicalVolume * GetWorldVolume(const G4String &)
EAxis AxisRead(const xercesc::DOMElement *const axisElement)
void SkinSurfaceRead(const xercesc::DOMElement *const)
G4bool validate
Definition: G4GDMLRead.hh:145
void VectorRead(const xercesc::DOMElement *const, G4ThreeVector &)
static const G4VisAttributes Invisible
virtual void Volume_contentRead(const xercesc::DOMElement *const)
std::pair< G4VPhysicalVolume *, G4VPhysicalVolume * > G4PhysicalVolumesPair
#define G4endl
Definition: G4ios.hh:61
G4ThreeVector GetRotation(const G4String &)
G4GDMLAuxListType GetVolumeAuxiliaryInformation(G4LogicalVolume *) const
G4RotationMatrix GetRotationMatrix(const G4ThreeVector &)
double G4double
Definition: G4Types.hh:76
std::map< G4LogicalVolume *, G4GDMLAuxListType > G4GDMLAuxMapType
Definition: geomdefs.hh:54
virtual void StructureRead(const xercesc::DOMElement *const)
void AssemblyRead(const xercesc::DOMElement *const)
G4VPhysicalVolume * GetVolume(const G4String &name, G4bool verbose=true) const
G4bool check
Definition: G4GDMLRead.hh:146
void SetVisAttributes(const G4VisAttributes *pVA)
static const G4double pos
G4String GetSetup(const G4String &)
void Read(const G4String &, G4bool validation, G4bool isModule, G4bool strip=true)
Definition: G4GDMLRead.cc:268
G4double Evaluate(const G4String &)
void PhysvolRead(const xercesc::DOMElement *const, G4AssemblyVolume *assembly=0)
G4ThreeVector GetPosition(const G4String &)
virtual void VolumeRead(const xercesc::DOMElement *const)