ATLAS Offline Software
Public Member Functions | Private Member Functions | Private Attributes | List of all members
LArGeo::HECConstructionH62002 Class Reference

#include <HECConstructionH62002.h>

Collaboration diagram for LArGeo::HECConstructionH62002:

Public Member Functions

 HECConstructionH62002 ()
 
virtual ~HECConstructionH62002 ()
 
GeoIntrusivePtr< GeoVFullPhysVol > GetEnvelope ()
 

Private Member Functions

 HECConstructionH62002 (const HECConstructionH62002 &)
 
HECConstructionH62002operator= (const HECConstructionH62002 &)
 

Private Attributes

GeoIntrusivePtr< GeoFullPhysVol > m_h6Phys
 

Detailed Description

Definition at line 22 of file HECConstructionH62002.h.

Constructor & Destructor Documentation

◆ HECConstructionH62002() [1/2]

LArGeo::HECConstructionH62002::HECConstructionH62002 ( )

Definition at line 53 of file HECConstructionH62002.cxx.

54  :m_h6Phys(nullptr)
55 {
56  // access source of detector parameters
57  // m_parameters = LArGeo::VDetectorParameters::GetInstance();
58 }

◆ ~HECConstructionH62002()

LArGeo::HECConstructionH62002::~HECConstructionH62002 ( )
virtualdefault

◆ HECConstructionH62002() [2/2]

LArGeo::HECConstructionH62002::HECConstructionH62002 ( const HECConstructionH62002 )
private

Member Function Documentation

◆ GetEnvelope()

GeoIntrusivePtr< GeoVFullPhysVol > LArGeo::HECConstructionH62002::GetEnvelope ( )

Definition at line 65 of file HECConstructionH62002.cxx.

