ATLAS Offline Software
Loading...
Searching...
No Matches
SquirrelCageFactory.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7// GeoModel includes
9#include "GeoModelKernel/GeoDefinitions.h"
10#include "GeoModelKernel/GeoPhysVol.h"
11#include "GeoModelKernel/GeoLogVol.h"
12#include "GeoModelKernel/GeoTube.h"
13#include "GeoModelKernel/GeoTubs.h"
14#include "GeoModelKernel/GeoMaterial.h"
15#include "GeoModelKernel/GeoTransform.h"
16#include "GeoModelKernel/GeoBox.h"
17
19
26#include "GaudiKernel/PhysicalConstants.h"
27
29
30#include <iostream>
31
32
34 InDetMaterialManager * matManager)
35 : InDetDD::SubDetectorFactoryBase(athenaComps, matManager)
36{
37}
38
39
43
44
45
46//## Other Operations (implementation)
47void SquirrelCageFactory::create(GeoPhysVol *mother)
48{
49
50 DecodeVersionKey indetVersionKey(geoDbTagSvc(),"InnerDetector");
51 std::string railversion = rdbAccessSvc()->getChildTag("IDDetailedRail",indetVersionKey.tag(),indetVersionKey.node());
52 if(!railversion.empty()) {
53 // ______________________________________________________________________________________________________________________
54 // Geometry with ID rail
55
56 IRDBRecordset_ptr cage = rdbAccessSvc()->getRecordsetPtr("SquirrelCage", indetVersionKey.tag(), indetVersionKey.node());
57 //It is need for "U" shape support
58 IRDBRecordset_ptr sctGenServices = rdbAccessSvc()->getRecordsetPtr("SCTGenServices", indetVersionKey.tag(), indetVersionKey.node());
59
60 // Get table version
61 // This is a work around to allow running with older DB releases.
62 std::string sqversionStr = rdbAccessSvc()->getChildTag("SquirrelCage", indetVersionKey.tag(), indetVersionKey.node());
63 size_t pos = sqversionStr.find('-');
64 int sqversion = 0;
65 if (pos != std::string::npos && pos+1 != sqversionStr.size()) {
66 std::istringstream tmpStr(sqversionStr.substr(pos+1));
67 tmpStr >> sqversion;
68 }
69 msg(MSG::DEBUG) << sqversionStr << " : " << sqversion << endmsg;
70
71
72//----------------------------------------------------------------------------------
73// Squirrel cage rings
74// Default (initial) ring parameters
75//
76// double rminInt = 1074.0*Gaudi::Units::mm;
77// double ringThick = 4.0*Gaudi::Units::mm;
78// double ringGap = 20.*Gaudi::Units::mm;
79// double ringWid = 40.*Gaudi::Units::mm;
80//
81 double rminInt = (*cage)[0]->getDouble("RINGRMIN")*Gaudi::Units::mm;
82 double ringThick = (*cage)[0]->getDouble("RINGTHICK")*Gaudi::Units::mm;
83 double ringGap = (*cage)[0]->getDouble("RINGGAP")*Gaudi::Units::mm;
84 double ringWid = (*cage)[0]->getDouble("RINGWIDTH")*Gaudi::Units::mm;
85//
86//--- Default (initial) z positions
87// double zposFirstRing = 805.0*Gaudi::Units::mm+161.0*Gaudi::Units::mm;
88// double zposGap1 = 390.*Gaudi::Units::mm;
89// double zposGap2 = 402.*Gaudi::Units::mm;
90// double zposGap3 = 446.*Gaudi::Units::mm;
91// double zposGap4 = 331.*Gaudi::Units::mm;
92//
93 double zposFirstRing = (*cage)[0]->getDouble("ZBASE")*Gaudi::Units::mm;
94 double zposGap1 = (*cage)[0]->getDouble("ZGAP1")*Gaudi::Units::mm;
95 double zposGap2 = (*cage)[0]->getDouble("ZGAP2")*Gaudi::Units::mm;
96 double zposGap3 = (*cage)[0]->getDouble("ZGAP3")*Gaudi::Units::mm;
97 double zposGap4 = (*cage)[0]->getDouble("ZGAP4")*Gaudi::Units::mm;
98//
99// Now support ring
100// double rminSup = 830.0*Gaudi::Units::mm;
101// double supThick = 90.0*Gaudi::Units::mm;
102// double supWid = 12.0*Gaudi::Units::mm;
103//
104 double rminSup = (*cage)[0]->getDouble("SUPRMIN")*Gaudi::Units::mm;
105 double supThick = (*cage)[0]->getDouble("SUPTHICK")*Gaudi::Units::mm;
106 double supWid = (*cage)[0]->getDouble("SUPWIDTH")*Gaudi::Units::mm;
107//
108 double zposSupRing = zposFirstRing+ringWid*5. + zposGap1 + zposGap2 + zposGap3 + zposGap4;
109
110
111
112 const GeoMaterial* ringMat = materialManager()->getMaterial((*cage)[0]->getString("MATERIAL"));
113
114 IRDBRecordset_ptr commonParameters = rdbAccessSvc()->getRecordsetPtr("IDDetRailCommon",indetVersionKey.tag(), indetVersionKey.node());
115 if(commonParameters->size()==0)
116 commonParameters = rdbAccessSvc()->getRecordsetPtr("IDDetRailCommon","IDDetRailCommon-00");
117
118
119 double yRailSup = (*commonParameters)[0]->getDouble("YRAILSUP");
120 double yRailSupPart3 = (*commonParameters)[0]->getDouble("YRAILSUPPART3");
121 double gapOfRSF = (*commonParameters)[0]->getDouble("GAPOFRSF");
122
123
124//Parameters of "U shape" support - these parameters aren`t in database
125// ___________
126// |_____2_____|
127// | |
128// | |
129// |1|
130// | |
131// |_|_________
132// |_____2_____|
133//
134
135 //double zLengthUS = 1992;
136
137 double bUSS = 0.; double eUSS = 0.;
138 for (unsigned int i = 0; i < sctGenServices->size(); i++)
139 {
140 if ((*sctGenServices)[i]->getString("NAME") == "HSP")
141 {
142 bUSS = (*sctGenServices)[i]->getDouble("ZMAX");
143 }
144 if ((*sctGenServices)[i]->getString("NAME") == "FwdRadialServ")
145 {
146 eUSS = (*sctGenServices)[i]->getDouble("ZMIN");
147 }
148 }
149
150 double zLengthUS = eUSS - bUSS;
151
152 std::unique_ptr<IRDBQuery> queryUSP = rdbAccessSvc()->getQuery("IDDetRailUSP",indetVersionKey.tag(), indetVersionKey.node());
153 if(!queryUSP)
154 queryUSP = rdbAccessSvc()->getQuery("IDDetRailUSP","IDDetRailUSP-00");
155
156 queryUSP->setOrder("USP_ID");
157 queryUSP->execute();
158
159 queryUSP->next();
160 double xDepthUSP1 = queryUSP->data<double>("IDDETRAILUSP_DATA.XDEPTH");
161 double yWidthUSP1 = queryUSP->data<double>("IDDETRAILUSP_DATA.YWIDTH");
162
163 queryUSP->next();
164 double xDepthUSP2 = queryUSP->data<double>("IDDETRAILUSP_DATA.XDEPTH");
165 double yWidthUSP2 = queryUSP->data<double>("IDDETRAILUSP_DATA.YWIDTH");
166
167 queryUSP->next();
168 double xDepthUSP3 = queryUSP->data<double>("IDDETRAILUSP_DATA.XDEPTH");
169 double yWidthUSP3 = queryUSP->data<double>("IDDETRAILUSP_DATA.YWIDTH");
170
171 queryUSP->finalize();
172//Definition of "U shape" support
173
174 GeoBox* UShapePart1 = new GeoBox(xDepthUSP1/2., yWidthUSP1/2., zLengthUS/2.);
175 GeoBox* UShapePart2 = new GeoBox(xDepthUSP2/2., yWidthUSP2/2., zLengthUS/2.);
176 GeoBox* UShapePart3 = new GeoBox(xDepthUSP3/2., yWidthUSP3/2., zLengthUS/2.);
177
178 GeoTrf::Vector3D trans1UShapeP2(xDepthUSP2/2. - xDepthUSP1/2., yWidthUSP1/2. + yWidthUSP2/2., 0.);
179 GeoTrf::Vector3D trans2UShapeP2(- xDepthUSP2/2. + xDepthUSP1/2., yWidthUSP1/2. + yWidthUSP2/2., 0.);
180
181 GeoTrf::Vector3D trans1UShapeP3(xDepthUSP3/2. - xDepthUSP1/2., - yWidthUSP1/2. - yWidthUSP3/2., 0.);
182 GeoTrf::Vector3D trans2UShapeP3(- xDepthUSP3/2. + xDepthUSP1/2., - yWidthUSP1/2. - yWidthUSP3/2., 0.);
183
184//Determining the exact place of "U" Shape support
185
186 double coordY = yWidthUSP1/2. - yRailSup + (yRailSupPart3 - gapOfRSF/2.);
187
188//Logical Volume
189 const GeoLogVol* UShapeLP1 = new GeoLogVol("UShapeSupport1", UShapePart1, ringMat);
190 const GeoLogVol* UShapeLP2 = new GeoLogVol("UShapeSupport2", UShapePart2, ringMat);
191 const GeoLogVol* UShapeLP3 = new GeoLogVol("UShapeSupport3", UShapePart3, ringMat);
192
193//Physical Volume
194 GeoVPhysVol* UShapePP1 = new GeoPhysVol(UShapeLP1);
195 GeoVPhysVol* UShapePP2 = new GeoPhysVol(UShapeLP2);
196 GeoVPhysVol* UShapePP3 = new GeoPhysVol(UShapeLP3);
197
198//Squirrel Cage Rings
199//Inner
200
201 double phiICRT = asin((yWidthUSP1/2. + yWidthUSP2 + coordY) / rminInt);
202 double DphiICRT = Gaudi::Units::pi - 2*phiICRT;
203
204 double phiICRB = asin((yWidthUSP1/2. + yWidthUSP2 - coordY) / rminInt);
205 double DphiICRB = Gaudi::Units::pi - 2*phiICRB;
206
207 GeoTubs* ICRT = new GeoTubs(rminInt, rminInt + ringThick, ringWid/2., phiICRT, DphiICRT);
208
209 GeoTubs* ICRB = new GeoTubs(rminInt, rminInt + ringThick, ringWid/2., Gaudi::Units::pi + phiICRB, DphiICRB);
210
211
212 const GeoLogVol* ICRTLog = new GeoLogVol("SQringIntTop", ICRT, ringMat);
213 GeoVPhysVol* ICRTPhys = new GeoPhysVol(ICRTLog);
214
215 const GeoLogVol* ICRBLog = new GeoLogVol("SQringIntBottom", ICRB, ringMat);
216 GeoVPhysVol* ICRBPhys = new GeoPhysVol(ICRBLog);
217
218//Outer
219
220 double phiECRT = asin((yWidthUSP1/2. + yWidthUSP2 + coordY) / (rminInt+ringGap+ringThick));
221 double DphiECRT = Gaudi::Units::pi - 2*phiECRT;
222
223 double phiECRB = asin((yWidthUSP1/2. + yWidthUSP2 - coordY) / (rminInt+ringGap+ringThick));
224 double DphiECRB = Gaudi::Units::pi - 2*phiECRB;
225
226// std::cerr << "phiET: " << phiECRT << ", DphiET: " << DphiECRT << std::endl;
227// std::cerr << "phiIT: " << phiICRT << ", DphiIT: " << DphiICRT << std::endl;
228// std::cerr << "phiEB: " << phiECRB << ", DphiEB: " << DphiECRB << std::endl;
229// std::cerr << "phiIB: " << phiICRB << ", DphiIB: " << DphiICRB << std::endl;
230
231 GeoTubs* ECRT = new GeoTubs(rminInt+ringGap+ringThick, rminInt+2.*ringThick+ringGap, ringWid/2., phiECRT, DphiECRT);
232 GeoTubs* ECRB = new GeoTubs(rminInt+ringGap+ringThick, rminInt+2.*ringThick+ringGap, ringWid/2., Gaudi::Units::pi + phiECRB, DphiECRB);
233
234 const GeoLogVol* ECRTLog = new GeoLogVol("SQringExtTop", ECRT, ringMat);
235 GeoVPhysVol* ECRTPhys = new GeoPhysVol(ECRTLog);
236
237 const GeoLogVol* ECRBLog = new GeoLogVol("SQringExtBottom", ECRB, ringMat);
238 GeoVPhysVol* ECRBPhys = new GeoPhysVol(ECRBLog);
239
240//SupportRing
241 GeoTube* ringSup = new GeoTube( rminSup, rminSup+supThick, supWid/2.);
242
243 const GeoLogVol* ringLogSup = new GeoLogVol("SQringSup",ringSup,ringMat);
244 GeoVPhysVol* ringPhysSup = new GeoPhysVol(ringLogSup);
245
246//Positioning and adding to geometry
247//Rings
248
249 GeoTrf::Translate3D servpos1(0.,0., zposFirstRing+ringWid/2.);
250 GeoTrf::Translate3D servpos2(0.,0.,-zposFirstRing-ringWid/2.);
251 GeoTrf::Translate3D servpos3(0.,0., zposFirstRing+ringWid*3./2. + zposGap1);
252 GeoTrf::Translate3D servpos4(0.,0.,-zposFirstRing-ringWid*3./2. - zposGap1);
253 GeoTrf::Translate3D servpos5(0.,0., zposFirstRing+ringWid*5./2. + zposGap1 + zposGap2);
254 GeoTrf::Translate3D servpos6(0.,0.,-zposFirstRing-ringWid*5./2. - zposGap1 - zposGap2);
255 GeoTrf::Translate3D servpos7(0.,0., zposFirstRing+ringWid*7./2. + zposGap1 + zposGap2 + zposGap3);
256 GeoTrf::Translate3D servpos8(0.,0.,-zposFirstRing-ringWid*7./2. - zposGap1 - zposGap2 - zposGap3);
257 GeoTrf::Translate3D servpos9(0.,0., zposFirstRing+ringWid*9./2. + zposGap1 + zposGap2 + zposGap3 + zposGap4);
258 GeoTrf::Translate3D servpos10(0.,0.,-zposFirstRing-ringWid*9./2. - zposGap1 - zposGap2 - zposGap3 - zposGap4);
259 GeoTransform *xform1 = new GeoTransform(servpos1);
260 GeoTransform *xform2 = new GeoTransform(servpos2);
261 GeoTransform *xform3 = new GeoTransform(servpos3);
262 GeoTransform *xform4 = new GeoTransform(servpos4);
263 GeoTransform *xform5 = new GeoTransform(servpos5);
264 GeoTransform *xform6 = new GeoTransform(servpos6);
265 GeoTransform *xform7 = new GeoTransform(servpos7);
266 GeoTransform *xform8 = new GeoTransform(servpos8);
267 GeoTransform *xform9 = new GeoTransform(servpos9);
268 GeoTransform *xform10 = new GeoTransform(servpos10);
269
270 mother->add(xform1); mother->add(ICRTPhys); mother->add(xform1); mother->add(ECRTPhys);
271 mother->add(xform2); mother->add(ICRTPhys); mother->add(xform2); mother->add(ECRTPhys);
272 mother->add(xform3); mother->add(ICRTPhys); mother->add(xform3); mother->add(ECRTPhys);
273 mother->add(xform4); mother->add(ICRTPhys); mother->add(xform4); mother->add(ECRTPhys);
274 mother->add(xform5); mother->add(ICRTPhys); mother->add(xform5); mother->add(ECRTPhys);
275 mother->add(xform6); mother->add(ICRTPhys); mother->add(xform6); mother->add(ECRTPhys);
276 mother->add(xform7); mother->add(ICRTPhys); mother->add(xform7); mother->add(ECRTPhys);
277 mother->add(xform8); mother->add(ICRTPhys); mother->add(xform8); mother->add(ECRTPhys);
278 mother->add(xform9); mother->add(ICRTPhys); mother->add(xform9); mother->add(ECRTPhys);
279 mother->add(xform10); mother->add(ICRTPhys); mother->add(xform10); mother->add(ECRTPhys);
280
281 mother->add(xform1); mother->add(ICRBPhys); mother->add(xform1); mother->add(ECRBPhys);
282 mother->add(xform2); mother->add(ICRBPhys); mother->add(xform2); mother->add(ECRBPhys);
283 mother->add(xform3); mother->add(ICRBPhys); mother->add(xform3); mother->add(ECRBPhys);
284 mother->add(xform4); mother->add(ICRBPhys); mother->add(xform4); mother->add(ECRBPhys);
285 mother->add(xform5); mother->add(ICRBPhys); mother->add(xform5); mother->add(ECRBPhys);
286 mother->add(xform6); mother->add(ICRBPhys); mother->add(xform6); mother->add(ECRBPhys);
287 mother->add(xform7); mother->add(ICRBPhys); mother->add(xform7); mother->add(ECRBPhys);
288 mother->add(xform8); mother->add(ICRBPhys); mother->add(xform8); mother->add(ECRBPhys);
289 mother->add(xform9); mother->add(ICRBPhys); mother->add(xform9); mother->add(ECRBPhys);
290 mother->add(xform10); mother->add(ICRBPhys); mother->add(xform10); mother->add(ECRBPhys);
291
292// "U Shape" support
293
294 GeoTrf::Vector3D USSupCoordX(rminInt + xDepthUSP1/2., 0, 0);
295
296 GeoTransform* transUSS{nullptr};
297 GeoTrf::Vector3D tmpVec(0,0,0);
298 tmpVec = USSupCoordX + GeoTrf::Vector3D(0, coordY, bUSS + zLengthUS/2.);
299 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
300 mother->add(transUSS); mother->add(UShapePP1);
301 tmpVec = USSupCoordX + GeoTrf::Vector3D(0, coordY, bUSS + zLengthUS/2.) + trans1UShapeP2;
302 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
303 mother->add(transUSS); mother->add(UShapePP2);
304 tmpVec = USSupCoordX + GeoTrf::Vector3D(0, coordY, bUSS + zLengthUS/2.) + trans1UShapeP3 ;
305 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
306 mother->add(transUSS); mother->add(UShapePP3);
307
308 tmpVec = -USSupCoordX + GeoTrf::Vector3D(0, coordY, bUSS + zLengthUS/2.);
309 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
310 mother->add(transUSS); mother->add(UShapePP1);
311 tmpVec = -USSupCoordX + GeoTrf::Vector3D(0, coordY, bUSS + zLengthUS/2.) + trans2UShapeP2;
312 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
313 mother->add(transUSS); mother->add(UShapePP2);
314 tmpVec = -USSupCoordX + GeoTrf::Vector3D(0, coordY, bUSS + zLengthUS/2.) + trans2UShapeP3;
315 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
316 mother->add(transUSS); mother->add(UShapePP3);
317
318 tmpVec = USSupCoordX - GeoTrf::Vector3D(0, - coordY, bUSS + zLengthUS/2.);
319 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
320 mother->add(transUSS); mother->add(UShapePP1);
321 tmpVec = USSupCoordX - GeoTrf::Vector3D(0, - coordY, bUSS + zLengthUS/2.) + trans1UShapeP2;
322 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
323 mother->add(transUSS); mother->add(UShapePP2);
324 tmpVec = USSupCoordX - GeoTrf::Vector3D(0, - coordY, bUSS + zLengthUS/2.) + trans1UShapeP3;
325 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
326 mother->add(transUSS); mother->add(UShapePP3);
327
328 tmpVec = - USSupCoordX - GeoTrf::Vector3D(0, - coordY, bUSS + zLengthUS/2.);
329 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
330 mother->add(transUSS); mother->add(UShapePP1);
331 tmpVec = - USSupCoordX - GeoTrf::Vector3D(0, - coordY, bUSS + zLengthUS/2.) + trans2UShapeP2;
332 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
333 mother->add(transUSS); mother->add(UShapePP2);
334 tmpVec = - USSupCoordX - GeoTrf::Vector3D(0, - coordY, bUSS + zLengthUS/2.) + trans2UShapeP3;
335 transUSS = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
336 mother->add(transUSS); mother->add(UShapePP3);
337
338
339
340//Support ring positioning
341
342 GeoTrf::Translate3D suppos1(0.,0., zposSupRing+supWid/2.);
343 GeoTrf::Vector3D suppos2(0.,0.,-zposSupRing-supWid/2.);
344 GeoTransform *sform1 = new GeoTransform(suppos1);
345 GeoTransform *sform2 = new GeoTransform(GeoTrf::GeoTransformRT(GeoTrf::GeoRotation(0,-M_PI,0),suppos2));
346 mother->add(sform1);
347 mother->add(ringPhysSup);
348 mother->add(sform2);
349 mother->add(ringPhysSup);
350 }
351 else {
352 // ______________________________________________________________________________________________________________________
353 // Geometry without ID rail
354 IRDBRecordset_ptr cage = rdbAccessSvc()->getRecordsetPtr("SquirrelCage", indetVersionKey.tag(), indetVersionKey.node());
355
356 // Get table version
357 // This is a work around to allow running with older DB releases.
358 std::string sqversionStr = rdbAccessSvc()->getChildTag("SquirrelCage", indetVersionKey.tag(), indetVersionKey.node());
359 size_t pos = sqversionStr.find('-');
360 int sqversion = 0;
361 if (pos != std::string::npos && pos+1 != sqversionStr.size()) {
362 std::istringstream tmpStr(sqversionStr.substr(pos+1));
363 tmpStr >> sqversion;
364 }
365 msg(MSG::DEBUG) << sqversionStr << " : " << sqversion << endmsg;
366
367
368//----------------------------------------------------------------------------------
369// Squirrel cage rings
370// Default (initial) ring parameters
371//
372 double rminInt = 1074.0*Gaudi::Units::mm;
373 double ringThick = 4.0*Gaudi::Units::mm;
374 double ringGap = 20.*Gaudi::Units::mm;
375 double ringWid = 40.*Gaudi::Units::mm;
376//
377 rminInt = (*cage)[0]->getDouble("RINGRMIN")*Gaudi::Units::mm;
378 ringThick = (*cage)[0]->getDouble("RINGTHICK")*Gaudi::Units::mm;
379 ringGap = (*cage)[0]->getDouble("RINGGAP")*Gaudi::Units::mm;
380 ringWid = (*cage)[0]->getDouble("RINGWIDTH")*Gaudi::Units::mm;
381//
382//--- Default (initial) z positions
383 double zposFirstRing = 805.0*Gaudi::Units::mm+161.0*Gaudi::Units::mm;
384 double zposGap1 = 390.*Gaudi::Units::mm;
385 double zposGap2 = 402.*Gaudi::Units::mm;
386 double zposGap3 = 446.*Gaudi::Units::mm;
387 double zposGap4 = 331.*Gaudi::Units::mm;
388//
389 zposFirstRing = (*cage)[0]->getDouble("ZBASE")*Gaudi::Units::mm;
390 zposGap1 = (*cage)[0]->getDouble("ZGAP1")*Gaudi::Units::mm;
391 zposGap2 = (*cage)[0]->getDouble("ZGAP2")*Gaudi::Units::mm;
392 zposGap3 = (*cage)[0]->getDouble("ZGAP3")*Gaudi::Units::mm;
393 zposGap4 = (*cage)[0]->getDouble("ZGAP4")*Gaudi::Units::mm;
394//
395// Now support ring
396 double rminSup = 830.0*Gaudi::Units::mm;
397 double supThick = 90.0*Gaudi::Units::mm;
398 double supWid = 12.0*Gaudi::Units::mm;
399//
400 rminSup = (*cage)[0]->getDouble("SUPRMIN")*Gaudi::Units::mm;
401 supThick = (*cage)[0]->getDouble("SUPTHICK")*Gaudi::Units::mm;
402 supWid = (*cage)[0]->getDouble("SUPWIDTH")*Gaudi::Units::mm;
403//
404 double zposSupRing = zposFirstRing+ringWid*5. + zposGap1 + zposGap2 + zposGap3 + zposGap4;
405//
406// Now support ribbon
407 double ribWid = 68.0*Gaudi::Units::mm ;
408 ribWid = (*cage)[0]->getDouble("RIBWIDTH")*Gaudi::Units::mm;
409 double ribLeng = ringWid*5. + zposGap1 + zposGap2 + zposGap3 + zposGap4;
410 double ribThick = 0;
411 if (sqversion >= 3) ribThick = (*cage)[0]->getDouble("RIBTHICK")*Gaudi::Units::mm;
412 double safety =0.01;
413 double ribThickMax = ringGap - 2*safety;
414 if (ribThick == 0 || ribThick > ribThickMax) {
415 ribThick = ribThickMax;
416 }
417 double rmidRib = rminInt+ringThick+0.5*ringGap; // Place rib midway between internal and external support.
418
419 GeoTube* ringInt = new GeoTube( rminInt, rminInt+ringThick, ringWid/2.);
420 GeoTube* ringExt = new GeoTube( rminInt+ringGap+ringThick, rminInt+2.*ringThick+ringGap, ringWid/2.);
421 GeoTube* ringSup = new GeoTube( rminSup, rminSup+supThick, supWid/2.);
422// To avoid clashes
423//
424// GeoBox* ribSup = new GeoBox( ribThick/2, ribWid/2, ribLeng/2.);
425//
426 double phiWid=ribWid/(rminInt+ringThick+ringGap/2.);
427 //GeoTubs* ribSup = new GeoTubs( rminInt+ringThick+safety, rminInt+ringGap+ringThick-safety,
428 // ribLeng/2., -phiWid/2.,phiWid);
429 GeoTubs* ribSup = new GeoTubs( rmidRib-0.5*ribThick, rmidRib+0.5*ribThick,
430 ribLeng/2., -phiWid/2.,phiWid);
431
432// Build the Phys Vol
433// const GeoMaterial* ringMat = materialManager()->getMaterial("std::Aluminium");
434 const GeoMaterial* ringMat = materialManager()->getMaterial((*cage)[0]->getString("MATERIAL"));
435// std::cout << "Squirrel cage density="<<ringMat->getDensity()<<" Rad.length="<<ringMat->getRadLength()<<'\n';
436
437 const GeoLogVol* ringLogInt = new GeoLogVol("SQringInt",ringInt,ringMat);
438 const GeoLogVol* ringLogExt = new GeoLogVol("SQringExt",ringExt,ringMat);
439 const GeoLogVol* ringLogSup = new GeoLogVol("SQringSup",ringSup,ringMat);
440 const GeoLogVol* ribLogSup = new GeoLogVol("SQribSup" ,ribSup ,ringMat);
441 GeoVPhysVol* ringPhysInt = new GeoPhysVol(ringLogInt);
442 GeoVPhysVol* ringPhysExt = new GeoPhysVol(ringLogExt);
443 GeoVPhysVol* ringPhysSup = new GeoPhysVol(ringLogSup);
444 GeoVPhysVol* ribPhysSup = new GeoPhysVol(ribLogSup);
445
446 GeoTrf::Translate3D servpos1(0.,0., zposFirstRing+ringWid/2.);
447 GeoTrf::Translation3D servpos2(0.,0.,-zposFirstRing-ringWid/2.);
448 GeoTrf::Translate3D servpos3(0.,0., zposFirstRing+ringWid*3./2. + zposGap1);
449 GeoTrf::Translation3D servpos4(0.,0.,-zposFirstRing-ringWid*3./2. - zposGap1);
450 GeoTrf::Translate3D servpos5(0.,0., zposFirstRing+ringWid*5./2. + zposGap1 + zposGap2);
451 GeoTrf::Translation3D servpos6(0.,0.,-zposFirstRing-ringWid*5./2. - zposGap1 - zposGap2);
452 GeoTrf::Translate3D servpos7(0.,0., zposFirstRing+ringWid*7./2. + zposGap1 + zposGap2 + zposGap3);
453 GeoTrf::Translation3D servpos8(0.,0.,-zposFirstRing-ringWid*7./2. - zposGap1 - zposGap2 - zposGap3);
454 GeoTrf::Translate3D servpos9(0.,0., zposFirstRing+ringWid*9./2. + zposGap1 + zposGap2 + zposGap3 + zposGap4);
455 GeoTrf::Translation3D servpos10(0.,0.,-zposFirstRing-ringWid*9./2. - zposGap1 - zposGap2 - zposGap3 - zposGap4);
456 GeoTransform *xform1 = new GeoTransform(servpos1);
457 GeoTransform *xform2 = new GeoTransform(GeoTrf::Transform3D(servpos2*GeoTrf::RotateY3D(M_PI)));
458 GeoTransform *xform3 = new GeoTransform(servpos3);
459 GeoTransform *xform4 = new GeoTransform(GeoTrf::Transform3D(servpos4*GeoTrf::RotateY3D(M_PI)));
460 GeoTransform *xform5 = new GeoTransform(servpos5);
461 GeoTransform *xform6 = new GeoTransform(GeoTrf::Transform3D(servpos6*GeoTrf::RotateY3D(M_PI)));
462 GeoTransform *xform7 = new GeoTransform(servpos7);
463 GeoTransform *xform8 = new GeoTransform(GeoTrf::Transform3D(servpos8*GeoTrf::RotateY3D(M_PI)));
464 GeoTransform *xform9 = new GeoTransform(servpos9);
465 GeoTransform *xform10 = new GeoTransform(GeoTrf::Transform3D(servpos10*GeoTrf::RotateY3D(M_PI)));
466 mother->add(xform1);
467 mother->add(ringPhysInt);
468 mother->add(xform1);
469 mother->add(ringPhysExt);
470 mother->add(xform2);
471 mother->add(ringPhysInt);
472 mother->add(xform2);
473 mother->add(ringPhysExt);
474 mother->add(xform3);
475 mother->add(ringPhysInt);
476 mother->add(xform3);
477 mother->add(ringPhysExt);
478 mother->add(xform4);
479 mother->add(ringPhysInt);
480 mother->add(xform4);
481 mother->add(ringPhysExt);
482 mother->add(xform5);
483 mother->add(ringPhysInt);
484 mother->add(xform5);
485 mother->add(ringPhysExt);
486 mother->add(xform6);
487 mother->add(ringPhysInt);
488 mother->add(xform6);
489 mother->add(ringPhysExt);
490 mother->add(xform7);
491 mother->add(ringPhysInt);
492 mother->add(xform7);
493 mother->add(ringPhysExt);
494 mother->add(xform8);
495 mother->add(ringPhysInt);
496 mother->add(xform8);
497 mother->add(ringPhysExt);
498 mother->add(xform9);
499 mother->add(ringPhysInt);
500 mother->add(xform9);
501 mother->add(ringPhysExt);
502 mother->add(xform10);
503 mother->add(ringPhysInt);
504 mother->add(xform10);
505 mother->add(ringPhysExt);
506
507//Support ring positioning
508
509 GeoTrf::Translate3D suppos1(0.,0., zposSupRing+supWid/2.);
510 GeoTrf::Translation3D suppos2(0.,0.,-zposSupRing-supWid/2.);
511 GeoTransform *sform1 = new GeoTransform(suppos1);
512 GeoTransform *sform2 = new GeoTransform(GeoTrf::Transform3D(suppos2*GeoTrf::RotateY3D(M_PI)));
513 mother->add(sform1);
514 mother->add(ringPhysSup);
515 mother->add(sform2);
516 mother->add(ringPhysSup);
517
518//Support ribbon positioning
519
520
521 GeoTrf::Translate3D ribpos1( 0., 0., zposFirstRing+ribLeng/2.);
522 GeoTrf::Translate3D ribpos2( 0., 0.,-zposFirstRing-ribLeng/2.);
523 GeoTransform *rform1 = new GeoTransform(ribpos1);
524 GeoTransform *rform2 = new GeoTransform(ribpos1*GeoTrf::RotateZ3D(M_PI));
525 GeoTransform *rform3 = new GeoTransform(ribpos2);
526 GeoTransform *rform4 = new GeoTransform(ribpos2*GeoTrf::RotateZ3D(M_PI));
527
528
529 mother->add(rform1);
530 mother->add(ribPhysSup);
531 mother->add(rform2);
532 mother->add(ribPhysSup);
533 mother->add(rform3);
534 mother->add(ribPhysSup);
535 mother->add(rform4);
536 mother->add(ribPhysSup);
537
538// std::cout << "End of SquirrelCage building !!!" << zposFirstRing<< '\n';
539//----------------------------------------------------------------------------------
540
541 }
542}
543
544
#define M_PI
#define endmsg
Definition of the abstract IRDBAccessSvc interface.
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition of the abstract IRDBRecord interface.
Definition of the abstract IRDBRecordset interface.
Define macros for attributes used to control the static checker.
This is a helper class to query the version tags from GeoModelSvc and determine the appropriate tag a...
const std::string & tag() const
Return version tag.
const std::string & node() const
Return the version node.
virtual std::string getChildTag(const std::string &childNode, const std::string &parentTag, const std::string &parentNode, const std::string &connName="ATLASDD")=0
Gets the tag name for the node by giving its parent node tag.
virtual IRDBRecordset_ptr getRecordsetPtr(const std::string &node, const std::string &tag, const std::string &tag2node="", const std::string &connName="ATLASDD")=0
Provides access to the Recordset object containing HVS-tagged data.
virtual std::unique_ptr< IRDBQuery > getQuery(const std::string &node, const std::string &tag, const std::string &tag2node="", const std::string &connName="ATLASDD")=0
virtual unsigned int size() const =0
Class to hold various Athena components.
const IGeoDbTagSvc * geoDbTagSvc() const
SubDetectorFactoryBase(InDetDD::AthenaComps *athenaComps)
InDetMaterialManager.
const GeoMaterial * getMaterial(const std::string &materialName)
Get material. First looks for locally defined material and if not found looks in GeoModel material ma...
SquirrelCageFactory(InDetDD::AthenaComps *athenaComps, InDetMaterialManager *matManager)
void create(GeoPhysVol *mother)
Message Stream Member.
MsgStream & msg
Definition testRead.cxx:32