SourceXtractorPlusPlus  0.19
SourceXtractor++, the next generation SExtractor
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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) {
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  if (info.m_is_data_cube) {
158  label << "_" << info.m_image_layer;
159  }
160 
161  m_measurement_frames[info.m_id] = FrameInfo {
162  label.str(),
163  info.m_measurement_image->getWidth(),
164  info.m_measurement_image->getHeight(),
165  info.m_coordinate_system,
166  frames.at(info.m_id)->getImage(LayerSubtractedImage)
167  };
168  }
169 }
170 
172  if (m_auto_aperture_filename.empty()) {
173  return nullptr;
174  }
175 
177 
178  auto i = m_measurement_auto_aperture_images.find(frame_number);
179  if (i == m_measurement_auto_aperture_images.end()) {
180  auto& frame_info = m_measurement_frames.at(frame_number);
181  auto filename = m_auto_aperture_filename.stem();
182  filename += "_" + frame_info.m_label;
183  filename += m_auto_aperture_filename.extension();
184  auto frame_filename = m_auto_aperture_filename.parent_path() / filename;
187  frame_number,
188  FitsWriter::newImage<int>(
189  frame_filename.native(),
190  frame_info.m_width,
191  frame_info.m_height,
192  frame_info.m_coordinate_system
193  ))).first;
194  }
195  return LockedWriteableImage<int>::create(i->second);
196 }
197 
199  if (m_aperture_filename.empty()) {
200  return nullptr;
201  }
202 
204 
205  auto i = m_measurement_aperture_images.find(frame_number);
206  if (i == m_measurement_aperture_images.end()) {
207  auto& frame_info = m_measurement_frames.at(frame_number);
208  auto filename = m_aperture_filename.stem();
209  filename += "_" + frame_info.m_label;
210  filename += m_aperture_filename.extension();
211  auto frame_filename = m_aperture_filename.parent_path() / filename;
212  i = m_measurement_aperture_images.emplace(
214  frame_number,
215  FitsWriter::newImage<int>(
216  frame_filename.native(),
217  frame_info.m_width,
218  frame_info.m_height,
219  frame_info.m_coordinate_system
220  ))).first;
221  }
222  return LockedWriteableImage<int>::create(i->second);
223 }
224 
226 CheckImages::getModelFittingImage(unsigned int frame_number) {
227  if (m_model_fitting_image_filename.empty() && m_residual_filename.empty()) {
228  return nullptr;
229  }
230 
232 
233  auto i = m_check_image_model_fitting.find(frame_number);
234  if (i == m_check_image_model_fitting.end()) {
235  auto& frame_info = m_measurement_frames.at(frame_number);
237 
238  if (m_model_fitting_image_filename.empty()) {
239  writeable_image = FitsWriter::newTemporaryImage<DetectionImage::PixelType>(
240  "sourcextractor_check_model_%%%%%%.fits",
241  frame_info.m_width, frame_info.m_height
242  );
243  } else {
245  filename += "_" + frame_info.m_label;
247  auto frame_filename = m_model_fitting_image_filename.parent_path() / filename;
248  writeable_image = FitsWriter::newImage<MeasurementImage::PixelType>(
249  frame_filename.native(),
250  frame_info.m_width,
251  frame_info.m_height,
252  frame_info.m_coordinate_system
253  );
254  }
255  i = m_check_image_model_fitting.emplace(std::make_pair(frame_number, writeable_image)).first;
256  }
258 }
259 
261  if (m_psf_filename.empty()) {
262  return nullptr;
263  }
264 
266 
267  auto i = m_check_image_psf.find(frame_number);
268  if (i == m_check_image_psf.end()) {
269  auto& frame_info = m_measurement_frames.at(frame_number);
270  auto filename = m_psf_filename.stem();
271  filename += "_" + frame_info.m_label;
272  filename += m_psf_filename.extension();
273  auto frame_filename = m_psf_filename.parent_path() / filename;
274  i = m_check_image_psf.emplace(
276  frame_number,
277  FitsWriter::newImage<MeasurementImage::PixelType>(
278  frame_filename.native(),
279  frame_info.m_width,
280  frame_info.m_height,
281  frame_info.m_coordinate_system
282  ))).first;
283  }
285 }
286 
288  CheckImages::getMLDetectionImage(unsigned int plane_number, size_t index) {
289 
290  if (m_ml_detection_filename.empty()) {
291  return nullptr;
292  }
293 
295 
296  auto i = m_check_image_ml_detection.at(index).find(plane_number);
297  if (i == m_check_image_ml_detection.at(index).end()) {
298  auto filename = m_ml_detection_filename.stem();
299  filename += "_" + std::to_string(plane_number);
300  filename += m_ml_detection_filename.extension();
301  auto frame_filename = m_ml_detection_filename.parent_path() / filename;
302  i = m_check_image_ml_detection.at(index).emplace(
304  plane_number,
305  FitsWriter::newImage<MeasurementImage::PixelType>(
306  frame_filename.native(),
307  m_detection_images.at(index)->getWidth(),
308  m_detection_images.at(index)->getHeight(),
309  m_coordinate_systems.at(index)
310  ))).first;
311  }
313 }
314 
317 
318  auto detection_images_nb = m_coordinate_systems.size();
319  for (size_t i = 0; i < detection_images_nb; i++) {
320  // if possible, save the background image
321  if (i < m_background_images.size() && m_background_images.at(i) != nullptr && m_model_background_filename != "") {
322  FitsWriter::writeFile(*m_background_images.at(i),
323  addNumberToFilename(m_model_background_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
324  }
325 
326  // if possible, save the variance image
327  if (i < m_variance_images.size() && m_variance_images.at(i) != nullptr && m_model_variance_filename != "") {
328  FitsWriter::writeFile(*m_variance_images.at(i),
329  addNumberToFilename(m_model_variance_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
330  }
331 
332  // if possible, save the filtered image
333  if (i < m_filtered_images.size() && m_filtered_images.at(i) != nullptr && m_filtered_filename != "") {
334  FitsWriter::writeFile(*m_filtered_images.at(i),
335  addNumberToFilename(m_filtered_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
336  }
337 
338  // if possible, save the thresholded image
339  if (i < m_thresholded_images.size() && m_thresholded_images.at(i) != nullptr && m_thresholded_filename != "") {
340  FitsWriter::writeFile(*m_thresholded_images.at(i),
341  addNumberToFilename(m_thresholded_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
342  }
343 
344  // if possible, save the SNR image
345  if (i < m_snr_images.size() && m_snr_images.at(i) != nullptr && m_snr_filename != "") {
346  FitsWriter::writeFile(*m_snr_images.at(i),
347  addNumberToFilename(m_snr_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
348  }
349  }
350 
351  // if possible, create and save the residual image
352  if (m_residual_filename != "") {
353  for (auto &ci : m_check_image_model_fitting) {
354  auto& frame_info = m_measurement_frames.at(ci.first);
355 
356  auto residual_image = SubtractImage<SeFloat>::create(frame_info.m_subtracted_image, ci.second);
357  auto filename = m_residual_filename.stem();
358  filename += "_" + frame_info.m_label;
359  filename += m_residual_filename.extension();
360  auto frame_filename = m_residual_filename.parent_path() / filename;
361  FitsWriter::writeFile(*residual_image, frame_filename.native(), frame_info.m_coordinate_system);
362  }
363  }
364 
365  for (auto const& entry : m_custom_images) {
366  if (std::get<1>(entry.second)) {
367  auto filename = entry.first;
368  if (!filename.has_extension()) {
369  filename += ".fits";
370  }
371  FitsWriter::writeFile(*std::get<0>(entry.second), filename.native());
372  }
373  }
374 }
375 
376 }
std::vector< std::shared_ptr< CoordinateSystem > > m_coordinate_systems
Definition: CheckImages.h:191
boost::filesystem::path m_partition_filename
Definition: CheckImages.h:198
boost::filesystem::path m_model_background_filename
Definition: CheckImages.h:195
static std::shared_ptr< LockedWriteableImage< T > > create(Args &&...args)
boost::filesystem::path m_filtered_filename
Definition: CheckImages.h:200
boost::filesystem::path m_thresholded_filename
Definition: CheckImages.h:201
void setCustomCheckImage(std::string id, std::shared_ptr< Image< SeFloat >> image)
Definition: CheckImages.cpp:80
std::vector< std::shared_ptr< WriteableImage< int > > > m_auto_aperture_images
Definition: CheckImages.h:174
std::map< boost::filesystem::path, std::tuple< std::shared_ptr< Image< SeFloat > >, bool > > m_custom_images
Definition: CheckImages.h:209
boost::filesystem::path m_model_variance_filename
Definition: CheckImages.h:196
std::map< unsigned int, std::shared_ptr< WriteableImage< int > > > m_measurement_auto_aperture_images
Definition: CheckImages.h:179
T to_string(T...args)
boost::filesystem::path m_aperture_filename
Definition: CheckImages.h:204
T make_tuple(T...args)
std::vector< std::shared_ptr< DetectionImage > > m_detection_images
Definition: CheckImages.h:183
std::vector< std::shared_ptr< Image< SeFloat > > > m_snr_images
Definition: CheckImages.h:187
boost::filesystem::path m_snr_filename
Definition: CheckImages.h:202
std::vector< std::shared_ptr< WriteableImage< int > > > m_segmentation_images
Definition: CheckImages.h:171
std::map< int, FrameInfo > m_measurement_frames
Definition: CheckImages.h:211
static std::unique_ptr< CheckImages > m_instance
Definition: CheckImages.h:161
Provides the detection image.
std::vector< std::shared_ptr< WriteableImage< int > > > m_partition_images
Definition: CheckImages.h:172
STL class.
std::vector< std::shared_ptr< Image< SeFloat > > > m_background_images
Definition: CheckImages.h:184
boost::filesystem::path m_auto_aperture_filename
Definition: CheckImages.h:203
boost::filesystem::path m_group_filename
Definition: CheckImages.h:199
std::vector< std::shared_ptr< Image< SeFloat > > > m_thresholded_images
Definition: CheckImages.h:186
boost::filesystem::path m_psf_filename
Definition: CheckImages.h:206
string filename
Definition: conf.py:65
boost::filesystem::path m_ml_detection_filename
Definition: CheckImages.h:207
std::map< unsigned int, std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > > m_check_image_model_fitting
Definition: CheckImages.h:180
std::vector< std::shared_ptr< WriteableImage< int > > > m_aperture_images
Definition: CheckImages.h:175
T lock(T...args)
T str(T...args)
T make_pair(T...args)
void configure(Euclid::Configuration::ConfigManager &manager) override
Method which should initialize the object.
Definition: CheckImages.cpp:84
T dynamic_pointer_cast(T...args)
std::map< unsigned int, std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > > m_check_image_psf
Definition: CheckImages.h:180
void reportConfigDependencies(Euclid::Configuration::ConfigManager &manager) const override
Registers all the Configuration dependencies.
Definition: CheckImages.cpp:58
std::shared_ptr< WriteableImage< float > > getMLDetectionImage(unsigned int plane_number, size_t index)
std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > getPsfImage(unsigned int frame_number)
STL class.
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)
std::vector< std::shared_ptr< Image< SeFloat > > > m_filtered_images
Definition: CheckImages.h:185
Interface representing an image.
Definition: Image.h:43
std::vector< std::shared_ptr< WriteableImage< int > > > m_group_images
Definition: CheckImages.h:173
std::vector< std::shared_ptr< WeightImage > > m_variance_images
Definition: CheckImages.h:188
std::shared_ptr< WriteableImage< SeFloat > > getWriteableCheckImage(std::string id, int width, int height)
Definition: CheckImages.cpp:65
boost::filesystem::path m_moffat_filename
Definition: CheckImages.h:205
boost::filesystem::path m_residual_filename
Definition: CheckImages.h:194
std::shared_ptr< WriteableImage< int > > getMeasurementApertureImage(unsigned int frame_number)
boost::filesystem::path m_model_fitting_image_filename
Definition: CheckImages.h:193
std::vector< std::map< unsigned int, std::shared_ptr< WriteableImage< float > > > > m_check_image_ml_detection
Definition: CheckImages.h:181
std::vector< std::shared_ptr< WriteableImage< SeFloat > > > m_moffat_images
Definition: CheckImages.h:176
static std::shared_ptr< ProcessedImage< T, P > > create(std::shared_ptr< const Image< T >> image_a, std::shared_ptr< const Image< T >> image_b)
boost::filesystem::path m_segmentation_filename
Definition: CheckImages.h:197
std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > getModelFittingImage(unsigned int frame_number)