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 
255 {
256 public:
257  DDExtrudedPolygon( const DDSolid & s );
258  std::vector<double> xVec( void ) const;
259  std::vector<double> yVec( void ) const;
260  std::vector<double> zVec( void ) const;
261  std::vector<double> zxVec( void ) const;
262  std::vector<double> zyVec( void ) const;
263  std::vector<double> zscaleVec( void ) const;
264 
265 private:
266  DDExtrudedPolygon( void );
267 };
268 
269 class DDTubs : public DDSolid
270 {
271 public:
272  DDTubs( const DDSolid & s );
273  double zhalf( void ) const;
274  double rIn( void ) const;
275  double rOut( void ) const;
276  double startPhi( void ) const;
277  double deltaPhi( void ) const;
278 
279 private:
280  DDTubs( void );
281 };
282 
283 class DDCutTubs : public DDSolid
284 {
285 public:
286  DDCutTubs( const DDSolid & s );
287  double zhalf( void ) const;
288  double rIn( void ) const;
289  double rOut( void ) const;
290  double startPhi( void ) const;
291  double deltaPhi( void ) const;
292  std::array<double, 3> lowNorm( void ) const;
293  std::array<double, 3> highNorm( void ) const;
294 
295 private:
296  DDCutTubs( void );
297 };
298 
299 class DDCons : public DDSolid
300 {
301 public:
302  DDCons( const DDSolid & s );
303  double zhalf( void ) const;
304  double rInMinusZ( void ) const;
305  double rOutMinusZ( void ) const;
306  double rInPlusZ( void ) const;
307  double rOutPlusZ( void ) const;
308  double phiFrom( void ) const;
309  double deltaPhi( void ) const;
310 
311 private:
312  DDCons( void );
313 };
314 
315 class DDTorus : public DDSolid
316 {
317 public:
318  DDTorus( const DDSolid & s );
319  double rMin( void ) const;
320  double rMax( void ) const;
321  double rTorus( void ) const;
322  double startPhi( void ) const;
323  double deltaPhi( void ) const;
324 
325 private:
326  DDTorus( void );
327 };
328 
329 class DDUnion : public DDBooleanSolid
330 {
331 public:
332  DDUnion( const DDSolid & s );
333 
334 private:
335  DDUnion( void );
336 };
337 
339 {
340 public:
341  DDIntersection( const DDSolid & s );
342 
343 private:
344  DDIntersection( void );
345 };
346 
348 {
349 public:
350  DDSubtraction( const DDSolid & s );
351 
352 private:
353  DDSubtraction( void );
354 };
355 
356 class DDSphere : public DDSolid
357 {
358 public:
359  DDSphere( const DDSolid & s );
360  double innerRadius( void ) const;
361  double outerRadius( void ) const;
362  double startPhi( void ) const;
363  double deltaPhi( void ) const;
364  double startTheta( void ) const;
365  double deltaTheta( void ) const;
366 
367 private:
368  DDSphere( void );
369 };
370 
371 class DDOrb : public DDSolid
372 {
373 public:
374  DDOrb( const DDSolid & s );
375  double radius( void ) const;
376 
377 private:
378  DDOrb( void );
379 };
380 
381 class DDEllipticalTube : public DDSolid
382 {
383 public:
384  DDEllipticalTube( const DDSolid & s );
385  double xSemiAxis( void ) const;
386  double ySemiAxis( void ) const;
387  double zHeight( void ) const;
388 
389 private:
390  DDEllipticalTube( void );
391 };
392 
393 class DDEllipsoid : public DDSolid
394 {
395 public:
396  DDEllipsoid( const DDSolid & s );
397  double xSemiAxis( void ) const;
398  double ySemiAxis( void ) const;
399  double zSemiAxis( void ) const;
400  double zBottomCut( void ) const;
401  double zTopCut( void ) const;
402 
403 private:
404  DDEllipsoid( void );
405 };
406 
407 class DDParallelepiped : public DDSolid
408 {
409 public:
410  DDParallelepiped( const DDSolid & s );
411  double xHalf( void ) const;
412  double yHalf( void ) const;
413  double zHalf( void ) const;
414  double alpha( void ) const;
415  double theta( void ) const;
416  double phi( void ) const;
417 
418 private:
419  DDParallelepiped( void );
420 };
421 
422 // Solid generation functions
423 //
425 {
427 
433  static DDSolid box( const DDName & name,
434  double xHalf,
435  double yHalf,
436  double zHalf );
437 
439 
442  static DDSolid polycone( const DDName & name, double startPhi, double deltaPhi,
443  const std::vector<double> & z,
444  const std::vector<double> & rmin,
445  const std::vector<double> & rmax );
446 
448 
451  static DDSolid polycone( const DDName & name, double startPhi, double deltaPhi,
452  const std::vector<double> & z,
453  const std::vector<double> & r );
454 
456 
459  static DDSolid polyhedra( const DDName & name,
460  int sides,
461  double startPhi, double deltaPhi,
462  const std::vector<double> & z,
463  const std::vector<double> & rmin,
464  const std::vector<double> & rmax );
465 
467 
470  static DDSolid polyhedra( const DDName & name,
471  int sides,
472  double startPhi, double deltaPhi,
473  const std::vector<double> & z,
474  const std::vector<double> & r );
475 
476  static DDSolid unionSolid( const DDName & name,
477  const DDSolid & a,
478  const DDSolid & b,
479  const DDTranslation & t,
480  const DDRotation & r );
481 
482  static DDSolid intersection( const DDName & name,
483  const DDSolid & a,
484  const DDSolid & b,
485  const DDTranslation & t,
486  const DDRotation & r );
487 
488  static DDSolid subtraction( const DDName & name,
489  const DDSolid & a,
490  const DDSolid & b,
491  const DDTranslation & t,
492  const DDRotation & r );
493 
494  static DDSolid trap( const DDName & name,
495  double pDz,
496  double pTheta, double pPhi,
497  double pDy1, double pDx1, double pDx2,
498  double pAlp1,
499  double pDy2, double pDx3, double pDx4,
500  double pAlp2 );
501 
502  static DDSolid pseudoTrap( const DDName & name,
503  double pDx1,
504  double pDx2,
505  double pDy1,
506  double pDy2,
507  double pDz,
508  double radius,
509  bool atMinusZ );
511  static DDSolid truncTubs( const DDName & name,
512  double zHalf,
513  double rIn,
514  double rOut,
515  double startPhi,
516  double deltaPhi,
517  double cutAtStart,
518  double cutAtDelta,
519  bool cutInside );
520 
521  static DDSolid tubs( const DDName & name,
522  double zhalf,
523  double rIn, double rOut,
524  double startPhi,
525  double deltaPhi );
526 
527  static DDSolid cuttubs( const DDName & name,
528  double zhalf,
529  double rIn, double rOut,
530  double startPhi,
531  double deltaPhi,
532  double lx, double ly, double lz,
533  double tx, double ty, double tz);
534 
535  static DDSolid cons( const DDName & name,
536  double zhalf,
537  double rInMinusZ,
538  double rOutMinusZ,
539  double rInPlusZ,
540  double rOutPlusZ,
541  double phiFrom,
542  double deltaPhi );
543 
544  static DDSolid torus( const DDName & name,
545  double rMin,
546  double rMax,
547  double rTorus,
548  double startPhi,
549  double deltaPhi );
550 
551  static DDSolid sphere( const DDName & name,
552  double innerRadius,
553  double outerRadius,
554  double startPhi,
555  double deltaPhi,
556  double startTheta,
557  double deltaTheta );
558 
559  static DDSolid orb( const DDName & name,
560  double radius );
561 
562  static DDSolid ellipticalTube( const DDName & name,
563  double xSemiAxis,
564  double ySemiAxis,
565  double zHeight );
566 
567  static DDSolid ellipsoid( const DDName & name,
568  double xSemiAxis,
569  double ySemiAxis,
570  double zSemiAxis,
571  double zBottomCut = 0.,
572  double zTopCut = 0. );
573 
574  static DDSolid parallelepiped( const DDName & name,
575  double xHalf, double yHalf, double zHalf,
576  double alpha, double theta, double phi );
577 
578  static DDSolid extrudedpolygon( const DDName & name,
579  const std::vector<double> & x,
580  const std::vector<double> & y,
581  const std::vector<double> & z,
582  const std::vector<double> & zx,
583  const std::vector<double> & zy,
584  const std::vector<double> & zscale );
585 
586  static DDSolid shapeless( const DDName & name );
587 
588  static DDSolid reflection( const DDName & name,
589  const DDSolid & s );
590 };
591 
592 #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:64
T x() const
Cartesian x coordinate.
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:371
double a
Definition: hdecay.h:121
def which(cmd)
Definition: eostools.py:335
std::ostream & operator<<(std::ostream &, const DDSolid &)
Definition: DDSolid.cc:34