CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Cons.cc
Go to the documentation of this file.
3 
4 #include <cmath>
5 #include <ostream>
6 #include <vector>
7 
10 
11 using namespace geant_units;
12 using namespace geant_units::operators;
13 
14 DDI::Cons::Cons(double zhalf,
15  double rInMinusZ,
16  double rOutMinusZ,
17  double rInPlusZ,
18  double rOutPlusZ,
19  double startPhi,
20  double deltaPhi)
22  p_.emplace_back(zhalf);
23  p_.emplace_back(rInMinusZ);
24  p_.emplace_back(rOutMinusZ);
25  p_.emplace_back(rInPlusZ);
26  p_.emplace_back(rOutPlusZ);
27  p_.emplace_back(startPhi);
28  p_.emplace_back(deltaPhi);
29 }
30 
31 void DDI::Cons::stream(std::ostream& os) const {
32  os << " zhalf=" << convertMmToCm(p_[0]) << " rIn-Z=" << convertMmToCm(p_[1]) << " rOut-Z=" << convertMmToCm(p_[2])
33  << " rIn+Z=" << convertMmToCm(p_[3]) << " rOut+Z=" << convertMmToCm(p_[4])
34  << " startPhi=" << convertRadToDeg(p_[5]) << " deltaPhi=" << convertRadToDeg(p_[6]);
35 }
36 
37 double DDI::Cons::volume() const {
38  /* zhalf is the half length of the cone,
39  phiTo is always clockwise rotated from phiFrom
40  rInMinusZ is always smaller than rOutMinusZ (same for r*PlusZ)
41  They are the distances relative to the rotation axes */
42 
43  /* calculation normalize from 0 to z */
44 
45  /* The function f=rInMinusZ+((rInPlusZ-rInMinusZ)/z)*x defines
46  the radius of the the rotation from 0 to z. Raised to the power
47  of 2 integrated on x from 0 to z. Multiplied by pi, gives the
48  volume that needs to substracted from the other volume */
49 
50  /* f^2=rInMinusZ*rInMinusZ+2*rInMinusZ*((rInPlusZ-rInMinusZ)/z)*x+((rInPlusZ-rInMinusZ)*(rInPlusZ-rInMinusZ)*x*x)/(z*z) */
51 
52  /* primitive of f^2 is: rInMinusZ*rInMinusZ*x+rInMinusZ*((rInPlusZ-rInMinusZ)/z)*(x*x)+(rInPlusZ-rInMinusZ)*(rInPlusZ-rInMinusZ)*(x*x*x)/(3*z*z) */
53 
54  /*integration from 0 to z yields: pi*( rInMinusZ*rInMinusZ*z+rInMinusZ*(rInPlusZ-rInMinusZ)*z+((rInPlusZ-rInMinusZ)*(rInPlusZ-rInMinusZ)*z)/(3) ) */
55 
56  double zhalf = p_[0];
57  double rInMinusZ = p_[1];
58  double rOutMinusZ = p_[2];
59  double rInPlusZ = p_[3];
60  double rOutPlusZ = p_[4];
61  //double phiFrom=p_[5]/rad;
62  double deltaPhi = std::abs(p_[6]);
63  double z = 2 * zhalf;
64 
65  double volume1 = 1_pi * (rInPlusZ * rInPlusZ + rInMinusZ * rInMinusZ + rInMinusZ * rInPlusZ) * z / 3;
66 
67  double volume2 = 1_pi * (rOutPlusZ * rOutPlusZ + rOutMinusZ * rOutMinusZ + rOutMinusZ * rOutPlusZ) * z / 3;
68 
69  double slice = deltaPhi / (2_pi);
70  double volume = slice * (volume2 - volume1);
71 
72  return volume;
73 }
void stream(std::ostream &) const override
Definition: Cons.cc:31
constexpr NumType convertRadToDeg(NumType radians)
Definition: angle_units.h:21
Cons(double zhalf, double rInMinusZ, double rOutMinusZ, double rInPlusZ, double rOutPlusZ, double startPhi, double deltaPhi)
Definition: Cons.cc:14
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double volume() const override
Definition: Cons.cc:37
DDSolidShape
Definition: DDSolidShapes.h:6
std::vector< double > p_
Definition: Solid.h:30
constexpr NumType convertMmToCm(NumType millimeters)
Definition: GeantUnits.h:63