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);
+}