diff --git a/DDCond/src/plugins/ConditionsPlugins.cpp b/DDCond/src/plugins/ConditionsPlugins.cpp index 4ebd8e704f66476f7e98538060214e2dd73e6bd9..11741e63e2d5d7aed700a88ac4d7a0ee22ad0160 100644 --- a/DDCond/src/plugins/ConditionsPlugins.cpp +++ b/DDCond/src/plugins/ConditionsPlugins.cpp @@ -13,6 +13,7 @@ // Framework include files #include "DD4hep/LCDD.h" +#include "DD4hep/Plugins.h" #include "DD4hep/Printout.h" #include "DD4hep/Conditions.h" #include "DD4hep/DetFactoryHelper.h" @@ -70,16 +71,30 @@ DECLARE_APPLY(DD4hep_ConditionsManagerInstaller,ddcond_install_cond_mgr) * \date 01/04/2016 */ static int ddcond_conditions_pool_processor(lcdd_t& lcdd, bool process_pool, bool process_conditions, int argc, char** argv) { + Condition::Processor* processor = 0; + if ( argc < 2 ) { + except("CondPoolProcessor","++ No processor creator name given!"); + } + for(int i=0; i<argc; ++i) { + if ( 0 == ::strncmp(argv[i],"-processor",3) ) { + vector<char*> args; + for(int j=2; j<argc && argv[j]; ++j) args.push_back(argv[j]); + args.push_back(0); + string fac = argv[++i]; + processor = (Condition::Processor*)PluginService::Create<void*>(fac,&lcdd,int(args.size()),&args[0]); + break; + } + } + if ( !processor ) { + except("CondPoolProcessor","++ Found arguments in plugin call, " + "but could not make any sense of them...."); + } + typedef std::vector<const IOVType*> _T; typedef ConditionsIOVPool::Elements _E; typedef RangeConditions _R; + dd4hep_ptr<Condition::Processor> proc(processor); ConditionsManager manager = ConditionsManager::from(lcdd); - - if ( argc < 1 ) { - except("CondPoolProcessor","++ No processor functor given!"); - } - - Condition::Processor* processor = (Condition::Processor*)argv[0]; const _T types = manager.iovTypesUsed(); for( _T::const_iterator i = types.begin(); i != types.end(); ++i ) { const IOVType* type = *i; @@ -100,7 +115,7 @@ static int ddcond_conditions_pool_processor(lcdd_t& lcdd, bool process_pool, boo _R rc; cp->select_all(rc); for(_R::const_iterator ic=rc.begin(); ic!=rc.end(); ++ic) { - if ( processor ) { (*processor)(*ic); } + if ( proc.get() ) { (*proc)(*ic); } } } } @@ -125,16 +140,20 @@ DECLARE_APPLY(DD4hep_ConditionsPoolProcessor,ddcond_conditions_pool_process) * \date 01/04/2016 */ static int ddcond_conditions_pool_print(lcdd_t& lcdd, bool print_conditions, int argc, char** argv) { - ConditionsPrinter default_printer(""); - Condition::Processor* printer = &default_printer; if ( argc > 0 ) { - //for(int i=0; i<argc; ++i) { - //printout(INFO,"","arg[%d]=%s",i,argv[i]); - //} - printer = (Condition::Processor*)argv[0]; + for(int i=0; i<argc; ++i) { + if ( 0 == ::strncmp(argv[i],"-processor",3) ) { + vector<char*> args; + for(int j=i; j<argc && argv[j]; ++j) args.push_back(argv[j]); + args.push_back(0); + return ddcond_conditions_pool_processor(lcdd,true,print_conditions,int(args.size()-1),&args[0]); + } + } + printout(WARNING,"DDCondProcessor","++ Found arguments in plugin call, " + "but could not make any sense of them...."); } - const void* args[] = {printer,0}; - return ddcond_conditions_pool_processor(lcdd,true,print_conditions,1,(char**)args); + const void* args[] = { "-processor", "DD4hepConditionsPrinter", 0}; + return ddcond_conditions_pool_processor(lcdd,true,print_conditions,2,(char**)args); } static int ddcond_dump_pools(LCDD& lcdd, int argc, char** argv) { diff --git a/DDCore/include/DD4hep/ConditionsPrinter.h b/DDCore/include/DD4hep/ConditionsPrinter.h index ad49991b4463255dfccd2935588b11ff5fe0c7ec..fe12c7a6fb1cf7ddf83577d94604296633a43c11 100644 --- a/DDCore/include/DD4hep/ConditionsPrinter.h +++ b/DDCore/include/DD4hep/ConditionsPrinter.h @@ -61,7 +61,6 @@ namespace DD4hep { virtual int operator()(DetElement de, UserPool* user_pool, bool recurse); }; - } /* End namespace Conditions */ -} /* End namespace DD4hep */ - + } /* End namespace Conditions */ +} /* End namespace DD4hep */ #endif /* DD4HEP_DDCOND_CONDITIONSPRINTER_H */ diff --git a/DDCore/src/plugins/StandardPlugins.cpp b/DDCore/src/plugins/StandardPlugins.cpp index 8b3c74e7c93d785f2dea2d94a77caa35138e56f4..e3b8119164822d850956f448d73f9e5ac1634f51 100644 --- a/DDCore/src/plugins/StandardPlugins.cpp +++ b/DDCore/src/plugins/StandardPlugins.cpp @@ -530,3 +530,27 @@ DECLARE_APPLY(DD4hepDetectorTypes,detectortype_cache) #include "DD4hep/SurfaceInstaller.h" typedef SurfaceInstaller TestSurfacesPlugin; DECLARE_SURFACE_INSTALLER(TestSurfaces,TestSurfacesPlugin) + +#include "DD4hep/ConditionsPrinter.h" +/// Basic entry point to instantiate the basic DD4hep conditions printer +/** + * Factory: DD4hepConditionsPrinter + * + * \author M.Frank + * \version 1.0 + * \date 17/11/2016 + */ +static void* create_conditions_printer(Geometry::LCDD& /* lcdd */, int argc,char** argv) { + string prefix = ""; + int flags = 0; + for(int i=0; i<argc && argv[i]; ++i) { + if ( 0 == ::strncmp("-prefix",argv[i],4) ) + prefix = argv[++i]; + else if ( 0 == ::strncmp("-flags",argv[i],2) ) + flags = ::atol(argv[++i]); + } + if ( flags ) + return new Conditions::ConditionsPrinter(prefix,flags); + return new Conditions::ConditionsPrinter(prefix); +} +DECLARE_LCDD_CONSTRUCTOR(DD4hepConditionsPrinter,create_conditions_printer) diff --git a/DDDB/src/DDDBConditionPrinter.cpp b/DDDB/src/DDDBConditionPrinter.cpp index 9b3da26c7ded82ec7bdc5a8e660753061caaeac0..573ee61f04e286669f1d1217b4ab3f8baeaca9c8 100644 --- a/DDDB/src/DDDBConditionPrinter.cpp +++ b/DDDB/src/DDDBConditionPrinter.cpp @@ -20,6 +20,7 @@ // Framework includes #include "DD4hep/Printout.h" +#include "DD4hep/Factories.h" #include "DDDB/DDDBConversion.h" #include "DDDB/DDDBConditionPrinter.h" @@ -104,3 +105,19 @@ int ConditionPrinter::operator()(Condition cond) { } return 1; } + +/// Plugin function +static void* create_dddb_conditions_printer(Geometry::LCDD& /* lcdd */, int argc,char** argv) { + string prefix = ""; + int flags = 0; + for(int i=0; i<argc && argv[i]; ++i) { + if ( 0 == ::strncmp("-prefix",argv[i],4) ) + prefix = argv[++i]; + else if ( 0 == ::strncmp("-flags",argv[i],2) ) + flags = ::atol(argv[++i]); + } + if ( flags ) + return new DDDB::ConditionPrinter(prefix,flags); + return new DDDB::ConditionPrinter(prefix); +} +DECLARE_LCDD_CONSTRUCTOR(DDDB_ConditionsPrinter,create_dddb_conditions_printer) diff --git a/DDDB/src/DDDBPlugins.cpp b/DDDB/src/DDDBPlugins.cpp index 02cc0f8c6438f80afe38043b8fd711d851979c54..861a475aab903158398b1087a42c63eac2d51cc9 100644 --- a/DDDB/src/DDDBPlugins.cpp +++ b/DDDB/src/DDDBPlugins.cpp @@ -35,17 +35,12 @@ using namespace std; using namespace DD4hep; using DD4hep::Geometry::LCDD; -/// Anonymous namespace for plugins -namespace { - - /// Plugin function - long dddb_dump_conditions(LCDD& lcdd, int , char** ) { - DDDB::ConditionPrinter prt; - const void* args[] = { &prt, 0}; - lcdd.apply("DD4hep_ConditionsDump", 1, (char**)args); - return 1; - } -} /* End anonymous namespace */ +/// Plugin function +static long dddb_dump_conditions(LCDD& lcdd, int , char** ) { + const void* args[] = { "-processor", "DDDB_ConditionsPrinter", "-prefix", "DDDB", 0}; + lcdd.apply("DD4hep_ConditionsDump", 4, (char**)args); + return 1; +} DECLARE_APPLY(DDDB_ConditionsDump,dddb_dump_conditions) //==========================================================================