SourceXtractorPlusPlus  0.8
Please provide a description of the project.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FrameModel.icpp
Go to the documentation of this file.
1 
23 namespace ModelFitting {
24 
25 template <typename PsfType>
27 
28 template <typename PsfType>
29 FrameModelPsfContainer<PsfType>::FrameModelPsfContainer(PsfType psf, size_t): PsfType(std::move(psf)) {}
30 
31 template <typename PsfType>
33  : PsfType(), m_psf_contexts(n_extended_models) {}
34 
35 template <typename PsfType>
37 : PsfType(std::move(psf)), m_psf_contexts(n_extended_models) {}
38 
39 template <typename PsfType, typename ImageType>
41  std::vector<ConstantModel> constant_model_list,
42  std::vector<PointModel> point_model_list,
43  std::vector<TransformedModel> extended_model_list,
44  PsfType psf)
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()} {
50 }
51 
52 template <typename PsfType, typename ImageType>
54  std::vector<ConstantModel> constant_model_list,
55  std::vector<PointModel> point_model_list,
56  std::vector<TransformedModel> 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()} {
62 }
63 
64 template <typename PsfType, typename ImageType>
66 
67 namespace _impl {
68 
69 template <typename ImageType>
70 void 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) {
75  *it += value;
76  }
77  }
78 }
79 
80 template <typename ImageType, typename PsfType>
81 void 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());
87  }
88 }
89 
90 template <typename ImageType, typename PsfType>
91 void addExtendedModels(ImageType& image, const std::vector<TransformedModel>& model_list,
92  PsfType& psf, double pixel_scale) {
93  using Traits = ImageTraits<ImageType>;
94  auto scale_factor = psf.getPixelScale() / pixel_scale;
95  for (size_t i = 0; i < model_list.size(); ++i) {
96  auto& model = model_list[i];
97  std::size_t width = std::ceil(model.getWidth() / psf.getPixelScale() + psf.getSize());
98  if (width%2 == 0) {
99  ++width;
100  }
101  std::size_t height = std::ceil(model.getHeight() / psf.getPixelScale() + psf.getSize());
102  if (height%2 == 0) {
103  ++height;
104  }
105  auto extended_image = model.getRasterizedImage<ImageType>(psf.getPixelScale(), width, height);
106  psf.convolve(i, extended_image);
107  Traits::addImageToImage(image, extended_image, scale_factor, model.getX(), model.getY());
108  }
109 }
110 
111 } // end of namespace _impl
112 
113 template <typename PsfType, typename ImageType>
115  using Traits = ImageTraits<ImageType>;
116  m_model_image.reset(new ImageType(Traits::factory(m_width, m_height)));
117  rasterToImage(*m_model_image);
118 }
119 
120 template <typename PsfType, typename ImageType>
122  recomputeImage();
123  return *m_model_image;
124 }
125 
126 template <typename PsfType, typename ImageType>
127 void FrameModel<PsfType, ImageType>::rasterToImage(ImageType &model_image) {
128  _impl::addConstantModels(model_image, m_constant_model_list);
129  _impl::addPointModels(model_image, m_point_model_list, m_psf, m_pixel_scale);
130  _impl::addExtendedModels(model_image, m_extended_model_list, m_psf, m_pixel_scale);
131 }
132 
133 template <typename PsfType, typename ImageType>
135  recomputeImage();
136  return ImageTraits<ImageType>::begin(*m_model_image);
137 }
138 
139 template <typename PsfType, typename ImageType>
141  return ImageTraits<ImageType>::end(*m_model_image);
142 }
143 
144 template <typename PsfType, typename ImageType>
146  return m_width * m_height;
147 }
148 
149 } // end of namespace ModelFitting
150 
static iterator end(ImageType &image)
void addExtendedModels(ImageType &image, const std::vector< TransformedModel > &model_list, PsfType &psf, double pixel_scale)
Definition: FrameModel.icpp:91
T ceil(T...args)
typename ImageTraits< ImageType >::iterator const_iterator
Definition: FrameModel.h:143
FrameModelPsfContainer(std::size_t n_extended_models)
Definition: FrameModel.icpp:26
static iterator begin(ImageType &image)
const ImageType & getImage()
const_iterator begin()
void addConstantModels(ImageType &image, const std::vector< ConstantModel > &model_list)
Definition: FrameModel.icpp:70
FrameModelPsfContextContainer(std::size_t n_extended_models)
Definition: FrameModel.icpp:32
void addPointModels(ImageType &image, const std::vector< PointModel > &model_list, const PsfType &psf, double pixel_scale)
Definition: FrameModel.icpp:81
std::size_t size() const
const_iterator end()
T move(T...args)
T size(T...args)
STL class.
FrameModel(double pixel_scale, std::size_t width, std::size_t height, std::vector< ConstantModel > constant_model_list, std::vector< PointModel > point_model_list, std::vector< TransformedModel > extended_model_list, PsfType psf)
Definition: FrameModel.icpp:40
const double pixel_scale
Definition: TestImage.cpp:72
void rasterToImage(ImageType &)