CMS 3D CMS Logo

DDHCalEndcapModuleAlgo.cc
Go to the documentation of this file.
1 // File: DDHCalEndcapModuleAlgo.cc
3 // adapted from CCal(G4)HcalEndcap.cc
4 // Description: Geometry factory class for Hcal Endcap
6 
7 #include <cmath>
8 #include <algorithm>
9 #include <string>
10 #include <vector>
11 
14 #include "DD4hep/DetFactoryHelper.h"
17 
18 //#define EDM_ML_DEBUG
19 using namespace geant_units::operators;
20 
22  std::string genMaterial; //General material
23  std::string absorberMat; //Absorber material
24  std::string plasticMat; //Plastic material cover
25  std::string scintMat; //Scintillator material
26  std::string rotstr; //Rotation matrix to place in mother
27  int sectors; //Number of potenital straight edges
28  double zMinBlock; //Minimum z extent of the block
29  double zMaxBlock; //Maximum
30  double z1Beam; //Position of gap end along z-axis
31  double ziDip; //Starting Z of dipped part of body
32  double dzStep; //Width in Z of a layer
33  double moduleThick; //Thickness of a layer (air/absorber)
34  double layerThick; //Thickness of a layer (plastic)
35  double scintThick; //Thickness of scinitllator
36  double rMaxBack; //Maximum R after the dip
37  double rMaxFront; //Maximum R before the dip
38  double slopeBot; //Slope of the bottom edge
39  double slopeTop; //Slope of the top edge
40  double slopeTopF; //Slope of the top front edge
41  double trimLeft; //Trim of the left edge
42  double trimRight; //Trim of the right edge
43  double tolAbs; //Tolerance for absorber
44  int modType; //Type of module
45  int modNumber; //Module number
46  int layerType; //Layer type
47  std::vector<int> layerNumber; //layer numbers
48  std::vector<std::string> phiName; //Name of Phi sections
49  std::vector<std::string> layerName; //Layer Names
50 
51  std::string idName; //Name of the "parent" volume.
52  std::string modName; //Module Name
53  int idOffset; // Geant4 ID's... = 4000;
54 
55  struct HcalEndcapPar {
56  double yh1, bl1, tl1, yh2, bl2, tl2, alp, theta, phi, xpos, ypos, zpos;
57  HcalEndcapPar(double yh1v = 0,
58  double bl1v = 0,
59  double tl1v = 0,
60  double yh2v = 0,
61  double bl2v = 0,
62  double tl2v = 0,
63  double alpv = 0,
64  double thv = 0,
65  double fiv = 0,
66  double x = 0,
67  double y = 0,
68  double z = 0)
69  : yh1(yh1v),
70  bl1(bl1v),
71  tl1(tl1v),
72  yh2(yh2v),
73  bl2(bl2v),
74  tl2(tl2v),
75  alp(alpv),
76  theta(thv),
77  phi(fiv),
78  xpos(x),
79  ypos(y),
80  zpos(z) {}
81  };
82 
83  HCalEndcapModuleAlgo() = delete;
84 
86  cms::DDNamespace ns(ctxt, e, true);
88 
89  genMaterial = args.value<std::string>("MaterialName");
90  absorberMat = args.value<std::string>("AbsorberMat");
91  plasticMat = args.value<std::string>("PlasticMat");
92  scintMat = args.value<std::string>("ScintMat");
93  rotstr = args.value<std::string>("Rotation");
94  sectors = args.value<int>("Sectors");
95 #ifdef EDM_ML_DEBUG
96  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: General material " << genMaterial << "\tAbsorber "
97  << absorberMat << "\tPlastic " << plasticMat << "\tScintillator " << scintMat
98  << "\tRotation " << rotstr << "\tSectors " << sectors;
99 #endif
100  zMinBlock = args.value<double>("ZMinBlock");
101  zMaxBlock = args.value<double>("ZMaxBlock");
102  z1Beam = args.value<double>("Z1Beam");
103  ziDip = args.value<double>("ZiDip");
104  dzStep = args.value<double>("DzStep");
105  moduleThick = args.value<double>("ModuleThick");
106  layerThick = args.value<double>("LayerThick");
107  scintThick = args.value<double>("ScintThick");
108 #ifdef EDM_ML_DEBUG
109  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: Zmin " << convertCmToMm(zMinBlock) << "\tZmax "
110  << convertCmToMm(zMaxBlock) << "\tZ1Beam " << convertCmToMm(z1Beam) << "\tZiDip "
111  << convertCmToMm(ziDip) << "\tDzStep " << convertCmToMm(dzStep) << "\tModuleThick "
112  << convertCmToMm(moduleThick) << "\tLayerThick " << convertCmToMm(layerThick)
113  << "\tScintThick " << convertCmToMm(scintThick);
114 #endif
115  rMaxFront = args.value<double>("RMaxFront");
116  rMaxBack = args.value<double>("RMaxBack");
117  trimLeft = args.value<double>("TrimLeft");
118  trimRight = args.value<double>("TrimRight");
119  tolAbs = args.value<double>("TolAbs");
120 #ifdef EDM_ML_DEBUG
121  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: RMaxFront " << convertCmToMm(rMaxFront) << "\tRmaxBack "
122  << convertCmToMm(rMaxBack) << "\tTrims " << convertCmToMm(trimLeft) << ":"
123  << convertCmToMm(trimRight) << "\tTolAbs " << convertCmToMm(tolAbs);
124 #endif
125  slopeBot = args.value<double>("SlopeBottom");
126  slopeTop = args.value<double>("SlopeTop");
127  slopeTopF = args.value<double>("SlopeTopFront");
128  modType = args.value<int>("ModType");
129  modNumber = args.value<int>("ModNumber");
130  layerType = args.value<int>("LayerType");
131 #ifdef EDM_ML_DEBUG
132  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: slopeBot " << slopeBot << "\tslopeTop " << slopeTop
133  << "\tslopeTopF " << slopeTopF << "\tmodType " << modType << "\tmodNumber "
134  << modNumber << "\tlayerType " << layerType;
135 #endif
136  layerNumber = args.value<std::vector<int> >("LayerNumber");
137 #ifdef EDM_ML_DEBUG
138  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << layerNumber.size() << " layer Numbers";
139  for (unsigned int i = 0; i < layerNumber.size(); ++i)
140  edm::LogVerbatim("HCalGeom") << "LayerNumber[" << i << "] = " << layerNumber[i];
141 #endif
142  phiName = args.value<std::vector<std::string> >("PhiName");
143 #ifdef EDM_ML_DEBUG
144  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << phiName.size() << " phi sectors";
145  for (unsigned int i = 0; i < phiName.size(); ++i)
146  edm::LogVerbatim("HCalGeom") << "PhiName[" << i << "] = " << phiName[i];
147 #endif
148  layerName = args.value<std::vector<std::string> >("LayerName");
149 #ifdef EDM_ML_DEBUG
150  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << layerName.size() << " layers";
151  for (unsigned int i = 0; i < layerName.size(); ++i)
152  edm::LogVerbatim("HCalGeom") << "LayerName[" << i << "] = " << layerName[i];
153 #endif
154  idName = args.value<std::string>("MotherName");
155  idOffset = args.value<int>("IdOffset");
156  modName = args.value<std::string>("ModName");
157 #ifdef EDM_ML_DEBUG
158  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: Parent " << args.parentName() << " " << modName
159  << " idName " << idName << " NameSpace " << ns.name() << " Offset " << idOffset;
160 #endif
161 
162 #ifdef EDM_ML_DEBUG
163  edm::LogVerbatim("HCalGeom") << "==>> Constructing DDHCalEndcapModuleAlgo...";
164 #endif
165 
166  dd4hep::Volume mother = ns.volume(args.parentName());
167  if (modType == 0)
168  constructInsideModule0(ctxt, e, mother);
169  else
170  constructInsideModule(ctxt, e, mother);
171 #ifdef EDM_ML_DEBUG
172  edm::LogVerbatim("HCalGeom") << "<<== End of DDHCalEndcapModuleAlgo construction ...";
173 #endif
174  }
175 
177  cms::DDNamespace ns(ctxt, e, true);
178 
179 #ifdef EDM_ML_DEBUG
180  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: \t\tInside module0";
181 #endif
182  //Pointers to the Materials
184  dd4hep::Material matabsorbr = ns.material(absorberMat);
185  dd4hep::Material matplastic = ns.material(plasticMat);
186  dd4hep::Rotation3D rot = getRotation(rotstr, ns);
187 
188  int layer = layerNumber[0];
189  int layer0 = layerNumber[1];
191  dd4hep::Solid solid;
192  dd4hep::Volume glog;
193  for (unsigned int iphi = 0; iphi < phiName.size(); iphi++) {
194  HCalEndcapModuleAlgo::HcalEndcapPar parm = parameterLayer0(iphi);
195  name = idName + modName + layerName[0] + phiName[iphi];
196  solid = dd4hep::Trap(ns.prepend(name),
197  0.5 * layerThick,
198  0,
199  0,
200  parm.yh1,
201  parm.bl1,
202  parm.tl1,
203  parm.alp,
204  parm.yh2,
205  parm.bl1,
206  parm.tl2,
207  parm.alp);
208 #ifdef EDM_ML_DEBUG
209  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << solid.name() << " Trap made of " << plasticMat
210  << " of dimensions " << convertCmToMm(0.5 * layerThick) << ", 0, 0, "
211  << convertCmToMm(parm.yh1) << ", " << convertCmToMm(parm.bl1) << ", "
212  << convertCmToMm(parm.tl1) << ", " << convertRadToDeg(parm.alp) << ", "
213  << convertCmToMm(parm.yh2) << ", " << convertCmToMm(parm.bl2) << ", "
214  << convertCmToMm(parm.tl2) << ", " << convertRadToDeg(parm.alp);
215 #endif
216  glog = dd4hep::Volume(solid.name(), solid, matplastic);
217 
218  dd4hep::Position r1(parm.xpos, parm.ypos, parm.zpos);
219  module.placeVolume(glog, idOffset + layer + 1, dd4hep::Transform3D(rot, r1));
220 #ifdef EDM_ML_DEBUG
221  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << glog.name() << " number " << (idOffset + layer + 1)
222  << " positioned in " << module.name() << " at (" << convertCmToMm(parm.xpos) << ", "
223  << convertCmToMm(parm.ypos) << ", " << convertCmToMm(parm.zpos)
224  << ") with rotation: " << rot;
225 #endif
226  //Now construct the layer of scintillator inside this
227  int copyNo = layer0 * 10 + layerType;
228  name = modName + layerName[0] + phiName[iphi];
229  constructScintLayer(glog, scintThick, parm, name, copyNo, ns);
230  }
231 
232  //Now the absorber layer
233  double zi = zMinBlock + layerThick;
234  double zo = zi + 0.5 * dzStep;
235  double rinF, routF, rinB, routB;
236  if (modNumber == 0) {
237  rinF = zi * slopeTopF;
238  routF = (zi - z1Beam) * slopeTop;
239  rinB = zo * slopeTopF;
240  routB = (zo - z1Beam) * slopeTop;
241  } else if (modNumber > 0) {
242  rinF = zi * slopeBot;
243  routF = zi * slopeTopF;
244  rinB = zo * slopeBot;
245  routB = zo * slopeTopF;
246  } else {
247  rinF = zi * slopeBot;
248  routF = (zi - z1Beam) * slopeTop;
249  rinB = zo * slopeBot;
250  routB = (zo - z1Beam) * slopeTop;
251  }
252 #ifdef EDM_ML_DEBUG
253  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: Front " << convertCmToMm(zi) << ", " << convertCmToMm(rinF)
254  << ", " << convertCmToMm(routF) << " Back " << convertCmToMm(zo) << ", "
255  << convertCmToMm(rinB) << ", " << convertCmToMm(routB);
256 #endif
257  HCalEndcapModuleAlgo::HcalEndcapPar parm = parameterLayer(0, rinF, routF, rinB, routB, zi, zo);
258 #ifdef EDM_ML_DEBUG
259  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: Trim " << convertCmToMm(tolAbs) << " Param "
260  << convertCmToMm(parm.yh1) << ", " << convertCmToMm(parm.bl1) << ", "
261  << convertCmToMm(parm.tl1) << ", " << convertCmToMm(parm.yh2) << ", "
262  << convertCmToMm(parm.bl2) << ", " << convertCmToMm(parm.tl2);
263 #endif
264  parm.bl1 -= tolAbs;
265  parm.tl1 -= tolAbs;
266  parm.bl2 -= tolAbs;
267  parm.tl2 -= tolAbs;
268 
269  name = idName + modName + layerName[0] + "Absorber";
270  solid = dd4hep::Trap(ns.prepend(name),
271  0.5 * moduleThick,
272  parm.theta,
273  parm.phi,
274  parm.yh1,
275  parm.bl1,
276  parm.tl1,
277  parm.alp,
278  parm.yh2,
279  parm.bl2,
280  parm.tl2,
281  parm.alp);
282 #ifdef EDM_ML_DEBUG
283  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << solid.name() << " Trap made of " << matabsorbr.name()
284  << " of dimensions " << convertCmToMm(0.5 * moduleThick) << ", "
285  << convertRadToDeg(parm.theta) << ", " << convertRadToDeg(parm.phi) << ", "
286  << convertCmToMm(parm.yh1) << ", " << convertCmToMm(parm.bl1) << ", "
287  << convertCmToMm(parm.tl1) << ", " << convertRadToDeg(parm.alp) << ", "
288  << convertCmToMm(parm.yh2) << ", " << convertCmToMm(parm.bl2) << ", "
289  << convertCmToMm(parm.tl2) << ", " << convertRadToDeg(parm.alp);
290 #endif
291  glog = dd4hep::Volume(solid.name(), solid, matabsorbr);
292 
293  dd4hep::Position r2(parm.xpos, parm.ypos, parm.zpos);
294  module.placeVolume(glog, idOffset + layer + 1, dd4hep::Transform3D(rot, r2));
295 #ifdef EDM_ML_DEBUG
296  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << glog.name() << " number 1 positioned in "
297  << module.name() << " at (" << convertCmToMm(parm.xpos) << ", "
298  << convertCmToMm(parm.ypos) << ", " << convertCmToMm(parm.zpos)
299  << ") with rotation: " << rot;
300 #endif
301  }
302 
304  cms::DDNamespace ns(ctxt, e, true);
305 #ifdef EDM_ML_DEBUG
306  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: \t\tInside module";
307 #endif
308  //Pointers to the Rotation Matrices and to the Materials
310  dd4hep::Material matter = ns.material(genMaterial);
311  dd4hep::Material matplastic = ns.material(plasticMat);
312  dd4hep::Rotation3D rot = getRotation(rotstr, ns);
313 
314  double alpha = (1._pi) / sectors;
315  double zi = zMinBlock;
316 
317  for (unsigned int i = 0; i < layerName.size(); i++) {
319  dd4hep::Solid solid;
320  dd4hep::Volume glog, plog;
321  int layer = layerNumber[i];
322  double zo = zi + 0.5 * dzStep;
323 
324  for (unsigned int iphi = 0; iphi < phiName.size(); iphi++) {
325  double ziAir = zo - moduleThick;
326  double rinF, rinB;
327  if (modNumber == 0) {
328  rinF = ziAir * slopeTopF;
329  rinB = zo * slopeTopF;
330  } else {
331  rinF = ziAir * slopeBot;
332  rinB = zo * slopeBot;
333  }
334  double routF = getRout(ziAir);
335  double routB = getRout(zo);
336 #ifdef EDM_ML_DEBUG
337  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: Layer " << i << " Phi " << iphi << " Front "
338  << convertCmToMm(ziAir) << ", " << convertCmToMm(rinF) << ", "
339  << convertCmToMm(routF) << " Back " << convertCmToMm(zo) << ", "
340  << convertCmToMm(rinB) << ", " << convertCmToMm(routB);
341 #endif
342  HCalEndcapModuleAlgo::HcalEndcapPar parm = parameterLayer(iphi, rinF, routF, rinB, routB, ziAir, zo);
343 
344  name = idName + modName + layerName[i] + phiName[iphi] + "Air";
345  solid = dd4hep::Trap(ns.prepend(name),
346  0.5 * moduleThick,
347  parm.theta,
348  parm.phi,
349  parm.yh1,
350  parm.bl1,
351  parm.tl1,
352  parm.alp,
353  parm.yh2,
354  parm.bl2,
355  parm.tl2,
356  parm.alp);
357 #ifdef EDM_ML_DEBUG
358  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << solid.name() << " Trap made of " << matter.name()
359  << " of dimensions " << convertCmToMm(0.5 * moduleThick) << ", "
360  << convertRadToDeg(parm.theta) << ", " << convertRadToDeg(parm.phi) << ", "
361  << convertCmToMm(parm.yh1) << ", " << convertCmToMm(parm.bl1) << ", "
362  << convertCmToMm(parm.tl1) << ", " << convertRadToDeg(parm.alp) << ", "
363  << convertCmToMm(parm.yh2) << ", " << convertCmToMm(parm.bl2) << ", "
364  << convertCmToMm(parm.tl2) << ", " << convertRadToDeg(parm.alp);
365 #endif
366  glog = dd4hep::Volume(solid.name(), solid, matter);
367 
368  dd4hep::Position r1(parm.xpos, parm.ypos, parm.zpos);
369  module.placeVolume(glog, layer + 1, dd4hep::Transform3D(rot, r1));
370 #ifdef EDM_ML_DEBUG
371  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << glog.name() << " number " << layer + 1
372  << " positioned in " << module.name() << " at (" << convertCmToMm(parm.xpos)
373  << ", " << convertCmToMm(parm.ypos) << ", " << convertCmToMm(parm.zpos)
374  << ") with rotation: " << rot;
375 #endif
376  //Now the plastic with scintillators
377  parm.yh1 = 0.5 * (routF - rinB) - getTrim(iphi);
378  parm.bl1 = 0.5 * rinB * tan(alpha) - getTrim(iphi);
379  parm.tl1 = 0.5 * routF * tan(alpha) - getTrim(iphi);
380  name = idName + modName + layerName[i] + phiName[iphi];
381  solid = dd4hep::Trap(ns.prepend(name),
382  0.5 * layerThick,
383  0,
384  0,
385  parm.yh1,
386  parm.bl1,
387  parm.tl1,
388  parm.alp,
389  parm.yh1,
390  parm.bl1,
391  parm.tl1,
392  parm.alp);
393 #ifdef EDM_ML_DEBUG
394  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << solid.name() << " Trap made of "
395  << matplastic.name() << " of dimensions " << convertCmToMm(0.5 * layerThick)
396  << ", 0, 0, " << convertCmToMm(parm.yh1) << ", " << convertCmToMm(parm.bl1) << ", "
397  << convertCmToMm(parm.tl1) << ", " << convertRadToDeg(parm.alp) << ", "
398  << convertCmToMm(parm.yh1) << ", " << convertCmToMm(parm.bl1) << ", "
399  << convertCmToMm(parm.tl1) << ", " << convertRadToDeg(parm.alp);
400 #endif
401  plog = dd4hep::Volume(solid.name(), solid, matplastic);
402 
403  double ypos = 0.5 * (routF + rinB) - parm.xpos;
404  dd4hep::Position r2(0., ypos, 0.);
405  glog.placeVolume(plog, idOffset + layer + 1, r2);
406 #ifdef EDM_ML_DEBUG
407  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << plog.name() << " number "
408  << (idOffset + layer + 1) << " positioned in " << glog.name() << " at (0, "
409  << convertCmToMm(ypos) << ", 0) with no rotation";
410 #endif
411  //Constructin the scintillators inside
412  int copyNo = layer * 10 + layerType;
413  name = modName + layerName[i] + phiName[iphi];
414  constructScintLayer(plog, scintThick, parm, name, copyNo, ns);
415  zo += 0.5 * dzStep;
416  } // End of loop over phi indices
417  zi = zo - 0.5 * dzStep;
418  } // End of loop on layers
419  }
420 
423  //Given module and layer number compute parameters of trapezoid
424  //and positioning parameters
425  double alpha = (1._pi) / sectors;
426 #ifdef EDM_ML_DEBUG
427  edm::LogVerbatim("HCalGeom") << "Input " << iphi << " Alpha " << convertRadToDeg(alpha);
428 #endif
429  double zi, zo;
430  if (iphi == 0) {
431  zi = zMinBlock;
432  zo = zi + layerThick;
433  } else {
434  zo = zMaxBlock;
435  zi = zo - layerThick;
436  }
437  double rin, rout;
438  if (modNumber == 0) {
439  rin = zo * slopeTopF;
440  rout = (zi - z1Beam) * slopeTop;
441  } else if (modNumber > 0) {
442  rin = zo * slopeBot;
443  rout = zi * slopeTopF;
444  } else {
445  rin = zo * slopeBot;
446  rout = (zi - z1Beam) * slopeTop;
447  }
448 #ifdef EDM_ML_DEBUG
449  edm::LogVerbatim("HCalGeom") << "ModNumber " << modNumber << " " << convertCmToMm(zi) << " " << convertCmToMm(zo)
450  << " " << slopeTopF << " " << slopeTop << " " << slopeBot << " " << convertCmToMm(rin)
451  << " " << convertCmToMm(rout) << " " << convertCmToMm(getTrim(iphi));
452 #endif
453  double yh = 0.5 * (rout - rin);
454  double bl = 0.5 * rin * tan(alpha);
455  double tl = 0.5 * rout * tan(alpha);
456  parm.xpos = 0.5 * (rin + rout);
457  parm.ypos = 0.5 * (bl + tl);
458  parm.zpos = 0.5 * (zi + zo);
459  parm.yh1 = parm.yh2 = yh - getTrim(iphi);
460  parm.bl1 = parm.bl2 = bl - getTrim(iphi);
461  parm.tl1 = parm.tl2 = tl - getTrim(iphi);
462  parm.alp = atan(0.5 * tan(alpha));
463  if (iphi == 0) {
464  parm.ypos = -parm.ypos;
465  } else {
466  parm.alp = -parm.alp;
467  }
468 #ifdef EDM_ML_DEBUG
469  edm::LogVerbatim("HCalGeom") << "Output Dimensions " << convertCmToMm(parm.yh1) << " " << convertCmToMm(parm.bl1)
470  << " " << convertCmToMm(parm.tl1) << " " << convertRadToDeg(parm.alp) << " Position "
471  << convertCmToMm(parm.xpos) << " " << convertCmToMm(parm.ypos) << " "
472  << convertCmToMm(parm.zpos);
473 #endif
474  return parm;
475  }
476 
478  unsigned int iphi, double rinF, double routF, double rinB, double routB, double zi, double zo) {
480  //Given rin, rout compute parameters of the trapezoid and
481  //position of the trapezoid for a standrd layer
482  double alpha = (1._pi) / sectors;
483 #ifdef EDM_ML_DEBUG
484  edm::LogVerbatim("HCalGeom") << "Input " << iphi << " Front " << convertCmToMm(rinF) << " " << convertCmToMm(routF)
485  << " " << convertCmToMm(zi) << " Back " << convertCmToMm(rinB) << " "
486  << convertCmToMm(routB) << " " << convertCmToMm(zo) << " Alpha "
488 #endif
489  parm.yh1 = 0.5 * (routF - rinB);
490  parm.bl1 = 0.5 * rinB * tan(alpha);
491  parm.tl1 = 0.5 * routF * tan(alpha);
492  parm.yh2 = 0.5 * (routF - rinB);
493  parm.bl2 = 0.5 * rinB * tan(alpha);
494  parm.tl2 = 0.5 * routF * tan(alpha);
495  double dx = 0.25 * (parm.bl2 + parm.tl2 - parm.bl1 - parm.tl1);
496  double dy = 0.5 * (rinB + routF - rinB - routF);
497  parm.xpos = 0.25 * (rinB + routF + rinB + routF);
498  parm.ypos = 0.25 * (parm.bl2 + parm.tl2 + parm.bl1 + parm.tl1);
499  parm.zpos = 0.5 * (zi + zo);
500  parm.alp = atan(0.5 * tan(alpha));
501  if (iphi == 0) {
502  parm.ypos = -parm.ypos;
503  } else {
504  parm.alp = -parm.alp;
505  dx = -dx;
506  }
507  double r = sqrt(dx * dx + dy * dy);
508 #ifdef EDM_ML_DEBUG
509  edm::LogVerbatim("HCalGeom") << "dx|dy|r " << convertCmToMm(dx) << ":" << convertCmToMm(dy) << ":"
510  << convertCmToMm(r);
511 #endif
512  if (r > 1.0e-8) {
513  parm.theta = atan(r / (zo - zi));
514  parm.phi = atan2(dy, dx);
515  } else {
516  parm.theta = parm.phi = 0;
517  }
518 #ifdef EDM_ML_DEBUG
519  edm::LogVerbatim("HCalGeom") << "Output Dimensions " << convertCmToMm(parm.yh1) << " " << convertCmToMm(parm.bl1)
520  << " " << convertCmToMm(parm.tl1) << " " << convertCmToMm(parm.yh2) << " "
521  << convertCmToMm(parm.bl2) << " " << convertCmToMm(parm.tl2) << " "
522  << convertRadToDeg(parm.alp) << " " << convertRadToDeg(parm.theta) << " "
523  << convertRadToDeg(parm.phi) << " Position " << convertCmToMm(parm.xpos) << " "
524  << convertCmToMm(parm.ypos) << " " << convertCmToMm(parm.zpos);
525 #endif
526  return parm;
527  }
528 
530  double dz,
532  const std::string& nm,
533  int id,
534  cms::DDNamespace& ns) {
535  dd4hep::Material matter = ns.material(scintMat);
536  std::string name = idName + "Scintillator" + nm;
537 
538  dd4hep::Solid solid = dd4hep::Trap(
539  ns.prepend(name), 0.5 * dz, 0, 0, parm.yh1, parm.bl1, parm.tl1, parm.alp, parm.yh1, parm.bl1, parm.tl1, parm.alp);
540 #ifdef EDM_ML_DEBUG
541  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << solid.name() << " Trap made of " << scintMat
542  << " of dimensions " << convertCmToMm(0.5 * dz) << ", 0, 0, "
543  << convertCmToMm(parm.yh1) << ", " << convertCmToMm(parm.bl1) << ", "
544  << convertCmToMm(parm.tl1) << ", " << convertRadToDeg(parm.alp) << ", "
545  << convertCmToMm(parm.yh1) << ", " << convertCmToMm(parm.bl1) << ", "
546  << convertCmToMm(parm.tl1) << ", " << convertRadToDeg(parm.alp);
547 #endif
548  dd4hep::Volume glog(solid.name(), solid, matter);
549 
550  detector.placeVolume(glog, id);
551 #ifdef EDM_ML_DEBUG
552  edm::LogVerbatim("HCalGeom") << "DDHCalEndcapModuleAlgo: " << glog.name() << " number " << id << " positioned in "
553  << detector.name() << " at (0,0,0) with no rotation";
554 #endif
555  }
556 
557  double getTrim(unsigned int j) const {
558  if (j == 0)
559  return trimLeft;
560  else
561  return trimRight;
562  }
563 
564  double getRout(double z) const {
565  double r = (modNumber >= 0) ? ((z - z1Beam) * slopeTop) : z * slopeTopF;
566  if (z > ziDip) {
567  if (r > rMaxBack)
568  r = rMaxBack;
569  } else {
570  if (r > rMaxFront)
571  r = rMaxFront;
572  }
573  return r;
574  }
575 
576  dd4hep::Rotation3D getRotation(const std::string& rotstr, cms::DDNamespace& ns) {
577  std::string rot = (strchr(rotstr.c_str(), NAMESPACE_SEP) == nullptr) ? ("rotations:" + rotstr) : rotstr;
578 #ifdef EDM_ML_DEBUG
579  edm::LogVerbatim("HCalGeom") << "getRotation: " << rotstr << ":" << rot << ":" << ns.rotation(rot);
580 #endif
581  return ns.rotation(rot);
582  }
583 };
584 
585 static long algorithm(dd4hep::Detector& /* description */, cms::DDParsingContext& ctxt, xml_h e) {
586  HCalEndcapModuleAlgo hcalendcapalgo(ctxt, e);
587  return 1;
588 }
589 
590 // first argument is the type from the xml file
591 DECLARE_DDCMS_DETELEMENT(DDCMS_hcal_DDHCalEndcapModuleAlgo, algorithm)
writedatasetfile.args
args
Definition: writedatasetfile.py:18
HCalEndcapModuleAlgo::getRotation
dd4hep::Rotation3D getRotation(const std::string &rotstr, cms::DDNamespace &ns)
Definition: DDHCalEndcapModuleAlgo.cc:576
mps_fire.i
i
Definition: mps_fire.py:428
g4SimHits_cfi.Material
Material
Definition: g4SimHits_cfi.py:560
MessageLogger.h
HCalEndcapModuleAlgo::HcalEndcapPar::bl2
double bl2
Definition: DDHCalEndcapModuleAlgo.cc:56
DECLARE_DDCMS_DETELEMENT
#define DECLARE_DDCMS_DETELEMENT(name, func)
Definition: DDPlugins.h:25
cms::DDNamespace::material
dd4hep::Material material(const std::string &name) const
Definition: DDNamespace.cc:116
HCalEndcapModuleAlgo::rMaxBack
double rMaxBack
Definition: DDHCalEndcapModuleAlgo.cc:36
HCalEndcapModuleAlgo::sectors
int sectors
Definition: DDHCalEndcapModuleAlgo.cc:27
cms::DDParsingContext
Definition: DDParsingContext.h:13
zMuMuMuonUserData.alpha
alpha
zGenParticlesMatch = cms.InputTag(""),
Definition: zMuMuMuonUserData.py:9
angle_units::operators::convertRadToDeg
constexpr NumType convertRadToDeg(NumType radians)
Definition: angle_units.h:21
cms::DDNamespace
Definition: DDNamespace.h:16
HCalEndcapModuleAlgo::constructInsideModule0
void constructInsideModule0(cms::DDParsingContext &ctxt, xml_h e, dd4hep::Volume &module)
Definition: DDHCalEndcapModuleAlgo.cc:176
versionedElectronIDProducer_cfi.idName
idName
Definition: versionedElectronIDProducer_cfi.py:11
geant_units::operators
Definition: GeantUnits.h:18
HCalEndcapModuleAlgo::layerNumber
std::vector< int > layerNumber
Definition: DDHCalEndcapModuleAlgo.cc:47
LEDCalibrationChannels.iphi
iphi
Definition: LEDCalibrationChannels.py:64
HCalEndcapModuleAlgo::parameterLayer
HcalEndcapPar parameterLayer(unsigned int iphi, double rinF, double routF, double rinB, double routB, double zi, double zo)
Definition: DDHCalEndcapModuleAlgo.cc:477
HCalEndcapModuleAlgo::HcalEndcapPar::HcalEndcapPar
HcalEndcapPar(double yh1v=0, double bl1v=0, double tl1v=0, double yh2v=0, double bl2v=0, double tl2v=0, double alpv=0, double thv=0, double fiv=0, double x=0, double y=0, double z=0)
Definition: DDHCalEndcapModuleAlgo.cc:57
HCalEndcapModuleAlgo::parameterLayer0
HcalEndcapPar parameterLayer0(unsigned int iphi)
Definition: DDHCalEndcapModuleAlgo.cc:421
HCalEndcapModuleAlgo::HcalEndcapPar::tl2
double tl2
Definition: DDHCalEndcapModuleAlgo.cc:56
HCalEndcapModuleAlgo::scintThick
double scintThick
Definition: DDHCalEndcapModuleAlgo.cc:35
HCalEndcapModuleAlgo::layerType
int layerType
Definition: DDHCalEndcapModuleAlgo.cc:46
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
HCalEndcapModuleAlgo::HcalEndcapPar::alp
double alp
Definition: DDHCalEndcapModuleAlgo.cc:56
cms::DDNamespace::prepend
std::string prepend(const std::string &) const
Definition: DDNamespace.cc:60
HCalEndcapModuleAlgo::modType
int modType
Definition: DDHCalEndcapModuleAlgo.cc:44
theta
Geom::Theta< T > theta() const
Definition: Basic3DVectorLD.h:150
HCalEndcapModuleAlgo::HcalEndcapPar::bl1
double bl1
Definition: DDHCalEndcapModuleAlgo.cc:56
HCalEndcapModuleAlgo::idOffset
int idOffset
Definition: DDHCalEndcapModuleAlgo.cc:53
PixelTestBeamValidation_cfi.Position
Position
Definition: PixelTestBeamValidation_cfi.py:75
HCalEndcapModuleAlgo::layerThick
double layerThick
Definition: DDHCalEndcapModuleAlgo.cc:34
HCalEndcapModuleAlgo::absorberMat
std::string absorberMat
Definition: DDHCalEndcapModuleAlgo.cc:23
HCalEndcapModuleAlgo::trimRight
double trimRight
Definition: DDHCalEndcapModuleAlgo.cc:42
cms::DDNamespace::rotation
const dd4hep::Rotation3D & rotation(const std::string &name) const
Definition: DDNamespace.cc:125
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
HCalEndcapModuleAlgo::ziDip
double ziDip
Definition: DDHCalEndcapModuleAlgo.cc:31
HCalEndcapModuleAlgo::HcalEndcapPar::xpos
double xpos
Definition: DDHCalEndcapModuleAlgo.cc:56
HCalEndcapModuleAlgo::tolAbs
double tolAbs
Definition: DDHCalEndcapModuleAlgo.cc:43
cms::Volume
dd4hep::Volume Volume
Definition: DDFilteredView.h:47
geant_units::operators::convertCmToMm
constexpr NumType convertCmToMm(NumType centimeters)
Definition: GeantUnits.h:68
HCalEndcapModuleAlgo::slopeBot
double slopeBot
Definition: DDHCalEndcapModuleAlgo.cc:38
GeantUnits.h
HCalEndcapModuleAlgo::constructScintLayer
void constructScintLayer(dd4hep::Volume &detector, double dz, HCalEndcapModuleAlgo::HcalEndcapPar parm, const std::string &nm, int id, cms::DDNamespace &ns)
Definition: DDHCalEndcapModuleAlgo.cc:529
HCalEndcapModuleAlgo::rMaxFront
double rMaxFront
Definition: DDHCalEndcapModuleAlgo.cc:37
DDPlugins.h
diffTwoXMLs.r2
r2
Definition: diffTwoXMLs.py:73
HCalEndcapModuleAlgo::slopeTop
double slopeTop
Definition: DDHCalEndcapModuleAlgo.cc:39
HCalEndcapModuleAlgo
Definition: DDHCalEndcapModuleAlgo.cc:21
funct::tan
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
HCalEndcapModuleAlgo::layerName
std::vector< std::string > layerName
Definition: DDHCalEndcapModuleAlgo.cc:49
HCalEndcapModuleAlgo::HcalEndcapPar::phi
double phi
Definition: DDHCalEndcapModuleAlgo.cc:56
cms::DDAlgoArguments
Definition: DDAlgoArguments.h:28
PVValHelper::dy
Definition: PVValidationHelpers.h:49
HCalEndcapModuleAlgo::constructInsideModule
void constructInsideModule(cms::DDParsingContext &ctxt, xml_h e, dd4hep::Volume &module)
Definition: DDHCalEndcapModuleAlgo.cc:303
HCalEndcapModuleAlgo::HcalEndcapPar::zpos
double zpos
Definition: DDHCalEndcapModuleAlgo.cc:56
HCalEndcapModuleAlgo::rotstr
std::string rotstr
Definition: DDHCalEndcapModuleAlgo.cc:26
HCalEndcapModuleAlgo::plasticMat
std::string plasticMat
Definition: DDHCalEndcapModuleAlgo.cc:24
alignCSCRings.r
r
Definition: alignCSCRings.py:93
HCalEndcapModuleAlgo::getRout
double getRout(double z) const
Definition: DDHCalEndcapModuleAlgo.cc:564
align::Detector
Definition: StructureType.h:86
HCalEndcapModuleAlgo::getTrim
double getTrim(unsigned int j) const
Definition: DDHCalEndcapModuleAlgo.cc:557
HCalEndcapModuleAlgo::HcalEndcapPar::yh1
double yh1
Definition: DDHCalEndcapModuleAlgo.cc:56
HCalEndcapModuleAlgo::HCalEndcapModuleAlgo
HCalEndcapModuleAlgo(cms::DDParsingContext &ctxt, xml_h e)
Definition: DDHCalEndcapModuleAlgo.cc:85
HCalEndcapModuleAlgo::modName
std::string modName
Definition: DDHCalEndcapModuleAlgo.cc:52
HCalEndcapModuleAlgo::HcalEndcapPar::theta
double theta
Definition: DDHCalEndcapModuleAlgo.cc:56
algorithm
static long algorithm(dd4hep::Detector &, cms::DDParsingContext &ctxt, xml_h e)
Definition: DDHCalEndcapModuleAlgo.cc:585
PVValHelper::dz
Definition: PVValidationHelpers.h:50
diffTwoXMLs.r1
r1
Definition: diffTwoXMLs.py:53
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition: MessageLogger.h:128
HCalEndcapModuleAlgo::modNumber
int modNumber
Definition: DDHCalEndcapModuleAlgo.cc:45
HCalEndcapModuleAlgo::z1Beam
double z1Beam
Definition: DDHCalEndcapModuleAlgo.cc:30
HCalEndcapModuleAlgo::HcalEndcapPar::tl1
double tl1
Definition: DDHCalEndcapModuleAlgo.cc:56
HCalEndcapModuleAlgo::HcalEndcapPar::yh2
double yh2
Definition: DDHCalEndcapModuleAlgo.cc:56
makeMuonMisalignmentScenario.rot
rot
Definition: makeMuonMisalignmentScenario.py:322
HCalEndcapModuleAlgo::trimLeft
double trimLeft
Definition: DDHCalEndcapModuleAlgo.cc:41
Skims_PA_cff.name
name
Definition: Skims_PA_cff.py:17
HCalEndcapModuleAlgo::genMaterial
std::string genMaterial
Definition: DDHCalEndcapModuleAlgo.cc:22
HCalEndcapModuleAlgo::dzStep
double dzStep
Definition: DDHCalEndcapModuleAlgo.cc:32
NAMESPACE_SEP
#define NAMESPACE_SEP
Definition: DDNamespace.h:85
hgcalTestNeighbor_cfi.detector
detector
Definition: hgcalTestNeighbor_cfi.py:6
HCalEndcapModuleAlgo::slopeTopF
double slopeTopF
Definition: DDHCalEndcapModuleAlgo.cc:40
HCalEndcapModuleAlgo::phiName
std::vector< std::string > phiName
Definition: DDHCalEndcapModuleAlgo.cc:48
HCalEndcapModuleAlgo::HcalEndcapPar
Definition: DDHCalEndcapModuleAlgo.cc:55
HCalEndcapModuleAlgo::HcalEndcapPar::ypos
double ypos
Definition: DDHCalEndcapModuleAlgo.cc:56
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
HCalEndcapModuleAlgo::scintMat
std::string scintMat
Definition: DDHCalEndcapModuleAlgo.cc:25
volumeBasedMagneticField_160812_cfi.sectors
sectors
Definition: volumeBasedMagneticField_160812_cfi.py:59
HCalEndcapModuleAlgo::zMaxBlock
double zMaxBlock
Definition: DDHCalEndcapModuleAlgo.cc:29
HCalEndcapModuleAlgo::idName
std::string idName
Definition: DDHCalEndcapModuleAlgo.cc:51
edm::Log
Definition: MessageLogger.h:70
HCalEndcapModuleAlgo::zMinBlock
double zMinBlock
Definition: DDHCalEndcapModuleAlgo.cc:28
cms::DDNamespace::name
std::string_view name() const
Definition: DDNamespace.h:72
cms::DDNamespace::volume
dd4hep::Volume volume(const std::string &name, bool exc=true) const
Definition: DDNamespace.cc:205
PVValHelper::dx
Definition: PVValidationHelpers.h:48
HCalEndcapModuleAlgo::moduleThick
double moduleThick
Definition: DDHCalEndcapModuleAlgo.cc:33
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37