14 #include "DD4hep/DetFactoryHelper.h" 99 nsectors = args.
value<
int>(
"Sector");
100 nsectortot = args.
value<
int>(
"SectorTot");
101 nEndcap = args.
value<
int>(
"Endcap");
103 zShift = args.
value<
double>(
"ZShift");
104 zFront = args.
value<
double>(
"ZFront");
105 zEnd = args.
value<
double>(
"ZEnd");
106 ziNose = args.
value<
double>(
"ZiNose");
107 ziL0Nose = args.
value<
double>(
"ZiL0Nose");
108 ziBody = args.
value<
double>(
"ZiBody");
109 ziL0Body = args.
value<
double>(
"ZiL0Body");
110 z0Beam = args.
value<
double>(
"Z0Beam");
111 ziDip = args.
value<
double>(
"ZiDip");
112 dzStep = args.
value<
double>(
"DzStep");
113 zShiftHac2 = args.
value<
double>(
"ZShiftHac2");
114 double gap = args.
value<
double>(
"Gap");
115 double z1 = args.
value<
double>(
"Z1");
116 double r1 = args.
value<
double>(
"R1");
117 rout = args.
value<
double>(
"Rout");
118 heboxDepth = args.
value<
double>(
"HEboxDepth");
119 drEnd = args.
value<
double>(
"DrEnd");
121 angBot = args.
value<
double>(
"AngBot");
122 angGap = args.
value<
double>(
"AngGap");
124 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: General material " << genMaterial <<
"\tSectors " << nsectors
125 <<
", " << nsectortot <<
"\tEndcaps " << nEndcap <<
"\tRotation matrix for half " 133 <<
convertCmToMm(drEnd) <<
"\tetamin " << etamin <<
" Bottom angle " << angBot
134 <<
" Gap angle " << angGap <<
" Z-Shift " <<
convertCmToMm(zShift) <<
" " 139 angTop = 2.0 * atan(
exp(-etamin));
141 z1Beam = z1 - r1 /
slope;
142 ziKink = z1Beam + rout /
slope;
143 riKink = ziKink *
tan(angBot);
144 riDip = ziDip *
tan(angBot);
145 roDip = rout - heboxDepth;
146 dzShift = (z1Beam - z0Beam) - gap /
sin(angGap);
158 modules = args.
value<
int>(
"Modules");
160 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: Number of modules " << modules <<
" and absorber material " 164 modName = args.
value<std::vector<std::string> >(
"ModuleName");
165 modMat = args.
value<std::vector<std::string> >(
"ModuleMat");
166 modType = args.
value<std::vector<int> >(
"ModuleType");
167 sectionModule = args.
value<std::vector<int> >(
"SectionModule");
168 thick = args.
value<std::vector<double> >(
"ModuleThick");
169 trimLeft = args.
value<std::vector<double> >(
"TrimLeft");
170 trimRight = args.
value<std::vector<double> >(
"TrimRight");
171 eModule = args.
value<std::vector<int> >(
"EquipModule");
172 layerN = args.
value<std::vector<int> >(
"LayerN");
173 layerN0 = args.
value<std::vector<int> >(
"LayerN0");
174 layerN1 = args.
value<std::vector<int> >(
"LayerN1");
175 layerN2 = args.
value<std::vector<int> >(
"LayerN2");
176 layerN3 = args.
value<std::vector<int> >(
"LayerN3");
177 layerN4 = args.
value<std::vector<int> >(
"LayerN4");
178 layerN5 = args.
value<std::vector<int> >(
"LayerN5");
181 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << modName[
i] <<
" type " << modType[
i] <<
" Sections " 182 << sectionModule[
i] <<
" thickness of absorber/air " <<
convertCmToMm(thick[
i])
184 <<
" equip module " << eModule[
i] <<
" with " << layerN[
i] <<
" layers";
186 for (
int j = 0;
j < layerN[
i];
j++) {
190 for (
int j = 0;
j < layerN[
i];
j++) {
194 for (
int j = 0;
j < layerN[
i];
j++) {
198 for (
int j = 0;
j < layerN[
i];
j++) {
202 for (
int j = 0;
j < layerN[
i];
j++) {
206 for (
int j = 0;
j < layerN[
i];
j++) {
215 phiSections = args.
value<
int>(
"PhiSections");
216 phiName = args.
value<std::vector<std::string> >(
"PhiName");
217 layers = args.
value<
int>(
"Layers");
218 layerName = args.
value<std::vector<std::string> >(
"LayerName");
219 layerType = args.
value<std::vector<int> >(
"LayerType");
220 layerT = args.
value<std::vector<double> >(
"LayerT");
221 scintT = args.
value<std::vector<double> >(
"ScintT");
226 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: Phi Sections " << phiSections;
227 for (
int i = 0;
i < phiSections;
i++)
229 edm::LogVerbatim(
"HCalGeom") <<
"\tPlastic: " << plastMat <<
"\tScintillator: " << scintMat <<
"\tRotation matrix " 230 << rotmat <<
"\n\tNumber of layers " <<
layers;
232 edm::LogVerbatim(
"HCalGeom") <<
"\t" << layerName[
i] <<
"\tType " << layerType[
i] <<
"\tThickness " 242 zminBlock.emplace_back(ziL0Nose);
243 zmaxBlock.emplace_back(zminBlock[module] + layerT[0] + 0.5 * dzStep);
244 rinBlock1.emplace_back(zminBlock[module] *
tan(angTop));
245 rinBlock2.emplace_back(zmaxBlock[module] *
tan(angTop));
246 routBlock1.emplace_back((zminBlock[module] - z1Beam) * slope);
247 routBlock2.emplace_back((zmaxBlock[module] - z1Beam) * slope);
252 zminBlock.emplace_back(ziL0Body);
253 zmaxBlock.emplace_back(zminBlock[module] + layerT[0] + 0.5 * dzStep);
254 rinBlock1.emplace_back(zminBlock[module] *
tan(angBot));
255 rinBlock2.emplace_back(zmaxBlock[module] *
tan(angBot));
256 routBlock1.emplace_back(zminBlock[module] *
tan(angTop));
257 routBlock2.emplace_back(zmaxBlock[module] *
tan(angTop));
262 zminBlock.emplace_back(ziNose);
263 zmaxBlock.emplace_back(ziBody);
264 rinBlock1.emplace_back(zminBlock[module] *
tan(angTop));
265 rinBlock2.emplace_back(zmaxBlock[module] *
tan(angTop));
266 routBlock1.emplace_back((zminBlock[module] - z1Beam) * slope);
267 routBlock2.emplace_back((zmaxBlock[module] - z1Beam) * slope);
272 zminBlock.emplace_back(ziBody);
273 zmaxBlock.emplace_back(zminBlock[module] + layerN[3] * dzStep);
274 rinBlock1.emplace_back(zminBlock[module] *
tan(angBot));
275 rinBlock2.emplace_back(zmaxBlock[module] *
tan(angBot));
276 routBlock1.emplace_back((zmaxBlock[module - 1] - z1Beam) * slope);
277 routBlock2.emplace_back(rout);
282 zminBlock.emplace_back(zmaxBlock[module - 1]);
283 zmaxBlock.emplace_back(zminBlock[module] + layerN[4] * dzStep);
284 rinBlock1.emplace_back(zminBlock[module] *
tan(angBot));
285 rinBlock2.emplace_back(zmaxBlock[module] *
tan(angBot));
286 routBlock1.emplace_back(rout);
287 routBlock2.emplace_back(rout);
292 zminBlock.emplace_back(zmaxBlock[module - 1]);
293 zmaxBlock.emplace_back(zminBlock[module] + layerN[5] * dzStep);
294 rinBlock1.emplace_back(zminBlock[module] *
tan(angBot));
295 rinBlock2.emplace_back(zmaxBlock[module] *
tan(angBot));
296 routBlock1.emplace_back(rout);
297 routBlock2.emplace_back(roDip);
301 for (
int i = 0;
i < module;
i++)
310 idOffset = args.
value<
int>(
"IdOffset");
313 <<
" NameSpace " << idNameSpace <<
" Offset " << idOffset;
316 tolPos = args.
value<
double>(
"TolPos");
317 tolAbs = args.
value<
double>(
"TolAbs");
325 constructGeneralVolume(ns, parent);
327 edm::LogVerbatim(
"HCalGeom") <<
"<<== End of DDHCalEndcapAlgo construction ...";
337 for (
int i = 0;
i < 3;
i++)
341 dd4hep::Rotation3D
rot = getRotation(rotation, ns);
346 dd4hep::Position r0(0, 0, zShift);
347 double alpha = (1._pi) / nsectors;
348 double dphi = nsectortot * (2._pi) / nsectors;
354 std::vector<double> pgonZ, pgonRmin, pgonRmax;
356 double zf = ziBody + zShiftHac2;
357 pgonZ.emplace_back(zf - dzShift);
358 pgonRmin.emplace_back(zf *
tan(angBot));
359 pgonRmax.emplace_back((zf - z1Beam) * slope);
361 pgonZ.emplace_back(zFront - dzShift);
362 pgonRmin.emplace_back(zFront *
tan(angTop));
363 pgonRmax.emplace_back((zFront - z1Beam) * slope);
364 pgonZ.emplace_back(ziL0Body - dzShift);
365 pgonRmin.emplace_back(ziL0Body *
tan(angTop));
366 pgonRmax.emplace_back((ziL0Body - z1Beam) * slope);
367 pgonZ.emplace_back(ziL0Body - dzShift);
368 pgonRmin.emplace_back(ziL0Body *
tan(angBot));
369 pgonRmax.emplace_back((ziL0Body - z1Beam) * slope);
371 pgonZ.emplace_back(ziKink - dzShift);
372 pgonRmin.emplace_back(riKink);
373 pgonRmax.emplace_back(rout);
374 pgonZ.emplace_back(ziDip - dzShift);
375 pgonRmin.emplace_back(riDip);
376 pgonRmax.emplace_back(rout);
377 pgonZ.emplace_back(ziDip - dzShift + delz);
378 pgonRmin.emplace_back(riDip);
379 pgonRmax.emplace_back(roDip);
380 pgonZ.emplace_back(zEnd - dzShift);
381 pgonRmin.emplace_back(zEnd *
tan(angBot));
382 pgonRmax.emplace_back(roDip);
383 pgonZ.emplace_back(zEnd);
384 pgonRmin.emplace_back(zEnd *
tan(angBot));
385 pgonRmax.emplace_back(roDip);
390 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << solid.name() <<
" Polyhedra made of " << genMaterial
391 <<
" with " << nsectortot <<
" sectors from " <<
convertRadToDeg(-alpha) <<
" to " 392 <<
convertRadToDeg(-alpha + dphi) <<
" and with " << pgonZ.size() <<
" sections";
393 for (
unsigned int i = 0;
i < pgonZ.size();
i++)
400 parent.placeVolume(genlogic, 1, dd4hep::Transform3D(rot, r0));
402 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << genlogic.name() <<
" number 1 positioned in " 404 <<
") with rotation: " <<
rot;
408 rot = getRotation(rotHalf, ns);
409 parent.placeVolume(genlogic, 2, dd4hep::Transform3D(rot, r0));
411 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << genlogic.name() <<
" number 2 " 412 <<
"positioned in " << parent.name() <<
" at (0, 0, " <<
convertCmToMm(zShift)
413 <<
") with rotation: " <<
rot;
418 name = idName +
"Front";
419 std::vector<double> pgonZMod, pgonRminMod, pgonRmaxMod;
420 for (
unsigned int i = 0; i < (pgonZ.size() - 1); i++) {
421 pgonZMod.emplace_back(pgonZ[i] + dzShift);
422 pgonRminMod.emplace_back(pgonRmin[i]);
423 pgonRmaxMod.emplace_back(pgonRmax[i]);
427 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << solid.name() <<
" Polyhedra made of " << genMaterial
428 <<
" with " << nsectortot <<
" sectors from " <<
convertRadToDeg(-alpha) <<
" to " 429 <<
convertRadToDeg(-alpha + dphi) <<
" and with " << pgonZMod.size() <<
" sections ";
430 for (
unsigned int i = 0; i < pgonZMod.size(); i++)
438 genlogic.placeVolume(genlogich, 1, dd4hep::Position(0, 0, -dzShift));
440 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << genlogich.name() <<
" number 1 positioned in " 441 << genlogic.name() <<
" at (0,0," << -
convertCmToMm(dzShift) <<
") with no rotation";
445 name = idName +
"Module";
448 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << solid.name() <<
" Polyhedra made of " << genMaterial
450 <<
convertRadToDeg(alpha) <<
" and with " << pgonZMod.size() <<
" sections";
451 for (
unsigned int i = 0; i < pgonZMod.size(); i++)
458 for (
int ii = 0;
ii < nsectortot;
ii++) {
460 dd4hep::Rotation3D rot0;
462 rot0 = dd4hep::RotationZ(phi);
468 genlogich.placeVolume(seclogic,
ii + 1, rot0);
470 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << seclogic.name() <<
" number " <<
ii + 1
471 <<
" positioned in " << genlogich.name() <<
" at (0, 0, 0) with rotation: " << rot0;
476 constructInsideSector(ns, seclogic);
479 name = idName +
"Back";
480 std::vector<double> pgonZBack, pgonRminBack, pgonRmaxBack;
481 pgonZBack.emplace_back(zEnd - dzShift);
482 pgonRminBack.emplace_back(pgonZBack[0] *
tan(angBot) + drEnd);
483 pgonRmaxBack.emplace_back(roDip);
484 pgonZBack.emplace_back(zEnd);
485 pgonRminBack.emplace_back(pgonZBack[1] *
tan(angBot) + drEnd);
486 pgonRmaxBack.emplace_back(roDip);
489 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << solid.name() <<
" Polyhedra made of " << absMat <<
" with " 491 <<
convertRadToDeg(-alpha + dphi) <<
" and with " << pgonZBack.size() <<
" sections";
492 for (
unsigned int i = 0; i < pgonZBack.size(); i++)
500 genlogic.placeVolume(glog, 1);
502 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << glog.name() <<
" number 1 positioned in " << genlogic.name()
503 <<
" at (0,0,0) with no rotation";
509 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: Modules (" << modules <<
") ...";
512 double alpha = (1._pi) / nsectors;
517 if (eModule[i] > 0) {
518 int nsec = sectionModule[
i];
524 std::vector<double> pgonZ, pgonRmin, pgonRmax;
526 double zf = zminBlock[
i] + zShiftHac2;
527 pgonZ.emplace_back(zf);
528 pgonRmin.emplace_back(zf *
tan(angBot));
529 pgonRmax.emplace_back((zf - z1Beam) * slope);
530 pgonZ.emplace_back(ziKink);
531 pgonRmin.emplace_back(riKink);
532 pgonRmax.emplace_back(rout);
534 pgonZ.emplace_back(zminBlock[i]);
535 pgonRmin.emplace_back(rinBlock1[i]);
536 pgonRmax.emplace_back(routBlock1[i]);
539 pgonZ.emplace_back(ziDip);
540 pgonRmin.emplace_back(riDip);
541 pgonRmax.emplace_back(rout);
542 pgonZ.emplace_back(pgonZ[1] + deltaz);
543 pgonRmin.emplace_back(pgonRmin[1]);
544 pgonRmax.emplace_back(roDip);
546 pgonZ.emplace_back(zmaxBlock[i]);
547 pgonRmin.emplace_back(rinBlock2[i]);
548 pgonRmax.emplace_back(routBlock2[i]);
553 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << solid.name() <<
" Polyhedra made of " << modMat[
i]
556 for (
unsigned int k = 0;
k < pgonZ.size();
k++)
564 sector.placeVolume(glog, i + 1);
566 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << glog.name() <<
" number " << i + 1 <<
" positioned in " 567 << sector.name() <<
" at (0,0,0) with no rotation";
571 constructInsideModule0(ns, glog, i);
573 constructInsideModule(ns, glog, i);
585 dd4hep::Rotation3D
rot = getRotation(rotmat, ns);
589 int layer = getLayer(mod, 0);
590 int layer0 = getLayer(mod, 1);
592 double xpos, ypos, zpos;
596 double yh, bl, tl, alp;
597 parameterLayer0(mod, layer,
iphi, yh, bl, tl, alp, xpos, ypos, zpos);
599 solid = dd4hep::Trap(ns.
prepend(name), 0.5 * layerT[layer], 0, 0, yh, bl, tl, alp, yh, bl, tl, alp);
601 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << solid.name() <<
" Trap made of " << plastMat
602 <<
" of dimensions " <<
convertCmToMm(0.5 * layerT[layer]) <<
", 0, 0, " 610 dd4hep::Position
r1(xpos, ypos, zpos);
611 module.placeVolume(glog, idOffset + layer + 1, dd4hep::Transform3D(rot, r1));
614 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << glog.name() <<
" number " << (idOffset + layer + 1)
615 <<
" positioned in " << module.name() <<
" at (" <<
convertCmToMm(xpos) <<
", " 620 int copyNo = layer0 * 10 + layerType[layer];
621 name = modName[
mod] + layerName[layer] + phiName[
iphi];
622 constructScintLayer(ns, glog, scintT[layer], yh, bl, tl, alp, name, copyNo);
626 double zi = zminBlock[
mod] + layerT[layer];
627 double zo = zi + 0.5 * dzStep;
628 double rinF, routF, rinB, routB;
630 rinF = zi *
tan(angTop);
631 routF = (zi - z1Beam) * slope;
632 rinB = zo *
tan(angTop);
633 routB = (zo - z1Beam) * slope;
635 rinF = zi *
tan(angBot);
636 routF = zi *
tan(angTop);
637 rinB = zo *
tan(angBot);
638 routB = zo *
tan(angTop);
647 double yh1, bl1, tl1, yh2, bl2, tl2,
theta, phi, alp;
649 0, rinF, routF, rinB, routB, zi, zo, yh1, bl1, tl1, yh2, bl2, tl2, alp, theta, phi, xpos, ypos, zpos);
650 double fact = tolAbs;
664 solid = dd4hep::Trap(ns.
prepend(name), 0.5 * thick[
mod],
theta, phi, yh1, bl1, tl1, alp, yh2, bl2, tl2, alp);
666 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << solid.name() <<
" Trap made of " << absMat
667 <<
" of dimensions " <<
convertCmToMm(0.5 * thick[mod]) <<
", " 676 dd4hep::Position
r2(xpos, ypos, zpos);
677 module.placeVolume(glog, 1, dd4hep::Transform3D(rot, r2));
680 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << glog.name() <<
" number 1 positioned in " << module.name()
693 dd4hep::Rotation3D
rot = getRotation(rotmat, ns);
697 double alpha = (1._pi) / nsectors;
698 double zi = zminBlock[
mod];
700 for (
int i = 0;
i < layerN[
mod];
i++) {
704 int layer = getLayer(mod,
i);
705 double zo = zi + 0.5 * dzStep;
708 double ziAir = zo - thick[
mod];
711 rinF = ziAir *
tan(angTop);
712 rinB = zo *
tan(angTop);
714 rinF = ziAir *
tan(angBot);
715 rinB = zo *
tan(angBot);
717 double routF = (ziAir - z1Beam) * slope;
718 double routB = (zo - z1Beam) * slope;
719 if (routF > routBlock2[mod])
720 routF = routBlock2[
mod];
721 if (routB > routBlock2[mod])
722 routB = routBlock2[
mod];
731 double yh1, bl1, tl1, yh2, bl2, tl2,
theta, phi, alp;
732 double xpos, ypos, zpos;
734 iphi, rinF, routF, rinB, routB, ziAir, zo, yh1, bl1, tl1, yh2, bl2, tl2, alp, theta, phi, xpos, ypos, zpos);
736 name =
DDSplit(module.name()).
first + layerName[layer] + phiName[
iphi] +
"Air";
737 solid = dd4hep::Trap(ns.
prepend(name), 0.5 * thick[
mod],
theta, phi, yh1, bl1, tl1, alp, yh2, bl2, tl2, alp);
739 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << solid.name() <<
" Trap made of " << matter.name()
740 <<
" of dimensions " <<
convertCmToMm(0.5 * thick[mod]) <<
", " 749 dd4hep::Position
r1(xpos, ypos, zpos);
750 module.placeVolume(glog, layer + 1, dd4hep::Transform3D(rot, r1));
753 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << glog.name() <<
" number " << (layer + 1)
754 <<
" positioned in " << module.name() <<
" at (" <<
convertCmToMm(xpos) <<
", " 756 <<
") with rotation: " <<
rot;
760 double yh = 0.5 * (routF - rinB) - getTrim(mod,
iphi);
761 double bl = 0.5 * rinB *
tan(alpha) - getTrim(mod,
iphi);
762 double tl = 0.5 * routF *
tan(alpha) - getTrim(mod,
iphi);
764 solid = dd4hep::Trap(ns.
prepend(name), 0.5 * layerT[layer], 0, 0, yh, bl, tl, alp, yh, bl, tl, alp);
766 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << solid.name() <<
" Trap made of " << plastMat
767 <<
" of dimensions " <<
convertCmToMm(0.5 * layerT[layer]) <<
", 0, 0, " 774 ypos = 0.5 * (routF + rinB) - xpos;
775 glog.placeVolume(plog, idOffset + layer + 1, dd4hep::Position(0., ypos, 0.));
778 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << plog.name() <<
" number " << (idOffset + layer + 1)
779 <<
" positioned in " << glog.name() <<
" at (0, " <<
convertCmToMm(ypos)
780 <<
", 0) with no rotation";
784 int copyNo = layer * 10 + layerType[layer];
785 name = modName[
mod] + layerName[layer] + phiName[
iphi];
786 constructScintLayer(ns, plog, scintT[layer], yh, bl, tl, alp, name, copyNo);
789 zi = zo - 0.5 * dzStep;
805 dd4hep::Solid solid = dd4hep::Trap(ns.
prepend(name), 0.5 *
dz, 0, 0, yh, bl, tl, alp, yh, bl, tl, alp);
807 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << solid.name() <<
" Trap made of " << scintMat
815 detector.placeVolume(glog,
id);
817 edm::LogVerbatim(
"HCalGeom") <<
"DDHCalEndcapAlgo: " << glog.name() <<
" number " <<
id <<
" positioned in " 818 << detector.name() <<
" at (0,0,0) with no rotation";
866 double alpha = (1._pi) / nsectors;
868 edm::LogVerbatim(
"HCalGeom") <<
"Input " << iphi <<
" " << layer <<
" " << iphi <<
" Alpha " 875 zo = zi + layerT[layer];
878 zi = zo - layerT[layer];
882 rin = zo *
tan(angTop);
883 rout = (zi - z1Beam) * slope;
885 rin = zo *
tan(angBot);
886 rout = zi *
tan(angTop);
888 yh = 0.5 * (rout - rin);
889 bl = 0.5 * rin *
tan(alpha);
890 tl = 0.5 * rout *
tan(alpha);
891 xpos = 0.5 * (rin + rout);
892 ypos = 0.5 * (bl + tl);
893 zpos = 0.5 * (zi + zo);
894 yh -= getTrim(mod, iphi);
895 bl -= getTrim(mod, iphi);
896 tl -= getTrim(mod, iphi);
897 alp = atan(0.5 *
tan(alpha));
932 double alpha = (1._pi) / nsectors;
941 yh1 = 0.5 * (routF - rinB);
942 bl1 = 0.5 * rinB *
tan(alpha);
943 tl1 = 0.5 * routF *
tan(alpha);
944 yh2 = 0.5 * (routF - rinB);
945 bl2 = 0.5 * rinB *
tan(alpha);
946 tl2 = 0.5 * routF *
tan(alpha);
947 double dx = 0.25 * (bl2 + tl2 - bl1 - tl1);
948 double dy = 0.5 * (rinB + routF - rinB - routF);
949 xpos = 0.25 * (rinB + routF + rinB + routF);
950 ypos = 0.25 * (bl2 + tl2 + bl1 + tl1);
951 zpos = 0.5 * (zi + zo);
952 alp = atan(0.5 *
tan(alpha));
960 double r =
sqrt(dx * dx + dy * dy);
961 theta = atan(r / (zo - zi));
985 dd4hep::SensitiveDetector& ) {
std::vector< double > scintT
dd4hep::Volume volume(const std::string &name, bool exc=true) const
std::vector< double > rinBlock2
std::vector< int > layerN5
std::vector< double > layerT
void constructInsideModule0(cms::DDNamespace &ns, dd4hep::Volume &module, int mod)
static const double slope[3]
constexpr NumType convertRadToDeg(NumType radians)
dd4hep::Volume addVolumeNS(dd4hep::Volume vol) const
Sin< T >::type sin(const T &t)
T value(const std::string &name) const
Geom::Theta< T > theta() const
std::vector< int > eModule
std::vector< double > zminBlock
std::vector< double > zmaxBlock
double getTrim(unsigned int i, unsigned int j) const
static long algorithm(dd4hep::Detector &, cms::DDParsingContext &ctxt, xml_h e, dd4hep::SensitiveDetector &)
std::vector< int > layerN0
std::vector< double > trimRight
std::vector< double > trimLeft
std::vector< int > layerN3
std::vector< std::string > modMat
void constructInsideModule(cms::DDNamespace &ns, dd4hep::Volume &module, int mod)
std::string_view name() const
int getLayer(unsigned int i, unsigned int j) const
std::vector< int > layerN1
void constructGeneralVolume(cms::DDNamespace &ns, dd4hep::Volume &parent)
void constructInsideSector(cms::DDNamespace &ns, dd4hep::Volume §or)
std::vector< double > routBlock1
std::vector< int > layerN4
Tan< T >::type tan(const T &t)
dd4hep::Material material(const std::string &name) const
std::string prepend(const std::string &) const
std::vector< int > layerType
constexpr NumType convertCmToMm(NumType centimeters)
std::vector< int > layerN
std::vector< std::string > phiName
void parameterLayer0(int mod, int layer, int iphi, double &yh, double &bl, double &tl, double &alp, double &xpos, double &ypos, double &zpos)
std::vector< double > routBlock2
const dd4hep::Rotation3D & rotation(const std::string &name) const
std::vector< std::string > modName
std::vector< int > modType
std::vector< int > layerN2
std::vector< int > sectionModule
alpha
zGenParticlesMatch = cms.InputTag(""),
std::vector< std::string > layerName
void parameterLayer(int iphi, double rinF, double routF, double rinB, double routB, double zi, double zo, double &yh1, double &bl1, double &tl1, double &yh2, double &bl2, double &tl2, double &alp, double &theta, double &phi, double &xpos, double &ypos, double &zpos)
std::vector< double > rinBlock1
std::vector< double > thick
#define DECLARE_DDCMS_DETELEMENT(name, func)
T mod(const T &a, const T &b)
std::pair< std::string, std::string > DDSplit(const std::string &n)
split into (name,namespace), separator = ':'
void constructScintLayer(cms::DDNamespace &ns, dd4hep::Volume &detector, double dz, double yh, double bl, double tl, double alp, const std::string &nm, int id)
std::string parentName() const
Access value of rParent child node.
HCalEndcapAlgo(cms::DDParsingContext &ctxt, xml_h e)
dd4hep::Rotation3D getRotation(const std::string &rotation, cms::DDNamespace &ns)