13 using namespace geant_units::operators;
15 Polycone::Polycone(
double startPhi,
17 const std::vector<double>& z,
18 const std::vector<double>& rmin,
19 const std::vector<double>& rmax)
21 p_.emplace_back(startPhi);
22 p_.emplace_back(deltaPhi);
23 if ((z.size() != rmin.size()) || (z.size() != rmax.size())) {
24 throw cms::Exception(
"DDException") <<
"Polycone(..): std::vectors z,rmin,rmax not of same length";
26 for (
unsigned int i = 0;
i < z.size(); ++
i) {
27 p_.emplace_back(z[
i]);
28 p_.emplace_back(rmin[i]);
29 p_.emplace_back(rmax[i]);
36 p_.emplace_back(startPhi);
37 p_.emplace_back(deltaPhi);
38 if (z.size() != r.size()) {
39 throw cms::Exception(
"DDException") <<
"Polycone(..): std::vectors z,rmin,rmax not of same length";
41 for (
unsigned int i = 0;
i < z.size(); ++
i) {
42 p_.emplace_back(z[
i]);
43 p_.emplace_back(r[i]);
51 unsigned int loop = (
p_.size() - 2) / 3 - 1;
55 for (
unsigned int j = 2;
j < (loop + 2); ++
j) {
56 double dz = std::fabs(
p_[i] -
p_[i + 3]);
57 double v_min = dz * 1_pi / 3. * (
p_[i + 1] *
p_[i + 1] +
p_[i + 4] *
p_[i + 4] +
p_[i + 1] *
p_[i + 4]);
58 double v_max = dz * 1_pi / 3. * (
p_[i + 2] *
p_[i + 2] +
p_[i + 5] *
p_[i + 5] +
p_[i + 2] *
p_[i + 5]);
59 double s = v_max - v_min;
64 result = sec * std::fabs(
p_[1]) / 2._pi;
69 double phiFrom =
p_[0];
70 double phiTo =
p_[0] +
p_[1];
71 double slice = (std::fabs(phiFrom - phiTo)) / 2_pi;
79 while (i < (p_.size() - 2)) {
87 double volume1 = (rEnd * rEnd + rBegin * rBegin + rBegin * rEnd) * z / 3;
88 volume = volume + volume1;
100 double volume2 = (rEnd * rEnd + rBegin * rBegin + rBegin * rEnd) * z / 3;
101 volume = volume + volume2;
102 volume = std::fabs(slice * 1_pi * volume);
110 for (
unsigned k = 2;
k < p_.size(); ++
k)
constexpr NumType convertRadToDeg(NumType radians)
Polycone(double startPhi, double deltaPhi, const std::vector< double > &z, const std::vector< double > &rmin, const std::vector< double > &rmax)
constexpr NumType convertMmToCm(NumType millimeters)
void stream(std::ostream &) const override
double volume() const override