48{
49
51
54 staveRing.SetParametersAndBuild("Brl0A_StaveRing","AC");
55 staveRing.SetParametersAndBuild("Brl0C_StaveRing","AC");
56 return nullptr;
57 }
58
59 double layerRadius =
m_gmt_mgr->PixelLayerRadius();
60 double ladderTilt =
m_gmt_mgr->PixelLadderTilt();
61 int nSectors =
m_gmt_mgr->NPixelSectors();
62
63 double ladderHalfThickN =
m_ladder.thicknessN();
64 double ladderHalfThickP =
m_ladder.thicknessP();
65 double safetyMargin = 0.001*Gaudi::Units::mm;
66
67
68 GeoPhysVol* endblockA=
dynamic_cast<GeoPhysVol*
>(
m_staveSupport.getEndblockEnvelopShape(2));
69 GeoPhysVol* endblockC=
dynamic_cast<GeoPhysVol*
>(
m_staveSupport.getEndblockEnvelopShape(-2));
73 GeoPhysVol* endblockFlex=
dynamic_cast<GeoPhysVol*
>(
m_staveSupport.getEndblockEnvelopShape(1));
74 GeoTransform* endblockFlexTrf=
m_staveSupport.getEndblockEnvelopShapeTrf(1);
75 GeoPhysVol* serviceCoolPipe=
dynamic_cast<GeoPhysVol*
>(
m_staveSupport.getEndblockEnvelopShape(3));
76 GeoTransform* serviceCoolPipeTrfA=
m_staveSupport.getEndblockEnvelopShapeTrf(2);
77 GeoTransform* serviceCoolPipeTrfC=
m_staveSupport.getEndblockEnvelopShapeTrf(-2);
78 const GeoTrf::Transform3D ladderLocalTrf=
m_staveSupport.transform();
79 double dogLegStaveLength=17.87;
80 double halfSupportLength=endblockLength*0.5+dogLegStaveLength*0.5;
81
82 m_gmt_mgr->msg(MSG::DEBUG)<<
"IBL EOS : "<<endblockZpos<<
" "<<serviceZpos<<
" "<<endblockLength<<
endmsg;
83 if((!endblockA) || (!endblockC) || (!endblockFlex) || (!serviceCoolPipe))
84 {
85 m_gmt_mgr->msg(MSG::ERROR) <<
"dynamic_cast failure in "<<__FILE__<<
":"<< __LINE__<<
endmsg;
86 std::abort();
87 }
88
89
91 std::ostringstream lnameA;
92 lnameA << "Brl0A_StaveRing";
93 GeoVPhysVol* ringphysA = staveRing.SetParametersAndBuild(lnameA.str(),"AC");
94 GeoNameTag *tagA = new GeoNameTag(lnameA.str());
95
96
97 std::ostringstream lnameC;
98 lnameC << "Brl0C_StaveRing";
99 GeoVPhysVol* ringphysC = staveRing.SetParametersAndBuild(lnameC.str(),"AC");
100 GeoNameTag *tagC = new GeoNameTag(lnameC.str());
101
102
103 double innerRadius = staveRing.GetInnerRadius()-safetyMargin;
104
105 double zmin = serviceZpos-(endblockLength*0.5+dogLegStaveLength*0.5);
106 double zmax = serviceZpos+(endblockLength*0.5+dogLegStaveLength*0.5);
107 double outerRadius =
m_gmt_mgr->IBLServiceGetMinRadialPosition(
"IST",
"simple",zmin, zmax);
108
109
110
111 m_gmt_mgr->msg(MSG::DEBUG)<<
"Support assembly : "<<innerRadius<<
" "<<outerRadius<<
" ladderThickP "<<ladderHalfThickP<<
" "<<ladderHalfThickN<<
113
114
115 const GeoTube* supportShape = new GeoTube(innerRadius,outerRadius,endblockLength*0.5+dogLegStaveLength*0.5);
116 const GeoMaterial* ether =
m_mat_mgr->getMaterial(
"special::Ether");
117 GeoLogVol* supportLogVol_A = new GeoLogVol("StaveRingAndEndblocks_A",supportShape,ether);
118 GeoLogVol* supportLogVol_C = new GeoLogVol("StaveRingAndEndblocks_C",supportShape,ether);
119
120
121
122
125
126 if(nSectors==0){
127 m_gmt_mgr->msg(MSG::ERROR)<<
"No phi sectors defined"<<std::endl;
128 }
129 else {
130
131 double angle=360./nSectors*Gaudi::Units::deg;
132 GeoTrf::Transform3D transRadiusAndTilt = GeoTrf::TranslateX3D(layerRadius)*GeoTrf::RotateZ3D(ladderTilt);
133 double phiOfModuleZero =
m_gmt_mgr->PhiOfModuleZero();
134
136 {
137
138 GeoTrf::Vector3D centerCoolingPipe =
m_gmt_mgr->IBLStaveRotationAxis() ;
139
140
141 GeoTrf::Transform3D staveTrf = GeoTrf::RotateZ3D(ladderTilt)*GeoTrf::Translate3D(-centerCoolingPipe.x(),-centerCoolingPipe.y(),-centerCoolingPipe.z());
142 double staveRadius =
m_gmt_mgr->IBLStaveRadius() ;
143
144 transRadiusAndTilt = GeoTrf::TranslateX3D(staveRadius)*staveTrf;
145 }
146
147 for(int ii = 0; ii < nSectors; ii++) {
149
150 double phiOfSector = phiOfModuleZero + ii*
angle;
151
152
153 GeoTrf::Transform3D ladderTransform = GeoTrf::RotateZ3D(phiOfSector) * transRadiusAndTilt ;
154
155
156
157
158 std::ostringstream nameTag;
159 nameTag << "Endblock" << ii;
160 GeoNameTag *
tag =
new GeoNameTag(nameTag.str());
161 GeoTransform* xformA = new GeoTransform(ladderTransform*ladderLocalTrf*GeoTrf::TranslateZ3D(endblockZpos-serviceZpos-dogLegStaveLength*0.5));
165
166 GeoTransform* xformC = new GeoTransform(ladderTransform*ladderLocalTrf*GeoTrf::TranslateZ3D(-endblockZpos+serviceZpos+dogLegStaveLength*0.5));
170
171
172
173
174 std::ostringstream nameTagFlex;
175 nameTagFlex << "EndblockFlex" << ii;
176 GeoNameTag * tagFlex = new GeoNameTag(nameTagFlex.str());
177 GeoTransform* xformFlexA = new GeoTransform(ladderTransform*ladderLocalTrf*(endblockFlexTrf->getTransform())*GeoTrf::TranslateZ3D(-dogLegStaveLength*0.5));
178 GeoTransform* xformFlexB = new GeoTransform(ladderTransform*ladderLocalTrf*(endblockFlexTrf->getTransform())*GeoTrf::TranslateZ3D(dogLegStaveLength*0.5));
179
183
187
188
189
190
191 if(serviceCoolPipe){
192 std::ostringstream nameTagPipe;
193 nameTagPipe << "ServicePipe" << ii;
194 GeoNameTag * tagPipe = new GeoNameTag(nameTagPipe.str());
195 GeoTransform* xformPipeA = new GeoTransform(ladderTransform*ladderLocalTrf*(serviceCoolPipeTrfA->getTransform())) ;
199
200 GeoTransform* xformPipeC = new GeoTransform(ladderTransform*ladderLocalTrf*(serviceCoolPipeTrfC->getTransform()));
204
205
206
207
208
209
210
211
212
213
214
215
217 double eoStave=halfSupportLength-dogLegStaveLength;
218
219 double height1=
m_gmt_mgr->IBLFlexDoglegHeight(1);
220 double height2=
m_gmt_mgr->IBLFlexDoglegHeight(2);
221 double part1=
m_gmt_mgr->IBLFlexDoglegRatio();
222
224 double alpha2=
atan(height2/(
length*(1.-part1)));
225
226 double dimX_lin=
length*part1;
227 double dimX=dimX_lin/
cos(alpha1)-.15;
228 double dimY=
m_gmt_mgr->IBLStaveFlexWidth();
229 double dimZ=
m_gmt_mgr->IBLStaveFlexBaseThickness();
230 double angle=90.*Gaudi::Units::deg-alpha1;
231 double delta=
m_gmt_mgr->IBLFlexDoglegDY();
232 double trX=-dimX_lin*
tan(alpha1)*0.5;
233 double trZ=eoStave+dimX_lin*0.5;
234
235 std::vector<double> xShape, yShape;
236 xShape.push_back(dimX*0.5); yShape.push_back(dimY*0.5);
237 xShape.push_back(-dimX*0.5); yShape.push_back(dimY*0.5+delta);
238 xShape.push_back(-dimX*0.5); yShape.push_back(-dimY*0.5+delta);
239 xShape.push_back(dimX*0.5); yShape.push_back(-dimY*0.5);
240 GeoSimplePolygonBrep* tmp_shape = new GeoSimplePolygonBrep(dimZ*0.5);
241 for(unsigned int iPt=0; iPt<xShape.size(); iPt++) tmp_shape->addVertex(xShape[iPt],yShape[iPt]);
242
243
244
245 std::string flexMatName =
m_gmt_mgr->IBLFlexMaterial(1,
"doglegA");
246 const GeoMaterial* tmp_material =
m_mat_mgr->getMaterial(flexMatName);
247 GeoLogVol* tmp_logVol = new GeoLogVol("FlexDogLeg1",tmp_shape,tmp_material);
248 GeoPhysVol * tmp_logVolPV = new GeoPhysVol(tmp_logVol);
249 GeoNameTag* tmp_tag = new GeoNameTag("FlexDogLeg1");
250 GeoTrf::Transform3D trfGblA=ladderTransform*ladderLocalTrf*GeoTrf::TranslateX3D(trX)*GeoTrf::TranslateZ3D(trZ)*(endblockFlexTrf->getTransform())*GeoTrf::RotateY3D(
angle);
251 GeoTransform* tmp_xformA = new GeoTransform(trfGblA);
252
256
257 trX=-dimX_lin*
tan(alpha1)*0.5;
258 trZ=-(eoStave+dimX_lin*0.5);
259 GeoTrf::Transform3D trfGblC=ladderTransform*ladderLocalTrf*GeoTrf::TranslateX3D(trX)*GeoTrf::TranslateZ3D(trZ)*(endblockFlexTrf->getTransform())*GeoTrf::RotateY3D(-
angle);
260 GeoTransform* tmp_xformC = new GeoTransform(trfGblC);
261
265
266
267
268
269 double dimX2_lin=
length*(1.-part1);
270 double dimX2=dimX2_lin/
cos(alpha2)-.15;
271 double dimY2=
m_gmt_mgr->IBLStaveFlexWidth();
272 double trX2=trX*2.-dimX2_lin*
tan(alpha2)*0.5;
273 double trZ2=eoStave+dimX_lin+dimX2_lin*0.5;
274 xShape.clear(); yShape.clear();
275 angle=90.*Gaudi::Units::deg-alpha2;
276 xShape.push_back(dimX2*0.5); yShape.push_back(dimY2*0.5);
277 xShape.push_back(-dimX2*0.5); yShape.push_back(dimY2*0.5);
278 xShape.push_back(-dimX2*0.5); yShape.push_back(-dimY2*0.5);
279 xShape.push_back(dimX2*0.5); yShape.push_back(-dimY2*0.5);
280 GeoSimplePolygonBrep* tmp2_shape = new GeoSimplePolygonBrep(dimZ*0.5);
281 for(unsigned int iPt=0; iPt<xShape.size(); iPt++) tmp2_shape->addVertex(xShape[iPt],yShape[iPt]);
282
283 const GeoMaterial* tmp2_material =
m_mat_mgr->getMaterial(flexMatName);
284 GeoLogVol* tmp2_logVol = new GeoLogVol("FlexDogLeg2",tmp2_shape,tmp2_material);
285 GeoPhysVol * tmp2_logVolPV = new GeoPhysVol(tmp2_logVol);
286 GeoNameTag* tmp2_tag = new GeoNameTag("FlexDogLeg2");
287
288 GeoTransform* tmp2_xformA =
new GeoTransform(ladderTransform*ladderLocalTrf*GeoTrf::TranslateX3D(trX2)*GeoTrf::TranslateZ3D(trZ2)*(endblockFlexTrf->getTransform())*GeoTrf::RotateY3D(
angle)*GeoTrf::TranslateY3D(delta*.75));
292
293 trZ2=-(eoStave+dimX_lin+dimX2_lin*0.5);
294 GeoTransform* tmp2_xformC =
new GeoTransform(ladderTransform*ladderLocalTrf*GeoTrf::TranslateX3D(trX2)*GeoTrf::TranslateZ3D(trZ2)*(endblockFlexTrf->getTransform())*GeoTrf::RotateY3D(-
angle)*GeoTrf::TranslateY3D(delta*.75));
298 }
299 }
300 }
301
302
303 double layerZshift =
m_gmt_mgr->PixelLayerGlobalShift();
304
305 GeoTrf::Translate3D ring_posA(0.0,0.0,staveRing.GetPositionAlongZAxis()-serviceZpos-dogLegStaveLength*0.5+layerZshift);
306 GeoTransform* xformA = new GeoTransform(ring_posA);
310
311 GeoTrf::Translate3D ring_posC(0.0,0.0,-staveRing.GetPositionAlongZAxis()+serviceZpos+dogLegStaveLength*0.5-layerZshift);
312 GeoTransform* xformC = new GeoTransform(ring_posC);
316
318 GeoTrf::Transform3D supportTrfA = GeoTrf::TranslateZ3D(serviceZpos+dogLegStaveLength*0.5+layerZshift);
320
321 GeoTrf::Transform3D supportTrfC = GeoTrf::TranslateZ3D(-serviceZpos-dogLegStaveLength*0.5+layerZshift);
323
324 std::ostringstream lnameM;
325 lnameM << "Brl0M_StaveRing";
327 GeoTrf::Translate3D ring_posM(0.0,0.0,0.0+layerZshift);
329
330
331 return nullptr;
332
333}
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
GeoModelIO::ReadGeoModel * m_sqliteReader
PixelGeometryManager * m_gmt_mgr
InDetDD::PixelDetectorManager * m_DDmgr
InDetMaterialManager * m_mat_mgr