24 #include <system_error>
26 #include <boost/python/dict.hpp>
27 #include <boost/python/exec.hpp>
28 #include <boost/python/extract.hpp>
29 #include <boost/python/import.hpp>
30 #include <boost/python/object.hpp>
55 struct sigaction sigint_handler;
56 sigaction(SIGINT,
nullptr, &sigint_handler);
63 sigaction(SIGINT, &sigint_handler,
nullptr);
73 py::object main_module = py::import(
"__main__");
74 py::object main_namespace = main_module.attr(
"__dict__");
76 py::exec(code.
c_str(), main_namespace);
78 catch (
const py::error_already_set &
e) {
89 #if PY_MAJOR_VERSION == 2
90 using py_argv_char_t = char;
91 # define py_argv_assign(d, s, l) d = strndup(s, l)
93 using py_argv_char_t = wchar_t;
94 # define py_argv_assign(d, s, l) d = Py_DecodeLocale(s, &(l))
97 py_argv_char_t **py_argv =
static_cast<py_argv_char_t**
>(PyMem_MALLOC((argv.
size() + 1) *
sizeof(py_argv_char_t*)));
100 for (
size_t i = 0; i < argv.
size(); ++i) {
101 wlen = argv[i].
size();
104 PySys_SetArgv(argv.
size() + 1, py_argv);
107 py::import(
"_SourceXtractorPy");
110 PySys_SetObject(
"stdout", py::object(boost::ref(
m_out_wrapper)).ptr());
111 PySys_SetObject(
"stderr", py::object(boost::ref(
m_err_wrapper)).ptr());
114 py::object main_module = py::import(
"__main__");
115 py::setattr(main_module,
"__file__", py::object(
filename));
116 py::object main_namespace = main_module.attr(
"__dict__");
126 py::exec(pycode.
c_str(), main_namespace);
128 catch (
const py::error_already_set &
e) {
140 py::object meas_images_module = py::import(
"sourcextractor.config.measurement_images");
141 py::dict images = py::extract<py::dict>(meas_images_module.attr(
"measurement_images"));
142 py::list ids = images.keys();
144 for (
int i = 0; i < py::len(ids); ++i) {
145 int id = py::extract<int>(ids[i]);
151 catch (
const py::error_already_set &
e) {
160 py::object apertures_module = py::import(
"sourcextractor.config.aperture");
161 py::dict apertures = py::extract<py::dict>(apertures_module.attr(
"apertures_for_image"));
162 py::list ids = apertures.keys();
164 for (
int i = 0; i < py::len(ids); ++i) {
165 int id = py::extract<int>(ids[i]);
166 PyAperture ap = py::extract<PyAperture>(apertures[ids[i]]);
171 catch (
const py::error_already_set &
e) {
180 py::object output_module = py::import(
"sourcextractor.config.output");
181 py::list output = py::extract<py::list>(output_module.attr(
"model_fitting_parameter_columns"));
183 for (
int i = 0; i < py::len(output); ++i) {
184 py::tuple t = py::extract<py::tuple>(output[i]);
186 auto extract_list = py::extract<py::list>(t[1]);
189 if (extract_list.check()) {
190 py::list cs = extract_list;
191 for (
int j = 0; j < py::len(cs); ++j) {
192 int c = py::extract<int>(cs[j].attr(
"id"));
196 int c = py::extract<int>(t[1]);
203 catch (
const py::error_already_set &
e) {
212 py::object output_module = py::import(
"sourcextractor.config.output");
213 py::list output = py::extract<py::list>(output_module.attr(
"aperture_columns"));
215 for (
int i = 0; i < py::len(output); ++i) {
216 py::tuple t = py::extract<py::tuple>(output[i]);
218 auto extract_list = py::extract<py::list>(t[1]);
220 if (extract_list.check()) {
221 py::list cs = extract_list;
222 for (
int j = 0; j < py::len(cs); ++j) {
223 int c = py::extract<int>(cs[j].attr(
"id"));
224 result[name].push_back(c);
227 int c = py::extract<int>(t[1]);
228 result[name].push_back(c);
233 catch (
const py::error_already_set &
e) {
244 py::object model_fitting_module = py::import(module_name);
245 py::dict parameters = py::extract<py::dict>(model_fitting_module.attr(dict_name));
246 py::list ids = parameters.keys();
248 for (
int i = 0; i < py::len(ids); ++i) {
249 int id = py::extract<int>(ids[i]);
250 auto par = parameters[ids[i]];
255 catch (
const py::error_already_set &e) {
263 return getMapFromDict(
"sourcextractor.config.model_fitting",
"constant_parameter_dict");
267 return getMapFromDict(
"sourcextractor.config.model_fitting",
"free_parameter_dict");
271 return getMapFromDict(
"sourcextractor.config.model_fitting",
"dependent_parameter_dict");
275 return getMapFromDict(
"sourcextractor.config.model_fitting",
"prior_dict");
279 return getMapFromDict(
"sourcextractor.config.model_fitting",
"constant_model_dict");
283 return getMapFromDict(
"sourcextractor.config.model_fitting",
"point_source_model_dict");
287 return getMapFromDict(
"sourcextractor.config.model_fitting",
"sersic_model_dict");
291 return getMapFromDict(
"sourcextractor.config.model_fitting",
"exponential_model_dict");
295 return getMapFromDict(
"sourcextractor.config.model_fitting",
"de_vaucouleurs_model_dict");
299 return getMapFromDict(
"sourcextractor.config.model_fitting",
"onnx_model_dict");
306 py::object model_fitting_module = py::import(
"sourcextractor.config.model_fitting");
307 py::dict frame_dict = py::extract<py::dict>(model_fitting_module.attr(
"frame_models_dict"));
308 py::list frame_ids = frame_dict.keys();
309 for (
int i = 0; i < py::len(frame_ids); ++i) {
310 int frame_id = py::extract<int>(frame_ids[i]);
311 py::list model_ids = py::extract<py::list>(frame_dict[frame_ids[i]]);
312 for (
int j = 0; j < py::len(model_ids); ++j) {
313 int model_id = py::extract<int>(model_ids[j]);
314 result[frame_id].push_back(model_id);
319 catch (
const py::error_already_set &
e) {
327 py::object model_fitting_module = py::import(
"sourcextractor.config.model_fitting");
328 py::dict parameters = py::extract<py::dict>(model_fitting_module.attr(
"params_dict"));
329 py::list ids = parameters.keys();
331 for (
int i = 0; i < py::len(ids); ++i) {
333 auto par = parameters[ids[i]];
343 py::object model_fitting_module = py::import(
"sourcextractor.config.measurement_images");
344 py::list groups = py::extract<py::list>(model_fitting_module.attr(
"MeasurementGroup").attr(
"_all_groups"));
346 for (
int i = 0; i < py::len(groups); ++i) {
351 catch (
const py::error_already_set &
e) {
359 py::object model_fitting_module = py::import(
"sourcextractor.config.model_fitting");
360 auto python_function = model_fitting_module.attr(
"set_coordinate_system");
361 python_function(coordinate_system);
#define PYSTON_MODULE_INIT
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="")
const Exception & log(log4cpp::Priority::Value level, Elements::Logging &logger) const
static size_t getLockCount()
T emplace_back(T... args)
T system_category(T... args)