24 #include <boost/python/dict.hpp>
25 #include <boost/python/exec.hpp>
26 #include <boost/python/extract.hpp>
27 #include <boost/python/import.hpp>
28 #include <boost/python/object.hpp>
35 namespace py = boost::python;
52 struct sigaction sigint_handler;
53 sigaction(SIGINT,
nullptr, &sigint_handler);
59 sigaction(SIGINT, &sigint_handler,
nullptr);
65 py::object main_module = py::import(
"__main__");
66 py::object main_namespace = main_module.attr(
"__dict__");
68 py::exec(code.
c_str(), main_namespace);
70 catch (
const py::error_already_set &
e) {
81 #if PY_MAJOR_VERSION == 2
82 using py_argv_char_t = char;
83 # define py_argv_assign(d, s, l) d = strndup(s, l)
85 using py_argv_char_t = wchar_t;
86 # define py_argv_assign(d, s, l) d = Py_DecodeLocale(s, &l)
89 py_argv_char_t **py_argv =
static_cast<py_argv_char_t**
>(PyMem_MALLOC((argv.
size() + 1) *
sizeof(py_argv_char_t*)));
92 for (
size_t i = 0; i < argv.
size(); ++i) {
93 wlen = argv[i].
size();
96 PySys_SetArgv(argv.
size() + 1, py_argv);
99 py::import(
"_SourceXtractorPy");
102 PySys_SetObject(
"stdout", py::object(boost::ref(
m_out_wrapper)).ptr());
103 PySys_SetObject(
"stderr", py::object(boost::ref(
m_err_wrapper)).ptr());
106 py::object main_module = py::import(
"__main__");
107 py::setattr(main_module,
"__file__", py::object(
filename));
108 py::object main_namespace = main_module.attr(
"__dict__");
109 py::exec_file(
filename.c_str(), main_namespace);
111 catch (
const py::error_already_set &
e) {
120 py::object meas_images_module = py::import(
"sourcextractor.config.measurement_images");
121 py::dict images = py::extract<py::dict>(meas_images_module.attr(
"measurement_images"));
122 py::list ids = images.keys();
124 for (
int i = 0; i < py::len(ids); ++i) {
125 int id = py::extract<int>(ids[i]);
131 catch (
const py::error_already_set &
e) {
140 py::object apertures_module = py::import(
"sourcextractor.config.aperture");
141 py::dict apertures = py::extract<py::dict>(apertures_module.attr(
"apertures_for_image"));
142 py::list ids = apertures.keys();
144 for (
int i = 0; i < py::len(ids); ++i) {
145 int id = py::extract<int>(ids[i]);
146 PyAperture ap = py::extract<PyAperture>(apertures[ids[i]]);
151 catch (
const py::error_already_set &
e) {
160 py::object output_module = py::import(
"sourcextractor.config.output");
161 py::list output = py::extract<py::list>(output_module.attr(
"model_fitting_parameter_columns"));
163 for (
int i = 0; i < py::len(output); ++i) {
164 py::tuple t = py::extract<py::tuple>(output[i]);
166 auto extract_list = py::extract<py::list>(t[1]);
169 if (extract_list.check()) {
170 py::list cs = extract_list;
171 for (
int j = 0; j < py::len(cs); ++j) {
172 int c = py::extract<int>(cs[j].attr(
"id"));
176 int c = py::extract<int>(t[1]);
183 catch (
const py::error_already_set &
e) {
192 py::object output_module = py::import(
"sourcextractor.config.output");
193 py::list output = py::extract<py::list>(output_module.attr(
"aperture_columns"));
195 for (
int i = 0; i < py::len(output); ++i) {
196 py::tuple t = py::extract<py::tuple>(output[i]);
198 auto extract_list = py::extract<py::list>(t[1]);
200 if (extract_list.check()) {
201 py::list cs = extract_list;
202 for (
int j = 0; j < py::len(cs); ++j) {
203 int c = py::extract<int>(cs[j].attr(
"id"));
204 result[name].push_back(c);
207 int c = py::extract<int>(t[1]);
208 result[name].push_back(c);
213 catch (
const py::error_already_set &
e) {
224 py::object model_fitting_module = py::import(module_name);
225 py::dict parameters = py::extract<py::dict>(model_fitting_module.attr(dict_name));
226 py::list ids = parameters.keys();
228 for (
int i = 0; i < py::len(ids); ++i) {
229 int id = py::extract<int>(ids[i]);
230 auto par = parameters[ids[i]];
235 catch (
const py::error_already_set &e) {
243 return getMapFromDict(
"sourcextractor.config.model_fitting",
"constant_parameter_dict");
247 return getMapFromDict(
"sourcextractor.config.model_fitting",
"free_parameter_dict");
251 return getMapFromDict(
"sourcextractor.config.model_fitting",
"dependent_parameter_dict");
255 return getMapFromDict(
"sourcextractor.config.model_fitting",
"prior_dict");
259 return getMapFromDict(
"sourcextractor.config.model_fitting",
"constant_model_dict");
263 return getMapFromDict(
"sourcextractor.config.model_fitting",
"point_source_model_dict");
267 return getMapFromDict(
"sourcextractor.config.model_fitting",
"sersic_model_dict");
271 return getMapFromDict(
"sourcextractor.config.model_fitting",
"exponential_model_dict");
275 return getMapFromDict(
"sourcextractor.config.model_fitting",
"de_vaucouleurs_model_dict");
282 py::object model_fitting_module = py::import(
"sourcextractor.config.model_fitting");
283 py::dict frame_dict = py::extract<py::dict>(model_fitting_module.attr(
"frame_models_dict"));
284 py::list frame_ids = frame_dict.keys();
285 for (
int i = 0; i < py::len(frame_ids); ++i) {
286 int frame_id = py::extract<int>(frame_ids[i]);
287 py::list model_ids = py::extract<py::list>(frame_dict[frame_ids[i]]);
288 for (
int j = 0; j < py::len(model_ids); ++j) {
289 int model_id = py::extract<int>(model_ids[j]);
290 result[frame_id].push_back(model_id);
295 catch (
const py::error_already_set &
e) {
303 py::object model_fitting_module = py::import(
"sourcextractor.config.model_fitting");
304 py::dict parameters = py::extract<py::dict>(model_fitting_module.attr(
"params_dict"));
305 py::list ids = parameters.keys();
307 for (
int i = 0; i < py::len(ids); ++i) {
309 auto par = parameters[ids[i]];
319 py::object model_fitting_module = py::import(
"sourcextractor.config.measurement_images");
320 py::list groups = py::extract<py::list>(model_fitting_module.attr(
"MeasurementGroup").attr(
"_all_groups"));
322 for (
int i = 0; i < py::len(groups); ++i) {
327 catch (
const py::error_already_set &
e) {
335 py::object model_fitting_module = py::import(
"sourcextractor.config.model_fitting");
336 auto python_function = model_fitting_module.attr(
"set_coordinate_system");
337 python_function(coordinate_system);
static Elements::Logging stdout_logger
#define py_argv_assign(d, s, l)
static Elements::Logging logger
static Elements::Logging stderr_logger
static Logging getLogger(const std::string &name="")
T emplace_back(T... args)