CMS 3D CMS Logo

DDTIDModuleAlgo.cc
Go to the documentation of this file.
1 // File: DDTIDModuleAlgo.cc
3 // Description: Creation of a TID Module
5 #include <cmath>
6 #include <algorithm>
7 
15 #include "CLHEP/Units/GlobalPhysicalConstants.h"
16 #include "CLHEP/Units/GlobalSystemOfUnits.h"
17 
18 
20  LogDebug("TIDGeom") << "DDTIDModuleAlgo info: Creating an instance";
21 }
22 
24 
26  const DDVectorArguments & vArgs,
27  const DDMapArguments & ,
28  const DDStringArguments & sArgs,
29  const DDStringVectorArguments & vsArgs) {
30 
31  int i;
32  genMat = sArgs["GeneralMaterial"];
33  detectorN = (int)(nArgs["DetectorNumber"]);
34  DDName parentName = parent().name();
35 
36  LogDebug("TIDGeom") << "DDTIDModuleAlgo debug: Parent " << parentName
37  << " General Material " << genMat
38  << " Detector Planes " << detectorN;
39 
40  moduleThick = nArgs["ModuleThick"];
41  detTilt = nArgs["DetTilt"];
42  fullHeight = nArgs["FullHeight"];
43  dlTop = nArgs["DlTop"];
44  dlBottom = nArgs["DlBottom"];
45  dlHybrid = nArgs["DlHybrid"];
46  std::string comp = sArgs["DoComponents"];
47  if (comp == "No" || comp == "NO" || comp == "no") doComponents = false;
48  else doComponents = true;
49 
50  LogDebug("TIDGeom") << "DDTIDModuleAlgo debug: ModuleThick "
51  << moduleThick << " Detector Tilt " << detTilt/CLHEP::deg
52  << " Height " << fullHeight << " dl(Top) " << dlTop
53  << " dl(Bottom) " << dlBottom << " dl(Hybrid) "
54  << dlHybrid << " doComponents " << doComponents;
55 
56  boxFrameName = sArgs["BoxFrameName"];
57  boxFrameMat = sArgs["BoxFrameMaterial"];
58  boxFrameThick = nArgs["BoxFrameThick"];
59  boxFrameHeight = nArgs["BoxFrameHeight"];
60  boxFrameWidth = nArgs["BoxFrameWidth"];
61  bottomFrameHeight = nArgs["BottomFrameHeight"];
62  bottomFrameOver = nArgs["BottomFrameOver"];
63  LogDebug("TIDGeom") << "DDTIDModuleAlgo debug: " << boxFrameName
64  << " Material " << boxFrameMat << " Thickness "
65  << boxFrameThick << " width " << boxFrameWidth
66  << " height " << boxFrameHeight
67  << " Extra Height at Bottom " << bottomFrameHeight
68  << " Overlap " << bottomFrameOver;
69 
70  topFrameHeight = nArgs["TopFrameHeight"];
71  topFrameOver = nArgs["TopFrameOver"];
72  sideFrameName = vsArgs["SideFrameName"];
73  sideFrameMat = sArgs["SideFrameMaterial"];
74  sideFrameWidth = nArgs["SideFrameWidth"];
75  sideFrameThick = nArgs["SideFrameThick"];
76  sideFrameOver = nArgs["SideFrameOver"];
77  holeFrameName = vsArgs["HoleFrameName"];
78  holeFrameRot = vsArgs["HoleFrameRotation"];
79  for (i = 0; i < detectorN; i++)
80  LogDebug("TIDGeom") << "DDTIDModuleAlgo debug : " << sideFrameName[i]
81  << " Material " << sideFrameMat << " Width "
82  << sideFrameWidth << " Thickness " << sideFrameThick
83  << " Overlap " << sideFrameOver << " Hole "
84  << holeFrameName[i];
85 
86  kaptonName = vsArgs["KaptonName"];
87  kaptonMat = sArgs["KaptonMaterial"];
88  kaptonThick = nArgs["KaptonThick"];
89  kaptonOver = nArgs["KaptonOver"];
90  holeKaptonName = vsArgs["HoleKaptonName"];
91  holeKaptonRot = vsArgs["HoleKaptonRotation"];
92  for (i = 0; i < detectorN; i++)
93  LogDebug("TIDGeom") << "DDTIDModuleAlgo debug : " << kaptonName[i]
94  << " Material " << kaptonMat
95  << " Thickness " << kaptonThick
96  << " Overlap " << kaptonOver << " Hole "
97  << holeKaptonName[i];
98 
99 
100  waferName = vsArgs["WaferName"];
101  waferMat = sArgs["WaferMaterial"];
102  sideWidthTop = nArgs["SideWidthTop"];
103  sideWidthBottom = nArgs["SideWidthBottom"];
104 
105  LogDebug("TIDGeom") << "DDTIDModuleAlgo debug: Wafer Material "
106  << waferMat << " Side Width Top " << sideWidthTop
107  << " Side Width Bottom " << sideWidthBottom;
108  for (i = 0; i < detectorN; i++)
109  LogDebug("TIDGeom") << "\twaferName[" << i << "] = " << waferName[i];
110 
111  activeName = vsArgs["ActiveName"];
112  activeMat = sArgs["ActiveMaterial"];
113  activeHeight = nArgs["ActiveHeight"];
114  waferThick = vArgs["WaferThick"];
115  activeRot = sArgs["ActiveRotation"];
116  backplaneThick = vArgs["BackPlaneThick"];
117  LogDebug("TIDGeom") << "DDTIDModuleAlgo debug: Active Material "
118  << activeMat << " Height " << activeHeight
119  << " rotated by " << activeRot;
120  for (i = 0; i < detectorN; i++)
121  LogDebug("TIDGeom") << " translated by (0," << -0.5*backplaneThick[i]
122  << ",0)\tactiveName[" << i << "] = " << activeName[i]
123  << " of thickness " << waferThick[i]-backplaneThick[i];
124 
125  hybridName = sArgs["HybridName"];
126  hybridMat = sArgs["HybridMaterial"];
127  hybridHeight = nArgs["HybridHeight"];
128  hybridWidth = nArgs["HybridWidth"];
129  hybridThick = nArgs["HybridThick"];
130  LogDebug("TIDGeom") << "DDTIDModuleAlgo debug: " << hybridName
131  << " Material " << hybridMat << " Height "
132  << hybridHeight << " Width " << hybridWidth
133  << " Thickness " << hybridThick;
134 
135  pitchName = vsArgs["PitchName"];
136  pitchMat = sArgs["PitchMaterial"];
137  pitchHeight = nArgs["PitchHeight"];
138  pitchThick = nArgs["PitchThick"];
139  pitchStereoTol = nArgs["PitchStereoTolerance"];
140 
141  LogDebug("TIDGeom") << "DDTIDModuleAlgo debug: Pitch Adapter Material "
142  << pitchMat << " Height " << pitchHeight
143  << " Thickness " << pitchThick;
144  for (i = 0; i < detectorN; i++)
145  LogDebug("TIDGeom") << "\tpitchName[" << i << "] = " << pitchName[i];
146 
147  coolName = sArgs["CoolInsertName"];
148  coolMat = sArgs["CoolInsertMaterial"];
149  coolHeight = nArgs["CoolInsertHeight"];
150  coolThick = nArgs["CoolInsertThick"];
151  coolWidth = nArgs["CoolInsertWidth"];
152  LogDebug("TIDGeom") << "DDTIDModuleAlgo debug: Cool Element Material "
153  << coolMat << " Height " << coolHeight
154  << " Thickness " << coolThick << " Width " << coolWidth;
155 }
156 
158 
159  LogDebug("TIDGeom") << "==>> Constructing DDTIDModuleAlgo...";
160 
161  DDName parentName = parent().name();
162  DDName name;
163 
164  double sidfr = sideFrameWidth - sideFrameOver; // width of side frame on the sides of module
165  double botfr; // width of side frame at the the bottom of the modules
166  double topfr; // width of side frame at the the top of the modules
167  double kaptonHeight;
168  if (dlHybrid > dlTop) {
169  // ring 1, ring 2
172  kaptonHeight = fullHeight + botfr;
173  } else {
174  // ring 3
175  topfr = topFrameHeight - topFrameOver;
177  kaptonHeight = fullHeight + topfr;
178  }
179 
180  double sideFrameHeight = fullHeight + pitchHeight + botfr + topfr;
181  double kaptonWidth = sidfr + kaptonOver;
182 
183  double dxbot = 0.5*dlBottom + sidfr;
184  double dxtop = 0.5*dlTop + sidfr;
185  double dxtopenv, dxbotenv; // top/bot width of the module envelope trap
186 
187  // Envelope
188  if (dlHybrid > dlTop) {
189  // ring 1, ring 2
190  dxtopenv = dxbot + (dxtop-dxbot)*(fullHeight+pitchHeight+topfr+hybridHeight)/fullHeight;
191  dxbotenv = dxtop - (dxtop-dxbot)*(fullHeight+botfr)/fullHeight;
192  } else {
193  // ring 3
194  dxtopenv = dxbot + (dxtop-dxbot)*(fullHeight+topfr)/fullHeight;
195  dxbotenv = dxbot;
196  }
197  double bl1 = dxbotenv;
198  double bl2 = dxtopenv;
199  double h1 = 0.5 * moduleThick;
200  double dz = 0.5 * (boxFrameHeight + sideFrameHeight);
201 
202  DDSolid solidUncut, solidCut;
203  DDSolid solid = DDSolidFactory::trap(parentName, dz, 0, 0,
204  h1, bl1, bl1, 0, h1, bl2, bl2, 0);
206  DDMaterial matter = DDMaterial(matname);
207  DDLogicalPart module(solid.ddname(), matter, solid);
208  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
209  << " Trap made of " << genMat << " of dimensions " << dz
210  << ", 0, 0, " << h1 << ", " << bl1 << ", " << bl1
211  << ", 0, " << h1 << ", " << bl2 << ", " << bl2
212  << ", 0";
213 
214  if (doComponents) {
215 
216  //Box frame
217  name = DDName(DDSplit(boxFrameName).first,DDSplit(boxFrameName).second);
218  matname = DDName(DDSplit(boxFrameMat).first, DDSplit(boxFrameMat).second);
219  matter = DDMaterial(matname);
220  double dx = 0.5 * boxFrameWidth;
221  double dy = 0.5 * boxFrameThick;
222  double dz = 0.5 * boxFrameHeight;
223  solid = DDSolidFactory::box(name, dx, dy, dz);
224  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
225  << " Box made of " << matname << " of dimensions "
226  << dx << ", " << dy << ", " << dz;
227  DDLogicalPart boxFrame(solid.ddname(), matter, solid);
228 
229 
230  // Hybrid
231  name = DDName(DDSplit(hybridName).first, DDSplit(hybridName).second);
232  matname = DDName(DDSplit(hybridMat).first, DDSplit(hybridMat).second);
233  matter = DDMaterial(matname);
234  dx = 0.5 * hybridWidth;
235  dy = 0.5 * hybridThick;
236  dz = 0.5 * hybridHeight;
237  solid = DDSolidFactory::box(name, dx, dy, dz);
238  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
239  << " Box made of " << matname << " of dimensions "
240  << dx << ", " << dy << ", " << dz;
241  DDLogicalPart hybrid(solid.ddname(), matter, solid);
242 
243  // Cool Insert
244  name = DDName(DDSplit(coolName).first, DDSplit(coolName).second);
245  matname = DDName(DDSplit(coolMat).first, DDSplit(coolMat).second);
246  matter = DDMaterial(matname);
247  dx = 0.5 * coolWidth;
248  dy = 0.5 * coolThick;
249  dz = 0.5 * coolHeight;
250  solid = DDSolidFactory::box(name, dx, dy, dz);
251  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
252  << " Box made of " << matname << " of dimensions "
253  << dx << ", " << dy << ", " << dz;
254  DDLogicalPart cool(solid.ddname(), matter, solid);
255 
256  // Loop over detectors to be placed
257  for (int k = 0; k < detectorN; k++) {
258 
259  double bbl1, bbl2; // perhaps useless (bl1 enough)
260 
261  // Frame Sides
262  name = DDName(DDSplit(sideFrameName[k]).first,
263  DDSplit(sideFrameName[k]).second);
264  matname = DDName(DDSplit(sideFrameMat).first,
265  DDSplit(sideFrameMat).second);
266  matter = DDMaterial(matname);
267  if (dlHybrid > dlTop) {
268  // ring 1, ring 2
269  bbl1 = dxtop - (dxtop-dxbot)*(fullHeight+botfr)/fullHeight;
270  bbl2 = dxbot + (dxtop-dxbot)*(fullHeight+pitchHeight+topfr)/fullHeight;
271  } else {
272  // ring 3
273  bbl1 = dxtop - (dxtop-dxbot)*(fullHeight+pitchHeight+botfr)/fullHeight;
274  bbl2 = dxbot + (dxtop-dxbot)*(fullHeight+topfr)/fullHeight;
275  }
276  h1 = 0.5 * sideFrameThick;
277  dz = 0.5 * sideFrameHeight;
278  solid = DDSolidFactory::trap(name, dz, 0, 0, h1, bbl1, bbl1, 0,
279  h1, bbl2, bbl2, 0);
280  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
281  << " Trap made of " << matname << " of dimensions "
282  << dz << ", 0, 0, " << h1 << ", " << bbl1 << ", "
283  << bbl1 << ", 0, " << h1 << ", " << bbl2 << ", "
284  << bbl2 << ", 0";
285  DDLogicalPart sideFrame(solid.ddname(), matter, solid);
286 
287  std::string rotstr, rotns;
288  DDRotation rot;
289 
290  // Hole in the frame below the wafer
291  name = DDName(DDSplit(holeFrameName[k]).first,
292  DDSplit(holeFrameName[k]).second);
293  matname = DDName(DDSplit(genMat).first, DDSplit(genMat).second);
294  matter = DDMaterial(matname);
295  double xpos, zpos;
297  bbl1 = dxbot - sideFrameWidth + bottomFrameOver*(dxtop-dxbot)/fullHeight;
298  bbl2 = dxtop - sideFrameWidth - topFrameOver*(dxtop-dxbot)/fullHeight;
299  if (dlHybrid > dlTop) {
300  // ring 1, ring 2
301  zpos = -(topFrameHeight+0.5*dz-0.5*sideFrameHeight);
302  } else {
303  // ring 3
304  zpos = bottomFrameHeight+0.5*dz-0.5*sideFrameHeight;
305  }
306  dz /= 2.;
307  solid = DDSolidFactory::trap(name, dz, 0,0, h1,bbl1,bbl1, 0,
308  h1,bbl2,bbl2, 0);
309  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
310  << " Trap made of " << matname << " of dimensions "
311  << dz << ", 0, 0, " << h1 << ", " << bbl1 << ", "
312  << bbl1 << ", 0, " << h1 << ", " << bbl2 << ", "
313  << bbl2 << ", 0";
314  DDLogicalPart holeFrame(solid.ddname(), matter, solid);
315 
316  rotstr = DDSplit(holeFrameRot[k]).first;
317  if (rotstr != "NULL") {
318  rotns = DDSplit(holeFrameRot[k]).second;
319  rot = DDRotation(DDName(rotstr, rotns));
320  } else {
321  rot = DDRotation();
322  }
323  cpv.position(holeFrame, sideFrame, 1, DDTranslation(0.0, 0.0, zpos), rot );
324  LogDebug("TIDGeom") << "DDTIDModuleAlgo test: " << holeFrame.name()
325  << " number 1 positioned in " << sideFrame.name()
326  << " at (0,0," << zpos << ") with no rotation";
327 
328  // Kapton circuit
329  // name = DDName(DDSplit(kaptonName[k]).first,DDSplit(kaptonName[k]).second);
330  matname = DDName(DDSplit(kaptonMat).first,DDSplit(kaptonMat).second);
331  matter = DDMaterial(matname);
332  double kaptonExtraHeight=0; // kapton extra height in the stereo
333  if (dlHybrid > dlTop) {
334  // ring 1, ring 2
335  bbl1 = dxtop - (dxtop-dxbot)*(fullHeight+botfr)/fullHeight;
336  if ( k == 1 ) {
337  kaptonExtraHeight = dlTop*sin(detTilt)-fullHeight*(1-cos(detTilt));
338  kaptonExtraHeight = 0.5*fabs(kaptonExtraHeight);
339  bbl2 = dxbot + (dxtop-dxbot)*(fullHeight+kaptonExtraHeight)/fullHeight;
340  }
341  else {
342  bbl2 = dxtop;
343  }
344  } else {
345  // ring 3
346  bbl2 = dxbot + (dxtop-dxbot)*(fullHeight+topfr)/fullHeight;
347  if ( k == 1) {
348  kaptonExtraHeight = dlBottom*sin(detTilt)-fullHeight*(1-cos(detTilt));
349  kaptonExtraHeight = 0.5*fabs(kaptonExtraHeight);
350  bbl1 = dxtop - (dxtop-dxbot)*(fullHeight+kaptonExtraHeight)/fullHeight;
351  } else {
352  bbl1 = dxbot;
353  }
354  }
355  h1 = 0.5 * kaptonThick;
356  dz = 0.5 * (kaptonHeight+kaptonExtraHeight);
357 
358  // For the stereo create the uncut solid, the solid to be removed and then the subtraction solid
359  if ( k == 1 ) {
360  // Uncut solid
361  std::string kaptonUncutName=kaptonName[k]+"Uncut";
362  name = DDName(DDSplit(kaptonUncutName).first,
363  DDSplit(kaptonUncutName).second);
364  solidUncut = DDSolidFactory::trap(name, dz, 0, 0, h1, bbl1, bbl1, 0,
365  h1, bbl2, bbl2, 0);
366 
367  // Piece to be cut
368  std::string kaptonCutName=kaptonName[k]+"Cut";
369  name = DDName(DDSplit(kaptonCutName).first,
370  DDSplit(kaptonCutName).second);
371 
372  if (dlHybrid > dlTop) {
373  dz = 0.5 * dlTop;
374  } else {
375  dz = 0.5 * dlBottom;
376  }
377  h1 = 0.5 * kaptonThick;
378  bbl1 = fabs(dz*sin(detTilt));
379  bbl2 = bbl1*0.000001;
380  double thet = atan((bbl1-bbl2)/(2*dz));
381  solidCut = DDSolidFactory::trap(name, dz, thet, 0, h1, bbl1, bbl1, 0,
382  h1, bbl2, bbl2, 0);
383 
384  std::string aRot("tidmodpar:9PYX");
385  rotstr = DDSplit(aRot).first;
386  rotns = DDSplit(aRot).second;
387  rot = DDRotation(DDName(rotstr, rotns));
388 
389  xpos = -0.5 * fullHeight * sin(detTilt);
390  zpos = 0.5 * kaptonHeight - bbl2;
391 
392  // Subtraction Solid
393  name = DDName(DDSplit(kaptonName[k]).first,
394  DDSplit(kaptonName[k]).second);
395  solid = DDSolidFactory::subtraction(name, solidUncut, solidCut,
396  DDTranslation(xpos,0.0,zpos),rot);
397  } else {
398  name = DDName(DDSplit(kaptonName[k]).first,
399  DDSplit(kaptonName[k]).second);
400  solid = DDSolidFactory::trap(name, dz, 0, 0, h1, bbl1, bbl1, 0,
401  h1, bbl2, bbl2, 0);
402  }
403 
404  DDLogicalPart kapton(solid.ddname(), matter, solid);
405  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
406  << " SUBTRACTION SOLID Trap made of " << matname
407  << " of dimensions " << dz << ", 0, 0, " << h1
408  << ", " << bbl1 << ", " << bbl1 << ", 0, " << h1
409  << ", " << bbl2 << ", " << bbl2 << ", 0";
410 
411 
412  // Hole in the kapton below the wafer
413  name = DDName(DDSplit(holeKaptonName[k]).first,
414  DDSplit(holeKaptonName[k]).second);
415  matname = DDName(DDSplit(genMat).first, DDSplit(genMat).second);
416  matter = DDMaterial(matname);
417  dz = fullHeight - kaptonOver;
418  xpos = 0;
419  if (dlHybrid > dlTop) {
420  // ring 1, ring 2
421  bbl1 = dxbot - kaptonWidth + kaptonOver*(dxtop-dxbot)/fullHeight;
422  bbl2 = dxtop - kaptonWidth;
423  zpos = 0.5*(kaptonHeight-kaptonExtraHeight-dz);
424  if ( k == 1 ) {
425  zpos -= 0.5*kaptonOver*(1-cos(detTilt));
426  xpos = -0.5*kaptonOver*sin(detTilt);
427  }
428  } else {
429  // ring 3
430  bbl1 = dxbot - kaptonWidth;
431  bbl2 = dxtop - kaptonWidth - kaptonOver*(dxtop-dxbot)/fullHeight;
432  zpos = -0.5*(kaptonHeight-kaptonExtraHeight-dz);
433  }
434  dz /= 2.;
435  solid = DDSolidFactory::trap(name, dz, 0,0, h1,bbl1,bbl1, 0,
436  h1,bbl2,bbl2, 0);
437  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
438  << " Trap made of " << matname << " of dimensions "
439  << dz << ", 0, 0, " << h1 << ", " << bbl1 << ", "
440  << bbl1 << ", 0, " << h1 << ", " << bbl2 << ", "
441  << bbl2 << ", 0";
442  DDLogicalPart holeKapton(solid.ddname(), matter, solid);
443 
444  rotstr = DDSplit(holeKaptonRot[k]).first;
445  if (rotstr != "NULL") {
446  rotns = DDSplit(holeKaptonRot[k]).second;
447  rot = DDRotation(DDName(rotstr, rotns));
448  } else {
449  rot = DDRotation();
450  }
451  cpv.position(holeKapton, kapton, 1, DDTranslation(xpos, 0.0, zpos), rot );
452  LogDebug("TIDGeom") << "DDTIDModuleAlgo test: " << holeKapton.name()
453  << " number 1 positioned in " << kapton.name()
454  << " at (0,0," << zpos << ") with no rotation";
455 
456 
457 
458  // Wafer
459  name = DDName(DDSplit(waferName[k]).first,
460  DDSplit(waferName[k]).second);
461  matname = DDName(DDSplit(waferMat).first, DDSplit(waferMat).second);
462  matter = DDMaterial(matname);
463  if (k == 0 && dlHybrid < dlTop) {
464  bl1 = 0.5 * dlTop;
465  bl2 = 0.5 * dlBottom;
466  } else {
467  bl1 = 0.5 * dlBottom;
468  bl2 = 0.5 * dlTop;
469  }
470  h1 = 0.5 * waferThick[k];
471  dz = 0.5 * fullHeight;
472  solid = DDSolidFactory::trap(name, dz, 0,0, h1,bl1,bl1,0, h1,bl2,bl2,0);
473  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
474  << " Trap made of " << matname << " of dimensions "
475  << dz << ", 0, 0, " << h1 << ", " << bl1 << ", "
476  << bl1 << ", 0, " << h1 << ", " << bl2 << ", "
477  << bl2 << ", 0";
478  DDLogicalPart wafer(solid.ddname(), matter, solid);
479 
480  // Active
481  name = DDName(DDSplit(activeName[k]).first,
482  DDSplit(activeName[k]).second);
483  matname = DDName(DDSplit(activeMat).first, DDSplit(activeMat).second);
484  matter = DDMaterial(matname);
485  if (k == 0 && dlHybrid < dlTop) {
486  bl1 -= sideWidthTop;
487  bl2 -= sideWidthBottom;
488  }
489  else {
490  bl1 -= sideWidthBottom;
491  bl2 -= sideWidthTop;
492  }
493  dz = 0.5 * (waferThick[k] - backplaneThick[k]); // inactive backplane
494  h1 = 0.5 * activeHeight;
495  solid = DDSolidFactory::trap(name, dz, 0,0, h1,bl2,bl1,0, h1,bl2,bl1,0);
496  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
497  << " Trap made of " << matname << " of dimensions "
498  << dz << ", 0, 0, " << h1 << ", " << bl2 << ", "
499  << bl1 << ", 0, " << h1 << ", " << bl2 << ", "
500  << bl1 << ", 0";
501  DDLogicalPart active(solid.ddname(), matter, solid);
502  rotstr = DDSplit(activeRot).first;
503  if (rotstr != "NULL") {
504  rotns = DDSplit(activeRot).second;
505  rot = DDRotation(DDName(rotstr, rotns));
506  } else {
507  rot = DDRotation();
508  }
509  DDTranslation tran(0.0,-0.5 * backplaneThick[k],0.0); // from the definition of the wafer local axes
510  cpv.position(active, wafer, 1, tran, rot); // inactive backplane
511  LogDebug("TIDGeom") << "DDTIDModuleAlgo test: " << active.name()
512  << " number 1 positioned in " << wafer.name()
513  << " at " << tran << " with " << rot;
514 
515  //Pitch Adapter
516  name = DDName(DDSplit(pitchName[k]).first,
517  DDSplit(pitchName[k]).second);
518  matname = DDName(DDSplit(pitchMat).first, DDSplit(pitchMat).second);
519  matter = DDMaterial(matname);
520  if (dlHybrid > dlTop) {
521  dz = 0.5 * dlTop;
522  } else {
523  dz = 0.5 * dlBottom;
524  }
525  if (k == 0) {
526  dx = dz;
527  dy = 0.5 * pitchThick;
528  dz = 0.5 * pitchHeight;
529  solid = DDSolidFactory::box(name, dx, dy, dz);
530  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
531  << " Box made of " << matname << " of dimensions"
532  << " " << dx << ", " << dy << ", " << dz;
533  } else {
534  h1 = 0.5 * pitchThick;
535  bl1 = 0.5 * pitchHeight + 0.5 * dz * sin(detTilt);
536  bl2 = 0.5 * pitchHeight - 0.5 * dz * sin(detTilt);
537 
538  dz -=0.5*pitchStereoTol;
539  bl1-=pitchStereoTol;
540  bl2-=pitchStereoTol;
541 
542  double thet = atan((bl1-bl2)/(2.*dz));
543  solid = DDSolidFactory::trap(name, dz, thet, 0, h1, bl1, bl1, 0,
544  h1, bl2, bl2, 0);
545  LogDebug("TIDGeom") << "DDTIDModuleAlgo test:\t" << solid.name()
546  << " Trap made of " << matname << " of "
547  << "dimensions " << dz << ", " << thet/CLHEP::deg
548  << ", 0, " << h1 << ", " << bl1 << ", " << bl1
549  << ", 0, " << h1 << ", " << bl2 << ", " << bl2
550  << ", 0";
551  }
552  DDLogicalPart pa(solid.ddname(), matter, solid);
553  }
554  }
555  LogDebug("TIDGeom") << "<<== End of DDTIDModuleAlgo construction ...";
556 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
std::string boxFrameName
std::string sideFrameMat
const N & name() const
Definition: DDBase.h:78
std::string waferMat
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:41
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
void position(const DDLogicalPart &self, const DDLogicalPart &parent, std::string copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=NULL)
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:16
std::string coolName
susybsm::HSCParticle pa
Definition: classes.h:8
std::vector< std::string > waferName
type of data representation of DDCompactView
Definition: DDCompactView.h:90
std::string pitchMat
std::string activeRot
std::vector< std::string > holeKaptonName
void initialize(const DDNumericArguments &nArgs, const DDVectorArguments &vArgs, const DDMapArguments &mArgs, const DDStringArguments &sArgs, const DDStringVectorArguments &vsArgs)
A DDSolid represents the shape of a part.
Definition: DDSolid.h:37
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:66
U second(std::pair< T, U > const &p)
std::string coolMat
std::string activeMat
void execute(DDCompactView &cpv)
std::vector< std::string > kaptonName
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
std::vector< std::string > holeFrameRot
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:92
std::string hybridName
std::vector< std::string > sideFrameName
double bottomFrameHeight
static DDSolid trap(const DDName &name, double pDz, double pTheta, double pPhi, double pDy1, double pDx1, double pDx2, double pAlp1, double pDy2, double pDx3, double pDx4, double pAlp2)
Definition: DDSolid.cc:758
std::string boxFrameMat
static DDSolid box(const DDName &name, double xHalf, double yHalf, double zHalf)
Creates a box with side length 2*xHalf, 2*yHalf, 2*zHalf.
Definition: DDSolid.cc:526
int k[5][pyjets_maxn]
std::string genMat
std::vector< double > waferThick
static DDSolid subtraction(const DDName &name, const DDSolid &a, const DDSolid &b, const DDTranslation &t, const DDRotation &r)
Definition: DDSolid.cc:740
std::vector< std::string > holeFrameName
std::vector< double > backplaneThick
virtual ~DDTIDModuleAlgo()
std::vector< std::string > pitchName
std::pair< std::string, std::string > DDSplit(const std::string &n)
split into (name,namespace), separator = &#39;:&#39;
Definition: DDSplit.cc:4
std::vector< std::string > activeName
std::string kaptonMat
std::vector< std::string > holeKaptonRot
std::string hybridMat
const N & ddname() const
Definition: DDBase.h:80