CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DDLPosPart.cc
Go to the documentation of this file.
12 
13 #include <map>
14 #include <utility>
15 
17 
18 // Upon encountering a PosPart, store the label, simple.
19 // Just in case some left-over Rotation has not been cleared, make sure
20 // that it is cleared.
21 // I commented out the others because the last element
22 // that made use of them should have cleared them.
24  // Clear out child elements.
25  myRegistry_->getElement("Rotation")->clear();
26  myRegistry_->getElement("ReflectionRotation")->clear();
27 }
28 
29 // Upon encountering the end tag of the PosPart we should have in the meantime
30 // hit two rLogicalPart calls and one of Rotation or rRotation and a Translation.
31 // So, retrieve them and make the call to DDCore.
33  // get all internal elements.
34  auto myParent = myRegistry_->getElement("rParent");
35  auto myChild = myRegistry_->getElement("rChild");
36  auto myTranslation = myRegistry_->getElement("Translation");
37  auto myDDLRotation = myRegistry_->getElement("Rotation");
38  auto myrRotation = myRegistry_->getElement("rRotation");
39  auto myDDLRefl = myRegistry_->getElement("ReflectionRotation");
40  auto myrRefl = myRegistry_->getElement("rReflectionRotation");
41  // FIXME!!! add in the new RotationByAxis element...
42 
43  // At this time, PosPart is becoming the most complex of the elements.
44  // For simply reflections/rotations we have 4 possible internal "components"
45  // to the PosPart. We take them in the following order of priority
46  // rRotation, Rotation, rReflectionRotation, ReflectionRotation.
47  //
48  // The idea in the following if-else-if is that no matter
49  // what was used inside the PosPart element, the order in which we
50  // will look for and use an internal element is:
51  // rRotation, Rotation, ReflectionRotation, rReflectionRotation.
52  // If it falls through here, a default call will result in a nameless
53  // "identity" rotation being passed to DDCore.
54  DDName rotn(
55  (myrRotation->size() > 0)
56  ? myrRotation->getDDName(nmspace)
57  : ((myDDLRotation->size() > 0)
58  ? myDDLRotation->getDDName(nmspace)
59  : ((myDDLRefl->size() > 0) ? myDDLRefl->getDDName(nmspace)
60  : ((myrRefl->size() > 0) ? myrRefl->getDDName(nmspace) : DDName("")))));
61 
63 
64  double x = 0.0, y = 0.0, z = 0.0;
65  if (myTranslation->size() > 0) {
66  const DDXMLAttribute& atts = myTranslation->getAttributeSet();
67  x = ev.eval(nmspace, atts.find("x")->second);
68  y = ev.eval(nmspace, atts.find("y")->second);
69  z = ev.eval(nmspace, atts.find("z")->second);
70  }
71 
72  std::unique_ptr<DDRotation> myDDRotation;
73  // if rotation is named ...
74  if (!rotn.name().empty() && !rotn.ns().empty()) {
75  myDDRotation = std::make_unique<DDRotation>(rotn);
76  } else {
77  // rotn is not assigned a name anywhere therefore the DDPos assumes the identity matrix.
78  myDDRotation = std::make_unique<DDRotation>(DDName(std::string("identity"), std::string("generatedForDDD")));
79  // if the identity is not yet defined, then...
80  if (!myDDRotation->isValid()) {
81  myDDRotation = DDrotPtr(DDName(std::string("identity"), std::string("generatedForDDD")),
82  std::make_unique<DDRotationMatrix>());
83  }
84  }
85 
86  DDTranslation myDDTranslation(x, y, z);
87 
88  const DDXMLAttribute& atts = getAttributeSet();
89  std::string copyno = "";
90  if (atts.find("copyNumber") != atts.end())
91  copyno = atts.find("copyNumber")->second;
92 
93  cpv.position(DDLogicalPart(myChild->getDDName(nmspace)),
94  DDLogicalPart(myParent->getDDName(nmspace)),
95  copyno,
96  myDDTranslation,
97  *myDDRotation);
98 
99  // clear all "children" and attributes
100  myParent->clear();
101  myChild->clear();
102  myTranslation->clear();
103  myDDLRotation->clear();
104  myrRotation->clear();
105  myDDLRefl->clear();
106  myrRefl->clear();
107 
108  // after a pos part is done, we know we can clear it.
109  clear();
110 }
void preProcessElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv) override
Called by loadAttributes AFTER attributes are loaded.
Definition: DDLPosPart.cc:23
DDLElementRegistry * myRegistry_
Definition: DDXMLElement.h:173
void position(const DDLogicalPart &self, const DDLogicalPart &parent, const std::string &copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=nullptr)
virtual const DDXMLAttribute & getAttributeSet(size_t aIndex=0) const
Get a &quot;row&quot; of attributes, i.e. one attribute set.
Definition: DDXMLElement.cc:54
const std::string & ns() const
Returns the namespace.
Definition: DDName.cc:52
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:17
bool ev
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:81
std::unique_ptr< DDRotation > DDrotPtr(const DDName &name, std::unique_ptr< DDRotationMatrix > rot)
Definition: DDRotation.cc:72
std::map< std::string, std::string > DDXMLAttribute
Definition: DDXMLElement.h:45
ClhepEvaluator & evaluator()
void processElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv) override
Processing the element.
Definition: DDLPosPart.cc:32
DDLPosPart(DDLElementRegistry *myreg)
Definition: DDLPosPart.cc:16
std::shared_ptr< DDXMLElement > getElement(const std::string &name)
THE most important part. Getting the pointer to a given element type.
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:93
This is a base class for processing XML elements in the DDD.
Definition: DDXMLElement.h:48
double eval(const std::string &ns, const std::string &expr)
The main class for processing parsed elements.
virtual void clear(void)
clear this element&#39;s contents.
Definition: DDXMLElement.cc:40
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
const std::string & name() const
Returns the name.
Definition: DDName.cc:41