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

#include <EMECModuleConstruction.h>

Collaboration diagram for LArGeo::EMECModuleConstruction:

Public Member Functions

 EMECModuleConstruction (bool itbb=true, bool iw=true, bool ow=true)
 
virtual ~EMECModuleConstruction ()
 
virtual GeoIntrusivePtr< GeoVFullPhysVol > GetEnvelope ()
 

Private Attributes

bool m_isTB
 
bool m_isInnerWheel
 
bool m_isOuterWheel
 

Detailed Description

Definition at line 17 of file EMECModuleConstruction.h.

Constructor & Destructor Documentation

◆ EMECModuleConstruction()

LArGeo::EMECModuleConstruction::EMECModuleConstruction ( bool  itbb = true,
bool  iw = true,
bool  ow = true 
)

Definition at line 59 of file EMECModuleConstruction.cxx.

59  {
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 }

◆ ~EMECModuleConstruction()

LArGeo::EMECModuleConstruction::~EMECModuleConstruction ( )
virtualdefault

Member Function Documentation

◆ GetEnvelope()

GeoIntrusivePtr< GeoVFullPhysVol > LArGeo::EMECModuleConstruction::GetEnvelope ( )
virtual

Definition at line 75 of file EMECModuleConstruction.cxx.

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

Member Data Documentation

◆ m_isInnerWheel

bool LArGeo::EMECModuleConstruction::m_isInnerWheel
private

Definition at line 32 of file EMECModuleConstruction.h.

◆ m_isOuterWheel

bool LArGeo::EMECModuleConstruction::m_isOuterWheel
private

Definition at line 33 of file EMECModuleConstruction.h.

◆ m_isTB

bool LArGeo::EMECModuleConstruction::m_isTB
private

Definition at line 31 of file EMECModuleConstruction.h.


The documentation for this class was generated from the following files:
LArGeo::EMECSupportConstruction::FrontOuter
@ FrontOuter
Definition: EMECSupportConstruction.h:52
python.SystemOfUnits.m2
int m2
Definition: SystemOfUnits.py:92
python.SystemOfUnits.mg
int mg
Definition: SystemOfUnits.py:171
LAr
Definition: LArVolumeBuilder.h:36
LArGeo::EMECSupportConstruction::type_t
type_t
Definition: EMECSupportConstruction.h:49
DMTest::C
C_v1 C
Definition: C.h:26
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:50
LArGeo::EMECSupportConstruction::Outer
@ Outer
Definition: EMECSupportConstruction.h:50
StoredPhysVol
Definition: StoredPhysVol.h:27
LArGeo::EMECSupportConstruction::Front
@ Front
Definition: EMECSupportConstruction.h:50
lwtDev::Component::O
@ O
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:128
H
#define H(x, y, z)
Definition: MD5.cxx:114
python.changerun.m1
m1
Definition: changerun.py:32
lumiFormat.i
int i
Definition: lumiFormat.py:92
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:51
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
LArGeo::EMECSupportConstruction::Back
@ Back
Definition: EMECSupportConstruction.h:50
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
LArGeo::EMECSupportConstruction::Inner
@ Inner
Definition: EMECSupportConstruction.h:50
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
ReadFromCoolCompare.osc
osc
Definition: ReadFromCoolCompare.py:281
LArGeo::EMECSupportConstruction::BackOuter
@ BackOuter
Definition: EMECSupportConstruction.h:52
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::EMECSupportConstruction::FrontInner
@ FrontInner
Definition: EMECSupportConstruction.h:51
python.SystemOfUnits.m3
int m3
Definition: SystemOfUnits.py:93