ATLAS Offline Software
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 
5 #include "SupportRailFactory.h"
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 
24 #include "RDBAccessSvc/IRDBQuery.h"
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 
42 {
43 }
44 
45 
46 
47 //## Other Operations (implementation)
48 void 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 
IRDBQuery::setOrder
virtual void setOrder(const std::string &)=0
IRDBAccessSvc::getQuery
virtual std::unique_ptr< IRDBQuery > getQuery(const std::string &node, const std::string &tag, const std::string &tag2node="", const std::string &connName="ATLASDD")=0
IRDBAccessSvc::getRecordsetPtr
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.
InDetDD::AthenaComps
Class to hold various Athena components.
Definition: InDetDDAthenaComps.h:21
DataModelTestDataCommonDict::xa
std::vector< DMTest::B > xa
Definition: DataModelTestDataCommonDict.h:43
DecodeVersionKey::node
const std::string & node() const
Return the version node.
Definition: DecodeVersionKey.cxx:99
SupportRailFactory::~SupportRailFactory
~SupportRailFactory()
Definition: SupportRailFactory.cxx:41
SupportRailFactory::create
void create(GeoPhysVol *mother)
Definition: SupportRailFactory.cxx:48
IRDBQuery.h
cm
const double cm
Definition: Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/tools/FCAL_ChannelMap.cxx:25
GeoPrimitives.h
IRDBAccessSvc.h
Definition of the abstract IRDBAccessSvc interface.
IRDBAccessSvc::getChildTag
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.
lumiFormat.i
int i
Definition: lumiFormat.py:92
DecodeVersionKey
This is a helper class to query the version tags from GeoModelSvc and determine the appropriate tag a...
Definition: DecodeVersionKey.h:18
DecodeVersionKey::tag
const std::string & tag() const
Return version tag.
Definition: DecodeVersionKey.cxx:93
InDetDD::SubDetectorFactoryBase::rdbAccessSvc
IRDBAccessSvc * rdbAccessSvc()
Definition: InDetSubDetectorFactoryBase.h:43
SupportRailFactory.h
IRDBRecordset_ptr
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition: IRDBAccessSvc.h:25
SupportRailFactory::SupportRailFactory
SupportRailFactory(InDetDD::AthenaComps *athenaComps, InDetMaterialManager *matManager)
Definition: SupportRailFactory.cxx:35
InDetMaterialManager
InDetMaterialManager.
Definition: InDetMaterialManager.h:34
InDetMaterialManager.h
InDetDD::SubDetectorFactoryBase::geoDbTagSvc
const IGeoDbTagSvc * geoDbTagSvc() const
Definition: InDetSubDetectorFactoryBase.h:41
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
DecodeVersionKey.h
IRDBQuery::finalize
virtual void finalize()=0
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
IRDBRecord.h
Definition of the abstract IRDBRecord interface.
InDetDD
Message Stream Member.
Definition: FakeTrackBuilder.h:8
IRDBQuery::data
const T & data(const std::string &)
Definition: IRDBQuery.h:35
InDetDD::SubDetectorFactoryBase::materialManager
InDetMaterialManager * materialManager()
Definition: InDetSubDetectorFactoryBase.h:47
IRDBRecordset.h
Definition of the abstract IRDBRecordset interface.
IRDBQuery::next
virtual bool next()=0
InDetMaterialManager::getMaterial
const GeoMaterial * getMaterial(const std::string &materialName)
Get material. First looks for locally defined material and if not found looks in GeoModel material ma...
Definition: InDetMaterialManager.cxx:96
checker_macros.h
Define macros for attributes used to control the static checker.
IRDBQuery::execute
virtual void execute()=0
IGeoDbTagSvc.h