ATLAS Offline Software
LArMaterialManager.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "GeoModelKernel/GeoMaterial.h"
7 #include "GeoModelKernel/GeoElement.h"
8 #include "GeoModelKernel/GeoIntrusivePtr.h"
9 #include "GeoModelKernel/Units.h"
10 #include "StoreGate/StoreGateSvc.h"
11 #include "GaudiKernel/Bootstrap.h"
12 #include "GaudiKernel/PhysicalConstants.h"
15 #include "GaudiKernel/ISvcLocator.h"
17 #include <algorithm>
18 
19 // #define DEBUGGEO
20 
22  m_storedManager(nullptr)
23 {
24  // Get the Message Service:
25  ISvcLocator* svcLocator = Gaudi::svcLocator();
26  StatusCode status = svcLocator->service("MessageSvc", m_msgSvc);
27  if(status.isFailure())
28  throw std::runtime_error("LArMaterialManager: cannot initialize message service");
29 
30  StoredMaterialManager* materialManager = nullptr;
31  status = detStore->retrieve(materialManager, "MATERIALS");
32  if(status.isFailure())
33  throw std::runtime_error("Error in LArMaterialManager, list of precalculated materials is absent..");
34 
35  m_storedManager = materialManager;
36 }
37 
38 
39 
41 {
42  MsgStream msg(m_msgSvc, "LArMaterialManager");
43 #ifdef DEBUGGEO
44  msg << "**** in Material Manager " << endmsg;
45 #endif
46 
47  GeoIntrusivePtr<const GeoMaterial> Copper = m_storedManager->getMaterial("std::Copper");
48  if (!Copper) throw std::runtime_error("Error in LArMaterialManager, std::Copper is not found.");
49 #ifdef DEBUGGEO
50  msg << "Copper radiation length " << Copper->getRadLength() << " "
51  << Copper->getDensity()/(GeoModelKernelUnits::g/Gaudi::Units::cm3) << endmsg;
52 #endif
53 
54 
55  GeoIntrusivePtr<const GeoMaterial> Iron = m_storedManager->getMaterial("std::Iron");
56  if (!Iron) throw std::runtime_error("Error in LArMaterialManager, std::Iron is not found.");
57 
58  GeoIntrusivePtr<const GeoMaterial> Lead = m_storedManager->getMaterial("std::Lead");
59  if (!Lead) throw std::runtime_error("Error in LArMaterialManager, std::Lead is not found.");
60 #ifdef DEBUGGEO
61  msg << MSG::INFO<< "Lead radiation length " << Lead->getRadLength() << " "
62  << Lead->getDensity()/(GeoModelKernelUnits::g/Gaudi::Units::cm3) << endmsg;
63 #endif
64 
65 
66  GeoIntrusivePtr<const GeoMaterial> LAr = m_storedManager->getMaterial("std::LiquidArgon");
67  if (!LAr) throw std::runtime_error("Error in LArMaterialManager, std::LiquidArgon is not found.");
68 
69 #ifdef DEBUGGEO
70  msg << MSG::INFO<< "LAr radiation length " << LAr->getRadLength() << " "
71  << LAr->getDensity()/(GeoModelKernelUnits::g/Gaudi::Units::cm3) << endmsg;
72 #endif
73 
74  GeoIntrusivePtr<const GeoMaterial> Air = m_storedManager->getMaterial("std::Air");
75  if (!Air) throw std::runtime_error("Error in LArMaterialManager, std::Air is not found.");
76 
77  GeoIntrusivePtr<const GeoMaterial> Kapton = m_storedManager->getMaterial("std::Kapton");
78  if (!Kapton) throw std::runtime_error("Error in LArMaterialManager, std::Kapton is not found.");
79 #ifdef DEBUGGEO
80  msg << MSG::INFO<< "Kapton radiation length " << Kapton->getRadLength() << " "
81  << Kapton->getDensity()/(GeoModelKernelUnits::g/Gaudi::Units::cm3) << endmsg;
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;
84  }
85 
86 
87 #endif
88 
89  GeoIntrusivePtr<const GeoMaterial> Glue = m_storedManager->getMaterial("LAr::Glue");
90  if (!Glue) throw std::runtime_error("Error in LArMaterialManager, LAr::Glue is not found.");
91 #ifdef DEBUGGEO
92  msg << MSG::INFO<< "Glue radiation length " << Glue->getRadLength() << " "
93  << Glue->getDensity()/(GeoModelKernelUnits::g/Gaudi::Units::cm3) << endmsg;
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;
96  }
97 
98 #endif
99 
100  GeoIntrusivePtr<const GeoMaterial> G10 = m_storedManager->getMaterial("LAr::G10");
101  if (!G10) throw std::runtime_error("Error in LArMaterialManager, LAr::G10 is not found.");
102 #ifdef DEBUGGEO
103  msg << MSG::INFO<< "G10 radiation length " << G10->getRadLength() << " "
104  << G10->getDensity()/(GeoModelKernelUnits::g/Gaudi::Units::cm3) << endmsg;
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;
107  }
108 
109 #endif
110 
112  //----------------------------------------------------------------------------------------//
113  // LAR... //
114  //----------------------------------------------------------------------------------------//
115  {
116 
117  //**** GU: be careful
118  // In GeoMaterial::add, the fractions are per MASS
119  //
120  double Tggl, Tgfe, Tgpb, Thgl, Thfe, Thpb, Thcu, Thfg, ThMBcu, ThMBG10;
121 
122  // thin and thick lead absorbers
123  double Totalthick,Totalmass,Fracpb,Fracfe,Fracgl;
124  double Totalthicke,Totalmasse,FracCu,FracKap;
125  // contraction from warm to cold
126 
127  double contract=dB.getDouble("ColdContraction","ColdContraction-00", "ABSORBERCONTRACTION"); // LArEMBAbsorberContraction
128 
129  // first thin absorbers
130  Tggl=dB.getDouble("BarrelGeometry","BarrelGeometry-00","TGGL")*Gaudi::Units::cm*contract; // LArEMBThinAbsGlue
131  Tgfe=dB.getDouble("BarrelGeometry","BarrelGeometry-00","TGFE")*Gaudi::Units::cm*contract; // LArEMBThinAbsIron
132  Tgpb=dB.getDouble("BarrelGeometry","BarrelGeometry-00","TGPB")*Gaudi::Units::cm*contract; // LArEMBThinAbsLead
133  Totalthick = Tggl+Tgfe+Tgpb;
134  Totalmass = (Tgpb*Lead->getDensity()+Tgfe*Iron->getDensity()+Tggl*Glue->getDensity());
135  //***GU below are the fraction per mass
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);
140 
141  msg << MSG::DEBUG <<"---- THIN absorber characteristics: ----" << endmsg;
142  msg << MSG::DEBUG <<" Fraction pb,fe,gl: "<<Fracpb<<","<<Fracfe<<"," <<Fracgl<< endmsg;
143  msg << MSG::DEBUG <<" Total mass, Thickness: "<<Totalmass<<" ," <<Totalthick<< endmsg;
144  msg << MSG::DEBUG<<" Contraction " << contract << endmsg;
145  msg << MSG::DEBUG <<" Thinabs Density = "<< density*(Gaudi::Units::cm3/GeoModelKernelUnits::g) << endmsg;
146 
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);
151  m_storedManager->addMaterial("LAr", Thin_abs);
152 
153 #ifdef DEBUGGEO
154  msg << MSG::INFO<< "ThinAbs radiation length " << Thin_abs->getRadLength() << endmsg;
155 #endif
156 
157  // then thick absorbers
158  Thgl=dB.getDouble("BarrelGeometry","BarrelGeometry-00","THGL")*Gaudi::Units::cm*contract; // LArEMBThickAbsGlue
159  Thfe=dB.getDouble("BarrelGeometry","BarrelGeometry-00","THFE")*Gaudi::Units::cm*contract; // LArEMBThickAbsIron
160  Thpb=dB.getDouble("BarrelGeometry","BarrelGeometry-00","THPB")*Gaudi::Units::cm*contract; // LArEMBThickAbsLead
161 
162  Totalthick = Thgl+Thfe+Thpb;
163  Totalmass = (Thpb*Lead->getDensity()+Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
164  //**GU below are the fractions per mass
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);
169 
170  msg << MSG::DEBUG <<"---- THICK absorber characteristics: ----" << endmsg;
171  msg << MSG::DEBUG <<" Fraction pb,fe,gl: "<<Fracpb<<","<<Fracfe<<","<<Fracgl << endmsg;
172  msg << MSG::DEBUG <<" Total mass, Thickness: "<<Totalmass<<" ,"<<Totalthick << endmsg;
173  msg << MSG::DEBUG <<" Thickabs Density = " << density*(Gaudi::Units::cm3/GeoModelKernelUnits::g) << endmsg;
174 
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);
179  m_storedManager->addMaterial("LAr",Thick_abs);
180 #ifdef DEBUGGEO
181  msg << MSG::INFO<< "ThickAbs radiation length " << Thick_abs->getRadLength() << endmsg;
182 #endif
183 
184  // electrode =mixture Kapton+Cu
185  Thcu=dB.getDouble("BarrelGeometry","BarrelGeometry-00","THCU")*Gaudi::Units::cm; // LArEMBThickElecCopper
186  Thfg=dB.getDouble("BarrelGeometry","BarrelGeometry-00","THFG")*Gaudi::Units::cm; // LArEMBThickElecKapton
187  Totalthicke = Thcu+Thfg;
188  Totalmasse = (Thcu*Copper->getDensity()+Thfg*Kapton->getDensity());
189  //**GU below are the fractions per mass
190  FracCu = (Thcu*Copper->getDensity())/Totalmasse;
191  FracKap = (Thfg*Kapton->getDensity())/Totalmasse;
192  // density = Totalmasse/Totalthicke;
193 
194  double contract_e=1./1.003625; // From Fares (J.T.)
195  density = (Totalmasse/Totalthicke)/(contract_e*contract_e*contract_e);
196 
197  msg << MSG::DEBUG <<"---- Electrode characteristics: ----" << endmsg;
198  msg << MSG::DEBUG <<" Fraction Cu, Kapton: " << FracCu << ","<< FracKap << endmsg;
199  msg << MSG::DEBUG <<" Total mass, Thickness:"<<Totalmasse<<" ,"<<Totalthicke<< endmsg;
200  msg << MSG::DEBUG <<" Electrode Density = " << density*(Gaudi::Units::cm3/GeoModelKernelUnits::g) << endmsg;
201 
202  GeoIntrusivePtr<GeoMaterial> Kapton_Cu = new GeoMaterial("LAr::KaptonC",density);
203  Kapton_Cu->add(Copper,FracCu);
204  Kapton_Cu->add(Kapton,FracKap);
205  m_storedManager->addMaterial("LAr",Kapton_Cu);
206 #ifdef DEBUGGEO
207  msg << MSG::INFO<< "Electrode radiation length " << Kapton_Cu->getRadLength() << endmsg;
208 #endif
209 
210  // material for Cables/electronics (mixture of Kapton and copper)
211  // density = 2.440*Gaudi::Units::g/Gaudi::Units::cm3;
212  //**GU get fractions per mass
213  double frmassCu = dB.getDouble("BarrelAccordionCables","BarrelAccordionCables-00","PERCU"); // LArEMBmasspercentCu
214  double frmassKap= dB.getDouble("BarrelAccordionCables","BarrelAccordionCables-00","PERKAP"); // LArEMBmasspercentKap
215 //GU 28 July 2005 recompute correctly density
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);
220  double fractionmass;
221  Cable_elect->add(Copper, fractionmass=frmassCu*Gaudi::Units::perCent);
222  Cable_elect->add(Kapton, fractionmass=frmassKap*Gaudi::Units::perCent);
223  m_storedManager->addMaterial("LAr", Cable_elect);
224 #ifdef DEBUGGEO
225  msg << MSG::INFO<< "Cable radiation length " << Cable_elect->getRadLength() << endmsg;
226 #endif
227 
228  // material for motherboard
229  // Mother_board is defined as a mixture of epox_G10 (C8 H14 O4) and Copper
230  ThMBcu = dB.getDouble("BarrelMotherboards","BarrelMotherboards-00","THICU")*Gaudi::Units::cm; // LArEMBCuThickness
231  ThMBG10 = dB.getDouble("BarrelMotherboards","BarrelMotherboards-00","THIG10")*Gaudi::Units::cm; // LArEMBG10Thickness
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;
237  msg << MSG::DEBUG <<"---- Mother Board characteristics: ----" << endmsg;
238  msg << MSG::DEBUG <<" Fraction Cu, G10: " << FracMBCu << ","
239  << FracMBG10 << endmsg;
240  msg << MSG::DEBUG <<" Total mass, Thickness:"
241  << TotalmassMBe <<" ," <<TotalthickMBe<< endmsg;
242  msg << MSG::DEBUG <<" M_board Density = "<<density*(Gaudi::Units::cm3/GeoModelKernelUnits::g) << endmsg;
243  GeoIntrusivePtr<GeoMaterial> Moth_elect = new GeoMaterial("LAr::MBoards",density);
244  // ****GU: use fraction per masses of G10 and Cu
245  Moth_elect->add(G10,FracMBG10);
246  Moth_elect->add(Copper,FracMBCu);
247  m_storedManager->addMaterial("LAr", Moth_elect);
248 #ifdef DEBUGGEO
249  msg << MSG::INFO<< "MotherBoard radiation length " << Moth_elect->getRadLength() << endmsg;
250 #endif
251 
252 //==GU 28 July 2005
253 // implement latest definitions from hard coded geometry
254  const GeoElement* Si = m_storedManager->getElement("Silicon");
255  const GeoElement *O = m_storedManager->getElement("Oxygen");
256 
257  density = dB.getDouble("BarrelMotherboards", "BarrelMotherboards-00", "DG10")*(GeoModelKernelUnits::g/Gaudi::Units::cm3); //LArEMBEpoxyVolumicMass
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);
263  SiO2->lock();
264 // Gten for the bars of the calorimeter= mixture of regular G10 and SiO2
265  density=1.72*GeoModelKernelUnits::g/Gaudi::Units::cm3; // should be replaced by number from database
266  GeoIntrusivePtr<GeoMaterial> Gten_bar = new GeoMaterial("LAr::G10_bar",density);
267  Gten_bar->add(G10,0.38); // should be replaced by number from database
268  Gten_bar->add(SiO2,0.62); // should be replaced by number from database
269  m_storedManager->addMaterial("LAr",Gten_bar);
270 #ifdef DEBUGGEO
271  msg << MSG::INFO<< "fracionSi,fracionO2 " << fractionSi << " " << fractionO << endmsg;
272  msg << MSG::INFO<< "SiO2 density " << SiO2->getDensity()/(GeoModelKernelUnits::g/Gaudi::Units::cm3) << endmsg;
273  msg << MSG::INFO<< "SiO2 radiation length " << SiO2->getRadLength() << endmsg;
274  msg << MSG::INFO<< "G10bar radiation length " << Gten_bar->getRadLength() << endmsg;
275 #endif
276 
277 // material for the effective M_PIn+summing board effect
278  double ThSBCu = 0.28*Gaudi::Units::mm; // should be replaced by number from database
279  double ThSBAr = 9.72*Gaudi::Units::mm; // should be replaced by number from database
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);
291  m_storedManager->addMaterial("LAr",Summing_board);
292 #ifdef DEBUGGEO
293  msg << MSG::INFO<< "SBoard radiation length " << Summing_board->getRadLength() << endmsg;
294 #endif
295 
296 //==end GU
297 
298  }
299 
300  //----------------------------------------------------------------------------------------//
301  // LAR Endcap only //
302  //----------------------------------------------------------------------------------------//
303  {
304 
305  // ----------------------
306  // Vacuum for TB cryostat
307  // ----------------------
308 
309  const GeoElement *H = m_storedManager->getElement( "Hydrogen" );
310 
311  GeoIntrusivePtr<GeoMaterial> Vacuum = new GeoMaterial( "LAr::Vacuum", Gaudi::Units::universe_mean_density );
312  Vacuum->add( H, 1. );
313  m_storedManager->addMaterial("LAr", Vacuum );
314 #ifdef DEBUGGEO
315  msg << MSG::INFO<< "Vacuum radiation length " << Vacuum->getRadLength() << " "
316  << Vacuum->getDensity()/(GeoModelKernelUnits::g/Gaudi::Units::cm3) << endmsg;
317 #endif
318 
319 
320  // ----------------------------
321  // Materials for EMEC absorbers
322  // ----------------------------
323 
324  double Tggl, Tgfe, Tgpb, Thgl, Thfe, Thpb;
325  double Totalthick,Totalmass,Fracpb,Fracfe,Fracgl;
326 
327  // contraction from warm to cold
328  double contract=dB.getDouble("ColdContraction","ColdContraction-00", "ABSORBERCONTRACTION"); // LArEMBAbsorberContraction
329 
330  //
331  // EMEC thin absorbers
332  //
333 
334 /* Tggl = 0.30 * Gaudi::Units::mm;
335  Tgfe = 0.40 * Gaudi::Units::mm;
336  Tgpb = 1.70 * Gaudi::Units::mm; */
337 
338  Tggl = 0.20 * Gaudi::Units::mm;
339  Tgfe = 0.40 * Gaudi::Units::mm;
340  Tgpb = 1.69 * Gaudi::Units::mm;
341 
342  Totalthick = Tggl+Tgfe+Tgpb;
343  Totalmass = (Tgpb*Lead->getDensity()+Tgfe*Iron->getDensity()+Tggl*Glue->getDensity());
344  // Fractions per mass
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);
349  msg << MSG::DEBUG <<"---- EMEC THIN absorber characteristics: ----" << endmsg;
350  msg << MSG::DEBUG <<" Thickness pb,fe,gl,[mm]="<<Tgpb<<" "<<Tgfe<<" "<<Tggl << endmsg;
351  msg << MSG::DEBUG <<" Fraction pb,fe,gl ="<<Fracpb<<","<<Fracfe<<"," <<Fracgl << endmsg;
352  msg << MSG::DEBUG <<" Total mass, Thickness ="<<Totalmass<<" ," <<Totalthick << endmsg;
353  msg << MSG::DEBUG <<" Thinabs Density ="<< density*(Gaudi::Units::cm3/GeoModelKernelUnits::g) << endmsg;
354 
355  msg << MSG::DEBUG << "---- EMEC THIN absorber characteristics: ----" << endmsg;
356  msg << MSG::DEBUG <<" Thickness pb,fe,gl,[mm]="<<Tgpb<<" "<<Tgfe<<" "<<Tggl << endmsg;
357  msg << MSG::DEBUG <<" Fraction pb,fe,gl ="<<Fracpb<<","<<Fracfe<<"," <<Fracgl << endmsg;
358  msg << MSG::DEBUG <<" Total mass, Thickness ="<<Totalmass<<" ," <<Totalthick << endmsg;
359  msg << MSG::DEBUG <<" Thinabs Density ="<< density*(Gaudi::Units::cm3/GeoModelKernelUnits::g) << endmsg;
360 
361 
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);
366  m_storedManager->addMaterial("LAr", Thin_abs);
367 
368 #ifdef DEBUGGEO
369  msg << MSG::INFO<< "EMEC thinAbs radiation length " << Thin_abs->getRadLength() << endmsg;
370 #endif
371 
372  //
373  // EMEC thick absorbers
374  //
375 
376 /* Thgl = 0.30 * Gaudi::Units::mm;
377  Thfe = 0.40 * Gaudi::Units::mm;
378  Thpb = 2.20 * Gaudi::Units::mm; */
379 
380  Thgl = 0.20 * Gaudi::Units::mm;
381  Thfe = 0.40 * Gaudi::Units::mm;
382  Thpb = 2.20 * Gaudi::Units::mm;
383 
384  Totalthick = Thgl+Thfe+Thpb;
385  Totalmass = (Thpb*Lead->getDensity()+Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
386  // Fractions per mass
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);
391 
392  msg << MSG::DEBUG <<"---- EMEC THICK absorber characteristics: ----"<<endmsg;
393  msg << MSG::DEBUG <<" Thickness pb,fe,gl[mm]="<<Thpb<<" "<<Thfe<<" "<<Thgl<<endmsg;
394  msg << MSG::DEBUG <<" Fraction pb,fe,gl: "<<Fracpb<<","<<Fracfe<<","<<Fracgl<<endmsg;
395  msg << MSG::DEBUG <<" Total mass, Thickness: "<<Totalmass<<" ,"<<Totalthick<<endmsg;
396  msg << MSG::DEBUG <<" Thickabs Density = "<<density*(Gaudi::Units::cm3/GeoModelKernelUnits::g) <<endmsg;
397 
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);
402  m_storedManager->addMaterial("LAr",Thick_abs);
403 #ifdef DEBUGGEO
404  msg << MSG::INFO<< "EMEC thickAbs radiation length " << Thick_abs->getRadLength() << endmsg;
405 #endif
406 
407  //
408  // EMEC shell = iron + glue, identical for inner and outer absorbers
409  //
410  Thgl = 0.20 * Gaudi::Units::mm;
411  Thfe = 0.40 * Gaudi::Units::mm;
412 
413  Totalthick = Thgl+Thfe;
414  Totalmass = (Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
415  // Fractions per mass
416  Fracfe = (Thfe*Iron->getDensity())/Totalmass;
417  Fracgl = (Thgl*Glue->getDensity())/Totalmass;
418  density = Totalmass/Totalthick/(contract*contract*contract);
419 
420  msg << MSG::DEBUG <<"---- EMEC absorber shell characteristics: ----"<<endmsg;
421  msg << MSG::DEBUG <<" Thickness fe,gl[mm]="<<Thfe<<" "<<Thgl<<endmsg;
422  msg << MSG::DEBUG <<" Fraction fe,gl: "<<Fracfe<<","<<Fracgl<<endmsg;
423  msg << MSG::DEBUG <<" Total mass, Thickness: "<<Totalmass<<" ,"<<Totalthick<<endmsg;
424  msg << MSG::DEBUG <<" Thickabs Density = "<<density*(Gaudi::Units::cm3/GeoModelKernelUnits::g) <<endmsg;
425 
426  GeoIntrusivePtr<GeoMaterial> EMEC_shell = new GeoMaterial("LAr::EMEC_shell",density);
427  EMEC_shell->add(Iron,Fracfe);
428  EMEC_shell->add(Glue,Fracgl);
429  m_storedManager->addMaterial("LAr",EMEC_shell);
430 
431 
432  // ----------------------------
433  // Materials for EMEC barrettes
434  // ----------------------------
435 
436  double TgG10, ThG10;
437  double FracG10;
438 
439  //
440  // EMEC Outer Wheel barrette
441  //
442 
444 
445 /* Tggl = 0.30 * Gaudi::Units::mm;
446  Tgfe = 0.40 * Gaudi::Units::mm;
447  TgG10 =1.70 * Gaudi::Units::mm;*/
448 
449  Tggl = 0.20 * Gaudi::Units::mm;
450  Tgfe = 0.40 * Gaudi::Units::mm;
451  TgG10 =1.69 * Gaudi::Units::mm;
452 
453  Totalthick = Tggl+Tgfe+TgG10;
454  Totalmass = (TgG10*G10->getDensity()+Tgfe*Iron->getDensity()+Tggl*Glue->getDensity());
455  // Fractions per mass
456  FracG10 = (TgG10*G10->getDensity())/Totalmass;
457  Fracfe = (Tgfe*Iron->getDensity())/Totalmass;
458  Fracgl = (Tggl*Glue->getDensity())/Totalmass;
459  // density = Totalmass/Totalthick;
460  density = (Totalmass/Totalthick)/(contract*contract*contract);
461 
462  GeoIntrusivePtr<GeoMaterial> G10FeOuter = new GeoMaterial("LAr::G10FeOuter",density);
463  G10FeOuter->add(G10,FracG10);
464  G10FeOuter->add(Iron,Fracfe);
465  G10FeOuter->add(Glue,Fracgl);
466  m_storedManager->addMaterial("LAr", G10FeOuter);
467 
468 #ifdef DEBUGGEO
469  msg << MSG::INFO<< "EMEC G10FeOuter radiation length " << G10FeOuter->getRadLength() << endmsg;
470 #endif
471 
472  //
473  // EMEC Inner Wheel barrette
474  //
475 
476 /* Thgl = 0.30 * Gaudi::Units::mm;
477  Thfe = 0.40 * Gaudi::Units::mm;
478  ThG10 =2.20 * Gaudi::Units::mm;*/
479 
480  Thgl = 0.20 * Gaudi::Units::mm;
481  Thfe = 0.40 * Gaudi::Units::mm;
482  ThG10 =2.20 * Gaudi::Units::mm;
483 
484  Totalthick = Thgl+Thfe+ThG10;
485  Totalmass = (ThG10*G10->getDensity()+Thfe*Iron->getDensity()+Thgl*Glue->getDensity());
486  // Fractions per mass
487  FracG10 = (ThG10*G10->getDensity())/Totalmass;
488  Fracfe = (Thfe*Iron->getDensity())/Totalmass;
489  Fracgl = (Thgl*Glue->getDensity())/Totalmass;
490  // density = Totalmass/Totalthick;
491  density = (Totalmass/Totalthick)/(contract*contract*contract);
492 
493  GeoIntrusivePtr<GeoMaterial> G10FeInner = new GeoMaterial("LAr::G10FeInner",density);
494  G10FeInner->add(G10,FracG10);
495  G10FeInner->add(Iron,Fracfe);
496  G10FeInner->add(Glue,Fracgl);
497  m_storedManager->addMaterial("LAr",G10FeInner);
498 #ifdef DEBUGGEO
499  msg << MSG::INFO<< "EMEC G10FeInner radiation length " << G10FeInner->getRadLength() << endmsg;
500 #endif
501 
502  }
503 
504  // Materials for Barrel and Endcap Signal Feedthroughs
505  {
506  GeoIntrusivePtr<const GeoMaterial> myIron = m_storedManager->getMaterial("std::Iron");
507  GeoIntrusivePtr<const GeoMaterial> myCopper = m_storedManager->getMaterial("std::Copper");
508  GeoIntrusivePtr<const GeoMaterial> myKapton = m_storedManager->getMaterial("std::Kapton");
509  GeoIntrusivePtr<const GeoMaterial> myAlu = m_storedManager->getMaterial("std::Aluminium");
510  GeoIntrusivePtr<const GeoMaterial> myLAr = m_storedManager->getMaterial("std::LiquidArgon");
511  const GeoElement* O = m_storedManager->getElement("Oxygen");
512  const GeoElement* Na = m_storedManager->getElement("Potassium");
513  const GeoElement* Si = m_storedManager->getElement("Silicon");
514  const GeoElement* Ca = m_storedManager->getElement("Calcium");
515 
516  GeoIntrusivePtr<GeoMaterial> myGlass = new GeoMaterial("LAr::PinCarrierGlas",2.40*Gaudi::Units::g/Gaudi::Units::cm3);
517  myGlass->add(O ,0.459800);
518  myGlass->add(Na,0.096441);
519  myGlass->add(Si,0.336553);
520  myGlass->add(Ca,0.107205);
521  myGlass->lock();
522  m_storedManager->addMaterial("LAr",myGlass);
523 
524  // Average material for Warm Flange
525  /* contains
526  * bolt ring 1.88 kg Al
527  * seal ring 5.84 kg Fe
528  * heater 1.00 kg Al
529  * plate 8.67 kg - 2*(0.478+0.540) kg = 6.634 kg Fe
530  * pin carr. 2.036 kg mixture Fe+ glass (36g) + Cu (170g)
531  *
532  * hardcoded volume = 37*170^2*pi = 3766141 mm^3
533  */
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",
536  wflange_total*Gaudi::Units::kg / (3766141.*Gaudi::Units::mm3)
537  );
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);
542  warm_flange->lock();
543  m_storedManager->addMaterial("LAr", warm_flange);
544 
545  // Average material for Cold Flange
546  /* contains
547  * plate 11.21 kg - 2*(0.478+0.540) kg = 9.174 kg Fe
548  * pin carr. 2.036 kg mixture Fe+ glass (36g) + Cu (170g)
549  *
550  * hardcoded volume = 35*141.5^2*pi = 2201561 mm^3
551  */
552  {
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",
559  );
560  cold_flange->add(myIron, mFe / m);
561  cold_flange->add(myCopper, mCopper / m);
562  cold_flange->add(myGlass, mGlass / m);
563  cold_flange->lock();
564  m_storedManager->addMaterial("LAr", cold_flange);
565  }
566 
567  /* bellow is iron + vacuum
568  as geometry described in DMConstruction,
569  bellow also includes cuff ring and some part of seal ring
570  0.511 kg bellow
571  0.840 kg cuff ring
572  0 seal ring (sum whole ring to warm flange)
573  hardcoded volume is 225*pi*(229^2 - (229 - 15)^2)/4 = 1253790 mm^3
574  */
575  GeoIntrusivePtr<GeoMaterial> bellow_mat = new GeoMaterial("LAr::FT::Bellow",
576  1.351*Gaudi::Units::kg / (1253790.*Gaudi::Units::mm3)
577  );
578  bellow_mat->add(myIron, 1.);
579  bellow_mat->lock();
580  m_storedManager->addMaterial("LAr", bellow_mat);
581 
582  /* vacuum cables are kapton+copper placed in vacuum,
583  insulation is ignored yet (btw different for barrel and EC)
584  3.928 kg Cu (0.5657)
585  3.015 kg Polymide (0.4343)
586  ------------------
587  6.943 kg total
588  hardcoded volume is 225*pi*(229 - 15)^2/4 = 8092821 mm^3
589 
590  */
591  GeoIntrusivePtr<GeoMaterial> vacuum_cables_mat = new GeoMaterial("LAr::FT::VacuumCables",
592  6.943*Gaudi::Units::kg / (8092821.*Gaudi::Units::mm3)
593  );
594  vacuum_cables_mat->add(myCopper, 0.5657);
595  vacuum_cables_mat->add(myKapton, 0.4343);
596  vacuum_cables_mat->lock();
597  m_storedManager->addMaterial("LAr", vacuum_cables_mat);
598 
599  /* cables
600  * 0.215 cm^3 per 1m copper
601  * 0.735 cm^3 per 1m kapton
602  * 2.90 g per 1m = 100*pi*(0.11/2)^2 = 0.95 cm^3
603  */
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",
610  m*Gaudi::Units::g / ((vCopper + vKapton)*Gaudi::Units::cm3)
611  );
612  cable_mat->add(myCopper, mCopper / m);
613  cable_mat->add(myKapton, mKapton / m);
614  cable_mat->lock();
615  m_storedManager->addMaterial("LAr", cable_mat);
616 
617  /* pigtail cables are cables + LAr
618  *
619  */
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",
627  );
628  msg << MSG::DEBUG << pigtail_mat->getName() << " "
629  << pigtail_mat->getDensity() / (Gaudi::Units::g/Gaudi::Units::cm3)
630  << endmsg;
631  pigtail_mat->add(cable_mat, mc / (mc + ma));
632  pigtail_mat->add(myLAr, ma / (mc + ma));
633  pigtail_mat->lock();
634  m_storedManager->addMaterial("LAr", pigtail_mat);
635  }
636 }
LArMaterialManager.h
LArMaterialManager::buildMaterials
void buildMaterials()
Definition: LArMaterialManager.cxx:40
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
python.SystemOfUnits.kg
int kg
Definition: SystemOfUnits.py:169
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
LAr
Definition: LArVolumeBuilder.h:36
DatabaseAccessTool::getDouble
double getDouble(const std::string &TableName, const std::string &FallbackVersion, const std::string &ColumnName) const
Definition: DatabaseAccessTool.cxx:53
StoredMaterialManager::getElement
virtual const GeoElement * getElement(const std::string &name)=0
cm3
#define cm3
M_PI
#define M_PI
Definition: ActiveFraction.h:11
LArMaterialManager::m_msgSvc
IMessageSvc * m_msgSvc
Definition: LArMaterialManager.h:51
python.SystemOfUnits.mm3
int mm3
Definition: SystemOfUnits.py:85
cm
const double cm
Definition: Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/tools/FCAL_ChannelMap.cxx:25
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:128
LArMaterialManager::m_storedManager
StoredMaterialManager * m_storedManager
Definition: LArMaterialManager.h:50
mc
Definition: mc.PG_single_nu_valid.py:1
H
#define H(x, y, z)
Definition: MD5.cxx:114
DatabaseAccessTool
Definition: DatabaseAccessTool.h:16
lumiFormat.i
int i
Definition: lumiFormat.py:92
python.CaloCondTools.g
g
Definition: CaloCondTools.py:15
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
StoredMaterialManager::addMaterial
virtual void addMaterial(const std::string &space, GeoMaterial *material)=0
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
python.PhysicalConstants.universe_mean_density
int universe_mean_density
Definition: PhysicalConstants.py:126
StoredMaterialManager.h
DatabaseAccessTool.h
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
python.PyAthena.v
v
Definition: PyAthena.py:157
PowhegPythia8EvtGen_H2a4X_ctauY.ma
int ma
Definition: PowhegPythia8EvtGen_H2a4X_ctauY.py:26
DEBUG
#define DEBUG
Definition: page_access.h:11
StoredMaterialManager::getMaterial
virtual const GeoMaterial * getMaterial(const std::string &name)=0
LArMaterialManager::LArMaterialManager
LArMaterialManager(StoreGateSvc *pDetStore)
Definition: LArMaterialManager.cxx:21
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
python.SystemOfUnits.perCent
float perCent
Definition: SystemOfUnits.py:277
IGeoModelSvc.h
StoreGateSvc.h
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7