9 #include "GeoModelKernel/GeoMaterial.h"
10 #include "GeoModelKernel/Units.h"
19 #include "GaudiKernel/IMessageSvc.h"
20 #include "GaudiKernel/ISvcLocator.h"
21 #include "GaudiKernel/MsgStream.h"
22 #include "GaudiKernel/SystemOfUnits.h"
52 if(
name.find(
"::",0) == std::string::npos) {
62 std::string
name = p_element->getName();
63 std::string symbol = p_element->getSymbol();
64 double a = p_element->getA();
65 double z = p_element->getZ();
67 std::cout <<
" ***** CheckElement(): Print the Element: " <<
name <<
"\n";
68 std::cout <<
" ***** The Element: name, symbol, A, Z \n" ;
76 std::string
name = p_element->getName();
77 std::string symbol = p_element->getSymbol();
78 double a = p_element->getA();
79 double z = p_element->getZ();
81 std::cout <<
" ***** PrintElement(): Print the Element: " <<
name <<
"\n";
82 std::cout <<
" ***** The Element: name, symbol, A, Z \n";
90 std::string
name = p_material->getName();
93 std::cout <<
" ***** PrintMaterial(): Print the Material: " <<
name <<
"\n";
94 std::cout <<
" ***** The Material: name, density \n" ;
95 std::cout <<
" ***** "<<
name <<
" "<<density <<
" " << std::endl;
102 std::string
name = p_material->getName();
105 std::cout <<
" ***** PrintFullMaterial(): Print the Material: " <<
name <<
"\n";
106 std::cout <<
" ***** The Material: name, density\n" ;
107 std::cout <<
" ***** "<<
name <<
" "<<density <<
" " << std::endl;
110 int element_number = p_material->getNumElements();
113 if ( element_number == 0){
114 std::cout <<
" ***** No Elements now in this printMaterial( ) " << std::endl;
118 element_number = p_material->getNumElements();
120 for(
int i =0;
i< element_number;
i ++)
122 const GeoElement* tmp_element = p_material->getElement(
i);
123 double element_fraction = p_material->getFraction(
i);
125 std::cout<<
" ***** ***** Number: " <<
i <<
" Fraction: " << element_fraction<< std::endl;
137 throw std::runtime_error(
"RDBMaterialManager failed to read Geometry DB");
147 ATH_CHECK(pSvcLocator->service(
"GeoModelSvc",iGeoModel));
148 ATH_CHECK(pSvcLocator->service(
"RDBAccessSvc",iAccessSvc));
150 auto warn = [&](
const std::string &
msg){
151 if (
log.level()<=MSG::WARNING){
155 auto debug = [&](
const std::string &
msg){
162 return (loadDefaults and pRecordset->size() == 0);
165 if (loadDefaults)
debug(
"Will load material defaults if not present");
169 m_elements = iAccessSvc->getRecordsetPtr(
"Elements",keyAtlas.
tag(),keyAtlas.
node());
171 warn(
"Getting Elements with default tag");
172 m_elements = iAccessSvc->getRecordsetPtr(
"Elements",
"Materials-00",
"Materials");
176 warn(
"Getting StdMatComponents with default tag");
177 m_stdmatcomponents = iAccessSvc->getRecordsetPtr(
"StdMatComponents",
"Materials-00",
"Materials");
181 warn(
"Getting StdMaterials with default tag");
182 m_stdmaterials = iAccessSvc->getRecordsetPtr(
"StdMaterials",
"Materials-00",
"Materials");
189 warn(
"Getting PixMatComponents with default tag");
190 m_pixmatcomponents = iAccessSvc->getRecordsetPtr(
"PixMatComponents",
"PixMatComponents-00");
194 warn(
"Getting PixMaterials with default tag");
195 m_pixmaterials = iAccessSvc->getRecordsetPtr(
"PixMaterials",
"PixMaterials-00");
202 debug(
"Getting PixTBMatComponents with default tag" );
207 debug(
"Getting PixTBMaterials with default tag");
208 m_pixtbmaterials = iAccessSvc->getRecordsetPtr(
"PixMaterials",
"PixMaterials-00");
215 warn(
"Getting SCTMatComponents with default tag");
216 m_sctmatcomponents = iAccessSvc->getRecordsetPtr(
"SCTMatComponents",
"SCTMatComponents-00");
221 warn(
"Getting SCTMaterials with default tag");
222 m_sctmaterials = iAccessSvc->getRecordsetPtr(
"SCTMaterials",
"SCTMaterials-00");
229 warn(
"Getting TrtMatComponents with default tag");
230 m_trtmatcomponents = iAccessSvc->getRecordsetPtr(
"TrtMatComponents",
"TrtMatComponents-00");
234 warn(
"Getting TrtMaterials with default tag");
235 m_trtmaterials = iAccessSvc->getRecordsetPtr(
"TrtMaterials",
"TrtMaterials-00");
242 debug(
"Getting InDetMatComponents with default tag");
243 m_indetmatcomponents = iAccessSvc->getRecordsetPtr(
"InDetMatComponents",
"InDetMatComponents-00");
248 debug(
"Getting InDetMaterials with default tag");
249 m_indetmaterials = iAccessSvc->getRecordsetPtr(
"InDetMaterials",
"InDetMaterials-00");
256 warn(
"Getting LArMatComponents with default tag");
257 m_larmatcomponents = iAccessSvc->getRecordsetPtr(
"LArMatComponents",
"LArMatComponents-00");
261 warn(
"Getting LArMaterials with default tag");
262 m_larmaterials = iAccessSvc->getRecordsetPtr(
"LArMaterials",
"LArMaterials-00");
269 warn(
"Getting TileMatComponents with default tag" );
270 m_tilematcomponents = iAccessSvc->getRecordsetPtr(
"TileMatComponents",
"TileMatComponents-00");
274 warn(
"Getting TileMaterials with default tag");
275 m_tilematerials = iAccessSvc->getRecordsetPtr(
"TileMaterials",
"TileMaterials-00");
282 warn(
"Getting MUOMatComponents with default tag");
283 m_muomatcomponents = iAccessSvc->getRecordsetPtr(
"MUOMatComponents",
"MUOMatComponents-00");
287 warn(
"Getting MUOMaterials with default tag" );
288 m_muomaterials = iAccessSvc->getRecordsetPtr(
"MUOMaterials",
"MUOMaterials-00");
292 warn(
"Getting ShieldMatComponents with default tag");
297 warn(
"Getting ShieldMaterials with default tag");
298 m_shieldmaterials = iAccessSvc->getRecordsetPtr(
"ShieldMaterials",
"ShieldMaterials-00");
302 warn(
"Getting ToroMatComponents with default tag");
303 m_toromatcomponents = iAccessSvc->getRecordsetPtr(
"ToroMatComponents",
"ToroMatComponents-00");
307 warn(
"Getting ToroMaterials with default tag");
308 m_toromaterials = iAccessSvc->getRecordsetPtr(
"ToroMaterials",
"ToroMaterials-00");
310 return StatusCode::SUCCESS;
377 unsigned int ind{0}, com_ind{0};
379 std::string material_name;
380 std::string tmp_name;
382 double material_density{0.};
385 std::string component_name{};
386 double component_fraction{0.};
394 std::string matcomponents_table;
396 [[maybe_unused]]
static const bool specialMaterialsDone = [
this]() {
401 GeoMaterial* pmaterial;
403 const GeoElement* p_com_element;
414 if (pmaterial!=
nullptr)
417 if(
name.starts_with(
"std"))
422 data_id =
"STDMATERIALS_DATA_ID";
424 else if(
name.starts_with(
"trt"))
429 data_id =
"TRTMATERIALS_DATA_ID";
431 else if(
name.starts_with(
"LAr"))
436 data_id =
"LARMATERIALS_DATA_ID";
438 else if(
name.starts_with(
"muo"))
443 data_id =
"MUOMATERIALS_DATA_ID";
445 else if(
name.starts_with(
"pixtb"))
450 data_id =
"PIXELTBMATERIALS_DATA_ID";
452 else if(
name.starts_with(
"pix"))
457 data_id =
"PIXMATERIALS_DATA_ID";
459 else if(
name.starts_with(
"sct"))
464 data_id =
"SCTMATERIALS_DATA_ID";
466 else if(
name.starts_with(
"indet"))
471 data_id =
"INDETMATERIALS_DATA_ID";
473 else if(
name.starts_with(
"shield"))
478 data_id =
"SHIELDMATERIALS_DATA_ID";
480 else if(
name.starts_with(
"tile"))
485 data_id =
"TILEMATERIALS_DATA_ID";
487 else if(
name.starts_with(
"toro"))
492 data_id =
"TOROMATERIALS_DATA_ID";
496 for(
ind = 0;
ind < tmp_materials->size();
ind++)
501 if(
name == tmp_name){
503 material_id = rec->
getLong(data_id);
504 material_density = rec->
getDouble(
"DENSITY");
507 log <<
MSG::DEBUG <<
" ***** Material: name id density: " << material_name <<
" " << material_id <<
" "<< material_density <<
endmsg;
512 if (
ind == tmp_materials->size())
517 bool firstComponent =
true;
518 bool hasSubMaterial =
false;
519 bool calculateFraction =
false;
520 double totalFraction = 0.;
521 std::vector <const GeoElement*> elementComponents;
522 std::vector <double> elementFractions;
524 for( com_ind = 0; com_ind <tmp_matcomponents->size(); com_ind++)
526 const IRDBRecord* com_rec = (*tmp_matcomponents)[com_ind];
528 component_id = com_rec->
getLong(
"MATERIAL_ID");
529 if( component_id == material_id)
531 component_name = com_rec->
getString(
"COMPNAME");
532 component_fraction = com_rec->
getDouble(
"FRACTION");
536 firstComponent =
false;
537 if(component_fraction>=1.)
538 calculateFraction =
true;
545 if(calculateFraction)
547 totalFraction += component_fraction*p_com_element->getA();
548 elementComponents.push_back(p_com_element);
549 elementFractions.push_back(component_fraction);
552 pmaterial->add( p_com_element, component_fraction);
556 hasSubMaterial =
true;
557 const GeoMaterial* p_com_material =
getMaterial(component_name);
558 pmaterial->add(p_com_material, component_fraction);
564 if(calculateFraction && hasSubMaterial && elementComponents.size()>0)
565 std::cerr << material_name <<
" description should be changed. Please indicate the exact fraction for elements\n";
567 if(calculateFraction && !elementComponents.empty()) {
568 double inv_totalFraction = 1. / totalFraction;
569 for(
unsigned i=0;
i<elementComponents.size();
i++)
570 pmaterial->add(elementComponents[
i],elementFractions[
i]*elementComponents[
i]->getA() * inv_totalFraction);
585 std::string element_symbol;
586 std::string tmp_name;
591 GeoElement *pelement;
595 if (pelement !=
nullptr)
608 if(
name == tmp_name)
611 element_symbol = rec->
getString(
"SYMBOL");
635 std::string element_symbol;
640 GeoElement* pelement(0);
653 element_symbol = rec->
getString(
"SYMBOL");
676 std::string
key = std::string(material->getName());
679 log << MSG::WARNING <<
" Attempt to redefine material " <<
key <<
"!. The existing instance is kept. Please choose another name for new material" <<
endmsg;
703 o <<
"============Material Manager Element List========================\n";
710 for (
size_t i = 0;
i<
p.second->getNumElements();
i++) {
711 o <<
" ***** ***** "<<
int (
p.second->getFraction(
i)*100) <<
"% \t" <<
p.second->getElement(
i)->getName() << std::endl;
721 GeoElement* ethElement =
new GeoElement(
"Ether",
"ET",500.0,0.0);
723 GeoMaterial* ether =
new GeoMaterial(
"special::Ether",0.0);
724 ether->add(ethElement,1.);
727 GeoMaterial* hu =
new GeoMaterial(
"special::HyperUranium",0.0);
728 hu->add(ethElement,1.);