66 {
67 
68  if (m_h6Phys) return (m_h6Phys);
69 
70 
71  ISvcLocator *svcLocator = Gaudi::svcLocator();
72  IMessageSvc * msgSvc;
73  if (svcLocator->service("MessageSvc", msgSvc, true )==StatusCode::FAILURE) {
74  throw std::runtime_error("Error in HECConstruction, cannot access MessageSvc");
75  }
76  MsgStream log(msgSvc, "HECConstruction");
77  log << MSG::INFO;
78  log << "++++++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl;
79  log << "+ +" << std::endl;
80  log << "+ Start of HEC TB GeoModel definition +" << std::endl;
81  log << "+ +" << std::endl;
82  log << "++++++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl;
83 
84 
85  StoreGateSvc *detectorStore;
86  if (svcLocator->service("DetectorStore", detectorStore, false )==StatusCode::FAILURE) {
87  throw std::runtime_error("Error in HECConstruction, cannot access DetectorStore");
88  }
89 
90 
91  StatusCode sc;
92  IRDBAccessSvc *pAccessSvc;
93  sc=svcLocator->service("RDBAccessSvc",pAccessSvc);
94  if (sc != StatusCode::SUCCESS) {
95  throw std::runtime_error ("Cannot locate RDBAccessSvc!!");
96  }
97 
98 
99  StoredMaterialManager* materialManager = nullptr;
100  if (StatusCode::SUCCESS != detectorStore->retrieve(materialManager, std::string("MATERIALS"))) {
101  return nullptr;
102  }
103 
104 
105 
106  //-----------------------------------------------------------------------------------//
107  // Get the materials that we shall use. //
108  // ----------------------------------------------------------------------------------//
109 
110  //const GeoMaterial *air = materialManager->getMaterial("std::Air");
111 
112  const GeoMaterial *LAr = materialManager->getMaterial("std::LiquidArgon");
113  if (!LAr) throw std::runtime_error("Error in HECConstruction, std::LiquidArgon is not found.");
114 
115  const GeoMaterial *Iron = materialManager->getMaterial("std::Iron");
116  if (!Iron) throw std::runtime_error("Error in HECConstruction, std::Iron is not found.");
117 
118  const GeoMaterial *Copper = materialManager->getMaterial("std::Copper");
119  if (!Copper) throw std::runtime_error("Error in HECConstruction, std::Copper is not found.");
120 
121  const GeoMaterial *Kapton = materialManager->getMaterial("std::Kapton");
122  if (!Kapton) throw std::runtime_error("Error in HECConstruction, std::Kapton is not found.");
123 
124 
125 
126  DecodeVersionKey larVersionKey("LAr");
127  const std::string& detectorKey =larVersionKey.tag();
128  const std::string& detectorNode = larVersionKey.node();
129 
130  IRDBRecordset_ptr hadronicEndcap = pAccessSvc->getRecordsetPtr("HadronicEndcap",detectorKey, detectorNode);
131  IRDBRecordset_ptr hecLongitudinalBlock = pAccessSvc->getRecordsetPtr("HecLongitudinalBlock",detectorKey, detectorNode);
132  if(!hadronicEndcap) throw std::runtime_error("Error in HECConstruction: hadronicEendcap not found");
133  if(!hecLongitudinalBlock) throw std::runtime_error("Error in HECConstruction: hecLongitudinalBlock not found");
134 
135 
136  //------------------------------------------------------------------
137  // First some sort of a mother
138  //-----------------------------------------------------------------------------------//
139 
140  // This creates a "mother wedge", which we can then place into the cryostat.
141  // (Not the greatest way of doing it... Needs to be fixed.)
142  // Maybe the best way would be to declare a union of front and rear module shapes?
143 
144  // std::string tempHECName = "LAr::H62002::HEC::MotherVolume";
145  std::string tempHECName = "LAr::Endcap::Cryostat::MotherVolume";
146  double HECMotherZplan[] = { 0. , 1350. };
147  double HECMotherRin[] = { 372. , 372. };
148  double HECMotherRout[] = { 2030. , 2030. };
149  int lastPlaneHEC = ( sizeof(HECMotherZplan) / sizeof(double) );
150 
151 
152  double moduleDeltaPhi = 2.*M_PI/32. ; // = 11.25*Gaudi::Units::deg;
153  double phiStart [] = {-19. , -18. } ;
154  double hecPhistart[] = { phiStart[0]*M_PI/32 , phiStart[1]*M_PI/32 } ;
155  double modulePhistart[] = { (phiStart[0]+2.)*M_PI/32 , (phiStart[1]+2.)*M_PI/32 } ;
156 
157 
158  GeoPcon* HECMotherShape = new GeoPcon(hecPhistart[0], 3.*M_PI/16. );
159 
160  for ( int i = 0; i != lastPlaneHEC; ++i )
161  {
162  HECMotherShape->addPlane( HECMotherZplan[i], HECMotherRin[i], HECMotherRout[i]);
163  }
164 
165  const GeoLogVol *h6Log = new GeoLogVol("HECMother", HECMotherShape, LAr);
166  m_h6Phys = new GeoFullPhysVol(h6Log);
167 
168  std::string tag = std::string("HEC1_POS");
170 
171  StoredPhysVol *sPhysVol = new StoredPhysVol(m_h6Phys);
172  status=detectorStore->record(sPhysVol,tag);
173  if(!status.isSuccess()) throw std::runtime_error ((std::string("Cannot store")+tag).c_str());
174 
175 
176 
177  //----------------------------------------------------------------
178  // LAr HEC GEOMETRY
179  //----------------------------------------------------------------
180  //
181  // .... different sets of indeces:
182  // -- iwheel -- 0,1 -- Front and Rear Wheels
183  // -- islice -- 0,1,2 -- slices refer to the LAr gaps
184  // -- idepth -- 0-4 -- longitudinal samplings (0-2 Front;3,4 Rear)
185  // -- itie -- 0-3 -- radial tierod position
186 
187 
188  // Some volumes and related items we have to declare here.
189 
190  // Those with index - iwheel:
191  // First Absorber
192  GeoTubs* solidFirstAbsorber[2];
193  const GeoLogVol* logiFirstAbsorber[2];
194  GeoIntrusivePtr<GeoPhysVol> physiFirstAbsorber[2];
195  double firstAbsorber[5];
196  // TieRod in the gap
197  GeoTubs* solidTieRod[2];
198  const GeoLogVol* logiTieRod[2];
199  GeoIntrusivePtr<GeoPhysVol> physiTieRod[2];
200  // TieRod in absorbers
201  GeoTubs* solidAbsorberTieRod[2];
202  const GeoLogVol* logiAbsorberTieRod[2];
203  GeoIntrusivePtr<GeoPhysVol> physiAbsorberTieRod[2];
204  GeoTubs* solidAbsorberTieRodRear[2];
205  const GeoLogVol* logiAbsorberTieRodRear[2];
206  GeoIntrusivePtr<GeoPhysVol> physiAbsorberTieRodRear[2];
207  double tieRodPositionX[4]; // 4 radial tie rod locations
208  double tieRodPositionY[4];
209  double tieRodDiameter[2]; // 2 sizes for the two wheels
210  double spacerDiameter[2];
211 
212  double ztie[2]; // This is the +/- z length of the tie rod in the LAr gap
213  ztie[0]=-0.227825*Gaudi::Units::cm;
214  ztie[1]= 0.227825*Gaudi::Units::cm;
215  double rodSize = 0.39435*Gaudi::Units::cm;
216 
217 
218 
219 
220  // Those with index - islice:
221  // Slice
222  GeoTubs* solidSlice[3];
223  const GeoLogVol* logiSlice[3];
224  GeoIntrusivePtr<GeoPhysVol> physiSlice[3];
225  // Absorber
226  double radialShift = 1.02*Gaudi::Units::cm; // absorbers are adjusted by this amount
227  GeoTubs* solidFrontAbsorber[2];
228  const GeoLogVol* logiFrontAbsorber[2];
229  GeoIntrusivePtr<GeoPhysVol> physiFrontAbsorber[2];
230  GeoTubs* solidRearAbsorber;
231  const GeoLogVol* logiRearAbsorber;
232  GeoIntrusivePtr<GeoPhysVol> physiRearAbsorber;
233 
234 
235  // Those with index - idepth:
236  // Depth = longitudinal samplings
237  int gapNumber[5];
238  GeoTubs* solidDepth[5];
239  const GeoLogVol* logiDepth[5];
240  GeoIntrusivePtr<GeoPhysVol> physiDepth[5];
241 
242 
243  // And some that are just more convenient here:
244  // EstBoard
245  GeoTubs* solidEstBoard;
246  const GeoLogVol* logiEstBoard;
247  GeoIntrusivePtr<GeoPhysVol> physiEstBoard;
248  // PadBoard
249  GeoTubs* solidPadBoard;
250  const GeoLogVol* logiPadBoard;
251  GeoIntrusivePtr<GeoPhysVol> physiPadBoard;
252 
253 
254 
255  // And here are some numbers:
256 
257  int numberZplane = 6; // total number of z-planes needed for HEC volume
258  int numberFrontZplane = 4; // number of z-planes needed for front HEC volume
259  int depthNumber = 5; // number of longitudinal readout segments
260  //int sliceNumber = 3; // LAr gap segmentation
261  double depthSize[5]; // z dimension of longitudinal readout segments
262  double kaptonPosition[3];
263  double kaptonWidth[3];
264 
265  log << MSG::DEBUG << " In the H6 2002 HEC Constr. GetEnvelope - Here we get database things " << std::endl;
266 
267 
268 
269  // set the number of Front and Rear Modules in the testbeam:
270  int moduleNumberFront = 3;
271  int moduleNumberRear = 2;
272  // radial dimensions of the modules:
273  double moduleRinner1 = (*hecLongitudinalBlock)[0]->getDouble("BLRMN")*Gaudi::Units::cm;
274  double moduleRinner2 = (*hecLongitudinalBlock)[1]->getDouble("BLRMN")*Gaudi::Units::cm;
275  double moduleRouter = (*hecLongitudinalBlock)[0]->getDouble("BLRMX")*Gaudi::Units::cm;
276  // thickness of Cu pads, LAr gaps and inter-wheel gap:
277  double copperPad = (*hadronicEndcap)[0]->getDouble("COPPER")*Gaudi::Units::cm;
278  double gapSize = (*hadronicEndcap)[0]->getDouble("LARG")*Gaudi::Units::cm;
279  double betweenWheel = (*hadronicEndcap)[0]->getDouble("GAPWHL")*Gaudi::Units::cm;
280 
281 
282  for (int idepth=0; idepth < depthNumber; ++idepth)
283  {
284  depthSize[idepth] = (*hecLongitudinalBlock)[idepth]->getDouble("BLDPTH")*Gaudi::Units::cm;
285  firstAbsorber[idepth]= (*hecLongitudinalBlock)[idepth]->getDouble("PLATE0")*Gaudi::Units::cm;
286  gapNumber[idepth] = (int) (*hecLongitudinalBlock)[idepth]->getDouble("BLMOD");
287  }
288 
289  for (int ikapton=0; ikapton < 3; ++ikapton)
290  {
291  std::ostringstream A0STR;
292  A0STR << "_" << ikapton;
293  const std::string A0 = A0STR.str();
294  kaptonPosition[ikapton] = (*hadronicEndcap)[0]->getDouble("KPTPOS"+A0)*Gaudi::Units::cm;
295  kaptonWidth[ikapton] = (*hadronicEndcap)[0]->getDouble("KPTWID"+A0)*Gaudi::Units::cm;
296  }
297 
298  for (int itie=0; itie < 4; ++itie)
299  {
300  std::ostringstream A0STR;
301  A0STR << "_" << itie;
302  const std::string A0 = A0STR.str();
303  tieRodPositionX[itie] = (*hadronicEndcap)[0]->getDouble("RODPOSX"+A0)*Gaudi::Units::cm;
304  tieRodPositionY[itie] = (*hadronicEndcap)[0]->getDouble("RODPOSR"+A0)*Gaudi::Units::cm;
305  }
306 
307  for (int i=0; i < 2; ++i)
308  {
309  std::ostringstream A0STR;
310  A0STR << "_" << i;
311  const std::string A0 = A0STR.str();
312  tieRodDiameter[i] = (*hadronicEndcap)[0]->getDouble("RODDIM"+A0)*Gaudi::Units::cm;
313  spacerDiameter[i] = (*hadronicEndcap)[0]->getDouble("SPCDIM"+A0)*Gaudi::Units::cm;
314  }
315 
316 
317  double frontAbsThickness = (*hadronicEndcap)[0]->getDouble("PLATE_0")*Gaudi::Units::cm;
318  double rearAbsThickness = (*hadronicEndcap)[0]->getDouble("PLATE_1")*Gaudi::Units::cm;
319 
320  // Radial dimensions and z-plane locations
321  double zCoordinate[] = {0.0*Gaudi::Units::cm, depthSize[0], depthSize[0], 816.51*Gaudi::Units::mm, 816.51*Gaudi::Units::mm, 1350.*Gaudi::Units::mm };
322  double innerRadius[] = {moduleRinner1,moduleRinner1,
323  moduleRinner2,moduleRinner2,moduleRinner2,moduleRinner2,};
324 
325  double absorberPositionZ [5];
326  //double slicePositionZ [5];
327  int sliceCopyNo[]={0,0,0,0,0};
328  for(int i=0; i<depthNumber; i++) // Testbeam: Front Module: i=0,1,2 Rear Module: i=3,4
329  {
330  if (i<3) absorberPositionZ[i]=firstAbsorber[i]+ gapSize+ frontAbsThickness/2.0 -depthSize[i]/2.0;
331  if (i>2) absorberPositionZ[i]=firstAbsorber[i]+ gapSize+ rearAbsThickness/2.0 -depthSize[i]/2.0;
332  //slicePositionZ[i]=firstAbsorber[i]+ gapSize/2.0 -depthSize[i]/2.0;
333 
334  if (i>0) sliceCopyNo[i] += sliceCopyNo[i-1]+gapNumber[i-1];
335  }
336 
337 
338 
339 
340  // And here come the important names...:
341  std::string hecFrontName = "LAr::HEC::LiquidArgon";
342  std::string hecRearName = "LAr::HEC::LiquidArgon";
343 
344  std::string frontmoduleName = "LAr::HEC::Module";
345  std::string rearmoduleName = "LAr::HEC::Module";
346 
347  std::string depthFrontName = frontmoduleName + "::Depth";
348  std::string depthRearName = rearmoduleName + "::Depth";
349  std::string sliceFrontName = depthFrontName + "::Slice";
350  std::string sliceRearName = depthRearName + "::Slice";
351  std::string absorberFrontName = depthFrontName + "::Absorber";
352  std::string absorberRearName = depthRearName + "::Absorber";
353  std::string firstFrontAbsorberName= depthFrontName + "::FirstFrontAbsorber";
354  std::string firstRearAbsorberName = depthRearName + "::FirstRearAbsorber";
355  std::string electrodeFrontName = sliceFrontName + "::Electrode";
356  std::string electrodeRearName = sliceRearName + "::Electrode";
357  std::string copperFrontName = electrodeFrontName + "::Copper";
358  std::string copperRearName = electrodeRearName + "::Copper";
359  std::string tieRodName = sliceFrontName + "::TieRod";
360  std::string tieRodFrontName = sliceFrontName + "::TieRod";
361  std::string tieRodRearName = sliceRearName + "::TieRod";
362 
363 
364 
365  log << MSG::DEBUG << " In the H6 2002 HEC Constr. GetEnvelope - Start to assemble HEC " << std::endl;
366 
367 
368  //----------------------------------------------------------------
369  // Front HEC
370  //----------------------------------------------------------------
371 
372  // setting up the overal Front HEC volume:
373 
374  GeoPcon* solidFrontHEC = new GeoPcon( hecPhistart[0], moduleNumberFront*moduleDeltaPhi);
375  for (int i=0; i< numberFrontZplane; i++)
376  {
377  solidFrontHEC->addPlane(zCoordinate[i],innerRadius[i], moduleRouter);
378  }
379  const GeoLogVol* logicFrontHEC = new GeoLogVol(hecFrontName, solidFrontHEC , LAr);
380  GeoIntrusivePtr<GeoPhysVol> physiFrontHEC = new GeoPhysVol(logicFrontHEC);
381  m_h6Phys->add(physiFrontHEC);
382 
383 
384  //----------------------------------------------------------------
385  // Rear HEC
386  //----------------------------------------------------------------
387 
388  // setting up the overal Rear HEC volume:
389 
390  GeoPcon* solidRearHEC = new GeoPcon( hecPhistart[1], moduleNumberRear*moduleDeltaPhi);
391  for (int i=numberFrontZplane; i< numberZplane; i++)
392  {
393  solidRearHEC->addPlane(zCoordinate[i],innerRadius[i], moduleRouter);
394  }
395 
396  const GeoLogVol* logicRearHEC = new GeoLogVol(hecRearName, solidRearHEC , LAr);
397  GeoIntrusivePtr<GeoPhysVol> physiRearHEC = new GeoPhysVol(logicRearHEC);
398  m_h6Phys->add(physiRearHEC);
399 
400 
401 
402  // Define the generic Front and Rear modules.
403 
404  //----------------------------------------------------------------
405  // HEC FrontModule
406  //----------------------------------------------------------------
407  // FrontModule
408 
409  GeoPcon* solidFrontModule = new GeoPcon(modulePhistart[0], moduleDeltaPhi);
410 
411  for (int i=0; i< numberFrontZplane; i++)
412  {
413  solidFrontModule->addPlane(zCoordinate[i],innerRadius[i], moduleRouter);
414  }
415  const GeoLogVol* logicFrontModule = new GeoLogVol(frontmoduleName, solidFrontModule , LAr);
416  GeoIntrusivePtr<GeoPhysVol> physiFrontModule = new GeoPhysVol(logicFrontModule);
417 
418  //----------------------------------------------------------------
419  // HEC RearModule
420  //----------------------------------------------------------------
421 
422  GeoPcon* solidRearModule = new GeoPcon(modulePhistart[0], moduleDeltaPhi);
423  for (int i=numberFrontZplane; i< numberZplane; i++)
424  {
425  double tempZ=zCoordinate[i];
426  if (i==4) (tempZ = tempZ + betweenWheel) ; // start the rear module after the inter-wheel gap.
427  solidRearModule->addPlane(tempZ, innerRadius[i], moduleRouter);
428  }
429  const GeoLogVol* logicRearModule = new GeoLogVol(rearmoduleName, solidRearModule , LAr);
430  GeoIntrusivePtr<GeoPhysVol> physiRearModule = new GeoPhysVol(logicRearModule);
431 
432 
433 
434  // At this point we have a physiFrontHEC and a physiRearHEC
435  // as well as a physiFrontModule and a physiRearModule ..............................
436 
437  // Now "multiply" the modules and insert them into the LAr HEC volumes
438 
439  //----------------------------------------------------------------
440  // Place FrontModules into FrontHEC wheel and RearModule into RearHEC wheel
441  //----------------------------------------------------------------
442  GeoGenfun::Variable Index;
443  GeoGenfun::GENFUNCTION ModuleRotationAngle = -moduleDeltaPhi + moduleDeltaPhi*Index;
444  GeoXF::TRANSFUNCTION tf = GeoXF::Pow(GeoTrf::RotateZ3D(1.0),ModuleRotationAngle);
445 
446 
447  GeoSerialIdentifier *sIF = new GeoSerialIdentifier(1);
448  GeoSerialTransformer *sTF = new GeoSerialTransformer (physiFrontModule,&tf, moduleNumberFront);
449  physiFrontHEC->add(sIF);
450  physiFrontHEC->add(sTF);
451 
452  GeoGenfun::GENFUNCTION ModuleRotationAngleR = -moduleDeltaPhi/2. + moduleDeltaPhi*Index;
453  GeoXF::TRANSFUNCTION tr = GeoXF::Pow(GeoTrf::RotateZ3D(1.0),ModuleRotationAngleR);
454 
455  GeoSerialIdentifier *sIR = new GeoSerialIdentifier(2);
456  GeoSerialTransformer *sTR = new GeoSerialTransformer (physiRearModule,&tr, moduleNumberRear);
457  physiRearHEC->add(sIR);
458  physiRearHEC->add(sTR);
459 
460 
461  //----------------------------------------------------------------
462  // Sensitive slicegap - Front
463  //----------------------------------------------------------------
464  for(int islice=0; islice<2; islice++)
465  {
466  if (islice==0)
467  {solidSlice[islice] = new GeoTubs(moduleRinner1,moduleRouter,gapSize/2.,
468  modulePhistart[0],moduleDeltaPhi); }
469  else
470  {solidSlice[islice] = new GeoTubs(moduleRinner2,moduleRouter,gapSize/2.,
471  modulePhistart[0],moduleDeltaPhi); }
472  logiSlice[islice] = new GeoLogVol(sliceFrontName, solidSlice[islice], LAr);
473  physiSlice[islice] = new GeoPhysVol(logiSlice[islice]);
474  }
475 
476  //----------------------------------------------------------------
477  // Sensitive slicegap - Rear
478  //----------------------------------------------------------------
479  for(int islice=2; islice<3; islice++)
480  {
481  solidSlice[islice] = new GeoTubs(moduleRinner2,moduleRouter,gapSize/2.,
482  modulePhistart[0],moduleDeltaPhi);
483  logiSlice[islice] = new GeoLogVol(sliceRearName, solidSlice[islice], LAr);
484  physiSlice[islice] = new GeoPhysVol(logiSlice[islice]);
485  }
486 
487 
488  //----------------------------------------------------------------
489  // Absorbers , the inner and outer Radius are smaller by radialShift
490  // but positionned in the center of depth. this alows
491  // to have 2 Gaudi::Units::mm gap between the copper plates of neighbor FrontModules
492  //----------------------------------------------------------------
493 
494  // Two different Absorbers for the front depths:
495  solidFrontAbsorber[0] = new GeoTubs(moduleRinner1-radialShift,moduleRouter-radialShift,frontAbsThickness/2.,
496  modulePhistart[0],moduleDeltaPhi);
497  solidFrontAbsorber[1] = new GeoTubs(moduleRinner2-radialShift,moduleRouter-radialShift,frontAbsThickness/2.,
498  modulePhistart[0],moduleDeltaPhi);
499 
500  for (int frontabsorberNo=0;frontabsorberNo<2;frontabsorberNo++)
501  {
502  logiFrontAbsorber[frontabsorberNo] = new GeoLogVol(absorberFrontName,
503  solidFrontAbsorber[frontabsorberNo], Copper);
504  physiFrontAbsorber[frontabsorberNo] = new GeoPhysVol(logiFrontAbsorber[frontabsorberNo]);
505  }
506 
507  // there is only one rearabsorber for the two rear depths:
508  solidRearAbsorber = new GeoTubs(moduleRinner2-radialShift,moduleRouter-radialShift,rearAbsThickness/2.,
509  modulePhistart[0],moduleDeltaPhi);
510  logiRearAbsorber = new GeoLogVol(absorberRearName,solidRearAbsorber, Copper);
511  physiRearAbsorber = new GeoPhysVol(logiRearAbsorber);
512 
513 
514  //----------------------------------------------------------------
515  // First Absorbers at the "entrance" of each wheel:
516  //----------------------------------------------------------------
517 
518  solidFirstAbsorber[0] = new GeoTubs(moduleRinner1-radialShift,moduleRouter-radialShift,
519  firstAbsorber[0]/2., modulePhistart[0],moduleDeltaPhi);
520  logiFirstAbsorber[0] = new GeoLogVol(firstFrontAbsorberName, solidFirstAbsorber[0], Copper);
521  physiFirstAbsorber[0] = new GeoPhysVol(logiFirstAbsorber[0]);
522  physiFirstAbsorber[0]->add(new GeoIdentifierTag(50));
523 
524 
525  solidFirstAbsorber[1] = new GeoTubs(moduleRinner2-radialShift,moduleRouter-radialShift,
526  firstAbsorber[3]/2., modulePhistart[0],moduleDeltaPhi);
527  logiFirstAbsorber[1] = new GeoLogVol(firstRearAbsorberName, solidFirstAbsorber[1], Copper);
528  physiFirstAbsorber[1] = new GeoPhysVol(logiFirstAbsorber[1]);
529  physiFirstAbsorber[1]->add(new GeoIdentifierTag(51));
530 
531 
532 
533  //----------------------------------------------------------------
534  // Place 3 depths into 1 generic FrontModule of HEC
535  //----------------------------------------------------------------
536 
537  double depthPositionZ = 0.; // initialized here - it increases as we work through the depths
538 
539 
540  for(int idepth=0; idepth<3; idepth++) // Front Module: idepth=0,1,2
541  {
542  if (idepth==0)
543  {solidDepth[idepth]=new GeoTubs(moduleRinner1,moduleRouter,depthSize[idepth]/2.,
544  modulePhistart[0],moduleDeltaPhi);}
545  else
546  {solidDepth[idepth]=new GeoTubs(moduleRinner2,moduleRouter,depthSize[idepth]/2.,
547  modulePhistart[0],moduleDeltaPhi);}
548 
549  logiDepth[idepth] =new GeoLogVol(depthFrontName, solidDepth[idepth], LAr);
550  physiDepth[idepth]=new GeoPhysVol(logiDepth[idepth]);
551 
552 
553  // Placement of the actual depth:
554  depthPositionZ +=depthSize[idepth]/2.;
555  physiFrontModule->add(new GeoIdentifierTag(100+idepth));
556  physiFrontModule->add(new GeoTransform(GeoTrf::Translate3D(0,0,depthPositionZ)));
557  physiFrontModule->add(physiDepth[idepth]);
558 
559 
560 
561 
562  // Now put absorbers into the depth:
563  depthPositionZ +=depthSize[idepth]/2.;
564  if (idepth==2) depthPositionZ +=betweenWheel;
565 
566 
567 
568  // Position of 8 sensitive gaps and absorbers in 3 depths of a Front Module
569  int islice = 1;
570  int frontabsorberNo = 1;
571  if(idepth==0) { islice=0; frontabsorberNo=0; }
572  else { islice=2; frontabsorberNo=1; }
573 
574  double slicePositionZ=firstAbsorber[idepth]+ gapSize/2.0 -depthSize[idepth]/2.0;
575  GeoGenfun::Variable Index;
576  GeoXF::TRANSFUNCTION TS = GeoXF::Pow(GeoTrf::TranslateZ3D(1.0),slicePositionZ + (frontAbsThickness+gapSize)*Index);
577  GeoXF::TRANSFUNCTION TA = GeoTrf::TranslateY3D(-radialShift)*GeoXF::Pow(GeoTrf::TranslateZ3D(1.0),
578  absorberPositionZ[idepth] + (frontAbsThickness+gapSize)*Index);
579  GeoSerialIdentifier *sI = new GeoSerialIdentifier(sliceCopyNo[idepth]);
580  GeoSerialTransformer *sTS = new GeoSerialTransformer(physiSlice[islice], &TS, gapNumber[idepth]);
581  GeoSerialTransformer *sTA = new GeoSerialTransformer(physiFrontAbsorber[frontabsorberNo],&TA, gapNumber[idepth]);
582  physiDepth[idepth]->add(sI);
583  physiDepth[idepth]->add(sTS);
584  physiDepth[idepth]->add(sI);
585  physiDepth[idepth]->add(sTA);
586 
587  } //for idepth
588 
589 
590  //----------------------------------------------------------------
591  // Place 2 depths into 1 generic Rear Module of HEC
592  //----------------------------------------------------------------
593 
594  for(int idepth=3; idepth<5; idepth++)
595  {
596  depthPositionZ +=depthSize[idepth]/2.;
597 
598  // Now depth
599  solidDepth[idepth] = new GeoTubs(moduleRinner2,moduleRouter,depthSize[idepth]/2.,
600  modulePhistart[0],moduleDeltaPhi);
601  logiDepth[idepth] = new GeoLogVol(depthRearName, solidDepth[idepth], LAr);
602  physiDepth[idepth] = new GeoPhysVol(logiDepth[idepth]);
603 
604  physiRearModule->add(new GeoIdentifierTag(100+idepth));
605  physiRearModule->add(new GeoTransform(GeoTrf::Translate3D(0,0,depthPositionZ)));
606  physiRearModule->add(physiDepth[idepth]);
607 
608 
609  depthPositionZ +=depthSize[idepth]/2.;
610 
611 
612  // Position 4 sensitive gaps and rear absorbers in 2 depths of a Rear Module:
613  int islice=2;
614  double slicePositionZ=firstAbsorber[idepth]+ gapSize/2.0 -depthSize[idepth]/2.0;
615  GeoGenfun::Variable Index;
616  GeoXF::TRANSFUNCTION TS = GeoXF::Pow(GeoTrf::TranslateZ3D(1.0),slicePositionZ + (rearAbsThickness+gapSize)*Index);
617  GeoXF::TRANSFUNCTION TA = GeoTrf::TranslateY3D(-radialShift)*GeoXF::Pow(GeoTrf::TranslateZ3D(1.0),
618  absorberPositionZ[idepth] + (rearAbsThickness+gapSize)*Index);
619  GeoSerialIdentifier *sI = new GeoSerialIdentifier(sliceCopyNo[idepth]);
620  GeoSerialTransformer *sTS = new GeoSerialTransformer(physiSlice[islice], &TS, gapNumber[idepth]);
621  GeoSerialTransformer *sTA = new GeoSerialTransformer(physiRearAbsorber,&TA, gapNumber[idepth]);
622  physiDepth[idepth]->add(sI);
623  physiDepth[idepth]->add(sTS);
624  physiDepth[idepth]->add(sI);
625  physiDepth[idepth]->add(sTA);
626 
627  } //for idepth
628 
629 
630 
631  // Add the 1/2 thickness front plates to the two modules:
632 
633  double firstAbsorberPositionZ = firstAbsorber[0]/2.- depthSize[0]/2.0;
634  physiDepth[0]->add(new GeoIdentifierTag(50));
635  physiDepth[0]->add(new GeoTransform(GeoTrf::Translate3D(0,-radialShift,firstAbsorberPositionZ)));
636  physiDepth[0]->add(physiFirstAbsorber[0]);
637 
638 
639  firstAbsorberPositionZ = firstAbsorber[3]/2.- depthSize[3]/2.0;
640  physiDepth[3]->add(new GeoIdentifierTag(51));
641  physiDepth[3]->add(new GeoTransform(GeoTrf::Translate3D(0,-radialShift,firstAbsorberPositionZ)));
642  physiDepth[3]->add(physiFirstAbsorber[1]);
643 
644 
645 
646  //----------------------------------------------------------------
647  // Electronic boards of Front/Rear Slice
648  // 0, 1: front; 2: rear
649  //----------------------------------------------------------------
650 
651  for(int islice=0; islice<3; islice++)
652  {
653  int indexKapton=1;
654  if (islice==0)
655  {
656  solidPadBoard = new GeoTubs(moduleRinner1,moduleRouter,copperPad/2.,
657  modulePhistart[0],moduleDeltaPhi);
658  solidEstBoard = new GeoTubs(moduleRinner1,moduleRouter,(kaptonWidth[indexKapton]/2.+kaptonWidth[0]),
659  modulePhistart[0],moduleDeltaPhi);
660  }
661  else
662  {
663  solidPadBoard = new GeoTubs(moduleRinner2,moduleRouter,copperPad/2.,
664  modulePhistart[0],moduleDeltaPhi);
665  solidEstBoard = new GeoTubs(moduleRinner2,moduleRouter,(kaptonWidth[indexKapton]/2.+kaptonWidth[0]),
666  modulePhistart[0],moduleDeltaPhi);
667  }
668 
669  std::string copperName, electrodeName;
670  if (islice == 2) {
671  // Rear
672  copperName = copperRearName;
673  electrodeName = electrodeRearName;
674  }
675  else {
676  // Front
677  copperName = copperFrontName;
678  electrodeName = electrodeFrontName;
679  }
680  logiPadBoard = new GeoLogVol(copperName, solidPadBoard, Copper);
681  logiEstBoard = new GeoLogVol(electrodeName, solidEstBoard, Kapton );
682 
683 
684  double kaptonPositionZ = kaptonPosition[indexKapton]-gapSize/2.;
685 
686  physiEstBoard = new GeoPhysVol(logiEstBoard);
687  physiSlice[islice]->add(new GeoIdentifierTag(indexKapton));
688  physiSlice[islice]->add(new GeoTransform(GeoTrf::Translate3D(0,0,kaptonPositionZ)));
689  physiSlice[islice]->add(physiEstBoard);
690 
691 
692  physiPadBoard = new GeoPhysVol(logiPadBoard);
693  physiEstBoard->add(new GeoIdentifierTag(indexKapton));
694  physiEstBoard->add(new GeoTransform(GeoTrf::Translate3D(0,0,0)));
695  physiEstBoard->add(physiPadBoard);
696 
697  }//for islice
698 
699 
700  //----------------------------------------------------------------
701  // Tie rods in Slice
702  //----------------------------------------------------------------
703 
704  // double rodSize = 0.85*Gaudi::Units::cm;
705  for (int iwheel=0; iwheel<2; iwheel++)
706  {
707  solidTieRod[iwheel] = new GeoTubs(0.*Gaudi::Units::cm,spacerDiameter[iwheel]/2.,rodSize/2., 0.*Gaudi::Units::deg,360.*Gaudi::Units::deg);
708  logiTieRod[iwheel] = new GeoLogVol(tieRodName, solidTieRod[iwheel], Iron);
709  }
710 
711  for(int islice=0; islice<3; islice++) { // loop over the 3 longitdinal depths
712  int numberTie=0;
713  if(islice==2) numberTie=1; // for the rear module
714 
715  int indexRod;
716  for(indexRod=1; indexRod<4; indexRod++) { // place all 7 rods: 3 pairs, one single
717  for(int iz=0;iz<2;iz++){
718 
719  physiTieRod[numberTie] = new GeoPhysVol(logiTieRod[numberTie]);
720  physiSlice[islice]->add(new GeoIdentifierTag(indexRod));
721  physiSlice[islice]->add(new GeoTransform(GeoTrf::Translate3D(tieRodPositionX[indexRod],
722  -tieRodPositionY[indexRod],ztie[iz])));
723  physiSlice[islice]->add(physiTieRod[numberTie]);
724 
725 
726  physiTieRod[numberTie] = new GeoPhysVol(logiTieRod[numberTie]);
727  physiSlice[islice]->add(new GeoIdentifierTag(indexRod));
728  physiSlice[islice]->add(new GeoTransform(GeoTrf::Translate3D(-tieRodPositionX[indexRod],
729  -tieRodPositionY[indexRod],ztie[iz])));
730  physiSlice[islice]->add(physiTieRod[numberTie]);
731 
732  }//for iz (dealt with the rods that come in pairs)
733  } // for indexRod
734  for( int iz1=0;iz1<2;iz1++)
735  {
736 
737  physiTieRod[numberTie] = new GeoPhysVol(logiTieRod[numberTie]);
738  physiSlice[islice]->add(new GeoIdentifierTag(indexRod));
739  physiSlice[islice]->add(new GeoTransform(GeoTrf::Translate3D(tieRodPositionX[0],-tieRodPositionY[0],ztie[iz1])));
740  physiSlice[islice]->add(physiTieRod[numberTie]);
741 
742  }//for iz1 (this dealt with the one last un-paired rod at the module's narrow end)
743  } // for islice
744 
745  //----------------------------------------------------------------
746  // Tie rods in Absorbers
747  //----------------------------------------------------------------
748  solidAbsorberTieRod[0] = new GeoTubs(0.*Gaudi::Units::cm,tieRodDiameter[0]/2.,frontAbsThickness/2.,0.*Gaudi::Units::deg,360.*Gaudi::Units::deg);
749  solidAbsorberTieRod[1] = new GeoTubs(0.*Gaudi::Units::cm,tieRodDiameter[1]/2.,rearAbsThickness/2.,0.*Gaudi::Units::deg,360.*Gaudi::Units::deg);
750  logiAbsorberTieRod[0] = new GeoLogVol(tieRodName,solidAbsorberTieRod[0],Iron); //,0,0,0);
751  logiAbsorberTieRod[1] = new GeoLogVol(tieRodName,solidAbsorberTieRod[1],Iron); //,0,0,0);
752  solidAbsorberTieRodRear[0] = new GeoTubs(0.*Gaudi::Units::cm,tieRodDiameter[0]/2.,frontAbsThickness/2.,0.*Gaudi::Units::deg,360.*Gaudi::Units::deg);
753  solidAbsorberTieRodRear[1] = new GeoTubs(0.*Gaudi::Units::cm,tieRodDiameter[1]/2.,rearAbsThickness/2.,0.*Gaudi::Units::deg,360.*Gaudi::Units::deg);
754  logiAbsorberTieRodRear[0] = new GeoLogVol(tieRodRearName,solidAbsorberTieRodRear[0],Iron); //,0,0,0);
755  logiAbsorberTieRodRear[1] = new GeoLogVol(tieRodRearName,solidAbsorberTieRodRear[1],Iron); //,0,0,0);
756 
757 
758  for(int islice=0; islice<2; islice++)
759  {
760  int indexR=0;
761  //if(islice>1) indexR=1;
762  int indexRod;
763  for(indexRod=1; indexRod<4; indexRod++)
764  {
765  physiAbsorberTieRod[indexR] = new GeoPhysVol(logiAbsorberTieRod[indexR]);
766  physiFrontAbsorber[islice]->add(new GeoIdentifierTag(indexRod));
767  physiFrontAbsorber[islice]->add(new GeoTransform(GeoTrf::Translate3D(tieRodPositionX[indexRod],
768  -(tieRodPositionY[indexRod]-radialShift), 0)));
769  physiFrontAbsorber[islice]->add(physiAbsorberTieRod[indexR]);
770  physiAbsorberTieRod[indexR] = new GeoPhysVol(logiAbsorberTieRod[indexR]);
771  physiFrontAbsorber[islice]->add(new GeoIdentifierTag(indexRod));
772  physiFrontAbsorber[islice]->add(new GeoTransform(GeoTrf::Translate3D(-tieRodPositionX[indexRod],
773  -(tieRodPositionY[indexRod]-radialShift), 0)));
774  physiFrontAbsorber[islice]->add(physiAbsorberTieRod[indexR]);
775  }
776  physiAbsorberTieRod[indexR] = new GeoPhysVol(logiAbsorberTieRod[indexR]);
777  physiFrontAbsorber[islice]->add(new GeoIdentifierTag(indexRod));
778  physiFrontAbsorber[islice]->add(new GeoTransform(GeoTrf::Translate3D(tieRodPositionX[0],
779  -(tieRodPositionY[0]-radialShift),0)));
780 
781 
782  physiFrontAbsorber[islice]->add(physiAbsorberTieRod[indexR]);
783 
784  }
785 
786 
787  int indexRod=1;
788  for(indexRod=1; indexRod<4; indexRod++)
789  {
790  physiAbsorberTieRodRear[1] = new GeoPhysVol(logiAbsorberTieRodRear[1]);
791  physiRearAbsorber->add(new GeoIdentifierTag(indexRod));
792  physiRearAbsorber->add(new GeoTransform(GeoTrf::Translate3D(tieRodPositionX[indexRod],
793  -(tieRodPositionY[indexRod]-radialShift), 0)));
794  physiRearAbsorber->add(physiAbsorberTieRodRear[1]);
795 
796  physiAbsorberTieRodRear[1] = new GeoPhysVol(logiAbsorberTieRodRear[1]);
797  physiRearAbsorber->add(new GeoIdentifierTag(indexRod));
798  physiRearAbsorber->add(new GeoTransform(GeoTrf::Translate3D(-tieRodPositionX[indexRod],
799  -(tieRodPositionY[indexRod]-radialShift), 0)));
800 
801 
802  physiRearAbsorber->add(physiAbsorberTieRodRear[1]);
803  }
804 
805 
806  //now the single tie rod at the narrow end:
807  physiAbsorberTieRodRear[1] = new GeoPhysVol(logiAbsorberTieRodRear[1]);
808  physiRearAbsorber->add(new GeoIdentifierTag(indexRod));
809  physiRearAbsorber->add(new GeoTransform(GeoTrf::Translate3D(tieRodPositionX[0],
810  -(tieRodPositionY[0]-radialShift),0)));
811 
812 
813  physiRearAbsorber->add(physiAbsorberTieRodRear[1]);
814 
815 
816 
817 
818  return m_h6Phys;
819 
820 }

