CMS 3D CMS Logo

DDEcalBarrelNewAlgo.cc
Go to the documentation of this file.
1 
3 // File: DDEcalBarrelNewAlgo.cc
4 // Description: Geometry factory class for Ecal Barrel
6 
7 #include <cmath>
8 #include <algorithm>
9 
15 #include "CLHEP/Units/GlobalSystemOfUnits.h"
16 
17 #include <CLHEP/Geometry/Point3D.h>
18 #include <CLHEP/Geometry/Vector3D.h>
19 #include <CLHEP/Geometry/Transform3D.h>
20 #include <map>
21 #include <string>
22 #include <vector>
30 #include "CLHEP/Geometry/Transform3D.h"
31 
32 class DDEcalBarrelNewAlgo : public DDAlgorithm {
33 public:
35  typedef HepGeom::Point3D<double> Pt3D;
36  typedef HepGeom::Transform3D Tf3D;
37  typedef HepGeom::ReflectZ3D RfZ3D;
38  typedef HepGeom::Translate3D Tl3D;
39  typedef HepGeom::Rotate3D Ro3D;
40  typedef HepGeom::RotateZ3D RoZ3D;
41  typedef HepGeom::RotateY3D RoY3D;
42  typedef HepGeom::RotateX3D RoX3D;
43 
44  typedef CLHEP::Hep3Vector Vec3;
45  typedef CLHEP::HepRotation Rota;
46 
47  //Constructor and Destructor
49  ~DDEcalBarrelNewAlgo() override;
50 
51  void initialize(const DDNumericArguments& nArgs,
52  const DDVectorArguments& vArgs,
53  const DDMapArguments& mArgs,
54  const DDStringArguments& sArgs,
55  const DDStringVectorArguments& vsArgs) override;
56  void execute(DDCompactView& cpv) override;
57 
58  DDMaterial ddmat(const std::string& s) const;
59  DDName ddname(const std::string& s) const;
60  DDRotation myrot(const std::string& s, const CLHEP::HepRotation& r) const;
61  DDSolid mytrap(const std::string& s, const Trap& t) const;
62 
63  const std::string& idNameSpace() const { return m_idNameSpace; }
64 
65  // barrel parent volume
66  DDName barName() const { return ddname(m_BarName); }
67  DDMaterial barMat() const { return ddmat(m_BarMat); }
68  const std::vector<double>& vecBarZPts() const { return m_vecBarZPts; }
69  const std::vector<double>& vecBarRMin() const { return m_vecBarRMin; }
70  const std::vector<double>& vecBarRMax() const { return m_vecBarRMax; }
71  const std::vector<double>& vecBarTran() const { return m_vecBarTran; }
72  const std::vector<double>& vecBarRota() const { return m_vecBarRota; }
73  const std::vector<double>& vecBarRota2() const { return m_vecBarRota2; }
74  const std::vector<double>& vecBarRota3() const { return m_vecBarRota3; }
75  double barPhiLo() const { return m_BarPhiLo; }
76  double barPhiHi() const { return m_BarPhiHi; }
77  double barHere() const { return m_BarHere; }
78 
79  DDName spmName() const { return ddname(m_SpmName); }
80  DDMaterial spmMat() const { return ddmat(m_SpmMat); }
81  const std::vector<double>& vecSpmZPts() const { return m_vecSpmZPts; }
82  const std::vector<double>& vecSpmRMin() const { return m_vecSpmRMin; }
83  const std::vector<double>& vecSpmRMax() const { return m_vecSpmRMax; }
84  const std::vector<double>& vecSpmTran() const { return m_vecSpmTran; }
85  const std::vector<double>& vecSpmRota() const { return m_vecSpmRota; }
86  const std::vector<double>& vecSpmBTran() const { return m_vecSpmBTran; }
87  const std::vector<double>& vecSpmBRota() const { return m_vecSpmBRota; }
88  unsigned int spmNPerHalf() const { return m_SpmNPerHalf; }
89  double spmLowPhi() const { return m_SpmLowPhi; }
90  double spmDelPhi() const { return m_SpmDelPhi; }
91  double spmPhiOff() const { return m_SpmPhiOff; }
92  const std::vector<double>& vecSpmHere() const { return m_vecSpmHere; }
93  DDName spmCutName() const { return ddname(m_SpmCutName); }
94  double spmCutThick() const { return m_SpmCutThick; }
95  int spmCutShow() const { return m_SpmCutShow; }
96  double spmCutRM() const { return m_SpmCutRM; }
97  double spmCutRP() const { return m_SpmCutRP; }
98  const std::vector<double>& vecSpmCutTM() const { return m_vecSpmCutTM; }
99  const std::vector<double>& vecSpmCutTP() const { return m_vecSpmCutTP; }
100  double spmExpThick() const { return m_SpmExpThick; }
101  double spmExpWide() const { return m_SpmExpWide; }
102  double spmExpYOff() const { return m_SpmExpYOff; }
103  DDName spmSideName() const { return ddname(m_SpmSideName); }
105  double spmSideHigh() const { return m_SpmSideHigh; }
106  double spmSideThick() const { return m_SpmSideThick; }
107  double spmSideYOffM() const { return m_SpmSideYOffM; }
108  double spmSideYOffP() const { return m_SpmSideYOffP; }
109 
110  double nomCryDimAF() const { return m_NomCryDimAF; }
111  double nomCryDimLZ() const { return m_NomCryDimLZ; }
112  const std::vector<double>& vecNomCryDimBF() const { return m_vecNomCryDimBF; }
113  const std::vector<double>& vecNomCryDimCF() const { return m_vecNomCryDimCF; }
114  const std::vector<double>& vecNomCryDimAR() const { return m_vecNomCryDimAR; }
115  const std::vector<double>& vecNomCryDimBR() const { return m_vecNomCryDimBR; }
116  const std::vector<double>& vecNomCryDimCR() const { return m_vecNomCryDimCR; }
117 
118  double underAF() const { return m_UnderAF; }
119  double underLZ() const { return m_UnderLZ; }
120  double underBF() const { return m_UnderBF; }
121  double underCF() const { return m_UnderCF; }
122  double underAR() const { return m_UnderAR; }
123  double underBR() const { return m_UnderBR; }
124  double underCR() const { return m_UnderCR; }
125 
126  double wallThAlv() const { return m_WallThAlv; }
127  double wrapThAlv() const { return m_WrapThAlv; }
128  double clrThAlv() const { return m_ClrThAlv; }
129  const std::vector<double>& vecGapAlvEta() const { return m_vecGapAlvEta; }
130 
131  double wallFrAlv() const { return m_WallFrAlv; }
132  double wrapFrAlv() const { return m_WrapFrAlv; }
133  double clrFrAlv() const { return m_ClrFrAlv; }
134 
135  double wallReAlv() const { return m_WallReAlv; }
136  double wrapReAlv() const { return m_WrapReAlv; }
137  double clrReAlv() const { return m_ClrReAlv; }
138 
139  unsigned int nCryTypes() const { return m_NCryTypes; }
140  unsigned int nCryPerAlvEta() const { return m_NCryPerAlvEta; }
141 
142  const std::string& cryName() const { return m_CryName; }
143  const std::string& clrName() const { return m_ClrName; }
144  const std::string& wrapName() const { return m_WrapName; }
145  const std::string& wallName() const { return m_WallName; }
146 
147  DDMaterial cryMat() const { return ddmat(m_CryMat); }
148  DDMaterial clrMat() const { return ddmat(m_ClrMat); }
149  DDMaterial wrapMat() const { return ddmat(m_WrapMat); }
150  DDMaterial wallMat() const { return ddmat(m_WallMat); }
151  DDName capName() const { return ddname(m_capName); }
152  double capHere() const { return m_capHere; }
153  DDMaterial capMat() const { return ddmat(m_capMat); }
154  double capXSize() const { return m_capXSize; }
155  double capYSize() const { return m_capYSize; }
156  double capThick() const { return m_capThick; }
157 
158  DDName cerName() const { return ddname(m_CERName); }
159  DDMaterial cerMat() const { return ddmat(m_CERMat); }
160  double cerXSize() const { return m_CERXSize; }
161  double cerYSize() const { return m_CERYSize; }
162  double cerThick() const { return m_CERThick; }
163 
164  DDName bsiName() const { return ddname(m_BSiName); }
165  DDMaterial bsiMat() const { return ddmat(m_BSiMat); }
166  double bsiXSize() const { return m_BSiXSize; }
167  double bsiYSize() const { return m_BSiYSize; }
168  double bsiThick() const { return m_BSiThick; }
169 
170  DDName atjName() const { return ddname(m_ATJName); }
171  DDMaterial atjMat() const { return ddmat(m_ATJMat); }
172  double atjThick() const { return m_ATJThick; }
173 
174  DDName sglName() const { return ddname(m_SGLName); }
175  DDMaterial sglMat() const { return ddmat(m_SGLMat); }
176  double sglThick() const { return m_SGLThick; }
177 
178  DDName aglName() const { return ddname(m_AGLName); }
179  DDMaterial aglMat() const { return ddmat(m_AGLMat); }
180  double aglThick() const { return m_AGLThick; }
181 
182  DDName andName() const { return ddname(m_ANDName); }
183  DDMaterial andMat() const { return ddmat(m_ANDMat); }
184  double andThick() const { return m_ANDThick; }
185 
186  DDName apdName() const { return ddname(m_APDName); }
187  DDMaterial apdMat() const { return ddmat(m_APDMat); }
188  double apdSide() const { return m_APDSide; }
189  double apdThick() const { return m_APDThick; }
190  double apdZ() const { return m_APDZ; }
191  double apdX1() const { return m_APDX1; }
192  double apdX2() const { return m_APDX2; }
193 
194  double webHere() const { return m_WebHere; }
195  const std::string& webPlName() const { return m_WebPlName; }
196  const std::string& webClrName() const { return m_WebClrName; }
197  DDMaterial webPlMat() const { return ddmat(m_WebPlMat); }
198  DDMaterial webClrMat() const { return ddmat(m_WebClrMat); }
199  const std::vector<double>& vecWebPlTh() const { return m_vecWebPlTh; }
200  const std::vector<double>& vecWebClrTh() const { return m_vecWebClrTh; }
201  const std::vector<double>& vecWebLength() const { return m_vecWebLength; }
202 
203  double ilyHere() const { return m_IlyHere; }
204  const std::string& ilyName() const { return m_IlyName; }
205  double ilyPhiLow() const { return m_IlyPhiLow; }
206  double ilyDelPhi() const { return m_IlyDelPhi; }
207  const std::vector<std::string>& vecIlyMat() const { return m_vecIlyMat; }
208  const std::vector<double>& vecIlyThick() const { return m_vecIlyThick; }
209 
210  const std::string& ilyPipeName() const { return m_IlyPipeName; }
211  double ilyPipeHere() const { return m_IlyPipeHere; }
213  double ilyPipeOD() const { return m_IlyPipeOD; }
214  double ilyPipeID() const { return m_IlyPipeID; }
215  const std::vector<double>& vecIlyPipeLength() const { return m_vecIlyPipeLength; }
216  const std::vector<double>& vecIlyPipeType() const { return m_vecIlyPipeType; }
217  const std::vector<double>& vecIlyPipePhi() const { return m_vecIlyPipePhi; }
218  const std::vector<double>& vecIlyPipeZ() const { return m_vecIlyPipeZ; }
219 
220  DDName ilyPTMName() const { return ddname(m_IlyPTMName); }
221  double ilyPTMHere() const { return m_IlyPTMHere; }
222  DDMaterial ilyPTMMat() const { return ddmat(m_IlyPTMMat); }
223  double ilyPTMWidth() const { return m_IlyPTMWidth; }
224  double ilyPTMLength() const { return m_IlyPTMLength; }
225  double ilyPTMHeight() const { return m_IlyPTMHeight; }
226  const std::vector<double>& vecIlyPTMZ() const { return m_vecIlyPTMZ; }
227  const std::vector<double>& vecIlyPTMPhi() const { return m_vecIlyPTMPhi; }
228 
230  double ilyFanOutHere() const { return m_IlyFanOutHere; }
232  double ilyFanOutWidth() const { return m_IlyFanOutWidth; }
233  double ilyFanOutLength() const { return m_IlyFanOutLength; }
234  double ilyFanOutHeight() const { return m_IlyFanOutHeight; }
235  const std::vector<double>& vecIlyFanOutZ() const { return m_vecIlyFanOutZ; }
236  const std::vector<double>& vecIlyFanOutPhi() const { return m_vecIlyFanOutPhi; }
237  DDName ilyDiffName() const { return ddname(m_IlyDiffName); }
239  double ilyDiffOff() const { return m_IlyDiffOff; }
240  double ilyDiffLength() const { return m_IlyDiffLength; }
241  DDName ilyBndlName() const { return ddname(m_IlyBndlName); }
243  double ilyBndlOff() const { return m_IlyBndlOff; }
244  double ilyBndlLength() const { return m_IlyBndlLength; }
245  DDName ilyFEMName() const { return ddname(m_IlyFEMName); }
246  DDMaterial ilyFEMMat() const { return ddmat(m_IlyFEMMat); }
247  double ilyFEMWidth() const { return m_IlyFEMWidth; }
248  double ilyFEMLength() const { return m_IlyFEMLength; }
249  double ilyFEMHeight() const { return m_IlyFEMHeight; }
250  const std::vector<double>& vecIlyFEMZ() const { return m_vecIlyFEMZ; }
251  const std::vector<double>& vecIlyFEMPhi() const { return m_vecIlyFEMPhi; }
252 
253  DDName hawRName() const { return ddname(m_HawRName); }
254  DDName fawName() const { return ddname(m_FawName); }
255  double fawHere() const { return m_FawHere; }
256  double hawRHBIG() const { return m_HawRHBIG; }
257  double hawRhsml() const { return m_HawRhsml; }
258  double hawRCutY() const { return m_HawRCutY; }
259  double hawRCutZ() const { return m_HawRCutZ; }
260  double hawRCutDelY() const { return m_HawRCutDelY; }
261  double hawYOffCry() const { return m_HawYOffCry; }
262 
263  unsigned int nFawPerSupm() const { return m_NFawPerSupm; }
264  double fawPhiOff() const { return m_FawPhiOff; }
265  double fawDelPhi() const { return m_FawDelPhi; }
266  double fawPhiRot() const { return m_FawPhiRot; }
267  double fawRadOff() const { return m_FawRadOff; }
268 
269  double gridHere() const { return m_GridHere; }
270  DDName gridName() const { return ddname(m_GridName); }
271  DDMaterial gridMat() const { return ddmat(m_GridMat); }
272  double gridThick() const { return m_GridThick; }
273 
274  double backHere() const { return m_BackHere; }
275  double backXOff() const { return m_BackXOff; }
276  double backYOff() const { return m_BackYOff; }
278  double backSideHere() const { return m_BackSideHere; }
279  double backSideLength() const { return m_BackSideLength; }
280  double backSideHeight() const { return m_BackSideHeight; }
281  double backSideWidth() const { return m_BackSideWidth; }
282  double backSideYOff1() const { return m_BackSideYOff1; }
283  double backSideYOff2() const { return m_BackSideYOff2; }
284  double backSideAngle() const { return m_BackSideAngle; }
287  double backPlateHere() const { return m_BackPlateHere; }
288  double backPlateLength() const { return m_BackPlateLength; }
289  double backPlateThick() const { return m_BackPlateThick; }
290  double backPlateWidth() const { return m_BackPlateWidth; }
293  double backPlate2Thick() const { return m_BackPlate2Thick; }
295  const std::string& grilleName() const { return m_GrilleName; }
296  double grilleThick() const { return m_GrilleThick; }
297  double grilleHere() const { return m_GrilleHere; }
298  double grilleWidth() const { return m_GrilleWidth; }
299  double grilleZSpace() const { return m_GrilleZSpace; }
300  DDMaterial grilleMat() const { return ddmat(m_GrilleMat); }
301  const std::vector<double>& vecGrilleHeight() const { return m_vecGrilleHeight; }
302  const std::vector<double>& vecGrilleZOff() const { return m_vecGrilleZOff; }
303 
306  double grEdgeSlotHere() const { return m_GrEdgeSlotHere; }
307  double grEdgeSlotHeight() const { return m_GrEdgeSlotHeight; }
308  double grEdgeSlotWidth() const { return m_GrEdgeSlotWidth; }
309  const std::string& grMidSlotName() const { return m_GrMidSlotName; }
311  double grMidSlotHere() const { return m_GrMidSlotHere; }
312  double grMidSlotWidth() const { return m_GrMidSlotWidth; }
313  double grMidSlotXOff() const { return m_GrMidSlotXOff; }
314  const std::vector<double>& vecGrMidSlotHeight() const { return m_vecGrMidSlotHeight; }
315 
316  double backPipeHere() const { return m_BackPipeHere; }
317  const std::string& backPipeName() const { return m_BackPipeName; }
318  const std::vector<double>& vecBackPipeDiam() const { return m_vecBackPipeDiam; }
319  const std::vector<double>& vecBackPipeThick() const { return m_vecBackPipeThick; }
322  double backMiscHere() const { return m_BackMiscHere; }
323  const std::vector<double>& vecBackMiscThick() const { return m_vecBackMiscThick; }
324  const std::vector<std::string>& vecBackMiscName() const { return m_vecBackMiscName; }
325  const std::vector<std::string>& vecBackMiscMat() const { return m_vecBackMiscMat; }
326  double patchPanelHere() const { return m_PatchPanelHere; }
327  const std::vector<double>& vecPatchPanelThick() const { return m_vecPatchPanelThick; }
328  const std::vector<std::string>& vecPatchPanelNames() const { return m_vecPatchPanelNames; }
329  const std::vector<std::string>& vecPatchPanelMat() const { return m_vecPatchPanelMat; }
331 
332  const std::vector<std::string>& vecBackCoolName() const { return m_vecBackCoolName; }
333  double backCoolHere() const { return m_BackCoolHere; }
334  double backCoolBarWidth() const { return m_BackCoolBarWidth; }
335  double backCoolBarHeight() const { return m_BackCoolBarHeight; }
337  double backCoolBarHere() const { return m_BackCoolBarHere; }
339  double backCoolBarThick() const { return m_BackCoolBarThick; }
342  double backCoolBarSSThick() const { return m_BackCoolBarSSThick; }
345  double backCoolBarWaThick() const { return m_BackCoolBarWaThick; }
347  double backCoolVFEHere() const { return m_BackCoolVFEHere; }
350  DDName backVFEName() const { return ddname(m_BackVFEName); }
352  const std::vector<double>& vecBackVFELyrThick() const { return m_vecBackVFELyrThick; }
353  const std::vector<std::string>& vecBackVFELyrName() const { return m_vecBackVFELyrName; }
354  const std::vector<std::string>& vecBackVFELyrMat() const { return m_vecBackVFELyrMat; }
355  const std::vector<double>& vecBackCoolNSec() const { return m_vecBackCoolNSec; }
356  const std::vector<double>& vecBackCoolSecSep() const { return m_vecBackCoolSecSep; }
357  const std::vector<double>& vecBackCoolNPerSec() const { return m_vecBackCoolNPerSec; }
358  double backCBStdSep() const { return m_BackCBStdSep; }
359 
360  double backCoolTankHere() const { return m_BackCoolTankHere; }
362  double backCoolTankWidth() const { return m_BackCoolTankWidth; }
363  double backCoolTankThick() const { return m_BackCoolTankThick; }
366  double backCoolTankWaWidth() const { return m_BackCoolTankWaWidth; }
368  const std::string& backBracketName() const { return m_BackBracketName; }
369  double backBracketHeight() const { return m_BackBracketHeight; }
371 
372  double dryAirTubeHere() const { return m_DryAirTubeHere; }
373  const std::string& dryAirTubeName() const { return m_DryAirTubeName; }
374  double mBCoolTubeNum() const { return m_MBCoolTubeNum; }
375  double dryAirTubeInnDiam() const { return m_DryAirTubeInnDiam; }
376  double dryAirTubeOutDiam() const { return m_DryAirTubeOutDiam; }
378  double mBCoolTubeHere() const { return m_MBCoolTubeHere; }
379  const std::string& mBCoolTubeName() const { return m_MBCoolTubeName; }
380  double mBCoolTubeInnDiam() const { return m_MBCoolTubeInnDiam; }
381  double mBCoolTubeOutDiam() const { return m_MBCoolTubeOutDiam; }
383  double mBManifHere() const { return m_MBManifHere; }
384  DDName mBManifName() const { return ddname(m_MBManifName); }
385  double mBManifInnDiam() const { return m_MBManifInnDiam; }
386  double mBManifOutDiam() const { return m_MBManifOutDiam; }
388  double mBLyrHere() const { return m_MBLyrHere; }
389  const std::vector<double>& vecMBLyrThick() const { return m_vecMBLyrThick; }
390  const std::vector<std::string>& vecMBLyrName() const { return m_vecMBLyrName; }
391  const std::vector<std::string>& vecMBLyrMat() const { return m_vecMBLyrMat; }
392 
393  //----------
394 
395  double pincerRodHere() const { return m_PincerRodHere; }
398  std::vector<double> vecPincerRodAzimuth() const { return m_vecPincerRodAzimuth; }
401  double pincerEnvWidth() const { return m_PincerEnvWidth; }
402  double pincerEnvHeight() const { return m_PincerEnvHeight; }
403  double pincerEnvLength() const { return m_PincerEnvLength; }
404  std::vector<double> vecPincerEnvZOff() const { return m_vecPincerEnvZOff; }
405 
408  double pincerBlkLength() const { return m_PincerBlkLength; }
409 
411  double pincerShimHeight() const { return m_PincerShimHeight; }
414  double pincerShim1Width() const { return m_PincerShim1Width; }
415  double pincerShim2Width() const { return m_PincerShim2Width; }
416 
419  double pincerCutWidth() const { return m_PincerCutWidth; }
420  double pincerCutHeight() const { return m_PincerCutHeight; }
421 
422 protected:
423 private:
424  void web(unsigned int iWeb,
425  double bWeb,
426  double BWeb,
427  double LWeb,
428  double theta,
429  const Pt3D& corner,
430  const DDLogicalPart& logPar,
431  double& zee,
432  double side,
433  double front,
434  double delta,
435  DDCompactView& cpv);
436 
437  std::string m_idNameSpace; //Namespace of this and ALL sub-parts
438 
439  // Barrel volume
440  std::string m_BarName; // Barrel volume name
441  std::string m_BarMat; // Barrel material name
442  std::vector<double> m_vecBarZPts; // Barrel list of z pts
443  std::vector<double> m_vecBarRMin; // Barrel list of rMin pts
444  std::vector<double> m_vecBarRMax; // Barrel list of rMax pts
445  std::vector<double> m_vecBarTran; // Barrel translation
446  std::vector<double> m_vecBarRota; // Barrel rotation
447  std::vector<double> m_vecBarRota2; // 2nd Barrel rotation
448  std::vector<double> m_vecBarRota3; // 2nd Barrel rotation
449  double m_BarPhiLo; // Barrel phi lo
450  double m_BarPhiHi; // Barrel phi hi
451  double m_BarHere; // Barrel presence flag
452 
453  // Supermodule volume
454  std::string m_SpmName; // Supermodule volume name
455  std::string m_SpmMat; // Supermodule material name
456  std::vector<double> m_vecSpmZPts; // Supermodule list of z pts
457  std::vector<double> m_vecSpmRMin; // Supermodule list of rMin pts
458  std::vector<double> m_vecSpmRMax; // Supermodule list of rMax pts
459  std::vector<double> m_vecSpmTran; // Supermodule translation
460  std::vector<double> m_vecSpmRota; // Supermodule rotation
461  std::vector<double> m_vecSpmBTran; // Base Supermodule translation
462  std::vector<double> m_vecSpmBRota; // Base Supermodule rotation
463  unsigned int m_SpmNPerHalf; // # Supermodules per half detector
464  double m_SpmLowPhi; // Low phi value of base supermodule
465  double m_SpmDelPhi; // Delta phi value of base supermodule
466  double m_SpmPhiOff; // Phi offset value supermodule
467  std::vector<double> m_vecSpmHere; // Bit saying if a supermodule is present or not
468  std::string m_SpmCutName; // Name of cut box
469  double m_SpmCutThick; // Box thickness
470  int m_SpmCutShow; // Non-zero means show the box on display (testing only)
471  std::vector<double> m_vecSpmCutTM; // Translation for minus phi cut box
472  std::vector<double> m_vecSpmCutTP; // Translation for plus phi cut box
473  double m_SpmCutRM; // Rotation for minus phi cut box
474  double m_SpmCutRP; // Rotation for plus phi cut box
475  double m_SpmExpThick; // Thickness (x) of supermodule expansion box
476  double m_SpmExpWide; // Width (y) of supermodule expansion box
477  double m_SpmExpYOff; // Offset (y) of supermodule expansion box
478  std::string m_SpmSideName; // Supermodule Side Plate volume name
479  std::string m_SpmSideMat; // Supermodule Side Plate material name
480  double m_SpmSideHigh; // Side plate height
481  double m_SpmSideThick; // Side plate thickness
482  double m_SpmSideYOffM; // Side plate Y offset on minus phi side
483  double m_SpmSideYOffP; // Side plate Y offset on plus phi side
484 
485  double m_NomCryDimAF; // Nominal crystal AF
486  double m_NomCryDimLZ; // Nominal crystal LZ
487  std::vector<double> m_vecNomCryDimBF; // Nominal crystal BF
488  std::vector<double> m_vecNomCryDimCF; // Nominal crystal CF
489  std::vector<double> m_vecNomCryDimAR; // Nominal crystal AR
490  std::vector<double> m_vecNomCryDimBR; // Nominal crystal BR
491  std::vector<double> m_vecNomCryDimCR; // Nominal crystal CR
492 
493  double m_UnderAF; // undershoot of AF
494  double m_UnderLZ; // undershoot of LZ
495  double m_UnderBF; // undershoot of BF
496  double m_UnderCF; // undershoot of CF
497  double m_UnderAR; // undershoot of AR
498  double m_UnderBR; // undershoot of BR
499  double m_UnderCR; // undershoot of CR
500 
501  double m_WallThAlv; // alveoli wall thickness
502  double m_WrapThAlv; // wrapping thickness
503  double m_ClrThAlv; // clearance thickness (nominal)
504  std::vector<double> m_vecGapAlvEta; // Extra clearance after each alveoli perp to crystal axis
505 
506  double m_WallFrAlv; // alveoli wall frontage
507  double m_WrapFrAlv; // wrapping frontage
508  double m_ClrFrAlv; // clearance frontage (nominal)
509 
510  double m_WallReAlv; // alveoli wall rearage
511  double m_WrapReAlv; // wrapping rearage
512  double m_ClrReAlv; // clearance rearage (nominal)
513 
514  unsigned int m_NCryTypes; // number of crystal shapes
515  unsigned int m_NCryPerAlvEta; // number of crystals in eta per alveolus
516 
517  std::string m_CryName; // string name of crystal volume
518  std::string m_ClrName; // string name of clearance volume
519  std::string m_WrapName; // string name of wrap volume
520  std::string m_WallName; // string name of wall volume
521 
522  std::string m_CryMat; // string name of crystal material
523  std::string m_ClrMat; // string name of clearance material
524  std::string m_WrapMat; // string name of wrap material
525  std::string m_WallMat; // string name of wall material
526 
527  std::string m_capName; // Capsule
528  double m_capHere; //
530  double m_capXSize; //
531  double m_capYSize; //
532  double m_capThick; //
533 
534  std::string m_CERName; // Ceramic
536  double m_CERXSize; //
537  double m_CERYSize; //
538  double m_CERThick; //
539 
540  std::string m_BSiName; // Bulk Silicon
542  double m_BSiXSize; //
543  double m_BSiYSize; //
544  double m_BSiThick; //
545 
548  double m_APDSide; //
549  double m_APDThick; //
550  double m_APDZ; //
551  double m_APDX1; //
552  double m_APDX2; //
553 
554  std::string m_ATJName; // After-The-Junction
556  double m_ATJThick; //
557 
558  std::string m_SGLName; // APD-Silicone glue
560  double m_SGLThick; //
561 
562  std::string m_AGLName; // APD-Glue
564  double m_AGLThick; //
565 
566  std::string m_ANDName; // APD-Non-Depleted
568  double m_ANDThick; //
569 
570  double m_WebHere; // here flag
571  std::string m_WebPlName; // string name of web plate volume
572  std::string m_WebClrName; // string name of web clearance volume
573  std::string m_WebPlMat; // string name of web material
574  std::string m_WebClrMat; // string name of web clearance material
575  std::vector<double> m_vecWebPlTh; // Thickness of web plates
576  std::vector<double> m_vecWebClrTh; // Thickness of total web clearance
577  std::vector<double> m_vecWebLength; // Length of web plate
578 
579  double m_IlyHere; // here flag
580  std::string m_IlyName; // string name of inner layer volume
581  double m_IlyPhiLow; // low phi of volumes
582  double m_IlyDelPhi; // delta phi of ily
583  std::vector<std::string> m_vecIlyMat; // materials of inner layer volumes
584  std::vector<double> m_vecIlyThick; // Thicknesses of inner layer volumes
585 
586  std::string m_IlyPipeName; // Cooling pipes
587  double m_IlyPipeHere; //
589  double m_IlyPipeOD; //
590  double m_IlyPipeID; //
591  std::vector<double> m_vecIlyPipeLength; //
592  std::vector<double> m_vecIlyPipeType; //
593  std::vector<double> m_vecIlyPipePhi; //
594  std::vector<double> m_vecIlyPipeZ; //
595 
597  double m_IlyPTMHere; //
599  double m_IlyPTMWidth; //
600  double m_IlyPTMLength; //
601  double m_IlyPTMHeight; //
602  std::vector<double> m_vecIlyPTMZ; //
603  std::vector<double> m_vecIlyPTMPhi; //
604 
606  double m_IlyFanOutHere; //
608  double m_IlyFanOutWidth; //
609  double m_IlyFanOutLength; //
610  double m_IlyFanOutHeight; //
611  std::vector<double> m_vecIlyFanOutZ; //
612  std::vector<double> m_vecIlyFanOutPhi; //
615  double m_IlyDiffOff; //
616  double m_IlyDiffLength; //
617  std::string m_IlyBndlName; // Fiber bundle
619  double m_IlyBndlOff; //
620  double m_IlyBndlLength; //
623  double m_IlyFEMWidth; //
624  double m_IlyFEMLength; //
625  double m_IlyFEMHeight; //
626  std::vector<double> m_vecIlyFEMZ; //
627  std::vector<double> m_vecIlyFEMPhi; //
628 
629  std::string m_HawRName; // string name of half-alveolar wedge
630  std::string m_FawName; // string name of full-alveolar wedge
631  double m_FawHere; // here flag
632  double m_HawRHBIG; // height at big end of half alveolar wedge
633  double m_HawRhsml; // height at small end of half alveolar wedge
634  double m_HawRCutY; // x dim of hawR cut box
635  double m_HawRCutZ; // y dim of hawR cut box
636  double m_HawRCutDelY; // y offset of hawR cut box from top of HAW
637  double m_HawYOffCry; // Y offset of crystal wrt HAW at front
638  unsigned int m_NFawPerSupm; // Number of Full Alv. Wedges per supermodule
639  double m_FawPhiOff; // Phi offset for FAW placement
640  double m_FawDelPhi; // Phi delta for FAW placement
641  double m_FawPhiRot; // Phi rotation of FAW about own axis prior to placement
642  double m_FawRadOff; // Radial offset for FAW placement
643 
644  double m_GridHere; // here flag
645  std::string m_GridName; // Grid name
646  std::string m_GridMat; // Grid material
647  double m_GridThick; // Grid Thickness
648 
649  double m_BackXOff; //
650  double m_BackYOff; //
651 
652  double m_BackHere; // here flag
654  double m_BackSideHere; //
655  double m_BackSideLength; //
656  double m_BackSideHeight; //
657  double m_BackSideWidth; //
658  double m_BackSideYOff1; //
659  double m_BackSideYOff2; //
660  double m_BackSideAngle; //
663  double m_BackPlateHere; //
664  double m_BackPlateLength; //
665  double m_BackPlateThick; //
666  double m_BackPlateWidth; //
669  double m_BackPlate2Thick; //
672  double m_GrilleHere; //
673  double m_GrilleThick; //
674  double m_GrilleWidth; //
675  double m_GrilleZSpace; //
677  std::vector<double> m_vecGrilleHeight; //
678  std::vector<double> m_vecGrilleZOff; //
679 
680  std::string m_GrEdgeSlotName; // Slots in Grille
682  double m_GrEdgeSlotHere; //
684  double m_GrEdgeSlotWidth; //
685 
686  std::string m_GrMidSlotName; // Slots in Grille
688  double m_GrMidSlotHere; //
689  double m_GrMidSlotWidth; //
690  double m_GrMidSlotXOff; //
691  std::vector<double> m_vecGrMidSlotHeight; //
692 
693  double m_BackPipeHere; // here flag
695  std::vector<double> m_vecBackPipeDiam; // pipes
696  std::vector<double> m_vecBackPipeThick; // pipes
699 
700  std::vector<std::string> m_vecBackCoolName; // cooling circuits
701  double m_BackCoolHere; // here flag
702  double m_BackCoolBarHere; // here flag
709  std::string m_BackCoolBarSSName; // cooling bar tubing
712  std::string m_BackCoolBarWaName; // cooling bar water
715  double m_BackCoolVFEHere; // here flag
720  std::vector<double> m_vecBackVFELyrThick; //
721  std::vector<std::string> m_vecBackVFELyrName; //
722  std::vector<std::string> m_vecBackVFELyrMat; //
723  std::vector<double> m_vecBackCoolNSec; //
724  std::vector<double> m_vecBackCoolSecSep; //
725  std::vector<double> m_vecBackCoolNPerSec; //
726  double m_BackMiscHere; // here flag
727  std::vector<double> m_vecBackMiscThick; // misc materials
728  std::vector<std::string> m_vecBackMiscName; //
729  std::vector<std::string> m_vecBackMiscMat; //
730  double m_BackCBStdSep; //
731 
732  double m_PatchPanelHere; // here flag
734  std::vector<double> m_vecPatchPanelThick; // patch panel materials
735  std::vector<std::string> m_vecPatchPanelNames; //
736  std::vector<std::string> m_vecPatchPanelMat; //
737 
738  double m_BackCoolTankHere; // here flag
749 
750  double m_DryAirTubeHere; // here flag
751  std::string m_DryAirTubeName; // dry air tube
752  unsigned int m_MBCoolTubeNum; //
756  double m_MBCoolTubeHere; // here flag
757  std::string m_MBCoolTubeName; // mothr bd cooling tube
761  double m_MBManifHere; // here flag
762  std::string m_MBManifName; //mother bd manif
763  double m_MBManifInnDiam; //
764  double m_MBManifOutDiam; //
766  double m_MBLyrHere; // here flag
767  std::vector<double> m_vecMBLyrThick; // mother bd lyrs
768  std::vector<std::string> m_vecMBLyrName; //
769  std::vector<std::string> m_vecMBLyrMat; //
770 
771  //-------------------------------------------------------------------
772 
773  double m_PincerRodHere; // here flag
776  std::vector<double> m_vecPincerRodAzimuth; //
777 
778  std::string m_PincerEnvName; // pincer envelope
780  double m_PincerEnvWidth; //
781  double m_PincerEnvHeight; //
782  double m_PincerEnvLength; //
783  std::vector<double> m_vecPincerEnvZOff; //
784 
785  std::string m_PincerBlkName; // pincer block
787  double m_PincerBlkLength; //
788 
795 
796  std::string m_PincerCutName; // pincer block
798  double m_PincerCutWidth; //
799  double m_PincerCutHeight; //
800 };
801 
802 namespace std {}
803 using namespace std;
804 
806  : m_idNameSpace(""),
807  m_BarName(""),
808  m_BarMat(""),
809  m_vecBarZPts(),
810  m_vecBarRMin(),
811  m_vecBarRMax(),
812  m_vecBarTran(),
813  m_vecBarRota(),
814  m_vecBarRota2(),
815  m_vecBarRota3(),
816  m_BarPhiLo(0),
817  m_BarPhiHi(0),
818  m_BarHere(0),
819  m_SpmName(""),
820  m_SpmMat(""),
821  m_vecSpmZPts(),
822  m_vecSpmRMin(),
823  m_vecSpmRMax(),
824  m_vecSpmTran(),
825  m_vecSpmRota(),
826  m_vecSpmBTran(),
827  m_vecSpmBRota(),
828  m_SpmNPerHalf(0),
829  m_SpmLowPhi(0),
830  m_SpmDelPhi(0),
831  m_SpmPhiOff(0),
832  m_vecSpmHere(),
833  m_SpmCutName(""),
834  m_SpmCutThick(0),
835  m_SpmCutShow(0),
836  m_vecSpmCutTM(),
837  m_vecSpmCutTP(),
838  m_SpmCutRM(0),
839  m_SpmCutRP(0),
840  m_SpmExpThick(0),
841  m_SpmExpWide(0),
842  m_SpmExpYOff(0),
843  m_SpmSideName(""),
844  m_SpmSideMat(""),
845  m_SpmSideHigh(0),
846  m_SpmSideThick(0),
847  m_SpmSideYOffM(0),
848  m_SpmSideYOffP(0),
849  m_NomCryDimAF(0),
850  m_NomCryDimLZ(0),
856  m_UnderAF(0),
857  m_UnderLZ(0),
858  m_UnderBF(0),
859  m_UnderCF(0),
860  m_UnderAR(0),
861  m_UnderBR(0),
862  m_UnderCR(0),
863  m_WallThAlv(0),
864  m_WrapThAlv(0),
865  m_ClrThAlv(0),
866  m_vecGapAlvEta(),
867  m_WallFrAlv(0),
868  m_WrapFrAlv(0),
869  m_ClrFrAlv(0),
870  m_WallReAlv(0),
871  m_WrapReAlv(0),
872  m_ClrReAlv(0),
873  m_NCryTypes(0),
874  m_NCryPerAlvEta(0),
875  m_CryName(""),
876  m_ClrName(""),
877  m_WrapName(""),
878  m_WallName(""),
879  m_CryMat(""),
880  m_ClrMat(""),
881  m_WrapMat(""),
882  m_WallMat(""),
883 
884  m_capName(""),
885  m_capHere(0),
886  m_capMat(""),
887  m_capXSize(0),
888  m_capYSize(0),
889  m_capThick(0),
890 
891  m_CERName(""),
892  m_CERMat(""),
893  m_CERXSize(0),
894  m_CERYSize(0),
895  m_CERThick(0),
896 
897  m_BSiName(""),
898  m_BSiMat(""),
899  m_BSiXSize(0),
900  m_BSiYSize(0),
901  m_BSiThick(0),
902 
903  m_APDName(""),
904  m_APDMat(""),
905  m_APDSide(0),
906  m_APDThick(0),
907  m_APDZ(0),
908  m_APDX1(0),
909  m_APDX2(0),
910 
911  m_ATJName(""),
912  m_ATJMat(""),
913  m_ATJThick(0),
914 
915  m_SGLName(""),
916  m_SGLMat(""),
917  m_SGLThick(0),
918 
919  m_AGLName(""),
920  m_AGLMat(""),
921  m_AGLThick(0),
922 
923  m_ANDName(""),
924  m_ANDMat(""),
925  m_ANDThick(0),
926 
927  m_WebHere(0),
928  m_WebPlName(""),
929  m_WebClrName(""),
930  m_WebPlMat(""),
931  m_WebClrMat(""),
932  m_vecWebPlTh(),
933  m_vecWebClrTh(),
934  m_vecWebLength(),
935  m_IlyHere(0),
936  m_IlyName(),
937  m_IlyPhiLow(0),
938  m_IlyDelPhi(0),
939  m_vecIlyMat(),
940  m_vecIlyThick(),
941  m_IlyPipeName(""),
942  m_IlyPipeHere(0),
943  m_IlyPipeMat(""),
944  m_IlyPipeOD(0),
945  m_IlyPipeID(0),
948  m_vecIlyPipePhi(),
949  m_vecIlyPipeZ(),
950  m_IlyPTMName(""),
951  m_IlyPTMHere(0),
952  m_IlyPTMMat(""),
953  m_IlyPTMWidth(0),
954  m_IlyPTMLength(0),
955  m_IlyPTMHeight(0),
956  m_vecIlyPTMZ(),
957  m_vecIlyPTMPhi(),
958  m_IlyFanOutName(""),
959  m_IlyFanOutHere(0),
960  m_IlyFanOutMat(""),
961  m_IlyFanOutWidth(0),
964  m_vecIlyFanOutZ(),
966  m_IlyDiffName(""),
967  m_IlyDiffMat(""),
968  m_IlyDiffOff(0),
969  m_IlyDiffLength(0),
970  m_IlyBndlName(""),
971  m_IlyBndlMat(""),
972  m_IlyBndlOff(0),
973  m_IlyBndlLength(0),
974  m_IlyFEMName(""),
975  m_IlyFEMMat(""),
976  m_IlyFEMWidth(0),
977  m_IlyFEMLength(0),
978  m_IlyFEMHeight(0),
979  m_vecIlyFEMZ(),
980  m_vecIlyFEMPhi(),
981  m_HawRName(""),
982  m_FawName(""),
983  m_FawHere(0),
984  m_HawRHBIG(0),
985  m_HawRhsml(0),
986  m_HawRCutY(0),
987  m_HawRCutZ(0),
988  m_HawRCutDelY(0),
989  m_HawYOffCry(0),
990  m_NFawPerSupm(0),
991  m_FawPhiOff(0),
992  m_FawDelPhi(0),
993  m_FawPhiRot(0),
994  m_FawRadOff(0),
995  m_GridHere(0),
996  m_GridName(""),
997  m_GridMat(""),
998  m_GridThick(0),
999  m_BackXOff(0),
1000  m_BackYOff(0),
1001  m_BackHere(0),
1002  m_BackSideName(""),
1003  m_BackSideHere(0),
1004  m_BackSideLength(0),
1005  m_BackSideHeight(0),
1006  m_BackSideWidth(0),
1007  m_BackSideYOff1(0),
1008  m_BackSideYOff2(0),
1009  m_BackSideAngle(0),
1010  m_BackSideMat(""),
1011  m_BackPlateName(""),
1012  m_BackPlateHere(0),
1013  m_BackPlateLength(0),
1014  m_BackPlateThick(0),
1015  m_BackPlateWidth(0),
1016  m_BackPlateMat(""),
1017  m_BackPlate2Name(""),
1018  m_BackPlate2Thick(0),
1019  m_BackPlate2Mat(""),
1020  m_GrilleName(""),
1021  m_GrilleHere(0),
1022  m_GrilleThick(0),
1023  m_GrilleWidth(0),
1024  m_GrilleZSpace(0),
1025  m_GrilleMat(""),
1027  m_vecGrilleZOff(),
1028  m_GrEdgeSlotName(""),
1029  m_GrEdgeSlotMat(""),
1030  m_GrEdgeSlotHere(0),
1031  m_GrEdgeSlotHeight(0),
1032  m_GrEdgeSlotWidth(0),
1033  m_GrMidSlotName(""),
1034  m_GrMidSlotMat(""),
1035  m_GrMidSlotHere(0),
1036  m_GrMidSlotWidth(0),
1037  m_GrMidSlotXOff(0),
1039  m_BackPipeHere(0),
1040  m_BackPipeName(""),
1043  m_BackPipeMat(""),
1044  m_BackPipeWaterMat(""),
1045 
1047  m_BackCoolHere(0),
1048  m_BackCoolBarHere(0),
1049  m_BackCoolBarWidth(0),
1051  m_BackCoolMat(""),
1052  m_BackCoolBarName(""),
1053  m_BackCoolBarThick(0),
1054  m_BackCoolBarMat(""),
1055  m_BackCoolBarSSName(""),
1057  m_BackCoolBarSSMat(""),
1058  m_BackCoolBarWaName(""),
1060  m_BackCoolBarWaMat(""),
1061  m_BackCoolVFEHere(0),
1062  m_BackCoolVFEName(""),
1063  m_BackCoolVFEMat(""),
1064  m_BackVFEName(""),
1065  m_BackVFEMat(""),
1072 
1073  m_BackMiscHere(0),
1076  m_vecBackMiscMat(),
1077  m_BackCBStdSep(0),
1078  m_PatchPanelHere(0),
1079  m_PatchPanelName(""),
1083  m_BackCoolTankHere(0),
1084  m_BackCoolTankName(""),
1087  m_BackCoolTankMat(""),
1090  m_BackCoolTankWaMat(""),
1091  m_BackBracketName(""),
1093  m_BackBracketMat(""),
1094 
1095  m_DryAirTubeHere(0),
1096  m_DryAirTubeName(""),
1097  m_MBCoolTubeNum(0),
1100  m_DryAirTubeMat(""),
1101  m_MBCoolTubeHere(0),
1102  m_MBCoolTubeName(""),
1105  m_MBCoolTubeMat(""),
1106  m_MBManifHere(0),
1107  m_MBManifName(""),
1108  m_MBManifInnDiam(0),
1109  m_MBManifOutDiam(0),
1110  m_MBManifMat(""),
1111  m_MBLyrHere(0),
1112  m_vecMBLyrThick(0),
1113  m_vecMBLyrName(),
1114  m_vecMBLyrMat(),
1115 
1116  m_PincerRodHere(0),
1117  m_PincerRodName(""),
1118  m_PincerRodMat(""),
1120  m_PincerEnvName(""),
1121  m_PincerEnvMat(""),
1122  m_PincerEnvWidth(0),
1123  m_PincerEnvHeight(0),
1124  m_PincerEnvLength(0),
1126  m_PincerBlkName(""),
1127  m_PincerBlkMat(""),
1128  m_PincerBlkLength(0),
1129  m_PincerShim1Name(""),
1130  m_PincerShimHeight(0),
1131  m_PincerShim2Name(""),
1132  m_PincerShimMat(""),
1133  m_PincerShim1Width(0),
1134  m_PincerShim2Width(0),
1135  m_PincerCutName(""),
1136  m_PincerCutMat(""),
1137  m_PincerCutWidth(0),
1139 
1140 {
1141  LogDebug("EcalGeom") << "DDEcalBarrelAlgo info: Creating an instance";
1142 }
1143 
1145 
1147  const DDVectorArguments& vArgs,
1148  const DDMapArguments& /*mArgs*/,
1149  const DDStringArguments& sArgs,
1150  const DDStringVectorArguments& vsArgs) {
1151  LogDebug("EcalGeom") << "DDEcalBarrelAlgo info: Initialize";
1153  // TRICK!
1154  m_idNameSpace = parent().name().ns();
1155  // barrel parent volume
1156  m_BarName = sArgs["BarName"];
1157  m_BarMat = sArgs["BarMat"];
1158  m_vecBarZPts = vArgs["BarZPts"];
1159  m_vecBarRMin = vArgs["BarRMin"];
1160  m_vecBarRMax = vArgs["BarRMax"];
1161  m_vecBarTran = vArgs["BarTran"];
1162  m_vecBarRota = vArgs["BarRota"];
1163  m_vecBarRota2 = vArgs["BarRota2"];
1164  m_vecBarRota3 = vArgs["BarRota3"];
1165  m_BarPhiLo = nArgs["BarPhiLo"];
1166  m_BarPhiHi = nArgs["BarPhiHi"];
1167  m_BarHere = nArgs["BarHere"];
1168 
1169  m_SpmName = sArgs["SpmName"];
1170  m_SpmMat = sArgs["SpmMat"];
1171  m_vecSpmZPts = vArgs["SpmZPts"];
1172  m_vecSpmRMin = vArgs["SpmRMin"];
1173  m_vecSpmRMax = vArgs["SpmRMax"];
1174  m_vecSpmTran = vArgs["SpmTran"];
1175  m_vecSpmRota = vArgs["SpmRota"];
1176  m_vecSpmBTran = vArgs["SpmBTran"];
1177  m_vecSpmBRota = vArgs["SpmBRota"];
1178  m_SpmNPerHalf = static_cast<unsigned int>(nArgs["SpmNPerHalf"]);
1179  m_SpmLowPhi = nArgs["SpmLowPhi"];
1180  m_SpmDelPhi = nArgs["SpmDelPhi"];
1181  m_SpmPhiOff = nArgs["SpmPhiOff"];
1182  m_vecSpmHere = vArgs["SpmHere"];
1183  m_SpmCutName = sArgs["SpmCutName"];
1184  m_SpmCutThick = nArgs["SpmCutThick"];
1185  m_SpmCutShow = int(nArgs["SpmCutShow"]);
1186  m_vecSpmCutTM = vArgs["SpmCutTM"];
1187  m_vecSpmCutTP = vArgs["SpmCutTP"];
1188  m_SpmCutRM = nArgs["SpmCutRM"];
1189  m_SpmCutRP = nArgs["SpmCutRP"];
1190  m_SpmExpThick = nArgs["SpmExpThick"];
1191  m_SpmExpWide = nArgs["SpmExpWide"];
1192  m_SpmExpYOff = nArgs["SpmExpYOff"];
1193  m_SpmSideName = sArgs["SpmSideName"];
1194  m_SpmSideMat = sArgs["SpmSideMat"];
1195  m_SpmSideHigh = nArgs["SpmSideHigh"];
1196  m_SpmSideThick = nArgs["SpmSideThick"];
1197  m_SpmSideYOffM = nArgs["SpmSideYOffM"];
1198  m_SpmSideYOffP = nArgs["SpmSideYOffP"];
1199 
1200  m_NomCryDimAF = nArgs["NomCryDimAF"];
1201  m_NomCryDimLZ = nArgs["NomCryDimLZ"];
1202  m_vecNomCryDimBF = vArgs["NomCryDimBF"];
1203  m_vecNomCryDimCF = vArgs["NomCryDimCF"];
1204  m_vecNomCryDimAR = vArgs["NomCryDimAR"];
1205  m_vecNomCryDimBR = vArgs["NomCryDimBR"];
1206  m_vecNomCryDimCR = vArgs["NomCryDimCR"];
1207 
1208  m_UnderAF = nArgs["UnderAF"];
1209  m_UnderLZ = nArgs["UnderLZ"];
1210  m_UnderBF = nArgs["UnderBF"];
1211  m_UnderCF = nArgs["UnderCF"];
1212  m_UnderAR = nArgs["UnderAR"];
1213  m_UnderBR = nArgs["UnderBR"];
1214  m_UnderCR = nArgs["UnderCR"];
1215 
1216  m_WallThAlv = nArgs["WallThAlv"];
1217  m_WrapThAlv = nArgs["WrapThAlv"];
1218  m_ClrThAlv = nArgs["ClrThAlv"];
1219  m_vecGapAlvEta = vArgs["GapAlvEta"];
1220 
1221  m_WallFrAlv = nArgs["WallFrAlv"];
1222  m_WrapFrAlv = nArgs["WrapFrAlv"];
1223  m_ClrFrAlv = nArgs["ClrFrAlv"];
1224 
1225  m_WallReAlv = nArgs["WallReAlv"];
1226  m_WrapReAlv = nArgs["WrapReAlv"];
1227  m_ClrReAlv = nArgs["ClrReAlv"];
1228 
1229  m_NCryTypes = static_cast<unsigned int>(nArgs["NCryTypes"]);
1230  m_NCryPerAlvEta = static_cast<unsigned int>(nArgs["NCryPerAlvEta"]);
1231 
1232  m_CryName = sArgs["CryName"];
1233  m_ClrName = sArgs["ClrName"];
1234  m_WrapName = sArgs["WrapName"];
1235  m_WallName = sArgs["WallName"];
1236 
1237  m_CryMat = sArgs["CryMat"];
1238  m_ClrMat = sArgs["ClrMat"];
1239  m_WrapMat = sArgs["WrapMat"];
1240  m_WallMat = sArgs["WallMat"];
1241 
1242  m_capName = sArgs["CapName"];
1243  m_capHere = nArgs["CapHere"];
1244  m_capMat = sArgs["CapMat"];
1245  m_capXSize = nArgs["CapXSize"];
1246  m_capYSize = nArgs["CapYSize"];
1247  m_capThick = nArgs["CapThick"];
1248 
1249  m_CERName = sArgs["CerName"];
1250  m_CERMat = sArgs["CerMat"];
1251  m_CERXSize = nArgs["CerXSize"];
1252  m_CERYSize = nArgs["CerYSize"];
1253  m_CERThick = nArgs["CerThick"];
1254 
1255  m_BSiName = sArgs["BSiName"];
1256  m_BSiMat = sArgs["BSiMat"];
1257  m_BSiXSize = nArgs["BSiXSize"];
1258  m_BSiYSize = nArgs["BSiYSize"];
1259  m_BSiThick = nArgs["BSiThick"];
1260 
1261  m_APDName = sArgs["APDName"];
1262  m_APDMat = sArgs["APDMat"];
1263  m_APDSide = nArgs["APDSide"];
1264  m_APDThick = nArgs["APDThick"];
1265  m_APDZ = nArgs["APDZ"];
1266  m_APDX1 = nArgs["APDX1"];
1267  m_APDX2 = nArgs["APDX2"];
1268 
1269  m_ATJName = sArgs["ATJName"];
1270  m_ATJMat = sArgs["ATJMat"];
1271  m_ATJThick = nArgs["ATJThick"];
1272 
1273  m_SGLName = sArgs["SGLName"];
1274  m_SGLMat = sArgs["SGLMat"];
1275  m_SGLThick = nArgs["SGLThick"];
1276 
1277  m_AGLName = sArgs["AGLName"];
1278  m_AGLMat = sArgs["AGLMat"];
1279  m_AGLThick = nArgs["AGLThick"];
1280 
1281  m_ANDName = sArgs["ANDName"];
1282  m_ANDMat = sArgs["ANDMat"];
1283  m_ANDThick = nArgs["ANDThick"];
1284 
1285  m_WebHere = nArgs["WebHere"];
1286  m_WebPlName = sArgs["WebPlName"];
1287  m_WebClrName = sArgs["WebClrName"];
1288  m_WebPlMat = sArgs["WebPlMat"];
1289  m_WebClrMat = sArgs["WebClrMat"];
1290  m_vecWebPlTh = vArgs["WebPlTh"];
1291  m_vecWebClrTh = vArgs["WebClrTh"];
1292  m_vecWebLength = vArgs["WebLength"];
1293 
1294  m_IlyHere = nArgs["IlyHere"];
1295  m_IlyName = sArgs["IlyName"];
1296  m_IlyPhiLow = nArgs["IlyPhiLow"];
1297  m_IlyDelPhi = nArgs["IlyDelPhi"];
1298  m_vecIlyMat = vsArgs["IlyMat"];
1299  m_vecIlyThick = vArgs["IlyThick"];
1300 
1301  m_IlyPipeName = sArgs["IlyPipeName"];
1302  m_IlyPipeHere = nArgs["IlyPipeHere"];
1303  m_IlyPipeMat = sArgs["IlyPipeMat"];
1304  m_IlyPipeOD = nArgs["IlyPipeOD"];
1305  m_IlyPipeID = nArgs["IlyPipeID"];
1306  m_vecIlyPipeLength = vArgs["IlyPipeLength"];
1307  m_vecIlyPipeType = vArgs["IlyPipeType"];
1308  m_vecIlyPipePhi = vArgs["IlyPipePhi"];
1309  m_vecIlyPipeZ = vArgs["IlyPipeZ"];
1310 
1311  m_IlyPTMName = sArgs["IlyPTMName"];
1312  m_IlyPTMHere = nArgs["IlyPTMHere"];
1313  m_IlyPTMMat = sArgs["IlyPTMMat"];
1314  m_IlyPTMWidth = nArgs["IlyPTMWidth"];
1315  m_IlyPTMLength = nArgs["IlyPTMLength"];
1316  m_IlyPTMHeight = nArgs["IlyPTMHeight"];
1317  m_vecIlyPTMZ = vArgs["IlyPTMZ"];
1318  m_vecIlyPTMPhi = vArgs["IlyPTMPhi"];
1319 
1320  m_IlyFanOutName = sArgs["IlyFanOutName"];
1321  m_IlyFanOutHere = nArgs["IlyFanOutHere"];
1322  m_IlyFanOutMat = sArgs["IlyFanOutMat"];
1323  m_IlyFanOutWidth = nArgs["IlyFanOutWidth"];
1324  m_IlyFanOutLength = nArgs["IlyFanOutLength"];
1325  m_IlyFanOutHeight = nArgs["IlyFanOutHeight"];
1326  m_vecIlyFanOutZ = vArgs["IlyFanOutZ"];
1327  m_vecIlyFanOutPhi = vArgs["IlyFanOutPhi"];
1328  m_IlyDiffName = sArgs["IlyDiffName"];
1329  m_IlyDiffMat = sArgs["IlyDiffMat"];
1330  m_IlyDiffOff = nArgs["IlyDiffOff"];
1331  m_IlyDiffLength = nArgs["IlyDiffLength"];
1332  m_IlyBndlName = sArgs["IlyBndlName"];
1333  m_IlyBndlMat = sArgs["IlyBndlMat"];
1334  m_IlyBndlOff = nArgs["IlyBndlOff"];
1335  m_IlyBndlLength = nArgs["IlyBndlLength"];
1336  m_IlyFEMName = sArgs["IlyFEMName"];
1337  m_IlyFEMMat = sArgs["IlyFEMMat"];
1338  m_IlyFEMWidth = nArgs["IlyFEMWidth"];
1339  m_IlyFEMLength = nArgs["IlyFEMLength"];
1340  m_IlyFEMHeight = nArgs["IlyFEMHeight"];
1341  m_vecIlyFEMZ = vArgs["IlyFEMZ"];
1342  m_vecIlyFEMPhi = vArgs["IlyFEMPhi"];
1343 
1344  m_HawRName = sArgs["HawRName"];
1345  m_FawName = sArgs["FawName"];
1346  m_FawHere = nArgs["FawHere"];
1347  m_HawRHBIG = nArgs["HawRHBIG"];
1348  m_HawRhsml = nArgs["HawRhsml"];
1349  m_HawRCutY = nArgs["HawRCutY"];
1350  m_HawRCutZ = nArgs["HawRCutZ"];
1351  m_HawRCutDelY = nArgs["HawRCutDelY"];
1352  m_HawYOffCry = nArgs["HawYOffCry"];
1353 
1354  m_NFawPerSupm = static_cast<unsigned int>(nArgs["NFawPerSupm"]);
1355  m_FawPhiOff = nArgs["FawPhiOff"];
1356  m_FawDelPhi = nArgs["FawDelPhi"];
1357  m_FawPhiRot = nArgs["FawPhiRot"];
1358  m_FawRadOff = nArgs["FawRadOff"];
1359 
1360  m_GridHere = nArgs["GridHere"];
1361  m_GridName = sArgs["GridName"];
1362  m_GridMat = sArgs["GridMat"];
1363  m_GridThick = nArgs["GridThick"];
1364 
1365  m_BackHere = nArgs["BackHere"];
1366  m_BackXOff = nArgs["BackXOff"];
1367  m_BackYOff = nArgs["BackYOff"];
1368  m_BackSideName = sArgs["BackSideName"];
1369  m_BackSideHere = nArgs["BackSideHere"];
1370  m_BackSideLength = nArgs["BackSideLength"];
1371  m_BackSideHeight = nArgs["BackSideHeight"];
1372  m_BackSideWidth = nArgs["BackSideWidth"];
1373  m_BackSideYOff1 = nArgs["BackSideYOff1"];
1374  m_BackSideYOff2 = nArgs["BackSideYOff2"];
1375  m_BackSideAngle = nArgs["BackSideAngle"];
1376  m_BackSideMat = sArgs["BackSideMat"];
1377  m_BackPlateName = sArgs["BackPlateName"];
1378  m_BackPlateHere = nArgs["BackPlateHere"];
1379  m_BackPlateLength = nArgs["BackPlateLength"];
1380  m_BackPlateThick = nArgs["BackPlateThick"];
1381  m_BackPlateWidth = nArgs["BackPlateWidth"];
1382  m_BackPlateMat = sArgs["BackPlateMat"];
1383  m_BackPlate2Name = sArgs["BackPlate2Name"];
1384  m_BackPlate2Thick = nArgs["BackPlate2Thick"];
1385  m_BackPlate2Mat = sArgs["BackPlate2Mat"];
1386  m_GrilleName = sArgs["GrilleName"];
1387  m_GrilleHere = nArgs["GrilleHere"];
1388  m_GrilleThick = nArgs["GrilleThick"];
1389  m_GrilleWidth = nArgs["GrilleWidth"];
1390  m_GrilleZSpace = nArgs["GrilleZSpace"];
1391  m_GrilleMat = sArgs["GrilleMat"];
1392  m_vecGrilleHeight = vArgs["GrilleHeight"];
1393  m_vecGrilleZOff = vArgs["GrilleZOff"];
1394 
1395  m_GrEdgeSlotName = sArgs["GrEdgeSlotName"];
1396  m_GrEdgeSlotMat = sArgs["GrEdgeSlotMat"];
1397  m_GrEdgeSlotHere = nArgs["GrEdgeSlotHere"];
1398  m_GrEdgeSlotHeight = nArgs["GrEdgeSlotHeight"];
1399  m_GrEdgeSlotWidth = nArgs["GrEdgeSlotWidth"];
1400  m_GrMidSlotName = sArgs["GrMidSlotName"];
1401  m_GrMidSlotMat = sArgs["GrMidSlotMat"];
1402  m_GrMidSlotHere = nArgs["GrMidSlotHere"];
1403  m_GrMidSlotWidth = nArgs["GrMidSlotWidth"];
1404  m_GrMidSlotXOff = nArgs["GrMidSlotXOff"];
1405  m_vecGrMidSlotHeight = vArgs["GrMidSlotHeight"];
1406 
1407  m_BackPipeHere = nArgs["BackPipeHere"];
1408  m_BackPipeName = sArgs["BackPipeName"];
1409  m_vecBackPipeDiam = vArgs["BackPipeDiam"];
1410  m_vecBackPipeThick = vArgs["BackPipeThick"];
1411  m_BackPipeMat = sArgs["BackPipeMat"];
1412  m_BackPipeWaterMat = sArgs["BackPipeWaterMat"];
1413 
1414  m_BackCoolHere = nArgs["BackCoolHere"];
1415  m_vecBackCoolName = vsArgs["BackCoolName"];
1416  m_BackCoolBarHere = nArgs["BackCoolBarHere"];
1417  m_BackCoolBarWidth = nArgs["BackCoolBarWidth"];
1418  m_BackCoolBarHeight = nArgs["BackCoolBarHeight"];
1419  m_BackCoolMat = sArgs["BackCoolMat"];
1420  m_BackCoolBarName = sArgs["BackCoolBarName"];
1421  m_BackCoolBarThick = nArgs["BackCoolBarThick"];
1422  m_BackCoolBarMat = sArgs["BackCoolBarMat"];
1423  m_BackCoolBarSSName = sArgs["BackCoolBarSSName"];
1424  m_BackCoolBarSSThick = nArgs["BackCoolBarSSThick"];
1425  m_BackCoolBarSSMat = sArgs["BackCoolBarSSMat"];
1426  m_BackCoolBarWaName = sArgs["BackCoolBarWaName"];
1427  m_BackCoolBarWaThick = nArgs["BackCoolBarWaThick"];
1428  m_BackCoolBarWaMat = sArgs["BackCoolBarWaMat"];
1429  m_BackCoolVFEHere = nArgs["BackCoolVFEHere"];
1430  m_BackCoolVFEName = sArgs["BackCoolVFEName"];
1431  m_BackCoolVFEMat = sArgs["BackCoolVFEMat"];
1432  m_BackVFEName = sArgs["BackVFEName"];
1433  m_BackVFEMat = sArgs["BackVFEMat"];
1434  m_vecBackVFELyrThick = vArgs["BackVFELyrThick"];
1435  m_vecBackVFELyrName = vsArgs["BackVFELyrName"];
1436  m_vecBackVFELyrMat = vsArgs["BackVFELyrMat"];
1437  m_vecBackCoolNSec = vArgs["BackCoolNSec"];
1438  m_vecBackCoolSecSep = vArgs["BackCoolSecSep"];
1439  m_vecBackCoolNPerSec = vArgs["BackCoolNPerSec"];
1440  m_BackCBStdSep = nArgs["BackCBStdSep"];
1441 
1442  m_BackMiscHere = nArgs["BackMiscHere"];
1443  m_vecBackMiscThick = vArgs["BackMiscThick"];
1444  m_vecBackMiscName = vsArgs["BackMiscName"];
1445  m_vecBackMiscMat = vsArgs["BackMiscMat"];
1446  m_PatchPanelHere = nArgs["PatchPanelHere"];
1447  m_vecPatchPanelThick = vArgs["PatchPanelThick"];
1448  m_vecPatchPanelNames = vsArgs["PatchPanelNames"];
1449  m_vecPatchPanelMat = vsArgs["PatchPanelMat"];
1450  m_PatchPanelName = sArgs["PatchPanelName"];
1451 
1452  m_BackCoolTankHere = nArgs["BackCoolTankHere"];
1453  m_BackCoolTankName = sArgs["BackCoolTankName"];
1454  m_BackCoolTankWidth = nArgs["BackCoolTankWidth"];
1455  m_BackCoolTankThick = nArgs["BackCoolTankThick"];
1456  m_BackCoolTankMat = sArgs["BackCoolTankMat"];
1457  m_BackCoolTankWaName = sArgs["BackCoolTankWaName"];
1458  m_BackCoolTankWaWidth = nArgs["BackCoolTankWaWidth"];
1459  m_BackCoolTankWaMat = sArgs["BackCoolTankWaMat"];
1460  m_BackBracketName = sArgs["BackBracketName"];
1461  m_BackBracketHeight = nArgs["BackBracketHeight"];
1462  m_BackBracketMat = sArgs["BackBracketMat"];
1463 
1464  m_DryAirTubeHere = nArgs["DryAirTubeHere"];
1465  m_DryAirTubeName = sArgs["DryAirTubeName"];
1466  m_MBCoolTubeNum = static_cast<unsigned int>(nArgs["MBCoolTubeNum"]);
1467  m_DryAirTubeInnDiam = nArgs["DryAirTubeInnDiam"];
1468  m_DryAirTubeOutDiam = nArgs["DryAirTubeOutDiam"];
1469  m_DryAirTubeMat = sArgs["DryAirTubeMat"];
1470  m_MBCoolTubeHere = nArgs["MBCoolTubeHere"];
1471  m_MBCoolTubeName = sArgs["MBCoolTubeName"];
1472  m_MBCoolTubeInnDiam = nArgs["MBCoolTubeInnDiam"];
1473  m_MBCoolTubeOutDiam = nArgs["MBCoolTubeOutDiam"];
1474  m_MBCoolTubeMat = sArgs["MBCoolTubeMat"];
1475  m_MBManifHere = nArgs["MBManifHere"];
1476  m_MBManifName = sArgs["MBManifName"];
1477  m_MBManifInnDiam = nArgs["MBManifInnDiam"];
1478  m_MBManifOutDiam = nArgs["MBManifOutDiam"];
1479  m_MBManifMat = sArgs["MBManifMat"];
1480  m_MBLyrHere = nArgs["MBLyrHere"];
1481  m_vecMBLyrThick = vArgs["MBLyrThick"];
1482  m_vecMBLyrName = vsArgs["MBLyrName"];
1483  m_vecMBLyrMat = vsArgs["MBLyrMat"];
1484 
1485  m_PincerRodHere = nArgs["PincerRodHere"];
1486  m_PincerRodName = sArgs["PincerRodName"];
1487  m_PincerRodMat = sArgs["PincerRodMat"];
1488  m_vecPincerRodAzimuth = vArgs["PincerRodAzimuth"];
1489  m_PincerEnvName = sArgs["PincerEnvName"];
1490  m_PincerEnvMat = sArgs["PincerEnvMat"];
1491  m_PincerEnvWidth = nArgs["PincerEnvWidth"];
1492  m_PincerEnvHeight = nArgs["PincerEnvHeight"];
1493  m_PincerEnvLength = nArgs["PincerEnvLength"];
1494  m_vecPincerEnvZOff = vArgs["PincerEnvZOff"];
1495  m_PincerBlkName = sArgs["PincerBlkName"];
1496  m_PincerBlkMat = sArgs["PincerBlkMat"];
1497  m_PincerBlkLength = nArgs["PincerBlkLength"];
1498  m_PincerShim1Name = sArgs["PincerShim1Name"];
1499  m_PincerShimHeight = nArgs["PincerShimHeight"];
1500  m_PincerShim2Name = sArgs["PincerShim2Name"];
1501  m_PincerShimMat = sArgs["PincerShimMat"];
1502  m_PincerShim1Width = nArgs["PincerShim1Width"];
1503  m_PincerShim2Width = nArgs["PincerShim2Width"];
1504  m_PincerCutName = sArgs["PincerCutName"];
1505  m_PincerCutMat = sArgs["PincerCutMat"];
1506  m_PincerCutWidth = nArgs["PincerCutWidth"];
1507  m_PincerCutHeight = nArgs["PincerCutHeight"];
1508 
1509  LogDebug("EcalGeom") << "DDEcalBarrelAlgo info: end initialize";
1510 }
1511 
1513 // DDEcalBarrelAlgo methods...
1515 
1517  LogDebug("EcalGeom") << "******** DDEcalBarrelAlgo execute!" << std::endl;
1518 
1519  if (barHere() != 0) {
1520  const unsigned int copyOne(1);
1521  const unsigned int copyTwo(2);
1522  // Barrel parent volume----------------------------------------------------------
1523  cpv.position(
1525  barMat(),
1528  parent().name(),
1529  copyOne,
1530  DDTranslation(vecBarTran()[0], vecBarTran()[1], vecBarTran()[2]),
1531  myrot(barName().name() + "Rot",
1532  Rota(Vec3(vecBarRota3()[0], vecBarRota3()[1], vecBarRota3()[2]), vecBarRota3()[3]) *
1533  Rota(Vec3(vecBarRota2()[0], vecBarRota2()[1], vecBarRota2()[2]), vecBarRota2()[3]) *
1534  Rota(Vec3(vecBarRota()[0], vecBarRota()[1], vecBarRota()[2]), vecBarRota()[3])));
1535  // End Barrel parent volume----------------------------------------------------------
1536 
1537  // Supermodule parent------------------------------------------------------------
1538 
1539  const DDName spmcut1ddname((0 != spmCutShow()) ? spmName() : ddname(m_SpmName + "CUT1"));
1540  const DDSolid ddspm(
1542 
1543  const unsigned int indx(vecSpmRMax().size() / 2);
1544 
1545  // Deal with the cut boxes first
1546  const DDSolid spmCutBox(DDSolidFactory::box(spmCutName(),
1547  1.05 * (vecSpmRMax()[indx] - vecSpmRMin()[indx]) / 2.,
1548  spmCutThick() / 2.,
1549  fabs(vecSpmZPts().back() - vecSpmZPts().front()) / 2. + 1 * mm));
1550  const std::vector<double>& cutBoxParms(spmCutBox.parameters());
1551  const DDLogicalPart spmCutLog(spmCutName(), spmMat(), spmCutBox);
1552 
1553  // Now the expansion box
1554  const double xExp(spmExpThick() / 2.);
1555  const double yExp(spmExpWide() / 2.);
1556  const double zExp(fabs(vecSpmZPts().back() - vecSpmZPts().front()) / 2.);
1557  const DDName expName(m_SpmName + "EXP");
1558  const DDSolid spmExpBox(DDSolidFactory::box(expName, xExp, yExp, zExp));
1559  const DDTranslation expTra(vecSpmRMax().back() - xExp, spmExpYOff(), vecSpmZPts().front() + zExp);
1560  const DDLogicalPart expLog(expName, spmMat(), spmExpBox);
1561 
1562  /* const DDName unionName ( ddname( m_SpmName + "UNI" ) ) ;
1563  if( 0 != spmCutShow() )
1564  {
1565  cpv.position( expLog, spmName(), copyOne, expTra, DDRotation() ) ;
1566  }
1567  else
1568  {
1569  const DDSolid unionSolid ( DDSolidFactory::unionSolid(
1570  unionName,
1571  spmcut1ddname, expName,
1572  expTra, DDRotation() ) ) ;
1573  }*/
1574 
1575  // Supermodule side platess
1576  const DDSolid sideSolid(DDSolidFactory::box(
1577  spmSideName(), spmSideHigh() / 2., spmSideThick() / 2., fabs(vecSpmZPts()[1] - vecSpmZPts()[0]) / 2.));
1578  const std::vector<double>& sideParms(sideSolid.parameters());
1579  const DDLogicalPart sideLog(spmSideName(), spmSideMat(), sideSolid);
1580 
1581  DDSolid temp1;
1582  DDSolid temp2;
1583  for (unsigned int icopy(1); icopy <= 2; ++icopy) {
1584  const std::vector<double>& tvec(1 == icopy ? vecSpmCutTM() : vecSpmCutTP());
1585  const double rang(1 == icopy ? spmCutRM() : spmCutRP());
1586 
1587  const Tl3D tr(tvec[0], tvec[1], tvec[2]);
1588  const RoZ3D ro(rang);
1589  const Tf3D alltrot(
1590  RoZ3D(1 == icopy ? spmLowPhi() : spmLowPhi() + spmDelPhi()) *
1591  Tl3D((vecSpmRMax()[indx] + vecSpmRMin()[indx]) / 2., 0, (vecSpmZPts().front() + vecSpmZPts().back()) / 2.) *
1592  tr * ro);
1593 
1594  const DDRotation ddrot(myrot(spmCutName().name() + std::to_string(icopy), alltrot.getRotation()));
1595  const DDTranslation ddtra(alltrot.getTranslation());
1596 
1597  const Tl3D trSide(tvec[0],
1598  tvec[1] + (1 == icopy ? 1. : -1.) * (cutBoxParms[1] + sideParms[1]) +
1599  (1 == icopy ? spmSideYOffM() : spmSideYOffP()),
1600  tvec[2]);
1601  const RoZ3D roSide(rang);
1602  const Tf3D sideRot(RoZ3D(1 == icopy ? spmLowPhi() : spmLowPhi() + spmDelPhi()) *
1603  Tl3D(vecSpmRMin().front() + sideParms[0], 0, vecSpmZPts().front() + sideParms[2]) * trSide *
1604  roSide);
1605 
1606  const DDRotation sideddrot(myrot(spmSideName().name() + std::to_string(icopy), sideRot.getRotation()));
1607  const DDTranslation sideddtra(sideRot.getTranslation());
1608 
1609  cpv.position(sideLog, spmName(), icopy, sideddtra, sideddrot);
1610 
1611  if (0 != spmCutShow()) // do this if we are "showing" the boxes
1612  {
1613  cpv.position(spmCutLog, spmName(), icopy, ddtra, ddrot);
1614  } else // do this if we are subtracting the boxes
1615  {
1616  if (1 == icopy) {
1617  temp1 = DDSolidFactory::subtraction(DDName(m_SpmName + "_T1"), spmcut1ddname, spmCutBox, ddtra, ddrot);
1618  } else {
1619  temp2 = DDSolidFactory::subtraction(spmName(), temp1, spmCutBox, ddtra, ddrot);
1620  }
1621  }
1622  }
1623 
1624  const DDLogicalPart spmLog(spmName(), spmMat(), ((0 != spmCutShow()) ? ddspm : temp2));
1625 
1626  const double dphi(360. * deg / (1. * spmNPerHalf()));
1627  for (unsigned int iphi(0); iphi < 2 * spmNPerHalf(); ++iphi) {
1628  const double phi(iphi * dphi + spmPhiOff()); //- 0.000130/deg ) ;
1629 
1630  // this base rotation includes the base translation & rotation
1631  // plus flipping for the negative z hemisphere, plus
1632  // the phi rotation for this module
1633  const Tf3D rotaBase(RoZ3D(phi) * (iphi < spmNPerHalf() ? Ro3D() : RoX3D(180. * deg)) *
1634  Ro3D(vecSpmBRota()[3], Vec3(vecSpmBRota()[0], vecSpmBRota()[1], vecSpmBRota()[2])) *
1635  Tl3D(Vec3(vecSpmBTran()[0], vecSpmBTran()[1], vecSpmBTran()[2])));
1636 
1637  // here the individual rotations & translations of the supermodule
1638  // are implemented on top of the overall "base" rotation & translation
1639 
1640  const unsigned int offr(4 * iphi);
1641  const unsigned int offt(3 * iphi);
1642 
1643  const Ro3D r1(vecSpmRota()[offr + 3],
1644  Vec3(vecSpmRota()[offr + 0], vecSpmRota()[offr + 1], vecSpmRota()[offr + 2]));
1645 
1646  const Tf3D rotaExtra(r1 * Tl3D(Vec3(vecSpmTran()[offt + 0], vecSpmTran()[offt + 1], vecSpmTran()[offt + 2])));
1647 
1648  const Tf3D both(rotaExtra * rotaBase);
1649 
1650  const DDRotation rota(myrot(spmName().name() + std::to_string(phi / deg), both.getRotation()));
1651 
1652  if (vecSpmHere()[iphi] != 0) {
1653  // convert from CLHEP to DDTranslation & etc. -- Michael Case
1654  DDTranslation myTran(both.getTranslation().x(), both.getTranslation().y(), both.getTranslation().z());
1655  cpv.position(spmLog, barName(), iphi + 1, myTran, rota);
1656  }
1657  }
1658  // End Supermodule parent------------------------------------------------------------
1659 
1660  // Begin Inner Layer volumes---------------------------------------------------------
1661  const double ilyLength(vecSpmZPts()[1] - vecSpmZPts()[0]);
1662  double ilyRMin(vecSpmRMin()[0]);
1663  double ilyThick(0);
1664  for (unsigned int ilyx(0); ilyx != vecIlyThick().size(); ++ilyx) {
1665  ilyThick += vecIlyThick()[ilyx];
1666  }
1667  const DDName ilyDDName(ddname(ilyName()));
1668  const DDSolid ilySolid(
1669  DDSolidFactory::tubs(ilyDDName, ilyLength / 2, ilyRMin, ilyRMin + ilyThick, ilyPhiLow(), ilyDelPhi()));
1670  const DDLogicalPart ilyLog(ilyDDName, spmMat(), ilySolid);
1671  cpv.position(ilyLog, spmLog, copyOne, DDTranslation(0, 0, ilyLength / 2), DDRotation());
1672 
1673  DDLogicalPart ilyPipeLog[200];
1674 
1675  if (0 != ilyPipeHere()) {
1676  for (unsigned int iPipeType(0); iPipeType != vecIlyPipeLength().size(); ++iPipeType) {
1677  const DDName pName(ddname(ilyPipeName() + "_" + std::to_string(iPipeType + 1)));
1678 
1679  DDSolid ilyPipeSolid(
1680  DDSolidFactory::tubs(pName, vecIlyPipeLength()[iPipeType] / 2., 0, ilyPipeOD() / 2, 0 * deg, 360 * deg));
1681  ilyPipeLog[iPipeType] = DDLogicalPart(pName, ilyPipeMat(), ilyPipeSolid);
1682 
1683  const DDName pWaName(ddname(ilyPipeName() + "Wa_" + std::to_string(iPipeType + 1)));
1684  DDSolid ilyPipeWaSolid(
1685  DDSolidFactory::tubs(pWaName, vecIlyPipeLength()[iPipeType] / 2., 0, ilyPipeID() / 2, 0 * deg, 360 * deg));
1686  const DDLogicalPart ilyPipeWaLog(pWaName, backPipeWaterMat(), ilyPipeWaSolid);
1687 
1688  cpv.position(ilyPipeWaLog, pName, copyOne, DDTranslation(0, 0, 0), DDRotation());
1689  }
1690  }
1691 
1692  DDSolid ilyPTMSolid(
1694  const DDLogicalPart ilyPTMLog(ilyPTMName(), ilyPTMMat(), ilyPTMSolid);
1695 
1696  DDSolid ilyFanOutSolid(
1698  const DDLogicalPart ilyFanOutLog(ilyFanOutName(), ilyFanOutMat(), ilyFanOutSolid);
1699 
1700  DDSolid ilyFEMSolid(
1702  const DDLogicalPart ilyFEMLog(ilyFEMName(), ilyFEMMat(), ilyFEMSolid);
1703 
1704  DDSolid ilyDiffSolid(
1706  const DDLogicalPart ilyDiffLog(ilyDiffName(), ilyDiffMat(), ilyDiffSolid);
1707 
1708  DDSolid ilyBndlSolid(
1710  const DDLogicalPart ilyBndlLog(ilyBndlName(), ilyBndlMat(), ilyBndlSolid);
1711  cpv.position(ilyDiffLog,
1712  ilyFanOutName(),
1713  copyOne,
1714  DDTranslation(0, 0, -ilyFanOutLength() / 2 + ilyDiffLength() / 2 + ilyDiffOff()),
1715  DDRotation());
1716  cpv.position(ilyBndlLog,
1717  ilyFanOutName(),
1718  copyOne,
1719  DDTranslation(0, 0, -ilyFanOutLength() / 2 + ilyBndlLength() / 2 + ilyBndlOff()),
1720  DDRotation());
1721 
1722  for (unsigned int ily(0); ily != vecIlyThick().size(); ++ily) {
1723  const double ilyRMax(ilyRMin + vecIlyThick()[ily]);
1724  const DDName xilyName(ddname(ilyName() + std::to_string(ily)));
1725  const DDSolid xilySolid(
1726  DDSolidFactory::tubs(xilyName, ilyLength / 2, ilyRMin, ilyRMax, ilyPhiLow(), ilyDelPhi()));
1727 
1728  const DDLogicalPart xilyLog(xilyName, ddmat(vecIlyMat()[ily]), xilySolid);
1729 
1730  if (0 != ilyHere()) {
1731  cpv.position(xilyLog, ilyLog, copyOne, DDTranslation(0, 0, 0), DDRotation());
1732 
1733  unsigned int copyNum[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1734 
1735  if (10 * mm < vecIlyThick()[ily] && vecIlyThick().size() != (ily + 1) && 0 != ilyPipeHere()) {
1736  if (0 != ilyPTMHere()) {
1737  unsigned int ptmCopy(0);
1738  for (unsigned int ilyPTM(0); ilyPTM != vecIlyPTMZ().size(); ++ilyPTM) {
1739  const double radius(ilyRMax - 1 * mm - ilyPTMHeight() / 2.);
1740  const double phi(vecIlyPTMPhi()[ilyPTM]);
1741  const double yy(radius * sin(phi));
1742  const double xx(radius * cos(phi));
1743  ++ptmCopy;
1744  cpv.position(ilyPTMLog,
1745  xilyLog,
1746  ptmCopy,
1747  DDTranslation(xx, yy, vecIlyPTMZ()[ilyPTM] - ilyLength / 2),
1748  myrot(ilyPTMLog.name().name() + "_rot" + std::to_string(ptmCopy), CLHEP::HepRotationZ(phi)));
1749  }
1750  }
1751  if (0 != ilyFanOutHere()) {
1752  unsigned int fanOutCopy(0);
1753  for (unsigned int ilyFO(0); ilyFO != vecIlyFanOutZ().size(); ++ilyFO) {
1754  const double radius(ilyRMax - 1 * mm - ilyFanOutHeight() / 2.);
1755  const double phi(vecIlyFanOutPhi()[ilyFO]);
1756  const double yy(radius * sin(phi));
1757  const double xx(radius * cos(phi));
1758  ++fanOutCopy;
1759  cpv.position(ilyFanOutLog,
1760  xilyLog,
1761  fanOutCopy,
1762  DDTranslation(xx, yy, vecIlyFanOutZ()[ilyFO] - ilyLength / 2),
1763  myrot(ilyFanOutLog.name().name() + "_rot" + std::to_string(fanOutCopy),
1764  CLHEP::HepRotationZ(phi) * CLHEP::HepRotationY(180 * deg)));
1765  }
1766  unsigned int femCopy(0);
1767  for (unsigned int ilyFEM(0); ilyFEM != vecIlyFEMZ().size(); ++ilyFEM) {
1768  const double radius(ilyRMax - 1 * mm - ilyFEMHeight() / 2.);
1769  const double phi(vecIlyFEMPhi()[ilyFEM]);
1770  const double yy(radius * sin(phi));
1771  const double xx(radius * cos(phi));
1772  ++femCopy;
1773  cpv.position(ilyFEMLog,
1774  xilyLog,
1775  femCopy,
1776  DDTranslation(xx, yy, vecIlyFEMZ()[ilyFEM] - ilyLength / 2),
1777  myrot(ilyFEMLog.name().name() + "_rot" + std::to_string(femCopy), CLHEP::HepRotationZ(phi)));
1778  }
1779  }
1780  for (unsigned int iPipe(0); iPipe != vecIlyPipePhi().size(); ++iPipe) {
1781  const unsigned int type(static_cast<unsigned int>(round(vecIlyPipeType()[iPipe])));
1782  // std::cout<<" iPipe, type= " << iPipe << ", " << type << std::endl ;
1783  const double zz(-ilyLength / 2 + vecIlyPipeZ()[iPipe] + (9 > type ? vecIlyPipeLength()[type] / 2. : 0));
1784 
1785  for (unsigned int ly(0); ly != 2; ++ly) {
1786  const double radius(0 == ly ? ilyRMin + ilyPipeOD() / 2. + 1 * mm : ilyRMax - ilyPipeOD() / 2. - 1 * mm);
1787  const double phi(vecIlyPipePhi()[iPipe]);
1788  const double yy(radius * sin(phi));
1789  const double xx(radius * cos(phi));
1790  ++copyNum[type],
1791  cpv.position(
1792  ilyPipeLog[type],
1793  xilyLog,
1794  copyNum[type],
1795  DDTranslation(xx, yy, zz),
1796  (9 > type ? DDRotation()
1797  : myrot(ilyPipeLog[type].name().name() + "_rot" + std::to_string(copyNum[type]),
1798  Rota(Vec3(xx, yy, 0), 90 * deg))));
1799  }
1800  }
1801  }
1802  }
1803  ilyRMin = ilyRMax;
1804  }
1805  // End Inner Layer volumes---------------------------------------------------------
1806 
1807  const DDName clyrName(DDName("ECLYR"));
1808  std::vector<double> cri;
1809  std::vector<double> cro;
1810  std::vector<double> czz;
1811  czz.emplace_back(vecSpmZPts()[1]);
1812  cri.emplace_back(vecSpmRMin()[0]);
1813  cro.emplace_back(vecSpmRMin()[0] + 25 * mm);
1814  czz.emplace_back(vecSpmZPts()[2]);
1815  cri.emplace_back(vecSpmRMin()[2]);
1816  cro.emplace_back(vecSpmRMin()[2] + 10 * mm);
1817  const DDSolid clyrSolid(DDSolidFactory::polycone(clyrName, -9.5 * deg, 19 * deg, czz, cri, cro));
1818  const DDLogicalPart clyrLog(clyrName, ddmat(vecIlyMat()[4]), clyrSolid);
1819  cpv.position(clyrLog, spmLog, copyOne, DDTranslation(0, 0, 0), DDRotation());
1820 
1821  // Begin Alveolar Wedge parent ------------------------------------------------------
1822  //----------------
1823 
1824  // the next few lines accumulate dimensions appropriate to crystal type 1
1825  // which we use to set some of the features of the half-alveolar wedge (hawR).
1826 
1827  // const double ANom1 ( vecNomCryDimAR()[0] ) ;
1828  const double BNom1(vecNomCryDimCR()[0]);
1829  const double bNom1(vecNomCryDimCF()[0]);
1830  // const double HNom1 ( vecNomCryDimBR()[0] ) ;
1831  // const double hNom1 ( vecNomCryDimBF()[0] ) ;
1832  const double sWall1(wallThAlv());
1833  const double fWall1(wallFrAlv());
1834  // const double rWall1( wallReAlv() ) ;
1835  const double sWrap1(wrapThAlv());
1836  const double fWrap1(wrapFrAlv());
1837  // const double rWrap1( wrapReAlv() ) ;
1838  const double sClr1(clrThAlv());
1839  const double fClr1(clrFrAlv());
1840  // const double rClr1 ( clrReAlv() ) ;
1841  const double LNom1(nomCryDimLZ());
1842  const double beta1(atan((BNom1 - bNom1) / LNom1));
1843  // const double cosbeta1 ( cos( beta1 ) ) ;
1844  const double sinbeta1(sin(beta1));
1845 
1846  const double tana_hawR((BNom1 - bNom1) / LNom1);
1847 
1848  const double H_hawR(hawRHBIG());
1849  const double h_hawR(hawRhsml());
1850  const double a_hawR(bNom1 + sClr1 + 2 * sWrap1 + 2 * sWall1 - sinbeta1 * (fClr1 + fWrap1 + fWall1));
1851  const double B_hawR(a_hawR + H_hawR * tana_hawR);
1852  const double b_hawR(a_hawR + h_hawR * tana_hawR);
1853  const double L_hawR(vecSpmZPts()[2]);
1854 
1855  const Trap trapHAWR(a_hawR / 2., //double aHalfLengthXNegZLoY , // bl1, A/2
1856  a_hawR / 2., //double aHalfLengthXPosZLoY , // bl2, a/2
1857  b_hawR / 2., //double aHalfLengthXPosZHiY , // tl2, b/2
1858  H_hawR / 2., //double aHalfLengthYNegZ , // h1, H/2
1859  h_hawR / 2., //double aHalfLengthYPosZ , // h2, h/2
1860  L_hawR / 2., //double aHalfLengthZ , // dz, L/2
1861  90 * deg, //double aAngleAD , // alfa1
1862  0, //double aCoord15X , // x15
1863  0 //double aCoord15Y // y15
1864  );
1865 
1866  const DDName hawRName1(ddname(hawRName().name() + "1"));
1867  const DDSolid hawRSolid1(mytrap(hawRName1.name(), trapHAWR));
1868  const DDLogicalPart hawRLog1(hawRName1, spmMat(), hawRSolid1);
1869 
1870  const double al1_fawR(atan((B_hawR - a_hawR) / H_hawR) + M_PI_2);
1871 
1872  // here is trap for Full Alveolar Wedge
1873  const Trap trapFAW(a_hawR, //double aHalfLengthXNegZLoY , // bl1, A/2
1874  a_hawR, //double aHalfLengthXPosZLoY , // bl2, a/2
1875  b_hawR, //double aHalfLengthXPosZHiY , // tl2, b/2
1876  H_hawR / 2., //double aHalfLengthYNegZ , // h1, H/2
1877  h_hawR / 2., //double aHalfLengthYPosZ , // h2, h/2
1878  L_hawR / 2., //double aHalfLengthZ , // dz, L/2
1879  al1_fawR, //double aAngleAD , // alfa1
1880  0, //double aCoord15X , // x15
1881  0 //double aCoord15Y // y15
1882  );
1883 
1884  const DDName fawName1(ddname(fawName().name() + "1"));
1885  const DDSolid fawSolid1(mytrap(fawName1.name(), trapFAW));
1886  const DDLogicalPart fawLog1(fawName1, spmMat(), fawSolid1);
1887 
1888  const Trap::VertexList vHAW(trapHAWR.vertexList());
1889  const Trap::VertexList vFAW(trapFAW.vertexList());
1890 
1891  const double hawBoxClr(1 * mm);
1892 
1893  // HAW cut box to cut off back end of wedge
1894  const DDName hawCutName(ddname(hawRName().name() + "CUTBOX"));
1895  const DDSolid hawCutBox(DDSolidFactory::box(hawCutName, b_hawR / 2 + hawBoxClr, hawRCutY() / 2, hawRCutZ() / 2));
1896  const std::vector<double>& hawBoxParms(hawCutBox.parameters());
1897  const DDLogicalPart hawCutLog(hawCutName, spmMat(), hawCutBox);
1898 
1899  const Pt3D b1(hawBoxParms[0], hawBoxParms[1], hawBoxParms[2]);
1900  const Pt3D b2(-hawBoxParms[0], hawBoxParms[1], hawBoxParms[2]);
1901  const Pt3D b3(-hawBoxParms[0], hawBoxParms[1], -hawBoxParms[2]);
1902 
1903  const double zDel(sqrt(4 * hawBoxParms[2] * hawBoxParms[2] - (h_hawR - hawRCutDelY()) * (h_hawR - hawRCutDelY())));
1904 
1905  const Tf3D hawCutForm(b1,
1906  b2,
1907  b3,
1908  vHAW[2] + Pt3D(hawBoxClr, -hawRCutDelY(), 0),
1909  vHAW[1] + Pt3D(-hawBoxClr, -hawRCutDelY(), 0),
1910  Pt3D(vHAW[0].x() - hawBoxClr, vHAW[0].y(), vHAW[0].z() - zDel));
1911 
1912  const DDSolid hawRSolid(DDSolidFactory::subtraction(
1913  hawRName(),
1914  hawRSolid1,
1915  hawCutBox,
1916  DDTranslation(
1917  hawCutForm.getTranslation().x(), hawCutForm.getTranslation().y(), hawCutForm.getTranslation().z()),
1918  myrot(hawCutName.name() + "R", hawCutForm.getRotation())));
1919  const DDLogicalPart hawRLog(hawRName(), spmMat(), hawRSolid);
1920 
1921  // FAW cut box to cut off back end of wedge
1922  const DDName fawCutName(ddname(fawName().name() + "CUTBOX"));
1923  const DDSolid fawCutBox(DDSolidFactory::box(fawCutName, 2 * hawBoxParms[0], hawBoxParms[1], hawBoxParms[2]));
1924 
1925  const std::vector<double>& fawBoxParms(fawCutBox.parameters());
1926  const DDLogicalPart fawCutLog(fawCutName, spmMat(), fawCutBox);
1927 
1928  const Pt3D bb1(fawBoxParms[0], fawBoxParms[1], fawBoxParms[2]);
1929  const Pt3D bb2(-fawBoxParms[0], fawBoxParms[1], fawBoxParms[2]);
1930  const Pt3D bb3(-fawBoxParms[0], fawBoxParms[1], -fawBoxParms[2]);
1931 
1932  const Tf3D fawCutForm(bb1,
1933  bb2,
1934  bb3,
1935  vFAW[2] + Pt3D(2 * hawBoxClr, -5 * mm, 0),
1936  vFAW[1] + Pt3D(-2 * hawBoxClr, -5 * mm, 0),
1937  Pt3D(vFAW[1].x() - 2 * hawBoxClr, vFAW[1].y() - trapFAW.h(), vFAW[1].z() - zDel));
1938 
1939  const DDSolid fawSolid(DDSolidFactory::subtraction(
1940  fawName(),
1941  fawSolid1,
1942  fawCutBox,
1943  DDTranslation(
1944  fawCutForm.getTranslation().x(), fawCutForm.getTranslation().y(), fawCutForm.getTranslation().z()),
1945  myrot(fawCutName.name() + "R", fawCutForm.getRotation())));
1946  const DDLogicalPart fawLog(fawName(), spmMat(), fawSolid);
1947 
1948  const Tf3D hawRform(vHAW[3],
1949  vHAW[0],
1950  vHAW[1], // HAW inside FAW
1951  vFAW[3],
1952  0.5 * (vFAW[0] + vFAW[3]),
1953  0.5 * (vFAW[1] + vFAW[2]));
1954  cpv.position(
1955  hawRLog,
1956  fawLog,
1957  copyOne,
1958  DDTranslation(hawRform.getTranslation().x(), hawRform.getTranslation().y(), hawRform.getTranslation().z()),
1959  myrot(hawRName().name() + "R", hawRform.getRotation()));
1960 
1961  cpv.position(
1962  hawRLog,
1963  fawLog,
1964  copyTwo,
1965  DDTranslation(-hawRform.getTranslation().x(), -hawRform.getTranslation().y(), -hawRform.getTranslation().z()),
1966  myrot(hawRName().name() + "RotRefl",
1967  CLHEP::HepRotationY(180 * deg) * // rotate about Y after refl thru Z
1968  CLHEP::HepRep3x3(1, 0, 0, 0, 1, 0, 0, 0, -1)));
1969 
1970  /* this for display of haw cut box instead of subtraction
1971  cpv.position( hawCutLog,
1972  hawRName,
1973  copyOne,
1974  hawCutForm.getTranslation(),
1975  myrot( hawCutName.name()+"R",
1976  hawCutForm.getRotation() ) ) ;
1977 */
1978 
1979  for (unsigned int iPhi(1); iPhi <= nFawPerSupm(); ++iPhi) {
1980  const double rPhi(fawPhiOff() + (iPhi - 0.5) * fawDelPhi());
1981 
1982  const Tf3D fawform(RoZ3D(rPhi) * Tl3D(fawRadOff() + (trapFAW.H() + trapFAW.h()) / 4, 0, trapFAW.L() / 2) *
1983  RoZ3D(-90 * deg + fawPhiRot()));
1984  if (fawHere())
1985  cpv.position(
1986  fawLog,
1987  spmLog,
1988  iPhi,
1989  DDTranslation(fawform.getTranslation().x(), fawform.getTranslation().y(), fawform.getTranslation().z()),
1990  myrot(fawName().name() + "_Rot" + std::to_string(iPhi), fawform.getRotation()));
1991  }
1992 
1993  // End Alveolar Wedge parent ------------------------------------------------------
1994 
1995  // Begin Grid + Tablet insertion
1996 
1997  const double h_Grid(gridThick());
1998 
1999  const Trap trapGrid((B_hawR - h_Grid * (B_hawR - a_hawR) / H_hawR) / 2, // bl1, A/2
2000  (b_hawR - h_Grid * (B_hawR - a_hawR) / H_hawR) / 2, // bl2, a/2
2001  b_hawR / 2., // tl2, b/2
2002  h_Grid / 2., // h1, H/2
2003  h_Grid / 2., // h2, h/2
2004  (L_hawR - 8 * cm) / 2., // dz, L/2
2005  90 * deg, // alfa1
2006  0, // x15
2007  H_hawR - h_hawR // y15
2008  );
2009 
2010  const DDSolid gridSolid(mytrap(gridName().name(), trapGrid));
2011  const DDLogicalPart gridLog(gridName(), gridMat(), gridSolid);
2012 
2013  const Trap::VertexList vGrid(trapGrid.vertexList());
2014 
2015  const Tf3D gridForm(vGrid[4],
2016  vGrid[5],
2017  vGrid[6], // Grid inside HAW
2018  vHAW[5] - Pt3D(0, h_Grid, 0),
2019  vHAW[5],
2020  vHAW[6]);
2021 
2022  if (0 != gridHere())
2023  cpv.position(
2024  gridLog,
2025  hawRLog,
2026  copyOne,
2027  DDTranslation(gridForm.getTranslation().x(), gridForm.getTranslation().y(), gridForm.getTranslation().z()),
2028  myrot(gridName().name() + "R", gridForm.getRotation()));
2029 
2030  // End Grid + Tablet insertion
2031 
2032  // begin filling Wedge with crystal plus supports --------------------------
2033 
2034  const double aNom(nomCryDimAF());
2035  const double LNom(nomCryDimLZ());
2036 
2037  const double AUnd(underAR());
2038  const double aUnd(underAF());
2039  // const double BUnd ( underCR() ) ;
2040  const double bUnd(underCF());
2041  const double HUnd(underBR());
2042  const double hUnd(underBF());
2043  const double LUnd(underLZ());
2044 
2045  const double sWall(wallThAlv());
2046  const double sWrap(wrapThAlv());
2047  const double sClr(clrThAlv());
2048 
2049  const double fWall(wallFrAlv());
2050  const double fWrap(wrapFrAlv());
2051  const double fClr(clrFrAlv());
2052 
2053  const double rWall(wallReAlv());
2054  const double rWrap(wrapReAlv());
2055  const double rClr(clrReAlv());
2056 
2057  // theta is angle in yz plane between z axis & leading edge of crystal
2058  double theta(90 * deg);
2059  double zee(0 * mm);
2060  double side(0 * mm);
2061  double zeta(0 * deg); // increment in theta for last crystal
2062 
2063  for (unsigned int cryType(1); cryType <= nCryTypes(); ++cryType) {
2064  const std::string sType("_" + std::string(10 > cryType ? "0" : "") + std::to_string(cryType));
2065 
2066  LogDebug("EcalGeom") << "Crytype=" << cryType;
2067  const double ANom(vecNomCryDimAR()[cryType - 1]);
2068  const double BNom(vecNomCryDimCR()[cryType - 1]);
2069  const double bNom(vecNomCryDimCF()[cryType - 1]);
2070  const double HNom(vecNomCryDimBR()[cryType - 1]);
2071  const double hNom(vecNomCryDimBF()[cryType - 1]);
2072 
2073  const double alfCry(90 * deg + atan((bNom - bUnd - aNom + aUnd) / (hNom - hUnd)));
2074 
2075  const Trap trapCry((ANom - AUnd) / 2., //double aHalfLengthXNegZLoY , // bl1, A/2
2076  (aNom - aUnd) / 2., //double aHalfLengthXPosZLoY , // bl2, a/2
2077  (bNom - bUnd) / 2., //double aHalfLengthXPosZHiY , // tl2, b/2
2078  (HNom - HUnd) / 2., //double aHalfLengthYNegZ , // h1, H/2
2079  (hNom - hUnd) / 2., //double aHalfLengthYPosZ , // h2, h/2
2080  (LNom - LUnd) / 2., //double aHalfLengthZ , // dz, L/2
2081  alfCry, //double aAngleAD , // alfa1
2082  aNom - aUnd - ANom + AUnd, //double aCoord15X , // x15
2083  hNom - hUnd - HNom + HUnd //double aCoord15Y // y15
2084  );
2085 
2086  const DDName cryDDName(cryName() + sType);
2087  const DDSolid crySolid(mytrap(cryDDName.name(), trapCry));
2088  const DDLogicalPart cryLog(cryDDName, cryMat(), crySolid);
2089 
2090  //++++++++++++++++++++++++++++++++++ APD ++++++++++++++++++++++++++++++++++
2091  const unsigned int copyCap(1);
2092 
2093  const DDName capDDName(capName().name() + sType);
2094 
2095  DDSolid capSolid(DDSolidFactory::box(capDDName, capXSize() / 2., capYSize() / 2., capThick() / 2.));
2096 
2097  const DDLogicalPart capLog(capDDName, capMat(), capSolid);
2098 
2099  const DDName sglDDName(sglName().name() + sType);
2100 
2101  DDSolid sglSolid(DDSolidFactory::box(sglDDName, capXSize() / 2., capYSize() / 2., sglThick() / 2.));
2102 
2103  const DDLogicalPart sglLog(sglDDName, sglMat(), sglSolid);
2104 
2105  const unsigned int copySGL(1);
2106 
2107  const DDName cerDDName(cerName().name() + sType);
2108 
2109  DDSolid cerSolid(DDSolidFactory::box(cerDDName, cerXSize() / 2., cerYSize() / 2., cerThick() / 2.));
2110 
2111  const DDLogicalPart cerLog(cerDDName, cerMat(), cerSolid);
2112 
2113  unsigned int copyCER(0);
2114 
2115  const DDName bsiDDName(bsiName().name() + sType);
2116 
2117  DDSolid bsiSolid(DDSolidFactory::box(bsiDDName, bsiXSize() / 2., bsiYSize() / 2., bsiThick() / 2.));
2118 
2119  const DDLogicalPart bsiLog(bsiDDName, bsiMat(), bsiSolid);
2120 
2121  const unsigned int copyBSi(1);
2122 
2123  const DDName atjDDName(atjName().name() + sType);
2124 
2125  DDSolid atjSolid(DDSolidFactory::box(atjDDName, apdSide() / 2., apdSide() / 2., atjThick() / 2.));
2126 
2127  const DDLogicalPart atjLog(atjDDName, atjMat(), atjSolid);
2128 
2129  const unsigned int copyATJ(1);
2130 
2131  const DDName aglDDName(aglName().name() + sType);
2132 
2133  DDSolid aglSolid(DDSolidFactory::box(aglDDName, bsiXSize() / 2., bsiYSize() / 2., aglThick() / 2.));
2134 
2135  const DDLogicalPart aglLog(aglDDName, aglMat(), aglSolid);
2136 
2137  const unsigned int copyAGL(1);
2138 
2139  const DDName andDDName(andName().name() + sType);
2140 
2141  DDSolid andSolid(DDSolidFactory::box(andDDName, apdSide() / 2., apdSide() / 2., andThick() / 2.));
2142 
2143  const DDLogicalPart andLog(andDDName, andMat(), andSolid);
2144 
2145  const unsigned int copyAND(1);
2146 
2147  const DDName apdDDName(apdName().name() + sType);
2148 
2149  DDSolid apdSolid(DDSolidFactory::box(apdDDName, apdSide() / 2., apdSide() / 2., apdThick() / 2.));
2150 
2151  const DDLogicalPart apdLog(apdDDName, apdMat(), apdSolid);
2152 
2153  const unsigned int copyAPD(1);
2154  //++++++++++++++++++++++++++++++++++ END APD ++++++++++++++++++++++++++++++++++
2155 
2156  const double delta(atan((HNom - hNom) / LNom));
2157  //unused const double cosdelta ( cos( delta ) ) ;
2158  const double sindelta(sin(delta));
2159 
2160  const double gamma(atan((ANom - aNom) / LNom));
2161  //unused const double cosgamma ( cos( gamma ) ) ;
2162  const double singamma(sin(gamma));
2163 
2164  const double beta(atan((BNom - bNom) / LNom));
2165  //unused const double cosbeta ( cos( beta ) ) ;
2166  const double sinbeta(sin(beta));
2167 
2168  // Now clearance trap
2169  const double alfClr(90 * deg + atan((bNom - aNom) / (hNom + sClr)));
2170 
2171  const Trap trapClr((ANom + sClr + rClr * singamma) / 2., //double aHalfLengthXNegZLoY , // bl1, A/2
2172  (aNom + sClr - fClr * singamma) / 2., //double aHalfLengthXPosZLoY , // bl2, a/2
2173  (bNom + sClr - fClr * sinbeta) / 2., //double aHalfLengthXPosZHiY , // tl2, b/2
2174  (HNom + sClr + rClr * sindelta) / 2., //double aHalfLengthYNegZ , // h1, H/2
2175  (hNom + sClr - fClr * sindelta) / 2., //double aHalfLengthYPosZ , // h2, h/2
2176  (LNom + fClr + rClr) / 2., // dz, L/2
2177  alfClr, //double aAngleAD , // alfa1
2178  aNom - ANom, //double aCoord15X , // x15
2179  hNom - HNom //double aCoord15Y // y15
2180  );
2181 
2182  const DDName clrDDName(clrName() + sType);
2183  const DDSolid clrSolid(mytrap(clrDDName.name(), trapClr));
2184  const DDLogicalPart clrLog(clrDDName, clrMat(), clrSolid);
2185 
2186  // Now wrap trap
2187 
2188  const double alfWrap(90 * deg + atan((bNom - aNom) / (hNom + sClr + 2 * sWrap)));
2189 
2190  const Trap trapWrap((trapClr.A() + 2 * sWrap + rWrap * singamma) / 2, // bl1, A/2
2191  (trapClr.a() + 2 * sWrap - fWrap * singamma) / 2, // bl2, a/2
2192  (trapClr.b() + 2 * sWrap - fWrap * sinbeta) / 2, // tl2, b/2
2193  (trapClr.H() + 2 * sWrap + rWrap * sindelta) / 2, // h1, H/2
2194  (trapClr.h() + 2 * sWrap - fWrap * sindelta) / 2, // h2, h/2
2195  (trapClr.L() + fWrap + rWrap) / 2., // dz, L/2
2196  alfWrap, //double aAngleAD , // alfa1
2197  aNom - ANom - (cryType > 9 ? 0 : 0.020 * mm),
2198  hNom - HNom //double aCoord15Y // y15
2199  );
2200 
2201  const DDName wrapDDName(wrapName() + sType);
2202  const DDSolid wrapSolid(mytrap(wrapDDName.name(), trapWrap));
2203  const DDLogicalPart wrapLog(wrapDDName, wrapMat(), wrapSolid);
2204 
2205  // Now wall trap
2206 
2207  const double alfWall(90 * deg + atan((bNom - aNom) / (hNom + sClr + 2 * sWrap + 2 * sWall)));
2208 
2209  const Trap trapWall((trapWrap.A() + 2 * sWall + rWall * singamma) / 2, // A/2
2210  (trapWrap.a() + 2 * sWall - fWall * singamma) / 2, // a/2
2211  (trapWrap.b() + 2 * sWall - fWall * sinbeta) / 2, // b/2
2212  (trapWrap.H() + 2 * sWall + rWall * sindelta) / 2, // H/2
2213  (trapWrap.h() + 2 * sWall - fWall * sindelta) / 2, // h/2
2214  (trapWrap.L() + fWall + rWall) / 2., // L/2
2215  alfWall, // alfa1
2216  aNom - ANom - (cryType < 10 ? 0.150 * mm : 0.100 * mm),
2217  hNom - HNom // y15
2218  );
2219 
2220  const DDName wallDDName(wallName() + sType);
2221  const DDSolid wallSolid(mytrap(wallDDName.name(), trapWall));
2222  const DDLogicalPart wallLog(wallDDName, wallMat(), wallSolid);
2223 
2224  /* std::cout << "Traps:\n a: "
2225  << trapCry.a() << ", "
2226  << trapClr.a() << ", "
2227  << trapWrap.a() << ", "
2228  << trapWall.a() << "\n b: "
2229  << trapCry.b() << ", "
2230  << trapClr.b() << ", "
2231  << trapWrap.b() << ", "
2232  << trapWall.b() << "\n A: "
2233  << trapCry.A() << ", "
2234  << trapClr.A() << ", "
2235  << trapWrap.A() << ", "
2236  << trapWall.A() << "\n B: "
2237  << trapCry.B() << ", "
2238  << trapClr.B() << ", "
2239  << trapWrap.B() << ", "
2240  << trapWall.B() << "\n h: "
2241  << trapCry.h() << ", "
2242  << trapClr.h() << ", "
2243  << trapWrap.h() << ", "
2244  << trapWall.h() << "\n H: "
2245  << trapCry.H() << ", "
2246  << trapClr.H() << ", "
2247  << trapWrap.H() << ", "
2248  << trapWall.H() << "\n a1: "
2249  << trapCry.a1()/deg << ", "
2250  << trapClr.a1()/deg << ", "
2251  << trapWrap.a1()/deg << ", "
2252  << trapWall.a1()/deg << "\n a4: "
2253  << trapCry.a4()/deg << ", "
2254  << trapClr.a4()/deg << ", "
2255  << trapWrap.a4()/deg << ", "
2256  << trapWall.a4()/deg << "\n x15: "
2257  << trapCry.x15() << ", "
2258  << trapClr.x15() << ", "
2259  << trapWrap.x15() << ", "
2260  << trapWall.x15() << "\n y15: "
2261  << trapCry.y15() << ", "
2262  << trapClr.y15() << ", "
2263  << trapWrap.y15() << ", "
2264  << trapWall.y15()
2265  << std::endl ;
2266 */
2267  // Now for placement of cry within clr
2268  const Vec3 cryToClr(0, 0, (rClr - fClr) / 2);
2269 
2270  cpv.position(cryLog,
2271  clrLog,
2272  copyOne,
2273  DDTranslation(0, 0, (rClr - fClr) / 2), //SAME as cryToClr above.
2274  DDRotation());
2275 
2276  if (0 != capHere()) {
2277  cpv.position(aglLog, bsiLog, copyAGL, DDTranslation(0, 0, -aglThick() / 2. + bsiThick() / 2.), DDRotation());
2278 
2279  cpv.position(
2280  andLog, bsiLog, copyAND, DDTranslation(0, 0, -andThick() / 2. - aglThick() + bsiThick() / 2.), DDRotation());
2281 
2282  cpv.position(apdLog,
2283  bsiLog,
2284  copyAPD,
2285  DDTranslation(0, 0, -apdThick() / 2. - andThick() - aglThick() + bsiThick() / 2.),
2286  DDRotation());
2287 
2288  cpv.position(atjLog,
2289  bsiLog,
2290  copyATJ,
2291  DDTranslation(0, 0, -atjThick() / 2. - apdThick() - andThick() - aglThick() + bsiThick() / 2.),
2292  DDRotation());
2293 
2294  cpv.position(bsiLog, cerLog, copyBSi, DDTranslation(0, 0, -bsiThick() / 2. + cerThick() / 2.), DDRotation());
2295 
2296  cpv.position(sglLog, capLog, copySGL, DDTranslation(0, 0, -sglThick() / 2. + capThick() / 2.), DDRotation());
2297 
2298  for (unsigned int ijkl(0); ijkl != 2; ++ijkl) {
2299  cpv.position(cerLog,
2300  capLog,
2301  ++copyCER,
2302  DDTranslation(trapCry.bl1() - (0 == ijkl ? apdX1() : apdX2()),
2303  trapCry.h1() - apdZ(),
2304  -sglThick() - cerThick() / 2. + capThick() / 2.),
2305  DDRotation());
2306  }
2307 
2308  cpv.position(capLog,
2309  clrLog,
2310  copyCap,
2311  DDTranslation(0, 0, -trapCry.dz() - capThick() / 2. + (rClr - fClr) / 2.),
2312  DDRotation());
2313  }
2314 
2315  const Vec3 clrToWrap(0, 0, (rWrap - fWrap) / 2);
2316 
2317  cpv.position(clrLog,
2318  wrapLog,
2319  copyOne,
2320  DDTranslation(0, 0, (rWrap - fWrap) / 2), //SAME as cryToWrap
2321  DDRotation());
2322 
2323  // Now for placement of clr within wall
2324  const Vec3 wrapToWall1(0, 0, (rWall - fWall) / 2);
2325  const Vec3 wrapToWall(Vec3((cryType > 9 ? 0 : 0.005 * mm), 0, 0) + wrapToWall1);
2326 
2327  cpv.position(wrapLog,
2328  wallLog,
2329  copyOne,
2330  DDTranslation(Vec3((cryType > 9 ? 0 : 0.005 * mm), 0, 0) + wrapToWall1), //SAME as wrapToWall
2331  DDRotation());
2332 
2333  const Trap::VertexList vWall(trapWall.vertexList());
2334  const Trap::VertexList vCry(trapCry.vertexList());
2335 
2336  const double sidePrime((trapWall.a() - trapCry.a()) / 2);
2337  const double frontPrime(fWall + fWrap + fClr + LUnd / 2);
2338 
2339  // define web plates with clearance ===========================================
2340 
2341  if (1 == cryType) // first web plate: inside clearance volume
2342  {
2343  web(0,
2344  trapWall.b(),
2345  trapWall.B(),
2346  trapWall.L(),
2347  theta,
2348  vHAW[4] + Pt3D(0, hawYOffCry(), 0),
2349  hawRLog,
2350  zee,
2351  sidePrime,
2352  frontPrime,
2353  delta,
2354  cpv);
2355  zee += vecGapAlvEta()[0];
2356  }
2357 
2358  for (unsigned int etaAlv(1); etaAlv <= nCryPerAlvEta(); ++etaAlv) {
2359  LogDebug("EcalGeom") << "theta=" << theta / deg << ", sidePrime=" << sidePrime << ", frontPrime=" << frontPrime
2360  << ", zeta=" << zeta << ", delta=" << delta << ", zee=" << zee;
2361 
2362  zee += 0.075 * mm + (side * cos(zeta) + trapWall.h() - sidePrime) / sin(theta);
2363 
2364  LogDebug("EcalGeom") << "New zee=" << zee;
2365 
2366  // make transform for placing enclosed crystal
2367 
2368  const Pt3D trap2(vCry[2] + cryToClr + clrToWrap + wrapToWall);
2369 
2370  const Pt3D trap3(trap2 + Pt3D(0, -trapCry.h(), 0));
2371  const Pt3D trap1(trap3 + Pt3D(-trapCry.a(), 0, 0));
2372 
2373  const Pt3D wedge3(vHAW[4] + Pt3D(sidePrime, hawYOffCry(), zee));
2374  const Pt3D wedge2(wedge3 + Pt3D(0, trapCry.h() * cos(theta), -trapCry.h() * sin(theta)));
2375  const Pt3D wedge1(wedge3 + Pt3D(trapCry.a(), 0, 0));
2376 
2377  const Tf3D tForm1(trap1, trap2, trap3, wedge1, wedge2, wedge3);
2378 
2379  const double xx(0.050 * mm);
2380 
2381  const Tf3D tForm(HepGeom::Translate3D(xx, 0, 0) * tForm1);
2382 
2383  cpv.position(wallLog,
2384  hawRLog,
2385  etaAlv,
2386  DDTranslation(tForm.getTranslation().x(), tForm.getTranslation().y(), tForm.getTranslation().z()),
2387  myrot(wallLog.name().name() + "_" + std::to_string(etaAlv), tForm.getRotation()));
2388 
2389  theta -= delta;
2390  side = sidePrime;
2391  zeta = delta;
2392  }
2393  if (5 == cryType || 9 == cryType || 13 == cryType || 17 == cryType) // web plates
2394  {
2395  const unsigned int webIndex(cryType / 4);
2396  zee += 0.5 * vecGapAlvEta()[cryType] / sin(theta);
2397  web(webIndex,
2398  trapWall.a(),
2399  trapWall.A(),
2400  trapWall.L(),
2401  theta,
2402  vHAW[4] + Pt3D(0, hawYOffCry(), 0),
2403  hawRLog,
2404  zee,
2405  sidePrime,
2406  frontPrime,
2407  delta,
2408  cpv);
2409  zee += 0.5 * vecGapAlvEta()[cryType] / sin(theta);
2410  } else {
2411  if (17 != cryType)
2412  zee += vecGapAlvEta()[cryType] / sin(theta);
2413  }
2414  }
2415  // END filling Wedge with crystal plus supports --------------------------
2416 
2417  //------------------------------------------------------------------------
2418  //------------------------------------------------------------------------
2419  //------------------------------------------------------------------------
2420  //------------------------------------------------------------------------
2421  //**************** Material at outer radius of supermodule ***************
2422  //------------------------------------------------------------------------
2423  //------------------------------------------------------------------------
2424  //------------------------------------------------------------------------
2425  //------------------------------------------------------------------------
2426 
2427  if (0 != backHere()) {
2433 
2434  const DDTranslation outtra(backXOff() + backSideHeight() / 2, backYOff(), backSideLength() / 2);
2435 
2436  const double realBPthick(backPlateThick() + backPlate2Thick());
2437 
2438  DDSolid backPlateSolid(
2439  DDSolidFactory::box(backPlateName(), backPlateWidth() / 2., realBPthick / 2., backPlateLength() / 2.));
2440  const std::vector<double>& backPlateParms(backPlateSolid.parameters());
2441  const DDLogicalPart backPlateLog(backPlateName(), backPlateMat(), backPlateSolid);
2442 
2443  const DDTranslation backPlateTra(
2444  backSideHeight() / 2 + backPlateParms[1], 0 * mm, backPlateParms[2] - backSideLength() / 2);
2445 
2446  DDSolid backPlate2Solid(
2448 
2449  const DDLogicalPart backPlate2Log(backPlate2Name(), backPlate2Mat(), backPlate2Solid);
2450 
2451  const DDTranslation backPlate2Tra(0, -backPlateParms[1] + backPlate2Thick() / 2., 0);
2452  if (0 != backPlateHere()) {
2453  cpv.position(backPlate2Log, backPlateName(), copyOne, backPlate2Tra, DDRotation());
2454 
2455  cpv.position(backPlateLog,
2456  spmName(),
2457  copyOne,
2458  outtra + backPlateTra,
2459  myrot(backPlateName().name() + "Rot5", CLHEP::HepRotationZ(270 * deg)));
2460  }
2466 
2472 
2473  const Trap trapBS(backSideWidth() / 2., //double aHalfLengthXNegZLoY , // bl1, A/2
2474  backSideWidth() / 2., //double aHalfLengthXPosZLoY , // bl2, a/2
2475  backSideWidth() / 4., //double aHalfLengthXPosZHiY , // tl2, b/2
2476  backSideHeight() / 2., //double aHalfLengthYNegZ , // h1, H/2
2477  backSideHeight() / 2., //double aHalfLengthYPosZ , // h2, h/2
2478  backSideLength() / 2., //double aHalfLengthZ , // dz, L/2
2479  backSideAngle(), //double aAngleAD , // alfa1
2480  0, //double aCoord15X , // x15
2481  0 //double aCoord15Y // y15
2482  );
2483 
2484  const DDSolid backSideSolid(mytrap(backSideName().name(), trapBS));
2485  const DDLogicalPart backSideLog(backSideName(), backSideMat(), backSideSolid);
2486 
2487  const DDTranslation backSideTra1(0 * mm, backPlateWidth() / 2 + backSideYOff1(), 1 * mm);
2488  if (0 != backSideHere()) {
2489  cpv.position(
2490  backSideLog,
2491  spmName(),
2492  copyOne,
2493  outtra + backSideTra1,
2494  myrot(backSideName().name() + "Rot8", CLHEP::HepRotationX(180 * deg) * CLHEP::HepRotationZ(90 * deg)));
2495 
2496  const DDTranslation backSideTra2(0 * mm, -backPlateWidth() / 2 + backSideYOff2(), 1 * mm);
2497  cpv.position(backSideLog,
2498  spmName(),
2499  copyTwo,
2500  outtra + backSideTra2,
2501  myrot(backSideName().name() + "Rot9", CLHEP::HepRotationZ(90 * deg)));
2502  }
2508 
2509  //=====================
2510  const double backCoolWidth(backCoolBarWidth() + 2. * backCoolTankWidth());
2511 
2517 
2518  const double manifCut(2 * mm);
2519 
2520  DDSolid mBManifSolid(DDSolidFactory::tubs(
2521  mBManifName(), backCoolWidth / 2. - manifCut, 0, mBManifOutDiam() / 2, 0 * deg, 360 * deg));
2522  const DDLogicalPart mBManifLog(mBManifName(), mBManifMat(), mBManifSolid);
2523 
2524  const DDName mBManifWaName(ddname(mBManifName().name() + "Wa"));
2525  DDSolid mBManifWaSolid(DDSolidFactory::tubs(
2526  mBManifWaName, backCoolWidth / 2. - manifCut, 0, mBManifInnDiam() / 2, 0 * deg, 360 * deg));
2527  const DDLogicalPart mBManifWaLog(mBManifWaName, backPipeWaterMat(), mBManifWaSolid);
2528  cpv.position(mBManifWaLog, mBManifName(), copyOne, DDTranslation(0, 0, 0), DDRotation());
2529 
2535  //=====================
2536 
2542  const double deltaY(-5 * mm);
2543 
2544  DDSolid grEdgeSlotSolid(
2546  const DDLogicalPart grEdgeSlotLog(grEdgeSlotName(), grEdgeSlotMat(), grEdgeSlotSolid);
2547 
2548  unsigned int edgeSlotCopy(0);
2549  unsigned int midSlotCopy(0);
2550 
2551  DDLogicalPart grMidSlotLog[4];
2552 
2553  for (unsigned int iGr(0); iGr != vecGrilleHeight().size(); ++iGr) {
2554  DDName gName(ddname(grilleName() + std::to_string(iGr)));
2555  DDSolid grilleSolid(
2556  DDSolidFactory::box(gName, vecGrilleHeight()[iGr] / 2., backCoolWidth / 2., grilleThick() / 2.));
2557  const DDLogicalPart grilleLog(gName, grilleMat(), grilleSolid);
2558 
2559  const DDTranslation grilleTra(-realBPthick / 2 - vecGrilleHeight()[iGr] / 2,
2560  deltaY,
2561  vecGrilleZOff()[iGr] + grilleThick() / 2 - backSideLength() / 2);
2562  const DDTranslation gTra(outtra + backPlateTra + grilleTra);
2563 
2564  if (0 != grMidSlotHere() && 0 != iGr) {
2565  if (0 == (iGr - 1) % 2) {
2566  DDName mName(ddname(grMidSlotName() + std::to_string(iGr / 2)));
2567  DDSolid grMidSlotSolid(DDSolidFactory::box(
2568  mName, vecGrMidSlotHeight()[(iGr - 1) / 2] / 2., grMidSlotWidth() / 2., grilleThick() / 2.));
2569  grMidSlotLog[(iGr - 1) / 2] = DDLogicalPart(mName, grMidSlotMat(), grMidSlotSolid);
2570  }
2571  cpv.position(grMidSlotLog[(iGr - 1) / 2],
2572  gName,
2573  ++midSlotCopy,
2574  DDTranslation(
2575  vecGrilleHeight()[iGr] / 2. - vecGrMidSlotHeight()[(iGr - 1) / 2] / 2., +grMidSlotXOff(), 0),
2576  DDRotation());
2577  cpv.position(grMidSlotLog[(iGr - 1) / 2],
2578  gName,
2579  ++midSlotCopy,
2580  DDTranslation(
2581  vecGrilleHeight()[iGr] / 2. - vecGrMidSlotHeight()[(iGr - 1) / 2] / 2., -grMidSlotXOff(), 0),
2582  DDRotation());
2583  }
2584 
2585  if (0 != grEdgeSlotHere() && 0 != iGr) {
2586  cpv.position(
2587  grEdgeSlotLog,
2588  gName,
2589  ++edgeSlotCopy,
2590  DDTranslation(
2591  vecGrilleHeight()[iGr] / 2. - grEdgeSlotHeight() / 2., backCoolWidth / 2 - grEdgeSlotWidth() / 2., 0),
2592  DDRotation());
2593  cpv.position(grEdgeSlotLog,
2594  gName,
2595  ++edgeSlotCopy,
2596  DDTranslation(vecGrilleHeight()[iGr] / 2. - grEdgeSlotHeight() / 2.,
2597  -backCoolWidth / 2 + grEdgeSlotWidth() / 2.,
2598  0),
2599  DDRotation());
2600  }
2601  if (0 != grilleHere())
2602  cpv.position(grilleLog, spmName(), iGr, gTra, DDRotation());
2603 
2604  if ((0 != iGr % 2) && (0 != mBManifHere())) {
2605  cpv.position(mBManifLog,
2606  spmName(),
2607  iGr,
2608  gTra - DDTranslation(-mBManifOutDiam() / 2. + vecGrilleHeight()[iGr] / 2.,
2609  manifCut,
2610  grilleThick() / 2. + 3 * mBManifOutDiam() / 2.),
2611  myrot(mBManifName().name() + "R1", CLHEP::HepRotationX(90 * deg)));
2612  cpv.position(mBManifLog,
2613  spmName(),
2614  iGr - 1,
2615  gTra - DDTranslation(-3 * mBManifOutDiam() / 2. + vecGrilleHeight()[iGr] / 2.,
2616  manifCut,
2617  grilleThick() / 2 + 3 * mBManifOutDiam() / 2.),
2618  myrot(mBManifName().name() + "R2", CLHEP::HepRotationX(90 * deg)));
2619  }
2620  }
2621 
2627 
2633 
2634  DDSolid backCoolBarSolid(DDSolidFactory::box(
2636  const DDLogicalPart backCoolBarLog(backCoolBarName(), backCoolBarMat(), backCoolBarSolid);
2637 
2638  DDSolid backCoolBarSSSolid(DDSolidFactory::box(
2640  const DDLogicalPart backCoolBarSSLog(backCoolBarSSName(), backCoolBarSSMat(), backCoolBarSSSolid);
2641  const DDTranslation backCoolBarSSTra(0, 0, 0);
2642  cpv.position(backCoolBarSSLog, backCoolBarName(), copyOne, backCoolBarSSTra, DDRotation());
2643 
2644  DDSolid backCoolBarWaSolid(DDSolidFactory::box(
2646  const DDLogicalPart backCoolBarWaLog(backCoolBarWaName(), backCoolBarWaMat(), backCoolBarWaSolid);
2647  const DDTranslation backCoolBarWaTra(0, 0, 0);
2648  cpv.position(backCoolBarWaLog, backCoolBarSSName(), copyOne, backCoolBarWaTra, DDRotation());
2649 
2655 
2661 
2662  double thickVFE(0);
2663  for (unsigned int iLyr(0); iLyr != vecBackVFELyrThick().size(); ++iLyr) {
2664  thickVFE += vecBackVFELyrThick()[iLyr];
2665  }
2666  DDSolid backVFESolid(
2667  DDSolidFactory::box(backVFEName(), backCoolBarHeight() / 2., backCoolBarWidth() / 2., thickVFE / 2.));
2668  const DDLogicalPart backVFELog(backVFEName(), backVFEMat(), backVFESolid);
2669  DDTranslation offTra(0, 0, -thickVFE / 2);
2670  for (unsigned int iLyr(0); iLyr != vecBackVFELyrThick().size(); ++iLyr) {
2671  DDSolid backVFELyrSolid(DDSolidFactory::box(ddname(vecBackVFELyrName()[iLyr]),
2672  backCoolBarHeight() / 2.,
2673  backCoolBarWidth() / 2.,
2674  vecBackVFELyrThick()[iLyr] / 2.));
2675  const DDLogicalPart backVFELyrLog(
2676  ddname(vecBackVFELyrName()[iLyr]), ddmat(vecBackVFELyrMat()[iLyr]), backVFELyrSolid);
2677  const DDTranslation backVFELyrTra(0, 0, vecBackVFELyrThick()[iLyr] / 2);
2678  cpv.position(backVFELyrLog, backVFEName(), copyOne, backVFELyrTra + offTra, DDRotation());
2679  offTra += 2 * backVFELyrTra;
2680  }
2681 
2687 
2693 
2694  const double halfZCoolVFE(thickVFE + backCoolBarThick() / 2.);
2695  DDSolid backCoolVFESolid(
2696  DDSolidFactory::box(backCoolVFEName(), backCoolBarHeight() / 2., backCoolBarWidth() / 2., halfZCoolVFE));
2697  const DDLogicalPart backCoolVFELog(backCoolVFEName(), backCoolVFEMat(), backCoolVFESolid);
2698  if (0 != backCoolBarHere())
2699  cpv.position(backCoolBarLog, backCoolVFEName(), copyOne, DDTranslation(), DDRotation());
2700  if (0 != backCoolVFEHere())
2701  cpv.position(backVFELog,
2702  backCoolVFEName(),
2703  copyOne,
2704  DDTranslation(0, 0, backCoolBarThick() / 2. + thickVFE / 2.),
2705  DDRotation());
2706  cpv.position(backVFELog,
2707  backCoolVFEName(),
2708  copyTwo,
2709  DDTranslation(0, 0, -backCoolBarThick() / 2. - thickVFE / 2.),
2710  myrot(backVFEName().name() + "Flip", CLHEP::HepRotationX(180 * deg)));
2711 
2717 
2723  unsigned int iCVFECopy(1);
2724  unsigned int iSep(0);
2725  unsigned int iNSec(0);
2726  const unsigned int nMisc(vecBackMiscThick().size() / 4);
2727  for (unsigned int iMod(0); iMod != 4; ++iMod) {
2728  const double pipeLength(vecGrilleZOff()[2 * iMod + 1] - vecGrilleZOff()[2 * iMod] - grilleThick() - 3 * mm);
2729 
2730  const double pipeZPos(vecGrilleZOff()[2 * iMod + 1] - pipeLength / 2 - 1.5 * mm);
2731 
2732  // accumulate total height of parent volume
2733 
2734  double backCoolHeight(backCoolBarHeight() + mBCoolTubeOutDiam());
2735  for (unsigned int iMisc(0); iMisc != nMisc; ++iMisc) {
2736  backCoolHeight += vecBackMiscThick()[iMod * nMisc + iMisc];
2737  }
2738  double bottomThick(mBCoolTubeOutDiam());
2739  for (unsigned int iMB(0); iMB != vecMBLyrThick().size(); ++iMB) {
2740  backCoolHeight += vecMBLyrThick()[iMB];
2741  bottomThick += vecMBLyrThick()[iMB];
2742  }
2743 
2744  DDName backCName(ddname(vecBackCoolName()[iMod]));
2745  const double halfZBCool((pipeLength - 2 * mBManifOutDiam() - grilleZSpace()) / 2);
2746  DDSolid backCoolSolid(DDSolidFactory::box(backCName, backCoolHeight / 2., backCoolWidth / 2., halfZBCool));
2747  const DDLogicalPart backCoolLog(backCName, spmMat(), backCoolSolid);
2748 
2749  const DDTranslation bCoolTra(
2750  -realBPthick / 2 + backCoolHeight / 2 - vecGrilleHeight()[2 * iMod],
2751  deltaY,
2752  vecGrilleZOff()[2 * iMod] + grilleThick() + grilleZSpace() + halfZBCool - backSideLength() / 2);
2753  if (0 != backCoolHere())
2754  cpv.position(backCoolLog, spmName(), iMod + 1, outtra + backPlateTra + bCoolTra, DDRotation());
2755 
2756  //===
2757  const double backCoolTankHeight(backCoolBarHeight()); // - backBracketHeight() ) ;
2758 
2759  const double halfZTank(halfZBCool - 5 * cm);
2760 
2761  DDName bTankName(ddname(backCoolTankName() + std::to_string(iMod + 1)));
2762  DDSolid backCoolTankSolid(
2763  DDSolidFactory::box(bTankName, backCoolTankHeight / 2., backCoolTankWidth() / 2., halfZTank));
2764  const DDLogicalPart backCoolTankLog(bTankName, backCoolTankMat(), backCoolTankSolid);
2765  if (0 != backCoolTankHere())
2766  cpv.position(backCoolTankLog,
2767  backCName,
2768  copyOne,
2769  DDTranslation(-backCoolHeight / 2 + backCoolTankHeight / 2. + bottomThick,
2770  backCoolBarWidth() / 2. + backCoolTankWidth() / 2.,
2771  0),
2772  DDRotation());
2773 
2774  DDName bTankWaName(ddname(backCoolTankWaName() + std::to_string(iMod + 1)));
2775  DDSolid backCoolTankWaSolid(DDSolidFactory::box(bTankWaName,
2776  backCoolTankHeight / 2. - backCoolTankThick() / 2.,
2777  backCoolTankWaWidth() / 2.,
2778  halfZTank - backCoolTankThick() / 2.));
2779  const DDLogicalPart backCoolTankWaLog(bTankWaName, backCoolTankWaMat(), backCoolTankWaSolid);
2780  cpv.position(backCoolTankWaLog, bTankName, copyOne, DDTranslation(0, 0, 0), DDRotation());
2781 
2782  DDName bBracketName(ddname(backBracketName() + std::to_string(iMod + 1)));
2783  DDSolid backBracketSolid(
2784  DDSolidFactory::box(bBracketName, backBracketHeight() / 2., backCoolTankWidth() / 2., halfZTank));
2785  const DDLogicalPart backBracketLog(bBracketName, backBracketMat(), backBracketSolid);
2786  if (0 != backCoolTankHere())
2787  cpv.position(backBracketLog,
2788  backCName,
2789  copyOne,
2790  DDTranslation(backCoolBarHeight() - backCoolHeight / 2. - backBracketHeight() / 2. + bottomThick,
2791  -backCoolBarWidth() / 2. - backCoolTankWidth() / 2.,
2792  0),
2793  DDRotation());
2794 
2795  /* cpv.position( backBracketLog,
2796  backCName,
2797  copyTwo,
2798  DDTranslation( backCoolBarHeight() - backCoolHeight/2. - backBracketHeight()/2.,
2799  backCoolBarWidth()/2. + backCoolTankWidth()/2., 0),
2800  DDRotation() ) ;*/
2801 
2802  //===
2803 
2804  DDTranslation bSumTra(backCoolBarHeight() - backCoolHeight / 2. + bottomThick, 0, 0);
2805  for (unsigned int j(0); j != nMisc; ++j) // loop over miscellaneous layers
2806  {
2807  const DDName bName(ddname(vecBackMiscName()[iMod * nMisc + j]));
2808 
2809  DDSolid bSolid(DDSolidFactory::box(bName,
2810  vecBackMiscThick()[iMod * nMisc + j] / 2,
2812  halfZBCool));
2813 
2814  const DDLogicalPart bLog(bName, ddmat(vecBackMiscMat()[iMod * nMisc + j]), bSolid);
2815 
2816  const DDTranslation bTra(vecBackMiscThick()[iMod * nMisc + j] / 2, 0 * mm, 0 * mm);
2817 
2818  if (0 != backMiscHere())
2819  cpv.position(bLog, backCName, copyOne, bSumTra + bTra, DDRotation());
2820 
2821  bSumTra += 2 * bTra;
2822  }
2823 
2824  const double bHalfWidth(backCoolBarWidth() / 2. + backCoolTankWidth());
2825 
2826  if (0 != mBLyrHere()) {
2827  DDTranslation mTra(-backCoolHeight / 2. + mBCoolTubeOutDiam(), 0, 0);
2828  for (unsigned int j(0); j != vecMBLyrThick().size(); ++j) // loop over MB layers
2829  {
2830  const DDName mName(ddname(vecMBLyrName()[j] + "_" + std::to_string(iMod + 1)));
2831 
2832  DDSolid mSolid(DDSolidFactory::box(mName, vecMBLyrThick()[j] / 2, bHalfWidth, halfZBCool));
2833 
2834  const DDLogicalPart mLog(mName, ddmat(vecMBLyrMat()[j]), mSolid);
2835 
2836  mTra += DDTranslation(vecMBLyrThick()[j] / 2.0, 0 * mm, 0 * mm);
2837  cpv.position(mLog, backCName, copyOne, mTra, DDRotation());
2838  mTra += DDTranslation(vecMBLyrThick()[j] / 2.0, 0 * mm, 0 * mm);
2839  }
2840  }
2841 
2842  if (0 != mBCoolTubeHere()) {
2843  const DDName mBName(ddname(mBCoolTubeName() + "_" + std::to_string(iMod + 1)));
2844 
2845  DDSolid mBCoolTubeSolid(
2846  DDSolidFactory::tubs(mBName, halfZBCool, 0, mBCoolTubeOutDiam() / 2, 0 * deg, 360 * deg));
2847  const DDLogicalPart mBLog(mBName, mBCoolTubeMat(), mBCoolTubeSolid);
2848 
2849  const DDName mBWaName(ddname(mBCoolTubeName() + "Wa_" + std::to_string(iMod + 1)));
2850  DDSolid mBCoolTubeWaSolid(
2851  DDSolidFactory::tubs(mBWaName, halfZBCool, 0, mBCoolTubeInnDiam() / 2, 0 * deg, 360 * deg));
2852  const DDLogicalPart mBWaLog(mBWaName, backPipeWaterMat(), mBCoolTubeWaSolid);
2853  cpv.position(mBWaLog, mBName, copyOne, DDTranslation(0, 0, 0), DDRotation());
2854 
2855  for (unsigned int j(0); j != mBCoolTubeNum(); ++j) // loop over all MB cooling circuits
2856  {
2857  cpv.position(
2858  mBLog,
2859  backCName,
2860  2 * j + 1,
2861  DDTranslation(
2862  -backCoolHeight / 2.0 + mBCoolTubeOutDiam() / 2., -bHalfWidth + (j + 1) * bHalfWidth / 5, 0),
2863  DDRotation());
2864  }
2865  }
2866 
2872  if (0 != backPipeHere() && 0 != iMod) {
2873  DDName bPipeName(ddname(backPipeName() + "_" + std::to_string(iMod + 1)));
2874  DDName bInnerName(ddname(backPipeName() + "_H2O_" + std::to_string(iMod + 1)));
2875 
2876  DDSolid backPipeSolid(
2877  DDSolidFactory::tubs(bPipeName, pipeLength / 2, 0 * mm, vecBackPipeDiam()[iMod] / 2, 0 * deg, 360 * deg));
2878 
2879  DDSolid backInnerSolid(DDSolidFactory::tubs(bInnerName,
2880  pipeLength / 2,
2881  0 * mm,
2882  vecBackPipeDiam()[iMod] / 2 - vecBackPipeThick()[iMod],
2883  0 * deg,
2884  360 * deg));
2885 
2886  const DDLogicalPart backPipeLog(bPipeName, backPipeMat(), backPipeSolid);
2887 
2888  const DDLogicalPart backInnerLog(bInnerName, backPipeWaterMat(), backInnerSolid);
2889 
2890  const DDTranslation bPipeTra1(
2891  backXOff() + backSideHeight() - 0.7 * vecBackPipeDiam()[iMod],
2892  backYOff() + backPlateWidth() / 2 - backSideWidth() - 0.7 * vecBackPipeDiam()[iMod],
2893  pipeZPos);
2894 
2895  cpv.position(backPipeLog, spmName(), copyOne, bPipeTra1, DDRotation());
2896 
2897  const DDTranslation bPipeTra2(bPipeTra1.x(),
2898  backYOff() - backPlateWidth() / 2 + backSideWidth() + vecBackPipeDiam()[iMod],
2899  bPipeTra1.z());
2900 
2901  cpv.position(backPipeLog, spmName(), copyTwo, bPipeTra2, DDRotation());
2902 
2903  cpv.position(backInnerLog, bPipeName, copyOne, DDTranslation(), DDRotation());
2904  }
2910 
2911  //=================================================
2912 
2913  if (0 != dryAirTubeHere()) {
2914  DDName dryAirTubName(ddname(dryAirTubeName() + std::to_string(iMod + 1)));
2915 
2916  DDSolid dryAirTubeSolid(DDSolidFactory::tubs(
2917  dryAirTubName, pipeLength / 2, dryAirTubeInnDiam() / 2, dryAirTubeOutDiam() / 2, 0 * deg, 360 * deg));
2918 
2919  const DDLogicalPart dryAirTubeLog(dryAirTubName, dryAirTubeMat(), dryAirTubeSolid);
2920 
2921  const DDTranslation dryAirTubeTra1(
2922  backXOff() + backSideHeight() - 0.7 * dryAirTubeOutDiam() - vecBackPipeDiam()[iMod],
2923  backYOff() + backPlateWidth() / 2 - backSideWidth() - 1.2 * dryAirTubeOutDiam(),
2924  pipeZPos);
2925 
2926  cpv.position(dryAirTubeLog, spmName(), copyOne, dryAirTubeTra1, DDRotation());
2927 
2928  const DDTranslation dryAirTubeTra2(
2929  dryAirTubeTra1.x(),
2930  backYOff() - backPlateWidth() / 2 + backSideWidth() + 0.7 * dryAirTubeOutDiam(),
2931  dryAirTubeTra1.z());
2932 
2933  cpv.position(dryAirTubeLog, spmName(), copyTwo, dryAirTubeTra2, DDRotation());
2934  }
2935  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2936 
2942 
2943  DDTranslation cTra(backCoolBarHeight() / 2. - backCoolHeight / 2. + bottomThick, 0, -halfZTank + halfZCoolVFE);
2944  const unsigned int numSec(static_cast<unsigned int>(vecBackCoolNSec()[iMod]));
2945  for (unsigned int jSec(0); jSec != numSec; ++jSec) {
2946  const unsigned int nMax(static_cast<unsigned int>(vecBackCoolNPerSec()[iNSec++]));
2947  for (unsigned int iBar(0); iBar != nMax; ++iBar) {
2948  cpv.position(backCoolVFELog, backCName, iCVFECopy++, cTra, DDRotation());
2949  cTra += DDTranslation(0, 0, backCBStdSep());
2950  }
2951  cTra -= DDTranslation(0, 0, backCBStdSep()); // backspace to previous
2952  if (jSec != numSec - 1)
2953  cTra += DDTranslation(0, 0, vecBackCoolSecSep()[iSep++]); // now take atypical step
2954  }
2960  }
2961 
2967 
2973 
2974  double patchHeight(0);
2975  for (unsigned int iPatch(0); iPatch != vecPatchPanelThick().size(); ++iPatch) {
2976  patchHeight += vecPatchPanelThick()[iPatch];
2977  }
2978 
2980  patchHeight / 2.,
2981  backCoolBarWidth() / 2.,
2982  (vecSpmZPts().back() - vecGrilleZOff().back() - grilleThick()) / 2));
2983 
2984  const std::vector<double>& patchParms(patchSolid.parameters());
2985 
2986  const DDLogicalPart patchLog(patchPanelName(), spmMat(), patchSolid);
2987 
2988  const DDTranslation patchTra(backXOff() + 4 * mm, 0 * mm, vecGrilleZOff().back() + grilleThick() + patchParms[2]);
2989  if (0 != patchPanelHere())
2990  cpv.position(patchLog, spmName(), copyOne, patchTra, DDRotation());
2991 
2992  DDTranslation pTra(-patchParms[0], 0, 0);
2993 
2994  for (unsigned int j(0); j != vecPatchPanelNames().size(); ++j) {
2995  const DDName pName(ddname(vecPatchPanelNames()[j]));
2996 
2997  DDSolid pSolid(DDSolidFactory::box(pName, vecPatchPanelThick()[j] / 2., patchParms[1], patchParms[2]));
2998 
2999  const DDLogicalPart pLog(pName, ddmat(vecPatchPanelMat()[j]), pSolid);
3000 
3001  pTra += DDTranslation(vecPatchPanelThick()[j] / 2, 0 * mm, 0 * mm);
3002 
3003  cpv.position(pLog, patchPanelName(), copyOne, pTra, DDRotation());
3004 
3005  pTra += DDTranslation(vecPatchPanelThick()[j] / 2, 0 * mm, 0 * mm);
3006  }
3012 
3018 
3019  if (0 != pincerRodHere()) {
3020  // Make hierarchy of rods, envelopes, blocks, shims, and cutouts
3021 
3022  DDSolid rodSolid(
3023  DDSolidFactory::box(pincerRodName(), pincerEnvWidth() / 2., pincerEnvHeight() / 2., ilyLength / 2));
3024  const DDLogicalPart rodLog(pincerRodName(), pincerRodMat(), rodSolid);
3025 
3026  DDSolid envSolid(
3028  const DDLogicalPart envLog(pincerEnvName(), pincerEnvMat(), envSolid);
3029  const std::vector<double>& envParms(envSolid.parameters());
3030 
3031  DDSolid blkSolid(
3033  const DDLogicalPart blkLog(pincerBlkName(), pincerBlkMat(), blkSolid);
3034  const std::vector<double>& blkParms(blkSolid.parameters());
3035  cpv.position(blkLog,
3036  pincerEnvName(),
3037  copyOne,
3038  DDTranslation(0, 0, pincerEnvLength() / 2 - pincerBlkLength() / 2),
3039  DDRotation());
3040 
3041  DDSolid cutSolid(
3043  const DDLogicalPart cutLog(pincerCutName(), pincerCutMat(), cutSolid);
3044  const std::vector<double>& cutParms(cutSolid.parameters());
3045  cpv.position(
3046  cutLog,
3047  pincerBlkName(),
3048  copyOne,
3049  DDTranslation(
3050  +blkParms[0] - cutParms[0] - pincerShim1Width() + pincerShim2Width(), -blkParms[1] + cutParms[1], 0),
3051  DDRotation());
3052 
3053  DDSolid shim2Solid(DDSolidFactory::box(
3055  const DDLogicalPart shim2Log(pincerShim2Name(), pincerShimMat(), shim2Solid);
3056  const std::vector<double>& shim2Parms(shim2Solid.parameters());
3057  cpv.position(shim2Log,
3058  pincerCutName(),
3059  copyOne,
3060  DDTranslation(+cutParms[0] - shim2Parms[0], -cutParms[1] + shim2Parms[1], 0),
3061  DDRotation());
3062 
3064  pincerShim1Width() / 2.,
3065  pincerShimHeight() / 2.,
3066  (pincerEnvLength() - pincerBlkLength()) / 2));
3067 
3068  const DDLogicalPart shim1Log(pincerShim1Name(), pincerShimMat(), shim1Solid);
3069  const std::vector<double>& shim1Parms(shim1Solid.parameters());
3070  cpv.position(
3071  shim1Log,
3072  pincerEnvName(),
3073  copyOne,
3074  DDTranslation(+envParms[0] - shim1Parms[0], -envParms[1] + shim1Parms[1], -envParms[2] + shim1Parms[2]),
3075  DDRotation());
3076 
3077  for (unsigned int iEnv(0); iEnv != vecPincerEnvZOff().size(); ++iEnv) {
3078  cpv.position(envLog,
3079  pincerRodName(),
3080  1 + iEnv,
3081  DDTranslation(0, 0, -ilyLength / 2. + vecPincerEnvZOff()[iEnv] - pincerEnvLength() / 2.),
3082  DDRotation());
3083  }
3084 
3085  // Place the rods
3086  // const double radius ( fawRadOff() - pincerEnvHeight()/2 -1*mm ) ;
3087  const double radius(ilyRMin - pincerEnvHeight() / 2 - 1 * mm);
3088 
3089  const DDName xilyName(ddname(ilyName() + std::to_string(vecIlyMat().size() - 1)));
3090 
3091  for (unsigned int iRod(0); iRod != vecPincerRodAzimuth().size(); ++iRod) {
3092  const DDTranslation rodTra(
3093  radius * cos(vecPincerRodAzimuth()[iRod]), radius * sin(vecPincerRodAzimuth()[iRod]), 0);
3094 
3095  cpv.position(rodLog,
3096  xilyName,
3097  1 + iRod,
3098  rodTra,
3099  myrot(pincerRodName().name() + std::to_string(iRod),
3100  CLHEP::HepRotationZ(90 * deg + vecPincerRodAzimuth()[iRod])));
3101  }
3102  }
3108  }
3109  }
3110 
3111  LogDebug("EcalGeom") << "******** DDEcalBarrelAlgo test: end it...";
3112 }
3113 
3115 DDRotation DDEcalBarrelNewAlgo::myrot(const std::string& s, const CLHEP::HepRotation& r) const {
3116  return DDrot(
3117  ddname(m_idNameSpace + ":" + s),
3118  std::make_unique<DDRotationMatrix>(r.xx(), r.xy(), r.xz(), r.yx(), r.yy(), r.yz(), r.zx(), r.zy(), r.zz()));
3119 }
3120 
3122 
3124  const pair<std::string, std::string> temp(DDSplit(s));
3125  if (temp.second.empty()) {
3126  return DDName(temp.first, m_idNameSpace);
3127  } else {
3128  return DDName(temp.first, temp.second);
3129  }
3130 }
3131 
3133  return DDSolidFactory::trap(
3134  ddname(s), t.dz(), t.theta(), t.phi(), t.h1(), t.bl1(), t.tl1(), t.alp1(), t.h2(), t.bl2(), t.tl2(), t.alp2());
3135 }
3136 
3137 void DDEcalBarrelNewAlgo::web(unsigned int iWeb,
3138  double bWeb,
3139  double BWeb,
3140  double LWeb,
3141  double theta,
3142  const HepGeom::Point3D<double>& corner,
3143  const DDLogicalPart& logPar,
3144  double& zee,
3145  double side,
3146  double front,
3147  double delta,
3148  DDCompactView& cpv) {
3149  const unsigned int copyOne(1);
3150 
3151  const double LWebx(vecWebLength()[iWeb]);
3152 
3153  const double BWebx(bWeb + (BWeb - bWeb) * LWebx / LWeb);
3154 
3155  const double thick(vecWebPlTh()[iWeb] + vecWebClrTh()[iWeb]);
3156  const Trap trapWebClr(BWebx / 2, // A/2
3157  bWeb / 2, // a/2
3158  bWeb / 2, // b/2
3159  thick / 2, // H/2
3160  thick / 2, // h/2
3161  LWebx / 2, // L/2
3162  90 * deg, // alfa1
3163  bWeb - BWebx, // x15
3164  0 // y15
3165  );
3166  const DDName webClrDDName(webClrName() + std::to_string(iWeb));
3167  const DDSolid webClrSolid(mytrap(webClrDDName.name(), trapWebClr));
3168  const DDLogicalPart webClrLog(webClrDDName, webClrMat(), webClrSolid);
3169 
3170  const Trap trapWebPl(trapWebClr.A() / 2, // A/2
3171  trapWebClr.a() / 2, // a/2
3172  trapWebClr.b() / 2, // b/2
3173  vecWebPlTh()[iWeb] / 2, // H/2
3174  vecWebPlTh()[iWeb] / 2, // h/2
3175  trapWebClr.L() / 2., // L/2
3176  90 * deg, // alfa1
3177  trapWebClr.b() - trapWebClr.B(), // x15
3178  0 // y15
3179  );
3180  const DDName webPlDDName(webPlName() + std::to_string(iWeb));
3181  const DDSolid webPlSolid(mytrap(webPlDDName.fullname(), trapWebPl));
3182  const DDLogicalPart webPlLog(webPlDDName, webPlMat(), webPlSolid);
3183 
3184  cpv.position(webPlLog, // place plate inside clearance volume
3185  webClrDDName,
3186  copyOne,
3187  DDTranslation(0, 0, 0),
3188  DDRotation());
3189 
3190  const Trap::VertexList vWeb(trapWebClr.vertexList());
3191 
3192  zee += trapWebClr.h() / sin(theta);
3193 
3194  const double beta(theta + delta);
3195 
3196  const double zWeb(zee - front * cos(beta) + side * sin(beta));
3197  const double yWeb(front * sin(beta) + side * cos(beta));
3198 
3199  const Pt3D wedge3(corner + Pt3D(0, -yWeb, zWeb));
3200  const Pt3D wedge2(wedge3 + Pt3D(0, trapWebClr.h() * cos(theta), -trapWebClr.h() * sin(theta)));
3201  const Pt3D wedge1(wedge3 + Pt3D(trapWebClr.a(), 0, 0));
3202 
3203  LogDebug("EcalGeom") << "trap1=" << vWeb[0] << ", trap2=" << vWeb[2] << ", trap3=" << vWeb[3];
3204 
3205  LogDebug("EcalGeom") << "wedge1=" << wedge1 << ", wedge2=" << wedge2 << ", wedge3=" << wedge3;
3206 
3207  const Tf3D tForm(vWeb[0], vWeb[2], vWeb[3], wedge1, wedge2, wedge3);
3208 
3209  if (0 != webHere())
3210  cpv.position(webClrLog,
3211  logPar,
3212  copyOne,
3213  DDTranslation(tForm.getTranslation().x(), tForm.getTranslation().y(), tForm.getTranslation().z()),
3214  myrot(webClrLog.name().name() + std::to_string(iWeb), tForm.getRotation()));
3215 }
3216 
3218 
3219 DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDEcalBarrelNewAlgo, "ecal:DDEcalBarrelNewAlgo");
#define LogDebug(id)
DDMaterial grEdgeSlotMat() const
double spmExpYOff() const
const std::vector< double > & vecBackCoolNPerSec() const
size
Write out results.
double backCoolBarThick() const
std::vector< double > m_vecPincerEnvZOff
std::vector< double > m_vecIlyFEMZ
std::vector< double > m_vecNomCryDimCF
HepGeom::RotateX3D RoX3D
DDMaterial backCoolBarMat() const
HepGeom::Transform3D Tf3D
type
Definition: HCALResponse.h:21
double spmSideYOffM() const
double ilyFanOutHeight() const
double spmSideHigh() const
std::vector< std::string > m_vecBackVFELyrMat
const std::string & backCoolTankName() const
DDName ilyDiffName() const
std::vector< std::string > m_vecBackCoolName
std::vector< std::string > m_vecIlyMat
const std::vector< double > & parameters(void) const
Give the parameters of the solid.
Definition: DDSolid.cc:121
double patchPanelHere() const
HepGeom::Point3D< double > Pt3D
DDMaterial ilyBndlMat() const
const std::string & webPlName() const
std::vector< double > m_vecSpmZPts
CLHEP::HepRotation Rota
double ilyPTMHeight() const
DDName backCoolBarWaName() const
double mBManifHere() const
DDMaterial wrapMat() const
const N & name() const
Definition: DDBase.h:59
DDMaterial backCoolBarSSMat() const
DDMaterial webClrMat() const
DDMaterial ilyPTMMat() const
DDMaterial mBManifMat() const
std::vector< double > vecPincerRodAzimuth() const
const std::vector< double > & vecGrilleHeight() const
double pincerCutHeight() const
const std::vector< double > & vecSpmCutTP() const
DDMaterial capMat() const
double backPlateHere() const
double backSideYOff1() const
const std::vector< double > & vecIlyPipeZ() const
DDMaterial backCoolBarWaMat() const
std::vector< double > m_vecSpmBTran
void initialize(const DDNumericArguments &nArgs, const DDVectorArguments &vArgs, const DDMapArguments &mArgs, const DDStringArguments &sArgs, const DDStringVectorArguments &vsArgs) override
const std::string & backPipeName() const
double pincerEnvLength() const
DDMaterial pincerRodMat() const
const std::vector< std::string > & vecBackVFELyrMat() const
const std::vector< double > & vecGapAlvEta() const
const std::vector< double > & vecSpmCutTM() const
const std::vector< double > & vecBackCoolNSec() const
double backCoolBarHere() const
DDName pincerRodName() const
const std::vector< std::string > & vecPatchPanelMat() const
double barPhiLo() const
double spmSideYOffP() const
double backCoolBarSSThick() const
const std::vector< double > & vecNomCryDimAR() const
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:45
double backCoolHere() const
unsigned int nFawPerSupm() const
double grilleWidth() const
std::vector< double > m_vecBarTran
const std::vector< double > & vecBackPipeThick() const
double dryAirTubeHere() const
double mBCoolTubeInnDiam() const
double grEdgeSlotHeight() const
std::vector< double > m_vecBackMiscThick
std::vector< double > m_vecNomCryDimAR
const std::string & backBracketName() const
static DDSolid polycone(const DDName &name, double startPhi, double deltaPhi, const std::vector< double > &z, const std::vector< double > &rmin, const std::vector< double > &rmax)
Creates a polycone (refere to Geant3 or Geant4 documentation)
Definition: DDSolid.cc:537
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
double mBManifInnDiam() const
DDMaterial apdMat() const
DDMaterial wallMat() const
const std::vector< double > & vecIlyFanOutZ() const
std::vector< double > m_vecIlyFanOutZ
HepGeom::RotateY3D RoY3D
Geom::Theta< T > theta() const
const std::vector< std::string > & vecMBLyrMat() const
double backPlateLength() const
double backSideLength() const
const std::string & ilyPipeName() const
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:15
const std::vector< double > & vecMBLyrThick() const
#define M_PI_2
std::vector< double > m_vecIlyFanOutPhi
DDName pincerBlkName() const
DDSolid mytrap(const std::string &s, const Trap &t) const
const std::vector< std::string > & vecBackCoolName() const
const std::string & dryAirTubeName() const
DDName ilyBndlName() const
const std::vector< double > & vecBarRMin() const
DDMaterial bsiMat() const
std::vector< std::string > m_vecBackMiscName
double ilyFanOutWidth() const
static std::string & ns()
double backCoolVFEHere() const
std::vector< double > m_vecBackCoolSecSep
std::vector< double > vecPincerEnvZOff() const
double grEdgeSlotHere() const
std::vector< double > m_vecBarRota2
double hawYOffCry() const
DDName backPlate2Name() const
double pincerCutWidth() const
double backPlateThick() const
const std::string & grMidSlotName() const
DDMaterial backBracketMat() const
std::vector< double > m_vecNomCryDimBF
std::vector< double > m_vecWebClrTh
const std::vector< double > & vecNomCryDimCR() const
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:80
DDRotation myrot(const std::string &s, const CLHEP::HepRotation &r) const
Create a DDRotation from a string converted to DDName and CLHEP::HepRotation converted to DDRotationM...
DDMaterial atjMat() const
DDMaterial backVFEMat() const
double backCoolBarWidth() const
DDName grEdgeSlotName() const
std::vector< double > m_vecBarRMin
DDMaterial backSideMat() const
std::vector< double > m_vecIlyPipePhi
DDName patchPanelName() const
double pincerShim1Width() const
double backPlate2Thick() const
std::vector< std::string > m_vecPatchPanelMat
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
const std::vector< double > & vecSpmHere() const
std::vector< std::string > m_vecPatchPanelNames
const std::vector< double > & vecSpmZPts() const
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
double spmSideThick() const
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:57
DDName backSideName() const
const std::vector< double > & vecBackMiscThick() const
double ilyDiffOff() const
std::vector< std::string > m_vecMBLyrName
std::vector< double > m_vecSpmBRota
DDName backCoolBarName() const
double ilyFEMHeight() const
std::vector< double > m_vecSpmRMax
double spmCutThick() const
const std::vector< double > & vecSpmTran() const
const std::vector< double > & vecBackCoolSecSep() const
const std::vector< double > & vecPatchPanelThick() const
const std::string & backCoolTankWaName() const
std::vector< double > m_vecPincerRodAzimuth
double ilyFEMWidth() const
const std::vector< double > & vecBackPipeDiam() const
DDName spmCutName() const
std::vector< double > m_vecWebLength
double mBCoolTubeOutDiam() const
DDMaterial spmSideMat() const
double mBManifOutDiam() const
std::vector< double > m_vecBarRota
const std::string & clrName() const
double backCoolTankWaWidth() const
EcalTrapezoidParameters Trap
double backCoolTankHere() const
std::vector< std::string > m_vecBackVFELyrName
DDMaterial sglMat() const
DDName spmSideName() const
double backCoolTankWidth() const
double barPhiHi() const
DDMaterial backPipeMat() const
double nomCryDimLZ() const
DDMaterial clrMat() const
DDMaterial ilyFanOutMat() const
double dryAirTubeInnDiam() const
DDMaterial grMidSlotMat() const
DDMaterial aglMat() const
double ilyBndlOff() const
const std::vector< std::string > & vecIlyMat() const
const std::vector< std::string > & vecPatchPanelNames() const
CLHEP::Hep3Vector Vec3
T sqrt(T t)
Definition: SSEVec.h:19
DDName pincerEnvName() const
double ilyFEMLength() const
const std::vector< double > & vecGrMidSlotHeight() const
std::vector< double > m_vecNomCryDimCR
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
const std::vector< double > & vecWebLength() const
double backSideWidth() const
std::vector< double > m_vecNomCryDimBR
double ilyPipeHere() const
DDMaterial backPipeWaterMat() const
const std::vector< double > & vecIlyPipeType() const
double grilleThick() const
std::vector< std::string > m_vecBackMiscMat
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:93
const std::vector< double > & vecIlyFEMZ() const
std::vector< double > m_vecBackCoolNSec
double grMidSlotXOff() const
const std::vector< double > & vecBackVFELyrThick() const
DDMaterial backCoolVFEMat() const
DDRotation DDrot(const DDName &name, std::unique_ptr< DDRotationMatrix > rot)
Definition of a uniquely identifiable rotation matrix named by DDName name.
Definition: DDRotation.cc:67
const std::vector< double > & vecSpmRMax() const
double backPipeHere() const
const std::vector< double > & vecSpmBRota() const
double pincerRodHere() const
std::vector< double > m_vecIlyPipeType
const std::vector< std::string > & vecBackMiscName() const
static DDSolid tubs(const DDName &name, double zhalf, double rIn, double rOut, double startPhi, double deltaPhi)
Definition: DDSolid.cc:653
const std::vector< double > & vecIlyFanOutPhi() const
DDMaterial mBCoolTubeMat() const
const std::string & mBCoolTubeName() const
const std::vector< std::string > & vecBackVFELyrName() const
DDMaterial backCoolTankWaMat() const
unsigned int nCryPerAlvEta() const
const std::vector< double > & vecIlyThick() const
DDName ilyFanOutName() const
double backCoolBarHeight() const
const std::vector< double > & vecSpmRMin() const
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:595
DDName pincerShim1Name() const
void execute(DDCompactView &cpv) override
std::vector< double > m_vecPatchPanelThick
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:533
std::vector< double > m_vecSpmCutTM
DDMaterial pincerEnvMat() const
DDName ilyFEMName() const
const std::vector< std::string > & vecBackMiscMat() const
std::vector< double > m_vecBarRMax
DDMaterial pincerCutMat() const
const std::string & webClrName() const
DDMaterial backPlateMat() const
double ilyBndlLength() const
const std::string & idNameSpace() const
DDName backVFEName() const
const std::vector< double > & vecNomCryDimBF() const
unsigned int nCryTypes() const
std::vector< std::string > m_vecMBLyrMat
std::vector< double > m_vecBarRota3
double ilyPTMLength() const
unsigned int spmNPerHalf() const
DDMaterial webPlMat() const
std::vector< double > m_vecIlyPTMPhi
std::vector< double > m_vecWebPlTh
double grilleHere() const
double backCoolBarWaThick() const
double pincerEnvHeight() const
const std::vector< double > & vecSpmBTran() const
const std::vector< double > & vecIlyPTMPhi() const
double spmPhiOff() const
const std::string & ilyName() const
const std::vector< double > & vecIlyPTMZ() const
double grMidSlotHere() const
HepGeom::RotateZ3D RoZ3D
DDMaterial barMat() const
DDName pincerShim2Name() const
std::vector< double > m_vecBackVFELyrThick
HepGeom::Translate3D Tl3D
const std::vector< double > & vecNomCryDimCF() const
DDMaterial pincerShimMat() const
double ilyPTMWidth() const
double ilyFanOutLength() const
double grilleZSpace() const
double backSideHeight() const
HepGeom::Rotate3D Ro3D
DDMaterial grilleMat() const
DDName backCoolVFEName() const
double backSideAngle() const
std::vector< double > m_vecGrMidSlotHeight
double pincerEnvWidth() const
std::vector< double > m_vecBackPipeDiam
HepGeom::ReflectZ3D RfZ3D
DDMaterial ilyFEMMat() const
std::vector< double > m_vecSpmTran
DDMaterial backCoolMat() const
static DDSolid subtraction(const DDName &name, const DDSolid &a, const DDSolid &b, const DDTranslation &t, const DDRotation &r)
Definition: DDSolid.cc:585
DDMaterial spmMat() const
void web(unsigned int iWeb, double bWeb, double BWeb, double LWeb, double theta, const Pt3D &corner, const DDLogicalPart &logPar, double &zee, double side, double front, double delta, DDCompactView &cpv)
std::vector< double > m_vecGrilleHeight
double ilyPTMHere() const
DDMaterial ilyPipeMat() const
double backSideYOff2() const
DDMaterial cerMat() const
std::vector< double > m_vecGapAlvEta
DDMaterial andMat() const
DDName backPlateName() const
DDMaterial cryMat() const
void position(const DDLogicalPart &self, const DDLogicalPart &parent, const std::string &copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=0)
double dryAirTubeOutDiam() const
DDMaterial gridMat() const
const std::vector< double > & vecBarRMax() const
const std::vector< double > & vecSpmRota() const
DDMaterial backPlate2Mat() const
DDMaterial dryAirTubeMat() const
const std::vector< double > & vecBarRota2() const
std::vector< double > m_vecMBLyrThick
const std::vector< double > & vecIlyFEMPhi() const
std::vector< double > m_vecIlyPipeZ
double grEdgeSlotWidth() const
std::vector< double > m_vecIlyThick
double pincerShimHeight() const
std::vector< double > m_vecGrilleZOff
DDName pincerCutName() const
double mBCoolTubeNum() const
const std::string & grilleName() const
double spmCutRP() const
DDMaterial pincerBlkMat() const
std::vector< double > m_vecIlyPTMZ
double grMidSlotWidth() const
double spmExpThick() const
double spmExpWide() const
double backMiscHere() const
double backCoolTankThick() const
DDMaterial backCoolTankMat() const
std::vector< double > m_vecBarZPts
double mBCoolTubeHere() const
double spmCutRM() const
const std::vector< double > & vecNomCryDimBR() const
double ilyFanOutHere() const
const std::vector< double > & vecWebPlTh() const
#define DEFINE_EDM_PLUGIN(factory, type, name)
const std::vector< double > & vecIlyPipePhi() const
std::vector< double > m_vecSpmRota
double hawRCutDelY() const
double backSideHere() const
double spmLowPhi() const
double backCBStdSep() const
double ilyDiffLength() const
DDMaterial ddmat(const std::string &s) const
const std::vector< double > & vecWebClrTh() const
const std::vector< std::string > & vecMBLyrName() const
DDName ddname(const std::string &s) const
const std::vector< double > & vecBarRota() const
DDName backCoolBarSSName() const
const std::vector< double > & vecBarZPts() const
std::vector< double > m_vecSpmCutTP
double pincerBlkLength() const
double backPlateWidth() const
const std::vector< double > & vecBarRota3() const
const std::vector< double > & vecBarTran() const
std::pair< std::string, std::string > DDSplit(const std::string &n)
split into (name,namespace), separator = &#39;:&#39;
Definition: DDSplit.cc:3
double spmDelPhi() const
ROOT::Math::Rotation3D DDRotation
double pincerShim2Width() const
std::vector< double > m_vecIlyPipeLength
double backBracketHeight() const
CaloCellGeometry::Pt3DVec VertexList
const std::string & name() const
Returns the name.
Definition: DDName.cc:40
std::vector< double > m_vecSpmRMin
std::vector< double > m_vecBackPipeThick
const std::string & cryName() const
const std::vector< double > & vecGrilleZOff() const
std::vector< double > m_vecIlyFEMPhi
DDName ilyPTMName() const
const std::string & wallName() const
std::vector< double > m_vecSpmHere
double nomCryDimAF() const
std::vector< double > m_vecBackCoolNPerSec
const std::string & wrapName() const
DDMaterial ilyDiffMat() const
const std::vector< double > & vecIlyPipeLength() const
DDName mBManifName() const