CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PythonService.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Python
4 // Class : PythonService
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author: Benedikt Hegner
10 // Created: Sun Jul 23 11:31:33 CEST 2006
11 //
12 
13 // system include files
14 
15 // user include files
17 
20 
21 //
22 // constructor
23 //
25  handle_(PythonManager::handle())
26 {
27 
28  std::cout << "Start preparing PythonService" << std::endl;
29  const std::string fileName = iConfig.getParameter<std::string>("fileName");
30 
31  using namespace boost::python;
32 
33  command_ = "from "+fileName + " import *\n";
34  object main_module(( boost::python::handle<>(borrowed(PyImport_AddModule(const_cast<char *>("__main__"))))));
35  object main_namespace = main_module.attr("__dict__");
36  try {
37  object result((boost::python::handle<>(PyRun_String(command_.c_str(),
38  Py_file_input,
39  main_namespace.ptr(),
40  main_namespace.ptr()))));
41  service_ = main_namespace["service"];
42  } catch( ... ) {
43  throw cms::Exception("Configuration") <<"No 'service' python variable defined in given fileName parameter.\n Please create an instance of the python class you want to use and pass that instance to the variable named 'service'.";
44  }
45 
46  // connect methods and signals
47  // later on here will be a check what python methods are present
48  // for now we expect postBeginJob, postEndJob and postProcessEvent
49 
53 }
54 
55 //
56 // destructor
57 //
59 {
60 }
61 
62 
63 //
64 // member functions
65 //
67 {
68  using namespace boost::python;
69  object main_module((boost::python::handle<>(borrowed(PyImport_AddModule(const_cast<char *>("__main__"))))));
70  object main_namespace = main_module.attr("__dict__");
71  main_namespace["tempService"] = service_;
72 
73  try {
74  object result((boost::python::handle<>(PyRun_String("tempService.postBeginJob()",
75  Py_eval_input,
76  main_namespace.ptr(),
77  main_namespace.ptr()))));
78  }catch( error_already_set ) {
79  pythonToCppException("RuntimeError");
80  }
81 }
82 
83 
85 {
86  using namespace boost::python;
87  object main_module((boost::python::handle<>(borrowed(PyImport_AddModule(const_cast<char *>("__main__"))))));
88  object main_namespace = main_module.attr("__dict__");
89  main_namespace["tempService"] = service_;
90 
91  try {
92  object result((boost::python::handle<>(PyRun_String("tempService.postEndJob()",
93  Py_eval_input,
94  main_namespace.ptr(),
95  main_namespace.ptr()))));
96  }catch( error_already_set ) {
97  pythonToCppException("RuntimeError");
98  }
99 }
100 
101 
103 {
104 
105 }
106 
107 
109 {
110  using namespace boost::python;
111  object main_module((boost::python::handle<>(borrowed(PyImport_AddModule(const_cast<char *>("__main__"))))));
112  object main_namespace = main_module.attr("__dict__");
113  main_namespace["tempService"] = service_;
114 
115  try {
116  object result((boost::python::handle<>(PyRun_String("tempService.postProcessEvent()",
117  Py_eval_input,
118  main_namespace.ptr(),
119  main_namespace.ptr()))));
120  }catch( error_already_set ) {
121  pythonToCppException("RuntimeError");
122  }
123 
124 }
125 
128  desc.add<std::string>("fileName");
129  descriptions.addDefault(desc);
130 }
void pythonToCppException(const std::string &iType)
Definition: PythonManager.cc:5
T getParameter(std::string const &) const
void preProcessEvent(const edm::EventID &, const edm::Timestamp &)
void watchPostEndJob(PostEndJob::slot_type const &iSlot)
void watchPostProcessEvent(PostProcessEvent::slot_type const &iSlot)
void addDefault(ParameterSetDescription const &psetDescription)
tuple result
Definition: query.py:137
tuple handle
Definition: patZpeak.py:22
boost::python::object service_
Definition: PythonService.h:45
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void postBeginJob()
tuple cout
Definition: gather_cfg.py:41
PythonService(const edm::ParameterSet &, edm::ActivityRegistry &)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void postProcessEvent(const edm::Event &, const edm::EventSetup &)
void watchPostBeginJob(PostBeginJob::slot_type const &iSlot)
convenience function for attaching to signal
std::string command_
Definition: PythonService.h:47