CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DDLElementRegistry.cc
Go to the documentation of this file.
1 /***************************************************************************
2  DDLElementRegistry.cc - description
3  -------------------
4  begin : Wed Oct 24 2001
5  email : case@ucdhep.ucdavis.edu
6  ***************************************************************************/
7 
8 /***************************************************************************
9  * *
10  * DDDParser sub-component of DDD *
11  * Nov 25, 2003 : note that comments on DDLRotation are for future *
12  * changes which break backward compatibility. *
13  * *
14  ***************************************************************************/
15 
45 
48 
49 #include <iostream>
50 
52 {}
53 
55 {
56  // Complicated cleanup. I keep track of DDXMLElements that have
57  // already been deleted using this vector. Then delete them one-by-one.
58  std::vector<DDXMLElement*> toDelete;
59  for( RegistryMap::const_iterator it = registry_.begin(), end = registry_.end(); it != end; ++it )
60  {
61  std::vector<DDXMLElement*>::const_iterator deleteIt = std::find( toDelete.begin(), toDelete.end(), it->second );
62  if( deleteIt == toDelete.end())
63  {
64  toDelete.push_back( it->second );
65  delete it->second;
66  }
67  }
68 }
69 
70 // -------------------------------------------------------------------------
71 // Implementation
72 // -------------------------------------------------------------------------
75 {
76  DCOUT_V('P',"myRegistry_->getElementRegistry(" << name << ")");
77 
78  // DDXMLElement* myret = instance()->DDXMLElementRegistry::getElement(name);
79  RegistryMap::iterator it = registry_.find(name);
80  // std::cout << "it found name? "<< name << " " ;
81  // if (it != registry_.end() ) std::cout << "yes"; else std::cout << "no";
82  // std::cout << std::endl;
83  // std::cout << "there are " << registry_.size() << " elements-types so far." << std::endl;
84  DDXMLElement* myret = NULL;
85  if( it != registry_.end())
86  {
87  myret = it->second;
88  } else {
89  // std::cout << " making first and only " << name << std::endl;
90  // Make the Solid handlers and register them.
91  if (name == "Box")
92  {
93  myret = new DDLBox(this);
94  }
95  else if (name == "Cone")
96  {
97  myret = new DDLCone(this);
98  }
99  else if (name == "Polyhedra" || name == "Polycone")
100  {
101  myret = new DDLPolyGenerator(this);
102  }
103  else if (name == "Trapezoid" || name == "Trd1")
104  {
105  myret = new DDLTrapezoid(this);
106  }
107  else if (name == "PseudoTrap")
108  {
109  myret = new DDLPseudoTrap(this);
110  }
111  else if (name == "Tubs" || name == "Tube" || name == "TruncTubs")
112  {
113  myret = new DDLTubs(this);
114  }
115  else if (name == "Torus")
116  {
117  myret = new DDLTorus(this);
118  }
119  else if (name == "ReflectionSolid")
120  {
121  myret = new DDLReflectionSolid(this);
122  }
123  else if (name == "UnionSolid" || name == "SubtractionSolid"
124  || name == "IntersectionSolid")
125  {
126  myret = new DDLBooleanSolid(this);
127  }
128  else if (name == "ShapelessSolid")
129  {
130  myret = new DDLShapelessSolid(this);
131  }
132  else if (name == "Sphere")
133  {
134  myret = new DDLSphere(this);
135  }
136  else if (name == "Orb")
137  {
138  myret = new DDLOrb(this);
139  }
140  else if (name == "EllipticalTube")
141  {
142  myret = new DDLEllipticalTube(this);
143  }
144  else if (name == "Ellipsoid")
145  {
146  myret = new DDLEllipsoid(this);
147  }
148  else if (name == "Sphere")
149  {
150  myret = new DDLParallelepiped(this);
151  }
152 
153  // LogicalParts, Positioners, Materials, Rotations, Reflections
154  // and Specific (Specified?) Parameters
155  else if (name == "PosPart")
156  {
157  myret = new DDLPosPart(this);
158  }
159  else if (name == "CompositeMaterial")
160  {
161  myret = new DDLCompositeMaterial(this);
162  }
163  else if (name == "ElementaryMaterial")
164  {
165  myret = new DDLElementaryMaterial(this);
166  }
167  else if (name == "LogicalPart")
168  {
169  myret = new DDLLogicalPart(this);
170  }
171  else if (name == "ReflectionRotation" || name == "Rotation" )
172  {
173  myret = new DDLRotationAndReflection(this);
174  }
175  else if (name == "SpecPar")
176  {
177  myret = new DDLSpecPar(this);
178  }
179  else if (name == "RotationSequence")
180  {
181  myret = new DDLRotationSequence(this);
182  }
183  else if (name == "RotationByAxis")
184  {
185  myret = new DDLRotationByAxis(this);
186  }
187  // Special, need them around.
188  else if (name == "SpecParSection") {
189  myret = new DDXMLElement(this, true);
190  }
191  else if (name == "Vector") {
192  myret = new DDLVector(this);
193  }
194  else if (name == "Map") {
195  myret = new DDLMap(this);
196  }
197  else if (name == "String") {
198  myret = new DDLString(this);
199  }
200  else if (name == "Numeric") {
201  myret = new DDLNumeric(this);
202  }
203  else if (name == "Algorithm") {
204  myret = new DDLAlgorithm(this);
205  }
206  else if (name == "Division") {
207  myret = new DDLDivision(this);
208  }
209 
210  // Supporting Cast of elements.
211  // All elements which simply accumulate attributes which are then used
212  // by one of the above elements.
213  else if (name == "MaterialFraction"
214  || name == "RZPoint" || name == "PartSelector"
215  || name == "Parameter" || name == "ZSection"
216  || name == "Translation"
217  || name == "rSolid" || name == "rMaterial"
218  || name == "rParent" || name == "rChild"
219  || name == "rRotation" || name == "rReflectionRotation"
220  || name == "DDDefinition" )
221  {
222  myret = new DDXMLElement(this);
223  }
224 
225  // IF it is a new element return a default XMLElement which processes nothing.
226  // Since there are elements in the XML which require no processing, they
227  // can all use the same DDXMLElement which defaults to anything. A validated
228  // XML document (i.e. validated with XML Schema) will work properly.
229  // As of 8/16/2002: Elements like LogicalPartSection and any other *Section
230  // XML elements of the DDLSchema are taken care of by this.
231  else
232  {
233  // myret = instance()->DDXMLElementRegistry::getElement("***");
234 
235  myret = new DDXMLElement(this);
236  // std::cout << "about to register a " << "***" << std::endl;
237  // registry_["***"] = myret;
238  // DCOUT_V('P', "WARNING: The default (DDLElementRegistry) was used for "
239  // << name << " since there was no specific handler." << std::endl);
240  // return myret;
241  }
242 
243  // Actually register the thing
244  // instance()->registerElement(name, myret);
245  // std::cout << "about to register a " << name << std::endl;
246  registry_[name] = myret;
247  }
248  return myret;
249 }
250 
251 const std::string&
253 {
254  for( RegistryMap::const_iterator it = registry_.begin(), end = registry_.end(); it != end; ++it )
255  if( it->second == theElement )
256  return it->first;
257  return registry_.find( "***" )->first;
258 }
259 
261 
DDLPosPart handles PosPart elements.
Definition: DDLPosPart.h:24
This class takes care of processing all BooleanSolid type elements.
DDLSphere processes all Sphere elements.
Definition: DDLSphere.h:24
DDLDivision processes Division elements.
Definition: DDLDivision.h:23
DDLOrb processes all Orb elements.
Definition: DDLOrb.h:24
DDLString handles String Elements.
Definition: DDLString.h:26
DDLVector handles Rotation and ReflectionRotation elements.
Definition: DDLVector.h:31
DDLReflectionSolid processes ReflectionSolid elements.
#define NULL
Definition: scimark2.h:8
DDLSpecPar processes SpecPar elements.
Definition: DDLSpecPar.h:23
DDLRotationAndReflection handles RotationCMSIM and ReflectionRotation elements.
DDLEllipticalTube processes all EllipticalTube elements.
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
DDLAlgorithm processes Algorithm elements.
Definition: DDLAlgorithm.h:22
DDLParallelepiped processes all Parallelepiped elements.
DDXMLElement * getElement(const std::string &name)
THE most important part. Getting the pointer to a given element type.
DDLBox processes Box elements.
Definition: DDLBox.h:24
DDLElementaryMaterial processes ElementaryMaterial elements.
DDLCone processes all Cone elements.
Definition: DDLCone.h:24
#define end
Definition: vmac.h:37
DDLEllipsoid processes all Ellipsoid elements.
Definition: DDLEllipsoid.h:24
DDLTubs processes Tubs elements.
Definition: DDLTubs.h:22
DDLPolyGenerator processes DDL XML Polycone and DDL XML Polyhedra elements.
#define DCOUT_V(M_v_Y, M_v_S)
Definition: DDdebug.h:54
DDLMap handles Map container.
Definition: DDLMap.h:58
DDLLogicalPart processes LogicalPart elements.
This is a base class for processing XML elements in the DDD.
Definition: DDXMLElement.h:58
DDLRotationByAxis handles RotationByAxis elements.
const std::string & getElementName(DDXMLElement *theElement) const
Get the name given a pointer. This may not be needed...
DDLCompositeMaterial processes all CompositeMaterial elements.
DDLNumeric handles Numeric Elements.
Definition: DDLNumeric.h:26
DDLRotationSequence handles a set of Rotations.
DDLShapelessSolid processes ShapelessSolid elements.