1 #include "DD4hep/DetFactoryHelper.h" 17 LogDebug(
"PixelGeom") <<
"+++ Parsing arguments for Algorithm:" << args.
name 18 <<
" rParent:" << parentName;
19 string genMat = args.
value<
string>(
"GeneralMaterial");
20 int number = args.
value<
int>(
"Ladders");
21 double layerDz = args.
value<
double>(
"LayerDz");
22 double sensorEdge= args.
value<
double>(
"SensorEdge");
23 double coolDz = args.
value<
double>(
"CoolDz");
24 double coolWidth = args.
value<
double>(
"CoolWidth");
25 double coolSide = args.
value<
double>(
"CoolSide");
26 double coolThick = args.
value<
double>(
"CoolThick");
27 double coolDist = args.
value<
double>(
"CoolDist");
28 string coolMat = args.
value<
string>(
"CoolMaterial");
29 string tubeMat = args.
value<
string>(
"CoolTubeMaterial");
30 LogDebug(
"PixelGeom") <<
"Parent " << parentName <<
" NameSpace " << ns.
name() <<
"\n" 31 <<
"\tLadders " << number <<
"\tGeneral Material " 32 << genMat <<
"\tLength " << layerDz <<
"\tSensorEdge " 33 << sensorEdge <<
"\tSpecification of Cooling Pieces:\n" 34 <<
"\tLength " << coolDz <<
" Width " << coolWidth
35 <<
" Side " << coolSide <<
" Thickness of Shell " 36 << coolThick <<
" Radial distance " << coolDist
37 <<
" Materials " << coolMat <<
", " << tubeMat;
38 vector<string>
ladder = args.
value<vector<string> >(
"LadderName");
39 vector<double> ladderWidth = args.
value<vector<double> >(
"LadderWidth");
40 vector<double> ladderThick = args.
value<vector<double> >(
"LadderThick");
41 LogDebug(
"PixelGeom") <<
"Full Ladder " << ladder[0] <<
" width/thickness " << ladderWidth[0]
42 <<
", " << ladderThick[0] <<
"\tHalf Ladder " 43 << ladder[1] <<
" width/thickness " << ladderWidth[1]
44 <<
", " << ladderThick[1];
47 double dphi = 2_pi/number;
48 double d2 = 0.5*coolWidth;
49 double d1 = d2 - coolSide*
sin(0.5*dphi);
50 double x1 = (d1+d2)/(2.*
sin(0.5*dphi));
51 double x2 = coolDist*
sin(0.5*dphi);
52 double rmin = (coolDist-0.5*(d1+d2))*
cos(0.5*dphi)-0.5*ladderThick[0];
53 double rmax = (coolDist+0.5*(d1+d2))*
cos(0.5*dphi)+0.5*ladderThick[0];
54 double rmxh = rmax - 0.5*ladderThick[0] + ladderThick[1];
55 LogDebug(
"PixelGeom") <<
"Rmin/Rmax " << rmin
56 <<
", " << rmax <<
" d1/d2 " << d1 <<
", " << d2
57 <<
" x1/x2 " << x1 <<
", " <<
x2;
59 double rtmi = rmin + 0.5*ladderThick[0] - ladderThick[1];
60 double rtmx =
sqrt(rmxh*rmxh+ladderWidth[1]*ladderWidth[1]);
61 Solid solid = ns.
addSolid(idName,Tube(rtmi, rtmx, 0.5*layerDz, 0, 2_pi));
62 LogDebug(
"PixelGeom") <<
"IDname "<< idName <<
" Tubs made of " 64 <<
" with Rin " << rtmi <<
" Rout " << rtmx
65 <<
" ZHalf " << 0.5*layerDz;
68 double rr = 0.5*(rmax+rmin);
69 double dr = 0.5*(rmax-rmin);
70 double h1 = 0.5*coolSide*
cos(0.5*dphi);
72 solid = ns.
addSolid(name,Trap(0.5*coolDz, 0, 0, h1, d2, d1, 0, h1, d2, d1, 0));
73 LogDebug(
"PixelGeom") <<
"Solid " << solid.name()
74 <<
" Trap made of " << tubeMat <<
" of dimensions " 75 << 0.5*coolDz <<
", 0, 0, " << h1 <<
", " << d2
76 <<
", " << d1 <<
", 0, " << h1 <<
", " << d2 <<
", " 83 name = idName +
"Coolant";
84 solid = ns.
addSolid(name, Trap(0.5*coolDz, 0, 0, h1, d2, d1, 0, h1, d2, d1, 0));
85 LogDebug(
"PixelGeom") <<
"Solid " << solid.name()
86 <<
" Trap made of " << coolMat <<
" of dimensions " 87 << 0.5*coolDz <<
", 0, 0, " << h1 <<
", " << d2
88 <<
", " << d1 <<
", 0, " << h1 <<
", " << d2 <<
", " 92 pv = coolTube.placeVolume(cool,1);
93 LogDebug(
"PixelGeom") <<
"Cool " << cool.name()
94 <<
" number 1 positioned in " << coolTube.name()
95 <<
" at (0,0,0) with no rotation";
97 string ladderFull = ladder[0];
98 string ladderHalf = ladder[1];
99 int nphi=number/2,
copy=1, iup=-1;
100 double phi0 = 90_deg;
104 for (
int i=0;
i<number;
i++) {
105 double phi = phi0 +
i*dphi;
106 double phix, phiy, rrr,
xx;
110 if (
i == 0 ||
i == nphi) {
111 rrr = rr + dr + 0.5*(ladderThick[1]-ladderThick[0]);
112 xx = (0.5*ladderWidth[1] - sensorEdge) *
sin(phi);
113 tran = Position(xx, rrr*
sin(phi), 0);
114 rots = idName + std::to_string(
copy);
117 LogDebug(
"PixelGeom") <<
"Creating a new " 118 <<
"rotation: " << rots <<
"\t90., " 124 pv = layer.placeVolume(ladderHalfVol,
copy, Transform3D(rot,tran));
125 if ( !pv.isValid() ) { }
126 LogDebug(
"PixelGeom") <<
"ladderHalfVol: " << ladderHalfVol.name()
127 <<
" number " <<
copy <<
" positioned in " 128 << layer.name() <<
" at " << tran <<
" with " 132 rrr = rr - dr - 0.5*(ladderThick[1]-ladderThick[0]);
133 tran = Position(-xx, rrr*
sin(phi), 0);
134 rots = idName + std::to_string(
copy);
137 LogDebug(
"PixelGeom") <<
"Creating a new rotation: " << rots <<
"\t90., " 142 pv = layer.placeVolume(ladderHalfVol,
copy, Transform3D(rot,tran));
143 if ( !pv.isValid() ) { }
144 LogDebug(
"PixelGeom") <<
"ladderHalfVol: " << ladderHalfVol.name()
145 <<
" number " <<
copy <<
" positioned in " 146 << layer.name() <<
" at " << tran <<
" with " 152 tran = Position(rrr*
cos(phi), rrr*
sin(phi), 0);
153 rots = idName + std::to_string(
copy);
154 if (iup > 0) phix = phi-90_deg;
155 else phix = phi+90_deg;
157 LogDebug(
"PixelGeom") <<
"DDPixBarLayerAlgo test: Creating a new " 158 <<
"rotation: " << rots <<
"\t90., " 164 pv = layer.placeVolume(ladderFullVol,
copy, Transform3D(rot,tran));
165 if ( !pv.isValid() ) { }
166 LogDebug(
"PixelGeom") <<
"test: " << ladderFullVol.name()
167 <<
" number " <<
copy <<
" positioned in " 168 << layer.name() <<
" at " << tran <<
" with " 172 rrr = coolDist*
cos(0.5*dphi);
173 tran = Position(rrr*
cos(phi)-x2*
sin(phi), rrr*
sin(phi)+x2*
cos(phi), 0);
174 rots = idName + std::to_string(
i+100);
176 if (iup > 0) phix += 180_deg;
178 LogDebug(
"PixelGeom") <<
"Creating a new rotation: " << rots <<
"\t90., " 183 pv = layer.placeVolume(coolTube,
i+1, Transform3D(rot,tran));
184 if ( !pv.isValid() ) { }
185 LogDebug(
"PixelGeom") <<
"coolTube: " << coolTube.name()
186 <<
" number " <<
i+1 <<
" positioned in " 187 << layer.name() <<
" at " << tran <<
" with "<<
rot;
189 LogDebug(
"PixelGeom") <<
"Layer: " << layer.name();
dd4hep::Volume volume(const std::string &name, bool exc=true) const
Sin< T >::type sin(const T &t)
T value(const std::string &name) const
constexpr NumType convertRadToDeg(NumType radians)
static long algorithm(Detector &description, cms::DDParsingContext &ctxt, xml_h e, SensitiveDetector &)
dd4hep::Volume addVolume(dd4hep::Volume vol) const
Add rotation matrix to current namespace.
dd4hep::Rotation3D makeRotation3D(double thetaX, double phiX, double thetaY, double phiY, double thetaZ, double phiZ)
std::string_view name() const
dd4hep::PlacedVolume PlacedVolume
static std::string objName(const std::string &)
Cos< T >::type cos(const T &t)
dd4hep::Material material(const std::string &name) const
Namespace of DDCMS conversion namespace.
dd4hep::Solid addSolid(const std::string &name, dd4hep::Solid solid) const
#define DECLARE_DDCMS_DETELEMENT(name, func)
std::string parentName() const
Access value of rParent child node.