Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GDMLRead.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$
27//
28// class G4GDMLRead Implementation
29//
30// History:
31// - Created. Zoltan Torzsok, November 2007
32// -------------------------------------------------------------------------
33
34#include "globals.hh"
35
36#include "G4GDMLRead.hh"
37
38#include "G4UnitsTable.hh"
39#include "G4Element.hh"
40#include "G4Material.hh"
41#include "G4SolidStore.hh"
44
46 : validate(true), check(false), inLoop(0), loopCount(0)
47{
49}
50
52{
53}
54
55G4String G4GDMLRead::Transcode(const XMLCh* const toTranscode)
56{
57 char* char_str = xercesc::XMLString::transcode(toTranscode);
58 G4String my_str(char_str);
59 xercesc::XMLString::release(&char_str);
60 return my_str;
61}
62
64{
65 check = flag;
66}
67
69{
70 G4String nameOut(nameIn);
71
72 if (inLoop>0)
73 {
74 nameOut = eval.SolveBrackets(nameOut);
75// std::stringstream stream;
76// stream << "0x" << loopCount;
77// nameOut = nameOut + stream.str();
78 }
79 if (strip) { StripName(nameOut); }
80
81 return nameOut;
82}
83
85 G4VPhysicalVolume* physvol)
86{
87 G4String nameOut(nameIn);
88
89 if (nameIn.empty())
90 {
91 std::stringstream stream;
92 stream << physvol->GetLogicalVolume()->GetName() << "_PV";
93 nameOut = stream.str();
94 }
95 nameOut = eval.SolveBrackets(nameOut);
96
97 physvol->SetName(nameOut);
98}
99
101{
102 G4String sname(name);
103 return sname.remove(sname.find("0x"));
104}
105
107{
108 name.remove(name.find("0x"));
109}
110
112{
113 // Strips off names of volumes, solids elements and materials from possible
114 // reference pointers or IDs attached to their original identifiers.
115
119 const G4ElementTable* elements = G4Element::GetElementTable();
121
122 G4cout << "Stripping off GDML names of materials, solids and volumes ..."
123 << G4endl;
124
125 G4String sname;
126 register size_t i;
127
128 // Solids...
129 //
130 for (i=0; i<solids->size(); i++)
131 {
132 G4VSolid* psol = (*solids)[i];
133 sname = psol->GetName();
134 StripName(sname);
135 psol->SetName(sname);
136 }
137
138 // Logical volumes...
139 //
140 for (i=0; i<lvols->size(); i++)
141 {
142 G4LogicalVolume* lvol = (*lvols)[i];
143 sname = lvol->GetName();
144 StripName(sname);
145 lvol->SetName(sname);
146 }
147
148 // Physical volumes...
149 //
150 for (i=0; i<pvols->size(); i++)
151 {
152 G4VPhysicalVolume* pvol = (*pvols)[i];
153 sname = pvol->GetName();
154 StripName(sname);
155 pvol->SetName(sname);
156 }
157
158 // Materials...
159 //
160 for (i=0; i<materials->size(); i++)
161 {
162 G4Material* pmat = (*materials)[i];
163 sname = pmat->GetName();
164 StripName(sname);
165 pmat->SetName(sname);
166 }
167
168 // Elements...
169 //
170 for (i=0; i<elements->size(); i++)
171 {
172 G4Element* pelm = (*elements)[i];
173 sname = pelm->GetName();
174 StripName(sname);
175 pelm->SetName(sname);
176 }
177}
178
179void G4GDMLRead::LoopRead(const xercesc::DOMElement* const element,
180 void(G4GDMLRead::*func)(const xercesc::DOMElement* const))
181{
182 G4String var;
183 G4String from;
184 G4String to;
185 G4String step;
186
187 const xercesc::DOMNamedNodeMap* const attributes = element->getAttributes();
188 XMLSize_t attributeCount = attributes->getLength();
189
190 for (XMLSize_t attribute_index=0;
191 attribute_index<attributeCount;attribute_index++)
192 {
193 xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
194
195 if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
196 { continue; }
197
198 const xercesc::DOMAttr* const attribute
199 = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
200 if (!attribute)
201 {
202 G4Exception("G4GDMLRead::LoopRead()", "InvalidRead",
203 FatalException, "No attribute found!");
204 return;
205 }
206 const G4String attribute_name = Transcode(attribute->getName());
207 const G4String attribute_value = Transcode(attribute->getValue());
208
209 if (attribute_name=="for") { var = attribute_value; } else
210 if (attribute_name=="from") { from = attribute_value; } else
211 if (attribute_name=="to") { to = attribute_value; } else
212 if (attribute_name=="step") { step = attribute_value; }
213 }
214
215 if (var.empty())
216 {
217 G4Exception("G4GDMLRead::loopRead()", "InvalidRead",
218 FatalException, "No variable is determined for loop!");
219 }
220
221 if (!eval.IsVariable(var))
222 {
223 G4Exception("G4GDMLRead::loopRead()", "InvalidRead",
224 FatalException, "Variable is not defined in loop!");
225 }
226
227 G4int _var = eval.EvaluateInteger(var);
228 G4int _from = eval.EvaluateInteger(from);
229 G4int _to = eval.EvaluateInteger(to);
230 G4int _step = eval.EvaluateInteger(step);
231
232 if (!from.empty()) { _var = _from; }
233
234 if (_from == _to)
235 {
236 G4Exception("G4GDMLRead::loopRead()", "InvalidRead",
237 FatalException, "Empty loop!");
238 }
239 if ((_from < _to) && (_step <= 0))
240 {
241 G4Exception("G4GDMLRead::loopRead()", "InvalidRead",
242 FatalException, "Infinite loop!");
243 }
244 if ((_from > _to) && (_step >= 0))
245 {
246 G4Exception("G4GDMLRead::loopRead()", "InvalidRead",
247 FatalException, "Infinite loop!");
248 }
249
250 inLoop++;
251
252 while (_var <= _to)
253 {
254 eval.SetVariable(var,_var);
255 (this->*func)(element);
256 _var += _step;
257 loopCount++;
258 }
259
260 inLoop--;
261 if (!inLoop) { loopCount = 0; }
262}
263
264void G4GDMLRead::ExtensionRead(const xercesc::DOMElement* const)
265{
266 G4String error_msg = "No handle to user-code for parsing extensions!";
267 G4Exception("G4GDMLRead::ExtensionRead()",
268 "NotImplemented", JustWarning, error_msg);
269}
270
271void G4GDMLRead::Read(const G4String& fileName,
272 G4bool validation,
273 G4bool isModule,
274 G4bool strip)
275{
276 if (isModule)
277 {
278 G4cout << "G4GDML: Reading module '" << fileName << "'..." << G4endl;
279 }
280 else
281 {
282 G4cout << "G4GDML: Reading '" << fileName << "'..." << G4endl;
283 }
284
285 inLoop = 0;
286 validate = validation;
287
288 xercesc::ErrorHandler* handler = new G4GDMLErrorHandler(!validate);
289 xercesc::XercesDOMParser* parser = new xercesc::XercesDOMParser;
290
291 parser->setValidationScheme(xercesc::XercesDOMParser::Val_Always);
292 parser->setValidationSchemaFullChecking(true);
293 parser->setCreateEntityReferenceNodes(false);
294 // Entities will be automatically resolved by Xerces
295
296 parser->setDoNamespaces(true);
297 parser->setDoSchema(true);
298 parser->setErrorHandler(handler);
299
300 try { parser->parse(fileName.c_str()); }
301 catch (const xercesc::XMLException &e)
302 { G4cout << "G4GDML: " << Transcode(e.getMessage()) << G4endl; }
303 catch (const xercesc::DOMException &e)
304 { G4cout << "G4GDML: " << Transcode(e.getMessage()) << G4endl; }
305
306 xercesc::DOMDocument* doc = parser->getDocument();
307
308 if (!doc)
309 {
310 G4String error_msg = "Unable to open document: " + fileName;
311 G4Exception("G4GDMLRead::Read()", "InvalidRead",
312 FatalException, error_msg);
313 return;
314 }
315 xercesc::DOMElement* element = doc->getDocumentElement();
316
317 if (!element)
318 {
319 G4Exception("G4GDMLRead::Read()", "InvalidRead",
320 FatalException, "Empty document!");
321 return;
322 }
323
324 for (xercesc::DOMNode* iter = element->getFirstChild();
325 iter != 0; iter = iter->getNextSibling())
326 {
327 if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
328
329 const xercesc::DOMElement* const child
330 = dynamic_cast<xercesc::DOMElement*>(iter);
331 if (!child)
332 {
333 G4Exception("G4GDMLRead::Read()", "InvalidRead",
334 FatalException, "No child found!");
335 return;
336 }
337 const G4String tag = Transcode(child->getTagName());
338
339 if (tag=="define") { DefineRead(child); } else
340 if (tag=="materials") { MaterialsRead(child); } else
341 if (tag=="solids") { SolidsRead(child); } else
342 if (tag=="setup") { SetupRead(child); } else
343 if (tag=="structure") { StructureRead(child); } else
344 if (tag=="extension") { ExtensionRead(child); }
345 else
346 {
347 G4String error_msg = "Unknown tag in gdml: " + tag;
348 G4Exception("G4GDMLRead::Read()", "InvalidRead",
349 FatalException, error_msg);
350 }
351 }
352
353 delete parser;
354 delete handler;
355
356 if (isModule)
357 {
358 G4cout << "G4GDML: Reading module '" << fileName << "' done!" << G4endl;
359 }
360 else
361 {
362 G4cout << "G4GDML: Reading '" << fileName << "' done!" << G4endl;
363 if (strip) { StripNames(); }
364 }
365}
std::vector< G4Element * > G4ElementTable
@ JustWarning
@ FatalException
std::vector< G4Material * > G4MaterialTable
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
void SetName(const G4String &name)
Definition: G4Element.hh:227
const G4String & GetName() const
Definition: G4Element.hh:127
static const G4ElementTable * GetElementTable()
Definition: G4Element.cc:399
void SetVariable(const G4String &, G4double)
G4bool IsVariable(const G4String &) const
G4int EvaluateInteger(const G4String &)
G4String SolveBrackets(const G4String &)
G4bool check
Definition: G4GDMLRead.hh:146
G4String Strip(const G4String &) const
Definition: G4GDMLRead.cc:100
G4bool validate
Definition: G4GDMLRead.hh:145
void GeneratePhysvolName(const G4String &, G4VPhysicalVolume *)
Definition: G4GDMLRead.cc:84
virtual void SolidsRead(const xercesc::DOMElement *const)=0
G4String GenerateName(const G4String &name, G4bool strip=false)
Definition: G4GDMLRead.cc:68
virtual void MaterialsRead(const xercesc::DOMElement *const)=0
void LoopRead(const xercesc::DOMElement *const, void(G4GDMLRead::*)(const xercesc::DOMElement *const))
Definition: G4GDMLRead.cc:179
void Read(const G4String &, G4bool validation, G4bool isModule, G4bool strip=true)
Definition: G4GDMLRead.cc:271
virtual void SetupRead(const xercesc::DOMElement *const)=0
G4String Transcode(const XMLCh *const)
Definition: G4GDMLRead.cc:55
void StripName(G4String &) const
Definition: G4GDMLRead.cc:106
virtual void ExtensionRead(const xercesc::DOMElement *const)
Definition: G4GDMLRead.cc:264
virtual void DefineRead(const xercesc::DOMElement *const)=0
virtual void StructureRead(const xercesc::DOMElement *const)=0
virtual ~G4GDMLRead()
Definition: G4GDMLRead.cc:51
G4GDMLEvaluator eval
Definition: G4GDMLRead.hh:144
void OverlapCheck(G4bool)
Definition: G4GDMLRead.cc:63
void StripNames() const
Definition: G4GDMLRead.cc:111
static G4LogicalVolumeStore * GetInstance()
void SetName(const G4String &pName)
G4String GetName() const
void SetName(const G4String &name)
Definition: G4Material.hh:282
static const G4MaterialTable * GetMaterialTable()
Definition: G4Material.cc:562
const G4String & GetName() const
Definition: G4Material.hh:177
static G4PhysicalVolumeStore * GetInstance()
static G4SolidStore * GetInstance()
G4String & remove(str_size)
static void BuildUnitsTable()
G4LogicalVolume * GetLogicalVolume() const
const G4String & GetName() const
void SetName(const G4String &pName)
G4String GetName() const
void SetName(const G4String &name)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
Definition: xmlparse.cc:179