File indexing completed on 2024-04-06 12:15:21
0001 #include "DD4hep/DetFactoryHelper.h"
0002 #include "DataFormats/Math/interface/CMSUnits.h"
0003 #include "DetectorDescription/DDCMS/interface/DDPlugins.h"
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005
0006 using namespace std;
0007 using namespace dd4hep;
0008 using namespace cms;
0009 using namespace cms_units::operators;
0010
0011 static long algorithm(Detector& description, cms::DDParsingContext& ctxt, xml_h e) {
0012 PlacedVolume pv;
0013 cms::DDNamespace ns(ctxt, e, true);
0014 DDAlgoArguments args(ctxt, e);
0015 string parentName = args.parentName();
0016
0017 edm::LogVerbatim("PixelGeom") << "+++ Parsing arguments for Algorithm:" << args.name << " rParent:" << parentName;
0018 string genMat = args.value<string>("GeneralMaterial");
0019 int number = args.value<int>("Ladders");
0020 double layerDz = args.value<double>("LayerDz");
0021 double sensorEdge = args.value<double>("SensorEdge");
0022 double coolDz = args.value<double>("CoolDz");
0023 double coolWidth = args.value<double>("CoolWidth");
0024 double coolSide = args.value<double>("CoolSide");
0025 double coolThick = args.value<double>("CoolThick");
0026 double coolDist = args.value<double>("CoolDist");
0027 string coolMat = args.value<string>("CoolMaterial");
0028 string tubeMat = args.value<string>("CoolTubeMaterial");
0029 edm::LogVerbatim("PixelGeom") << "Parent " << parentName << " NameSpace " << ns.name() << "\n"
0030 << "\tLadders " << number << "\tGeneral Material " << genMat << "\tLength " << layerDz
0031 << "\tSensorEdge " << sensorEdge << "\tSpecification of Cooling Pieces:\n"
0032 << "\tLength " << coolDz << " Width " << coolWidth << " Side " << coolSide
0033 << " Thickness of Shell " << coolThick << " Radial distance " << coolDist
0034 << " Materials " << coolMat << ", " << tubeMat;
0035 vector<string> ladder = args.value<vector<string> >("LadderName");
0036 vector<double> ladderWidth = args.value<vector<double> >("LadderWidth");
0037 vector<double> ladderThick = args.value<vector<double> >("LadderThick");
0038 edm::LogVerbatim("PixelGeom") << "Full Ladder " << ladder[0] << " width/thickness " << ladderWidth[0] << ", "
0039 << ladderThick[0] << "\tHalf Ladder " << ladder[1] << " width/thickness "
0040 << ladderWidth[1] << ", " << ladderThick[1];
0041
0042 const std::string idName = ns.objName(parentName);
0043 double dphi = 2_pi / number;
0044 double d2 = 0.5 * coolWidth;
0045 double d1 = d2 - coolSide * sin(0.5 * dphi);
0046 double x1 = (d1 + d2) / (2. * sin(0.5 * dphi));
0047 double x2 = coolDist * sin(0.5 * dphi);
0048 double rmin = (coolDist - 0.5 * (d1 + d2)) * cos(0.5 * dphi) - 0.5 * ladderThick[0];
0049 double rmax = (coolDist + 0.5 * (d1 + d2)) * cos(0.5 * dphi) + 0.5 * ladderThick[0];
0050 double rmxh = rmax - 0.5 * ladderThick[0] + ladderThick[1];
0051 edm::LogVerbatim("PixelGeom") << "Rmin/Rmax " << rmin << ", " << rmax << " d1/d2 " << d1 << ", " << d2 << " x1/x2 "
0052 << x1 << ", " << x2;
0053
0054 double rtmi = rmin + 0.5 * ladderThick[0] - ladderThick[1];
0055 double rtmx = sqrt(rmxh * rmxh + ladderWidth[1] * ladderWidth[1]);
0056 Solid solid = ns.addSolid(ns.prepend(idName), Tube(rtmi, rtmx, 0.5 * layerDz, 0, 2_pi));
0057 edm::LogVerbatim("PixelGeom") << "IDname " << solid.name() << " Tubs made of " << genMat << " from 0 to "
0058 << convertRadToDeg(2_pi) << " with Rin " << rtmi << " Rout " << rtmx << " ZHalf "
0059 << 0.5 * layerDz;
0060
0061 Volume layer = ns.addVolume(Volume(solid.name(), solid, ns.material(genMat)));
0062 double rr = 0.5 * (rmax + rmin);
0063 double dr = 0.5 * (rmax - rmin);
0064 double h1 = 0.5 * coolSide * cos(0.5 * dphi);
0065 std::string name = idName + "CoolTube";
0066 solid = ns.addSolid(ns.prepend(name), Trap(0.5 * coolDz, 0, 0, h1, d2, d1, 0, h1, d2, d1, 0));
0067 edm::LogVerbatim("PixelGeom") << "Solid " << solid.name() << " Trap made of " << tubeMat << " of dimensions "
0068 << 0.5 * coolDz << ", 0, 0, " << h1 << ", " << d2 << ", " << d1 << ", 0, " << h1 << ", "
0069 << d2 << ", " << d1 << ", 0";
0070
0071 Volume coolTube = ns.addVolume(Volume(solid.name(), solid, description.material(tubeMat)));
0072 h1 -= coolThick;
0073 d1 -= coolThick;
0074 d2 -= coolThick;
0075 name = idName + "Coolant";
0076 solid = ns.addSolid(ns.prepend(name), Trap(0.5 * coolDz, 0, 0, h1, d2, d1, 0, h1, d2, d1, 0));
0077 edm::LogVerbatim("PixelGeom") << "Solid " << solid.name() << " Trap made of " << coolMat << " of dimensions "
0078 << 0.5 * coolDz << ", 0, 0, " << h1 << ", " << d2 << ", " << d1 << ", 0, " << h1 << ", "
0079 << d2 << ", " << d1 << ", 0";
0080
0081 Volume cool = ns.addVolume(Volume(solid.name(), solid, description.material(coolMat)));
0082 pv = coolTube.placeVolume(cool, 1);
0083 edm::LogVerbatim("PixelGeom") << "Cool " << cool.name() << " number 1 positioned in " << coolTube.name()
0084 << " at (0,0,0) with no rotation";
0085
0086 string ladderFull = ladder[0];
0087 string ladderHalf = ladder[1];
0088 int nphi = number / 2, copy = 1, iup = -1;
0089 double phi0 = 90_deg;
0090 Volume ladderHalfVol = ns.volume(ladderHalf);
0091 Volume ladderFullVol = ns.volume(ladderFull);
0092
0093 for (int i = 0; i < number; i++) {
0094 double phi = phi0 + i * dphi;
0095 double phix, phiy, rrr, xx;
0096 std::string rots;
0097 Position tran;
0098 Rotation3D rot;
0099 if (i == 0 || i == nphi) {
0100 rrr = rr + dr + 0.5 * (ladderThick[1] - ladderThick[0]);
0101 xx = (0.5 * ladderWidth[1] - sensorEdge) * sin(phi);
0102 tran = Position(xx, rrr * sin(phi), 0);
0103 rots = idName + std::to_string(copy);
0104 phix = phi - 90_deg;
0105 phiy = 90_deg + phix;
0106 edm::LogVerbatim("PixelGeom") << "Creating a new "
0107 << "rotation: " << rots << "\t90., " << convertRadToDeg(phix) << ", 90.,"
0108 << convertRadToDeg(phiy) << ", 0, 0";
0109 rot = makeRotation3D(90_deg, phix, 90_deg, phiy, 0., 0.);
0110
0111
0112 pv = layer.placeVolume(ladderHalfVol, copy, Transform3D(rot, tran));
0113 if (!pv.isValid()) {
0114 }
0115 edm::LogVerbatim("PixelGeom") << "ladderHalfVol: " << ladderHalfVol.name() << " number " << copy
0116 << " positioned in " << layer.name() << " at " << tran << " with " << rot;
0117 copy++;
0118 iup = -1;
0119 rrr = rr - dr - 0.5 * (ladderThick[1] - ladderThick[0]);
0120 tran = Position(-xx, rrr * sin(phi), 0);
0121 rots = idName + std::to_string(copy);
0122 phix = phi + 90_deg;
0123 phiy = 90_deg + phix;
0124 edm::LogVerbatim("PixelGeom") << "Creating a new rotation: " << rots << "\t90., " << convertRadToDeg(phix)
0125 << ", 90.," << convertRadToDeg(phiy) << ", 0, 0";
0126 rot = makeRotation3D(90_deg, phix, 90_deg, phiy, 0., 0.);
0127
0128 pv = layer.placeVolume(ladderHalfVol, copy, Transform3D(rot, tran));
0129 if (!pv.isValid()) {
0130 }
0131 edm::LogVerbatim("PixelGeom") << "ladderHalfVol: " << ladderHalfVol.name() << " number " << copy
0132 << " positioned in " << layer.name() << " at " << tran << " with " << rot;
0133 copy++;
0134 } else {
0135 iup = -iup;
0136 rrr = rr + iup * dr;
0137 tran = Position(rrr * cos(phi), rrr * sin(phi), 0);
0138 rots = idName + std::to_string(copy);
0139 if (iup > 0)
0140 phix = phi - 90_deg;
0141 else
0142 phix = phi + 90_deg;
0143 phiy = phix + 90._deg;
0144 edm::LogVerbatim("PixelGeom") << "DDPixBarLayerAlgo test: Creating a new "
0145 << "rotation: " << rots << "\t90., " << convertRadToDeg(phix) << ", 90.,"
0146 << convertRadToDeg(phiy) << ", 0, 0";
0147 rot = makeRotation3D(90_deg, phix, 90_deg, phiy, 0., 0.);
0148
0149
0150 pv = layer.placeVolume(ladderFullVol, copy, Transform3D(rot, tran));
0151 if (!pv.isValid()) {
0152 }
0153 edm::LogVerbatim("PixelGeom") << "test: " << ladderFullVol.name() << " number " << copy << " positioned in "
0154 << layer.name() << " at " << tran << " with " << rot;
0155 copy++;
0156 }
0157 rrr = coolDist * cos(0.5 * dphi);
0158 tran = Position(rrr * cos(phi) - x2 * sin(phi), rrr * sin(phi) + x2 * cos(phi), 0);
0159 rots = idName + std::to_string(i + 100);
0160 phix = phi + 0.5 * dphi;
0161 if (iup > 0)
0162 phix += 180_deg;
0163 phiy = phix + 90._deg;
0164 edm::LogVerbatim("PixelGeom") << "Creating a new rotation: " << rots << "\t90., " << convertRadToDeg(phix)
0165 << ", 90.," << convertRadToDeg(phiy) << ", 0, 0";
0166
0167 rot = makeRotation3D(90_deg, phix, 90_deg, phiy, 0., 0.);
0168 pv = layer.placeVolume(coolTube, i + 1, Transform3D(rot, tran));
0169 if (!pv.isValid()) {
0170 }
0171 edm::LogVerbatim("PixelGeom") << "coolTube: " << coolTube.name() << " number " << i + 1 << " positioned in "
0172 << layer.name() << " at " << tran << " with " << rot;
0173 }
0174 edm::LogVerbatim("PixelGeom") << "Layer: " << layer.name();
0175 return 1;
0176 }
0177
0178
0179 DECLARE_DDCMS_DETELEMENT(DDCMS_track_DDPixBarLayerAlgo, algorithm)