CMS 3D CMS Logo

DDLPolyGenerator.cc
Go to the documentation of this file.
7 
8 #include <cstddef>
9 #include <map>
10 #include <utility>
11 #include <vector>
12 
13 class DDCompactView;
14 
16  : DDLSolid( myreg )
17 {}
18 
19 void
21 {
22  myRegistry_->getElement("RZPoint")->clear();
23  myRegistry_->getElement("ZSection")->clear();
24 }
25 
26 // Upon encountering an end Polycone or Polyhedra tag, process the RZPoints
27 // element and extract the r and z std::vectors to feed into DDCore. Then, clear
28 // the RZPoints and clear this element.
29 void
31 {
32  auto myRZPoints = myRegistry_->getElement("RZPoint");
33  auto myZSection = myRegistry_->getElement("ZSection");
34 
36  DDXMLAttribute atts;
37 
38  // get z and r
39  std::vector<double> z, r, x, y;
40  for (size_t i = 0; i < myRZPoints->size(); ++i)
41  {
42  atts = myRZPoints->getAttributeSet(i);
43  z.emplace_back(ev.eval(nmspace, atts.find("z")->second));
44  r.emplace_back(ev.eval(nmspace, atts.find("r")->second));
45  }
46 
47  // if z is empty, then it better not have been a polycone defined
48  // by RZPoints, instead, it must be a ZSection defined polycone.
49  if (z.empty() )
50  {
51  // get zSection information, note, we already have a z declared above
52  // and we will use r for rmin. In this case, no use "trying" because
53  // it better be there!
54  std::vector<double> rMax;
55 
56  for (size_t i = 0; i < myZSection->size(); ++i)
57  {
58  atts = myZSection->getAttributeSet(i);
59  z.emplace_back(ev.eval(nmspace, atts.find("z")->second));
60  r.emplace_back(ev.eval(nmspace, atts.find("rMin")->second));
61  rMax.emplace_back(ev.eval(nmspace, atts.find("rMax")->second));
62  }
63  atts = getAttributeSet();
64  if (name == "Polycone") // defined with ZSections
65  {
66  DDSolid ddpolycone =
68  , ev.eval(nmspace, atts.find("startPhi")->second)
69  , ev.eval(nmspace, atts.find("deltaPhi")->second)
70  , z
71  , r
72  , rMax);
73  }
74  else if (name == "Polyhedra") // defined with ZSections
75  {
76  DDSolid ddpolyhedra =
78  , int (ev.eval(nmspace, atts.find("numSide")->second))
79  , ev.eval(nmspace, atts.find("startPhi")->second)
80  , ev.eval(nmspace, atts.find("deltaPhi")->second)
81  , z
82  , r
83  , rMax);
84  }
85 
86  }
87  else if (name == "Polycone") // defined with RZPoints
88  {
89  atts = getAttributeSet();
90  DDSolid ddpolycone =
92  , ev.eval(nmspace, atts.find("startPhi")->second)
93  , ev.eval(nmspace, atts.find("deltaPhi")->second)
94  , z
95  , r);
96  }
97  else if (name == "Polyhedra") // defined with RZPoints
98  {
99  atts = getAttributeSet();
100  DDSolid ddpolyhedra =
102  , int (ev.eval(nmspace, atts.find("numSide")->second))
103  , ev.eval(nmspace, atts.find("startPhi")->second)
104  , ev.eval(nmspace, atts.find("deltaPhi")->second)
105  , z
106  , r);
107  } else
108  {
109  std::string msg = "\nDDLPolyGenerator::processElement was called with incorrect name of solid: " + name;
110  throwError(msg);
111  }
112  DDLSolid::setReference(nmspace, cpv);
113 
114  // clear out RZPoint element accumulator and ZSections
115  myRZPoints->clear();
116  myZSection->clear();
117  clear();
118 }
DDLElementRegistry * myRegistry_
Definition: DDXMLElement.h:172
void processElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv) override
Processing the element.
void preProcessElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv) override
Called by loadAttributes AFTER attributes are loaded.
DDLPolyGenerator(DDLElementRegistry *myreg)
static DDSolid polycone(const DDName &name, double startPhi, double deltaPhi, const std::vector< double > &z, const std::vector< double > &rmin, const std::vector< double > &rmax)
Creates a polycone (refere to Geant3 or Geant4 documentation)
Definition: DDSolid.cc:713
virtual const DDXMLAttribute & getAttributeSet(size_t aIndex=0) const
Get a "row" of attributes, i.e. one attribute set.
Definition: DDXMLElement.cc:72
void throwError(const std::string &keyMessage) const
format std::string for throw an error.
bool ev
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:80
std::map< std::string, std::string > DDXMLAttribute
Definition: DDXMLElement.h:45
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
ClhepEvaluator & evaluator()
std::shared_ptr< DDXMLElement > getElement(const std::string &name)
THE most important part. Getting the pointer to a given element type.
DDLSolid processes Box elements.
Definition: DDLSolid.h:30
tuple msg
Definition: mps_check.py:279
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
virtual const DDName getDDName(const std::string &defaultNS, const std::string &attname=std::string("name"), size_t aIndex=0)
Definition: DDXMLElement.cc:79
void setReference(const std::string &nmspace, DDCompactView &cpv)
Definition: DDLSolid.cc:16
static DDSolid polyhedra(const DDName &name, int sides, double startPhi, double deltaPhi, const std::vector< double > &z, const std::vector< double > &rmin, const std::vector< double > &rmax)
Creates a polyhedra (refere to Geant3 or Geant4 documentation)
Definition: DDSolid.cc:730