File indexing completed on 2023-10-25 09:49:28
0001 #include "DataFormats/Math/interface/angle_units.h"
0002 #include "DetectorDescription/DDCMS/interface/DDPlugins.h"
0003 #include "DetectorDescription/DDCMS/interface/DDutils.h"
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005 #include "DD4hep/DetFactoryHelper.h"
0006
0007
0008 using namespace angle_units::operators;
0009
0010 static long algorithm(dd4hep::Detector& , cms::DDParsingContext& ctxt, xml_h e) {
0011 cms::DDNamespace ns(ctxt, e, true);
0012 cms::DDAlgoArguments args(ctxt, e);
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 std::string genMat = args.value<std::string>("MaterialName");
0037 int nsectors = args.value<int>("NSector");
0038 int nsectortot = args.value<int>("NSectorTot");
0039 int nhalf = args.value<int>("NHalf");
0040 double rin = args.value<double>("RIn");
0041 std::vector<double> theta = args.value<std::vector<double> >("Theta");
0042 std::vector<double> rmax = args.value<std::vector<double> >("RMax");
0043 std::vector<double> zoff = args.value<std::vector<double> >("ZOff");
0044 std::string absMat = args.value<std::string>("AbsMatName");
0045 double thick = args.value<double>("Thickness");
0046 double width1 = args.value<double>("Width1");
0047 double length1 = args.value<double>("Length1");
0048 double width2 = args.value<double>("Width2");
0049 double length2 = args.value<double>("Length2");
0050 double gap2 = args.value<double>("Gap2");
0051 std::string idName = args.value<std::string>("MotherName");
0052 #ifdef EDM_ML_DEBUG
0053 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: General material " << genMat << "\tSectors " << nsectors << ", "
0054 << nsectortot << "\tHalves " << nhalf << "\tRin " << cms::convert2mm(rin);
0055 for (unsigned int i = 0; i < theta.size(); i++)
0056 edm::LogVerbatim("HCalGeom") << "\t" << i << " Theta " << convertRadToDeg(theta[i]) << " rmax "
0057 << cms::convert2mm(rmax[i]) << " zoff " << cms::convert2mm(zoff[i]);
0058 edm::LogVerbatim("HCalGeom") << "\tCable mockup made of " << absMat << "\tThick " << cms::convert2mm(thick)
0059 << "\tLength and width " << cms::convert2mm(length1) << ", " << cms::convert2mm(width1)
0060 << " and " << cms::convert2mm(length2) << ", " << cms::convert2mm(width2) << " Gap "
0061 << cms::convert2mm(gap2);
0062 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: Parent " << args.parentName() << " idName " << idName
0063 << " NameSpace " << ns.name() << " for solids";
0064 #endif
0065
0066 double alpha = 1._pi / nsectors;
0067 double dphi = nsectortot * 2._pi / nsectors;
0068 double zstep0 = zoff[1] + rmax[1] * tan(theta[1]) + (rin - rmax[1]) * tan(theta[2]);
0069 double zstep1 = zstep0 + thick / cos(theta[2]);
0070 double zstep2 = zoff[3];
0071 double rstep0 = rin + (zstep2 - zstep1) / tan(theta[2]);
0072 double rstep1 = rin + (zstep1 - zstep0) / tan(theta[2]);
0073
0074 std::vector<double> pgonZ = {zstep0, zstep1, zstep2, zstep2 + thick / cos(theta[2])};
0075 std::vector<double> pgonRmin = {rin, rin, rstep0, rmax[2]};
0076 std::vector<double> pgonRmax = {rin, rstep1, rmax[2], rmax[2]};
0077
0078 dd4hep::Solid solid = dd4hep::Polyhedra(ns.prepend(idName), nsectortot, -alpha, dphi, pgonZ, pgonRmin, pgonRmax);
0079 dd4hep::Material matter = ns.material(genMat);
0080 dd4hep::Volume genlogic(solid.name(), solid, matter);
0081 #ifdef EDM_ML_DEBUG
0082 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << solid.name() << " Polyhedra made of " << genMat << " with "
0083 << nsectortot << " sectors from " << convertRadToDeg(-alpha) << " to "
0084 << convertRadToDeg(-alpha + dphi) << " and with " << pgonZ.size() << " sections";
0085 for (unsigned int i = 0; i < pgonZ.size(); i++)
0086 edm::LogVerbatim("HCalGeom") << "\t\tZ = " << cms::convert2mm(pgonZ[i])
0087 << "\tRmin = " << cms::convert2mm(pgonRmin[i])
0088 << "\tRmax = " << cms::convert2mm(pgonRmax[i]);
0089 #endif
0090
0091 dd4hep::Volume parent = ns.volume(args.parentName());
0092 dd4hep::Rotation3D rot;
0093 parent.placeVolume(genlogic, 1);
0094 #ifdef EDM_ML_DEBUG
0095 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << genlogic.name() << " number 1 positioned in "
0096 << parent.name() << " at (0, 0, 0) with no rotation";
0097 #endif
0098 if (nhalf != 1) {
0099 rot = cms::makeRotation3D(90._deg, 180._deg, 90._deg, 90._deg, 180._deg, 0);
0100 parent.placeVolume(genlogic, 2, rot);
0101 #ifdef EDM_ML_DEBUG
0102 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << genlogic.name() << " number 2 positioned in "
0103 << parent.name() << " at (0, 0, 0) with rotation: " << rot;
0104 #endif
0105 }
0106
0107
0108 std::string name = idName + "Module";
0109 solid = dd4hep::Polyhedra(ns.prepend(name), 1, -alpha, 2 * alpha, pgonZ, pgonRmin, pgonRmax);
0110 dd4hep::Volume seclogic(solid.name(), solid, matter);
0111 #ifdef EDM_ML_DEBUG
0112 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << solid.name() << " Polyhedra made of " << genMat
0113 << " with 1 sector from " << convertRadToDeg(-alpha) << " to " << convertRadToDeg(alpha)
0114 << " and with " << pgonZ.size() << " sections";
0115 for (unsigned int i = 0; i < pgonZ.size(); i++)
0116 edm::LogVerbatim("HCalGeom") << "\t\tZ = " << cms::convert2mm(pgonZ[i])
0117 << "\tRmin = " << cms::convert2mm(pgonRmin[i])
0118 << "\tRmax = " << cms::convert2mm(pgonRmax[i]);
0119 #endif
0120
0121 for (int ii = 0; ii < nsectortot; ++ii) {
0122 double phi = ii * 2 * alpha;
0123 dd4hep::Rotation3D rotation;
0124 if (phi != 0) {
0125 rotation = dd4hep::RotationZ(phi);
0126 #ifdef EDM_ML_DEBUG
0127 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: Creating a new rotation "
0128 << "\t90," << convertRadToDeg(phi) << ",90," << (90 + convertRadToDeg(phi))
0129 << ", 0, 0";
0130 #endif
0131 }
0132 genlogic.placeVolume(seclogic, ii + 1, rotation);
0133 #ifdef EDM_ML_DEBUG
0134 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << seclogic.name() << " number " << ii + 1
0135 << " positioned in " << genlogic.name() << " at (0, 0, 0) with rotation: " << rotation;
0136 #endif
0137 }
0138
0139
0140 double rinl = pgonRmin[0] + thick * sin(theta[2]);
0141 double routl = pgonRmax[2] - thick * sin(theta[2]);
0142 double dx1 = rinl * tan(alpha);
0143 double dx2 = 0.90 * routl * tan(alpha);
0144 double dy = 0.50 * thick;
0145 double dz = 0.50 * (routl - rinl);
0146 name = idName + "Trap";
0147 solid = dd4hep::Trap(ns.prepend(name), dz, 0, 0, dy, dx1, dx1, 0, dy, dx2, dx2, 0);
0148 dd4hep::Volume glog(solid.name(), solid, matter);
0149 #ifdef EDM_ML_DEBUG
0150 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << solid.name() << " Trap made of " << genMat
0151 << " of dimensions " << cms::convert2mm(dz) << ", 0, 0, " << cms::convert2mm(dy) << ", "
0152 << cms::convert2mm(dx1) << ", " << cms::convert2mm(dx1) << ", 0, " << cms::convert2mm(dy)
0153 << ", " << cms::convert2mm(dx2) << ", " << cms::convert2mm(dx2) << ", 0";
0154 #endif
0155
0156 rot = cms::makeRotation3D(90._deg, 270._deg, (180._deg - theta[2]), 0, (90._deg - theta[2]), 0);
0157 #ifdef EDM_ML_DEBUG
0158 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: Creating a rotation: \t90, 270, "
0159 << (180 - convertRadToDeg(theta[2])) << ", 0, " << (90 - convertRadToDeg(theta[2]))
0160 << ", 0";
0161 #endif
0162 dd4hep::Position r1(0.5 * (rinl + routl), 0, 0.5 * (pgonZ[1] + pgonZ[2]));
0163 seclogic.placeVolume(glog, 1, dd4hep::Transform3D(rot, r1));
0164 #ifdef EDM_ML_DEBUG
0165 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << glog.name() << " number 1 positioned in " << seclogic.name()
0166 << " at (" << cms::convert2mm(0.5 * (rinl + routl)) << ", 0, "
0167 << cms::convert2mm(0.5 * (pgonZ[1] + pgonZ[2])) << " with rotation: " << rot;
0168 #endif
0169
0170 name = idName + "Cable1";
0171 double phi = atan((dx2 - dx1) / (2 * dz));
0172 double xmid = 0.5 * (dx1 + dx2) - 1.0;
0173 solid = dd4hep::Box(ns.prepend(name), 0.5 * width1, 0.5 * thick, 0.5 * length1);
0174 dd4hep::Material absmatter = ns.material(absMat);
0175 dd4hep::Volume cablog1(solid.name(), solid, absmatter);
0176 #ifdef EDM_ML_DEBUG
0177 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << solid.name() << " Box made of " << absMat << " of dimension "
0178 << cms::convert2mm(0.5 * width1) << ", " << cms::convert2mm(0.5 * thick) << ", "
0179 << cms::convert2mm(0.5 * length1);
0180 #endif
0181
0182 dd4hep::Rotation3D rot2 = cms::makeRotation3D((90._deg + phi), 0.0, 90._deg, 90._deg, phi, 0.0);
0183 #ifdef EDM_ML_DEBUG
0184 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: Creating a rotation \t" << (90 + convertRadToDeg(phi))
0185 << ", 0, 90, 90, " << convertRadToDeg(phi) << ", 0";
0186 #endif
0187 dd4hep::Position r2((xmid - 0.5 * width1 * cos(phi)), 0, 0);
0188 glog.placeVolume(cablog1, 1, dd4hep::Transform3D(rot2, r2));
0189 #ifdef EDM_ML_DEBUG
0190 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << cablog1.name() << " number 1 positioned in " << glog.name()
0191 << " at (" << cms::convert2mm(xmid - 0.5 * width1 * cos(phi))
0192 << ", 0, 0) with rotation: " << rot2;
0193 #endif
0194 dd4hep::Rotation3D rot3 = cms::makeRotation3D((90._deg - phi), 0, 90._deg, 90._deg, -phi, 0);
0195 #ifdef EDM_ML_DEBUG
0196 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: Creating a rotation \t" << (90 - convertRadToDeg(phi))
0197 << ", 0, 90, 90, " << convertRadToDeg(-phi) << ", 0";
0198 #endif
0199 dd4hep::Position r3(-(xmid - 0.5 * width1 * cos(phi)), 0, 0);
0200 glog.placeVolume(cablog1, 2, dd4hep::Transform3D(rot3, r3));
0201 #ifdef EDM_ML_DEBUG
0202 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << cablog1.name() << " number 2 positioned in " << glog.name()
0203 << " at (" << cms::convert2mm(xmid - 0.5 * width1 * cos(phi))
0204 << ", 0, 0) with rotation: " << rot3;
0205 #endif
0206
0207 name = idName + "Cable2";
0208 solid = dd4hep::Box(ns.prepend(name), 0.5 * width2, 0.5 * thick, 0.5 * length2);
0209 dd4hep::Volume cablog2(solid.name(), solid, absmatter);
0210 #ifdef EDM_ML_DEBUG
0211 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << solid.name() << " Box made of " << absMat << " of dimension "
0212 << cms::convert2mm(0.5 * width2) << ", " << cms::convert2mm(0.5 * thick) << ", "
0213 << cms::convert2mm(0.5 * length2);
0214 #endif
0215
0216 glog.placeVolume(cablog2, 1, dd4hep::Position(0.5 * (width2 + gap2), 0, 0));
0217 #ifdef EDM_ML_DEBUG
0218 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << cablog2.name() << " number 1 positioned in " << glog.name()
0219 << " at (" << cms::convert2mm(0.5 * (width2 + gap2)) << ", 0, 0) with no rotation";
0220 #endif
0221 glog.placeVolume(cablog2, 2, dd4hep::Position(-0.5 * (width2 + gap2), 0, 0));
0222 #ifdef EDM_ML_DEBUG
0223 edm::LogVerbatim("HCalGeom") << "DDHCalTBCableAlgo: " << cablog2.name() << " number 2 positioned in " << glog.name()
0224 << " at " << cms::convert2mm(-0.5 * (width2 + gap2)) << ", 0, 0) with no rotation";
0225
0226 edm::LogVerbatim("HCalGeom") << "<<== End of DDHCalTBCableAlgo construction";
0227 #endif
0228
0229 return cms::s_executed;
0230 }
0231
0232
0233 DECLARE_DDCMS_DETELEMENT(DDCMS_hcal_DDHCalTBCableAlgo, algorithm);