diff --git a/DDCore/include/Parsers/detail/Conversions.h b/DDCore/include/Parsers/detail/Conversions.h index f764136fc435854787337d1bdaa262e591231d56..39d83e44f2b483b7d4da1722ce15cfab28dc8d31 100644 --- a/DDCore/include/Parsers/detail/Conversions.h +++ b/DDCore/include/Parsers/detail/Conversions.h @@ -44,13 +44,18 @@ namespace dd4hep { * \ingroup DD4HEP_XML */ template <typename T, typename ARG=DD4HEP_CONVERSION_NS::Handle_t> struct Converter { - typedef T to_type; - typedef void* user_param; + public: + typedef T to_type; + typedef Converter<T,ARG> self_type; + typedef void* user_param; + public: /// Reference to the detector description object Detector& description; /// Reference to optional user defined parameter user_param param; + /// Reference to second optional user defined parameter user_param optional; + public: /// Initializing constructor of the functor Converter(Detector& l) : description(l), param(0), optional(0) { } /// Initializing constructor of the functor with initialization of the user parameter diff --git a/DDCore/include/XML/UnicodeValues.h b/DDCore/include/XML/UnicodeValues.h index ec2da27df565d8bfb6fb1296080b7a2cd7562695..70aac776ef997d89657e6481eb6151d6bad45fa9 100644 --- a/DDCore/include/XML/UnicodeValues.h +++ b/DDCore/include/XML/UnicodeValues.h @@ -79,6 +79,7 @@ UNICODE (comment); UNICODE (component); UNICODE (composite); UNICODE (cone); +UNICODE (config); UNICODE (cons); UNICODE (constant); UNICODE (crossing_angle); diff --git a/examples/DDDB/include/DDDB/DDDBHelper.h b/examples/DDDB/include/DDDB/DDDBHelper.h index 1c50a756e00de2ec128edb367d0899a9ff6f81c9..803253227aa47ff7d34c77079802b20c38710e21 100644 --- a/examples/DDDB/include/DDDB/DDDBHelper.h +++ b/examples/DDDB/include/DDDB/DDDBHelper.h @@ -79,6 +79,7 @@ namespace dd4hep { void addVisAttr(const std::string& path, VisAttr attr); /// Add new conditions entry bool addConditionEntry(const std::string& val, DetElement det, const std::string& item); + /// Access conditions entry std::pair<DetElement,std::string> getConditionEntry(const std::string& item) const; diff --git a/examples/DDDB/include/DDDB/DDDBReader.h b/examples/DDDB/include/DDDB/DDDBReader.h index 45e693ef6fdfb02e62bf83ee6f300a060d00dfc3..70a2e393a2704cd058884a7f6e086bf13f710ce6 100644 --- a/examples/DDDB/include/DDDB/DDDBReader.h +++ b/examples/DDDB/include/DDDB/DDDBReader.h @@ -24,6 +24,8 @@ #include "DDDB/DDDBReaderContext.h" #include "DD4hep/ComponentProperties.h" +/// C++ include files +#include <set> /// Namespace for the AIDA detector description toolkit namespace dd4hep { @@ -74,9 +76,20 @@ namespace dd4hep { /// Read raw XML object from the database / file virtual int getObject(const std::string& system_id, UserContext* ctxt, std::string& data) = 0; + + /** Helpers for selective parsing */ + /// Add a blocked path entry + void blockPath(const std::string& path); + /// Check if a URI path is blocked + bool isBlocked(const std::string& path) const; + protected: + /// File directory std::string m_directory; + /// URI match string to invoke entity resolution std::string m_match; + /// Blocked URI pathes + std::set<std::string> m_blockedPathes; /// Reader context DDDBReaderContext m_context; }; diff --git a/examples/DDDB/include/DDDB/DDDBTags.h b/examples/DDDB/include/DDDB/DDDBTags.h index 248f0669a7c14a985aaeff67feb713c2d2b0c81f..87aea01711450c88b3080aafbf0abbee69b9dd09 100644 --- a/examples/DDDB/include/DDDB/DDDBTags.h +++ b/examples/DDDB/include/DDDB/DDDBTags.h @@ -38,6 +38,8 @@ namespace dd4hep { UNICODE(alp2); UNICODE(author); + UNICODE(block); + UNICODE(catalog); UNICODE(catalogref); UNICODE(classID); diff --git a/examples/DDDB/src/DDDBHelper.cpp b/examples/DDDB/src/DDDBHelper.cpp index 141132be80efd2d75f8c3092a865343a499e742d..1994138dc27e02330c66ff07fe006a02b1583a4d 100644 --- a/examples/DDDB/src/DDDBHelper.cpp +++ b/examples/DDDB/src/DDDBHelper.cpp @@ -98,3 +98,4 @@ std::pair<DetElement,std::string> DDDBHelper::getConditionEntry(const std::strin return (*i).second; return make_pair(DetElement(),""); } + diff --git a/examples/DDDB/src/DDDBReader.cpp b/examples/DDDB/src/DDDBReader.cpp index d89eb325194742c194ef31a9187e9c0465e6c853..facc380dc4c34a7fb74e5e81ef2376e53e50c89a 100644 --- a/examples/DDDB/src/DDDBReader.cpp +++ b/examples/DDDB/src/DDDBReader.cpp @@ -55,7 +55,11 @@ bool DDDBReader::load(const string& system_id, UserContext* ctxt, string& buffer) { - if ( system_id.substr(0,m_match.length()) == m_match ) { + if ( isBlocked(system_id) ) { + buffer = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?> <DDDB></DDDB>"; + return true; + } + else if ( system_id.substr(0,m_match.length()) == m_match ) { string mm = m_match + "//"; size_t mm_len = mm.length(); const string& sys = system_id; @@ -88,3 +92,16 @@ void DDDBReader::parserLoaded(const std::string& /* system_id */, UserContext* c c->valid_since = c->event_time; c->valid_until = c->event_time; } + +/// Add a blocked path entry +void DDDBReader::blockPath(const std::string& path) { + m_blockedPathes.insert(path); +} + +/// Check if a URI path is blocked +bool DDDBReader::isBlocked(const std::string& path) const { + for(const auto& p : m_blockedPathes) { + if ( path.find(p) != string::npos ) return true; + } + return false; +} diff --git a/examples/DDDB/src/plugins/CondDB2DDDB.cpp b/examples/DDDB/src/plugins/CondDB2DDDB.cpp index 4638760ef0c3df5f297baf4c42f73b9690752e30..85151688aa87f1f4a236c75306980a02913a0982 100644 --- a/examples/DDDB/src/plugins/CondDB2DDDB.cpp +++ b/examples/DDDB/src/plugins/CondDB2DDDB.cpp @@ -22,8 +22,9 @@ #include "DD4hep/Alignments.h" #include "DD4hep/OpaqueDataBinder.h" #include "DDDB/DDDBTags.h" -#include "DDDB/DDDBDimension.h" #include "DDDB/DDDBHelper.h" +#include "DDDB/DDDBReader.h" +#include "DDDB/DDDBDimension.h" #include "DDDB/DDDBConversion.h" #include "Math/Polar2D.h" @@ -58,6 +59,8 @@ namespace dd4hep { struct DDDBConditionInfo {}; struct DDDBDetElem {}; struct DDDBParam {}; + struct DDDBBlock {}; + struct DDDBConfig {}; struct DDDBParameter {}; struct DDDBGeometryInfo {}; struct DDDBConditionParam {}; @@ -154,46 +157,32 @@ namespace dd4hep { }; public: - Detector& description; - xml::UriReader* resolver; - dddb* geo; + Detector* description = 0; + DDDBReader* resolver = 0; + dddb* geo = 0; Locals locals; - bool check; - bool print_xml; - bool print_docs; - bool print_materials; - bool print_logvol; - bool print_shapes; - bool print_physvol; - bool print_params; - bool print_detelem; - bool print_detelem_ref; - bool print_detelem_xml; - bool print_condition; - bool print_condition_ref; - bool print_catalog; - bool print_catalog_ref; - bool print_tabprop; + bool check = true; + bool print_xml = false; + bool print_file_load = false; + bool print_docs = false; + bool print_materials = false; + bool print_logvol = false; + bool print_shapes = false; + bool print_physvol = false; + bool print_params = false; + bool print_detelem = false; + bool print_detelem_ref = false; + bool print_detelem_xml = false; + bool print_condition = false; + bool print_condition_ref = false; + bool print_catalog = false; + bool print_catalog_ref = false; + bool print_tabprop = false; /// Default constructor - DDDBContext(Detector& l) - : description(l), resolver(0), geo(0), check(true), - print_xml(false), - print_docs(false), - print_materials(false), - print_logvol(false), - print_shapes(false), - print_physvol(false), - print_params(false), - print_detelem(false), - print_detelem_ref(false), - print_detelem_xml(false), - print_condition(false), - print_condition_ref(false), - print_catalog(false), - print_catalog_ref(false), - print_tabprop(false) - { } + DDDBContext() = default; + /// Initializing constructor + DDDBContext(Detector* d); /// Default destructor ~DDDBContext() { } @@ -244,8 +233,15 @@ namespace dd4hep { } geo->conditionPaths[path] = object.ptr(); } - }; + } s_config; + + /// Initializing constructor + DDDBContext::DDDBContext(Detector* d) { + *this = s_config; + description = d; + } + /// Converter to incept processing exceptions /** \ingroup DD4HEP_DDDB */ @@ -317,6 +313,8 @@ namespace dd4hep { template <> void Conv<DDDBZPlane>::convert(xml_h element) const; template <> void Conv<dddb>::convert(xml_h element) const; template <> void Conv<DDDBLogVol>::convert(xml_h element) const; + template <> void Conv<DDDBBlock>::convert(xml_h element) const; + template <> void Conv<DDDBConfig>::convert(xml_h element) const; template <> void Conv<DDDBLogVolRef>::convert(xml_h element) const; template <> void Conv<DDDBPhysVol>::convert(xml_h element) const; template <> void Conv<DDDBParamPhysVol>::convert(xml_h element) const; @@ -445,14 +443,17 @@ namespace dd4hep { } void fixCatalogs(DDDBContext* context) { - dddb* geo = context->geo; + dddb* geo = context->geo; + DDDBReader* rdr = context->resolver; for(dddb::Catalogs::iterator i=geo->catalogs.begin(); i!=geo->catalogs.end(); ++i) { DDDBCatalog* det = (*i).second; for(dddb::Catalogs::iterator j=det->catalogrefs.begin(); j!=det->catalogrefs.end(); ++j) { const string& child_id = (*j).first; dddb::Catalogs::const_iterator k = geo->catalogs.find(child_id); if ( k == geo->catalogs.end() ) { - printout(ERROR,"fixCatalogs","++ MISSING ID: %s child:%s",det->id.c_str(),child_id.c_str()); + if ( !rdr->isBlocked(child_id) ) { + printout(ERROR,"fixCatalogs","++ MISSING ID: %s child:%s",det->id.c_str(),child_id.c_str()); + } continue; } DDDBCatalog* c = (*k).second; @@ -464,12 +465,16 @@ namespace dd4hep { for(dddb::Volumes::iterator j=det->logvolrefs.begin(); j!=det->logvolrefs.end(); ++j) { DDDBLogVol* c = (*j).second; if ( !c ) { - printout(ERROR,"fixCatalogs","++ MISSING Volume: %s child:%s",det->id.c_str(),(*j).first.c_str()); + if ( !rdr->isBlocked(det->id) ) { + printout(ERROR,"fixCatalogs","++ MISSING Volume: %s child:%s",det->id.c_str(),(*j).first.c_str()); + } continue; } dddb::Volumes::const_iterator k = geo->volumes.find(c->id); if ( k == geo->volumes.end() ) { - printout(ERROR,"fixCatalogs","++ MISSING VolID: %s child:%s",det->id.c_str(),c->id.c_str()); + if ( !rdr->isBlocked(det->id) ) { + printout(ERROR,"fixCatalogs","++ MISSING VolID: %s child:%s",det->id.c_str(),c->id.c_str()); + } } det->logvols[c->name] = c; if ( 0 == (*j).second ) { @@ -758,6 +763,52 @@ namespace dd4hep { det->params[name] = make_pair(type,value); } + /// Specialized conversion of <param/> entities + template <> void Conv<DDDBBlock>::convert(xml_h element) const { + DDDBContext* context = _param<DDDBContext>(); + context->resolver->blockPath(element.attr<string>(_U(name))); + } + + /// Specialized conversion of <param/> entities + template <> void Conv<DDDBConfig>::convert(xml_h element) const { + DDDBContext* ctx = &s_config; + for(xml_coll_t c(element,_U(param)); c; ++c) { + xml_dim_t p = c; + if ( p.nameStr() == "print_file_load" ) + ctx->print_file_load = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_xml" ) + ctx->print_xml = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_docs" ) + ctx->print_docs = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_materials" ) + ctx->print_materials = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_logvol" ) + ctx->print_logvol = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_shapes" ) + ctx->print_shapes = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_physvol" ) + ctx->print_physvol = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_params" ) + ctx->print_params = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_detelem" ) + ctx->print_detelem = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_detelem_ref" ) + ctx->print_detelem_ref = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_detelem_xml" ) + ctx->print_detelem_xml = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_condition" ) + ctx->print_condition = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_condition_ref" ) + ctx->print_condition_ref = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_catalog" ) + ctx->print_catalog = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_catalog_ref" ) + ctx->print_catalog_ref = p.attr<bool>(_U(value)); + else if ( p.nameStr() == "print_tabprop" ) + ctx->print_tabprop = p.attr<bool>(_U(value)); + } + } + /// Specialized conversion of <ConditionInfo/> entities template <> void Conv<DDDBConditionInfo>::convert(xml_h element) const { DDDBCatalog* det = _option<DDDBCatalog>(); @@ -1562,6 +1613,8 @@ namespace dd4hep { template <> void Conv<dddb>::convert(xml_h e) const { DDDBCatalog* catalog = 0; DDDBContext* context = _param<DDDBContext>(); + xml_coll_t(e, _LBU(block)).for_each(Conv<DDDBBlock>(description,context,catalog)); + xml_coll_t(e, _U(config)).for_each(Conv<DDDBConfig>(description,context,catalog)); xml_coll_t(e, _U(parameter)).for_each(Conv<DDDBParameter>(description,context,catalog)); xml_coll_t(e, _U(isotope)).for_each(Conv<DDDBIsotope>(description,context,catalog)); xml_coll_t(e, _U(element)).for_each(Conv<DDDBElement>(description,context,catalog)); @@ -1733,7 +1786,7 @@ namespace dd4hep { size_t hash = ref.find("#"); if ( hash != 0 ) { try { - xml::UriReader* rdr = context->resolver; + DDDBReader* rdr = context->resolver; DDDBReaderContext* ctx = (DDDBReaderContext*)rdr->context(); string doc_path = element.ptr() ? reference_href(element,ref) : ref; if ( ref == ctx->match+"/Conditions/Online" ) @@ -1766,41 +1819,46 @@ namespace dd4hep { xml_doc->context.valid_until = 0;//ctx->valid_until; docs.insert(make_pair(doc_path,xml_doc->addRef())); - xml::UriContextReader reader(rdr, &xml_doc->context); - xml_doc_holder_t doc(xml_handler_t().load(fp, &reader)); - xml_h e = doc.root(); - context->print(xml_doc); - //if ( str_upper(doc_path).find("/VP/") != string::npos ) - printout(DEBUG,"load_dddb","Loading document: %s IOV: %ld [%ld,%ld]", - xml_doc->id.c_str(), - xml_doc->context.event_time, - xml_doc->context.valid_since, - xml_doc->context.valid_until); - - if ( e ) { - if ( !key.empty() ) { - stringstream str; - xml::dump_tree(e, str); - string buffer = str.str(); - while( (idx=buffer.find("-KEY-")) != string::npos ) - buffer.replace(idx,5,key); - doc.assign(xml_handler_t().parse(buffer.c_str(), - buffer.length(), - doc_path.c_str(), - &reader)); - e = doc.root(); + if ( !rdr->isBlocked(doc_path) ) { + xml::UriContextReader reader(rdr, &xml_doc->context); + xml_doc_holder_t doc(xml_handler_t().load(fp, &reader)); + xml_h e = doc.root(); + context->print(xml_doc); + printout(context->print_file_load ? INFO : DEBUG, + "load_dddb","Loading document: %s IOV: %ld [%ld,%ld]", + xml_doc->id.c_str(), + xml_doc->context.event_time, + xml_doc->context.valid_since, + xml_doc->context.valid_until); + + if ( e ) { + if ( !key.empty() ) { + stringstream str; + xml::dump_tree(e, str); + string buffer = str.str(); + while( (idx=buffer.find("-KEY-")) != string::npos ) + buffer.replace(idx,5,key); + doc.assign(xml_handler_t().parse(buffer.c_str(), + buffer.length(), + doc_path.c_str(), + &reader)); + e = doc.root(); + } + DDDBContext::PreservedLocals locals(context); + context->locals.xml_doc = xml_doc; + Conv<ACTION> converter(*context->description, context, catalog); + context->print_condition = prt; + if ( prt || context->print_xml ) xml::dump_tree(e); + converter(e); } - DDDBContext::PreservedLocals locals(context); - context->locals.xml_doc = xml_doc; - Conv<ACTION> converter(context->description, context, catalog); - context->print_condition = prt; - if ( prt || context->print_xml ) xml::dump_tree(e); - converter(e); + return; } + printout(context->print_file_load ? INFO : DEBUG, + "load_dddb","Ignore BLOCKED load %s",ref.c_str()); } catch(const exception& e) { - printout(INFO,"load_dddb","Failed to load %s [%s]",ref.c_str(),e.what()); - } + printout(INFO,"load_dddb","Failed to load %s [%s]",ref.c_str(),e.what()); + } catch(...) { printout(INFO,"load_dddb","Failed to load %s",ref.c_str()); } @@ -1808,9 +1866,10 @@ namespace dd4hep { } void config_context(DDDBContext& context, - xml::UriReader* rdr, + DDDBHelper* hlp, const std::string& doc_path, const std::string& obj_path) { + DDDBReader* rdr = hlp->reader<DDDBReader>(); DDDBReaderContext* ctx = (DDDBReaderContext*)rdr->context(); DDDBDocument* doc = new DDDBDocument(); doc->name = obj_path; @@ -1823,21 +1882,6 @@ namespace dd4hep { context.locals.obj_path = obj_path; context.locals.xml_doc = doc; context.geo->documents.insert(make_pair("Initial_dummy_doc",doc->addRef())); - context.print_xml = false; - - context.print_docs = false; - context.print_materials = false; - context.print_logvol = false; - context.print_shapes = false; - context.print_physvol = false; - context.print_params = false; - context.print_detelem = false; - context.print_detelem_ref = false; - context.print_detelem_xml = false; - context.print_condition = false; - context.print_condition_ref = false; - context.print_catalog = false; - context.print_catalog_ref = false; } /// Plugin entry point. @@ -1847,7 +1891,7 @@ namespace dd4hep { if ( hlp ) { xml::UriReader* rdr = hlp->xmlReader(); DDDBReaderContext* ctx = (DDDBReaderContext*)rdr->context(); - DDDBContext ctxt(description); + DDDBContext ctxt(&description); string sys_id = ctx->match+"//lhcb.xml"; string obj_path = "/"; if ( argc == 0 ) { @@ -1873,7 +1917,7 @@ namespace dd4hep { ctx->valid_since = iov_start; ctx->valid_until = iov_end; } - config_context(ctxt, rdr, sys_id, obj_path); + config_context(ctxt, hlp, sys_id, obj_path); load_dddb_entity<ACTION>(&ctxt,0,0,ctxt.locals.xml_doc->id); checkParents( &ctxt ); fixCatalogs( &ctxt ); @@ -1898,10 +1942,10 @@ namespace dd4hep { long load_dddb_from_handle(Detector& description, xml_h element) { DDDBHelper* helper = description.extension<DDDBHelper>(false); if ( helper ) { - DDDBContext context(description); + DDDBContext context(&description); xml::UriReader* rdr = helper->xmlReader(); DDDBReaderContext* ctx = (DDDBReaderContext*)rdr->context(); - config_context(context, helper->xmlReader(), ctx->match+"//lhcb.xml", "/"); + config_context(context, helper, ctx->match+"//lhcb.xml", "/"); /// Convert the XML information Conv<dddb> converter(description, &context); converter( element ); diff --git a/examples/DDDB/src/plugins/DDDB2Objects.cpp b/examples/DDDB/src/plugins/DDDB2Objects.cpp index 5ae1987871bc7287e026617558efc543d79bfc99..4f7aa6d5139f5db7b9e3b784ac25800b088b4c67 100644 --- a/examples/DDDB/src/plugins/DDDB2Objects.cpp +++ b/examples/DDDB/src/plugins/DDDB2Objects.cpp @@ -19,8 +19,9 @@ // Framework includes #include "DDDB/DDDBTags.h" -#include "DDDB/DDDBDimension.h" #include "DDDB/DDDBHelper.h" +#include "DDDB/DDDBReader.h" +#include "DDDB/DDDBDimension.h" #include "DDDB/DDDBConversion.h" #include "DD4hep/Detector.h" @@ -62,7 +63,8 @@ namespace dd4hep { struct Context { typedef set<string> StringSet; - Context(Detector& l, dddb* g) : description(l), geo(g) { + Context(Detector& l, DDDB::DDDBHelper* h) : description(l), geo(h->detectorDescription()), helper(h) { + reader = h->reader<DDDB::DDDBReader>(); } ~Context() { //printout(INFO,"Context","Destructor calling...."); @@ -77,6 +79,7 @@ namespace dd4hep { Detector& description; DDDB::dddb* geo = 0; DDDB::DDDBHelper* helper = 0; + DDDB::DDDBReader* reader = 0; typedef std::map<DDDBIsotope*, TGeoIsotope*> Isotopes; typedef std::map<DDDBElement*, TGeoElement*> Elements; typedef std::map<DDDBMaterial*, TGeoMedium*> Materials; @@ -162,8 +165,9 @@ namespace dd4hep { } }; - template <typename T> struct CNV : Converter<T,T*> { + template <typename T> struct CNV : public Converter<T,T*> { public: + typedef Converter<T,T*> Base_t; /// Initializing constructor of the functor with initialization of the user parameter CNV(Detector& l, void* p, void* o=0) : Converter<T,T*>(l,p,o) {} template<typename Q> CNV<Q> cnv() const { return CNV<Q>(this->description,this->param,this->optional); } @@ -180,6 +184,9 @@ namespace dd4hep { operator()(arg.second); return; } + Context* c = (Context*)this->Base_t::param;//_param<Context>(); + if ( c && c->reader && c->reader->isBlocked(arg.first) ) + return; printout(INFO,typeName(typeid(T)),"SKIP invalid object: %s",arg.first.c_str()); } catch(const exception& e) { @@ -212,8 +219,8 @@ namespace dd4hep { template <> void* CNV<GeoCondition>::convert(GeoCondition *obj) const { if ( obj ) { typedef IOV::Key _K; - Context* context = _param<Context>(); - Condition cond = obj; + Context* context = _param<Context>(); + Condition cond = obj; AbstractMap& d = cond.get<AbstractMap>(); DDDBDocument* doc = d.option<DDDBDocument>(); _K::first_type since = doc->context.valid_since; @@ -610,6 +617,8 @@ namespace dd4hep { if ( !place.isValid() ) { Volume daughter = this->get<Volume>(pv->logvol); if ( !daughter.isValid() ) { + if ( context->reader && context->reader->isBlocked(pv->c_id()) ) + continue; printout(WARNING,"Cnv<PhysVol>","++ Failed to convert placement: %s." " Unknown daughter vol:%s.",pv->c_id(), pv->logvol.c_str()); continue; @@ -1047,8 +1056,7 @@ namespace dd4hep { long dddb_2_dd4hep(Detector& description, int , char** ) { DDDBHelper* helper = description.extension<DDDBHelper>(false); if ( helper ) { - Context context(description, helper->detectorDescription()); - context.helper = helper; + Context context(description, helper); context.print_materials = false; context.print_logvol = false; context.print_shapes = false; @@ -1089,8 +1097,7 @@ namespace dd4hep { long dddb_conditions_2_dd4hep(Detector& description, int , char** ) { DDDBHelper* helper = description.extension<DDDBHelper>(false); if ( helper ) { - Context context(description, helper->detectorDescription()); - context.helper = helper; + Context context(description, helper); context.print_conditions = false; context.conditions_only = true; CNV<dddb> cnv(description,&context);