SourceXtractorPlusPlus  0.17
SourceXtractor++, the next generation SExtractor
CheckImages.cpp
Go to the documentation of this file.
1 
17 /*
18  * CheckImages.cpp
19  *
20  * Created on: May 30, 2017
21  * Author: mschefer
22  */
23 
30 
32 
33 namespace SourceXtractor {
34 
35 namespace {
36 
37 std::string addNumberToFilename(boost::filesystem::path original_filename, size_t number, bool add_number) {
38  if (add_number) {
39  auto filename = original_filename.stem();
40  filename += "_" + std::to_string(number);
41  filename += original_filename.extension();
42 
43  filename = original_filename.parent_path() / filename;
44 
45  return filename.native();
46  } else {
47  return original_filename.native();
48  }
49 }
50 
51 }
52 
54 
56 }
57 
63 }
64 
66  if (m_custom_images.count(id) != 0) {
67  auto image = std::dynamic_pointer_cast<WriteableImage<SeFloat>>(std::get<0>(m_custom_images[id]));
68  if (image != nullptr) {
69  return image;
70  }
71  }
72 
73  auto image = FitsWriter::newImage<SeFloat>(id + ".fits",
74  width, height);
75  m_custom_images[id] = std::make_tuple(image, false);
76 
77  return image;
78 }
79 
81  m_custom_images[id] = std::make_tuple(image, true);
82 }
83 
85  auto& config = manager.getConfiguration<CheckImagesConfig>();
86 
87  m_model_fitting_image_filename = config.getModelFittingImageFilename();
88  m_residual_filename = config.getModelFittingResidualFilename();
89  m_model_background_filename = config.getModelBackgroundFilename();
90  m_model_variance_filename = config.getModelVarianceFilename();
91  m_segmentation_filename = config.getSegmentationFilename();
92  m_partition_filename = config.getPartitionFilename();
93  m_group_filename = config.getGroupFilename();
94  m_filtered_filename = config.getFilteredFilename();
95  m_thresholded_filename = config.getThresholdedFilename();
96  m_snr_filename = config.getSnrFilename();
97  m_auto_aperture_filename = config.getAutoApertureFilename();
98  m_aperture_filename = config.getApertureFilename();
99  m_moffat_filename = config.getMoffatFilename();
100  m_psf_filename = config.getPsfFilename();
101  m_ml_detection_filename = config.getMLDetectionFilename();
102 
103  size_t detection_images_nb = manager.getConfiguration<DetectionImageConfig>().getExtensionsNb();
104 
105  m_check_image_ml_detection.resize(detection_images_nb);
106 
107  for (size_t i = 0; i < detection_images_nb; i++) {
108  auto detection_image = manager.getConfiguration<DetectionImageConfig>().getDetectionImage();
109  auto coordinate_system = manager.getConfiguration<DetectionImageConfig>().getCoordinateSystem();
110 
111  m_detection_images.emplace_back(detection_image);
112  m_coordinate_systems.emplace_back(coordinate_system);
113 
114  if (m_segmentation_filename != "") {
115  m_segmentation_images.emplace_back(FitsWriter::newImage<int>(
116  addNumberToFilename(m_segmentation_filename, i, detection_images_nb>1),
117  detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
118  }
119 
120  if (m_partition_filename != "") {
121  m_partition_images.emplace_back(FitsWriter::newImage<int>(
122  addNumberToFilename(m_partition_filename, i, detection_images_nb>1),
123  detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
124  }
125 
126  if (m_group_filename != "") {
127  m_group_images.emplace_back(FitsWriter::newImage<int>(
128  addNumberToFilename(m_group_filename, i, detection_images_nb>1),
129  detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
130  }
131 
132  if (m_auto_aperture_filename != "") {
133  m_auto_aperture_images.emplace_back(FitsWriter::newImage<int>(
134  addNumberToFilename(m_auto_aperture_filename, i, detection_images_nb>1),
135  detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
136  }
137 
138  if (m_aperture_filename != "") {
139  m_aperture_images.emplace_back(FitsWriter::newImage<int>(
140  addNumberToFilename(m_aperture_filename, i, detection_images_nb>1),
141  detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
142  }
143 
144  if (m_moffat_filename != "") {
145  m_moffat_images.emplace_back(FitsWriter::newImage<SeFloat>(
146  addNumberToFilename(m_moffat_filename, i, detection_images_nb>1),
147  detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
148  }
149  }
150 
151  // Measurement images
152  const auto& measurement_images_info = manager.getConfiguration<MeasurementImageConfig>().getImageInfos();
153  const auto& frames = manager.getConfiguration<MeasurementFrameConfig>().getFrames();
154  for (auto& info : measurement_images_info) {
155  std::stringstream label;
156  label << boost::filesystem::basename(info.m_path) << "_" << info.m_image_hdu;
157 
158  m_measurement_frames[info.m_id] = FrameInfo {
159  label.str(),
160  info.m_measurement_image->getWidth(),
161  info.m_measurement_image->getHeight(),
162  info.m_coordinate_system,
163  frames.at(info.m_id)->getImage(LayerSubtractedImage)
164  };
165  }
166 }
167 
169  if (m_auto_aperture_filename.empty()) {
170  return nullptr;
171  }
172 
174 
175  auto i = m_measurement_auto_aperture_images.find(frame_number);
176  if (i == m_measurement_auto_aperture_images.end()) {
177  auto& frame_info = m_measurement_frames.at(frame_number);
178  auto filename = m_auto_aperture_filename.stem();
179  filename += "_" + frame_info.m_label;
180  filename += m_auto_aperture_filename.extension();
181  auto frame_filename = m_auto_aperture_filename.parent_path() / filename;
184  frame_number,
185  FitsWriter::newImage<int>(
186  frame_filename.native(),
187  frame_info.m_width,
188  frame_info.m_height,
189  frame_info.m_coordinate_system
190  ))).first;
191  }
192  return LockedWriteableImage<int>::create(i->second);
193 }
194 
196  if (m_aperture_filename.empty()) {
197  return nullptr;
198  }
199 
201 
202  auto i = m_measurement_aperture_images.find(frame_number);
203  if (i == m_measurement_aperture_images.end()) {
204  auto& frame_info = m_measurement_frames.at(frame_number);
205  auto filename = m_aperture_filename.stem();
206  filename += "_" + frame_info.m_label;
207  filename += m_aperture_filename.extension();
208  auto frame_filename = m_aperture_filename.parent_path() / filename;
209  i = m_measurement_aperture_images.emplace(
211  frame_number,
212  FitsWriter::newImage<int>(
213  frame_filename.native(),
214  frame_info.m_width,
215  frame_info.m_height,
216  frame_info.m_coordinate_system
217  ))).first;
218  }
219  return LockedWriteableImage<int>::create(i->second);
220 }
221 
223 CheckImages::getModelFittingImage(unsigned int frame_number) {
224  if (m_model_fitting_image_filename.empty() && m_residual_filename.empty()) {
225  return nullptr;
226  }
227 
229 
230  auto i = m_check_image_model_fitting.find(frame_number);
231  if (i == m_check_image_model_fitting.end()) {
232  auto& frame_info = m_measurement_frames.at(frame_number);
234 
235  if (m_model_fitting_image_filename.empty()) {
236  writeable_image = FitsWriter::newTemporaryImage<DetectionImage::PixelType>(
237  "sourcextractor_check_model_%%%%%%.fits",
238  frame_info.m_width, frame_info.m_height
239  );
240  } else {
242  filename += "_" + frame_info.m_label;
244  auto frame_filename = m_model_fitting_image_filename.parent_path() / filename;
245  writeable_image = FitsWriter::newImage<MeasurementImage::PixelType>(
246  frame_filename.native(),
247  frame_info.m_width,
248  frame_info.m_height,
249  frame_info.m_coordinate_system
250  );
251  }
252  i = m_check_image_model_fitting.emplace(std::make_pair(frame_number, writeable_image)).first;
253  }
255 }
256 
258  if (m_psf_filename.empty()) {
259  return nullptr;
260  }
261 
263 
264  auto i = m_check_image_psf.find(frame_number);
265  if (i == m_check_image_psf.end()) {
266  auto& frame_info = m_measurement_frames.at(frame_number);
267  auto filename = m_psf_filename.stem();
268  filename += "_" + frame_info.m_label;
269  filename += m_psf_filename.extension();
270  auto frame_filename = m_psf_filename.parent_path() / filename;
271  i = m_check_image_psf.emplace(
273  frame_number,
274  FitsWriter::newImage<MeasurementImage::PixelType>(
275  frame_filename.native(),
276  frame_info.m_width,
277  frame_info.m_height,
278  frame_info.m_coordinate_system
279  ))).first;
280  }
282 }
283 
285  CheckImages::getMLDetectionImage(unsigned int plane_number, size_t index) {
286 
287  if (m_ml_detection_filename.empty()) {
288  return nullptr;
289  }
290 
292 
293  auto i = m_check_image_ml_detection.at(index).find(plane_number);
294  if (i == m_check_image_ml_detection.at(index).end()) {
295  auto filename = m_ml_detection_filename.stem();
296  filename += "_" + std::to_string(plane_number);
297  filename += m_ml_detection_filename.extension();
298  auto frame_filename = m_ml_detection_filename.parent_path() / filename;
299  i = m_check_image_ml_detection.at(index).emplace(
301  plane_number,
302  FitsWriter::newImage<MeasurementImage::PixelType>(
303  frame_filename.native(),
304  m_detection_images.at(index)->getWidth(),
305  m_detection_images.at(index)->getHeight(),
306  m_coordinate_systems.at(index)
307  ))).first;
308  }
310 }
311 
314 
315  auto detection_images_nb = m_coordinate_systems.size();
316  for (size_t i = 0; i < detection_images_nb; i++) {
317  // if possible, save the background image
318  if (i < m_background_images.size() && m_background_images.at(i) != nullptr && m_model_background_filename != "") {
319  FitsWriter::writeFile(*m_background_images.at(i),
320  addNumberToFilename(m_model_background_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
321  }
322 
323  // if possible, save the variance image
324  if (i < m_variance_images.size() && m_variance_images.at(i) != nullptr && m_model_variance_filename != "") {
325  FitsWriter::writeFile(*m_variance_images.at(i),
326  addNumberToFilename(m_model_variance_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
327  }
328 
329  // if possible, save the filtered image
330  if (i < m_filtered_images.size() && m_filtered_images.at(i) != nullptr && m_filtered_filename != "") {
331  FitsWriter::writeFile(*m_filtered_images.at(i),
332  addNumberToFilename(m_filtered_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
333  }
334 
335  // if possible, save the thresholded image
336  if (i < m_thresholded_images.size() && m_thresholded_images.at(i) != nullptr && m_thresholded_filename != "") {
337  FitsWriter::writeFile(*m_thresholded_images.at(i),
338  addNumberToFilename(m_thresholded_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
339  }
340 
341  // if possible, save the SNR image
342  if (i < m_snr_images.size() && m_snr_images.at(i) != nullptr && m_snr_filename != "") {
343  FitsWriter::writeFile(*m_snr_images.at(i),
344  addNumberToFilename(m_snr_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
345  }
346  }
347 
348  // if possible, create and save the residual image
349  if (m_residual_filename != "") {
350  for (auto &ci : m_check_image_model_fitting) {
351  auto& frame_info = m_measurement_frames.at(ci.first);
352 
353  auto residual_image = SubtractImage<SeFloat>::create(frame_info.m_subtracted_image, ci.second);
354  auto filename = m_residual_filename.stem();
355  filename += "_" + frame_info.m_label;
356  filename += m_residual_filename.extension();
357  auto frame_filename = m_residual_filename.parent_path() / filename;
358  FitsWriter::writeFile(*residual_image, frame_filename.native(), frame_info.m_coordinate_system);
359  }
360  }
361 
362  for (auto const& entry : m_custom_images) {
363  if (std::get<1>(entry.second)) {
364  auto filename = entry.first;
365  if (!filename.has_extension()) {
366  filename += ".fits";
367  }
368  FitsWriter::writeFile(*std::get<0>(entry.second), filename.native());
369  }
370  }
371 }
372 
373 }
boost::filesystem::path m_partition_filename
Definition: CheckImages.h:198
std::vector< std::shared_ptr< WeightImage > > m_variance_images
Definition: CheckImages.h:188
std::vector< std::shared_ptr< DetectionImage > > m_detection_images
Definition: CheckImages.h:183
std::map< unsigned int, std::shared_ptr< WriteableImage< int > > > m_measurement_aperture_images
Definition: CheckImages.h:178
std::shared_ptr< WriteableImage< int > > getMeasurementAutoApertureImage(unsigned int frame_number)
boost::filesystem::path m_group_filename
Definition: CheckImages.h:199
std::map< unsigned int, std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > > m_check_image_psf
Definition: CheckImages.h:180
boost::filesystem::path m_ml_detection_filename
Definition: CheckImages.h:207
boost::filesystem::path m_residual_filename
Definition: CheckImages.h:194
std::map< unsigned int, std::shared_ptr< WriteableImage< int > > > m_measurement_auto_aperture_images
Definition: CheckImages.h:179
boost::filesystem::path m_filtered_filename
Definition: CheckImages.h:200
std::shared_ptr< WriteableImage< int > > getMeasurementApertureImage(unsigned int frame_number)
std::vector< std::shared_ptr< WriteableImage< int > > > m_group_images
Definition: CheckImages.h:173
std::shared_ptr< WriteableImage< float > > getMLDetectionImage(unsigned int plane_number, size_t index)
boost::filesystem::path m_model_background_filename
Definition: CheckImages.h:195
static std::unique_ptr< CheckImages > m_instance
Definition: CheckImages.h:161
boost::filesystem::path m_model_variance_filename
Definition: CheckImages.h:196
void configure(Euclid::Configuration::ConfigManager &manager) override
Method which should initialize the object.
Definition: CheckImages.cpp:84
std::shared_ptr< WriteableImage< SeFloat > > getWriteableCheckImage(std::string id, int width, int height)
Definition: CheckImages.cpp:65
boost::filesystem::path m_auto_aperture_filename
Definition: CheckImages.h:203
std::map< unsigned int, std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > > m_check_image_model_fitting
Definition: CheckImages.h:180
boost::filesystem::path m_moffat_filename
Definition: CheckImages.h:205
std::vector< std::shared_ptr< Image< SeFloat > > > m_filtered_images
Definition: CheckImages.h:185
boost::filesystem::path m_snr_filename
Definition: CheckImages.h:202
std::vector< std::shared_ptr< Image< SeFloat > > > m_thresholded_images
Definition: CheckImages.h:186
boost::filesystem::path m_psf_filename
Definition: CheckImages.h:206
std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > getPsfImage(unsigned int frame_number)
std::vector< std::shared_ptr< CoordinateSystem > > m_coordinate_systems
Definition: CheckImages.h:191
std::vector< std::shared_ptr< WriteableImage< int > > > m_partition_images
Definition: CheckImages.h:172
std::vector< std::shared_ptr< WriteableImage< int > > > m_aperture_images
Definition: CheckImages.h:175
boost::filesystem::path m_segmentation_filename
Definition: CheckImages.h:197
void reportConfigDependencies(Euclid::Configuration::ConfigManager &manager) const override
Registers all the Configuration dependencies.
Definition: CheckImages.cpp:58
std::vector< std::shared_ptr< WriteableImage< int > > > m_segmentation_images
Definition: CheckImages.h:171
std::vector< std::map< unsigned int, std::shared_ptr< WriteableImage< float > > > > m_check_image_ml_detection
Definition: CheckImages.h:181
boost::filesystem::path m_thresholded_filename
Definition: CheckImages.h:201
boost::filesystem::path m_aperture_filename
Definition: CheckImages.h:204
std::vector< std::shared_ptr< Image< SeFloat > > > m_snr_images
Definition: CheckImages.h:187
std::vector< std::shared_ptr< WriteableImage< int > > > m_auto_aperture_images
Definition: CheckImages.h:174
std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > getModelFittingImage(unsigned int frame_number)
std::vector< std::shared_ptr< WriteableImage< SeFloat > > > m_moffat_images
Definition: CheckImages.h:176
boost::filesystem::path m_model_fitting_image_filename
Definition: CheckImages.h:193
void setCustomCheckImage(std::string id, std::shared_ptr< Image< SeFloat >> image)
Definition: CheckImages.cpp:80
std::map< int, FrameInfo > m_measurement_frames
Definition: CheckImages.h:211
std::vector< std::shared_ptr< Image< SeFloat > > > m_background_images
Definition: CheckImages.h:184
std::map< boost::filesystem::path, std::tuple< std::shared_ptr< Image< SeFloat > >, bool > > m_custom_images
Definition: CheckImages.h:209
Provides the detection image.
Interface representing an image.
Definition: Image.h:43
static std::shared_ptr< LockedWriteableImage< T > > create(Args &&... args)
static std::shared_ptr< ProcessedImage< T, P > > create(std::shared_ptr< const Image< T >> image_a, std::shared_ptr< const Image< T >> image_b)
T lock(T... args)
T make_pair(T... args)
T make_tuple(T... args)
@ LayerSubtractedImage
Definition: Frame.h:39
string filename
Definition: conf.py:63
T str(T... args)
T to_string(T... args)