CMS 3D CMS Logo

DDPixBarLayerAlgo.cc
Go to the documentation of this file.
1 #include "DD4hep/DetFactoryHelper.h"
5 
6 using namespace std;
7 using namespace dd4hep;
8 using namespace cms;
9 using namespace cms_units::operators;
10 
11 static long algorithm(Detector& description, cms::DDParsingContext& ctxt, xml_h e, SensitiveDetector& /* sens */) {
13  cms::DDNamespace ns(ctxt, e, true);
14  DDAlgoArguments args(ctxt, e);
15  string parentName = args.parentName();
16 
17  LogDebug("PixelGeom") << "+++ Parsing arguments for Algorithm:" << args.name << " rParent:" << parentName;
18  string genMat = args.value<string>("GeneralMaterial");
19  int number = args.value<int>("Ladders");
20  double layerDz = args.value<double>("LayerDz");
21  double sensorEdge = args.value<double>("SensorEdge");
22  double coolDz = args.value<double>("CoolDz");
23  double coolWidth = args.value<double>("CoolWidth");
24  double coolSide = args.value<double>("CoolSide");
25  double coolThick = args.value<double>("CoolThick");
26  double coolDist = args.value<double>("CoolDist");
27  string coolMat = args.value<string>("CoolMaterial");
28  string tubeMat = args.value<string>("CoolTubeMaterial");
29  LogDebug("PixelGeom") << "Parent " << parentName << " NameSpace " << ns.name() << "\n"
30  << "\tLadders " << number << "\tGeneral Material " << genMat << "\tLength " << layerDz
31  << "\tSensorEdge " << sensorEdge << "\tSpecification of Cooling Pieces:\n"
32  << "\tLength " << coolDz << " Width " << coolWidth << " Side " << coolSide
33  << " Thickness of Shell " << coolThick << " Radial distance " << coolDist << " Materials "
34  << coolMat << ", " << tubeMat;
35  vector<string> ladder = args.value<vector<string> >("LadderName");
36  vector<double> ladderWidth = args.value<vector<double> >("LadderWidth");
37  vector<double> ladderThick = args.value<vector<double> >("LadderThick");
38  LogDebug("PixelGeom") << "Full Ladder " << ladder[0] << " width/thickness " << ladderWidth[0] << ", "
39  << ladderThick[0] << "\tHalf Ladder " << ladder[1] << " width/thickness " << ladderWidth[1]
40  << ", " << ladderThick[1];
41 
42  const std::string idName = ns.objName(parentName);
43  double dphi = 2_pi / number;
44  double d2 = 0.5 * coolWidth;
45  double d1 = d2 - coolSide * sin(0.5 * dphi);
46  double x1 = (d1 + d2) / (2. * sin(0.5 * dphi));
47  double x2 = coolDist * sin(0.5 * dphi);
48  double rmin = (coolDist - 0.5 * (d1 + d2)) * cos(0.5 * dphi) - 0.5 * ladderThick[0];
49  double rmax = (coolDist + 0.5 * (d1 + d2)) * cos(0.5 * dphi) + 0.5 * ladderThick[0];
50  double rmxh = rmax - 0.5 * ladderThick[0] + ladderThick[1];
51  LogDebug("PixelGeom") << "Rmin/Rmax " << rmin << ", " << rmax << " d1/d2 " << d1 << ", " << d2 << " x1/x2 " << x1
52  << ", " << x2;
53 
54  double rtmi = rmin + 0.5 * ladderThick[0] - ladderThick[1];
55  double rtmx = sqrt(rmxh * rmxh + ladderWidth[1] * ladderWidth[1]);
56  Solid solid = ns.addSolid(idName, Tube(rtmi, rtmx, 0.5 * layerDz, 0, 2_pi));
57  LogDebug("PixelGeom") << "IDname " << idName << " Tubs made of " << genMat << " from 0 to " << convertRadToDeg(2_pi)
58  << " with Rin " << rtmi << " Rout " << rtmx << " ZHalf " << 0.5 * layerDz;
59 
60  Volume layer = ns.addVolume(Volume(idName, solid, ns.material(genMat)));
61  double rr = 0.5 * (rmax + rmin);
62  double dr = 0.5 * (rmax - rmin);
63  double h1 = 0.5 * coolSide * cos(0.5 * dphi);
64  std::string name = idName + "CoolTube";
65  solid = ns.addSolid(name, Trap(0.5 * coolDz, 0, 0, h1, d2, d1, 0, h1, d2, d1, 0));
66  LogDebug("PixelGeom") << "Solid " << solid.name() << " Trap made of " << tubeMat << " of dimensions " << 0.5 * coolDz
67  << ", 0, 0, " << h1 << ", " << d2 << ", " << d1 << ", 0, " << h1 << ", " << d2 << ", " << d1
68  << ", 0";
69 
70  Volume coolTube = ns.addVolume(Volume(name, solid, description.material(tubeMat)));
71  h1 -= coolThick;
72  d1 -= coolThick;
73  d2 -= coolThick;
74  name = idName + "Coolant";
75  solid = ns.addSolid(name, Trap(0.5 * coolDz, 0, 0, h1, d2, d1, 0, h1, d2, d1, 0));
76  LogDebug("PixelGeom") << "Solid " << solid.name() << " Trap made of " << coolMat << " of dimensions " << 0.5 * coolDz
77  << ", 0, 0, " << h1 << ", " << d2 << ", " << d1 << ", 0, " << h1 << ", " << d2 << ", " << d1
78  << ", 0";
79 
80  Volume cool = ns.addVolume(Volume(name, solid, description.material(coolMat)));
81  pv = coolTube.placeVolume(cool, 1);
82  LogDebug("PixelGeom") << "Cool " << cool.name() << " number 1 positioned in " << coolTube.name()
83  << " at (0,0,0) with no rotation";
84 
85  string ladderFull = ladder[0];
86  string ladderHalf = ladder[1];
87  int nphi = number / 2, copy = 1, iup = -1;
88  double phi0 = 90_deg;
89  Volume ladderHalfVol = ns.volume(ladderHalf);
90  Volume ladderFullVol = ns.volume(ladderFull);
91 
92  for (int i = 0; i < number; i++) {
93  double phi = phi0 + i * dphi;
94  double phix, phiy, rrr, xx;
95  std::string rots;
96  Position tran;
97  Rotation3D rot;
98  if (i == 0 || i == nphi) {
99  rrr = rr + dr + 0.5 * (ladderThick[1] - ladderThick[0]);
100  xx = (0.5 * ladderWidth[1] - sensorEdge) * sin(phi);
101  tran = Position(xx, rrr * sin(phi), 0);
102  rots = idName + std::to_string(copy);
103  phix = phi - 90_deg;
104  phiy = 90_deg + phix;
105  LogDebug("PixelGeom") << "Creating a new "
106  << "rotation: " << rots << "\t90., " << convertRadToDeg(phix) << ", 90.,"
107  << convertRadToDeg(phiy) << ", 0, 0";
108  rot = makeRotation3D(90_deg, phix, 90_deg, phiy, 0., 0.);
109 
110  //cpv.position(ladderHalf, layer, copy, tran, rot);
111  pv = layer.placeVolume(ladderHalfVol, copy, Transform3D(rot, tran));
112  if (!pv.isValid()) {
113  }
114  LogDebug("PixelGeom") << "ladderHalfVol: " << ladderHalfVol.name() << " number " << copy << " positioned in "
115  << layer.name() << " at " << tran << " with " << rot;
116  copy++;
117  iup = -1;
118  rrr = rr - dr - 0.5 * (ladderThick[1] - ladderThick[0]);
119  tran = Position(-xx, rrr * sin(phi), 0);
120  rots = idName + std::to_string(copy);
121  phix = phi + 90_deg;
122  phiy = 90_deg + phix;
123  LogDebug("PixelGeom") << "Creating a new rotation: " << rots << "\t90., " << convertRadToDeg(phix) << ", 90.,"
124  << convertRadToDeg(phiy) << ", 0, 0";
125  rot = makeRotation3D(90_deg, phix, 90_deg, phiy, 0., 0.);
126  //cpv.position(ladderHalf, layer, copy, tran, rot);
127  pv = layer.placeVolume(ladderHalfVol, copy, Transform3D(rot, tran));
128  if (!pv.isValid()) {
129  }
130  LogDebug("PixelGeom") << "ladderHalfVol: " << ladderHalfVol.name() << " number " << copy << " positioned in "
131  << layer.name() << " at " << tran << " with " << rot;
132  copy++;
133  } else {
134  iup = -iup;
135  rrr = rr + iup * dr;
136  tran = Position(rrr * cos(phi), rrr * sin(phi), 0);
137  rots = idName + std::to_string(copy);
138  if (iup > 0)
139  phix = phi - 90_deg;
140  else
141  phix = phi + 90_deg;
142  phiy = phix + 90._deg;
143  LogDebug("PixelGeom") << "DDPixBarLayerAlgo test: Creating a new "
144  << "rotation: " << rots << "\t90., " << convertRadToDeg(phix) << ", 90.,"
145  << convertRadToDeg(phiy) << ", 0, 0";
146  rot = makeRotation3D(90_deg, phix, 90_deg, phiy, 0., 0.);
147 
148  //cpv.position(ladderFull, layer, copy, tran, rot);
149  pv = layer.placeVolume(ladderFullVol, copy, Transform3D(rot, tran));
150  if (!pv.isValid()) {
151  }
152  LogDebug("PixelGeom") << "test: " << ladderFullVol.name() << " number " << copy << " positioned in "
153  << layer.name() << " at " << tran << " with " << rot;
154  copy++;
155  }
156  rrr = coolDist * cos(0.5 * dphi);
157  tran = Position(rrr * cos(phi) - x2 * sin(phi), rrr * sin(phi) + x2 * cos(phi), 0);
158  rots = idName + std::to_string(i + 100);
159  phix = phi + 0.5 * dphi;
160  if (iup > 0)
161  phix += 180_deg;
162  phiy = phix + 90._deg;
163  LogDebug("PixelGeom") << "Creating a new rotation: " << rots << "\t90., " << convertRadToDeg(phix) << ", 90.,"
164  << convertRadToDeg(phiy) << ", 0, 0";
165 
166  rot = makeRotation3D(90_deg, phix, 90_deg, phiy, 0., 0.);
167  pv = layer.placeVolume(coolTube, i + 1, Transform3D(rot, tran));
168  if (!pv.isValid()) {
169  }
170  LogDebug("PixelGeom") << "coolTube: " << coolTube.name() << " number " << i + 1 << " positioned in " << layer.name()
171  << " at " << tran << " with " << rot;
172  }
173  LogDebug("PixelGeom") << "Layer: " << layer.name();
174  return 1;
175 }
176 
177 // first argument is the type from the xml file
178 DECLARE_DDCMS_DETELEMENT(DDCMS_track_DDPixBarLayerAlgo, algorithm)
#define LogDebug(id)
dd4hep::Volume volume(const std::string &name, bool exc=true) const
Definition: DDNamespace.cc:184
constexpr NumType convertRadToDeg(NumType radians)
Definition: angle_units.h:21
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
T value(const std::string &name) const
dd4hep::Volume addVolume(dd4hep::Volume vol) const
Add rotation matrix to current namespace.
Definition: DDNamespace.cc:167
dd4hep::Rotation3D makeRotation3D(double thetaX, double phiX, double thetaY, double phiY, double thetaZ, double phiZ)
std::string_view name() const
Definition: DDNamespace.h:68
T sqrt(T t)
Definition: SSEVec.h:19
dd4hep::PlacedVolume PlacedVolume
static std::string objName(const std::string &)
Definition: DDNamespace.cc:96
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
def pv(vc)
Definition: MetAnalyzer.py:7
dd4hep::Material material(const std::string &name) const
Definition: DDNamespace.cc:121
dd4hep::Volume Volume
static long algorithm(Detector &description, cms::DDParsingContext &ctxt, xml_h e, SensitiveDetector &)
Namespace of DDCMS conversion namespace.
dd4hep::Solid addSolid(const std::string &name, dd4hep::Solid solid) const
Definition: DDNamespace.cc:215
#define DECLARE_DDCMS_DETELEMENT(name, func)
Definition: DDPlugins.h:30
std::string parentName() const
Access value of rParent child node.