CMS 3D CMS Logo

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 }
DDLPosPart::DDLPosPart
DDLPosPart(DDLElementRegistry *myreg)
Definition: DDLPosPart.cc:16
DDXMLElement::clear
virtual void clear(void)
clear this element's contents.
Definition: DDXMLElement.cc:40
DDAxes::y
DDTransform.h
MessageLogger.h
DDName
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:15
ClhepEvaluator.h
DDLPosPart::processElement
void processElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv) override
Processing the element.
Definition: DDLPosPart.cc:32
DDLElementRegistry
The main class for processing parsed elements.
Definition: DDLElementRegistry.h:23
ClhepEvaluator
Definition: ClhepEvaluator.h:8
DDAxes::x
DDrotPtr
std::unique_ptr< DDRotation > DDrotPtr(const DDName &name, std::unique_ptr< DDRotationMatrix > rot)
Definition: DDRotation.cc:72
DDCompactView.h
DDXMLElement::getAttributeSet
virtual const DDXMLAttribute & getAttributeSet(size_t aIndex=0) const
Get a "row" of attributes, i.e. one attribute set.
Definition: DDXMLElement.cc:54
DDLElementRegistry::evaluator
ClhepEvaluator & evaluator()
Definition: DDLElementRegistry.h:42
DDTranslation
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
DDCompactView
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:80
DDAxes::z
DDXMLAttribute
std::map< std::string, std::string > DDXMLAttribute
Definition: DDXMLElement.h:45
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
DDLPosPart::preProcessElement
void preProcessElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv) override
Called by loadAttributes AFTER attributes are loaded.
Definition: DDLPosPart.cc:23
DDLogicalPart
A DDLogicalPart aggregates information concerning material, solid and sensitveness ....
Definition: DDLogicalPart.h:93
DDXMLElement
This is a base class for processing XML elements in the DDD.
Definition: DDXMLElement.h:48
DDName::name
const std::string & name() const
Returns the name.
Definition: DDName.cc:40
DDTranslation.h
DDLElementRegistry.h
DDLogicalPart.h
DDLElementRegistry::getElement
std::shared_ptr< DDXMLElement > getElement(const std::string &name)
THE most important part. Getting the pointer to a given element type.
Definition: DDLElementRegistry.cc:42
DDName::ns
const std::string & ns() const
Returns the namespace.
Definition: DDName.cc:51
DDXMLElement.h
DDName.h
ev
bool ev
Definition: Hydjet2Hadronizer.cc:95
Skims_PA_cff.name
name
Definition: Skims_PA_cff.py:17
DDXMLElement::myRegistry_
DDLElementRegistry * myRegistry_
Definition: DDXMLElement.h:173
DDCompactView::position
void position(const DDLogicalPart &self, const DDLogicalPart &parent, const std::string &copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=nullptr)
Definition: DDCompactView.cc:66
DDRotationMatrix.h
DDLPosPart.h