102 SeFloat gain = frame_info.getGain();
103 SeFloat saturation = frame_info.getSaturation();
108 for (
int y = 0; y < rect.getHeight(); y++) {
109 for (
int x = 0; x < rect.getWidth(); x++) {
110 auto back_var = variance_map->getValue(rect.getTopLeft().m_x + x, rect.getTopLeft().m_y + y);
111 auto pixel_val = frame_image->getValue(rect.getTopLeft().m_x + x, rect.getTopLeft().m_y + y);
112 if (saturation > 0 && pixel_val > saturation) {
113 weight->at(x, y) = 0;
115 else if (gain > 0.0 && pixel_val > 0.0) {
116 weight->at(x, y) =
sqrt(1.0 / (back_var + pixel_val / gain));
119 weight->at(x, y) =
sqrt(1.0 / back_var);
132 int frame_index = frame->getFrameNb();
134 auto frame_coordinates =
136 auto ref_coordinates =
143 if (psf_property.getPsf() ==
nullptr) {
144 throw Elements::Exception() <<
"Missing PSF. No PSF mode is not supported in legacy model fitting";
151 auto group_psf =
ImagePsf(
pixel_scale * psf_property.getPixelSampling(), psf_property.getPsf());
157 double model_size =
std::max(stamp_rect.getWidth(), stamp_rect.getHeight());
158 for (
auto& source : group) {
159 for (
auto model : frame->getModels()) {
160 model->addForSource(manager, source, constant_models, point_models, extended_models, model_size,
161 jacobian, ref_coordinates, frame_coordinates, stamp_rect.getTopLeft());
167 pixel_scale, (
size_t) stamp_rect.getWidth(), (
size_t) stamp_rect.getHeight(),
178 int n_free_parameters = 0;
181 for (
auto& source : group) {
187 parameter->create(parameter_manager, engine_parameter_manager, source));
198 int valid_frames = 0;
199 int n_good_pixels = 0;
201 int frame_index = frame->getFrameNb();
211 for (
int y = 0; y < weight->getHeight(); ++y) {
212 for (
int x = 0; x < weight->getWidth(); ++x) {
213 n_good_pixels += (weight->at(x, y) != 0.);
228 if (valid_frames == 0) {
231 else if (n_good_pixels < n_free_parameters) {
241 for (
auto& source : group) {
243 prior->setupPrior(parameter_manager, source, res_estimator);
252 auto solution = engine->solveProblem(engine_parameter_manager, res_estimator);
253 auto iterations = solution.iteration_no;
254 auto stop_reason = solution.engine_stop_reason;
255 switch (solution.status_flag) {
266 int total_data_points = 0;
269 int nb_of_free_parameters = 0;
270 for (
auto& source : group) {
273 bool accessed_by_modelfitting = parameter_manager.
isParamAccessed(source, parameter);
274 if (is_free_parameter && accessed_by_modelfitting) {
275 nb_of_free_parameters++;
279 avg_reduced_chi_squared /= (total_data_points - nb_of_free_parameters);
282 for (
auto& source : group) {
289 bool accessed_by_modelfitting = parameter_manager.
isParamAccessed(source, parameter);
290 auto modelfitting_parameter = parameter_manager.
getParameter(source, parameter);
292 if (is_constant_parameter || is_dependent_parameter || accessed_by_modelfitting) {
293 parameter_values[parameter->getId()] = modelfitting_parameter->getValue();
294 parameter_sigmas[parameter->getId()] = parameter->getSigma(parameter_manager, source, solution.parameter_sigmas);
299 if (engine_parameter) {
308 avg_reduced_chi_squared, solution.duration,
source_flags,
309 parameter_values, parameter_sigmas,
318 logger.error() <<
"An exception occured during model fitting: " << e.what();
349 int frame_index = frame->getFrameNb();
353 auto final_stamp = frame_model.getImage();
360 for (
int x = 0; x < final_stamp->getWidth(); x++) {
361 for (
int y = 0; y < final_stamp->getHeight(); y++) {
362 auto x_coord = stamp_rect.getTopLeft().m_x + x;
363 auto y_coord = stamp_rect.getTopLeft().m_y + y;
364 debug_image->setValue(x_coord, y_coord,
365 debugAccessor.
getValue(x_coord, y_coord) + final_stamp->getValue(x, y));
std::unique_ptr< DataVsModelResiduals< typename std::remove_reference< DataType >::type, typename std::remove_reference< ModelType >::type, typename std::remove_reference< WeightType >::type, typename std::remove_reference< Comparator >::type > > createDataVsModelResiduals(DataType &&data, ModelType &&model, WeightType &&weight, Comparator &&comparator)