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;
252 [[maybe_unused]]
static const bool specialMaterialsDone = [
this]() {
263 size_t pos = name.find(
"::");
264 if(pos==std::string::npos) {
266 <<
". Must be detector::material");
270 const std::string detector = name.substr(0,pos);
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()) {
289 ATH_MSG_VERBOSE(detector <<
" materials retrieved from the database don't include " << name);
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);
300 pmaterial =
new GeoMaterial( material_name,material_density * (GeoModelKernelUnits::gram / Gaudi::Units::cm3));
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);