◆ operator=()

HECConstructionH62002& LArGeo::HECConstructionH62002::operator= ( const HECConstructionH62002 )
private

Member Data Documentation

◆ m_h6Phys

GeoIntrusivePtr<GeoFullPhysVol> LArGeo::HECConstructionH62002::m_h6Phys
private

Definition at line 46 of file HECConstructionH62002.h.


The documentation for this class was generated from the following files:
JTC::TS
TS
Definition: IJetTileCorrectionTool.h:27
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.
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
LAr
Definition: LArVolumeBuilder.h:36
LArGeo::HECConstructionH62002::m_h6Phys
GeoIntrusivePtr< GeoFullPhysVol > m_h6Phys
Definition: HECConstructionH62002.h:46
M_PI
#define M_PI
Definition: ActiveFraction.h:11
deg
#define deg
Definition: SbPolyhedron.cxx:17
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
StoredPhysVol
Definition: StoredPhysVol.h:27
cm
const double cm
Definition: Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/tools/FCAL_ChannelMap.cxx:25
Index
IndexedConstituentUserInfo::Index Index
Definition: IndexedConstituentUserInfo.cxx:12
StdJOSetup.msgSvc
msgSvc
Provide convenience handles for various services.
Definition: StdJOSetup.py:36
lumiFormat.i
int i
Definition: lumiFormat.py:92
IRDBAccessSvc
IRDBAccessSvc is an abstract interface to the athena service that provides the following functionalit...
Definition: IRDBAccessSvc.h:45
Atlas.StoreGateSvc
StoreGateSvc
Definition: Atlas.UnixStandardJob.py:25
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
DecodeVersionKey
This is a helper class to query the version tags from GeoModelSvc and determine the appropriate tag a...
Definition: DecodeVersionKey.h:18
IRDBRecordset_ptr
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition: IRDBAccessSvc.h:25
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
DEBUG
#define DEBUG
Definition: page_access.h:11
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
StoredMaterialManager::getMaterial
virtual const GeoMaterial * getMaterial(const std::string &name)=0
StoredMaterialManager
This class holds one or more material managers and makes them storeable, under StoreGate.
Definition: StoredMaterialManager.h:28
merge.status
status
Definition: merge.py:17
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:24
jet::CombMassComp::TA
@ TA
Definition: UncertaintyEnum.h:198