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