CMS 3D CMS Logo

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