9 #include "GeoModelKernel/GeoMaterial.h"
10 #include "GeoModelKernel/Units.h"
16 #include "GaudiKernel/ISvcLocator.h"
17 #include "GaudiKernel/SystemOfUnits.h"
28 throw std::runtime_error(
"RDBMaterialManager failed to read Geometry DB");
34 SmartIF<IGeoModelSvc> iGeoModel{pSvcLocator->service(
"GeoModelSvc")};
37 SmartIF<IRDBAccessSvc> iAccessSvc{pSvcLocator->service(
"RDBAccessSvc")};
42 return (loadDefaults and pRecordset->size() == 0);
45 if (loadDefaults)
ATH_MSG_DEBUG(
"Will load material defaults if not present");
49 m_elements = iAccessSvc->getRecordsetPtr(
"Elements",keyAtlas.
tag(),keyAtlas.
node());
52 m_elements = iAccessSvc->getRecordsetPtr(
"Elements",
"Materials-00",
"Materials");
59 recMatcomponents = iAccessSvc->getRecordsetPtr(
"StdMatComponents",keyAtlas.
tag(),keyAtlas.
node());
60 if(defaulted(recMatcomponents)) {
62 recMatcomponents = iAccessSvc->getRecordsetPtr(
"StdMatComponents",
"Materials-00",
"Materials");
64 recMaterials = iAccessSvc->getRecordsetPtr(
"StdMaterials",keyAtlas.
tag(),keyAtlas.
node());
65 if(defaulted(recMaterials)) {
67 recMaterials = iAccessSvc->getRecordsetPtr(
"StdMaterials",
"Materials-00",
"Materials");
73 recMatcomponents = iAccessSvc->getRecordsetPtr(
"PixMatComponents",keyPixel.
tag(),keyPixel.
node());
74 if(defaulted(recMatcomponents)) {
76 recMatcomponents = iAccessSvc->getRecordsetPtr(
"PixMatComponents",
"PixMatComponents-00");
78 recMaterials = iAccessSvc->getRecordsetPtr(
"PixMaterials",keyPixel.
tag(),keyPixel.
node());
79 if(defaulted(recMaterials)) {
81 recMaterials = iAccessSvc->getRecordsetPtr(
"PixMaterials",
"PixMaterials-00");
87 recMatcomponents = iAccessSvc->getRecordsetPtr(
"SCTMatComponents",keySCT.
tag(),keySCT.
node());
88 if(defaulted(recMatcomponents)) {
90 recMatcomponents = iAccessSvc->getRecordsetPtr(
"SCTMatComponents",
"SCTMatComponents-00");
92 recMaterials = iAccessSvc->getRecordsetPtr(
"SCTMaterials",keySCT.
tag(),keySCT.
node());
93 if(defaulted(recMaterials)) {
95 recMaterials = iAccessSvc->getRecordsetPtr(
"SCTMaterials",
"SCTMaterials-00");
101 recMatcomponents = iAccessSvc->getRecordsetPtr(
"TrtMatComponents",keyTRT.
tag(),keyTRT.
node());
102 if(defaulted(recMatcomponents)) {
104 recMatcomponents = iAccessSvc->getRecordsetPtr(
"TrtMatComponents",
"TrtMatComponents-00");
106 recMaterials = iAccessSvc->getRecordsetPtr(
"TrtMaterials",keyTRT.
tag(),keyTRT.
node());
107 if(defaulted(recMaterials)) {
109 recMaterials = iAccessSvc->getRecordsetPtr(
"TrtMaterials",
"TrtMaterials-00");
115 recMatcomponents = iAccessSvc->getRecordsetPtr(
"InDetMatComponents",keyInDet.
tag(),keyInDet.
node());
116 if(defaulted(recMatcomponents)) {
117 ATH_MSG_DEBUG(
"Getting InDetMatComponents with default tag");
118 recMatcomponents = iAccessSvc->getRecordsetPtr(
"InDetMatComponents",
"InDetMatComponents-00");
120 recMaterials = iAccessSvc->getRecordsetPtr(
"InDetMaterials",keyInDet.
tag(),keyInDet.
node());
121 if(defaulted(recMaterials)) {
123 recMaterials = iAccessSvc->getRecordsetPtr(
"InDetMaterials",
"InDetMaterials-00");
129 recMatcomponents = iAccessSvc->getRecordsetPtr(
"LArMatComponents",keyLAr.
tag(),keyLAr.
node());
130 if(defaulted(recMatcomponents)) {
132 recMatcomponents = iAccessSvc->getRecordsetPtr(
"LArMatComponents",
"LArMatComponents-00");
134 recMaterials = iAccessSvc->getRecordsetPtr(
"LArMaterials",keyLAr.
tag(),keyLAr.
node());
135 if(defaulted(recMaterials)) {
137 recMaterials = iAccessSvc->getRecordsetPtr(
"LArMaterials",
"LArMaterials-00");
143 recMatcomponents = iAccessSvc->getRecordsetPtr(
"TileMatComponents",keyTile.
tag(),keyTile.
node());
144 if (defaulted(recMatcomponents)) {
146 recMatcomponents = iAccessSvc->getRecordsetPtr(
"TileMatComponents",
"TileMatComponents-00");
148 recMaterials = iAccessSvc->getRecordsetPtr(
"TileMaterials",keyTile.
tag(),keyTile.
node());
149 if(defaulted(recMaterials)) {
151 recMaterials = iAccessSvc->getRecordsetPtr(
"TileMaterials",
"TileMaterials-00");
157 recMatcomponents = iAccessSvc->getRecordsetPtr(
"MUOMatComponents",keyMuon.
tag(),keyMuon.
node());
158 if(defaulted(recMatcomponents)) {
160 recMatcomponents = iAccessSvc->getRecordsetPtr(
"MUOMatComponents",
"MUOMatComponents-00");
162 recMaterials = iAccessSvc->getRecordsetPtr(
"MUOMaterials",keyMuon.
tag(),keyMuon.
node());
163 if(defaulted(recMaterials)) {
165 recMaterials = iAccessSvc->getRecordsetPtr(
"MUOMaterials",
"MUOMaterials-00");
170 recMatcomponents = iAccessSvc->getRecordsetPtr(
"ShieldMatComponents",keyMuon.
tag(),keyMuon.
node());
171 if(defaulted(recMatcomponents)) {
173 recMatcomponents = iAccessSvc->getRecordsetPtr(
"ShieldMatComponents",
"ShieldMatComponents-00");
175 recMaterials = iAccessSvc->getRecordsetPtr(
"ShieldMaterials",keyMuon.
tag(),keyMuon.
node());
176 if(defaulted(recMaterials)) {
178 recMaterials = iAccessSvc->getRecordsetPtr(
"ShieldMaterials",
"ShieldMaterials-00");
183 recMatcomponents = iAccessSvc->getRecordsetPtr(
"ToroMatComponents",keyMuon.
tag(),keyMuon.
node());
184 if(defaulted(recMatcomponents)) {
186 recMatcomponents = iAccessSvc->getRecordsetPtr(
"ToroMatComponents",
"ToroMatComponents-00");
188 recMaterials = iAccessSvc->getRecordsetPtr(
"ToroMaterials",keyMuon.
tag(),keyMuon.
node());
189 if(defaulted(recMaterials)) {
191 recMaterials = iAccessSvc->getRecordsetPtr(
"ToroMaterials",
"ToroMaterials-00");
193 m_detData.emplace(
"toro",
DetectorAuxData{
"TOROMATERIALS_DATA_ID", std::move(recMaterials), std::move(recMatcomponents)});
195 return StatusCode::SUCCESS;
217 GeoEleVec::const_iterator it_element = std::find_if(
m_elementVector.begin()
219 , [&
name](
const GeoElement* element) {
220 return name == element->getName();
235 GeoEleVec::const_iterator it_element = std::find_if(
m_elementVector.begin()
237 , [atomicNumber](
const GeoElement* element) {
238 return atomicNumber == element->getZ();
242 ATH_MSG_VERBOSE(
" ***** in searchElementVector(atomicNumber) search success for atomic number " << atomicNumber);
246 ATH_MSG_VERBOSE(
" ***** in searchElementVector(atomicNumber) search success for atomic number " << atomicNumber);
252 [[maybe_unused]]
static const bool specialMaterialsDone = [
this]() {
264 if(
pos==std::string::npos) {
266 <<
". Must be detector::material");
274 <<
" passed to getMaterial()");
280 const std::string& data_id =
it->second.m_prim_key;
282 auto it_material = std::find_if(tmp_materials->begin()
283 , tmp_materials->end()
285 return name == detector+
"::"+rec->getString(
"NAME");
288 if(it_material==tmp_materials->end()) {
293 const auto& rec = *it_material;
294 std::string material_name =
detector+
"::"+rec->getString(
"NAME");
295 long material_id = rec->getLong(data_id);
296 double material_density = rec->getDouble(
"DENSITY");
298 ATH_MSG_DEBUG(
" ***** Material: name id density: " << material_name <<
" " << material_id <<
" "<< material_density);
302 bool firstComponent =
true;
303 bool hasSubMaterial =
false;
304 bool calculateFraction =
false;
305 double totalFraction = 0.;
306 double component_fraction = 0.;
307 std::string component_name{};
309 std::vector <const GeoElement*> elementComponents;
310 std::vector <double> elementFractions;
312 for(
const auto& rec : *tmp_matcomponents) {
313 if(rec->getLong(
"MATERIAL_ID") == material_id) {
314 component_name = rec->getString(
"COMPNAME");
315 component_fraction = rec->getDouble(
"FRACTION");
318 firstComponent =
false;
319 if(component_fraction>=1.) {
320 calculateFraction =
true;
324 if(component_name.find(
"::",0) == std::string::npos) {
325 const GeoElement* p_com_element =
getElement(component_name);
327 if(calculateFraction) {
328 totalFraction += component_fraction*p_com_element->getA();
329 elementComponents.push_back(p_com_element);
330 elementFractions.push_back(component_fraction);
333 pmaterial->add( p_com_element, component_fraction);
337 hasSubMaterial =
true;
338 const GeoMaterial* p_com_material =
getMaterial(component_name);
339 pmaterial->add(p_com_material, component_fraction);
344 if(calculateFraction && hasSubMaterial && elementComponents.size()>0)
345 ATH_MSG_WARNING(material_name <<
" description should be changed. Please indicate the exact fraction for elements");
347 if(calculateFraction && !elementComponents.empty()) {
348 double inv_totalFraction = totalFraction == 0 ? 1 : 1. / totalFraction;
349 for(
unsigned i=0;
i<elementComponents.size(); ++
i) {
350 pmaterial->add(elementComponents[
i],elementFractions[
i]*elementComponents[
i]->getA() * inv_totalFraction);
367 if(
name == rec->getString(
"NAME")) {
368 pelement =
new GeoElement(rec->getString(
"NAME")
369 , rec->getString(
"SYMBOL")
370 , rec->getDouble(
"Z")
384 ATH_MSG_VERBOSE(
" ***** const getElement(atomicNumber) const : " << atomicNumber);
389 if(atomicNumber == rec->getDouble(
"A")) {
390 pelement =
new GeoElement(rec->getString(
"NAME")
391 , rec->getString(
"SYMBOL")
392 , rec->getDouble(
"Z")
407 const std::string&
key = material->getName();
410 it_material->second->lock();
415 <<
"!. The existing instance is kept. Please choose another name for new material");
436 o <<
"============Material Manager Element List========================\n";
443 for (
size_t i = 0;
i<
p.second->getNumElements();
i++) {
444 o <<
" ***** ***** "<<
int (
p.second->getFraction(
i)*100) <<
"% \t" <<
p.second->getElement(
i)->getName() << std::endl;
454 GeoElement* ethElement =
new GeoElement(
"Ether",
"ET",500.0,0.0);
456 GeoMaterial* ether =
new GeoMaterial(
"special::Ether",0.0);
457 ether->add(ethElement,1.);
460 GeoMaterial* hu =
new GeoMaterial(
"special::HyperUranium",0.0);
461 hu->add(ethElement,1.);