ATLAS Offline Software
Loading...
Searching...
No Matches
SupportRailFactory.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/GeoPcon.h"
14#include "GeoModelKernel/GeoBox.h"
15#include "GeoModelKernel/GeoMaterial.h"
16#include "GeoModelKernel/GeoTransform.h"
17#include "GeoModelKernel/GeoShape.h"
18
20
27#include "GaudiKernel/SystemOfUnits.h"
28
30
31#include <cmath>
32#include <iostream>
33
34
36 InDetMaterialManager * matManager)
37 : InDetDD::SubDetectorFactoryBase(athenaComps, matManager)
38{
39}
40
44
45
46
47//## Other Operations (implementation)
48void SupportRailFactory::create(GeoPhysVol *mother)
49{
50
51 DecodeVersionKey atlasVersionKey(geoDbTagSvc(),"ATLAS");
52 DecodeVersionKey indetVersionKey(geoDbTagSvc(),"InnerDetector");
53 DecodeVersionKey larVersionKey(geoDbTagSvc(),"LAr");
54
55 std::string railversion = rdbAccessSvc()->getChildTag("IDDetailedRail",indetVersionKey.tag(),indetVersionKey.node());
56 if(!railversion.empty()) {
57 // ______________________________________________________________________________________________________________________
58 // Geometry with ID rail
59
60// std::cout <<" Version!!="<<atlasVersionKey.tag()<<", "<<atlasVersionKey.node()<<'\n';
61// std::cout <<" Version!!="<<indetVersionKey.tag()<<", "<<indetVersionKey.node()<<'\n';
62//---------------------------------------------------------------------------------
63// Long ribs (initial position is along X axis then move and rotate)
64//
65// Th
66// ___
67// | |
68// | | Wid
69// | |
70// |__|
71//
72// Default(initial) values
73//
74 double RMAX_ID = 1150.0*Gaudi::Units::mm -1.0*Gaudi::Units::mm; //Some safety margin
75 double railLengthB = 1600.0*Gaudi::Units::mm;
76 double railWidthB = 5.5*Gaudi::Units::mm;
77 double railThickB = 34.7*Gaudi::Units::mm;
78//
79 double railLengthE = 2600.0*Gaudi::Units::mm;
80// double railWidthE = 14.*Gaudi::Units::mm;
81// double railThickE = 14.7*Gaudi::Units::mm;
82//
83 double suppLength = 6800.0*Gaudi::Units::mm;
84 double suppWidth = 54.*Gaudi::Units::mm;
85// double suppThick = 22.6*Gaudi::Units::mm;
86//
87// Database
88//
89 IRDBRecordset_ptr atls = rdbAccessSvc()->getRecordsetPtr("AtlasMother", atlasVersionKey.tag(), atlasVersionKey.node());
90 IRDBRecordset_ptr railrec = rdbAccessSvc()->getRecordsetPtr("IDRails", indetVersionKey.tag(), indetVersionKey.node());
91 IRDBRecordset_ptr endplate = rdbAccessSvc()->getRecordsetPtr("EPShell", indetVersionKey.tag(), indetVersionKey.node());
92 IRDBRecordset_ptr cage = rdbAccessSvc()->getRecordsetPtr("SquirrelCage", indetVersionKey.tag(), indetVersionKey.node());
93 IRDBRecordset_ptr idSupportRails = rdbAccessSvc()->getRecordsetPtr("IdSupportRail", larVersionKey.tag(), larVersionKey.node());
94
95// const GeoMaterial* steel = materialManager()->getMaterial("std::Iron");
96// const GeoMaterial* alum = materialManager()->getMaterial("std::Aluminium");
97 const GeoMaterial* steel = materialManager()->getMaterial((*railrec)[0]->getString("MATERIAL"));
98 const GeoMaterial* alum = materialManager()->getMaterial((*railrec)[0]->getString("MATSUP"));
99
100//Radius of Squirrel cage
101 double rminInt = (*cage)[0]->getDouble("RINGRMIN")*Gaudi::Units::mm;
102//Thick of U Shape Support
103 std::unique_ptr<IRDBQuery> queryUSP = rdbAccessSvc()->getQuery("IDDetRailUSP",indetVersionKey.tag(), indetVersionKey.node());
104 if(!queryUSP)
105 queryUSP = rdbAccessSvc()->getQuery("IDDetRailUSP","IDDetRailUSP-00");
106
107 queryUSP->setOrder("USP_ID");
108 queryUSP->execute();
109
110 queryUSP->next();
111 double yWidthUSP1 = queryUSP->data<double>("IDDETRAILUSP_DATA.YWIDTH");//SquirrelCageFactory.cxx - not in database
112 queryUSP->next();
113 double xDepthUSP2 = queryUSP->data<double>("IDDETRAILUSP_DATA.XDEPTH");
114 queryUSP->finalize();
115
116 double epsilon = 0.01; // +Some safety margin
117
118 RMAX_ID = (*atls)[0]->getDouble("IDETOR")*Gaudi::Units::cm;
119 //railLengthB = (*railrec)[0]->getDouble("LENGTHB")*Gaudi::Units::mm; At database there is 34.7 but it could cause crash.
120
121 railWidthB = (*railrec)[0]->getDouble("WIDTHB")*Gaudi::Units::mm;
122 railThickB = (*railrec)[0]->getDouble("THICKB")*Gaudi::Units::mm;
123 //------------ Limited by EP ExternalShell
124 railLengthE = (*endplate)[0]->getDouble("ZSTART")*Gaudi::Units::mm
125 +(*endplate)[0]->getDouble("ZSHIFT")*Gaudi::Units::mm
126 +(*endplate)[0]->getDouble("ZGAP")*Gaudi::Units::mm - railLengthB/2.;
127// railWidthE = (*railrec)[0]->getDouble("WIDTHE")*Gaudi::Units::mm;
128// railThickE = (*railrec)[0]->getDouble("THICKE")*Gaudi::Units::mm;
129
130 suppLength = railLengthB + 2.*railLengthE;
131 suppWidth = (*railrec)[0]->getDouble("WIDTHSUP")*Gaudi::Units::mm;
132// suppThick = (*railrec)[0]->getDouble("THICKSUP")*Gaudi::Units::mm;
133
134 double zLengthB = (*idSupportRails)[0]->getDouble("ZLENGTH");
135 double yWidthB = (*idSupportRails)[0]->getDouble("YWIDTH");
136 double zLengthE = (suppLength - zLengthB)/2.;
137
138 IRDBRecordset_ptr commonParameters = rdbAccessSvc()->getRecordsetPtr("IDDetRailCommon",indetVersionKey.tag(), indetVersionKey.node());
139 if(commonParameters->size()==0)
140 commonParameters = rdbAccessSvc()->getRecordsetPtr("IDDetRailCommon","IDDetRailCommon-00");
141
142 double railEBx = (*commonParameters)[0]->getDouble("RAILEBX");
143 double railEBy = (*commonParameters)[0]->getDouble("RAILEBY");
144
145 std::unique_ptr<IRDBQuery> querySP = rdbAccessSvc()->getQuery("IDDetRailSP",indetVersionKey.tag(), indetVersionKey.node());
146 if(!querySP)
147 querySP = rdbAccessSvc()->getQuery("IDDetRailSP","IDDetRailSP-00");
148
149 querySP->setOrder("SP_ID");
150 querySP->execute();
151
152 querySP->next();
153 double railSP1x = querySP->data<double>("IDDETRAILSP_DATA.SP_X");
154 double railSP1y = querySP->data<double>("IDDETRAILSP_DATA.SP_Y");
155 querySP->next();
156 double railSP2x = querySP->data<double>("IDDETRAILSP_DATA.SP_X");
157 double railSP2y = querySP->data<double>("IDDETRAILSP_DATA.SP_Y");
158 querySP->next();
159 double railSP3x = querySP->data<double>("IDDETRAILSP_DATA.SP_X");
160 double railSP3y = querySP->data<double>("IDDETRAILSP_DATA.SP_Y");
161
162 querySP->finalize();
163
164 double exactPl = (*commonParameters)[0]->getDouble("EXACTPL");
165 double gapOfRSF = (*commonParameters)[0]->getDouble("GAPOFRSF");
166
167//Parameters of Barrel Tracker Support Rail
168 std::unique_ptr<IRDBQuery> querySRBP = rdbAccessSvc()->getQuery("IDDetRailSRBP",indetVersionKey.tag(), indetVersionKey.node());
169 if(!querySRBP)
170 querySRBP = rdbAccessSvc()->getQuery("IDDetRailSRBP","IDDetRailSRBP-00");
171
172 querySRBP->setOrder("SRBP_ID");
173 querySRBP->execute();
174
175 querySRBP->next();
176 double trackerSRBP1x = querySRBP->data<double>("IDDETRAILSRBP_DATA.SRBP_X");
177 double trackerSRBP1y = yWidthB;
178 querySRBP->next();
179 double trackerSRBP2x = querySRBP->data<double>("IDDETRAILSRBP_DATA.SRBP_X");
180 double trackerSRBP2y = querySRBP->data<double>("IDDETRAILSRBP_DATA.SRBP_Y");
181 querySRBP->next();
182 double trackerSRBP3x = querySRBP->data<double>("IDDETRAILSRBP_DATA.SRBP_X");
183 double trackerSRBP3y = querySRBP->data<double>("IDDETRAILSRBP_DATA.SRBP_Y");
184 querySRBP->next();
185 double trackerSRBP4x = querySRBP->data<double>("IDDETRAILSRBP_DATA.SRBP_X");
186 double trackerSRBP4y = querySRBP->data<double>("IDDETRAILSRBP_DATA.SRBP_Y");
187
188 querySRBP->finalize();
189
190 double distBottom = (*commonParameters)[0]->getDouble("DISTBOTTOM");
191 double distTop = (*commonParameters)[0]->getDouble("DISTTOP");
192
193//Parameters of Endcap Tracker Support Rail
194 std::unique_ptr<IRDBQuery> querySREP = rdbAccessSvc()->getQuery("IDDetRailSREP",indetVersionKey.tag(), indetVersionKey.node());
195 if(!querySREP)
196 querySREP = rdbAccessSvc()->getQuery("IDDetRailSREP","IDDetRailSREP-00");
197
198 querySREP->setOrder("SREP_ID");
199 querySREP->execute();
200 querySREP->next();
201 double trackerSREP1x = querySREP->data<double>("IDDETRAILSREP_DATA.SREP_X");
202 double trackerSREP1y = querySREP->data<double>("IDDETRAILSREP_DATA.SREP_Y");
203 querySREP->next();
204 double trackerSREP2x = querySREP->data<double>("IDDETRAILSREP_DATA.SREP_X");
205 double trackerSREP2y = querySREP->data<double>("IDDETRAILSREP_DATA.SREP_Y");
206 querySREP->next();
207 double trackerSREP3x = querySREP->data<double>("IDDETRAILSREP_DATA.SREP_X");
208 double trackerSREP3y = querySREP->data<double>("IDDETRAILSREP_DATA.SREP_Y");
209 querySREP->finalize();
210
211//
212// To avoid rail corner outside ID envelope
213 RMAX_ID = sqrt(RMAX_ID*RMAX_ID-suppWidth*suppWidth/4.)-epsilon;
214
215//--------------------------------------------------------------------------------
216//Rail Barrel
217 const GeoBox* railBarrel = new GeoBox(railThickB/2., railWidthB/2., railLengthB/2.);
218
219
220//Rail Endcap
221 const int numberOfPieces = 10;
222
223 //GeoBox** railEndcap = new GeoBox*[numberOfPieces];
224 GeoBox* railEndcap[numberOfPieces];
225 // GeoTrf::Vector3D* vectorForTrans = new GeoTrf::Vector3D[numberOfPieces];
226 // //GeoTrf::Vector3D vectorForTrans[numberOfPieces];
227 GeoTrf::Vector3D vectorForTrans[numberOfPieces];
228
229 GeoBox* railEndcapFirst = new GeoBox(railEBx/2., railEBy/2., railLengthE/2);
230 GeoTrf::Vector3D vectorForTransFirst (0., 0., 0.);
231
232 double lastY = 0.;
233 double startY = 0.;
234
235 for (int i = 0; i < numberOfPieces; i++)
236 {
237 double xa = (railEBx/2.)/(numberOfPieces + 2) * (i+1);
238 double ya = xa - startY; //because of tangens of 45 degree
239 startY += ya;
240
241 //std::cerr << "xa: " << xa << ", ya:" << ya << std::endl;
242
243 railEndcap[i] = new GeoBox(railEBx/2. - xa, ya/2, railLengthE/2);
244 if (i == 0)
245 {
246 vectorForTrans[0] = GeoTrf::Vector3D(0., railEBy/2. + ya/2, 0.) + vectorForTransFirst;
247 lastY = ya/2;
248 }
249 else
250 {
251 vectorForTrans[i] = vectorForTrans[i-1] + GeoTrf::Vector3D(0., lastY + ya/2, 0.);
252 lastY = ya/2;
253 }
254
255 }
256//RailSupport
257 const GeoShape* elementOfRailSupport1 = new GeoBox(railSP1x/2., railSP1y/2., suppLength/2);
258 const GeoShape* elementOfRailSupport2 = new GeoBox(railSP2x/2., railSP2y/2., suppLength/2);
259 const GeoShape* elementOfRailSupport3 = new GeoBox(railSP3x/2., railSP3y/2., suppLength/2);
260
261 GeoTrf::Vector3D transRailSupport1(0., 0., 0.);
262 GeoTrf::Vector3D transRailSupport2Part1(-railSP1x/2. + railSP2x/2., railSP1y/2. + railSP2y/2. ,0.);
263 GeoTrf::Vector3D transRailSupport3Part1(-railSP1x/2. - railSP3x/2., railSP1y/2. + railSP2y - railSP3y/2. , 0.);
264
265 GeoTrf::Vector3D transRailSupport2Part2(railSP1x/2. - railSP2x/2., railSP1y/2. + railSP2y/2. ,0.);
266 GeoTrf::Vector3D transRailSupport3Part2(railSP1x/2. + railSP3x/2., railSP1y/2. + railSP2y - railSP3y/2. ,0.);
267
268
269//Definition of Barrel Tracker Support Rail
270 const GeoBox* trackerSRBP1 = new GeoBox(trackerSRBP1x/2., trackerSRBP1y/2., zLengthB/2);
271 const GeoBox* trackerSRBP2 = new GeoBox(trackerSRBP2x/2., trackerSRBP2y/2., zLengthB/2);
272 const GeoBox* trackerSRBP3 = new GeoBox(trackerSRBP3x/2., trackerSRBP3y/2., zLengthB/2);
273 const GeoBox* trackerSRBP4 = new GeoBox(trackerSRBP4x/2., trackerSRBP4y/2., zLengthB/2);
274
275 GeoTrf::Vector3D trans1TSRBP1(0., 0.,0.);
276 GeoTrf::Vector3D trans2TSRBP1(0., 0.,0.);
277
278 GeoTrf::Vector3D trans1TSRBP2(trackerSRBP1x/2. + trackerSRBP2x/2., - (trackerSRBP1y/2. - trackerSRBP2y/2. - distBottom), 0.);
279 GeoTrf::Vector3D trans2TSRBP2(-trackerSRBP1x/2. - trackerSRBP2x/2., - (trackerSRBP1y/2. - trackerSRBP2y/2. - distBottom), 0.);
280
281 GeoTrf::Vector3D trans1TSRBP3(trackerSRBP1x/2. + trackerSRBP2x + trackerSRBP3x/2., - (trackerSRBP1y/2. - trackerSRBP3y/2. - distBottom), 0.);
282 GeoTrf::Vector3D trans2TSRBP3(- trackerSRBP1x/2. - trackerSRBP2x - trackerSRBP3x/2., - (trackerSRBP1y/2. - trackerSRBP3y/2. - distBottom), 0.);
283
284 GeoTrf::Vector3D trans1TSRBP4(trackerSRBP1x/2. + trackerSRBP2x + trackerSRBP4x/2., trackerSRBP1y/2. - trackerSRBP4y/2. - distTop, 0.);
285 GeoTrf::Vector3D trans2TSRBP4(- trackerSRBP1x/2. - trackerSRBP2x - trackerSRBP4x/2.,trackerSRBP1y/2. - trackerSRBP4y/2. - distTop, 0.);
286
287//Definition Of Endcap Tracker Support Rail
288
289 const GeoBox* trackerSREP1 = new GeoBox(trackerSREP1x/2., trackerSREP1y/2.,zLengthE/2.);
290 const GeoBox* trackerSREP2 = new GeoBox(trackerSREP2x/2., trackerSREP2y/2.,zLengthE/2.);
291 const GeoBox* trackerSREP3 = new GeoBox(trackerSREP3x/2., trackerSREP3y/2.,zLengthE/2.);
292
293 GeoTrf::Vector3D trans1TSREP1(0. ,0.,0.);
294 GeoTrf::Vector3D trans2TSREP1(0. ,0.,0.);
295
296 GeoTrf::Vector3D trans1TSREP2(trackerSREP1x/2. + trackerSREP2x/2., -trackerSREP1y/2. + trackerSREP2y/2., 0.);
297 GeoTrf::Vector3D trans2TSREP2(- trackerSREP1x/2. - trackerSREP2x/2., -trackerSREP1y/2. + trackerSREP2y/2., 0.);
298
299 GeoTrf::Vector3D trans1TSREP3(trackerSREP1x/2. + trackerSREP3x/2., trackerSREP1y/2. - trackerSREP3y/2., 0.);
300 GeoTrf::Vector3D trans2TSREP3(- trackerSREP1x/2. - trackerSREP3x/2., trackerSREP1y/2. - trackerSREP3y/2., 0.);
301
302
303
304
305//Logical and Physical Volume
306 const GeoLogVol* railBarrelLog = new GeoLogVol("railBarrel",railBarrel,steel);
307 const GeoLogVol* railSupportLogPart1 = new GeoLogVol("RailSupportPart1", elementOfRailSupport1, alum);
308 const GeoLogVol* railSupportLogPart2 = new GeoLogVol("RailSupportPart2", elementOfRailSupport2, alum);
309 const GeoLogVol* railSupportLogPart3 = new GeoLogVol("RailSupportPart3", elementOfRailSupport3, alum);
310
311 const GeoLogVol* railEndcapFirstLog = new GeoLogVol("railEndcap", railEndcapFirst, steel);
312
313 GeoVPhysVol* railEndcapFirstPhys = new GeoPhysVol(railEndcapFirstLog);
314
315 //GeoLogVol** railEndcapLog = new GeoLogVol*[numberOfPieces];
316 //GeoVPhysVol** railEndcapPhys = new GeoVPhysVol*[numberOfPieces];
317 GeoLogVol* railEndcapLog[numberOfPieces];
318 GeoVPhysVol* railEndcapPhys[numberOfPieces];
319
320 for (int i = 0; i < numberOfPieces; i++)
321 {
322 railEndcapLog[i] = new GeoLogVol("railEndcap", railEndcap[i], steel);
323 railEndcapPhys[i] = new GeoPhysVol(railEndcapLog[i]);
324 }
325
326
327 GeoVPhysVol* railBarrelPhys = new GeoPhysVol(railBarrelLog);
328
329 GeoVPhysVol* railSupportPhysPart1 = new GeoPhysVol(railSupportLogPart1);
330 GeoVPhysVol* railSupportPhysPart2 = new GeoPhysVol(railSupportLogPart2);
331 GeoVPhysVol* railSupportPhysPart3 = new GeoPhysVol(railSupportLogPart3);
332
333
334 const GeoLogVol* trackerSRBLP1 = new GeoLogVol("TrackerSupportRailBarrelPart1", trackerSRBP1, alum);
335 const GeoLogVol* trackerSRBLP2 = new GeoLogVol("TrackerSupportRailBarrelPart2", trackerSRBP2, alum);
336 const GeoLogVol* trackerSRBLP3 = new GeoLogVol("TrackerSupportRailBarrelPart3", trackerSRBP3, alum);
337 const GeoLogVol* trackerSRBLP4 = new GeoLogVol("TrackerSupportRailBarrelPart3", trackerSRBP4, alum);
338
339 const GeoLogVol* trackerSRELP1 = new GeoLogVol("TrackerSupportRailEndPart1", trackerSREP1, alum);
340 const GeoLogVol* trackerSRELP2 = new GeoLogVol("TrackerSupportRailEndPart2", trackerSREP2, alum);
341 const GeoLogVol* trackerSRELP3 = new GeoLogVol("TrackerSupportRailEndPart3", trackerSREP3, alum);
342
343 GeoVPhysVol* trackerSRBPP1 = new GeoPhysVol(trackerSRBLP1);
344 GeoVPhysVol* trackerSRBPP2 = new GeoPhysVol(trackerSRBLP2);
345 GeoVPhysVol* trackerSRBPP3 = new GeoPhysVol(trackerSRBLP3);
346 GeoVPhysVol* trackerSRBPP4 = new GeoPhysVol(trackerSRBLP4);
347
348 GeoVPhysVol* trackerSREPP1 = new GeoPhysVol(trackerSRELP1);
349 GeoVPhysVol* trackerSREPP2 = new GeoPhysVol(trackerSRELP2);
350 GeoVPhysVol* trackerSREPP3 = new GeoPhysVol(trackerSRELP3);
351
352//Positioning and addig to geometry
353
354 GeoTransform* pos;
355//It is need because we want to put Support Rail, Barrel Rail, etc into "U" shape support - SquirrelCageFactory.cxx
356 double coordY = yWidthUSP1/2. - railSP1y - railSP2y + (railSP3y - gapOfRSF/2.);
357
358//Support rail - male part
359
360 GeoTrf::Vector3D suppPos1Part1(rminInt + xDepthUSP2 + railSP2x - railSP1x/2., - yWidthUSP1/2. + railSP1y/2. + coordY, 0.);
361 GeoTrf::Vector3D suppPos2Part1( - rminInt - xDepthUSP2 - railSP2x + railSP1x/2., - yWidthUSP1/2. + railSP1y/2. + coordY, 0.);
362
363 pos = new GeoTransform(GeoTrf::Translate3D(suppPos1Part1.x(),suppPos1Part1.y(),suppPos1Part1.z()));
364 mother->add(pos);
365 mother->add(railSupportPhysPart1);
366
367 pos = new GeoTransform(GeoTrf::Translate3D(suppPos2Part1.x(),suppPos2Part1.y(),suppPos2Part1.z()));
368 mother->add(pos);
369 mother->add(railSupportPhysPart1);
370
371 GeoTrf::Vector3D tmpVec = suppPos1Part1 + transRailSupport2Part2;
372 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
373 mother->add(pos);
374 mother->add(railSupportPhysPart2);
375
376 tmpVec = suppPos2Part1 + transRailSupport2Part1;
377 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
378 mother->add(pos);
379 mother->add(railSupportPhysPart2);
380
381 tmpVec = suppPos1Part1+ transRailSupport3Part2;
382 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
383 mother->add(pos);
384 mother->add(railSupportPhysPart3);
385
386 tmpVec = suppPos2Part1+ transRailSupport3Part1;
387 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
388 mother->add(pos);
389 mother->add(railSupportPhysPart3);
390
391
392
393//
394// Barrel steel rails
395//
396// double safety=0.01; // to provide safety gap for G4
397
398
399 GeoTrf::Vector3D railBpos1(railSP1x/2. - railThickB/2. - railSP2x, railSP1y/2. + railWidthB/2., 0.);
400 GeoTrf::Vector3D railBpos2(- railSP1x/2. + railThickB/2. + railSP2x, railSP1y/2. + railWidthB/2., 0.);
401 tmpVec = railBpos1 + suppPos1Part1;
402 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
403 mother->add(pos);
404 mother->add(railBarrelPhys);
405 tmpVec = railBpos2 + suppPos2Part1;
406 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
407 mother->add(pos);
408 mother->add(railBarrelPhys);
409//
410// Endcap steel rails
411//
412
413 GeoTrf::Vector3D railEpos1( railSP1x/2 + railSP3x - exactPl, railSP1y/2. + railEBy/2., (railLengthB+railLengthE)/2.);
414 GeoTrf::Vector3D railEpos2( -railSP1x/2 - railSP3x + exactPl, railSP1y/2. + railEBy/2., (railLengthB+railLengthE)/2.);
415 GeoTrf::Vector3D railEpos3( railSP1x/2 + railSP3x - exactPl, railSP1y/2. + railEBy/2.,-(railLengthB+railLengthE)/2.);
416 GeoTrf::Vector3D railEpos4( -railSP1x/2 - railSP3x + exactPl, railSP1y/2. + railEBy/2.,-(railLengthB+railLengthE)/2.);
417 tmpVec = railEpos1 + vectorForTransFirst + suppPos1Part1;
418 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
419 mother->add(pos);
420 mother->add(railEndcapFirstPhys);
421
422 for (int i = 0; i < numberOfPieces; i++)
423 {
424 tmpVec = railEpos1 + vectorForTrans[i] + suppPos1Part1;
425 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
426 mother->add(pos);
427 mother->add(railEndcapPhys[i]);
428 }
429
430 tmpVec = railEpos2 + vectorForTransFirst + suppPos2Part1;
431 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
432 mother->add(pos);
433 mother->add(railEndcapFirstPhys);
434
435 for (int i = 0; i < numberOfPieces; i++)
436 {
437 tmpVec = railEpos2 + vectorForTrans[i] + suppPos2Part1;
438 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
439 mother->add(pos);
440 mother->add(railEndcapPhys[i]);
441 }
442
443 tmpVec = railEpos3 + vectorForTransFirst + suppPos1Part1;
444 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
445 mother->add(pos);
446 mother->add(railEndcapFirstPhys);
447
448 for (int i = 0; i < numberOfPieces; i++)
449 {
450 tmpVec = railEpos3 + vectorForTrans[i] + suppPos1Part1;
451 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
452 mother->add(pos);
453 mother->add(railEndcapPhys[i]);
454 }
455
456 tmpVec = railEpos4 + vectorForTransFirst + suppPos2Part1;
457 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
458 mother->add(pos);
459 mother->add(railEndcapFirstPhys);
460
461 for (int i = 0; i < numberOfPieces; i++)
462 {
463 tmpVec = railEpos4 + vectorForTrans[i] + suppPos2Part1;
464 pos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
465 mother->add(pos);
466 mother->add(railEndcapPhys[i]);
467 }
468
469 GeoTrf::Vector3D transToInnerWall(rminInt + xDepthUSP2 + railSP2x + railSP3x + trackerSRBP2x + trackerSRBP1x, 0, 0);
470 GeoTrf::Vector3D transMalePart(0., 0., 0.);
471 GeoTransform *xfPos;
472 GeoTransform *xfNeg;
473
474//Barrel
475 tmpVec = transToInnerWall - GeoTrf::Vector3D(trackerSRBP1x/2., 0, 0) + trans2TSRBP1 + transMalePart;
476 xfPos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
477 tmpVec = - transToInnerWall + GeoTrf::Vector3D(trackerSRBP1x/2., 0,0) + trans1TSRBP1 + transMalePart;
478 xfNeg = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
479 mother->add(xfPos);
480 mother->add(trackerSRBPP1);
481 mother->add(xfNeg);
482 mother->add(trackerSRBPP1);
483
484 tmpVec = transToInnerWall - GeoTrf::Vector3D(trackerSRBP1x/2., 0, 0) + trans2TSRBP2 + transMalePart;
485 xfPos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
486 tmpVec = - transToInnerWall + GeoTrf::Vector3D(trackerSRBP1x/2., 0, 0) + trans1TSRBP2 + transMalePart;
487 xfNeg = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
488 mother->add(xfPos);
489 mother->add(trackerSRBPP2);
490 mother->add(xfNeg);
491 mother->add(trackerSRBPP2);
492
493 tmpVec = transToInnerWall - GeoTrf::Vector3D(trackerSRBP1x/2., 0,0) + trans2TSRBP3 + transMalePart;
494 xfPos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
495 tmpVec = - transToInnerWall + GeoTrf::Vector3D(trackerSRBP1x/2., 0, 0) + trans1TSRBP3 + transMalePart;
496 xfNeg = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
497 mother->add(xfPos);
498 mother->add(trackerSRBPP3);
499 mother->add(xfNeg);
500 mother->add(trackerSRBPP3);
501
502 tmpVec = transToInnerWall - GeoTrf::Vector3D(trackerSRBP1x/2., 0,0) + trans2TSRBP4 + transMalePart;
503 xfPos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
504 tmpVec = -transToInnerWall + GeoTrf::Vector3D(trackerSRBP1x/2., 0, 0) + trans1TSRBP4 + transMalePart;
505 xfNeg = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
506 mother->add(xfPos);
507 mother->add(trackerSRBPP4);
508 mother->add(xfNeg);
509 mother->add(trackerSRBPP4);
510//Endcap positiv
511
512 tmpVec = transToInnerWall - GeoTrf::Vector3D(trackerSREP1x/2., 1.5, zLengthB/2 + zLengthE/2) + trans2TSREP1 + transMalePart;
513 xfPos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
514 tmpVec = - transToInnerWall + GeoTrf::Vector3D(trackerSREP1x/2., -1.5, zLengthB/2 + zLengthE/2) + trans1TSREP1 + transMalePart;
515 xfNeg = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
516 mother->add(xfPos);
517 mother->add(trackerSREPP1);
518 mother->add(xfNeg);
519 mother->add(trackerSREPP1);
520
521 tmpVec = transToInnerWall - GeoTrf::Vector3D(trackerSREP1x/2., 1.5, zLengthB/2 + zLengthE/2) + trans2TSREP2 + transMalePart;
522 xfPos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
523 tmpVec = - transToInnerWall + GeoTrf::Vector3D(trackerSREP1x/2., -1.5, zLengthB/2 + zLengthE/2) + trans1TSREP2 + transMalePart;
524 xfNeg = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
525 mother->add(xfPos);
526 mother->add(trackerSREPP2);
527 mother->add(xfNeg);
528 mother->add(trackerSREPP2);
529
530 tmpVec = transToInnerWall - GeoTrf::Vector3D(trackerSREP1x/2., 1.5, zLengthB/2 + zLengthE/2) + trans2TSREP3 + transMalePart;
531 xfPos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
532 tmpVec = - transToInnerWall + GeoTrf::Vector3D(trackerSREP1x/2., -1.5, zLengthB/2 + zLengthE/2) + trans1TSREP3 + transMalePart;
533 xfNeg = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
534 mother->add(xfPos);
535 mother->add(trackerSREPP3);
536 mother->add(xfNeg);
537 mother->add(trackerSREPP3);
538//Endcap negativ
539
540 tmpVec = transToInnerWall - GeoTrf::Vector3D(trackerSREP1x/2., 1.5, - zLengthB/2 - zLengthE/2) + trans2TSREP1 + transMalePart;
541 xfPos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
542 tmpVec = - transToInnerWall + GeoTrf::Vector3D(trackerSREP1x/2., -1.5, - zLengthB/2 - zLengthE/2) + trans1TSREP1 + transMalePart;
543 xfNeg = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
544 mother->add(xfPos);
545 mother->add(trackerSREPP1);
546 mother->add(xfNeg);
547 mother->add(trackerSREPP1);
548
549 tmpVec = transToInnerWall - GeoTrf::Vector3D(trackerSREP1x/2., 1.5, - zLengthB/2 - zLengthE/2) + trans2TSREP2 + transMalePart;
550 xfPos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
551 tmpVec = - transToInnerWall + GeoTrf::Vector3D(trackerSREP1x/2., -1.5, - zLengthB/2 - zLengthE/2) + trans1TSREP2 + transMalePart;
552 xfNeg = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
553 mother->add(xfPos);
554 mother->add(trackerSREPP2);
555 mother->add(xfNeg);
556 mother->add(trackerSREPP2);
557
558 tmpVec = transToInnerWall - GeoTrf::Vector3D(trackerSREP1x/2., 1.5, - zLengthB/2 - zLengthE/2) + trans2TSREP3 + transMalePart;
559 xfPos = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
560 tmpVec = - transToInnerWall + GeoTrf::Vector3D(trackerSREP1x/2., -1.5, - zLengthB/2 - zLengthE/2) + trans1TSREP3 + transMalePart;
561 xfNeg = new GeoTransform(GeoTrf::Translate3D(tmpVec.x(),tmpVec.y(),tmpVec.z()));
562 mother->add(xfPos);
563 mother->add(trackerSREPP3);
564 mother->add(xfNeg);
565 mother->add(trackerSREPP3);
566
567 }
568 else {
569 // ______________________________________________________________________________________________________________________
570 // Geometry without ID rail
571// std::cout <<" Version!!="<<atlasVersionKey.tag()<<", "<<atlasVersionKey.node()<<'\n';
572// std::cout <<" Version!!="<<indetVersionKey.tag()<<", "<<indetVersionKey.node()<<'\n';
573//---------------------------------------------------------------------------------
574// Long ribs (initial position is along X axis then move and rotate)
575//
576// Th
577// ___
578// | |
579// | | Wid
580// | |
581// |__|
582//
583// Default(initial) values
584//
585 double RMAX_ID = 1150.0*Gaudi::Units::mm -1.0*Gaudi::Units::mm; //Some safety margin
586 double railLengthB = 1600.0*Gaudi::Units::mm;
587 double railWidthB = 5.5*Gaudi::Units::mm;
588 double railThickB = 34.7*Gaudi::Units::mm;
589//
590 double railLengthE = 2600.0*Gaudi::Units::mm;
591 double railWidthE = 14.*Gaudi::Units::mm;
592 double railThickE = 14.7*Gaudi::Units::mm;
593//
594 double suppLength = 6800.0*Gaudi::Units::mm;
595 double suppWidth = 54.*Gaudi::Units::mm;
596 double suppThick = 22.6*Gaudi::Units::mm;
597//
598// Database
599//
600 IRDBRecordset_ptr atls = rdbAccessSvc()->getRecordsetPtr("AtlasMother", atlasVersionKey.tag(), atlasVersionKey.node());
601 IRDBRecordset_ptr railrec = rdbAccessSvc()->getRecordsetPtr("IDRails", indetVersionKey.tag(), indetVersionKey.node());
602 IRDBRecordset_ptr endplate = rdbAccessSvc()->getRecordsetPtr("EPShell", indetVersionKey.tag(), indetVersionKey.node());
603
604
605// const GeoMaterial* steel = materialManager()->getMaterial("std::Iron");
606// const GeoMaterial* alum = materialManager()->getMaterial("std::Aluminium");
607 const GeoMaterial* steel = materialManager()->getMaterial((*railrec)[0]->getString("MATERIAL"));
608 const GeoMaterial* alum = materialManager()->getMaterial((*railrec)[0]->getString("MATSUP"));
609
610// std::cout << "Rail Steel density="<<steel->getDensity()<<" Rad.length="<<steel->getRadLength()<<'\n';
611// std::cout << "Rail Aluminium density="<<alum->getDensity()<<" Rad.length="<<alum->getRadLength()<<'\n';
612
613
614
615
616
617 double epsilon = 0.01; // +Some safety margin
618
619 RMAX_ID = (*atls)[0]->getDouble("IDETOR")*Gaudi::Units::cm;
620 railLengthB = (*railrec)[0]->getDouble("LENGTHB")*Gaudi::Units::mm;
621 railWidthB = (*railrec)[0]->getDouble("WIDTHB")*Gaudi::Units::mm;
622 railThickB = (*railrec)[0]->getDouble("THICKB")*Gaudi::Units::mm;
623 //------------ Limited by EP ExternalShell
624 railLengthE = (*endplate)[0]->getDouble("ZSTART")*Gaudi::Units::mm
625 +(*endplate)[0]->getDouble("ZSHIFT")*Gaudi::Units::mm
626 +(*endplate)[0]->getDouble("ZGAP")*Gaudi::Units::mm - railLengthB/2.;
627 railWidthE = (*railrec)[0]->getDouble("WIDTHE")*Gaudi::Units::mm;
628 railThickE = (*railrec)[0]->getDouble("THICKE")*Gaudi::Units::mm;
629
630 suppLength = railLengthB + 2.*railLengthE;
631 suppWidth = (*railrec)[0]->getDouble("WIDTHSUP")*Gaudi::Units::mm;
632 suppThick = (*railrec)[0]->getDouble("THICKSUP")*Gaudi::Units::mm;
633//
634// To avoid rail corner outside ID envelope
635 RMAX_ID = sqrt(RMAX_ID*RMAX_ID-suppWidth*suppWidth/4.)-epsilon;
636
637//--------------------------------------------------------------------------------
638
639 const GeoBox* railBarrel = new GeoBox(railThickB/2., railWidthB/2., railLengthB/2.);
640 const GeoBox* railEndcap = new GeoBox(railThickE/2., railWidthE/2., railLengthE/2.);
641 const GeoBox* support = new GeoBox(suppThick/2., suppWidth/2., suppLength/2.);
642
643 const GeoLogVol* railBarrelLog = new GeoLogVol("railBarrel",railBarrel,steel);
644 const GeoLogVol* railEndcapLog = new GeoLogVol("railEndcap",railEndcap,steel);
645 const GeoLogVol* supportLog = new GeoLogVol("RailSupport",support,alum);
646 GeoVPhysVol* railBarrelPhys = new GeoPhysVol(railBarrelLog);
647 GeoVPhysVol* railEndcapPhys = new GeoPhysVol(railEndcapLog);
648 GeoVPhysVol* supportPhys = new GeoPhysVol(supportLog);
649
650
651 GeoTransform* pos;
652//
653// Barrel steel rails
654//
655 double safety=0.01; // to provide safety gap for G4
656
657 GeoTrf::Translate3D railBpos1( ( RMAX_ID-suppThick-railThickB/2.-safety), 0., 0.);
658 GeoTrf::Translate3D railBpos2( (-RMAX_ID+suppThick+railThickB/2.+safety), 0., 0.);
659 pos = new GeoTransform(railBpos1);
660 mother->add(pos);
661 mother->add(railBarrelPhys);
662 pos = new GeoTransform(railBpos2);
663 mother->add(pos);
664 mother->add(railBarrelPhys);
665//
666// Endcap steel rails
667//
668 GeoTrf::Translate3D railEpos1( ( RMAX_ID-suppThick-railThickE/2.-safety), 0., (railLengthB+railLengthE)/2.);
669 GeoTrf::Translate3D railEpos2( (-RMAX_ID+suppThick+railThickE/2.+safety), 0., (railLengthB+railLengthE)/2.);
670 GeoTrf::Translate3D railEpos3( ( RMAX_ID-suppThick-railThickE/2.-safety), 0.,-(railLengthB+railLengthE)/2.);
671 GeoTrf::Translate3D railEpos4( (-RMAX_ID+suppThick+railThickE/2.+safety), 0.,-(railLengthB+railLengthE)/2.);
672 pos = new GeoTransform(railEpos1);
673 mother->add(pos);
674 mother->add(railEndcapPhys);
675 pos = new GeoTransform(railEpos2);
676 mother->add(pos);
677 mother->add(railEndcapPhys);
678 pos = new GeoTransform(railEpos3);
679 mother->add(pos);
680 mother->add(railEndcapPhys);
681 pos = new GeoTransform(railEpos4);
682 mother->add(pos);
683 mother->add(railEndcapPhys);
684//
685// Rail supports
686//
687
688 GeoTrf::Translate3D suppPos1( ( RMAX_ID-suppThick/2.), 0., 0.);
689 GeoTrf::Translate3D suppPos2( (-RMAX_ID+suppThick/2.), 0., 0.);
690 pos = new GeoTransform(suppPos1);
691 mother->add(pos);
692 mother->add(supportPhys);
693 pos = new GeoTransform(suppPos2);
694 mother->add(pos);
695 mother->add(supportPhys);
696
697 }
698}
699
700
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...
SupportRailFactory(InDetDD::AthenaComps *athenaComps, InDetMaterialManager *matManager)
void create(GeoPhysVol *mother)
Message Stream Member.