1/** Copyright © 2019 Université de Genève, LMU Munich - Faculty of Physics, IAP-CNRS/Sorbonne Université
3 * This library is free software; you can redistribute it and/or modify it under
4 * the terms of the GNU Lesser General Public License as published by the Free
5 * Software Foundation; either version 3.0 of the License, or (at your option)
8 * This library is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this library; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * @file FrameModel.icpp
19 * @date September 1, 2015
20 * @author Nikolaos Apostolakos
23namespace ModelFitting {
25template <typename PsfType>
26FrameModelPsfContainer<PsfType>::FrameModelPsfContainer(size_t): PsfType() {}
28template <typename PsfType>
29FrameModelPsfContainer<PsfType>::FrameModelPsfContainer(PsfType psf, size_t): PsfType(std::move(psf)) {}
31template <typename PsfType>
32FrameModelPsfContextContainer<PsfType>::FrameModelPsfContextContainer(size_t n_extended_models)
33 : PsfType(), m_psf_contexts(n_extended_models) {}
35template <typename PsfType>
36FrameModelPsfContextContainer<PsfType>::FrameModelPsfContextContainer(PsfType psf, size_t n_extended_models)
37: PsfType(std::move(psf)), m_psf_contexts(n_extended_models) {}
39template <typename PsfType, typename ImageType>
40FrameModel<PsfType, ImageType>::FrameModel(double pixel_scale, std::size_t width, std::size_t height,
41 std::vector<ConstantModel> constant_model_list,
42 std::vector<PointModel> point_model_list,
43 std::vector<std::shared_ptr<ExtendedModel<ImageType>>> extended_model_list,
45 : m_pixel_scale{pixel_scale}, m_width{width}, m_height{height},
46 m_constant_model_list{std::move(constant_model_list)},
47 m_point_model_list{std::move(point_model_list)},
48 m_extended_model_list{std::move(extended_model_list)},
49 m_psf{std::move(psf), m_extended_model_list.size()} {
52template <typename PsfType, typename ImageType>
53FrameModel<PsfType, ImageType>::FrameModel(double pixel_scale, std::size_t width, std::size_t height,
54 std::vector<ConstantModel> constant_model_list,
55 std::vector<PointModel> point_model_list,
56 std::vector<std::shared_ptr<ExtendedModel<ImageType>>> extended_model_list)
57 : m_pixel_scale{pixel_scale}, m_width{width}, m_height{height},
58 m_constant_model_list{std::move(constant_model_list)},
59 m_point_model_list{std::move(point_model_list)},
60 m_extended_model_list{std::move(extended_model_list)},
61 m_psf{m_extended_model_list.size()} {
64template <typename PsfType, typename ImageType>
65FrameModel<PsfType, ImageType>::~FrameModel() = default;
69template <typename ImageType>
70void addConstantModels(ImageType& image, const std::vector<ConstantModel>& model_list) {
71 using Traits = ImageTraits<ImageType>;
72 for (auto& model : model_list) {
73 double value = model.getValue();
74 for(auto it=Traits::begin(image); it!=Traits::end(image); ++it) {
80template <typename ImageType, typename PsfType>
81void addPointModels(ImageType& image, const std::vector<PointModel>& model_list,
82 const PsfType& psf, double pixel_scale) {
83 using Traits = ImageTraits<ImageType>;
84 auto scale_factor = psf.getPixelScale() / pixel_scale;
85 for (auto& model : model_list) {
86 Traits::addImageToImage(image, psf.getScaledKernel(model.getValue()), scale_factor, model.getX(), model.getY());
90template <typename ImageType, typename PsfType>
91void addExtendedModels(ImageType& image, const std::vector<std::shared_ptr<ExtendedModel<ImageType>>>& model_list,
92 PsfType& psf, double pixel_scale) {
93 using Traits = ImageTraits<ImageType>;
94 auto scale_factor = psf.getPixelScale() / pixel_scale;
96 for (size_t i = 0; i < model_list.size(); ++i) {
97 auto& model = model_list[i];
98 std::size_t width = std::ceil(model->getWidth() / psf.getPixelScale() + psf.getSize());
102 std::size_t height = std::ceil(model->getHeight() / psf.getPixelScale() + psf.getSize());
103 if (height % 2 == 0) {
107 auto extended_image = model->getRasterizedImage(psf.getPixelScale(), width, height);
108 psf.convolve(i, extended_image);
109 Traits::addImageToImage(image, extended_image, scale_factor, model->getX(), model->getY());
113} // end of namespace _impl
115template <typename PsfType, typename ImageType>
116void FrameModel<PsfType, ImageType>::recomputeImage() {
117 using Traits = ImageTraits<ImageType>;
118 m_model_image.reset(new ImageType(Traits::factory(m_width, m_height)));
119 rasterToImage(*m_model_image);
122template <typename PsfType, typename ImageType>
123const ImageType& FrameModel<PsfType, ImageType>::getImage() {
125 return *m_model_image;
128template <typename PsfType, typename ImageType>
129void FrameModel<PsfType, ImageType>::rasterToImage(ImageType &model_image) {
130 _impl::addConstantModels(model_image, m_constant_model_list);
131 _impl::addPointModels(model_image, m_point_model_list, m_psf, m_pixel_scale);
132 _impl::addExtendedModels(model_image, m_extended_model_list, m_psf, m_pixel_scale);
135template <typename PsfType, typename ImageType>
136auto FrameModel<PsfType, ImageType>::begin() -> const_iterator {
138 return ImageTraits<ImageType>::begin(*m_model_image);
141template <typename PsfType, typename ImageType>
142auto FrameModel<PsfType, ImageType>::end() -> const_iterator {
143 return ImageTraits<ImageType>::end(*m_model_image);
146template <typename PsfType, typename ImageType>
147std::size_t FrameModel<PsfType, ImageType>::size() const {
148 return m_width * m_height;
151} // end of namespace ModelFitting