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 DETECTOR_DESCRIPTION_CORE_DD_SOLID_H
2 #define DETECTOR_DESCRIPTION_CORE_DD_SOLID_H
3 
4 #include <cstddef>
5 #include <iosfwd>
6 #include <memory>
7 #include <vector>
8 
14 
15 class DDSolid;
16 
17 namespace DDI {
18  class BooleanSolid;
19  class MultiUnion;
20  class Reflection;
21  class Solid;
22 } // namespace DDI
23 struct DDSolidFactory;
24 
25 std::ostream& operator<<(std::ostream&, const DDSolid&);
26 
28 
39 class DDSolid : public DDBase<DDName, std::unique_ptr<DDI::Solid>> {
40  friend std::ostream& operator<<(std::ostream&, const DDSolid&);
41  friend struct DDSolidFactory;
42 
43 public:
45  DDSolid(void);
46 
48 
56  DDSolid(const DDName& name);
57 
59  const std::vector<double>& parameters(void) const;
60 
62  double volume(void) const;
63 
65  DDSolidShape shape(void) const;
66 
67 private:
68  DDSolid(const DDName&, std::unique_ptr<DDI::Solid>);
69  DDSolid(const DDName&, DDSolidShape, const std::vector<double>&);
70 };
71 
73 
77 class DDTrap : public DDSolid {
78 public:
79  DDTrap(const DDSolid& s);
80  DDTrap(void) = delete;
81 
83  double halfZ(void) const;
85  double theta(void) const;
87  double phi(void) const;
89  double y1(void) const;
91  double x1(void) const;
93  double x2(void) const;
95  double alpha1(void) const;
97  double y2(void) const;
99  double x3(void) const;
101  double x4(void) const;
103  double alpha2(void) const;
104 };
105 
106 class DDPseudoTrap : public DDSolid {
107 public:
108  DDPseudoTrap(const DDSolid& s);
109  DDPseudoTrap(void) = delete;
110 
112  double halfZ(void) const;
114  double x1(void) const;
116  double x2(void) const;
118  double y1(void) const;
120  double y2(void) const;
122  double radius(void) const;
124  bool atMinusZ(void) const;
125 };
126 
128 class DDTruncTubs : public DDSolid {
129 public:
130  DDTruncTubs(const DDSolid& s);
131  DDTruncTubs(void) = delete;
132 
134  double zHalf(void) const;
136  double rIn(void) const;
138  double rOut(void) const;
140  double startPhi(void) const;
142  double deltaPhi(void) const;
144  double cutAtStart(void) const;
146  double cutAtDelta(void) const;
148  bool cutInside(void) const;
149 };
150 
152 
156 class DDBox : public DDSolid {
157 public:
158  DDBox(const DDSolid& s);
159  DDBox(void) = delete;
160 
161  double halfX(void) const;
162  double halfY(void) const;
163  double halfZ(void) const;
164 };
165 
167 class DDShapelessSolid : public DDSolid {
168 public:
169  DDShapelessSolid(const DDSolid& s);
170  DDShapelessSolid(void) = delete;
171 };
172 
173 class DDBooleanSolid : public DDSolid {
174 public:
175  DDBooleanSolid(const DDSolid& s);
176  DDBooleanSolid(void) = delete;
177 
178  DDSolid solidA(void) const;
179  DDSolid solidB(void) const;
180  DDTranslation translation(void) const;
181  DDRotation rotation(void) const;
182 
183 private:
185 };
186 
187 class DDMultiUnionSolid : public DDSolid {
188 public:
189  DDMultiUnionSolid(const DDSolid& s);
190  DDMultiUnionSolid(void) = delete;
191 
192  const std::vector<DDSolid>& solids(void) const;
193  const std::vector<DDTranslation>& translations(void) const;
194  const std::vector<DDRotation>& rotations(void) const;
195 
196 private:
197  DDI::MultiUnion* union_;
198 };
199 
201 class DDPolySolid : public DDSolid {
202 public:
203  DDPolySolid(const DDSolid& s);
204  DDPolySolid(void) = delete;
205 
206 protected:
208  virtual std::vector<double> getVec(const size_t& which, const size_t& offset = 0, const size_t& nVecs = 1) const;
209 };
210 
211 class DDPolycone : public DDPolySolid {
212 public:
213  DDPolycone(const DDSolid& s);
214  DDPolycone(void) = delete;
215 
216  double startPhi(void) const;
217  double deltaPhi(void) const;
218  std::vector<double> zVec(void) const;
219  std::vector<double> rVec(void) const;
220  std::vector<double> rMinVec(void) const;
221  std::vector<double> rMaxVec(void) const;
222 };
223 
224 class DDPolyhedra : public DDPolySolid {
225 public:
226  DDPolyhedra(const DDSolid& s);
227  DDPolyhedra(void) = delete;
228 
229  int sides(void) const;
230  double startPhi(void) const;
231  double deltaPhi(void) const;
232  std::vector<double> zVec(void) const;
233  std::vector<double> rVec(void) const;
234  std::vector<double> rMinVec(void) const;
235  std::vector<double> rMaxVec(void) const;
236 };
237 
239 public:
240  DDExtrudedPolygon(const DDSolid& s);
241  DDExtrudedPolygon(void) = delete;
242 
243  std::vector<double> xVec(void) const;
244  std::vector<double> yVec(void) const;
245  std::vector<double> zVec(void) const;
246  std::vector<double> zxVec(void) const;
247  std::vector<double> zyVec(void) const;
248  std::vector<double> zscaleVec(void) const;
249 
250 private:
251  auto xyPointsSize(void) const -> std::size_t;
252  auto zSectionsSize(void) const -> std::size_t;
253 };
254 
255 class DDTubs : public DDSolid {
256 public:
257  DDTubs(const DDSolid& s);
258  DDTubs(void) = delete;
259 
260  double zhalf(void) const;
261  double rIn(void) const;
262  double rOut(void) const;
263  double startPhi(void) const;
264  double deltaPhi(void) const;
265 };
266 
267 class DDCutTubs : public DDSolid {
268 public:
269  DDCutTubs(const DDSolid& s);
270  DDCutTubs(void) = delete;
271 
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 
281 class DDCons : public DDSolid {
282 public:
283  DDCons(const DDSolid& s);
284  DDCons(void) = delete;
285 
286  double zhalf(void) const;
287  double rInMinusZ(void) const;
288  double rOutMinusZ(void) const;
289  double rInPlusZ(void) const;
290  double rOutPlusZ(void) const;
291  double phiFrom(void) const;
292  double deltaPhi(void) const;
293 };
294 
295 class DDTorus : public DDSolid {
296 public:
297  DDTorus(const DDSolid& s);
298  DDTorus(void) = delete;
299 
300  double rMin(void) const;
301  double rMax(void) const;
302  double rTorus(void) const;
303  double startPhi(void) const;
304  double deltaPhi(void) const;
305 };
306 
307 class DDUnion : public DDBooleanSolid {
308 public:
309  DDUnion(const DDSolid& s);
310  DDUnion(void) = delete;
311 };
312 
314 public:
315  DDMultiUnion(const DDSolid& s);
316  DDMultiUnion(void) = delete;
317 };
318 
320 public:
321  DDIntersection(const DDSolid& s);
322  DDIntersection(void) = delete;
323 };
324 
326 public:
327  DDSubtraction(const DDSolid& s);
328  DDSubtraction(void) = delete;
329 };
330 
331 class DDSphere : public DDSolid {
332 public:
333  DDSphere(const DDSolid& s);
334  DDSphere(void) = delete;
335 
336  double innerRadius(void) const;
337  double outerRadius(void) const;
338  double startPhi(void) const;
339  double deltaPhi(void) const;
340  double startTheta(void) const;
341  double deltaTheta(void) const;
342 };
343 
344 class DDOrb : public DDSolid {
345 public:
346  DDOrb(const DDSolid& s);
347  DDOrb(void) = delete;
348 
349  double radius(void) const;
350 };
351 
352 class DDEllipticalTube : public DDSolid {
353 public:
354  DDEllipticalTube(const DDSolid& s);
355  DDEllipticalTube(void) = delete;
356 
357  double xSemiAxis(void) const;
358  double ySemiAxis(void) const;
359  double zHeight(void) const;
360 };
361 
362 class DDEllipsoid : public DDSolid {
363 public:
364  DDEllipsoid(const DDSolid& s);
365  DDEllipsoid(void) = delete;
366 
367  double xSemiAxis(void) const;
368  double ySemiAxis(void) const;
369  double zSemiAxis(void) const;
370  double zBottomCut(void) const;
371  double zTopCut(void) const;
372 };
373 
374 class DDParallelepiped : public DDSolid {
375 public:
376  DDParallelepiped(const DDSolid& s);
377  DDParallelepiped(void) = delete;
378 
379  double xHalf(void) const;
380  double yHalf(void) const;
381  double zHalf(void) const;
382  double alpha(void) const;
383  double theta(void) const;
384  double phi(void) const;
385 };
386 
387 // Solid generation functions
388 //
391 
397  static DDSolid box(const DDName& name, double xHalf, double yHalf, double zHalf);
398 
400 
403  static DDSolid polycone(const DDName& name,
404  double startPhi,
405  double deltaPhi,
406  const std::vector<double>& z,
407  const std::vector<double>& rmin,
408  const std::vector<double>& rmax);
409 
411 
414  static DDSolid polycone(
415  const DDName& name, double startPhi, double deltaPhi, const std::vector<double>& z, const std::vector<double>& r);
416 
418 
421  static DDSolid polyhedra(const DDName& name,
422  int sides,
423  double startPhi,
424  double deltaPhi,
425  const std::vector<double>& z,
426  const std::vector<double>& rmin,
427  const std::vector<double>& rmax);
428 
430 
433  static DDSolid polyhedra(const DDName& name,
434  int sides,
435  double startPhi,
436  double deltaPhi,
437  const std::vector<double>& z,
438  const std::vector<double>& r);
439 
440  static DDSolid unionSolid(
441  const DDName& name, const DDSolid& a, const DDSolid& b, const DDTranslation& t, const DDRotation& r);
442 
443  static DDSolid multiUnionSolid(const DDName& name,
444  const std::vector<DDSolid>& a,
445  const std::vector<DDTranslation>& t,
446  const std::vector<DDRotation>& r);
447 
448  static DDSolid intersection(
449  const DDName& name, const DDSolid& a, const DDSolid& b, const DDTranslation& t, const DDRotation& r);
450 
451  static DDSolid subtraction(
452  const DDName& name, const DDSolid& a, const DDSolid& b, const DDTranslation& t, const DDRotation& r);
453 
454  static DDSolid trap(const DDName& name,
455  double pDz,
456  double pTheta,
457  double pPhi,
458  double pDy1,
459  double pDx1,
460  double pDx2,
461  double pAlp1,
462  double pDy2,
463  double pDx3,
464  double pDx4,
465  double pAlp2);
466 
467  static DDSolid pseudoTrap(const DDName& name,
468  double pDx1,
469  double pDx2,
470  double pDy1,
471  double pDy2,
472  double pDz,
473  double radius,
474  bool atMinusZ);
476  static DDSolid truncTubs(const DDName& name,
477  double zHalf,
478  double rIn,
479  double rOut,
480  double startPhi,
481  double deltaPhi,
482  double cutAtStart,
483  double cutAtDelta,
484  bool cutInside);
485 
486  static DDSolid tubs(const DDName& name, double zhalf, double rIn, double rOut, double startPhi, double deltaPhi);
487 
488  static DDSolid cuttubs(const DDName& name,
489  double zhalf,
490  double rIn,
491  double rOut,
492  double startPhi,
493  double deltaPhi,
494  double lx,
495  double ly,
496  double lz,
497  double tx,
498  double ty,
499  double tz);
500 
501  static DDSolid cons(const DDName& name,
502  double zhalf,
503  double rInMinusZ,
504  double rOutMinusZ,
505  double rInPlusZ,
506  double rOutPlusZ,
507  double phiFrom,
508  double deltaPhi);
509 
510  static DDSolid torus(const DDName& name, double rMin, double rMax, double rTorus, double startPhi, double deltaPhi);
511 
512  static DDSolid sphere(const DDName& name,
513  double innerRadius,
514  double outerRadius,
515  double startPhi,
516  double deltaPhi,
517  double startTheta,
518  double deltaTheta);
519 
520  static DDSolid orb(const DDName& name, double radius);
521 
522  static DDSolid ellipticalTube(const DDName& name, double xSemiAxis, double ySemiAxis, double zHeight);
523 
524  static DDSolid ellipsoid(const DDName& name,
525  double xSemiAxis,
526  double ySemiAxis,
527  double zSemiAxis,
528  double zBottomCut = 0.,
529  double zTopCut = 0.);
530 
531  static DDSolid parallelepiped(
532  const DDName& name, double xHalf, double yHalf, double zHalf, double alpha, double theta, double phi);
533 
534  static DDSolid extrudedpolygon(const DDName& name,
535  const std::vector<double>& x,
536  const std::vector<double>& y,
537  const std::vector<double>& z,
538  const std::vector<double>& zx,
539  const std::vector<double>& zy,
540  const std::vector<double>& zscale);
541 
542  static DDSolid shapeless(const DDName& name);
543 
544  static DDSolid reflection(const DDName& name, const DDSolid& s);
545 };
546 
547 #endif
Definition: DDBase.h:10
A truncated tube section.
Definition: DDSolid.h:128
Abstract class for DDPolycone and DDPolyhedra. Basically a common member function.
Definition: DDSolid.h:201
This is simply a handle on the solid.
Definition: DDSolid.h:167
Geom::Theta< T > theta() const
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:15
const DDI::BooleanSolid & boolean_
Definition: DDSolid.h:184
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:57
Interface to a Trapezoid.
Definition: DDSolid.h:77
DDI::MultiUnion * union_
Definition: DDSolid.h:197
Interface to a Box.
Definition: DDSolid.h:156
DDSolidShape
Definition: DDSolidShapes.h:6
double b
Definition: hdecay.h:118
Definition: DDSolid.h:344
double a
Definition: hdecay.h:119
def which(cmd)
Definition: eostools.py:336
alpha
zGenParticlesMatch = cms.InputTag(""),
std::ostream & operator<<(std::ostream &, const DDSolid &)
Definition: DDSolid.cc:33