diff --git a/geom/gdml/src/TGDMLParse.cxx b/geom/gdml/src/TGDMLParse.cxx index 2b1722e0e3be7..5c3f9e5792671 100644 --- a/geom/gdml/src/TGDMLParse.cxx +++ b/geom/gdml/src/TGDMLParse.cxx @@ -1310,7 +1310,6 @@ XMLNodePointer_t TGDMLParse::MatProcess(TXMLEngine *gdml, XMLNodePointer_t node, TGeoMixture *mix = nullptr; TGeoMaterial *mat = nullptr; TString tempconst = ""; - TString matname; Bool_t composite = kFALSE; if (z == 1) { @@ -1546,17 +1545,21 @@ XMLNodePointer_t TGDMLParse::MatProcess(TXMLEngine *gdml, XMLNodePointer_t node, Double_t weight; for (fractions f = fracmap.begin(); f != fracmap.end(); ++f) { - matname = f->first; - matname = NameShort(matname); - - TGeoMaterial *mattmp = (TGeoMaterial *)gGeoManager->GetListOfMaterials()->FindObject(matname); + TGeoMaterial *mattmp = nullptr; + auto material = fmatmap.find(f->first); + if (material != fmatmap.end()) + mattmp = (TGeoMaterial *)material->second; + else { + auto mixture = fmixmap.find(f->first); + if (mixture != fmixmap.end()) + mattmp = (TGeoMixture *)mixture->second; + } + auto element = felemap.find(f->first); - if (mattmp || (felemap.find(f->first) != felemap.end())) { + if ((composite && element != felemap.end()) || (!composite && (mattmp || element != felemap.end()))) { if (composite) { natoms = (Int_t)f->second; - - mix->AddElement(felemap[f->first], natoms); - + mix->AddElement((TGeoElement *)element->second, natoms); } else { @@ -1564,7 +1567,7 @@ XMLNodePointer_t TGDMLParse::MatProcess(TXMLEngine *gdml, XMLNodePointer_t node, if (mattmp) { mix->AddElement(mattmp, weight); } else { - mix->AddElement(felemap[f->first], weight); + mix->AddElement((TGeoElement *)element->second, weight); } } } @@ -1573,13 +1576,16 @@ XMLNodePointer_t TGDMLParse::MatProcess(TXMLEngine *gdml, XMLNodePointer_t node, medid = medid + 1; + if (mixflag == 1) + fmixmap[local_name.Data()] = mix; + else if (mixflag == 0) + fmatmap[local_name.Data()] = mat; + TGeoMedium *med = mgr->GetMedium(NameShort(name)); if (!med) { if (mixflag == 1) { - fmixmap[local_name.Data()] = mix; med = new TGeoMedium(NameShort(name), medid, mix); } else if (mixflag == 0) { - fmatmap[local_name.Data()] = mat; med = new TGeoMedium(NameShort(name), medid, mat); } } else if (gDebug >= 2) { diff --git a/geom/test/CMakeLists.txt b/geom/test/CMakeLists.txt index a84b150d21dfc..1101f8aa8ad69 100644 --- a/geom/test/CMakeLists.txt +++ b/geom/test/CMakeLists.txt @@ -6,9 +6,13 @@ if(gdml) configure_file(no_extrusion.gdml no_extrusion.gdml COPYONLY) + configure_file(material_name_collision.gdml material_name_collision.gdml COPYONLY) ROOT_ADD_GTEST(material_units test_material_units.cxx LIBRARIES Geom) + ROOT_ADD_GTEST(gdml_material_name_collision + test_gdml_material_name_collision.cxx + LIBRARIES Geom) ROOT_ADD_GTEST(boolean_extrusion test_boolean_extrusion.cxx LIBRARIES Geom GeomChecker) diff --git a/geom/test/material_name_collision.gdml b/geom/test/material_name_collision.gdml new file mode 100644 index 0000000000000..be03e2aace6d8 --- /dev/null +++ b/geom/test/material_name_collision.gdml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/geom/test/test_gdml_material_name_collision.cxx b/geom/test/test_gdml_material_name_collision.cxx new file mode 100644 index 0000000000000..0c8042ff04d5f --- /dev/null +++ b/geom/test/test_gdml_material_name_collision.cxx @@ -0,0 +1,29 @@ +#include + +#include +#include +#include + +TEST(Geometry, GDMLMaterialElementNameCollision) +{ + auto geom = TGeoManager::Import("material_name_collision.gdml"); + ASSERT_NE(geom, nullptr); + + auto iron = geom->GetMaterial("Iron"); + ASSERT_NE(iron, nullptr); + ASSERT_TRUE(iron->IsMixture()); + auto ironMixture = static_cast(iron); + ASSERT_EQ(iron->GetNelements(), 1); + EXPECT_STREQ(iron->GetElement(0)->GetName(), "FE"); + EXPECT_DOUBLE_EQ(ironMixture->GetWmixt()[0], 1.0); + + auto alloy = geom->GetMaterial("Alloy"); + ASSERT_NE(alloy, nullptr); + ASSERT_TRUE(alloy->IsMixture()); + auto alloyMixture = static_cast(alloy); + ASSERT_EQ(alloy->GetNelements(), 2); + EXPECT_STREQ(alloy->GetElement(0)->GetName(), "FE"); + EXPECT_STREQ(alloy->GetElement(1)->GetName(), "NI"); + EXPECT_DOUBLE_EQ(alloyMixture->GetWmixt()[0], 0.5); + EXPECT_DOUBLE_EQ(alloyMixture->GetWmixt()[1], 0.5); +}