ATLAS Offline Software
EMECModuleConstruction.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 // EMECModuleConstruction
6 
7 // Revision history:
8 
9 // LArEMECModuleConstruction:
10 
11 // 08.08.02 copied from LArEMECConstruction
12 // 09-May-2001 WGS: Copied from Andrei Soukharev's EMECDetectorConstruction.
13 // 09-May-2001 WGS: Put in the LAr parent volumes for the endcaps.
14 // 09-Jan-2002 WGS: The LAr parent volume now comes from the calling routine.
15 // Any shifts in z are handled in the parent volume.
16 
17 
18 // EMECModuleConstruction:
19 // 08-Dec-2005 V.N. Copied from LArEMECModuleConstruction and EMECConstruction
20 // 18-Feb-2006 V.N Put options to select inne and outer wheels separatly.
21 
22 
25 
26 
27 #include "GeoModelKernel/GeoUnidentifiedShape.h"
28 #include "GeoModelKernel/GeoElement.h"
29 #include "GeoModelKernel/GeoMaterial.h"
30 #include "GeoModelKernel/GeoFullPhysVol.h"
31 #include "GeoModelKernel/GeoPhysVol.h"
32 #include "GeoModelKernel/GeoVPhysVol.h"
33 #include "GeoModelKernel/GeoLogVol.h"
34 #include "GeoModelKernel/GeoPcon.h"
35 #include "GeoModelKernel/GeoCons.h"
36 #include "GeoModelKernel/GeoTubs.h"
37 #include "GeoModelKernel/GeoTube.h"
38 #include "GeoModelKernel/GeoNameTag.h"
39 #include "GeoModelKernel/GeoTransform.h"
40 #include "GeoModelKernel/GeoAlignableTransform.h"
41 #include "GeoModelKernel/GeoIdentifierTag.h"
42 #include "GeoModelKernel/GeoDefinitions.h"
43 #include "GeoModelKernel/Units.h"
46 #include "StoreGate/StoreGateSvc.h"
47 #include "GaudiKernel/MsgStream.h"
48 #include "GaudiKernel/Bootstrap.h"
49 #include "GaudiKernel/IService.h"
50 #include "GaudiKernel/ISvcLocator.h"
51 #include "GaudiKernel/SystemOfUnits.h"
52 
53 #include <string>
54 #include <cmath>
55 #include <iostream>
56 
57 static const bool DEBUG_EMEC = false;
58 
60 
61  m_isTB = tbb;
62  m_isInnerWheel = iwb;
63  m_isOuterWheel = owb;
64 
65 /*
66  for testbeams setups module could be positioned in arbitrary place,
67  so envelope is created is such a way, so that the front face
68  of active region is at z = 0
69 */
70 
71 }
72 
74 
75 GeoIntrusivePtr<GeoVFullPhysVol> LArGeo::EMECModuleConstruction::GetEnvelope()
76 {
77  SmartIF<StoreGateSvc> detStore{Gaudi::svcLocator()->service("DetectorStore")};
78  if(!detStore.isValid()) {
79  throw std::runtime_error("Error in EndcapCryostatConstruction, cannot access DetectorStore");
80  }
81  StoredMaterialManager* materialManager = nullptr;
82  if (StatusCode::SUCCESS != detStore->retrieve(materialManager, std::string("MATERIALS"))) return nullptr;
83 
84 
86  // Define materials
87  // Note added 03-Jul-2003 WGS:
88  // All this has to be replaced by the GeoModel materials manager,
89  // but leave it as-is for now.
91 
92  std::string name,symbol;
93 
94  double density;
95  double m1,m2,m3;
96  double Totalthick,/*Totalthicko,Totalthicki,*/Totalthicke;
97  double Tgpb,Tgfe,Tggl,Thpb,Thfe,Thgl,Thcu,Thka,ThGten;
98  double FracH,FracO,FracC,FracN,FracAr;
99  double FracGten,Fracpb,Fracfe,Fracgl,Fraccu,Fracka;
100  double aH,aO,aC,aN,aAr;
101 
102  const GeoElement* H=materialManager->getElement("Hydrogen");
103  const GeoElement* C=materialManager->getElement("Carbon");
104  const GeoElement* N=materialManager->getElement("Nitrogen");
105  const GeoElement* O=materialManager->getElement("Oxygen");
106  const GeoElement* Al=materialManager->getElement("Aluminium");
107  const GeoElement* Ar=materialManager->getElement("Argon");
108  const GeoElement* Fe=materialManager->getElement("Iron");
109  const GeoElement* Cu=materialManager->getElement("Copper");
110  const GeoElement* Pb=materialManager->getElement("Lead");
111 
112  //LAr
113 
114  GeoMaterial* LAr = new GeoMaterial(name="LiquidArgon", density=1.396*GeoModelKernelUnits::g/Gaudi::Units::cm3);
115  LAr->add(Ar,1.);
116  LAr->lock();
117 
118  //Alu
119 
120  GeoMaterial* Alu = new GeoMaterial(name="Alu", density=2.7*GeoModelKernelUnits::g/Gaudi::Units::cm3);
121  Alu->add(Al,1.);
122  Alu->lock();
123 
124  //Iron
125 
126  GeoMaterial* Iron = new GeoMaterial(name="Iron", density=7.87*GeoModelKernelUnits::g/Gaudi::Units::cm3);
127  Iron->add(Fe,1.);
128  Iron->lock();
129 
130  //Copper
131 
132  GeoMaterial* Copper = new GeoMaterial(name="Copper", density=8.96*GeoModelKernelUnits::g/Gaudi::Units::cm3);
133  Copper->add(Cu,1.);
134  Copper->lock();
135 
136  //Lead
137 
138  GeoMaterial* Lead = new GeoMaterial(name="Lead", density=11.35*GeoModelKernelUnits::g/Gaudi::Units::cm3);
139  Lead->add(Pb,1.);
140  Lead->lock();
141 
142  // Air , at 20 deg C, 1 atm density=1.2931*mg/cm3
143 
144  GeoMaterial* Air=new GeoMaterial(name="Air", density=1.290*Gaudi::Units::mg/Gaudi::Units::cm3);
145  Air->add(N, .8);
146  Air->add(O, .2);
147  Air->lock();
148 
149  //Prepreg glue for absorbers, composition to be checked!
150  //ref:STR.CAL.01.CRB.6,(23-Jan-2003,J.T.)
151 
152  GeoMaterial* Glue=new GeoMaterial(name="Glue", density=1.8*GeoModelKernelUnits::g/Gaudi::Units::cm3);
153  aH=8.*H->getA();
154  aO=2.*O->getA();
155  aC=5.*C->getA();
156  double Atot=aH+aO+aC;
157  {
158  const double inv_Atot = 1. / Atot;
159  FracH=aH*inv_Atot;
160  FracO=aO*inv_Atot;
161  FracC=aC*inv_Atot;
162  }
163  Glue->add(H,FracH);
164  Glue->add(O,FracO);
165  Glue->add(C,FracC);
166  Glue->lock();
167 
168  //PermaliE730 for Front middle ring, composition to be checked!
169  // ref.: STR.CAL.01.CRB.6,(23-Jan-2003,J.T.)
170 
171  GeoMaterial* PermaliE730=new GeoMaterial(name="PermaliE730",density=1.83*GeoModelKernelUnits::g/Gaudi::Units::cm3);
172  aH=8.*H->getA();
173  aO=2.*O->getA();
174  aC=5.*C->getA();
175  Atot=aH+aO+aC;
176  {
177  const double inv_Atot = 1. / Atot;
178  FracH=aH*inv_Atot;
179  FracO=aO*inv_Atot;
180  FracC=aC*inv_Atot;
181  }
182  PermaliE730->add(H,FracH);
183  PermaliE730->add(O,FracO);
184  PermaliE730->add(C,FracC);
185  PermaliE730->lock();
186 
187  // Gten ( C8 H14 O4 ), alias glass epoxy for long.&transv.bars
188 
189  GeoMaterial* Gten = new GeoMaterial(name="Gten", density=1.8*GeoModelKernelUnits::g/Gaudi::Units::cm3);
190  aH=14.*H->getA();
191  aO= 4.*O->getA();
192  aC= 8.*C->getA();
193  Atot=aH+aO+aC;
194  {
195  const double inv_Atot = 1. / Atot;
196  FracH=aH*inv_Atot;
197  FracO=aO*inv_Atot;
198  FracC=aC*inv_Atot;
199  }
200  Gten->add(H,FracH);
201  Gten->add(O,FracO);
202  Gten->add(C,FracC);
203  Gten->lock();
204 
205  // Kapton 11-Jan-2002 ML from accbgeo.age: the Kapton_E density is 1.46g/cm3
206  // one assumes it is the same as for the Kapton_H -> C22 H10 O5 N2
207 
208  GeoMaterial* Kapton= new GeoMaterial(name="Kapton",density=1.46*GeoModelKernelUnits::g/Gaudi::Units::cm3);
209  aH=10.*H->getA();
210  aO= 5.*O->getA();
211  aC=22.*C->getA();
212  aN= 2.*N->getA();
213  Atot=aH+aO+aC+aN;
214  {
215  const double inv_Atot = 1. / Atot;
216  FracH=aH*inv_Atot;
217  FracO=aO*inv_Atot;
218  FracC=aC*inv_Atot;
219  FracN=aN*inv_Atot;
220  }
221  Kapton->add(H,FracH);
222  Kapton->add(O,FracO);
223  Kapton->add(C,FracC);
224  Kapton->add(N,FracN);
225  Kapton->lock();
226 
227  // THIN absorber: outer wheel
228  // 11-Jan-2002 ML source: endegeo.age and Fig.7-3 of TDR
229  Tggl = 0.3*Gaudi::Units::mm;
230  Tgfe = 0.4*Gaudi::Units::mm;
231  Tgpb = 1.7*Gaudi::Units::mm;
232  Totalthick=Tggl+Tgfe+Tgpb;
233  m1=Tggl*Glue->getDensity();
234  m2=Tgfe*Iron->getDensity();
235  m3=Tgpb*Lead->getDensity();
236  double Totalmass=m1+m2+m3;
237  density=Totalmass*(1./Totalthick);
238  {
239  const double inv_Totalmass = 1. / Totalmass;
240  Fracgl=m1*inv_Totalmass;
241  Fracfe=m2*inv_Totalmass;
242  Fracpb=m3*inv_Totalmass;
243  }
244  GeoMaterial* Thin_abs = new GeoMaterial(name="Thinabs",density);
245  Thin_abs->add(Glue,Fracgl);
246  Thin_abs->add(Iron,Fracfe);
247  Thin_abs->add(Lead,Fracpb);
248  Thin_abs->lock();
249 
250  // THICK absorber: inner wheel
251  // 11-Jan-2002 ML source: endegeo.age and Fig.7-3 of TDR
252  Thgl = 0.3*Gaudi::Units::mm;
253  Thfe = 0.4*Gaudi::Units::mm;
254  Thpb = 2.2*Gaudi::Units::mm;
255  Totalthick=Thgl+Thfe+Thpb;
256  m1=Thgl*Glue->getDensity();
257  m2=Thfe*Iron->getDensity();
258  m3=Thpb*Lead->getDensity();
259  Totalmass=m1+m2+m3;
260  density=Totalmass*(1./Totalthick);
261  {
262  const double inv_Totalmass = 1. / Totalmass;
263  Fracgl=m1*inv_Totalmass;
264  Fracfe=m2*inv_Totalmass;
265  Fracpb=m3*inv_Totalmass;
266  }
267  GeoMaterial* Thick_abs = new GeoMaterial(name="Thickabs",density);
268  Thick_abs->add(Glue,Fracgl);
269  Thick_abs->add(Iron,Fracfe);
270  Thick_abs->add(Lead,Fracpb);
271  Thick_abs->lock();
272 
273  // Electrode, as a mixture Kapton+Cu, 11-Jan-2002 ML
274 
275  Thcu = 0.105*Gaudi::Units::mm;
276  Thka = 0.170*Gaudi::Units::mm; //together with glue J.T.
277  Totalthicke = Thcu+Thka;
278  m1=Thcu*Copper->getDensity();
279  m2=Thka*Kapton->getDensity();
280  Totalmass=m1+m2;
281  density=Totalmass*(1./Totalthicke);
282  {
283  const double inv_Totalmass = 1. / Totalmass;
284  Fraccu=m1*inv_Totalmass;
285  Fracka=m2*inv_Totalmass;
286  }
287  GeoMaterial* Kapton_Cu= new GeoMaterial(name="KaptonC",density);
288  Kapton_Cu->add(Copper,Fraccu);
289  Kapton_Cu->add(Kapton,Fracka);
290  Kapton_Cu->lock();
291 
292  // ELECTRONICS as a mix_molecule CH2Ar made of
293  // CH2 (from polyethylene -CH2- chain)
294  // and Ar (from Liquid Argon)
295  aH =2.*H->getA();
296  aC =1.*C->getA();
297  aAr=1.*Ar->getA();
298  Atot=aH+aC+aAr;
299  {
300  const double inv_Atot = 1. / Atot;
301  FracH =aH*inv_Atot;
302  FracC =aC*inv_Atot;
303  FracAr=aAr*inv_Atot;
304  }
305  GeoMaterial* Elect_LAr= new GeoMaterial(name="Elnics",density=1.28*GeoModelKernelUnits::g/Gaudi::Units::cm3);
306  Elect_LAr->add(H ,FracH);
307  Elect_LAr->add(C ,FracC);
308  Elect_LAr->add(Ar,FracAr);
309  Elect_LAr->lock();
310 
311  GeoMaterial* innerAbsorberMaterial = Thick_abs;
312  GeoMaterial* outerAbsorberMaterial = Thin_abs;
313  GeoMaterial* innerElectrodMaterial = Kapton_Cu;
314  GeoMaterial* outerElectrodMaterial = Kapton_Cu;
315 
316  // G10FeInner for barrette in the inner wheel(J.T.08.01.2003)
317 
318  Thfe =0.4*Gaudi::Units::mm;
319  Thgl =0.3*Gaudi::Units::mm;
320  Thpb =2.2*Gaudi::Units::mm;
321  ThGten=Thpb;
322  Totalthick =Thfe+Thgl+ThGten;
323  //Totalthicki=Totalthick;
324  m1=Thfe *Iron->getDensity();
325  m2=Thgl *Glue->getDensity();
326  m3=ThGten*Gten->getDensity();
327  Totalmass=m1+m2+m3;
328  {
329  const double inv_Totalmass = 1. / Totalmass;
330  Fracfe =m1*inv_Totalmass;
331  Fracgl =m2*inv_Totalmass;
332  FracGten=m3*inv_Totalmass;
333  }
334  density = Totalmass*(1./Totalthick);
335 
336  GeoMaterial* G10FeInner=
337  new GeoMaterial(name="LAr::EMEC::G10FeInner",density);
338  G10FeInner->add(Iron,Fracfe);
339  G10FeInner->add(Glue,Fracgl);
340  G10FeInner->add(Gten,FracGten);
341  G10FeInner->lock();
342 
343  // G10FeOuter for barrette in the outer wheel(J.T.08.01.2003)
344 
345  Thfe =0.4*Gaudi::Units::mm;
346  Thgl =0.3*Gaudi::Units::mm;
347  Thpb =1.7*Gaudi::Units::mm;
348  ThGten=Thpb;
349  Totalthick =Thfe+Thgl+ThGten;
350  //Totalthicko=Totalthick;
351  m1=Thfe *Iron->getDensity();
352  m2=Thgl *Glue->getDensity();
353  m3=ThGten*Gten->getDensity();
354  Totalmass=m1+m2+m3;
355  {
356  const double inv_Totalmass = 1. / Totalmass;
357  Fracfe =m1*inv_Totalmass;
358  Fracgl =m2*inv_Totalmass;
359  FracGten=m3*inv_Totalmass;
360  }
361  density = Totalmass*(1./Totalthick);
362  GeoMaterial* G10FeOuter=
363  new GeoMaterial(name="LAr::EMEC::G10FeOuter",density);
364  G10FeOuter->add(Iron,Fracfe);
365  G10FeOuter->add(Glue,Fracgl);
366  G10FeOuter->add(Gten,FracGten);
367 
368 
370  // Define geometry
372 
373  std::string baseName = "LAr::EMEC";
374 
375  // Define the mother volume for the emec. Everything
376  // else in the emec (wheels,structure, etc.) should be
377  // placed inside here.
378 
379 // J.T************
380 // V.N: From LarWheelSolid, to get bounding polycone. Previoulsy G4 routine. No GeoModel equivalent so far ...
381 //
382 
383  double zWheelFrontFace = 3689.5*Gaudi::Units::mm;
384 
385  double dWRPtoFrontFace = 11.*Gaudi::Units::mm;
386 
387  double dMechFocaltoWRP = 3691. *Gaudi::Units::mm; //=endg_z1*Gaudi::Units::cm
388  //"LArEMECNomLarOrig"
389  double rOuterCutoff = 2034. *Gaudi::Units::mm; //=endg_rlimit*Gaudi::Units::cm
390  //"LArEMECMaxRadiusActivePart
391 
392 //*****************
393 
394  zWheelFrontFace+= dWRPtoFrontFace;
395 
396  // V.N : Select inner/outer radii depending on wheels.
397 
398  double Rin1, Rin2, Rout1, Rout2;
399 
400  if ( m_isInnerWheel ) {
401  Rin1 = 279.*Gaudi::Units::mm;
402  Rin2 = 324.*Gaudi::Units::mm;
403  }
404  else {
405  Rin1 = 590.*Gaudi::Units::mm;
406  Rin2 = 678.*Gaudi::Units::mm;
407  }
408  if ( m_isOuterWheel ) {
409  Rout1 = 2070.*Gaudi::Units::mm;
410  Rout2 = 2070.*Gaudi::Units::mm;
411  }
412  else {
413  Rout1 = 647.*Gaudi::Units::mm;
414  Rout2 = 732.*Gaudi::Units::mm;
415  }
416 
417  // --> EndOfRadiiSelection <--
418 
419  double emecMotherZplan[] = { 3639.5*Gaudi::Units::mm, 3639.5*Gaudi::Units::mm + 630.*Gaudi::Units::mm }; //cold (J.T)
420  double emecMotherRin[] = { Rin1, Rin2 };
421  double emecMotherRout[] = { Rout1, Rout2 };
422  int lastPlaneEmec = ( sizeof( emecMotherZplan )/sizeof( double ) );
423 
424  if ( m_isTB ) {
425  for ( int i = 0; i < lastPlaneEmec; i++ ) emecMotherZplan[ i ] -= zWheelFrontFace;
426  zWheelFrontFace = 0.*Gaudi::Units::mm;
427  }
428 
429  double phiPosition = M_PI/2;
430  double phiSize = M_PI/8 + 0.065; // half-angle of inner part of module
431 
432 // V.N : computing Bounding polycone in following lines ********************************
433 // This should be moved to a sub-routine as it is common to EMEC
434 
435  // Within the LAr endcap cryostat we have two LAr EM endcap wheels:
436  // an inner wheel and an outer wheel.
437 
438  // The radial boundaries of the inner and outer wheels are defined
439  // by values of eta, the distance from z=0 to the front face of the
440  // wheel, and the thickness of the wheel.
441 
442  double eta_hi = 3.2;
443  double eta_mid = 2.5;
444  double eta_low = 1.375;
445 
446  // Compute the angles defined by eta, and the wheel radii versus z.
447  double tanThetaInner = 2. * exp(-eta_hi ) / (1. - exp(2.*-eta_hi ));
448  double tanThetaMid = 2. * exp(-eta_mid) / (1. - exp(2.*-eta_mid));
449  double tanThetaOuter = 2. * exp(-eta_low) / (1. - exp(2.*-eta_low));
450 
451  double zWheelThickness = 514.*Gaudi::Units::mm; // endg_etot-2.*(endg_sabl*Gaudi::Units::cm-2.*Gaudi::Units::mm)
452  double gapBetweenWheels= 1.5*Gaudi::Units::mm*2.; // "LArEMECHalfCrack"*2.
453 
454 //J.T************
455 // zWheelFrontFace for mechanical design
456  double zWheelFrontFaceMech = dMechFocaltoWRP + dWRPtoFrontFace; // V.N : renamed for compatibility
457 //--************
458 
459  double zWheelBackFaceMech = zWheelFrontFaceMech + zWheelThickness;
460 
461  double zWheelInner[2];
462  zWheelInner[0] = 0.;
463  zWheelInner[1] = zWheelThickness;
464 
465  double rMinInner[2];
466  rMinInner[0] = zWheelFrontFaceMech * tanThetaInner;
467  rMinInner[1] = zWheelBackFaceMech * tanThetaInner;
468 
469  // Note that there is a 3mm gap between the outer surface of the
470  // inner wheel (rMaxInner) and the inner surface of the outer wheel
471  // (rMinOuter).
472 
473  double rMaxInner[2];
474  rMaxInner[0] = zWheelFrontFaceMech * tanThetaMid - gapBetweenWheels/2.;
475  rMaxInner[1] = zWheelBackFaceMech * tanThetaMid - gapBetweenWheels/2.;
476 
477  // The outer wheel's outer surface is more complicated. Ignore the
478  // [1] index in the following array definitions for a moment:
479 
480  double zWheelOuter[3];
481  zWheelOuter[0] = zWheelInner[0];
482  zWheelOuter[2] = zWheelInner[1];
483 
484  double rMinOuter[3];
485  rMinOuter[0] = rMaxInner[0] + gapBetweenWheels;
486  rMinOuter[2] = rMaxInner[1] + gapBetweenWheels;
487 
488  double rMaxOuter[3];
489  rMaxOuter[0] = zWheelFrontFaceMech * tanThetaOuter;
490  rMaxOuter[2] = zWheelBackFaceMech * tanThetaOuter;
491 
492  // If we simply left it at that, the outer wheel would protrude
493  // beyond the edge of the cryostat. We have to "slice off" the lip
494  // of the outer wheel to create a shape that's roughtly like a
495  // bathtub plug.
496 
497  // Use the endpoints of the outer arrays to define lines in the
498  // (z,r) plane.
499  double slopeMinOuter = ( rMinOuter[2] - rMinOuter[0] )
500  / ( zWheelOuter[2] - zWheelOuter[0] );
501  double slopeMaxOuter = ( rMaxOuter[2] - rMaxOuter[0] )
502  / ( zWheelOuter[2] - zWheelOuter[0] );
503  double interceptMinOuter = rMinOuter[0] - slopeMinOuter*zWheelOuter[0];
504  double interceptMaxOuter = rMaxOuter[0] - slopeMaxOuter*zWheelOuter[0];
505 
506  // At what value of z does the outer line hit the cutoff?
507  zWheelOuter[1] = ( rOuterCutoff - interceptMaxOuter ) / slopeMaxOuter;
508 
509  // Calculate the radii at this z:
510  rMinOuter[1] = slopeMinOuter * zWheelOuter[1] + interceptMinOuter;
511  rMaxOuter[1] = rOuterCutoff;
512 
513  // Now override the radius to keep the wheel inside the cryostat:
514  rMaxOuter[2] = rOuterCutoff;
515 
516  // We've defined the geometries of the LAr EM endcap volumes. Now
517  // place them into the detector.
518 
519  // A note on the translation: It's useful (especially for the
520  // routines in LArWheelSolidInit) if the EMEC is positioned such that
521  // its front face is at z=0 in its internal co-ordinates.
522 
523  if ( DEBUG_EMEC )
524  {
525  std::cout<<"InnerWheel,z(0)="<<zWheelInner[0]<<
526  " rmin="<<rMinInner[0]<<" rmax="<<rMaxInner[0]<<std::endl;
527  std::cout<<" z(1)="<<zWheelInner[1]<<
528  " rmin="<<rMinInner[1]<<" rmax="<<rMaxInner[1]<<std::endl;
529  std::cout<<"OuterWheel,z(0)="<<zWheelOuter[0]<<
530  " rmin="<<rMinOuter[0]<<" rmax="<<rMaxOuter[0]<<std::endl;
531  std::cout<<" z(1)="<<zWheelOuter[1]<<
532  " rmin="<<rMinOuter[1]<<" rmax="<<rMaxOuter[1]<<std::endl;
533  std::cout<<" z(2)="<<zWheelOuter[2]<<
534  " rmin="<<rMinOuter[2]<<" rmax="<<rMaxOuter[2]<<std::endl;
535  }
536 
538  // Fill geometry
540 
541  std::string emecMotherName = baseName + "::Mother";
542 
543  GeoPcon* emecMotherShape = new GeoPcon( phiPosition - phiSize, 2.*phiSize ); //start phi,total phi
544  for( int i = 0; i < lastPlaneEmec; i++ ) emecMotherShape->addPlane( emecMotherZplan[i],
545  emecMotherRin[i],
546  emecMotherRout[i] );
547  const GeoLogVol* emecMotherLogical = new GeoLogVol( emecMotherName, emecMotherShape, LAr );
548  GeoIntrusivePtr<GeoFullPhysVol> emecMotherPhysical = new GeoFullPhysVol( emecMotherLogical );
549 
550  if ( m_isInnerWheel ) {
551  std::string innerName = baseName + "::InnerWheel";
552  GeoPcon* innerShape= new GeoPcon( phiPosition - phiSize, 2.*phiSize );
553  innerShape->addPlane( zWheelInner[0], rMinInner[0], rMaxInner[0] );
554  innerShape->addPlane( zWheelInner[1], rMinInner[1], rMaxInner[1] );
555  GeoLogVol* innerLogical = new GeoLogVol ( innerName, innerShape, LAr );
556  GeoIntrusivePtr<GeoFullPhysVol> innerPhysical = new GeoFullPhysVol( innerLogical );
557  emecMotherPhysical->add( new GeoIdentifierTag( 1 ) );
558  emecMotherPhysical->add( new GeoTransform( GeoTrf::TranslateZ3D( zWheelFrontFace ) ) );
559  emecMotherPhysical->add( innerPhysical );
560 
561  // Place the custom accordion volumes in the liquid argon.
562 
563  std::string IAWname = innerName + "::Absorber";
564  std::string IEWname = innerName + "::Electrode";
565 
566  GeoUnidentifiedShape* innerAbsorberShape = new GeoUnidentifiedShape("LArCustomShape",IAWname);
567  GeoUnidentifiedShape* innerElectrodeShape = new GeoUnidentifiedShape("LArCustomShape", IEWname);
568 
569  GeoLogVol* innerAbsorberLogical =
570  new GeoLogVol( IAWname, innerAbsorberShape , innerAbsorberMaterial );
571  GeoLogVol* innerElectrodeLogical =
572  new GeoLogVol( IEWname, innerElectrodeShape, innerElectrodMaterial );
573 
574  GeoIntrusivePtr<GeoFullPhysVol> innerAbsorberPhysical = new GeoFullPhysVol( innerAbsorberLogical );
575  GeoIntrusivePtr<GeoPhysVol> innerElectrodePhysical = new GeoPhysVol( innerElectrodeLogical );
576  innerPhysical->add( new GeoIdentifierTag( 1 ) );
577  innerPhysical->add( innerAbsorberPhysical );
578  innerPhysical->add( new GeoIdentifierTag( 1 ) );
579  innerPhysical->add( innerElectrodePhysical );
580  {
581  StoredPhysVol *sPhysVol = new StoredPhysVol(innerPhysical);
582  StatusCode status=detStore->record(sPhysVol,"EMEC_INNER_WHEEL_POS");
583  if(!status.isSuccess()) throw std::runtime_error ("Cannot store EMEC_INNER_WHEEL");
584  }
585  }
586 
587  if ( m_isOuterWheel ) {
588  std::string outerName = baseName + "::OuterWheel";
589  GeoPcon* outerShape= new GeoPcon( phiPosition - phiSize, 2.*phiSize );
590  outerShape->addPlane( zWheelOuter[0], rMinOuter[0], rMaxOuter[0] );
591  outerShape->addPlane( zWheelOuter[1], rMinOuter[1], rMaxOuter[1] );
592  outerShape->addPlane( zWheelOuter[2], rMinOuter[2], rMaxOuter[2] );
593  GeoLogVol* outerLogical = new GeoLogVol ( outerName, outerShape, LAr );
594  GeoIntrusivePtr<GeoFullPhysVol> outerPhysical = new GeoFullPhysVol(outerLogical);
595  emecMotherPhysical->add( new GeoIdentifierTag( 1 ) );
596  emecMotherPhysical->add( new GeoTransform( GeoTrf::TranslateZ3D( zWheelFrontFace ) ) );
597  emecMotherPhysical->add( outerPhysical );
598 
599  // Place the custom accordion volumes in the liquid argon.
600 
601  std::string OAWname = outerName + "::Absorber";
602  std::string OEWname = outerName + "::Electrode";
603 
604  GeoUnidentifiedShape* outerAbsorberShape = new GeoUnidentifiedShape("LArCustomShape", OAWname );
605  GeoUnidentifiedShape* outerElectrodeShape = new GeoUnidentifiedShape("LArCustomShape", OEWname );
606 
607  GeoLogVol* outerAbsorberLogical =
608  new GeoLogVol( OAWname,outerAbsorberShape ,outerAbsorberMaterial );
609  GeoLogVol* outerElectrodeLogical =
610  new GeoLogVol( OEWname,outerElectrodeShape, outerElectrodMaterial );
611 
612  GeoIntrusivePtr<GeoPhysVol> outerAbsorberPhysical = new GeoPhysVol( outerAbsorberLogical );
613  GeoIntrusivePtr<GeoPhysVol> outerElectrodePhysical = new GeoPhysVol( outerElectrodeLogical );
614  outerPhysical->add( new GeoIdentifierTag( 1 ) );
615  outerPhysical->add( outerAbsorberPhysical);
616  outerPhysical->add( new GeoIdentifierTag( 1 ) );
617  outerPhysical->add( outerElectrodePhysical );
618  {
619  StoredPhysVol *sPhysVol = new StoredPhysVol(outerPhysical);
620  StatusCode status=detStore->record(sPhysVol,"EMEC_OUTER_WHEEL_POS");
621  if(!status.isSuccess()) throw std::runtime_error ("Cannot store EMEC_OUTER_WHEEL");
622  }
623 
624 
625  }
626 
627 // ***********************************
628 //Description of nonsensitive pieces:*
629 // ***********************************
630 
631  double z0;
632 
633 // Volumes for FRONT and BACK support structures
634 
635  //
636  // V.N : Select supports for front and back
637  //
638 
640  FrontIndx = EMECSupportConstruction::Front,
642 
643  if ( m_isInnerWheel && ! m_isOuterWheel ) {
646  }
647  else if ( m_isOuterWheel && ! m_isInnerWheel ) {
650  }
651 
652  // V.N. --> Support selected
653 
654  z0 = zWheelFrontFace - 61.*Gaudi::Units::mm;
655  EMECSupportConstruction *fsc = new EMECSupportConstruction( FrontIndx, true, true, "LAr::EMEC::", M_PI/2 );
656  GeoIntrusivePtr<GeoPhysVol> physicalFSM = fsc->GetEnvelope();
657  emecMotherPhysical->add( new GeoIdentifierTag( 1 ) );
658  emecMotherPhysical->add( new GeoTransform( GeoTrf::TranslateZ3D( z0 ) ) );
659  emecMotherPhysical->add( physicalFSM );
660 
661  z0 = zWheelFrontFace + 514.*Gaudi::Units::mm + 55.*Gaudi::Units::mm;
662  EMECSupportConstruction *bsc = new EMECSupportConstruction( BackIndx, true, true, "LAr::EMEC::", M_PI/2 );
663  GeoIntrusivePtr<GeoPhysVol>physicalBSM = bsc->GetEnvelope();
664  emecMotherPhysical->add( new GeoIdentifierTag( 1 ) );
665  GeoTrf::Transform3D rotBSM(GeoTrf::RotateZ3D(2*M_PI/2)*GeoTrf::RotateX3D(-M_PI));
666  emecMotherPhysical->add( new GeoTransform( GeoTrf::Transform3D(GeoTrf::Translate3D( 0., 0., z0 )*rotBSM ) ) );
667  emecMotherPhysical->add( physicalBSM );
668 
669  if ( m_isOuterWheel ) {
670  z0 = zWheelFrontFace + 514.*Gaudi::Units::mm/2;
672  GeoIntrusivePtr<GeoPhysVol>physicalOSM = osc->GetEnvelope();
673  emecMotherPhysical->add( new GeoIdentifierTag( 1 ) );
674  emecMotherPhysical->add( new GeoTransform( GeoTrf::TranslateZ3D( z0 ) ) );
675  emecMotherPhysical->add( physicalOSM );
676  }
677 
678  if ( m_isInnerWheel ) {
679  z0 = zWheelFrontFace + 514.*Gaudi::Units::mm/2;
680  EMECSupportConstruction *isc = new EMECSupportConstruction( EMECSupportConstruction::Inner, true, true, "LAr::EMEC::", M_PI/2 );
681  GeoIntrusivePtr<GeoPhysVol>physicalISM = isc->GetEnvelope();
682  emecMotherPhysical->add( new GeoIdentifierTag( 1 ) );
683  emecMotherPhysical->add(new GeoTransform( GeoTrf::TranslateZ3D( z0 ) ) ) ;
684  emecMotherPhysical->add( physicalISM );
685  }
686 
687  z0 = zWheelFrontFace + 514.*Gaudi::Units::mm/2;
688  EMECSupportConstruction *msc = new EMECSupportConstruction( EMECSupportConstruction::Middle, true, true, "LAr::EMEC::", M_PI/2 );
689  GeoIntrusivePtr<GeoPhysVol>physicalMSM = msc->GetEnvelope();
690  emecMotherPhysical->add( new GeoIdentifierTag( 1 ) );
691  emecMotherPhysical->add(new GeoTransform( GeoTrf::TranslateZ3D( z0 ) ) ) ;
692  emecMotherPhysical->add( physicalMSM );
693 
694  return emecMotherPhysical;
695 }
EMECSupportConstruction.h
Declaration of EMECSupportConstruction class.
LArGeo::EMECSupportConstruction::FrontOuter
@ FrontOuter
Definition: EMECSupportConstruction.h:54
python.SystemOfUnits.m2
int m2
Definition: SystemOfUnits.py:92
LArGeo::EMECSupportConstruction::GetEnvelope
virtual GeoIntrusivePtr< GeoPhysVol > GetEnvelope(void) const
Definition: EMECSupportConstruction.cxx:269
python.SystemOfUnits.mg
int mg
Definition: SystemOfUnits.py:171
LAr
Definition: LArVolumeBuilder.h:36
LArGeo::EMECSupportConstruction::type_t
type_t
Definition: EMECSupportConstruction.h:51
StoredMaterialManager::getElement
virtual const GeoElement * getElement(const std::string &name)=0
cm3
#define cm3
M_PI
#define M_PI
Definition: ActiveFraction.h:11
LArGeo::EMECModuleConstruction::m_isInnerWheel
bool m_isInnerWheel
Definition: EMECModuleConstruction.h:32
LArGeo::EMECModuleConstruction::m_isOuterWheel
bool m_isOuterWheel
Definition: EMECModuleConstruction.h:33
JetTiledMap::N
@ N
Definition: TiledEtaPhiMap.h:44
LArGeo::EMECModuleConstruction::m_isTB
bool m_isTB
Definition: EMECModuleConstruction.h:31
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
LArGeo::EMECSupportConstruction::Middle
@ Middle
Definition: EMECSupportConstruction.h:52
LArGeo::EMECSupportConstruction::Outer
@ Outer
Definition: EMECSupportConstruction.h:52
StoredPhysVol
Definition: StoredPhysVol.h:27
LArGeo::EMECModuleConstruction::EMECModuleConstruction
EMECModuleConstruction(bool itbb=true, bool iw=true, bool ow=true)
Definition: EMECModuleConstruction.cxx:59
LArGeo::EMECSupportConstruction::Front
@ Front
Definition: EMECSupportConstruction.h:52
H
#define H(x, y, z)
Definition: MD5.cxx:114
python.changerun.m1
m1
Definition: changerun.py:32
LArGeo::EMECSupportConstruction
GeoModel description of the EMEC Support Structures.
Definition: EMECSupportConstruction.h:49
lumiFormat.i
int i
Definition: lumiFormat.py:85
python.CaloCondTools.g
g
Definition: CaloCondTools.py:15
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
LArGeo::EMECSupportConstruction::BackInner
@ BackInner
Definition: EMECSupportConstruction.h:53
LArGeo::EMECModuleConstruction::~EMECModuleConstruction
virtual ~EMECModuleConstruction()
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
EMECModuleConstruction.h
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
LArGeo::EMECSupportConstruction::Back
@ Back
Definition: EMECSupportConstruction.h:52
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
LArGeo::EMECSupportConstruction::Inner
@ Inner
Definition: EMECSupportConstruction.h:52
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
StoredMaterialManager.h
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
ReadFromCoolCompare.osc
osc
Definition: ReadFromCoolCompare.py:281
LArGeo::EMECSupportConstruction::BackOuter
@ BackOuter
Definition: EMECSupportConstruction.h:54
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
LArGeo::EMECModuleConstruction::GetEnvelope
virtual GeoIntrusivePtr< GeoVFullPhysVol > GetEnvelope()
Definition: EMECModuleConstruction.cxx:75
LArGeo::EMECSupportConstruction::FrontInner
@ FrontInner
Definition: EMECSupportConstruction.h:53
StoreGateSvc.h
python.SystemOfUnits.m3
int m3
Definition: SystemOfUnits.py:93
StoredPhysVol.h