CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DDSolid.h
Go to the documentation of this file.
1 #ifndef DDSolid_h
2 #define DDSolid_h
3 
4 #include <stddef.h>
5 #include <iosfwd>
6 #include <vector>
7 
13 
14 class DDSolid;
15 class DDStreamer;
16 namespace DDI {
17 class BooleanSolid;
18 class Reflection;
19 class Solid;
20 } // namespace DDI
21 struct DDSolidFactory;
22 
23 std::ostream & operator<<( std::ostream &, const DDSolid & );
24 
26 
37 class DDSolid : public DDBase<DDName, DDI::Solid*>
38 {
39  friend std::ostream & operator<<( std::ostream &, const DDSolid & );
40  friend struct DDSolidFactory;
41  friend class DDDToPersFactory;
42  friend class DDPersToDDDFactory;
43  friend class DDStreamer;
44 
45 public:
47  DDSolid( void );
48 
50 
58  DDSolid( const DDName & name );
59 
61  const std::vector<double> & parameters( void ) const;
62 
64  double volume( void ) const;
65 
67  DDSolidShape shape( void ) const;
68 
69 private:
70  DDSolid( const DDName &, DDI::Solid * );
71  DDSolid( const DDName &, DDSolidShape, const std::vector<double> & );
72 };
73 
75 
79 class DDTrap : public DDSolid
80 {
81 public:
82  DDTrap( const DDSolid & s );
84  double halfZ( void ) const;
86  double theta( void ) const;
88  double phi( void ) const;
90  double y1( void ) const;
92  double x1( void ) const;
94  double x2( void ) const;
96  double alpha1( void ) const;
98  double y2( void ) const;
100  double x3( void ) const;
102  double x4( void ) const;
104  double alpha2( void ) const;
105 
106 private:
107  DDTrap( void );
108 };
109 
110 class DDPseudoTrap : public DDSolid
111 {
112 public:
113  DDPseudoTrap( const DDSolid & s );
115  double halfZ( void ) const;
117  double x1( void ) const;
119  double x2( void ) const;
121  double y1( void ) const;
123  double y2( void ) const;
125  double radius( void ) const;
127  bool atMinusZ( void ) const;
128 
129 private:
130  DDPseudoTrap( void );
131 };
132 
134 class DDTruncTubs : public DDSolid
135 {
136 public:
137  DDTruncTubs( const DDSolid & s );
139  double zHalf( void ) const;
141  double rIn( void ) const;
143  double rOut( void ) const;
145  double startPhi( void ) const;
147  double deltaPhi( void ) const;
149  double cutAtStart( void ) const;
151  double cutAtDelta( void ) const;
153  bool cutInside( void ) const;
154 
155 private:
156  DDTruncTubs( void );
157 };
158 
160 
164 class DDBox : public DDSolid
165 {
166 public:
167  DDBox( const DDSolid & s );
168  double halfX( void ) const;
169  double halfY( void ) const;
170  double halfZ( void ) const;
171 
172 private:
173  DDBox( void );
174 };
175 
177 class DDShapelessSolid : public DDSolid
178 {
179 public:
180  DDShapelessSolid( const DDSolid & s );
181 
182 private:
183  DDShapelessSolid( void );
184 };
185 
187 {
188 public:
189  DDReflectionSolid( const DDSolid & s );
190  DDSolid unreflected( void ) const;
191 
192 private:
193  DDReflectionSolid( void );
195 };
196 
197 class DDBooleanSolid : public DDSolid
198 {
199 public:
200  DDBooleanSolid( const DDSolid & s );
201  DDSolid solidA( void ) const;
202  DDSolid solidB( void ) const;
203  DDTranslation translation( void ) const;
204  DDRotation rotation( void ) const;
205 
206 private:
207  DDBooleanSolid( void );
209 };
210 
212 class DDPolySolid : public DDSolid
213 {
214 public:
215  DDPolySolid( const DDSolid & s );
216 
217 protected:
219  virtual std::vector<double> getVec( const size_t& which, const size_t& offset = 0, const size_t& nVecs = 1 ) const;
220  DDPolySolid( void );
221 };
222 
223 class DDPolycone : public DDPolySolid
224 {
225 public:
226  DDPolycone( const DDSolid & s );
227  double startPhi( void ) const;
228  double deltaPhi( void ) const;
229  std::vector<double> zVec( void ) const;
230  std::vector<double> rVec( void ) const;
231  std::vector<double> rMinVec( void ) const;
232  std::vector<double> rMaxVec( void ) const;
233 
234 private:
235  DDPolycone( void );
236 };
237 
238 class DDPolyhedra : public DDPolySolid
239 {
240 public:
241  DDPolyhedra( const DDSolid & s );
242  int sides( void ) const;
243  double startPhi( void ) const;
244  double deltaPhi( void ) const;
245  std::vector<double> zVec( void ) const;
246  std::vector<double> rVec( void ) const;
247  std::vector<double> rMinVec( void ) const;
248  std::vector<double> rMaxVec( void ) const;
249 
250 private:
251  DDPolyhedra( void );
252 };
253 
254 class DDTubs : public DDSolid
255 {
256 public:
257  DDTubs( const DDSolid & s );
258  double zhalf( void ) const;
259  double rIn( void ) const;
260  double rOut( void ) const;
261  double startPhi( void ) const;
262  double deltaPhi( void ) const;
263 
264 private:
265  DDTubs( void );
266 };
267 
268 class DDCutTubs : public DDSolid
269 {
270 public:
271  DDCutTubs( const DDSolid & s );
272  double zhalf( void ) const;
273  double rIn( void ) const;
274  double rOut( void ) const;
275  double startPhi( void ) const;
276  double deltaPhi( void ) const;
277  std::array<double, 3> lowNorm( void ) const;
278  std::array<double, 3> highNorm( void ) const;
279 
280 private:
281  DDCutTubs( void );
282 };
283 
284 class DDCons : public DDSolid
285 {
286 public:
287  DDCons( const DDSolid & s );
288  double zhalf( void ) const;
289  double rInMinusZ( void ) const;
290  double rOutMinusZ( void ) const;
291  double rInPlusZ( void ) const;
292  double rOutPlusZ( void ) const;
293  double phiFrom( void ) const;
294  double deltaPhi( void ) const;
295 
296 private:
297  DDCons( void );
298 };
299 
300 class DDTorus : public DDSolid
301 {
302 public:
303  DDTorus( const DDSolid & s );
304  double rMin( void ) const;
305  double rMax( void ) const;
306  double rTorus( void ) const;
307  double startPhi( void ) const;
308  double deltaPhi( void ) const;
309 
310 private:
311  DDTorus( void );
312 };
313 
314 class DDUnion : public DDBooleanSolid
315 {
316 public:
317  DDUnion( const DDSolid & s );
318 
319 private:
320  DDUnion( void );
321 };
322 
324 {
325 public:
326  DDIntersection( const DDSolid & s );
327 
328 private:
329  DDIntersection( void );
330 };
331 
333 {
334 public:
335  DDSubtraction( const DDSolid & s );
336 
337 private:
338  DDSubtraction( void );
339 };
340 
341 class DDSphere : public DDSolid
342 {
343 public:
344  DDSphere( const DDSolid & s );
345  double innerRadius( void ) const;
346  double outerRadius( void ) const;
347  double startPhi( void ) const;
348  double deltaPhi( void ) const;
349  double startTheta( void ) const;
350  double deltaTheta( void ) const;
351 
352 private:
353  DDSphere( void );
354 };
355 
356 class DDOrb : public DDSolid
357 {
358 public:
359  DDOrb( const DDSolid & s );
360  double radius( void ) const;
361 
362 private:
363  DDOrb( void );
364 };
365 
366 class DDEllipticalTube : public DDSolid
367 {
368 public:
369  DDEllipticalTube( const DDSolid & s );
370  double xSemiAxis( void ) const;
371  double ySemiAxis( void ) const;
372  double zHeight( void ) const;
373 
374 private:
375  DDEllipticalTube( void );
376 };
377 
378 class DDEllipsoid : public DDSolid
379 {
380 public:
381  DDEllipsoid( const DDSolid & s );
382  double xSemiAxis( void ) const;
383  double ySemiAxis( void ) const;
384  double zSemiAxis( void ) const;
385  double zBottomCut( void ) const;
386  double zTopCut( void ) const;
387 
388 private:
389  DDEllipsoid( void );
390 };
391 
392 class DDParallelepiped : public DDSolid
393 {
394 public:
395  DDParallelepiped( const DDSolid & s );
396  double xHalf( void ) const;
397  double yHalf( void ) const;
398  double zHalf( void ) const;
399  double alpha( void ) const;
400  double theta( void ) const;
401  double phi( void ) const;
402 
403 private:
404  DDParallelepiped( void );
405 };
406 
407 // Solid generation functions
408 //
410 {
412 
418  static DDSolid box( const DDName & name,
419  double xHalf,
420  double yHalf,
421  double zHalf );
422 
424 
427  static DDSolid polycone( const DDName & name, double startPhi, double deltaPhi,
428  const std::vector<double> & z,
429  const std::vector<double> & rmin,
430  const std::vector<double> & rmax );
431 
433 
436  static DDSolid polycone( const DDName & name, double startPhi, double deltaPhi,
437  const std::vector<double> & z,
438  const std::vector<double> & r );
439 
441 
444  static DDSolid polyhedra( const DDName & name,
445  int sides,
446  double startPhi, double deltaPhi,
447  const std::vector<double> & z,
448  const std::vector<double> & rmin,
449  const std::vector<double> & rmax );
450 
452 
455  static DDSolid polyhedra( const DDName & name,
456  int sides,
457  double startPhi, double deltaPhi,
458  const std::vector<double> & z,
459  const std::vector<double> & r );
460 
461  static DDSolid unionSolid( const DDName & name,
462  const DDSolid & a,
463  const DDSolid & b,
464  const DDTranslation & t,
465  const DDRotation & r );
466 
467  static DDSolid intersection( const DDName & name,
468  const DDSolid & a,
469  const DDSolid & b,
470  const DDTranslation & t,
471  const DDRotation & r );
472 
473  static DDSolid subtraction( const DDName & name,
474  const DDSolid & a,
475  const DDSolid & b,
476  const DDTranslation & t,
477  const DDRotation & r );
478 
479  static DDSolid trap( const DDName & name,
480  double pDz,
481  double pTheta, double pPhi,
482  double pDy1, double pDx1, double pDx2,
483  double pAlp1,
484  double pDy2, double pDx3, double pDx4,
485  double pAlp2 );
486 
487  static DDSolid pseudoTrap( const DDName & name,
488  double pDx1,
489  double pDx2,
490  double pDy1,
491  double pDy2,
492  double pDz,
493  double radius,
494  bool atMinusZ );
496  static DDSolid truncTubs( const DDName & name,
497  double zHalf,
498  double rIn,
499  double rOut,
500  double startPhi,
501  double deltaPhi,
502  double cutAtStart,
503  double cutAtDelta,
504  bool cutInside );
505 
506  static DDSolid tubs( const DDName & name,
507  double zhalf,
508  double rIn, double rOut,
509  double startPhi,
510  double deltaPhi );
511 
512  static DDSolid cuttubs( const DDName & name,
513  double zhalf,
514  double rIn, double rOut,
515  double startPhi,
516  double deltaPhi,
517  double lx, double ly, double lz,
518  double tx, double ty, double tz);
519 
520  static DDSolid cons( const DDName & name,
521  double zhalf,
522  double rInMinusZ,
523  double rOutMinusZ,
524  double rInPlusZ,
525  double rOutPlusZ,
526  double phiFrom,
527  double deltaPhi );
528 
529  static DDSolid torus( const DDName & name,
530  double rMin,
531  double rMax,
532  double rTorus,
533  double startPhi,
534  double deltaPhi );
535 
536  static DDSolid sphere( const DDName & name,
537  double innerRadius,
538  double outerRadius,
539  double startPhi,
540  double deltaPhi,
541  double startTheta,
542  double deltaTheta );
543 
544  static DDSolid orb( const DDName & name,
545  double radius );
546 
547  static DDSolid ellipticalTube( const DDName & name,
548  double xSemiAxis,
549  double ySemiAxis,
550  double zHeight );
551 
552  static DDSolid ellipsoid( const DDName & name,
553  double xSemiAxis,
554  double ySemiAxis,
555  double zSemiAxis,
556  double zBottomCut = 0.,
557  double zTopCut = 0. );
558 
559  static DDSolid parallelepiped( const DDName & name,
560  double xHalf, double yHalf, double zHalf,
561  double alpha, double theta, double phi );
562 
563 
564  static DDSolid shapeless( const DDName & name );
565 
566  static DDSolid reflection( const DDName & name,
567  const DDSolid & s );
568 };
569 
570 #endif
Definition: DDBase.h:10
float alpha
Definition: AMPTWrapper.h:95
A truncated tube section.
Definition: DDSolid.h:134
Abstract class for DDPolycone and DDPolyhedra. Basically a common member function.
Definition: DDSolid.h:212
This is simply a handle on the solid.
Definition: DDSolid.h:177
DDSolidShape
Definition: DDSolidShapes.h:6
Geom::Theta< T > theta() const
Streaming the DDD transient store from/into a std::istream/std::ostream */.
Definition: DDStreamer.h:42
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:16
A DDSolid represents the shape of a part.
Definition: DDSolid.h:37
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:66
DDI::BooleanSolid * boolean_
Definition: DDSolid.h:208
DDI::Reflection * reflected_
Definition: DDSolid.h:194
Interface to a Trapezoid.
Definition: DDSolid.h:79
Interface to a Box.
Definition: DDSolid.h:164
Definition: rep_type.h:4
double b
Definition: hdecay.h:120
Definition: DDSolid.h:356
double a
Definition: hdecay.h:121
def which(cmd)
Definition: eostools.py:335
std::ostream & operator<<(std::ostream &, const DDSolid &)
Definition: DDSolid.cc:37