4 #include "DD4hep/DetFactoryHelper.h"
13 dd4hep::SensitiveDetector& ) {
40 int nsectors =
args.value<
int>(
"NSector");
41 int nsectortot =
args.value<
int>(
"NSectorTot");
42 int nhalf =
args.value<
int>(
"NHalf");
43 double rin =
args.value<
double>(
"RIn");
44 std::vector<double>
theta =
args.value<std::vector<double> >(
"Theta");
45 std::vector<double> rmax =
args.value<std::vector<double> >(
"RMax");
46 std::vector<double> zoff =
args.value<std::vector<double> >(
"ZOff");
48 double thick =
args.value<
double>(
"Thickness");
49 double width1 =
args.value<
double>(
"Width1");
50 double length1 =
args.value<
double>(
"Length1");
51 double width2 =
args.value<
double>(
"Width2");
52 double length2 =
args.value<
double>(
"Length2");
53 double gap2 =
args.value<
double>(
"Gap2");
56 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: General material " << genMat <<
"\tSectors " << nsectors <<
", "
57 << nsectortot <<
"\tHalves " << nhalf <<
"\tRin " <<
convertCmToMm(rin);
58 for (
unsigned int i = 0;
i <
theta.size();
i++)
66 <<
" NameSpace " << ns.
name() <<
" for solids";
69 double alpha = 1._pi / nsectors;
70 double dphi = nsectortot * 2._pi / nsectors;
71 double zstep0 = zoff[1] + rmax[1] *
tan(
theta[1]) + (rin - rmax[1]) *
tan(
theta[2]);
72 double zstep1 = zstep0 + thick /
cos(
theta[2]);
73 double zstep2 = zoff[3];
74 double rstep0 = rin + (zstep2 - zstep1) /
tan(
theta[2]);
75 double rstep1 = rin + (zstep1 - zstep0) /
tan(
theta[2]);
77 std::vector<double> pgonZ = {zstep0, zstep1, zstep2, zstep2 + thick /
cos(
theta[2])};
78 std::vector<double> pgonRmin = {rin, rin, rstep0, rmax[2]};
79 std::vector<double> pgonRmax = {rin, rstep1, rmax[2], rmax[2]};
85 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << solid.name() <<
" Polyhedra made of " << genMat <<
" with "
88 for (
unsigned int i = 0;
i < pgonZ.size();
i++)
94 dd4hep::Rotation3D
rot;
95 parent.placeVolume(genlogic, 1);
97 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << genlogic.name() <<
" number 1 positioned in "
98 <<
parent.name() <<
" at (0, 0, 0) with no rotation";
104 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << genlogic.name() <<
" number 2 positioned in "
105 <<
parent.name() <<
" at (0, 0, 0) with rotation: " <<
rot;
114 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << solid.name() <<
" Polyhedra made of " << genMat
116 <<
" and with " << pgonZ.size() <<
" sections";
117 for (
unsigned int i = 0;
i < pgonZ.size();
i++)
122 for (
int ii = 0;
ii < nsectortot; ++
ii) {
128 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: Creating a new rotation "
133 genlogic.placeVolume(seclogic,
ii + 1,
rotation);
135 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << seclogic.name() <<
" number " <<
ii + 1
136 <<
" positioned in " << genlogic.name() <<
" at (0, 0, 0) with rotation: " <<
rotation;
141 double rinl = pgonRmin[0] + thick *
sin(
theta[2]);
142 double routl = pgonRmax[2] - thick *
sin(
theta[2]);
144 double dx2 = 0.90 * routl *
tan(
alpha);
145 double dy = 0.50 * thick;
146 double dz = 0.50 * (routl - rinl);
148 solid = dd4hep::Trap(ns.
prepend(
name),
dz, 0, 0,
dy, dx1, dx1, 0,
dy, dx2, dx2, 0);
151 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << solid.name() <<
" Trap made of " << genMat
159 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: Creating a rotation: \t90, 270, "
164 seclogic.placeVolume(glog, 1, dd4hep::Transform3D(
rot,
r1));
166 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << glog.name() <<
" number 1 positioned in " << seclogic.name()
172 double phi = atan((dx2 - dx1) / (2 *
dz));
173 double xmid = 0.5 * (dx1 + dx2) - 1.0;
174 solid = dd4hep::Box(ns.
prepend(
name), 0.5 * width1, 0.5 * thick, 0.5 * length1);
178 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << solid.name() <<
" Box made of " << absMat <<
" of dimension "
183 dd4hep::Rotation3D rot2 =
cms::makeRotation3D((90._deg + phi), 0.0, 90._deg, 90._deg, phi, 0.0);
189 glog.placeVolume(cablog1, 1, dd4hep::Transform3D(rot2,
r2));
191 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << cablog1.name() <<
" number 1 positioned in " << glog.name()
193 <<
", 0, 0) with rotation: " << rot2;
195 dd4hep::Rotation3D rot3 =
cms::makeRotation3D((90._deg - phi), 0, 90._deg, 90._deg, -phi, 0);
201 glog.placeVolume(cablog1, 2, dd4hep::Transform3D(rot3, r3));
203 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << cablog1.name() <<
" number 2 positioned in " << glog.name()
205 <<
", 0, 0) with rotation: " << rot3;
209 solid = dd4hep::Box(ns.
prepend(
name), 0.5 * width2, 0.5 * thick, 0.5 * length2);
212 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << solid.name() <<
" Box made of " << absMat <<
" of dimension "
217 glog.placeVolume(cablog2, 1,
dd4hep::Position(0.5 * (width2 + gap2), 0, 0));
219 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << cablog2.name() <<
" number 1 positioned in " << glog.name()
220 <<
" at (" <<
convertCmToMm(0.5 * (width2 + gap2)) <<
", 0, 0) with no rotation";
222 glog.placeVolume(cablog2, 2,
dd4hep::Position(-0.5 * (width2 + gap2), 0, 0));
224 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalTBCableAlgo: " << cablog2.name() <<
" number 2 positioned in " << glog.name()
225 <<
" at " <<
convertCmToMm(-0.5 * (width2 + gap2)) <<
", 0, 0) with no rotation";
227 edm::LogVerbatim(
"HCalGeom") <<
"<<== End of DDHCalTBCableAlgo construction";