Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4GDMLReadDefine.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 G4GDMLReadDefine Implementation
29//
30// Original author: Zoltan Torzsok, November 2007
31//
32// --------------------------------------------------------------------
33
34#include "G4GDMLReadDefine.hh"
35
37 : m(0), rows(0), cols(0)
38{
39}
40
41G4GDMLMatrix::G4GDMLMatrix(size_t rows0, size_t cols0)
42{
43 if ((rows0==0) || (cols0==0))
44 {
45 G4Exception("G4GDMLMatrix::G4GDMLMatrix(r,c)", "InvalidSetup",
46 FatalException, "Zero indeces as arguments!?");
47 }
48 rows = rows0;
49 cols = cols0;
50 m = new G4double[rows*cols];
51}
52
54 : m(0), rows(0), cols(0)
55{
56 if (rhs.m)
57 {
58 rows = rhs.rows;
59 cols = rhs.cols;
60 m = new G4double[rows*cols];
61 for (size_t i=0; i<rows*cols; i++) { m[i] = rhs.m[i]; }
62 }
63}
64
66{
67 // Check assignment to self
68 //
69 if (this == &rhs) { return *this; }
70
71 // Copy data
72 //
73 rows = rhs.rows;
74 cols = rhs.cols;
75 if (rhs.m)
76 {
77 m = new G4double[rows*cols];
78 for (size_t i=0; i<rows*cols; i++) { m[i] = rhs.m[i]; }
79 }
80 else
81 {
82 m = 0;
83 }
84
85 return *this;
86}
87
89{
90 delete [] m;
91}
92
93void G4GDMLMatrix::Set(size_t r,size_t c,G4double a)
94{
95 if (r>=rows || c>=cols)
96 {
97 G4Exception("G4GDMLMatrix::set()", "InvalidSetup",
98 FatalException, "Index out of range!");
99 }
100 m[cols*r+c] = a;
101}
102
103G4double G4GDMLMatrix::Get(size_t r,size_t c) const
104{
105 if (r>=rows || c>=cols)
106 {
107 G4Exception("G4GDMLMatrix::get()", "InvalidSetup",
108 FatalException, "Index out of range!");
109 }
110 return m[cols*r+c];
111}
112
114{
115 return rows;
116}
117
119{
120 return cols;
121}
122
124{
125}
126
128{
129}
130
133{
135
136 rot.rotateX(angles.x());
137 rot.rotateY(angles.y());
138 rot.rotateZ(angles.z());
139
140 return rot;
141}
142
143void
144G4GDMLReadDefine::ConstantRead(const xercesc::DOMElement* const constantElement)
145{
146 G4String name = "";
147 G4double value = 0.0;
148
149 const xercesc::DOMNamedNodeMap* const attributes
150 = constantElement->getAttributes();
151 XMLSize_t attributeCount = attributes->getLength();
152
153 for (XMLSize_t attribute_index=0;
154 attribute_index<attributeCount; attribute_index++)
155 {
156 xercesc::DOMNode* node = attributes->item(attribute_index);
157
158 if (node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE) { continue; }
159
160 const xercesc::DOMAttr* const attribute
161 = dynamic_cast<xercesc::DOMAttr*>(node);
162 if (!attribute)
163 {
164 G4Exception("G4GDMLRead::ConstantRead()", "InvalidRead",
165 FatalException, "No attribute found!");
166 return;
167 }
168 const G4String attName = Transcode(attribute->getName());
169 const G4String attValue = Transcode(attribute->getValue());
170
171 if (attName=="name") { name = attValue; } else
172 if (attName=="value") { value = eval.Evaluate(attValue); }
173 }
174
175 eval.DefineConstant(name,value);
176}
177
178void
179G4GDMLReadDefine::ExpressionRead(const xercesc::DOMElement* const expElement)
180{
181 G4String name = "";
182 G4double value = 0.0;
183
184 const xercesc::DOMNamedNodeMap* const attributes
185 = expElement->getAttributes();
186 XMLSize_t attributeCount = attributes->getLength();
187
188 for (XMLSize_t attribute_index=0;
189 attribute_index<attributeCount; attribute_index++)
190 {
191 xercesc::DOMNode* node = attributes->item(attribute_index);
192
193 if (node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE) { continue; }
194
195 const xercesc::DOMAttr* const attribute
196 = dynamic_cast<xercesc::DOMAttr*>(node);
197 if (!attribute)
198 {
199 G4Exception("G4GDMLRead::ExpressionRead()", "InvalidRead",
200 FatalException, "No attribute found!");
201 return;
202 }
203 const G4String attName = Transcode(attribute->getName());
204 const G4String attValue = Transcode(attribute->getValue());
205
206 if (attName=="name") { name = attValue; }
207 }
208
209 const G4String expValue = Transcode(expElement->getTextContent());
210 value = eval.Evaluate(expValue);
211 eval.DefineConstant(name,value);
212}
213
214void
215G4GDMLReadDefine::MatrixRead(const xercesc::DOMElement* const matrixElement)
216{
217 G4String name = "";
218 G4int coldim = 0;
219 G4String values = "";
220
221 const xercesc::DOMNamedNodeMap* const attributes
222 = matrixElement->getAttributes();
223 XMLSize_t attributeCount = attributes->getLength();
224
225 for (XMLSize_t attribute_index=0;
226 attribute_index<attributeCount; attribute_index++)
227 {
228 xercesc::DOMNode* node = attributes->item(attribute_index);
229
230 if (node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE) { continue; }
231
232 const xercesc::DOMAttr* const attribute
233 = dynamic_cast<xercesc::DOMAttr*>(node);
234 if (!attribute)
235 {
236 G4Exception("G4GDMLRead::MatrixRead()", "InvalidRead",
237 FatalException, "No attribute found!");
238 return;
239 }
240 const G4String attName = Transcode(attribute->getName());
241 const G4String attValue = Transcode(attribute->getValue());
242
243 if (attName=="name") { name = GenerateName(attValue); } else
244 if (attName=="coldim") { coldim = eval.EvaluateInteger(attValue); } else
245 if (attName=="values") { values = attValue; }
246 }
247
248 std::stringstream MatrixValueStream(values);
249 std::vector<G4double> valueList;
250
251 while (!MatrixValueStream.eof())
252 {
253 G4String MatrixValue;
254 MatrixValueStream >> MatrixValue;
255 valueList.push_back(eval.Evaluate(MatrixValue));
256 }
257
258 eval.DefineMatrix(name,coldim,valueList);
259
260 G4GDMLMatrix matrix(valueList.size()/coldim,coldim);
261
262 for (size_t i=0;i<valueList.size();i++)
263 {
264 matrix.Set(i/coldim,i%coldim,valueList[i]);
265 }
266
267 matrixMap[name] = matrix;
268}
269
270void
271G4GDMLReadDefine::PositionRead(const xercesc::DOMElement* const positionElement)
272{
273 G4String name = "";
274 G4double unit = 1.0;
275 G4ThreeVector position(0.,0.,0.);
276
277 const xercesc::DOMNamedNodeMap* const attributes
278 = positionElement->getAttributes();
279 XMLSize_t attributeCount = attributes->getLength();
280
281 for (XMLSize_t attribute_index=0;
282 attribute_index<attributeCount; attribute_index++)
283 {
284 xercesc::DOMNode* node = attributes->item(attribute_index);
285
286 if (node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE) { continue; }
287
288 const xercesc::DOMAttr* const attribute
289 = dynamic_cast<xercesc::DOMAttr*>(node);
290 if (!attribute)
291 {
292 G4Exception("G4GDMLRead::PositionRead()", "InvalidRead",
293 FatalException, "No attribute found!");
294 return;
295 }
296 const G4String attName = Transcode(attribute->getName());
297 const G4String attValue = Transcode(attribute->getValue());
298
299 if (attName=="name") { name = GenerateName(attValue); } else
300 if (attName=="unit") { unit = eval.Evaluate(attValue); } else
301 if (attName=="x") { position.setX(eval.Evaluate(attValue)); } else
302 if (attName=="y") { position.setY(eval.Evaluate(attValue)); } else
303 if (attName=="z") { position.setZ(eval.Evaluate(attValue)); }
304 }
305
306 positionMap[name] = position*unit;
307}
308
309void
310G4GDMLReadDefine::RotationRead(const xercesc::DOMElement* const rotationElement)
311{
312 G4String name = "";
313 G4double unit = 1.0;
314 G4ThreeVector rotation(0.,0.,0.);
315
316 const xercesc::DOMNamedNodeMap* const attributes
317 = rotationElement->getAttributes();
318 XMLSize_t attributeCount = attributes->getLength();
319
320 for (XMLSize_t attribute_index=0;
321 attribute_index<attributeCount; attribute_index++)
322 {
323 xercesc::DOMNode* node = attributes->item(attribute_index);
324
325 if (node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE) { continue; }
326
327 const xercesc::DOMAttr* const attribute
328 = dynamic_cast<xercesc::DOMAttr*>(node);
329 if (!attribute)
330 {
331 G4Exception("G4GDMLRead::RotationRead()", "InvalidRead",
332 FatalException, "No attribute found!");
333 return;
334 }
335 const G4String attName = Transcode(attribute->getName());
336 const G4String attValue = Transcode(attribute->getValue());
337
338 if (attName=="name") { name = GenerateName(attValue); } else
339 if (attName=="unit") { unit = eval.Evaluate(attValue); } else
340 if (attName=="x") { rotation.setX(eval.Evaluate(attValue)); } else
341 if (attName=="y") { rotation.setY(eval.Evaluate(attValue)); } else
342 if (attName=="z") { rotation.setZ(eval.Evaluate(attValue)); }
343 }
344
345 rotationMap[name] = rotation*unit;
346}
347
348void G4GDMLReadDefine::ScaleRead(const xercesc::DOMElement* const scaleElement)
349{
350 G4String name = "";
351 G4ThreeVector scale(1.0,1.0,1.0);
352
353 const xercesc::DOMNamedNodeMap* const attributes
354 = scaleElement->getAttributes();
355 XMLSize_t attributeCount = attributes->getLength();
356
357 for (XMLSize_t attribute_index=0;
358 attribute_index<attributeCount; attribute_index++)
359 {
360 xercesc::DOMNode* node = attributes->item(attribute_index);
361
362 if (node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE) { continue; }
363
364 const xercesc::DOMAttr* const attribute
365 = dynamic_cast<xercesc::DOMAttr*>(node);
366 if (!attribute)
367 {
368 G4Exception("G4GDMLRead::ScaleRead()", "InvalidRead",
369 FatalException, "No attribute found!");
370 return;
371 }
372 const G4String attName = Transcode(attribute->getName());
373 const G4String attValue = Transcode(attribute->getValue());
374
375 if (attName=="name") { name = GenerateName(attValue); } else
376 if (attName=="x") { scale.setX(eval.Evaluate(attValue)); } else
377 if (attName=="y") { scale.setY(eval.Evaluate(attValue)); } else
378 if (attName=="z") { scale.setZ(eval.Evaluate(attValue)); }
379 }
380
381 scaleMap[name] = scale;
382}
383
384void
385G4GDMLReadDefine::VariableRead(const xercesc::DOMElement* const variableElement)
386{
387 G4String name = "";
388 G4double value = 0.0;
389
390 const xercesc::DOMNamedNodeMap* const attributes
391 = variableElement->getAttributes();
392 XMLSize_t attributeCount = attributes->getLength();
393
394 for (XMLSize_t attribute_index=0;
395 attribute_index<attributeCount; attribute_index++)
396 {
397 xercesc::DOMNode* node = attributes->item(attribute_index);
398
399 if (node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE) { continue; }
400
401 const xercesc::DOMAttr* const attribute
402 = dynamic_cast<xercesc::DOMAttr*>(node);
403 if (!attribute)
404 {
405 G4Exception("G4GDMLRead::VariableRead()", "InvalidRead",
406 FatalException, "No attribute found!");
407 return;
408 }
409 const G4String attName = Transcode(attribute->getName());
410 const G4String attValue = Transcode(attribute->getValue());
411
412 if (attName=="name") { name = attValue; } else
413 if (attName=="value") { value = eval.Evaluate(attValue); }
414 }
415
416 eval.DefineVariable(name,value);
417}
418
419void G4GDMLReadDefine::QuantityRead(const xercesc::DOMElement* const element)
420{
421 G4String name = "";
422 G4double unit = 1.0;
423 G4double value = 0.0;
424
425 const xercesc::DOMNamedNodeMap* const attributes
426 = element->getAttributes();
427 XMLSize_t attributeCount = attributes->getLength();
428
429 for (XMLSize_t attribute_index=0;
430 attribute_index<attributeCount; attribute_index++)
431 {
432 xercesc::DOMNode* node = attributes->item(attribute_index);
433
434 if (node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE) { continue; }
435
436 const xercesc::DOMAttr* const attribute
437 = dynamic_cast<xercesc::DOMAttr*>(node);
438 if (!attribute)
439 {
440 G4Exception("G4GDMLRead::QuantityRead()", "InvalidRead",
441 FatalException, "No attribute found!");
442 return;
443 }
444 const G4String attName = Transcode(attribute->getName());
445 const G4String attValue = Transcode(attribute->getValue());
446
447 if (attName=="name") { name = attValue; } else
448 if (attName=="value") { value = eval.Evaluate(attValue); } else
449 if (attName=="unit") { unit = eval.Evaluate(attValue); }
450 }
451
452 quantityMap[name] = value*unit;
453 eval.DefineConstant(name,value*unit);
454}
455
456void
457G4GDMLReadDefine::DefineRead(const xercesc::DOMElement* const defineElement)
458{
459 G4cout << "G4GDML: Reading definitions..." << G4endl;
460
461 for (xercesc::DOMNode* iter = defineElement->getFirstChild();
462 iter != 0;iter = iter->getNextSibling())
463 {
464 if (iter->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) { continue; }
465
466 const xercesc::DOMElement* const child
467 = dynamic_cast<xercesc::DOMElement*>(iter);
468 if (!child)
469 {
470 G4Exception("G4GDMLRead::DefineRead()", "InvalidRead",
471 FatalException, "No child found!");
472 return;
473 }
474 const G4String tag = Transcode(child->getTagName());
475
476 if (tag=="constant") { ConstantRead(child); } else
477 if (tag=="matrix") { MatrixRead(child); } else
478 if (tag=="position") { PositionRead(child); } else
479 if (tag=="rotation") { RotationRead(child); } else
480 if (tag=="scale") { ScaleRead(child); } else
481 if (tag=="variable") { VariableRead(child); } else
482 if (tag=="quantity") { QuantityRead(child); } else
483 if (tag=="expression") { ExpressionRead(child); }
484 else
485 {
486 G4String error_msg = "Unknown tag in define: "+tag;
487 G4Exception("G4GDMLReadDefine::defineRead()", "ReadError",
488 FatalException, error_msg);
489 }
490 }
491}
492
493void
494G4GDMLReadDefine::VectorRead(const xercesc::DOMElement* const vectorElement,
495 G4ThreeVector& vec)
496{
497 G4double unit = 1.0;
498
499 const xercesc::DOMNamedNodeMap* const attributes
500 = vectorElement->getAttributes();
501 XMLSize_t attributeCount = attributes->getLength();
502
503 for (XMLSize_t attribute_index=0;
504 attribute_index<attributeCount; attribute_index++)
505 {
506 xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
507
508 if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
509 { continue; }
510
511 const xercesc::DOMAttr* const attribute
512 = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
513 if (!attribute)
514 {
515 G4Exception("G4GDMLRead::VectorRead()", "InvalidRead",
516 FatalException, "No attribute found!");
517 return;
518 }
519 const G4String attName = Transcode(attribute->getName());
520 const G4String attValue = Transcode(attribute->getValue());
521
522 if (attName=="unit") { unit = eval.Evaluate(attValue); } else
523 if (attName=="x") { vec.setX(eval.Evaluate(attValue)); } else
524 if (attName=="y") { vec.setY(eval.Evaluate(attValue)); } else
525 if (attName=="z") { vec.setZ(eval.Evaluate(attValue)); }
526 }
527
528 vec *= unit;
529}
530
531G4String G4GDMLReadDefine::RefRead(const xercesc::DOMElement* const element)
532{
533 G4String ref;
534
535 const xercesc::DOMNamedNodeMap* const attributes = element->getAttributes();
536 XMLSize_t attributeCount = attributes->getLength();
537
538 for (XMLSize_t attribute_index=0;
539 attribute_index<attributeCount; attribute_index++)
540 {
541 xercesc::DOMNode* attribute_node = attributes->item(attribute_index);
542
543 if (attribute_node->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
544 { continue; }
545
546 const xercesc::DOMAttr* const attribute
547 = dynamic_cast<xercesc::DOMAttr*>(attribute_node);
548 if (!attribute)
549 {
550 G4Exception("G4GDMLRead::Read()", "InvalidRead",
551 FatalException, "No attribute found!");
552 return ref;
553 }
554 const G4String attName = Transcode(attribute->getName());
555 const G4String attValue = Transcode(attribute->getValue());
556
557 if (attName=="ref") { ref = attValue; }
558 }
559
560 return ref;
561}
562
564{
565 return eval.IsVariable(ref);
566}
567
569{
570 return eval.GetConstant(ref);
571}
572
574{
575 return eval.GetVariable(ref);
576}
577
579{
580 if (quantityMap.find(ref) == quantityMap.end())
581 {
582 G4String error_msg = "Quantity '"+ref+"' was not found!";
583 G4Exception("G4GDMLReadDefine::getQuantity()", "ReadError",
584 FatalException, error_msg);
585 }
586 return quantityMap[ref];
587}
588
590{
591 if (positionMap.find(ref) == positionMap.end())
592 {
593 G4String error_msg = "Position '"+ref+"' was not found!";
594 G4Exception("G4GDMLReadDefine::getPosition()", "ReadError",
595 FatalException, error_msg);
596 }
597 return positionMap[ref];
598}
599
601{
602 if (rotationMap.find(ref) == rotationMap.end())
603 {
604 G4String error_msg = "Rotation '"+ref+"' was not found!";
605 G4Exception("G4GDMLReadDefine::getRotation()", "ReadError",
606 FatalException, error_msg);
607 }
608 return rotationMap[ref];
609}
610
612{
613 if (scaleMap.find(ref) == scaleMap.end())
614 {
615 G4String error_msg = "Scale '"+ref+"' was not found!";
616 G4Exception("G4GDMLReadDefine::getScale()", "ReadError",
617 FatalException, error_msg);
618 }
619 return scaleMap[ref];
620}
621
623{
624 if (matrixMap.find(ref) == matrixMap.end())
625 {
626 G4String error_msg = "Matrix '"+ref+"' was not found!";
627 G4Exception("G4GDMLReadDefine::getMatrix()", "ReadError",
628 FatalException, error_msg);
629 }
630 return matrixMap[ref];
631}
@ FatalException
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
double z() const
double x() const
void setY(double)
double y() const
void setZ(double)
void setX(double)
HepRotation & rotateX(double delta)
Definition: Rotation.cc:66
HepRotation & rotateZ(double delta)
Definition: Rotation.cc:92
HepRotation & rotateY(double delta)
Definition: Rotation.cc:79
G4double Evaluate(const G4String &)
void DefineVariable(const G4String &, G4double)
void DefineConstant(const G4String &, G4double)
void DefineMatrix(const G4String &, G4int, std::vector< G4double >)
G4double GetVariable(const G4String &)
G4bool IsVariable(const G4String &) const
G4int EvaluateInteger(const G4String &)
G4double GetConstant(const G4String &)
void Set(size_t r, size_t c, G4double a)
G4GDMLMatrix & operator=(const G4GDMLMatrix &rhs)
size_t GetCols() const
G4double Get(size_t r, size_t c) const
size_t GetRows() const
void ExpressionRead(const xercesc::DOMElement *const)
void VariableRead(const xercesc::DOMElement *const)
void QuantityRead(const xercesc::DOMElement *const)
G4ThreeVector GetScale(const G4String &)
std::map< G4String, G4ThreeVector > scaleMap
G4bool IsValidID(const G4String &) const
G4double GetQuantity(const G4String &)
G4double GetConstant(const G4String &)
void VectorRead(const xercesc::DOMElement *const, G4ThreeVector &)
std::map< G4String, G4ThreeVector > positionMap
void PositionRead(const xercesc::DOMElement *const)
G4RotationMatrix GetRotationMatrix(const G4ThreeVector &)
void MatrixRead(const xercesc::DOMElement *const)
void RotationRead(const xercesc::DOMElement *const)
G4double GetVariable(const G4String &)
G4ThreeVector GetPosition(const G4String &)
std::map< G4String, G4GDMLMatrix > matrixMap
G4GDMLMatrix GetMatrix(const G4String &)
G4String RefRead(const xercesc::DOMElement *const)
std::map< G4String, G4double > quantityMap
std::map< G4String, G4ThreeVector > rotationMap
virtual ~G4GDMLReadDefine()
void ScaleRead(const xercesc::DOMElement *const)
G4ThreeVector GetRotation(const G4String &)
virtual void DefineRead(const xercesc::DOMElement *const)
void ConstantRead(const xercesc::DOMElement *const)
G4String GenerateName(const G4String &name, G4bool strip=false)
Definition: G4GDMLRead.cc:68
G4String Transcode(const XMLCh *const)
Definition: G4GDMLRead.cc:55
G4GDMLEvaluator eval
Definition: G4GDMLRead.hh:144
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
Definition: xmlparse.cc:179
#define position
Definition: xmlparse.cc:605