diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a79c4a79956659f8a4b1762d6346a7ee96aeb69..fd800f939887c7fd5c84c6dc76db2218a5307f74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,6 +112,7 @@ add_subdirectory(DDG4) add_subdirectory(DDCond) add_subdirectory(DDAlign) add_subdirectory(DDEve) +add_subdirectory(DDDB) dd4hep_enable_tests( DDTest ) add_subdirectory(UtilityApps) diff --git a/DDCore/include/DD4hep/AlignmentData.h b/DDCore/include/DD4hep/AlignmentData.h index 655ce30356e19f44d86ab9c9f2bb2b6165a2ac81..14b04f30e5ed03bddf869b9d465d1d72d8a5c5e3 100644 --- a/DDCore/include/DD4hep/AlignmentData.h +++ b/DDCore/include/DD4hep/AlignmentData.h @@ -115,8 +115,12 @@ namespace DD4hep { public: /// Standard constructor AlignmentData(); + /// Copy constructor + AlignmentData(const AlignmentData& copy); /// Default destructor virtual ~AlignmentData(); + /// Assignment operator necessary due to copy constructor + AlignmentData& operator=(const AlignmentData& copy); /// Data accessor for decorator inline AlignmentData& alignmentData() { return *this; } diff --git a/DDCore/include/DD4hep/Handle.h b/DDCore/include/DD4hep/Handle.h index 7fa77805027a46a128b095acab8409b3b3202811..2c24816f2f02e997eac5bac5c0cef8451d1b175f 100644 --- a/DDCore/include/DD4hep/Handle.h +++ b/DDCore/include/DD4hep/Handle.h @@ -176,15 +176,15 @@ namespace DD4hep { return *(Q*) m_element; } /// Checked object access. Throws invalid handle runtime exception - T* access() const throw(std::exception); + T* access() const; /// Verify the object type after a (re-)assignment - void verifyObject() const throw(std::exception); + void verifyObject() const; /// Access the object name (or "" if not supported by the object) const char* name() const; /// Assign a new named object. Note: object references must be managed by the user void assign(Implementation* n, const std::string& nam, const std::string& title); /// Helper routine called when unrelated types are assigned. - static void bad_assignment(const std::type_info& from, const std::type_info& to) throw(std::exception); + static void bad_assignment(const std::type_info& from, const std::type_info& to); }; /// Default Ref_t definition describing named objects \ingroup DD4HEP_GEOMETRY typedef Handle<NamedObject> Ref_t; diff --git a/DDCore/include/DD4hep/Handle.inl b/DDCore/include/DD4hep/Handle.inl index de5189870c03b8d24dd1e267046ba08d99b7d050..023fcebd4e5b5a4b339ed4095c354c5dedf0e8f1 100644 --- a/DDCore/include/DD4hep/Handle.inl +++ b/DDCore/include/DD4hep/Handle.inl @@ -20,7 +20,6 @@ namespace DD4hep { /// Helper routine called when unrelated types are assigned. template <typename T> void Handle<T>::bad_assignment(const std::type_info& from, const std::type_info& to) - throw(std::exception) { invalidHandleAssignmentError(from,to); } @@ -40,7 +39,7 @@ namespace DD4hep { } /// Checked object access. Throws invalid handle runtime exception - template <typename T> T* Handle<T>::access() const throw(std::exception) { + template <typename T> T* Handle<T>::access() const { if ( this->m_element ) return this->m_element; invalidHandleError(typeid(T)); return 0; // We have thrown an exception before - does not harm! @@ -50,9 +49,7 @@ namespace DD4hep { #define DD4HEP_INSTANTIATE_HANDLE(X) \ namespace DD4hep { \ - template <> void Handle<X>::verifyObject() const \ - throw(std::exception) \ - { \ + template <> void Handle<X>::verifyObject() const { \ increment_object_validations(); \ if (m_element && dynamic_cast<X*>((TObject*)m_element) == 0) { \ bad_assignment(typeid(*m_element), typeid(X)); \ @@ -70,9 +67,7 @@ namespace DD4hep { p->name = n; \ p->type = t; \ } \ - template <> void Handle<X>::verifyObject() const \ - throw(std::exception) \ - { \ + template <> void Handle<X>::verifyObject() const { \ increment_object_validations(); \ if (m_element && dynamic_cast<X*>((NamedObject*)m_element) == 0) {\ bad_assignment(typeid(*m_element), typeid(X)); \ diff --git a/DDCore/include/DD4hep/Objects.h b/DDCore/include/DD4hep/Objects.h index dacc3086c693360da7c2aca146b3f52244832b5c..a47463e1bc99b4ee298f9c9e02c0522e6a5721da 100644 --- a/DDCore/include/DD4hep/Objects.h +++ b/DDCore/include/DD4hep/Objects.h @@ -30,6 +30,10 @@ class TGeoTranslation; class TGeoPhysicalNode; class TGeoIdentity; +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated" // Code that causes warning goes here +#endif // ROOT include files #include "TGeoPhysicalNode.h" #include "Math/Vector3D.h" @@ -42,6 +46,9 @@ class TGeoIdentity; #include "Math/RotationZYX.h" #include "Math/EulerAngles.h" #include "Math/VectorUtil.h" +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif // C/C++ include files #include <set> @@ -488,6 +495,11 @@ namespace DD4hep { LimitSet(const Handle<Q>& e) : Handle<LimitSetObject>(e) { } + /// Assignment operator + LimitSet& operator=(const LimitSet& c) { + m_element = c.m_element; + return *this; + } /// Constructor to be used when creating a new object LimitSet(const std::string& name); /// Add new limit. Returns true if the new limit was added, false if it already existed. @@ -527,6 +539,11 @@ namespace DD4hep { } /// Constructor to be used when creating a new object Region(const std::string& name); + /// Assignment operator + Region& operator=(const Region& c) { + m_element = c.m_element; + return *this; + } Region& setStoreSecondaries(bool value); Region& setThreshold(double value); diff --git a/DDCore/include/DD4hep/Shapes.h b/DDCore/include/DD4hep/Shapes.h index e5319f507e358fd3ba28bd1f98333031a81b34f0..4fb0af492f5f7628efb3898cb833f61eefe014a2 100644 --- a/DDCore/include/DD4hep/Shapes.h +++ b/DDCore/include/DD4hep/Shapes.h @@ -22,7 +22,12 @@ // C/C++ include files #include <vector> -// Forward declarations + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated" // Code that causes warning goes here +#endif +// ROOT include files #include "TGeoCone.h" #include "TGeoParaboloid.h" #include "TGeoPgon.h" @@ -36,6 +41,9 @@ #include "TGeoTorus.h" #include "TGeoHalfSpace.h" #include "TGeoCompositeShape.h" +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif /// Namespace for the AIDA detector description toolkit namespace DD4hep { diff --git a/DDCore/src/AlignmentData.cpp b/DDCore/src/AlignmentData.cpp index ec91e71b111d7cfca89cdf374c2e80d0056d3cb0..36ed3d958213e85e11b8fa5ce69a2091fb5ee790 100644 --- a/DDCore/src/AlignmentData.cpp +++ b/DDCore/src/AlignmentData.cpp @@ -74,11 +74,35 @@ AlignmentData::AlignmentData() InstanceCount::increment(this); } +/// Copy constructor +AlignmentData::AlignmentData(const AlignmentData& copy) + : delta(copy.delta), worldTrafo(copy.worldTrafo), detectorTrafo(copy.detectorTrafo), + nodes(copy.nodes), trToWorld(copy.trToWorld), detector(copy.detector), + placement(copy.placement), flag(copy.flag), magic(magic_word()) +{ + InstanceCount::increment(this); +} + /// Default destructor AlignmentData::~AlignmentData() { InstanceCount::decrement(this); } +/// Assignment operator necessary due to copy constructor +AlignmentData& AlignmentData::operator=(const AlignmentData& copy) { + if ( this != © ) { + delta = copy.delta; + worldTrafo = copy.worldTrafo; + detectorTrafo = copy.detectorTrafo; + nodes = copy.nodes; + trToWorld = copy.trToWorld; + detector = copy.detector; + placement = copy.placement; + flag = copy.flag; + } + return *this; +} + /// print Conditions object ostream& operator << (ostream& s, const AlignmentData& data) { stringstream str; diff --git a/DDDB/CMakeLists.txt b/DDDB/CMakeLists.txt index ed115dfa0f68f03a42e691c4a9eb6dae070d42d7..f8412820734591a5b31b3493e1127fde42239559 100644 --- a/DDDB/CMakeLists.txt +++ b/DDDB/CMakeLists.txt @@ -17,5 +17,3 @@ dd4hep_package( DDDB #---DDDB plugin library ------------------------------------------------------- dd4hep_add_plugin ( DDDB SOURCES src/*.cpp ) -#---Package installation procedure(s) ----------------------------------------- -install ( PROGRAMS scripts/run_dddb.sh DESTINATION bin) diff --git a/DDDB/scripts/run_dddb.sh b/DDDB/scripts/run_dddb.sh deleted file mode 100755 index 03e1a5e729713a4bde04f07f43504e592942268e..0000000000000000000000000000000000000000 --- a/DDDB/scripts/run_dddb.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# $Id$ -#========================================================================== -# AIDA Detector description implementation for LCD -#-------------------------------------------------------------------------- -# Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) -# All rights reserved. -# -# For the licensing terms see $DD4hepINSTALL/LICENSE. -# For the list of contributors see $DD4hepINSTALL/doc/CREDITS. -# -#========================================================================== -# -# @author M.Frank -# -#========================================================================== -echo "+ ------------------------------------------------------------------+"; -echo "| |"; -echo "| Starting DDDB plugin executor.... |"; -echo "| |"; -echo "+ ------------------------------------------------------------------+"; -# -ARGS=`echo -plugin DDDB_Executor \ - -loader DDDB_FileReader \ - -config DD4hep_ConditionsManagerInstaller \ - -params file:../DDDB/Parameters.xml \ - -input file:../DDDB/DDDB/lhcb.xml \ - -exec DDDB_DetectorConditionDump \ - -visualize -attr file:../DDDB/Visattrs.xml`; -echo "Command: `which geoPluginRun` $ARGS"; -`which geoPluginRun` ${ARGS}; diff --git a/DDDB/src/CondDB2DDDB.cpp b/DDDB/src/CondDB2DDDB.cpp index ff9e138fab19ffc1e3e1c4b30a8b6b812ec42958..675e065a2c87a0705460dafec4f5841e3c139743 100644 --- a/DDDB/src/CondDB2DDDB.cpp +++ b/DDDB/src/CondDB2DDDB.cpp @@ -141,6 +141,7 @@ namespace DD4hep { XML::UriReader* resolver; dddb* geo; Locals locals; + bool check; bool print_xml; bool print_docs; bool print_materials; @@ -159,7 +160,7 @@ namespace DD4hep { /// Default constructor Context(lcdd_t& l) - : lcdd(l), resolver(0), geo(0), + : lcdd(l), resolver(0), geo(0), check(true), print_xml(false), print_docs(false), print_materials(false), @@ -414,9 +415,11 @@ namespace DD4hep { void checkParents(Context* context) { dddb* geo = context->geo; - for(dddb::Catalogs::iterator i=geo->catalogs.begin(); i!=geo->catalogs.end(); ++i) { - Catalog* det = (*i).second; - checkParents(context,det); + if ( context->check ) { + for(dddb::Catalogs::iterator i=geo->catalogs.begin(); i!=geo->catalogs.end(); ++i) { + Catalog* det = (*i).second; + checkParents(context,det); + } } } @@ -1667,6 +1670,7 @@ namespace DD4hep { template <> void Conv<dddb_conditions>::convert(xml_h e) const { Catalog* catalog = 0; Context* context = _param<Context>(); + context->check = false; xml_coll_t(e, _LBU(conditionref)).for_each(Conv<ConditionRef>(lcdd,context,catalog)); xml_coll_t(e, _LBU(catalogref)).for_each(Conv<CatalogRef>(lcdd,context,catalog)); { diff --git a/DDDB/src/DDDB2Objects.cpp b/DDDB/src/DDDB2Objects.cpp index 38a713d0db6af269e0e18421d9773db5a37aa250..1a96cd4f0125258cb0066fc73829b659b98ca1bb 100644 --- a/DDDB/src/DDDB2Objects.cpp +++ b/DDDB/src/DDDB2Objects.cpp @@ -84,7 +84,7 @@ namespace DD4hep { print_detelem(false), print_conditions(false), print_vis(false), - conditions_only(false) + conditions_only(false) { } ~Context() { @@ -229,16 +229,16 @@ namespace DD4hep { template <> void* CNV<GeoCondition>::convert(GeoCondition *obj) const { Context* context = _param<Context>(); if ( obj ) { - typedef IOV::Key _K; - Conditions::Condition cond = obj; - AbstractMap& d = cond.get<AbstractMap>(); - Document* doc = d.option<Document>(); - _K::first_type since = doc->context.valid_since; - _K::second_type until = doc->context.valid_until; - _K iov_key(since,until); - ConditionsPool* pool = context->manager.registerIOV(*(context->epoch), iov_key); - context->manager.registerUnlocked(pool, cond); - //context->manager.registerKey(cond->hash, cond->name); + typedef IOV::Key _K; + Conditions::Condition cond = obj; + AbstractMap& d = cond.get<AbstractMap>(); + Document* doc = d.option<Document>(); + _K::first_type since = doc->context.valid_since; + _K::second_type until = doc->context.valid_until; + _K iov_key(since,until); + ConditionsPool* pool = context->manager.registerIOV(*(context->epoch), iov_key); + context->manager.registerUnlocked(pool, cond); + //context->manager.registerKey(cond->hash, cond->name); } return obj; } @@ -577,7 +577,7 @@ namespace DD4hep { } } mother->SetTitle(object->path.c_str()); - Geometry::VisAttr vis = context->helper->visAttr(object->path); + Geometry::VisAttr vis = context->helper->visAttr(object->path); if ( vis.isValid() ) { if ( context->print_vis ) { printout(INFO,"Cnv<LogVol>","++ Vol:%s Vis:%s",mother->GetTitle(), vis.name()); @@ -603,7 +603,7 @@ namespace DD4hep { " Unknown daughter vol:%s.",pv->c_id(), pv->logvol.c_str()); continue; } - int num_places = 0; + int num_places = 0; const char* pv_name = pv->name.c_str(); switch(pv->type) { case PhysVol::PHYSVOL_REGULAR: { @@ -787,7 +787,7 @@ namespace DD4hep { object->logvol.empty() ? "--" : object->logvol.c_str(), object->support.empty() ? "--" : object->support.c_str(), object->npath.empty() ? "--" : object->npath.c_str(), - object->condition.c_str()); + object->condition.c_str()); } if ( object->path == "/dd/Structure" ) { const Box& o = geo->world; @@ -808,7 +808,7 @@ namespace DD4hep { } else if ( object->path.find("/dd/Structure") == 0 ) { det = DetElement(object->name,object->type,0); - det.addExtension<Catalog>(object->addRef()); + det.addExtension<Catalog>(object->addRef()); if ( !object->support.empty() ) { try { j = context->catalogPaths.find(object->support); @@ -897,17 +897,17 @@ namespace DD4hep { #endif /// Attach conditions keys to the detector element if present if ( !object->condition.empty() ) { - Conditions::Container::Object* conditions = Conditions::DetConditions(det).conditions().ptr(); - conditions->addKey(object->condition); - conditions->addKey("Alignment", object->condition); + Conditions::Container::Object* conditions = Conditions::DetConditions(det).conditions().ptr(); + conditions->addKey(object->condition); + conditions->addKey("Alignment", object->condition); } if ( !object->conditioninfo.empty() ) { - Conditions::Container::Object* conditions = Conditions::DetConditions(det).conditions().ptr(); - for(Catalog::StringMap::const_iterator i=object->conditioninfo.begin(); i!=object->conditioninfo.end(); ++i) { - const string& cond_name = (*i).second; - conditions->addKey(cond_name); - conditions->addKey((*i).first, cond_name); - } + Conditions::Container::Object* conditions = Conditions::DetConditions(det).conditions().ptr(); + for(Catalog::StringMap::const_iterator i=object->conditioninfo.begin(); i!=object->conditioninfo.end(); ++i) { + const string& cond_name = (*i).second; + conditions->addKey(cond_name); + conditions->addKey((*i).first, cond_name); + } } if ( context->print_detelem ) { @@ -972,63 +972,63 @@ namespace DD4hep { template <> void* CNV<dddb>::convert(dddb *obj) const { Context* context = _param<Context>(); if ( !context->conditions_only ) { - GeoVolume world = lcdd.worldVolume(); + GeoVolume world = lcdd.worldVolume(); - for_each(obj->isotopes.begin(), obj->isotopes.end(), cnv<Isotope>()); - printout(INFO,"DDDB2Object","++ Converted %d isotopes.",int(obj->isotopes.size())); - for_each(obj->elements.begin(), obj->elements.end(), cnv<Element>()); - printout(INFO,"DDDB2Object","++ Converted %d elements.",int(obj->elements.size())); - //for_each(obj->materials.begin(), obj->materials.end(), cnv<Material>()); - //printout(INFO,"DDDB2Object","++ Converted %d materials.",int(obj->materials.size())); - //for_each(obj->shapes.begin(), obj->shapes.end(), cnv<Shape>()); - //printout(INFO,"DDDB2Object","++ Converted %d shapes.",int(obj->shapes.size())); - //for_each(obj->volumes.begin(), obj->volumes.end(), cnv<LogVol>()); - //printout(INFO,"DDDB2Object","++ Converted %d volumes.",int(obj->volumes.size())); - //for_each(obj->placements.begin(),obj->placements.end(), cnv<PhysVol>()); - //printout(INFO,"DDDB2Object","++ Converted %d placements.",int(obj->placements.size())); + for_each(obj->isotopes.begin(), obj->isotopes.end(), cnv<Isotope>()); + printout(INFO,"DDDB2Object","++ Converted %d isotopes.",int(obj->isotopes.size())); + for_each(obj->elements.begin(), obj->elements.end(), cnv<Element>()); + printout(INFO,"DDDB2Object","++ Converted %d elements.",int(obj->elements.size())); + //for_each(obj->materials.begin(), obj->materials.end(), cnv<Material>()); + //printout(INFO,"DDDB2Object","++ Converted %d materials.",int(obj->materials.size())); + //for_each(obj->shapes.begin(), obj->shapes.end(), cnv<Shape>()); + //printout(INFO,"DDDB2Object","++ Converted %d shapes.",int(obj->shapes.size())); + //for_each(obj->volumes.begin(), obj->volumes.end(), cnv<LogVol>()); + //printout(INFO,"DDDB2Object","++ Converted %d volumes.",int(obj->volumes.size())); + //for_each(obj->placements.begin(),obj->placements.end(), cnv<PhysVol>()); + //printout(INFO,"DDDB2Object","++ Converted %d placements.",int(obj->placements.size())); - if ( obj->top ) { - if ( !context->lvDummy.isValid() ) { - lcdd.manager().SetVisLevel(context->max_volume_depth); - context->lvDummy = GeoVolume("Dummy",Geometry::Box(0.0001,0.0001, 0.0001),lcdd.vacuum()); - context->lvDummy.setVisAttributes(lcdd.invisible()); - } - if ( !world.isValid() ) { - string top = "/dd/Geometry/LHCb/lvLHCb"; - const LogVol* lv = Context::find(obj->volumePaths,top); - if ( !lv ) { - except("DDDB2DD4hep","++ No World volume defined."); - } - const Shape* s = Context::find(obj->shapes,lv->id); - if ( !s ) { - except("DDDB2DD4hep","++ No Shape for the world volume defined."); - } - obj->world = s->s.box; - } - /// Main detector conversion invokation - cnv<Catalog>().convert(obj->top); - if ( !world.isValid() && lcdd.worldVolume().isValid() ) { - lcdd.endDocument(); - } - /// Now configure the conditions manager - if ( !context->manager.isValid() ) { - Conditions::ConditionsManager manager = Conditions::ConditionsManager::from(lcdd); - manager["PoolType"] = "DD4hep_ConditionsLinearPool"; - manager["LoaderType"] = "dddb"; - manager["UserPoolType"] = "DD4hep_ConditionsMapUserPool"; - manager["UpdatePoolType"] = "DD4hep_ConditionsLinearUpdatePool"; - manager.initialize(); - pair<bool,const IOVType*> e = manager.registerIOVType(0, "epoch"); - context->manager = manager; - context->epoch = e.second; - } - } + if ( obj->top ) { + if ( !context->lvDummy.isValid() ) { + lcdd.manager().SetVisLevel(context->max_volume_depth); + context->lvDummy = GeoVolume("Dummy",Geometry::Box(0.0001,0.0001, 0.0001),lcdd.vacuum()); + context->lvDummy.setVisAttributes(lcdd.invisible()); + } + if ( !world.isValid() ) { + string top = "/dd/Geometry/LHCb/lvLHCb"; + const LogVol* lv = Context::find(obj->volumePaths,top); + if ( !lv ) { + except("DDDB2DD4hep","++ No World volume defined."); + } + const Shape* s = Context::find(obj->shapes,lv->id); + if ( !s ) { + except("DDDB2DD4hep","++ No Shape for the world volume defined."); + } + obj->world = s->s.box; + } + /// Main detector conversion invokation + cnv<Catalog>().convert(obj->top); + if ( !world.isValid() && lcdd.worldVolume().isValid() ) { + lcdd.endDocument(); + } + /// Now configure the conditions manager + if ( !context->manager.isValid() ) { + Conditions::ConditionsManager manager = Conditions::ConditionsManager::from(lcdd); + manager["PoolType"] = "DD4hep_ConditionsLinearPool"; + manager["LoaderType"] = "dddb"; + manager["UserPoolType"] = "DD4hep_ConditionsMapUserPool"; + manager["UpdatePoolType"] = "DD4hep_ConditionsLinearUpdatePool"; + manager.initialize(); + pair<bool,const IOVType*> e = manager.registerIOVType(0, "epoch"); + context->manager = manager; + context->epoch = e.second; + } + } } if ( !context->manager.isValid() ) { - Conditions::ConditionsManager manager = Conditions::ConditionsManager::from(lcdd); - pair<bool,const IOVType*> e = manager.registerIOVType(0, "epoch"); - context->manager = manager; - context->epoch = e.second; + Conditions::ConditionsManager manager = Conditions::ConditionsManager::from(lcdd); + pair<bool,const IOVType*> e = manager.registerIOVType(0, "epoch"); + context->manager = manager; + context->epoch = e.second; } for_each(obj->conditions.begin(),obj->conditions.end(), cnv<GeoCondition>()); //printout(INFO,"DDDB2Object","++ Converted %d conditions.",int(obj->conditions.size())); @@ -1041,31 +1041,31 @@ namespace DD4hep { long dddb_2_dd4hep(LCDD& lcdd, int , char** ) { DDDBHelper* helper = lcdd.extension<DDDBHelper>(false); if ( helper ) { - Context context(lcdd, helper->detectorDescription()); - context.helper = helper; - context.print_materials = false; - context.print_logvol = false; - context.print_shapes = false; - context.print_physvol = false; - context.print_volumes = false; - context.print_params = false; - context.print_detelem = false; - context.print_conditions = false; - context.print_vis = false; - context.max_volume_depth = 9; + Context context(lcdd, helper->detectorDescription()); + context.helper = helper; + context.print_materials = false; + context.print_logvol = false; + context.print_shapes = false; + context.print_physvol = false; + context.print_volumes = false; + context.print_params = false; + context.print_detelem = false; + context.print_conditions = false; + context.print_vis = false; + context.max_volume_depth = 9; - CNV<dddb> cnv(lcdd,&context); - cnv(make_pair(string("World"),context.geo)); - printout(INFO,"DDDB","++ Converted %8d isotopes.", int(context.isotopes.size())); - printout(INFO,"DDDB","++ Converted %8d elements.", int(context.elements.size())); - printout(INFO,"DDDB","++ Converted %8d materials.", int(context.materials.size())); - printout(INFO,"DDDB","++ Converted %8d shapes.", int(context.shapes.size())); - printout(INFO,"DDDB","++ Converted %8d logical volumes.", int(context.volumes.size())); - printout(INFO,"DDDB","++ Converted %8d placements.", int(context.placements.size())); - printout(INFO,"DDDB","++ Converted %8d detector elements.",int(context.detelements.size())); - printout(INFO,"DDDB","++ Converted %8d conditions.", int(context.geo->conditions.size())); - helper->setDetectorDescription(0); - return 1; + CNV<dddb> cnv(lcdd,&context); + cnv(make_pair(string("World"),context.geo)); + printout(INFO,"DDDB","++ Converted %8d isotopes.", int(context.isotopes.size())); + printout(INFO,"DDDB","++ Converted %8d elements.", int(context.elements.size())); + printout(INFO,"DDDB","++ Converted %8d materials.", int(context.materials.size())); + printout(INFO,"DDDB","++ Converted %8d shapes.", int(context.shapes.size())); + printout(INFO,"DDDB","++ Converted %8d logical volumes.", int(context.volumes.size())); + printout(INFO,"DDDB","++ Converted %8d placements.", int(context.placements.size())); + printout(INFO,"DDDB","++ Converted %8d detector elements.",int(context.detelements.size())); + printout(INFO,"DDDB","++ Converted %8d conditions.", int(context.geo->conditions.size())); + helper->setDetectorDescription(0); + return 1; } except("DDDB","++ No DDDBHelper instance installed. Geometry conversion failed!"); return 1; @@ -1073,14 +1073,14 @@ namespace DD4hep { long dddb_conditions_2_dd4hep(LCDD& lcdd, int , char** ) { DDDBHelper* helper = lcdd.extension<DDDBHelper>(false); if ( helper ) { - Context context(lcdd, helper->detectorDescription()); - context.helper = helper; - context.print_conditions = false; - context.conditions_only = true; - CNV<dddb> cnv(lcdd,&context); - cnv(make_pair(string(),context.geo)); - helper->setDetectorDescription(0); - return 1; + Context context(lcdd, helper->detectorDescription()); + context.helper = helper; + context.print_conditions = false; + context.conditions_only = true; + CNV<dddb> cnv(lcdd,&context); + cnv(make_pair(string(),context.geo)); + helper->setDetectorDescription(0); + return 1; } except("DDDB","++ No DDDBHelper instance installed. Geometry conversion failed!"); return 1; diff --git a/DDDB/src/DDDBConditionsLoader.cpp b/DDDB/src/DDDBConditionsLoader.cpp index 58640f4acea15716facd99d81b919c846fe2ad4e..b06f5d1d7c3d3c9489f3c1779c4d20b5e9cf90da 100644 --- a/DDDB/src/DDDBConditionsLoader.cpp +++ b/DDDB/src/DDDBConditionsLoader.cpp @@ -16,10 +16,12 @@ // Framework include files #include "DDDB/DDDBConditionsLoader.h" #include "DDDB/DDDBReaderContext.h" +#include "DDDB/DDDBConversion.h" #include "DDDB/DDDBHelper.h" #include "DD4hep/Printout.h" #include "DD4hep/Factories.h" #include "DD4hep/Operators.h" +#include "DD4hep/ConditionsData.h" #include "DD4hep/objects/ConditionsInterna.h" #include "DDCond/ConditionsInterna.h" @@ -31,6 +33,7 @@ using namespace std; using namespace DD4hep::DDDB; using DD4hep::Geometry::LCDD; using DD4hep::Conditions::Condition; +using DD4hep::Conditions::AbstractMap; using DD4hep::Conditions::RangeConditions; typedef DD4hep::Conditions::RangeConditions RC; @@ -113,8 +116,8 @@ void DDDBConditionsLoader::loadDocument(XML::UriContextReader& rdr, const Key& k /// Load single conditions document void DDDBConditionsLoader::loadDocument(XML::UriContextReader& rdr, - const string& sys_id, - const string& obj_id) + const string& sys_id, + const string& obj_id) { const void* argv_conddb[] = {&rdr, sys_id.c_str(), obj_id.c_str(), 0}; long result = load_dddb_conditions_from_uri(m_lcdd, 3, (char**)argv_conddb); @@ -130,8 +133,8 @@ void DDDBConditionsLoader::loadDocument(XML::UriContextReader& rdr, /// Load a condition set given a Detector Element and the conditions name according to their validity size_t DDDBConditionsLoader::load_range(key_type key, - const iov_type& req_validity, - RangeConditions& conditions) { + const iov_type& req_validity, + RangeConditions& conditions) { KeyMap::const_iterator k = m_keys.keys.find(key); if ( k != m_keys.keys.end() ) { size_t len = conditions.size(); @@ -159,8 +162,8 @@ size_t DDDBConditionsLoader::load_range(key_type key, } size_t DDDBConditionsLoader::load(key_type key, - const iov_type& req_validity, - RangeConditions& conditions) { + const iov_type& req_validity, + RangeConditions& conditions) { KeyMap::const_iterator k = m_keys.keys.find(key); if ( k != m_keys.keys.end() ) { size_t len = conditions.size(); @@ -184,8 +187,8 @@ size_t DDDBConditionsLoader::load(key_type key, /// Update a range of conditions according to the required IOV size_t DDDBConditionsLoader::update(const iov_type& req_validity, - RangeConditions& conditions, - iov_type& conditions_validity) + RangeConditions& conditions, + iov_type& conditions_validity) { CallArgs arg(REPLACE, 0, conditions_validity, conditions); pair<ConditionsListener*,void*> call(this,&arg); @@ -204,14 +207,15 @@ size_t DDDBConditionsLoader::update(const iov_type& req_validity, size_t idx = c->address.find('#'); string url = (idx == string::npos) ? c->address : c->address.substr(0,idx); printout(INFO,"DDDB","++ Need to update: %-40s [%08X] --> %s", - c->name.c_str(), c->hash, url.c_str()); + c->name.c_str(), c->hash, url.c_str()); urls.insert(make_pair(url,c)); } /// Now load them. In the callbacks we can check if we got all required conditions for(map<string,Condition::Object*>::const_iterator j=urls.begin(); j!=urls.end(); ++j) { - const string& sys_id = (*j).first; - const string& obj_path = (*j).second->name; - loadDocument(local_reader, sys_id, obj_path); + Condition cond = (*j).second; + const AbstractMap& data = cond.get<AbstractMap>(); + const Document* doc = data.option<Document>(); + loadDocument(local_reader, doc->id, doc->name); } m_mgr->callOnRegister(call,false); return 0; @@ -227,14 +231,14 @@ void DDDBConditionsLoader::onRegisterCondition(Condition cond, void* param) { if ( arg->cmd == REPLACE ) { RC::iterator i=std::find_if(r.begin(),r.end(),byName(cond)); if ( i != r.end() ) { - (*i) = cond; - printout(DEBUG,"DDDB","++ Got MATCH: %-40s [%08X] --> %s.", - c->name.c_str(), c->hash, c->address.c_str()); - arg->iov.iov_intersection(cond.iov()); - return; + (*i) = cond; + printout(DEBUG,"DDDB","++ Got MATCH: %-40s [%08X] --> %s.", + c->name.c_str(), c->hash, c->address.c_str()); + arg->iov.iov_intersection(cond.iov()); + return; } printout(INFO,"DDDB","++ Got update: %-40s [%08X] --> %s.", - c->name.c_str(), c->hash, c->address.c_str()); + c->name.c_str(), c->hash, c->address.c_str()); } else if ( arg->cmd == INSERT && arg->key == c->hash ) { arg->iov.iov_intersection(cond.iov()); diff --git a/DDDB/src/DDDBDerivedCondTest.cpp b/DDDB/src/DDDBDerivedCondTest.cpp index da66a62d86e9b6cb221ebf815d3e7613d07b1991..aea3c4a4d21831f66b0b648027290e21d1136026 100644 --- a/DDDB/src/DDDBDerivedCondTest.cpp +++ b/DDDB/src/DDDBDerivedCondTest.cpp @@ -34,6 +34,7 @@ #include "DDCond/ConditionsInterna.h" #include "DDCond/ConditionsOperators.h" +#include "DDDB/DDDBReader.h" #include "DDDB/DDDBConversion.h" #include "DDDB/DDDBConditionPrinter.h" @@ -176,7 +177,7 @@ namespace { * \date 31/03/2016 * \ingroup DD4HEP_DDDB */ - class AlignmentSelector { + class ConditionsSelector { public: typedef ConditionsManager::Dependencies Dependencies; string m_name; @@ -190,11 +191,11 @@ namespace { } m_counters; /// Initializing constructor - AlignmentSelector(ConditionsAccess mgr) : m_manager(mgr) { + ConditionsSelector(ConditionsAccess mgr) : m_manager(mgr) { Operators::collectAllConditions(mgr, m_allConditions); } - virtual ~AlignmentSelector() { + virtual ~ConditionsSelector() { destroyObjects(m_allDependencies); } @@ -298,10 +299,10 @@ namespace { }; /// Plugin function - long dddb_derived_alignments(LCDD& lcdd, int , char** argv) { - long init_time = *(long*)argv[0]; + long dddb_derived_alignments(LCDD& lcdd, int argc, char** argv) { + long int long init_time = argc>0 ? *(long*)argv[0] : DDDB::DDDBReader::makeTime(2016,4,1,12); ConditionsManager manager = ConditionsManager::from(lcdd); - AlignmentSelector selector(manager); + ConditionsSelector selector(manager); int ret = selector.collectDependencies(lcdd.world(), 0); if ( ret == 1 ) { ret = selector.computeDependencies(init_time); diff --git a/doc/CompileAllOptionPermutations.sh b/doc/CompileAllOptionPermutations.sh index c2d23a75a182d6af890bc43b454d63748ee0d094..8fb9c02b3f0ac028296bbed3693447ab2efad8c6 100755 --- a/doc/CompileAllOptionPermutations.sh +++ b/doc/CompileAllOptionPermutations.sh @@ -14,6 +14,7 @@ ROOT_VERSION=6.04.10; #GEANT_VERSION=10.02.p02; ROOT_VERSION=6.06.06; #source ${INSTALL_G4}/../../bin/geant4.sh; +num_threads=2 export CXX="`which g++-5` -D_GLIBCXX_USE_CXX11_ABI=0"; export CC="`which gcc-5` -D_GLIBCXX_USE_CXX11_ABI=0"; @@ -29,6 +30,7 @@ parse_command_line_args() #echo "Arg:$1 $2"; a1=`echo $1 | tr A-Z a-z`; case ${a1} in + -root) ROOT_VERSION=$2; shift @@ -52,6 +54,16 @@ parse_command_line_args() MULTITHREADED=""; ;; + -threads) + num_threads=$2; + shift + ;; + + -j) + num_threads=$2; + shift + ;; + *) ARG_ERROR=$1; ;; @@ -98,7 +110,7 @@ make_build() echo ${CMD}; exit 1 fi - make install VERBOSE=1 -j 1; + make install VERBOSE=1 -j ${num_threads}; if [ $? -ne 0 ]; then make_output "DANGER WILL ROBINSON DANGER!" "++++ Failed BUILD!" echo ${CMD}; diff --git a/doc/release.notes b/doc/release.notes index 667a3d1c45347da33ba9fdfa2a02d6b82e9195fa..b98325d477ea8fd4280bc962a0672103cf063eb8 100644 --- a/doc/release.notes +++ b/doc/release.notes @@ -3,11 +3,24 @@ DD4hep ---- Release Notes ================================= + +2016-08-24 M.Frank + Adding first somehow useful implementation to use conditions and the consequent loading thereof. + Used by the DDDB implementation/example. DDDB is an alternative way to populate the DD4hep + detector description using LHCb's detector description database. + The reason is, that only a running experiment has a reasonable base to conditions data + to excercise the DD4hep conditions. + If interested, please have a look in the DDDB examples. + + Still TODO: + - A formal way to bootstrap the conditions loading still has to be found. + - Conditions loading from XML files and a small comprehensive example. + -------- | v00-16 | -------- -Shaojun Lu | 2016-07-26 +2016-07-26 Shaojun Lu Added new MegatileLayerGridXY segmentation for Scintillator strip Ecal, which is implemented by K.Kotera, and used by SEcal04Hybrid geometry driver. diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index ee0c44aa9129ebd1f0e7e9ff9a8d1c418e0a6e8f..e27dfde3b39f7eac4d968ccbe47df9a5036353e7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -37,4 +37,4 @@ dd4hep_package ( DD4hepExample MAJOR 0 MINOR 15 PATCH 0 [DD4hep REQUIRED COMPONENTS DDCore] ) # -dd4hep_enable_tests ( AlignDet CLICSiD ClientTests SimpleDetector ) +dd4hep_enable_tests ( AlignDet CLICSiD ClientTests DDDB SimpleDetector) diff --git a/examples/DDDB/CMakeLists.txt b/examples/DDDB/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..2ec2ec6f48227db1873c4e22777ca0752673730d --- /dev/null +++ b/examples/DDDB/CMakeLists.txt @@ -0,0 +1,116 @@ +# $Id$ +#========================================================================== +# AIDA Detector description implementation for LCD +#-------------------------------------------------------------------------- +# Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +# All rights reserved. +# +# For the licensing terms see $DD4hepINSTALL/LICENSE. +# For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +# +#========================================================================== +cmake_minimum_required(VERSION 2.8.3 FATAL_ERROR) +include ( ${DD4hep_DIR}/cmake/DD4hep.cmake ) + +#----------------------------------------------------------------------------------- +dd4hep_configure_output () +dd4hep_package (DDDB MAJOR 0 MINOR 0 PATCH 1 + USES [ROOT REQUIRED COMPONENTS Geom] + [DD4hep REQUIRED COMPONENTS DDCore DDDB] +) +#---Package installation procedure(s) ----------------------------------------- +install ( PROGRAMS scripts/run_dddb.sh DESTINATION bin) +install ( PROGRAMS scripts/extract_dddb.sh DESTINATION bin) +install ( FILES data/DDDB.tar.gz DESTINATION examples/DDDB) +#---Testing-------------------------------------------------------------------- +dd4hep_configure_scripts ( DDDB DEFAULT_SETUP WITH_TESTS ) +# +#---Testing: Extract DDDB data from zip archive ------------------------------- +dd4hep_add_test_reg( test_DDDB_extract + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/extract_dddb.sh + REGEX_PASS "DDDB Database successfully installed." ) +# +#---Testing: Load the geometry from archive ----------------------------------- +dd4hep_add_test_reg( test_DDDB_load + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/run_dddb.sh + REGEX_PASS "Converted 12768 placements" ) +# +#---Testing: Load the geometry + conditions from archive ---------------------- +dd4hep_add_test_reg( test_DDDB_conditions + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/run_dddb.sh + -config DD4hep_ConditionsManagerInstaller + REGEX_PASS "Converted 9353 conditions" ) +# +#---Testing: Load the geometry + conditions dump as view from DetElement ------ +dd4hep_add_test_reg( test_DDDB_conditions_dump_simple + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/run_dddb.sh + -config DD4hep_ConditionsManagerInstaller + -exec DDDB_ConditionsDump + REGEX_PASS "Path:/dd/Conditions/ReadoutConf/Velo/Tell1Module03 Class:5 .DD4hep::Conditions::AbstractMap." ) +# +#---Testing: Load the geometry + dump detector elemets ------------------------ +dd4hep_add_test_reg( test_DDDB_det_elements + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/run_dddb.sh + -config DD4hep_ConditionsManagerInstaller + -exec DDDB_DetectorDump + REGEX_PASS "Detector: /world/LHCb/UpstreamRegion #Dau:5" ) +# +#---Testing: Load the geometry + dump volumes --------------------------------- +dd4hep_add_test_reg( test_DDDB_det_volumes + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/run_dddb.sh + -config DD4hep_ConditionsManagerInstaller + -exec DDDB_DetectorVolumeDump + REGEX_PASS "Detector: /world/LHCb/MagnetRegion/BcmDown #Dau:10" ) +# +#---Testing: Load the geometry + dump condition keys -------------------------- +dd4hep_add_test_reg( test_DDDB_det_conditions_keys + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/run_dddb.sh + -config DD4hep_ConditionsManagerInstaller + -exec DDDB_DetectorConditionKeysDump + REGEX_PASS "Key: D88E83E7 -> 20537B67 -> /dd/Conditions/ReadoutConf/Prs/Readout") +# +#---Testing: Load the geometry + dump condition keys -------------------------- +dd4hep_add_test_reg( test_DDDB_det_conditions_data + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/run_dddb.sh + -config DD4hep_ConditionsManagerInstaller + -exec DDDB_DetectorConditionDump + REGEX_PASS "Path:/dd/Conditions/Alignment/Spd/SpdCSystem Class:6 .DD4hep::Conditions::AbstractMap." ) +# +#---Testing: Load the geometry + dump condition keys -------------------------- +dd4hep_add_test_reg( test_DDDB_det_conditions_align + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/run_dddb.sh + -config DD4hep_ConditionsManagerInstaller + -exec DDDB_DetectorAlignmentDump + REGEX_PASS "Number of attached alignments: 2496") +# +#---Testing: Load the geometry + conditions dump as view from DetElement ------ +dd4hep_add_test_reg( test_DDDB_detelement_conditions_dump + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/run_dddb.sh + -config DD4hep_ConditionsManagerInstaller + -exec DDDB_DetElementConditionDump + REGEX_PASS "Path:/dd/Conditions/Alignment/Spd/SpdCSystem Class:6 .DD4hep::Conditions::AbstractMap." ) + +# +#---Testing: Load the geometry + conditions + conditions derives +dd4hep_add_test_reg( test_DDDB_derived_conditions + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/run_dddb.sh + -config DD4hep_ConditionsManagerInstaller + -exec DDDB_DerivedCondTest + REGEX_PASS "Building dependent condition: /dd/Conditions/Alignment/TT/TTbVLayerR1Module3B/derived_3" ) +# +#---Testing: Extract DDDB data from zip archive ------------------------------- +dd4hep_add_test_reg( test_DDDB_clean + COMMAND "${CMAKE_INSTALL_PREFIX}/bin/run_test_DDDB.sh" + EXEC_ARGS ${CMAKE_INSTALL_PREFIX}/bin/extract_dddb.sh -clean + REGEX_PASS "DDDB Database successfully removed" ) diff --git a/examples/DDDB/data/DDDB.tar.gz b/examples/DDDB/data/DDDB.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9125b82ea601cf7b21a221269d8fbcec53750fca Binary files /dev/null and b/examples/DDDB/data/DDDB.tar.gz differ diff --git a/examples/DDDB/scripts/extract_dddb.sh b/examples/DDDB/scripts/extract_dddb.sh new file mode 100755 index 0000000000000000000000000000000000000000..7beb5e577617a2976d69f622af5cdeb6f96044ef --- /dev/null +++ b/examples/DDDB/scripts/extract_dddb.sh @@ -0,0 +1,86 @@ +#!/bin/bash +# $Id$ +#========================================================================== +# AIDA Detector description implementation for LCD +#-------------------------------------------------------------------------- +# Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +# All rights reserved. +# +# For the licensing terms see $DD4hepINSTALL/LICENSE. +# For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +# +#========================================================================== +# +# @author M.Frank +# +#========================================================================== +echo "+ ------------------------------------------------------------------+"; +echo "| Starting DDDB extraction from tar file |"; +echo "+ ------------------------------------------------------------------+"; +# +source=${DD4hepINSTALL}/examples/DDDB/DDDB.tar.gz; +target=/tmp/$USER; +clean="NO"; +# +# Check for arguments: +while [[ "$1" == -* ]]; do + #echo "Arg:$1 $2 [$*]"; + a1=`echo $1 | tr A-Z a-z`; + case ${a1} in + -to) + target=$2; + shift + ;; + -target) + target=$2; + shift + ;; + -dddb) + source=$2; + shift + ;; + -clean) + clean="YES"; + ;; + -input) + source=$2; + shift + ;; + *) + echo "Usage: $0 -arg [-arg]"; + echo " -target <directory> Installation target directory. Default: $target"; + echo " -input <tar-file> Input data file. Default: $source"; + exit 13; # EACCES + ;; + esac + shift; +done; +# +# Now do the installation +if test -d ${target}/DDDB; then + if test "${clean}" = "YES";then + rm -rf ${target}/DDDB; + echo "DDDB Database successfully removed ${target}"; + exit 0; + fi; + echo "DDDB database is already extracted to ${target}. Nothing to do."; +elif test ! -f ${source}; then + echo "DDDB database tar file $source is not present. [Installation FAILED]"; + exit 2; # ENOENT +else + mkdir -p ${target}/DDDB; + if test ! -d ${target}/DDDB; then + echo "DDDB database target directory ${target} cannot be created [Installation FAILED]"; + exit 2; # ENOENT + fi; + cd ${target}; + echo "${target} : tar -xf $source"; + tar -xf $source; +fi; +if test -f ${target}/DDDB/DDDB/lhcb.xml; then + echo "DDDB Database successfully installed."; +else + echo "DDDB Database installation FAILED"; + exit 2; # ENOENT +fi; +exit 0; diff --git a/examples/DDDB/scripts/run_dddb.sh b/examples/DDDB/scripts/run_dddb.sh new file mode 100755 index 0000000000000000000000000000000000000000..13eadfc41d89600ee0ced186d9a3b118b9021a9f --- /dev/null +++ b/examples/DDDB/scripts/run_dddb.sh @@ -0,0 +1,80 @@ +#!/bin/bash +# $Id$ +#========================================================================== +# AIDA Detector description implementation for LCD +#-------------------------------------------------------------------------- +# Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +# All rights reserved. +# +# For the licensing terms see $DD4hepINSTALL/LICENSE. +# For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +# +#========================================================================== +# +# @author M.Frank +# +#========================================================================== +echo "+ ------------------------------------------------------------------+"; +echo "| |"; +echo "| Starting DDDB plugin executor.... |"; +echo "| |"; +echo "+ ------------------------------------------------------------------+"; +# +# +# Check for arguments: +DDDB_DIR=/tmp/${USER}/DDDB; +loader="-loader DDDB_FileReader"; +params="-params file:${DDDB_DIR}/Parameters.xml"; +input="-input file:${DDDB_DIR}/DDDB/lhcb.xml"; +config=""; +exec=""; +vis=""; +debug=""; +# +# +while [[ "$1" == -* ]]; do + #echo "Arg:$1 $2 [$*]"; + a1=`echo $1 | tr A-Z a-z`; + case ${a1} in + -debug) + debug="gdb --args"; + ;; + -attr) + vis="${vis} -attr $2"; + shift; + ;; + -visualize) + vis="${vis} -visualize"; + ;; + -params) + params="-params $2"; + shift; + ;; + -loader) + loader="-loader $2"; + shift; + ;; + -input) + input="-input $2"; + shift; + ;; + -config) + config="${config} -config $2"; + shift; + ;; + -exec) + exec="${exec} -exec $2"; + shift; + ;; + *) + echo "Usage: $0 -arg [-arg]"; + exit 13; # EACCES + ;; + esac + shift; +done; +# +# +ARGS=`echo -plugin DDDB_Executor ${loader} ${params} ${input} ${config} ${exec} ${vis}` +echo "Command: ${debug} `which geoPluginRun` $ARGS"; +${debug} `which geoPluginRun` ${ARGS};