14 #include "DD4hep/DetFactoryHelper.h"
56 double yh1, bl1, tl1, yh2, bl2, tl2, alp,
theta, phi, xpos, ypos,
zpos;
96 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: General material " << genMaterial <<
"\tAbsorber "
97 << absorberMat <<
"\tPlastic " << plasticMat <<
"\tScintillator " << scintMat
98 <<
"\tRotation " << rotstr <<
"\tSectors " <<
sectors;
100 zMinBlock =
args.value<
double>(
"ZMinBlock");
101 zMaxBlock =
args.value<
double>(
"ZMaxBlock");
102 z1Beam =
args.value<
double>(
"Z1Beam");
103 ziDip =
args.value<
double>(
"ZiDip");
104 dzStep =
args.value<
double>(
"DzStep");
105 moduleThick =
args.value<
double>(
"ModuleThick");
106 layerThick =
args.value<
double>(
"LayerThick");
107 scintThick =
args.value<
double>(
"ScintThick");
115 rMaxFront =
args.value<
double>(
"RMaxFront");
116 rMaxBack =
args.value<
double>(
"RMaxBack");
117 trimLeft =
args.value<
double>(
"TrimLeft");
118 trimRight =
args.value<
double>(
"TrimRight");
119 tolAbs =
args.value<
double>(
"TolAbs");
125 slopeBot =
args.value<
double>(
"SlopeBottom");
126 slopeTop =
args.value<
double>(
"SlopeTop");
127 slopeTopF =
args.value<
double>(
"SlopeTopFront");
128 modType =
args.value<
int>(
"ModType");
129 modNumber =
args.value<
int>(
"ModNumber");
130 layerType =
args.value<
int>(
"LayerType");
132 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: slopeBot " << slopeBot <<
"\tslopeTop " << slopeTop
133 <<
"\tslopeTopF " << slopeTopF <<
"\tmodType " << modType <<
"\tmodNumber "
134 << modNumber <<
"\tlayerType " << layerType;
136 layerNumber =
args.value<std::vector<int> >(
"LayerNumber");
138 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << layerNumber.size() <<
" layer Numbers";
139 for (
unsigned int i = 0;
i < layerNumber.size(); ++
i)
142 phiName =
args.value<std::vector<std::string> >(
"PhiName");
144 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << phiName.size() <<
" phi sectors";
145 for (
unsigned int i = 0;
i < phiName.size(); ++
i)
148 layerName =
args.value<std::vector<std::string> >(
"LayerName");
150 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << layerName.size() <<
" layers";
151 for (
unsigned int i = 0;
i < layerName.size(); ++
i)
155 idOffset =
args.value<
int>(
"IdOffset");
158 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: Parent " <<
args.parentName() <<
" " << modName
159 <<
" idName " <<
idName <<
" NameSpace " << ns.
name() <<
" Offset " << idOffset;
163 edm::LogVerbatim(
"HCalGeom") <<
"==>> Constructing DDHCalEndcapModuleAlgo...";
168 constructInsideModule0(ctxt,
e, mother);
170 constructInsideModule(ctxt,
e, mother);
172 edm::LogVerbatim(
"HCalGeom") <<
"<<== End of DDHCalEndcapModuleAlgo construction ...";
180 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: \t\tInside module0";
186 dd4hep::Rotation3D
rot = getRotation(rotstr, ns);
188 int layer = layerNumber[0];
189 int layer0 = layerNumber[1];
193 for (
unsigned int iphi = 0;
iphi < phiName.size();
iphi++) {
209 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << solid.name() <<
" Trap made of " << plasticMat
210 <<
" of dimensions " <<
convertCmToMm(0.5 * layerThick) <<
", 0, 0, "
219 module.placeVolume(glog, idOffset + layer + 1, dd4hep::Transform3D(
rot,
r1));
221 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << glog.name() <<
" number " << (idOffset + layer + 1)
222 <<
" positioned in " << module.name() <<
" at (" <<
convertCmToMm(parm.
xpos) <<
", "
224 <<
") with rotation: " <<
rot;
227 int copyNo = layer0 * 10 + layerType;
228 name = modName + layerName[0] + phiName[
iphi];
229 constructScintLayer(glog, scintThick, parm,
name, copyNo, ns);
233 double zi = zMinBlock + layerThick;
234 double zo = zi + 0.5 * dzStep;
235 double rinF, routF, rinB, routB;
236 if (modNumber == 0) {
237 rinF = zi * slopeTopF;
238 routF = (zi - z1Beam) * slopeTop;
239 rinB = zo * slopeTopF;
240 routB = (zo - z1Beam) * slopeTop;
241 }
else if (modNumber > 0) {
242 rinF = zi * slopeBot;
243 routF = zi * slopeTopF;
244 rinB = zo * slopeBot;
245 routB = zo * slopeTopF;
247 rinF = zi * slopeBot;
248 routF = (zi - z1Beam) * slopeTop;
249 rinB = zo * slopeBot;
250 routB = (zo - z1Beam) * slopeTop;
269 name =
idName + modName + layerName[0] +
"Absorber";
283 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << solid.name() <<
" Trap made of " << matabsorbr.name()
284 <<
" of dimensions " <<
convertCmToMm(0.5 * moduleThick) <<
", "
294 module.placeVolume(glog, idOffset + layer + 1, dd4hep::Transform3D(
rot,
r2));
296 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << glog.name() <<
" number 1 positioned in "
299 <<
") with rotation: " <<
rot;
306 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: \t\tInside module";
312 dd4hep::Rotation3D
rot = getRotation(rotstr, ns);
315 double zi = zMinBlock;
317 for (
unsigned int i = 0;
i < layerName.size();
i++) {
321 int layer = layerNumber[
i];
322 double zo = zi + 0.5 * dzStep;
324 for (
unsigned int iphi = 0;
iphi < phiName.size();
iphi++) {
325 double ziAir = zo - moduleThick;
327 if (modNumber == 0) {
328 rinF = ziAir * slopeTopF;
329 rinB = zo * slopeTopF;
331 rinF = ziAir * slopeBot;
332 rinB = zo * slopeBot;
334 double routF = getRout(ziAir);
335 double routB = getRout(zo);
337 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: Layer " <<
i <<
" Phi " <<
iphi <<
" Front "
358 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << solid.name() <<
" Trap made of " << matter.name()
359 <<
" of dimensions " <<
convertCmToMm(0.5 * moduleThick) <<
", "
369 module.placeVolume(glog, layer + 1, dd4hep::Transform3D(
rot,
r1));
371 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << glog.name() <<
" number " << layer + 1
374 <<
") with rotation: " <<
rot;
377 parm.
yh1 = 0.5 * (routF - rinB) - getTrim(
iphi);
394 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << solid.name() <<
" Trap made of "
395 << matplastic.name() <<
" of dimensions " <<
convertCmToMm(0.5 * layerThick)
403 double ypos = 0.5 * (routF + rinB) - parm.
xpos;
405 glog.placeVolume(plog, idOffset + layer + 1,
r2);
407 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << plog.name() <<
" number "
408 << (idOffset + layer + 1) <<
" positioned in " << glog.name() <<
" at (0, "
412 int copyNo = layer * 10 + layerType;
413 name = modName + layerName[
i] + phiName[
iphi];
414 constructScintLayer(plog, scintThick, parm,
name, copyNo, ns);
417 zi = zo - 0.5 * dzStep;
432 zo = zi + layerThick;
435 zi = zo - layerThick;
438 if (modNumber == 0) {
439 rin = zo * slopeTopF;
440 rout = (zi - z1Beam) * slopeTop;
441 }
else if (modNumber > 0) {
443 rout = zi * slopeTopF;
446 rout = (zi - z1Beam) * slopeTop;
450 <<
" " << slopeTopF <<
" " << slopeTop <<
" " << slopeBot <<
" " <<
convertCmToMm(rin)
453 double yh = 0.5 * (rout - rin);
455 double tl = 0.5 * rout *
tan(
alpha);
456 parm.
xpos = 0.5 * (rin + rout);
457 parm.
ypos = 0.5 * (bl + tl);
458 parm.
zpos = 0.5 * (zi + zo);
478 unsigned int iphi,
double rinF,
double routF,
double rinB,
double routB,
double zi,
double zo) {
489 parm.
yh1 = 0.5 * (routF - rinB);
492 parm.
yh2 = 0.5 * (routF - rinB);
496 double dy = 0.5 * (rinB + routF - rinB - routF);
497 parm.
xpos = 0.25 * (rinB + routF + rinB + routF);
499 parm.
zpos = 0.5 * (zi + zo);
513 parm.
theta = atan(
r / (zo - zi));
538 dd4hep::Solid solid = dd4hep::Trap(
539 ns.
prepend(
name), 0.5 *
dz, 0, 0, parm.
yh1, parm.
bl1, parm.
tl1, parm.
alp, parm.
yh1, parm.
bl1, parm.
tl1, parm.
alp);
541 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << solid.name() <<
" Trap made of " << scintMat
552 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapModuleAlgo: " << glog.name() <<
" number " <<
id <<
" positioned in "
553 <<
detector.name() <<
" at (0,0,0) with no rotation";
565 double r = (modNumber >= 0) ? ((z - z1Beam) * slopeTop) : z * slopeTopF;