ATLAS Offline Software
Loading...
Searching...
No Matches
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 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
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;
671 EMECSupportConstruction *osc = new EMECSupportConstruction( EMECSupportConstruction::Outer, true, true, "LAr::EMEC::", M_PI/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}
#define M_PI
static const bool DEBUG_EMEC
#define H(x, y, z)
Definition MD5.cxx:114
virtual const GeoElement * getElement(const std::string &name)=0
struct color C
::StatusCode StatusCode
StatusCode definition for legacy code.
status
Definition merge.py:16

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: