30 const auto& wafer =
args.value<std::vector<std::string> >(
"WaferName");
31 auto materials =
args.value<std::vector<std::string> >(
"MaterialNames");
32 const auto&
names =
args.value<std::vector<std::string> >(
"VolumeNames");
33 const auto& thick =
args.value<std::vector<double> >(
"Thickness");
34 std::vector<int> copyNumber;
35 for (
unsigned int i = 0;
i < materials.size(); ++
i) {
36 if (materials[
i] ==
"materials:M_NEMAFR4plate")
37 materials[
i] =
"materials:M_NEMA FR4 plate";
38 copyNumber.emplace_back(1);
41 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule: " << wafer.size() <<
" wafers";
42 for (
unsigned int i = 0;
i < wafer.size(); ++
i)
44 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule: " << materials.size() <<
" types of volumes";
45 for (
unsigned int i = 0;
i < names.size(); ++
i)
46 edm::LogVerbatim(
"HGCalGeom") <<
"Volume [" <<
i <<
"] " << names[
i] <<
" of thickness " << thick[
i]
47 <<
" filled with " << materials[
i] <<
" first copy number " << copyNumber[
i];
49 const auto&
layers =
args.value<std::vector<int> >(
"Layers");
50 const auto& layerThick =
args.value<std::vector<double> >(
"LayerThick");
51 const auto& layerType =
args.value<std::vector<int> >(
"LayerType");
52 const auto& layerSense =
args.value<std::vector<int> >(
"LayerSense");
55 for (
unsigned int i = 0;
i <
layers.size(); ++
i)
58 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule: " << layerType.size() <<
" layers";
59 for (
unsigned int i = 0;
i < layerType.size(); ++
i)
60 edm::LogVerbatim(
"HGCalGeom") <<
"Layer [" <<
i <<
"] with material type " << layerType[
i] <<
" sensitive class " 63 double zMinBlock =
args.value<
double>(
"zMinBlock");
64 double rMaxFine =
args.value<
double>(
"rMaxFine");
65 double waferW =
args.value<
double>(
"waferW");
68 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule: zStart " << zMinBlock <<
" rFineCoarse " << rMaxFine
69 <<
" wafer width " << waferW <<
" sectors " <<
sectors;
71 const auto& slopeB =
args.value<std::vector<double> >(
"SlopeBottom");
72 const auto& slopeT =
args.value<std::vector<double> >(
"SlopeTop");
73 const auto& zFront =
args.value<std::vector<double> >(
"ZFront");
74 const auto& rMaxFront =
args.value<std::vector<double> >(
"RMaxFront");
76 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule: Bottom slopes " << slopeB[0] <<
":" << slopeB[1] <<
" and " 77 << slopeT.size() <<
" slopes for top";
78 for (
unsigned int i = 0;
i < slopeT.size(); ++
i)
79 edm::LogVerbatim(
"HGCalGeom") <<
"Block [" <<
i <<
"] Zmin " << zFront[
i] <<
" Rmax " << rMaxFront[
i] <<
" Slope " 85 std::unordered_set<int> copies;
94 const double tol(0.01);
95 for (
unsigned int i = 0;
i < layers.size();
i++) {
96 double zo = zi + layerThick[
i];
98 int laymax = laymin + layers[
i];
101 for (
int ly = laymin; ly < laymax; ++ly) {
102 int ii = layerType[ly];
103 int copy = copyNumber[
ii];
104 double rinB = (layerSense[ly] == 0) ? (zo * slopeB[0]) : (zo * slopeB[1]);
105 zz += (0.5 * thick[
ii]);
106 thickTot += thick[
ii];
110 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule: Layer " << ly <<
":" << ii <<
" Front " << zi <<
", " << routF
111 <<
" Back " << zo <<
", " << rinB <<
" superlayer thickness " << layerThick[
i];
115 if (layerSense[ly] == 0) {
117 double rmax = routF *
cos(alpha) - tol;
118 std::vector<double> pgonZ, pgonRin, pgonRout;
119 pgonZ.emplace_back(-0.5 * thick[ii]);
120 pgonZ.emplace_back(0.5 * thick[ii]);
121 pgonRin.emplace_back(rinB);
122 pgonRin.emplace_back(rinB);
123 pgonRout.emplace_back(rmax);
124 pgonRout.emplace_back(rmax);
126 ns.addSolidNS(ns.prepend(name), solid);
129 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule: " << solid.name() <<
" polyhedra of " << sectors
131 << (360.0 +
convertRadToDeg(-alpha)) <<
" with " << pgonZ.size() <<
" sections";
132 for (
unsigned int k = 0;
k < pgonZ.size(); ++
k)
133 edm::LogVerbatim(
"HGCalGeom") <<
"[" <<
k <<
"] z " << pgonZ[
k] <<
" R " << pgonRin[
k] <<
":" << pgonRout[
k];
136 dd4hep::Solid solid = dd4hep::Tube(0.5 * thick[ii], rinB, routF, 0.0, 2 *
cms_units::piRadians);
137 ns.addSolidNS(ns.prepend(name), solid);
140 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule: " << solid.name() <<
" Tubs made of " << materials[
ii]
141 <<
" of dimensions " << rinB <<
", " << routF <<
", " << 0.5 * thick[
ii]
143 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule test position in: " << glog.name() <<
" number " <<
copy;
145 double dx = 0.5 * waferW;
146 double dy = 3.0 * dx *
tan(30._deg);
147 double rr = 2.0 * dx *
tan(30._deg);
148 int ncol =
static_cast<int>(2.0 * routF / waferW) + 1;
149 int nrow =
static_cast<int>(routF / (waferW *
tan(30._deg))) + 1;
151 int incm(0), inrm(0), kount(0), ntot(0),
nin(0), nfine(0), ncoarse(0);
152 edm::LogVerbatim(
"HGCalGeom") << glog.name() <<
" rout " << routF <<
" Row " << nrow <<
" Column " << ncol;
154 for (
int nr = -nrow;
nr <= nrow; ++
nr) {
155 int inr = (
nr >= 0) ?
nr : -
nr;
156 for (
int nc = -ncol; nc <= ncol; ++nc) {
157 int inc = (nc >= 0) ? nc : -nc;
158 if (inr % 2 == inc % 2) {
159 double xpos = nc *
dx;
160 double ypos =
nr *
dy;
165 if (corner.first > 0) {
166 int copyL = inr * 100 + inc;
180 double rpos =
std::sqrt(xpos * xpos + ypos * ypos);
181 dd4hep::Position tran(xpos, ypos, 0.0);
183 dd4hep::Volume glog1 = (rpos < rMaxFine) ? ns.volume(wafer[0]) : ns.volume(wafer[1]);
184 glog.placeVolume(glog1, copyL, dd4hep::Transform3D(rotation, tran));
192 <<
"DDHGCalModule: " << glog1.name() <<
" number " << copyL <<
" positioned in " << glog.name()
193 <<
" at " << tran <<
" with " <<
rotation;
201 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule: # of columns " << incm <<
" # of rows " << inrm <<
" and " 202 <<
nin <<
":" << kount <<
":" << ntot <<
" wafers (" << nfine <<
":" << ncoarse
203 <<
") for " << glog.name() <<
" R " << rinB <<
":" << routF;
206 dd4hep::Position
r1(0, 0, zz);
207 dd4hep::Rotation3D
rot;
208 module.placeVolume(glog, copy, dd4hep::Transform3D(rot,
r1));
211 edm::LogVerbatim(
"HGCalGeom") <<
"DDHGCalModule: " << glog.name() <<
" number " << copy <<
" positioned in " 212 << module.name() <<
" at " <<
r1 <<
" with " <<
rot;
214 zz += (0.5 * thick[
ii]);
218 if (fabs(thickTot - layerThick[
i]) < 0.00001) {
219 }
else if (thickTot > layerThick[i]) {
220 edm::LogError(
"HGCalGeom") <<
"Thickness of the partition " << layerThick[
i] <<
" is smaller than thickness " 221 << thickTot <<
" of all its components **** ERROR ****\n";
222 }
else if (thickTot < layerThick[i]) {
223 edm::LogWarning(
"HGCalGeom") <<
"Thickness of the partition " << layerThick[
i] <<
" does not match with " 224 << thickTot <<
" of the components\n";
229 edm::LogVerbatim(
"HGCalGeom") << copies.size() <<
" different wafer copy numbers";
231 for (std::unordered_set<int>::const_iterator itr = copies.begin(); itr != copies.end(); ++itr, ++
k)
233 edm::LogVerbatim(
"HGCalGeom") <<
"<<== End of DDHGCalModule construction ...";
constexpr NumType convertRadToDeg(NumType radians)
const std::string names[nVars_]
constexpr long double piRadians(M_PIl)
Cos< T >::type cos(const T &t)
Tan< T >::type tan(const T &t)
static uint32_t k_CornerSize
alpha
zGenParticlesMatch = cms.InputTag(""),