diff --git a/DDCore/include/Parsers/detail/Conversions.h b/DDCore/include/Parsers/detail/Conversions.h index 8903741b2d735202b3e4faa0fb91c4178f04cb38..6878f1148192948fc8994ebd9f37bbe6d7bf441b 100644 --- a/DDCore/include/Parsers/detail/Conversions.h +++ b/DDCore/include/Parsers/detail/Conversions.h @@ -18,7 +18,7 @@ * Note: Do NEVER include this file directly! * * Use the specific include files in the XML or JSON directory! - * Also NO header guards! + * */ diff --git a/DDCore/include/XML/UnicodeValues.h b/DDCore/include/XML/UnicodeValues.h index 792791d1ab912aeebc0901c19d33c852d48b9c9a..ec4f9786a29d27d7f4d708e491e4821aafbcda1d 100644 --- a/DDCore/include/XML/UnicodeValues.h +++ b/DDCore/include/XML/UnicodeValues.h @@ -225,6 +225,7 @@ UNICODE (idspecref); UNICODE (ignore); UNICODE (include); UNICODE (includes); +UNICODE (incguard); UNICODE (incoming_r); UNICODE (info); UNICODE (inner); diff --git a/DDCore/src/plugins/Compact2Objects.cpp b/DDCore/src/plugins/Compact2Objects.cpp index 9c5ba437fc1e5f86524a29d508ba4094988b2ed2..f4f6b8e280011731c588b7d5f0a0968c760b7ee9 100644 --- a/DDCore/src/plugins/Compact2Objects.cpp +++ b/DDCore/src/plugins/Compact2Objects.cpp @@ -29,6 +29,7 @@ #include <DD4hep/FieldTypes.h> #include <DD4hep/Printout.h> #include <DD4hep/Factories.h> +#include <DD4hep/Path.h> #include <DD4hep/Plugins.h> #include <DD4hep/detail/SegmentationsInterna.h> #include <DD4hep/detail/DetectorInterna.h> @@ -127,6 +128,7 @@ namespace { bool includes = false; bool matrix = false; bool surface = false; + bool include_guard= true; } s_debug; } @@ -268,6 +270,29 @@ static long load_Compact(Detector& description, xml_h element) { DECLARE_XML_DOC_READER(lccdd,load_Compact) DECLARE_XML_DOC_READER(compact,load_Compact) + // We create out own type to avoid a class over the extension types + // attached to the Detector as a set of std::string is common. +class ProcessedFilesSet: public std::set<std::string> {}; + +/// Check whether a XML file was already processed +bool check_process_file(Detector& description, std::string filename) { + + // In order to have a global compact that is kept across plugin invocations + // we add it as an extension to the the detector description. + auto already_processed = description.extension<ProcessedFilesSet>( false ); + if ( !already_processed ) { + already_processed = new ProcessedFilesSet( ); + description.addExtension<ProcessedFilesSet>(already_processed ); + } + std::string npath = dd4hep::Path{filename}.normalize(); + if (already_processed->find(npath) != already_processed->end() ) { + printout(INFO, "Compact","++ Already processed xml document %s.", npath.c_str()); + return true; + } + already_processed->insert(npath); + return false; +} + /** Convert parser debug flags. */ template <> void Converter<Debug>::operator()(xml_h e) const { @@ -287,6 +312,8 @@ template <> void Converter<Debug>::operator()(xml_h e) const { else if ( nam.substr(0,6) == "includ" ) s_debug.includes = (0 != val); else if ( nam.substr(0,6) == "matrix" ) s_debug.matrix = (0 != val); else if ( nam.substr(0,6) == "surfac" ) s_debug.surface = (0 != val); + else if ( nam.substr(0,6) == "incgua" ) s_debug.include_guard= (0 != val); + } } @@ -1383,6 +1410,11 @@ template <> void Converter<DetElement>::operator()(xml_h element) const { /// Read material entries from a seperate file in one of the include sections of the geometry template <> void Converter<IncludeFile>::operator()(xml_h element) const { xml::DocumentHolder doc(xml::DocumentHandler().load(element, element.attr_value(_U(ref)))); + if ( s_debug.include_guard) { + // Include guard, we check whether this file was already processed + if (check_process_file(description, doc.uri())) + return; + } xml_h root = doc.root(); if ( s_debug.includes ) { printout(ALWAYS, "Compact","++ Processing xml document %s.",doc.uri().c_str()); @@ -1484,6 +1516,11 @@ template <> void Converter<DetElementInclude>::operator()(xml_h element) const { string type = element.hasAttr(_U(type)) ? element.attr<string>(_U(type)) : string("xml"); if ( type == "xml" ) { xml::DocumentHolder doc(xml::DocumentHandler().load(element, element.attr_value(_U(ref)))); + if ( s_debug.include_guard ) { + // Include guard, we check whether this file was already processed + if (check_process_file(description, doc.uri())) + return; + } if ( s_debug.includes ) { printout(ALWAYS, "Compact","++ Processing xml document %s.",doc.uri().c_str()); }