6 #include "GeoModelKernel/GeoMaterial.h"
7 #include "GeoModelKernel/GeoElement.h"
8 #include "GeoModelKernel/GeoIntrusivePtr.h"
9 #include "GeoModelKernel/Units.h"
11 #include "GaudiKernel/Bootstrap.h"
12 #include "GaudiKernel/PhysicalConstants.h"
15 #include "GaudiKernel/ISvcLocator.h"
25 throw std::runtime_error(
"Error in LArMaterialManager, list of precalculated materials is absent..");
33 if (!Copper)
throw std::runtime_error(
"Error in LArMaterialManager, std::Copper is not found.");
34 ATH_MSG_DEBUG(
"Copper radiation length " << Copper->getRadLength() <<
" "
38 if (!Iron)
throw std::runtime_error(
"Error in LArMaterialManager, std::Iron is not found.");
41 if (!Lead)
throw std::runtime_error(
"Error in LArMaterialManager, std::Lead is not found.");
43 ATH_MSG_INFO(
"Lead radiation length " << Lead->getRadLength() <<
" "
49 if (!
LAr)
throw std::runtime_error(
"Error in LArMaterialManager, std::LiquidArgon is not found.");
57 if (!Air)
throw std::runtime_error(
"Error in LArMaterialManager, std::Air is not found.");
60 if (!Kapton)
throw std::runtime_error(
"Error in LArMaterialManager, std::Kapton is not found.");
62 ATH_MSG_INFO(
"Kapton radiation length " << Kapton->getRadLength() <<
" "
64 for (
size_t i = 0;
i< Kapton->getNumElements();
i++) {
65 ATH_MSG_INFO(
int (Kapton->getFraction(
i)*100) <<
"% \t" << Kapton->getElement(
i)->getName());
70 if (!Glue)
throw std::runtime_error(
"Error in LArMaterialManager, LAr::Glue is not found.");
72 ATH_MSG_INFO(
"Glue radiation length " << Glue->getRadLength() <<
" "
74 for (
size_t i = 0;
i< Glue->getNumElements();
i++) {
75 ATH_MSG_INFO(
int (Glue->getFraction(
i)*100) <<
"% \t" << Glue->getElement(
i)->getName());
80 if (!G10)
throw std::runtime_error(
"Error in LArMaterialManager, LAr::G10 is not found.");
82 ATH_MSG_INFO(
"G10 radiation length " << G10->getRadLength() <<
" "
84 for (
size_t i = 0;
i< G10->getNumElements();
i++) {
85 ATH_MSG_INFO(
int (G10->getFraction(
i)*100) <<
"% \t" << G10->getElement(
i)->getName());
98 double Tggl, Tgfe, Tgpb, Thgl, Thfe, Thpb, Thcu, Thfg, ThMBcu, ThMBG10;
101 double Totalthick,Totalmass,Fracpb,Fracfe,Fracgl;
102 double Totalthicke,Totalmasse,FracCu,FracKap;
105 double contract=dB.
getDouble(
"ColdContraction",
"ColdContraction-00",
"ABSORBERCONTRACTION");
111 Totalthick = Tggl+Tgfe+Tgpb;
112 Totalmass = (Tgpb*Lead->getDensity()+Tgfe*Iron->getDensity()+Tggl*Glue->getDensity());
114 Fracpb = (Tgpb*Lead->getDensity())/Totalmass;
115 Fracfe = (Tgfe*Iron->getDensity())/Totalmass;
116 Fracgl = (Tggl*Glue->getDensity())/Totalmass;
120 ATH_MSG_DEBUG(
" Fraction pb,fe,gl: "<<Fracpb<<
","<<Fracfe<<
"," <<Fracgl);
121 ATH_MSG_DEBUG(
" Total mass, Thickness: "<<Totalmass<<
" ," <<Totalthick);
125 GeoIntrusivePtr<GeoMaterial> Thin_abs =
new GeoMaterial(
"LAr::Thinabs",density);
126 Thin_abs->add(Lead,Fracpb);
127 Thin_abs->add(Iron,Fracfe);
128 Thin_abs->add(Glue,Fracgl);
132 ATH_MSG_INFO(
"ThinAbs radiation length " << Thin_abs->getRadLength());
140 Totalthick = Thgl+Thfe+Thpb;
141 Totalmass = (Thpb*Lead->getDensity()+Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
143 Fracpb = (Thpb*Lead->getDensity())/Totalmass;
144 Fracfe = (Thfe*Iron->getDensity())/Totalmass;
145 Fracgl = (Thgl*Glue->getDensity())/Totalmass;
149 ATH_MSG_DEBUG(
" Fraction pb,fe,gl: "<<Fracpb<<
","<<Fracfe<<
","<<Fracgl);
150 ATH_MSG_DEBUG(
" Total mass, Thickness: "<<Totalmass<<
" ,"<<Totalthick);
153 GeoIntrusivePtr<GeoMaterial> Thick_abs =
new GeoMaterial(
"LAr::Thickabs",density);
154 Thick_abs->add(Lead,Fracpb);
155 Thick_abs->add(Iron,Fracfe);
156 Thick_abs->add(Glue,Fracgl);
159 ATH_MSG_INFO(
"ThickAbs radiation length " << Thick_abs->getRadLength());
165 Totalthicke = Thcu+Thfg;
166 Totalmasse = (Thcu*Copper->getDensity()+Thfg*Kapton->getDensity());
168 FracCu = (Thcu*Copper->getDensity())/Totalmasse;
169 FracKap = (Thfg*Kapton->getDensity())/Totalmasse;
172 double contract_e=1./1.003625;
173 density = (Totalmasse/Totalthicke)/(contract_e*contract_e*contract_e);
176 ATH_MSG_DEBUG(
" Fraction Cu, Kapton: " << FracCu <<
","<< FracKap);
177 ATH_MSG_DEBUG(
" Total mass, Thickness:"<<Totalmasse<<
" ,"<<Totalthicke);
180 GeoIntrusivePtr<GeoMaterial> Kapton_Cu =
new GeoMaterial(
"LAr::KaptonC",density);
181 Kapton_Cu->add(Copper,FracCu);
182 Kapton_Cu->add(Kapton,FracKap);
185 ATH_MSG_INFO(
"Electrode radiation length " << Kapton_Cu->getRadLength());
191 double frmassCu = dB.
getDouble(
"BarrelAccordionCables",
"BarrelAccordionCables-00",
"PERCU");
192 double frmassKap= dB.
getDouble(
"BarrelAccordionCables",
"BarrelAccordionCables-00",
"PERKAP");
194 const double frmassKapOverCu = frmassKap / frmassCu;
195 density = Copper->getDensity()*(1.+frmassKapOverCu)
196 /(1.+frmassKapOverCu*Copper->getDensity()/Kapton->getDensity());
197 GeoIntrusivePtr<GeoMaterial> Cable_elect =
new GeoMaterial(
"LAr::Cables",density);
203 ATH_MSG_INFO(
"Cable radiation length " << Cable_elect->getRadLength());
210 double TotalthickMBe = ThMBcu+ThMBG10;
211 double TotalmassMBe = (ThMBcu*Copper->getDensity()+ThMBG10*G10->getDensity());
212 double FracMBCu = (ThMBcu*Copper->getDensity())/TotalmassMBe;
213 double FracMBG10 = (ThMBG10*G10->getDensity())/TotalmassMBe;
214 density = TotalmassMBe/TotalthickMBe;
219 << TotalmassMBe <<
" ," <<TotalthickMBe);
221 GeoIntrusivePtr<GeoMaterial> Moth_elect =
new GeoMaterial(
"LAr::MBoards",density);
223 Moth_elect->add(G10,FracMBG10);
224 Moth_elect->add(Copper,FracMBCu);
227 ATH_MSG_INFO(
"MotherBoard radiation length " << Moth_elect->getRadLength());
236 GeoIntrusivePtr<GeoMaterial> SiO2{
new GeoMaterial(
"LAr::SiO2",density)};
237 double fractionSi=28.09/(28.09+2*16.0);
238 SiO2->add(Si,fractionSi);
239 double fractionO=2.*16.0/(28.09+2.*16.0);
240 SiO2->add(O,fractionO);
244 GeoIntrusivePtr<GeoMaterial> Gten_bar =
new GeoMaterial(
"LAr::G10_bar",density);
245 Gten_bar->add(G10,0.38);
246 Gten_bar->add(SiO2,0.62);
249 ATH_MSG_INFO(
"fracionSi,fracionO2 " << fractionSi <<
" " << fractionO);
251 ATH_MSG_INFO(
"SiO2 radiation length " << SiO2->getRadLength());
252 ATH_MSG_INFO(
"G10bar radiation length " << Gten_bar->getRadLength());
258 double TotalThickSB = ThSBCu+ThSBAr;
259 double dcu = Copper->getDensity();
260 double dar =
LAr->getDensity();
261 const double TotalMassSB = ThSBCu*dcu + ThSBAr*dar;
262 const double inv_TotalMassSB = 1. /TotalMassSB;
263 double fracSBCu = ThSBCu*dcu*inv_TotalMassSB;
264 double fracSBAr = ThSBAr*dar*inv_TotalMassSB;
265 density = TotalMassSB/TotalThickSB;
266 GeoIntrusivePtr<GeoMaterial> Summing_board =
new GeoMaterial(
"LAr::SBoard",density);
267 Summing_board->add(
LAr,fracSBAr);
268 Summing_board->add(Copper,fracSBCu);
271 ATH_MSG_INFO(
"SBoard radiation length " << Summing_board->getRadLength());
290 Vacuum->add(
H, 1. );
293 ATH_MSG_INFO(
"Vacuum radiation length " << Vacuum->getRadLength() <<
" "
302 double Tggl, Tgfe, Tgpb, Thgl, Thfe, Thpb;
303 double Totalthick,Totalmass,Fracpb,Fracfe,Fracgl;
306 double contract=dB.
getDouble(
"ColdContraction",
"ColdContraction-00",
"ABSORBERCONTRACTION");
320 Totalthick = Tggl+Tgfe+Tgpb;
321 Totalmass = (Tgpb*Lead->getDensity()+Tgfe*Iron->getDensity()+Tggl*Glue->getDensity());
323 Fracpb = (Tgpb*Lead->getDensity())/Totalmass;
324 Fracfe = (Tgfe*Iron->getDensity())/Totalmass;
325 Fracgl = (Tggl*Glue->getDensity())/Totalmass;
327 ATH_MSG_DEBUG(
"---- EMEC THIN absorber characteristics: ----");
328 ATH_MSG_DEBUG(
" Thickness pb,fe,gl,[mm]="<<Tgpb<<
" "<<Tgfe<<
" "<<Tggl);
329 ATH_MSG_DEBUG(
" Fraction pb,fe,gl ="<<Fracpb<<
","<<Fracfe<<
"," <<Fracgl);
330 ATH_MSG_DEBUG(
" Total mass, Thickness ="<<Totalmass<<
" ," <<Totalthick);
333 ATH_MSG_DEBUG(
"---- EMEC THIN absorber characteristics: ----");
334 ATH_MSG_DEBUG(
" Thickness pb,fe,gl,[mm]="<<Tgpb<<
" "<<Tgfe<<
" "<<Tggl );
335 ATH_MSG_DEBUG(
" Fraction pb,fe,gl ="<<Fracpb<<
","<<Fracfe<<
"," <<Fracgl );
336 ATH_MSG_DEBUG(
" Total mass, Thickness ="<<Totalmass<<
" ," <<Totalthick );
340 GeoIntrusivePtr<GeoMaterial> Thin_abs =
new GeoMaterial(
"LAr::EMEC_Thinabs",density);
341 Thin_abs->add(Lead,Fracpb);
342 Thin_abs->add(Iron,Fracfe);
343 Thin_abs->add(Glue,Fracgl);
347 ATH_MSG_INFO(
"EMEC thinAbs radiation length " << Thin_abs->getRadLength());
358 Totalthick = Thgl+Thfe+Thpb;
359 Totalmass = (Thpb*Lead->getDensity()+Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
361 Fracpb = (Thpb*Lead->getDensity())/Totalmass;
362 Fracfe = (Thfe*Iron->getDensity())/Totalmass;
363 Fracgl = (Thgl*Glue->getDensity())/Totalmass;
366 ATH_MSG_DEBUG(
"---- EMEC THICK absorber characteristics: ----");
367 ATH_MSG_DEBUG(
" Thickness pb,fe,gl[mm]="<<Thpb<<
" "<<Thfe<<
" "<<Thgl);
368 ATH_MSG_DEBUG(
" Fraction pb,fe,gl: "<<Fracpb<<
","<<Fracfe<<
","<<Fracgl);
369 ATH_MSG_DEBUG(
" Total mass, Thickness: "<<Totalmass<<
" ,"<<Totalthick);
372 GeoIntrusivePtr<GeoMaterial> Thick_abs =
new GeoMaterial(
"LAr::EMEC_Thickabs",density);
373 Thick_abs->add(Lead,Fracpb);
374 Thick_abs->add(Iron,Fracfe);
375 Thick_abs->add(Glue,Fracgl);
378 ATH_MSG_INFO(
"EMEC thickAbs radiation length " << Thick_abs->getRadLength());
387 Totalthick = Thgl+Thfe;
388 Totalmass = (Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
390 Fracfe = (Thfe*Iron->getDensity())/Totalmass;
391 Fracgl = (Thgl*Glue->getDensity())/Totalmass;
394 ATH_MSG_DEBUG(
"---- EMEC absorber shell characteristics: ----");
397 ATH_MSG_DEBUG(
" Total mass, Thickness: "<<Totalmass<<
" ,"<<Totalthick);
400 GeoIntrusivePtr<GeoMaterial> EMEC_shell =
new GeoMaterial(
"LAr::EMEC_shell",density);
401 EMEC_shell->add(Iron,Fracfe);
402 EMEC_shell->add(Glue,Fracgl);
422 Totalthick = Tggl+Tgfe+TgG10;
423 Totalmass = (TgG10*G10->getDensity()+Tgfe*Iron->getDensity()+Tggl*Glue->getDensity());
425 FracG10 = (TgG10*G10->getDensity())/Totalmass;
426 Fracfe = (Tgfe*Iron->getDensity())/Totalmass;
427 Fracgl = (Tggl*Glue->getDensity())/Totalmass;
430 GeoIntrusivePtr<GeoMaterial> G10FeOuter =
new GeoMaterial(
"LAr::G10FeOuter",density);
431 G10FeOuter->add(G10,FracG10);
432 G10FeOuter->add(Iron,Fracfe);
433 G10FeOuter->add(Glue,Fracgl);
437 ATH_MSG_INFO(
"EMEC G10FeOuter radiation length " << G10FeOuter->getRadLength());
448 Totalthick = Thgl+Thfe+ThG10;
449 Totalmass = (ThG10*G10->getDensity()+Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
451 FracG10 = (ThG10*G10->getDensity())/Totalmass;
452 Fracfe = (Thfe*Iron->getDensity())/Totalmass;
453 Fracgl = (Thgl*Glue->getDensity())/Totalmass;
456 GeoIntrusivePtr<GeoMaterial> G10FeInner =
new GeoMaterial(
"LAr::G10FeInner",density);
457 G10FeInner->add(G10,FracG10);
458 G10FeInner->add(Iron,Fracfe);
459 G10FeInner->add(Glue,Fracgl);
462 ATH_MSG_INFO(
"EMEC G10FeInner radiation length " << G10FeInner->getRadLength());
480 myGlass->add(O ,0.459800);
481 myGlass->add(Na,0.096441);
482 myGlass->add(Si,0.336553);
483 myGlass->add(Ca,0.107205);
497 const double wflange_total = 1.88 + 5.84 + 1.0 + 6.634 + 2.036;
498 GeoIntrusivePtr<GeoMaterial> warm_flange =
new GeoMaterial(
"LAr::FT::WarmFlange",
501 warm_flange->add(myAlu, 2.88 / wflange_total);
502 warm_flange->add(myIron, (5.84 + 6.634 + 1.83) / wflange_total);
503 warm_flange->add(myCopper, 0.17 / wflange_total);
504 warm_flange->add(myGlass, 0.036 / wflange_total);
516 const double m = 11.21;
517 const double mGlass = 0.036;
518 const double mCopper = 0.170;
519 const double mFe =
m - mGlass - mCopper;
520 GeoIntrusivePtr<GeoMaterial> cold_flange =
new GeoMaterial(
"LAr::FT::ColdFlange",
523 cold_flange->add(myIron, mFe /
m);
524 cold_flange->add(myCopper, mCopper /
m);
525 cold_flange->add(myGlass, mGlass /
m);
538 GeoIntrusivePtr<GeoMaterial> bellow_mat =
new GeoMaterial(
"LAr::FT::Bellow",
541 bellow_mat->add(myIron, 1.);
554 GeoIntrusivePtr<GeoMaterial> vacuum_cables_mat =
new GeoMaterial(
"LAr::FT::VacuumCables",
557 vacuum_cables_mat->add(myCopper, 0.5657);
558 vacuum_cables_mat->add(myKapton, 0.4343);
559 vacuum_cables_mat->lock();
567 const double vCopper = 0.215;
568 const double vKapton = 0.735;
569 const double mCopper = vCopper*8.96;
570 const double mKapton = vKapton*1.3;
571 const double m = mCopper + mKapton;
572 GeoIntrusivePtr<GeoMaterial> cable_mat =
new GeoMaterial(
"LAr::FT::Cable",
575 cable_mat->add(myCopper, mCopper /
m);
576 cable_mat->add(myKapton, mKapton /
m);
583 const double v =
M_PI*(13.3/2)*(13.3/2);
584 const double vc =
M_PI*(.11/2)*(.11/2)*1920;
585 const double va =
v - vc;
586 const double mc = vc * 2.9/0.95;
587 const double ma = va * 1.392;
588 GeoIntrusivePtr<GeoMaterial> pigtail_mat =
new GeoMaterial(
"LAr::FT::Pigtail",
593 pigtail_mat->add(cable_mat,
mc / (
mc +
ma));
594 pigtail_mat->add(myLAr,
ma / (
mc +
ma));