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"
22 m_storedManager(nullptr)
25 ISvcLocator* svcLocator = Gaudi::svcLocator();
28 throw std::runtime_error(
"LArMaterialManager: cannot initialize message service");
33 throw std::runtime_error(
"Error in LArMaterialManager, list of precalculated materials is absent..");
44 msg <<
"**** in Material Manager " <<
endmsg;
48 if (!Copper)
throw std::runtime_error(
"Error in LArMaterialManager, std::Copper is not found.");
50 msg <<
"Copper radiation length " << Copper->getRadLength() <<
" "
56 if (!Iron)
throw std::runtime_error(
"Error in LArMaterialManager, std::Iron is not found.");
59 if (!Lead)
throw std::runtime_error(
"Error in LArMaterialManager, std::Lead is not found.");
61 msg << MSG::INFO<<
"Lead radiation length " << Lead->getRadLength() <<
" "
67 if (!
LAr)
throw std::runtime_error(
"Error in LArMaterialManager, std::LiquidArgon is not found.");
70 msg << MSG::INFO<<
"LAr radiation length " <<
LAr->getRadLength() <<
" "
75 if (!Air)
throw std::runtime_error(
"Error in LArMaterialManager, std::Air is not found.");
78 if (!Kapton)
throw std::runtime_error(
"Error in LArMaterialManager, std::Kapton is not found.");
80 msg << MSG::INFO<<
"Kapton radiation length " << Kapton->getRadLength() <<
" "
82 for (
size_t i = 0;
i< Kapton->getNumElements();
i++) {
83 msg << MSG::INFO <<
int (Kapton->getFraction(
i)*100) <<
"% \t" << Kapton->getElement(
i)->getName() <<
endmsg;
90 if (!Glue)
throw std::runtime_error(
"Error in LArMaterialManager, LAr::Glue is not found.");
92 msg << MSG::INFO<<
"Glue radiation length " << Glue->getRadLength() <<
" "
94 for (
size_t i = 0;
i< Glue->getNumElements();
i++) {
95 msg << MSG::INFO <<
int (Glue->getFraction(
i)*100) <<
"% \t" << Glue->getElement(
i)->getName() <<
endmsg;
101 if (!G10)
throw std::runtime_error(
"Error in LArMaterialManager, LAr::G10 is not found.");
103 msg << MSG::INFO<<
"G10 radiation length " << G10->getRadLength() <<
" "
105 for (
size_t i = 0;
i< G10->getNumElements();
i++) {
106 msg << MSG::INFO <<
int (G10->getFraction(
i)*100) <<
"% \t" << G10->getElement(
i)->getName() <<
endmsg;
120 double Tggl, Tgfe, Tgpb, Thgl, Thfe, Thpb, Thcu, Thfg, ThMBcu, ThMBG10;
123 double Totalthick,Totalmass,Fracpb,Fracfe,Fracgl;
124 double Totalthicke,Totalmasse,FracCu,FracKap;
127 double contract=dB.
getDouble(
"ColdContraction",
"ColdContraction-00",
"ABSORBERCONTRACTION");
133 Totalthick = Tggl+Tgfe+Tgpb;
134 Totalmass = (Tgpb*Lead->getDensity()+Tgfe*Iron->getDensity()+Tggl*Glue->getDensity());
136 Fracpb = (Tgpb*Lead->getDensity())/Totalmass;
137 Fracfe = (Tgfe*Iron->getDensity())/Totalmass;
138 Fracgl = (Tggl*Glue->getDensity())/Totalmass;
139 double density = Totalmass/Totalthick/(contract*contract*contract);
147 GeoIntrusivePtr<GeoMaterial> Thin_abs =
new GeoMaterial(
"LAr::Thinabs",density);
148 Thin_abs->add(Lead,Fracpb);
149 Thin_abs->add(Iron,Fracfe);
150 Thin_abs->add(Glue,Fracgl);
154 msg << MSG::INFO<<
"ThinAbs radiation length " << Thin_abs->getRadLength() <<
endmsg;
162 Totalthick = Thgl+Thfe+Thpb;
163 Totalmass = (Thpb*Lead->getDensity()+Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
165 Fracpb = (Thpb*Lead->getDensity())/Totalmass;
166 Fracfe = (Thfe*Iron->getDensity())/Totalmass;
167 Fracgl = (Thgl*Glue->getDensity())/Totalmass;
168 density = Totalmass/Totalthick/(contract*contract*contract);
175 GeoIntrusivePtr<GeoMaterial> Thick_abs =
new GeoMaterial(
"LAr::Thickabs",density);
176 Thick_abs->add(Lead,Fracpb);
177 Thick_abs->add(Iron,Fracfe);
178 Thick_abs->add(Glue,Fracgl);
181 msg << MSG::INFO<<
"ThickAbs radiation length " << Thick_abs->getRadLength() <<
endmsg;
187 Totalthicke = Thcu+Thfg;
188 Totalmasse = (Thcu*Copper->getDensity()+Thfg*Kapton->getDensity());
190 FracCu = (Thcu*Copper->getDensity())/Totalmasse;
191 FracKap = (Thfg*Kapton->getDensity())/Totalmasse;
194 double contract_e=1./1.003625;
195 density = (Totalmasse/Totalthicke)/(contract_e*contract_e*contract_e);
202 GeoIntrusivePtr<GeoMaterial> Kapton_Cu =
new GeoMaterial(
"LAr::KaptonC",density);
203 Kapton_Cu->add(Copper,FracCu);
204 Kapton_Cu->add(Kapton,FracKap);
207 msg << MSG::INFO<<
"Electrode radiation length " << Kapton_Cu->getRadLength() <<
endmsg;
213 double frmassCu = dB.
getDouble(
"BarrelAccordionCables",
"BarrelAccordionCables-00",
"PERCU");
214 double frmassKap= dB.
getDouble(
"BarrelAccordionCables",
"BarrelAccordionCables-00",
"PERKAP");
216 const double frmassKapOverCu = frmassKap / frmassCu;
217 density = Copper->getDensity()*(1.+frmassKapOverCu)
218 /(1.+frmassKapOverCu*Copper->getDensity()/Kapton->getDensity());
219 GeoIntrusivePtr<GeoMaterial> Cable_elect =
new GeoMaterial(
"LAr::Cables",density);
225 msg << MSG::INFO<<
"Cable radiation length " << Cable_elect->getRadLength() <<
endmsg;
232 double TotalthickMBe = ThMBcu+ThMBG10;
233 double TotalmassMBe = (ThMBcu*Copper->getDensity()+ThMBG10*G10->getDensity());
234 double FracMBCu = (ThMBcu*Copper->getDensity())/TotalmassMBe;
235 double FracMBG10 = (ThMBG10*G10->getDensity())/TotalmassMBe;
236 density = TotalmassMBe/TotalthickMBe;
241 << TotalmassMBe <<
" ," <<TotalthickMBe<<
endmsg;
243 GeoIntrusivePtr<GeoMaterial> Moth_elect =
new GeoMaterial(
"LAr::MBoards",density);
245 Moth_elect->add(G10,FracMBG10);
246 Moth_elect->add(Copper,FracMBCu);
249 msg << MSG::INFO<<
"MotherBoard radiation length " << Moth_elect->getRadLength() <<
endmsg;
258 GeoIntrusivePtr<GeoMaterial> SiO2{
new GeoMaterial(
"LAr::SiO2",density)};
259 double fractionSi=28.09/(28.09+2*16.0);
260 SiO2->add(Si,fractionSi);
261 double fractionO=2.*16.0/(28.09+2.*16.0);
262 SiO2->add(O,fractionO);
266 GeoIntrusivePtr<GeoMaterial> Gten_bar =
new GeoMaterial(
"LAr::G10_bar",density);
267 Gten_bar->add(G10,0.38);
268 Gten_bar->add(SiO2,0.62);
271 msg << MSG::INFO<<
"fracionSi,fracionO2 " << fractionSi <<
" " << fractionO <<
endmsg;
273 msg << MSG::INFO<<
"SiO2 radiation length " << SiO2->getRadLength() <<
endmsg;
274 msg << MSG::INFO<<
"G10bar radiation length " << Gten_bar->getRadLength() <<
endmsg;
280 double TotalThickSB = ThSBCu+ThSBAr;
281 double dcu = Copper->getDensity();
282 double dar =
LAr->getDensity();
283 const double TotalMassSB = ThSBCu*dcu + ThSBAr*dar;
284 const double inv_TotalMassSB = 1. /TotalMassSB;
285 double fracSBCu = ThSBCu*dcu*inv_TotalMassSB;
286 double fracSBAr = ThSBAr*dar*inv_TotalMassSB;
287 density = TotalMassSB/TotalThickSB;
288 GeoIntrusivePtr<GeoMaterial> Summing_board =
new GeoMaterial(
"LAr::SBoard",density);
289 Summing_board->add(
LAr,fracSBAr);
290 Summing_board->add(Copper,fracSBCu);
293 msg << MSG::INFO<<
"SBoard radiation length " << Summing_board->getRadLength() <<
endmsg;
312 Vacuum->add(
H, 1. );
315 msg << MSG::INFO<<
"Vacuum radiation length " << Vacuum->getRadLength() <<
" "
324 double Tggl, Tgfe, Tgpb, Thgl, Thfe, Thpb;
325 double Totalthick,Totalmass,Fracpb,Fracfe,Fracgl;
328 double contract=dB.
getDouble(
"ColdContraction",
"ColdContraction-00",
"ABSORBERCONTRACTION");
342 Totalthick = Tggl+Tgfe+Tgpb;
343 Totalmass = (Tgpb*Lead->getDensity()+Tgfe*Iron->getDensity()+Tggl*Glue->getDensity());
345 Fracpb = (Tgpb*Lead->getDensity())/Totalmass;
346 Fracfe = (Tgfe*Iron->getDensity())/Totalmass;
347 Fracgl = (Tggl*Glue->getDensity())/Totalmass;
348 double density = Totalmass/Totalthick/(contract*contract*contract);
362 GeoIntrusivePtr<GeoMaterial> Thin_abs =
new GeoMaterial(
"LAr::EMEC_Thinabs",density);
363 Thin_abs->add(Lead,Fracpb);
364 Thin_abs->add(Iron,Fracfe);
365 Thin_abs->add(Glue,Fracgl);
369 msg << MSG::INFO<<
"EMEC thinAbs radiation length " << Thin_abs->getRadLength() <<
endmsg;
384 Totalthick = Thgl+Thfe+Thpb;
385 Totalmass = (Thpb*Lead->getDensity()+Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
387 Fracpb = (Thpb*Lead->getDensity())/Totalmass;
388 Fracfe = (Thfe*Iron->getDensity())/Totalmass;
389 Fracgl = (Thgl*Glue->getDensity())/Totalmass;
390 density = Totalmass/Totalthick/(contract*contract*contract);
398 GeoIntrusivePtr<GeoMaterial> Thick_abs =
new GeoMaterial(
"LAr::EMEC_Thickabs",density);
399 Thick_abs->add(Lead,Fracpb);
400 Thick_abs->add(Iron,Fracfe);
401 Thick_abs->add(Glue,Fracgl);
404 msg << MSG::INFO<<
"EMEC thickAbs radiation length " << Thick_abs->getRadLength() <<
endmsg;
413 Totalthick = Thgl+Thfe;
414 Totalmass = (Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
416 Fracfe = (Thfe*Iron->getDensity())/Totalmass;
417 Fracgl = (Thgl*Glue->getDensity())/Totalmass;
418 density = Totalmass/Totalthick/(contract*contract*contract);
426 GeoIntrusivePtr<GeoMaterial> EMEC_shell =
new GeoMaterial(
"LAr::EMEC_shell",density);
427 EMEC_shell->add(Iron,Fracfe);
428 EMEC_shell->add(Glue,Fracgl);
453 Totalthick = Tggl+Tgfe+TgG10;
454 Totalmass = (TgG10*G10->getDensity()+Tgfe*Iron->getDensity()+Tggl*Glue->getDensity());
456 FracG10 = (TgG10*G10->getDensity())/Totalmass;
457 Fracfe = (Tgfe*Iron->getDensity())/Totalmass;
458 Fracgl = (Tggl*Glue->getDensity())/Totalmass;
460 density = (Totalmass/Totalthick)/(contract*contract*contract);
462 GeoIntrusivePtr<GeoMaterial> G10FeOuter =
new GeoMaterial(
"LAr::G10FeOuter",density);
463 G10FeOuter->add(G10,FracG10);
464 G10FeOuter->add(Iron,Fracfe);
465 G10FeOuter->add(Glue,Fracgl);
469 msg << MSG::INFO<<
"EMEC G10FeOuter radiation length " << G10FeOuter->getRadLength() <<
endmsg;
484 Totalthick = Thgl+Thfe+ThG10;
485 Totalmass = (ThG10*G10->getDensity()+Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
487 FracG10 = (ThG10*G10->getDensity())/Totalmass;
488 Fracfe = (Thfe*Iron->getDensity())/Totalmass;
489 Fracgl = (Thgl*Glue->getDensity())/Totalmass;
491 density = (Totalmass/Totalthick)/(contract*contract*contract);
493 GeoIntrusivePtr<GeoMaterial> G10FeInner =
new GeoMaterial(
"LAr::G10FeInner",density);
494 G10FeInner->add(G10,FracG10);
495 G10FeInner->add(Iron,Fracfe);
496 G10FeInner->add(Glue,Fracgl);
499 msg << MSG::INFO<<
"EMEC G10FeInner radiation length " << G10FeInner->getRadLength() <<
endmsg;
517 myGlass->add(O ,0.459800);
518 myGlass->add(Na,0.096441);
519 myGlass->add(Si,0.336553);
520 myGlass->add(Ca,0.107205);
534 const double wflange_total = 1.88 + 5.84 + 1.0 + 6.634 + 2.036;
535 GeoIntrusivePtr<GeoMaterial> warm_flange =
new GeoMaterial(
"LAr::FT::WarmFlange",
538 warm_flange->add(myAlu, 2.88 / wflange_total);
539 warm_flange->add(myIron, (5.84 + 6.634 + 1.83) / wflange_total);
540 warm_flange->add(myCopper, 0.17 / wflange_total);
541 warm_flange->add(myGlass, 0.036 / wflange_total);
553 const double m = 11.21;
554 const double mGlass = 0.036;
555 const double mCopper = 0.170;
556 const double mFe =
m - mGlass - mCopper;
557 GeoIntrusivePtr<GeoMaterial> cold_flange =
new GeoMaterial(
"LAr::FT::ColdFlange",
560 cold_flange->add(myIron, mFe /
m);
561 cold_flange->add(myCopper, mCopper /
m);
562 cold_flange->add(myGlass, mGlass /
m);
575 GeoIntrusivePtr<GeoMaterial> bellow_mat =
new GeoMaterial(
"LAr::FT::Bellow",
578 bellow_mat->add(myIron, 1.);
591 GeoIntrusivePtr<GeoMaterial> vacuum_cables_mat =
new GeoMaterial(
"LAr::FT::VacuumCables",
594 vacuum_cables_mat->add(myCopper, 0.5657);
595 vacuum_cables_mat->add(myKapton, 0.4343);
596 vacuum_cables_mat->lock();
604 const double vCopper = 0.215;
605 const double vKapton = 0.735;
606 const double mCopper = vCopper*8.96;
607 const double mKapton = vKapton*1.3;
608 const double m = mCopper + mKapton;
609 GeoIntrusivePtr<GeoMaterial> cable_mat =
new GeoMaterial(
"LAr::FT::Cable",
612 cable_mat->add(myCopper, mCopper /
m);
613 cable_mat->add(myKapton, mKapton /
m);
620 const double v =
M_PI*(13.3/2)*(13.3/2);
621 const double vc =
M_PI*(.11/2)*(.11/2)*1920;
622 const double va =
v - vc;
623 const double mc = vc * 2.9/0.95;
624 const double ma = va * 1.392;
625 GeoIntrusivePtr<GeoMaterial> pigtail_mat =
new GeoMaterial(
"LAr::FT::Pigtail",
631 pigtail_mat->add(cable_mat,
mc / (
mc +
ma));
632 pigtail_mat->add(myLAr,
ma / (
mc +
ma));