CMS 3D CMS Logo

DDHGCalNoTaperEndcap.cc
Go to the documentation of this file.
1 #include <algorithm>
2 #include <cmath>
3 #include <string>
4 #include <vector>
5 
17 
18 //#define EDM_ML_DEBUG
19 using namespace angle_units::operators;
20 
21 class DDHGCalNoTaperEndcap : public DDAlgorithm {
22 public:
24 
25  void initialize(const DDNumericArguments& nArgs,
26  const DDVectorArguments& vArgs,
27  const DDMapArguments& mArgs,
28  const DDStringArguments& sArgs,
29  const DDStringVectorArguments& vsArgs) override;
30 
31  void execute(DDCompactView& cpv) override;
32 
33 private:
34  int createQuarter(DDCompactView& cpv, int xQuadrant, int yQuadrant, int startCopyNo);
35 
36  double m_startAngle; // Start angle
37  double m_tiltAngle; // Tilt angle
38  int m_invert; // Inverted or forward
39  double m_rMin; // Inner radius
40  double m_rMax; // Outer radius
41  double m_zoffset; // Offset in z
42  double m_xyoffset; // Offset in x or y
43  int m_n; // Mumber of copies
44  int m_startCopyNo; // Start copy Number
45  int m_incrCopyNo; // Increment copy Number
46  std::string m_childName; // Children name
47  std::string m_idNameSpace; // Namespace of this and ALL sub-parts
48 };
49 
51  edm::LogVerbatim("HGCalGeom") << "DDHGCalNoTaperEndcap test: Creating an instance";
52 }
53 
55  const DDVectorArguments& vArgs,
56  const DDMapArguments&,
57  const DDStringArguments& sArgs,
58  const DDStringVectorArguments&) {
59  m_tiltAngle = nArgs["tiltAngle"];
60  m_invert = int(nArgs["invert"]);
61  m_rMin = int(nArgs["rMin"]);
62  m_rMax = int(nArgs["rMax"]);
63  m_zoffset = nArgs["zoffset"];
64  m_xyoffset = nArgs["xyoffset"];
65  m_n = int(nArgs["n"]);
66  m_startCopyNo = int(nArgs["startCopyNo"]);
67  m_incrCopyNo = int(nArgs["incrCopyNo"]);
68  m_childName = sArgs["ChildName"];
69 #ifdef EDM_ML_DEBUG
70  edm::LogVerbatim("HGCalGeom") << "Tilt Angle " << m_tiltAngle << " Invert " << m_invert << " R " << m_rMin << ":"
71  << m_rMax << " Offset " << m_zoffset << ":" << m_xyoffset << " N " << m_n << " Copy "
72  << m_startCopyNo << ":" << m_incrCopyNo << " Child " << m_childName;
73 #endif
74 
75  m_idNameSpace = DDCurrentNamespace::ns();
76 #ifdef EDM_ML_DEBUG
77  edm::LogVerbatim("HGCalGeom") << "DDHGCalNoTaperEndcap: NameSpace " << m_idNameSpace << "\tParent "
78  << parent().name();
79 #endif
80 }
81 
83  int lastCopyNo = m_startCopyNo;
84 #ifdef EDM_ML_DEBUG
85  edm::LogVerbatim("HGCalGeom") << "Create quarter 1:1";
86 #endif
87  lastCopyNo = createQuarter(cpv, 1, 1, lastCopyNo);
88 #ifdef EDM_ML_DEBUG
89  edm::LogVerbatim("HGCalGeom") << "Create quarter -1:1";
90 #endif
91  lastCopyNo = createQuarter(cpv, -1, 1, lastCopyNo);
92 #ifdef EDM_ML_DEBUG
93  edm::LogVerbatim("HGCalGeom") << "Create quarter -1:-1";
94 #endif
95  lastCopyNo = createQuarter(cpv, -1, -1, lastCopyNo);
96 #ifdef EDM_ML_DEBUG
97  edm::LogVerbatim("HGCalGeom") << "Create quarter 1:-1";
98 #endif
99  createQuarter(cpv, 1, -1, lastCopyNo);
100 }
101 
102 int DDHGCalNoTaperEndcap::createQuarter(DDCompactView& cpv, int xQuadrant, int yQuadrant, int startCopyNo) {
103  int copyNo = startCopyNo;
104  double tiltAngle = m_tiltAngle;
105  double xphi = xQuadrant * tiltAngle;
106  double yphi = yQuadrant * tiltAngle;
107  double theta = 90._deg;
108  double phiX = 0.0;
109  double phiY = theta;
110  double phiZ = 3 * theta;
111  double offsetZ = m_zoffset;
112  double offsetXY = m_xyoffset;
113 
114  double offsetX = xQuadrant * 0.5 * offsetXY;
115  double offsetY = yQuadrant * 0.5 * offsetXY;
116 
117 #ifdef EDM_ML_DEBUG
118  int rowmax(0), column(0);
119 #endif
120  while (std::abs(offsetX) < m_rMax) {
121 #ifdef EDM_ML_DEBUG
122  column++;
123  int row(0);
124 #endif
125  while (std::abs(offsetY) < m_rMax) {
126 #ifdef EDM_ML_DEBUG
127  row++;
128 #endif
129  double limit1 = sqrt((offsetX + 0.5 * xQuadrant * offsetXY) * (offsetX + 0.5 * xQuadrant * offsetXY) +
130  (offsetY + 0.5 * yQuadrant * offsetXY) * (offsetY + 0.5 * yQuadrant * offsetXY));
131  double limit2 = sqrt((offsetX - 0.5 * xQuadrant * offsetXY) * (offsetX - 0.5 * xQuadrant * offsetXY) +
132  (offsetY - 0.5 * yQuadrant * offsetXY) * (offsetY - 0.5 * yQuadrant * offsetXY));
133  // Make sure we do not add supermodules in rMin area
134  if (limit2 > m_rMin && limit1 < m_rMax) {
135 #ifdef EDM_ML_DEBUG
136  edm::LogVerbatim("HGCalGeom") << m_childName << " copyNo = " << copyNo << " (" << column << "," << row
137  << "): offsetX,Y = " << offsetX << "," << offsetY << " limit=" << limit1 << ":"
138  << limit2 << " rMin, rMax = " << m_rMin << "," << m_rMax;
139 #endif
141  std::string rotstr("NULL");
142 
143  // Check if we've already created the rotation matrix
144  rotstr = "R";
145  rotstr += std::to_string(copyNo);
146  rotation = DDRotation(DDName(rotstr));
147  if (!rotation) {
148  rotation = DDrot(DDName(rotstr, m_idNameSpace),
149  std::make_unique<DDRotationMatrix>(
150  *DDcreateRotationMatrix(theta, phiX, theta + yphi, phiY, -yphi, phiZ) *
151  (*DDcreateRotationMatrix(theta + xphi, phiX, 90._deg, 90._deg, xphi, 0.0))));
152  }
153 
154  DDTranslation tran(offsetX, offsetY, offsetZ);
155 #ifdef EDM_ML_DEBUG
156  edm::LogVerbatim("HGCalGeom") << "Module " << copyNo << ": location = " << tran << " Rotation " << rotation;
157 #endif
158  DDName parentName = parent().name();
159  cpv.position(DDName(m_childName), parentName, copyNo, tran, rotation);
160 
161  copyNo += m_incrCopyNo;
162  } else {
163 #ifdef EDM_ML_DEBUG
164  edm::LogVerbatim("HGCalGeom") << " (" << column << "," << row << "): offsetX,Y = " << offsetX << "," << offsetY
165  << " is out of limit=" << limit1 << ":" << limit2 << " rMin, rMax = " << m_rMin
166  << "," << m_rMax;
167 #endif
168  }
169 
170  yphi += yQuadrant * 2. * tiltAngle;
171  offsetY += yQuadrant * offsetXY;
172  }
173 #ifdef EDM_ML_DEBUG
174  if (row > rowmax)
175  rowmax = row;
176 #endif
177  xphi += xQuadrant * 2. * tiltAngle;
178  yphi = yQuadrant * tiltAngle;
179  offsetY = yQuadrant * 0.5 * offsetXY;
180  offsetX += xQuadrant * offsetXY;
181  }
182 #ifdef EDM_ML_DEBUG
183  edm::LogVerbatim("HGCalGeom") << rowmax << " rows and " << column << " columns in quadrant " << xQuadrant << ":"
184  << yQuadrant;
185 #endif
186  return copyNo;
187 }
188 
189 DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDHGCalNoTaperEndcap, "hgcal:DDHGCalNoTaperEndcap");
Log< level::Info, true > LogVerbatim
static AlgebraicMatrix initialize()
void position(const DDLogicalPart &self, const DDLogicalPart &parent, const std::string &copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=nullptr)
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:17
static std::string & ns()
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:81
static std::string to_string(const XMLCh *ch)
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:57
T sqrt(T t)
Definition: SSEVec.h:23
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
DDRotation DDrot(const DDName &name, std::unique_ptr< DDRotationMatrix > rot)
Definition of a uniquely identifiable rotation matrix named by DDName name.
Definition: DDRotation.cc:67
std::unique_ptr< DDRotationMatrix > DDcreateRotationMatrix(double thetaX, double phiX, double thetaY, double phiY, double thetaZ, double phiZ)
create a new DDRotationMatrix in the GEANT3 style.
Definition: DDRotation.cc:120
void initialize(const DDNumericArguments &nArgs, const DDVectorArguments &vArgs, const DDMapArguments &mArgs, const DDStringArguments &sArgs, const DDStringVectorArguments &vsArgs) override
void execute(DDCompactView &cpv) override
#define DEFINE_EDM_PLUGIN(factory, type, name)
int createQuarter(DDCompactView &cpv, int xQuadrant, int yQuadrant, int startCopyNo)
Geom::Theta< T > theta() const
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7