CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DDLPolyGenerator.cc
Go to the documentation of this file.
1 /***************************************************************************
2  DDLPolyGenerator.cpp - description
3  -------------------
4  begin : Thu Oct 25 2001
5  email : case@ucdhep.ucdavis.edu
6  ***************************************************************************/
7 
8 /***************************************************************************
9  * *
10  * DDDParser sub-component of DDD *
11  * *
12  ***************************************************************************/
13 
15 
19 
21 
23  : DDLSolid( myreg )
24 {}
25 
27 {}
28 
29 void
30 DDLPolyGenerator::preProcessElement( const std::string& name, const std::string& nmspace, DDCompactView& cpv )
31 {
32  myRegistry_->getElement("RZPoint")->clear();
33  myRegistry_->getElement("ZSection")->clear();
34 }
35 
36 // Upon encountering an end Polycone or Polyhedra tag, process the RZPoints
37 // element and extract the r and z std::vectors to feed into DDCore. Then, clear
38 // the RZPoints and clear this element.
39 void
40 DDLPolyGenerator::processElement( const std::string& name, const std::string& nmspace, DDCompactView& cpv )
41 {
42  DCOUT_V('P', "DDLPolyGenerator::processElement started");
43 
44  DDXMLElement* myRZPoints = myRegistry_->getElement("RZPoint");
45  DDXMLElement* myZSection = myRegistry_->getElement("ZSection");
46 
48  DDXMLAttribute atts;
49 
50  // get z and r
51  std::vector<double> z, r;
52  for (size_t i = 0; i < myRZPoints->size(); ++i)
53  {
54  atts = myRZPoints->getAttributeSet(i);
55  z.push_back(ev.eval(nmspace, atts.find("z")->second));
56  r.push_back(ev.eval(nmspace, atts.find("r")->second));
57  }
58 
59  // if z is empty, then it better not have been a polycone defined
60  // by RZPoints, instead, it must be a ZSection defined polycone.
61  if (z.size() == 0 )
62  {
63  // get zSection information, note, we already have a z declared above
64  // and we will use r for rmin. In this case, no use "trying" because
65  // it better be there!
66  std::vector<double> rMax;
67 
68  for (size_t i = 0; i < myZSection->size(); ++i)
69  {
70  atts = myZSection->getAttributeSet(i);
71  z.push_back(ev.eval(nmspace, atts.find("z")->second));
72  r.push_back(ev.eval(nmspace, atts.find("rMin")->second));
73  rMax.push_back(ev.eval(nmspace, atts.find("rMax")->second));
74  }
75  atts = getAttributeSet();
76  if (name == "Polycone") // defined with ZSections
77  {
78  DDSolid ddpolycone =
80  , ev.eval(nmspace, atts.find("startPhi")->second)
81  , ev.eval(nmspace, atts.find("deltaPhi")->second)
82  , z
83  , r
84  , rMax);
85  }
86  else if (name == "Polyhedra") // defined with ZSections
87  {
88  DDSolid ddpolyhedra =
90  , int (ev.eval(nmspace, atts.find("numSide")->second))
91  , ev.eval(nmspace, atts.find("startPhi")->second)
92  , ev.eval(nmspace, atts.find("deltaPhi")->second)
93  , z
94  , r
95  , rMax);
96  }
97 
98  }
99  else if (name == "Polycone") // defined with RZPoints
100  {
101  atts = getAttributeSet();
102  DDSolid ddpolycone =
104  , ev.eval(nmspace, atts.find("startPhi")->second)
105  , ev.eval(nmspace, atts.find("deltaPhi")->second)
106  , z
107  , r);
108  }
109  else if (name == "Polyhedra") // defined with RZPoints
110  {
111  atts = getAttributeSet();
112  DDSolid ddpolyhedra =
114  , int (ev.eval(nmspace, atts.find("numSide")->second))
115  , ev.eval(nmspace, atts.find("startPhi")->second)
116  , ev.eval(nmspace, atts.find("deltaPhi")->second)
117  , z
118  , r);
119  }
120  else
121  {
122  std::string msg = "\nDDLPolyGenerator::processElement was called with incorrect name of solid: " + name;
123  throwError(msg);
124  }
125  DDLSolid::setReference(nmspace, cpv);
126 
127  // clear out RZPoint element accumulator and ZSections
128  myRZPoints->clear();
129  myZSection->clear();
130  clear();
131 
132  DCOUT_V('P', "DDLPolyGenerator::processElement completed");
133 }
int i
Definition: DBlmapReader.cc:9
DDLElementRegistry * myRegistry_
Definition: DDXMLElement.h:186
DDLPolyGenerator(DDLElementRegistry *myreg)
Constructor.
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:656
virtual const DDXMLAttribute & getAttributeSet(size_t aIndex=0) const
Get a &quot;row&quot; of attributes, i.e. one attribute set.
Definition: DDXMLElement.cc:79
void processElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv)
Processing the element.
void throwError(const std::string &keyMessage) const
format std::string for throw an error.
type of data representation of DDCompactView
Definition: DDCompactView.h:77
double double double z
std::map< std::string, std::string > DDXMLAttribute
Definition: DDXMLElement.h:55
A DDSolid represents the shape of a part.
Definition: DDSolid.h:35
~DDLPolyGenerator(void)
Destructor.
DDXMLElement * getElement(const std::string &name)
THE most important part. Getting the pointer to a given element type.
static value_type & instance()
virtual size_t size(void) const
Number of elements accumulated.
Interface of an Expression Evaluator.
#define DCOUT_V(M_v_Y, M_v_S)
Definition: DDdebug.h:54
DDLSolid processes Box elements.
Definition: DDLSolid.h:27
virtual double eval(const std::string &ns, const std::string &expr)=0
evaluate an expression expr inside the local namespace
This is a base class for processing XML elements in the DDD.
Definition: DDXMLElement.h:58
The main class for processing parsed elements.
virtual void clear(void)
clear this element&#39;s contents.
Definition: DDXMLElement.cc:61
void preProcessElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv)
Called by loadAttributes AFTER attributes are loaded.
virtual const DDName getDDName(const std::string &defaultNS, const std::string &attname=std::string("name"), size_t aIndex=0)
Definition: DDXMLElement.cc:86
void setReference(const std::string &nmspace, DDCompactView &cpv)
Definition: DDLSolid.cc:26
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:673