SourceXtractorPlusPlus 1.0.3
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
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
33namespace SourceXtractor {
34
35namespace {
36
37std::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
57
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
83
85 auto& config = manager.getConfiguration<CheckImagesConfig>();
86
87 m_model_fitting_image_filename = config.getModelFittingImageFilename();
88 m_fitting_window_image_filename = config.getFittingWindowImageFilename();
89 m_residual_filename = config.getModelFittingResidualFilename();
90 m_background_filename = config.getBackgroundFilename();
91 m_variance_filename = config.getVarianceFilename();
92 m_segmentation_filename = config.getSegmentationFilename();
93 m_partition_filename = config.getPartitionFilename();
94 m_group_filename = config.getGroupFilename();
95 m_filtered_filename = config.getFilteredFilename();
96 m_thresholded_filename = config.getThresholdedFilename();
97 m_snr_filename = config.getSnrFilename();
98 m_auto_aperture_filename = config.getAutoApertureFilename();
99 m_aperture_filename = config.getApertureFilename();
100 m_moffat_filename = config.getMoffatFilename();
101 m_psf_filename = config.getPsfFilename();
102 m_ml_detection_filename = config.getMLDetectionFilename();
103
104 m_measurement_background_filename = config.getMeasurementBackgroundFilename();
105 m_measurement_variance_filename = config.getMeasurementVarianceFilename();
106
107 size_t detection_images_nb = manager.getConfiguration<DetectionImageConfig>().getExtensionsNb();
108
109 m_check_image_ml_detection.resize(detection_images_nb);
110
111 for (size_t i = 0; i < detection_images_nb; i++) {
112 auto detection_image = manager.getConfiguration<DetectionImageConfig>().getDetectionImage();
113 auto coordinate_system = manager.getConfiguration<DetectionImageConfig>().getCoordinateSystem();
114
115 m_detection_images.emplace_back(detection_image);
116 m_coordinate_systems.emplace_back(coordinate_system);
117
118 if (m_segmentation_filename != "") {
120 addNumberToFilename(m_segmentation_filename, i, detection_images_nb>1),
121 detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
122 }
123
124 if (m_partition_filename != "") {
126 addNumberToFilename(m_partition_filename, i, detection_images_nb>1),
127 detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
128 }
129
130 if (m_group_filename != "") {
132 addNumberToFilename(m_group_filename, i, detection_images_nb>1),
133 detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
134 }
135
136 if (m_auto_aperture_filename != "") {
138 addNumberToFilename(m_auto_aperture_filename, i, detection_images_nb>1),
139 detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
140 }
141
142 if (m_aperture_filename != "") {
144 addNumberToFilename(m_aperture_filename, i, detection_images_nb>1),
145 detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
146 }
147
148 if (m_moffat_filename != "") {
150 addNumberToFilename(m_moffat_filename, i, detection_images_nb>1),
151 detection_image->getWidth(), detection_image->getHeight(), coordinate_system));
152 }
153 }
154
155 // Measurement images
156 const auto& measurement_images_info = manager.getConfiguration<MeasurementImageConfig>().getImageInfos();
157 const auto& frames = manager.getConfiguration<MeasurementFrameConfig>().getFrames();
158 for (auto& info : measurement_images_info) {
159 std::stringstream label;
160 label << boost::filesystem::path(info.m_path).stem().string() << "_" << info.m_image_hdu;
161 if (info.m_is_data_cube) {
162 label << "_" << info.m_image_layer;
163 }
164
165 m_measurement_frames[info.m_id] = FrameInfo {
166 label.str(),
167 info.m_measurement_image->getWidth(),
168 info.m_measurement_image->getHeight(),
169 info.m_coordinate_system,
170 frames.at(info.m_id)->getImage(LayerSubtractedImage)
171 };
172 }
173}
174
177
178 if (m_auto_aperture_filename.empty()) {
179 return nullptr;
180 }
181
182 auto i = m_measurement_auto_aperture_images.find(frame_number);
183 if (i == m_measurement_auto_aperture_images.end()) {
184 auto& frame_info = m_measurement_frames.at(frame_number);
185 auto filename = m_auto_aperture_filename.stem();
186 filename += "_" + frame_info.m_label;
187 filename += m_auto_aperture_filename.extension();
188 auto frame_filename = m_auto_aperture_filename.parent_path() / filename;
191 frame_number,
193 frame_filename.native(),
194 frame_info.m_width,
195 frame_info.m_height,
196 frame_info.m_coordinate_system
197 ))).first;
198 }
199 return LockedWriteableImage<int>::create(i->second);
200}
201
204
205 if (m_aperture_filename.empty()) {
206 return nullptr;
207 }
208
209 auto i = m_measurement_aperture_images.find(frame_number);
210 if (i == m_measurement_aperture_images.end()) {
211 auto& frame_info = m_measurement_frames.at(frame_number);
212 auto filename = m_aperture_filename.stem();
213 filename += "_" + frame_info.m_label;
214 filename += m_aperture_filename.extension();
215 auto frame_filename = m_aperture_filename.parent_path() / filename;
218 frame_number,
220 frame_filename.native(),
221 frame_info.m_width,
222 frame_info.m_height,
223 frame_info.m_coordinate_system
224 ))).first;
225 }
226 return LockedWriteableImage<int>::create(i->second);
227}
228
230CheckImages::getModelFittingImage(unsigned int frame_number) {
232
234 return nullptr;
235 }
236
237 auto i = m_check_image_model_fitting.find(frame_number);
238 if (i == m_check_image_model_fitting.end()) {
239 auto& frame_info = m_measurement_frames.at(frame_number);
241
242 if (m_model_fitting_image_filename.empty()) {
244 "sourcextractor_check_model_%%%%%%.fits",
245 frame_info.m_width, frame_info.m_height
246 );
247 } else {
248 auto filename = m_model_fitting_image_filename.stem();
249 filename += "_" + frame_info.m_label;
250 filename += m_model_fitting_image_filename.extension();
251 auto frame_filename = m_model_fitting_image_filename.parent_path() / filename;
253 frame_filename.native(),
254 frame_info.m_width,
255 frame_info.m_height,
256 frame_info.m_coordinate_system
257 );
258 }
259 i = m_check_image_model_fitting.emplace(std::make_pair(frame_number, writeable_image)).first;
260 }
262}
263
265CheckImages::getFittingWindowImage(unsigned int frame_number) {
267
269 return nullptr;
270 }
271
272 auto i = m_check_image_fitting_window.find(frame_number);
273 if (i == m_check_image_fitting_window.end()) {
274 auto& frame_info = m_measurement_frames.at(frame_number);
275 auto filename = m_fitting_window_image_filename.stem();
276 filename += "_" + frame_info.m_label;
277 filename += m_fitting_window_image_filename.extension();
278 auto frame_filename = m_fitting_window_image_filename.parent_path() / filename;
279 auto writeable_image = FitsWriter::newImage<int>(
280 frame_filename.native(),
281 frame_info.m_width,
282 frame_info.m_height,
283 frame_info.m_coordinate_system
284 );
285 i = m_check_image_fitting_window.emplace(std::make_pair(frame_number, writeable_image)).first;
286 }
287 return LockedWriteableImage<int>::create(i->second);
288}
289
290
293
294 if (m_psf_filename.empty()) {
295 return nullptr;
296 }
297
298 auto i = m_check_image_psf.find(frame_number);
299 if (i == m_check_image_psf.end()) {
300 auto& frame_info = m_measurement_frames.at(frame_number);
301 auto filename = m_psf_filename.stem();
302 filename += "_" + frame_info.m_label;
303 filename += m_psf_filename.extension();
304 auto frame_filename = m_psf_filename.parent_path() / filename;
305 i = m_check_image_psf.emplace(
307 frame_number,
309 frame_filename.native(),
310 frame_info.m_width,
311 frame_info.m_height,
312 frame_info.m_coordinate_system
313 ))).first;
314 }
316}
317
319 CheckImages::getMLDetectionImage(unsigned int plane_number, size_t index) {
321
322 if (m_ml_detection_filename.empty()) {
323 return nullptr;
324 }
325
326 auto i = m_check_image_ml_detection.at(index).find(plane_number);
327 if (i == m_check_image_ml_detection.at(index).end()) {
328 auto filename = m_ml_detection_filename.stem();
329 filename += "_" + std::to_string(plane_number);
330 filename += m_ml_detection_filename.extension();
331 auto frame_filename = m_ml_detection_filename.parent_path() / filename;
332 i = m_check_image_ml_detection.at(index).emplace(
334 plane_number,
336 frame_filename.native(),
337 m_detection_images.at(index)->getWidth(),
338 m_detection_images.at(index)->getHeight(),
339 m_coordinate_systems.at(index)
340 ))).first;
341 }
343}
344
347
348 auto detection_images_nb = m_coordinate_systems.size();
349 for (size_t i = 0; i < detection_images_nb; i++) {
350 // if possible, save the background image
351 if (i < m_background_images.size() && m_background_images.at(i) != nullptr && m_background_filename != "") {
353 addNumberToFilename(m_background_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
354 }
355
356 // if possible, save the variance image
357 if (i < m_variance_images.size() && m_variance_images.at(i) != nullptr && m_variance_filename != "") {
359 addNumberToFilename(m_variance_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
360 }
361
362 // if possible, save the filtered image
363 if (i < m_filtered_images.size() && m_filtered_images.at(i) != nullptr && m_filtered_filename != "") {
365 addNumberToFilename(m_filtered_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
366 }
367
368 // if possible, save the thresholded image
369 if (i < m_thresholded_images.size() && m_thresholded_images.at(i) != nullptr && m_thresholded_filename != "") {
371 addNumberToFilename(m_thresholded_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
372 }
373
374 // if possible, save the SNR image
375 if (i < m_snr_images.size() && m_snr_images.at(i) != nullptr && m_snr_filename != "") {
377 addNumberToFilename(m_snr_filename, i, detection_images_nb>1), m_coordinate_systems.at(i));
378 }
379 }
380
381 // if possible, save the measurement background images
383 for (auto &ci : m_measurement_background_images) {
384 auto& frame_info = m_measurement_frames.at(ci.first);
385
386 auto background_image = ci.second;
387 auto filename = m_measurement_background_filename.stem();
388 filename += "_" + frame_info.m_label;
389 filename += m_measurement_background_filename.extension();
390 auto frame_filename = m_measurement_background_filename.parent_path() / filename;
391 FitsWriter::writeFile(*background_image, frame_filename.native(), frame_info.m_coordinate_system);
392 }
393 }
394
395 // if possible, save the measurement variance images
397 for (auto &ci : m_measurement_variance_images) {
398 auto& frame_info = m_measurement_frames.at(ci.first);
399
400 auto variance_image = ci.second;
401 auto filename = m_measurement_variance_filename.stem();
402 filename += "_" + frame_info.m_label;
403 filename += m_measurement_variance_filename.extension();
404 auto frame_filename = m_measurement_variance_filename.parent_path() / filename;
405 FitsWriter::writeFile(*variance_image, frame_filename.native(), frame_info.m_coordinate_system);
406 }
407 }
408
409 // if possible, create and save the residual images
410 if (m_residual_filename != "") {
411 for (auto &ci : m_check_image_model_fitting) {
412 auto& frame_info = m_measurement_frames.at(ci.first);
413
414 auto residual_image = SubtractImage<SeFloat>::create(frame_info.m_subtracted_image, ci.second);
415 auto filename = m_residual_filename.stem();
416 filename += "_" + frame_info.m_label;
417 filename += m_residual_filename.extension();
418
419 auto frame_filename = m_residual_filename.parent_path() / filename;
420 FitsWriter::writeFile(*residual_image, frame_filename.native(), frame_info.m_coordinate_system);
421 }
422 }
423
424 for (auto const& entry : m_custom_images) {
425 if (std::get<1>(entry.second)) {
426 auto filename = entry.first;
427 if (!filename.has_extension()) {
428 filename += ".fits";
429 }
430 FitsWriter::writeFile(*std::get<0>(entry.second), filename.native());
431 }
432 }
433}
434
435}
boost::filesystem::path m_partition_filename
std::vector< std::shared_ptr< WeightImage > > m_variance_images
std::vector< std::shared_ptr< DetectionImage > > m_detection_images
std::map< unsigned int, std::shared_ptr< WriteableImage< int > > > m_measurement_aperture_images
std::shared_ptr< WriteableImage< int > > getMeasurementAutoApertureImage(unsigned int frame_number)
boost::filesystem::path m_group_filename
std::map< unsigned int, std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > > m_check_image_psf
boost::filesystem::path m_ml_detection_filename
void setCustomCheckImage(std::string id, std::shared_ptr< Image< SeFloat > > image)
boost::filesystem::path m_variance_filename
boost::filesystem::path m_residual_filename
std::map< unsigned int, std::shared_ptr< WriteableImage< int > > > m_measurement_auto_aperture_images
boost::filesystem::path m_filtered_filename
boost::filesystem::path m_fitting_window_image_filename
std::shared_ptr< WriteableImage< int > > getMeasurementApertureImage(unsigned int frame_number)
std::map< unsigned int, std::shared_ptr< Image< SeFloat > > > m_measurement_background_images
std::vector< std::shared_ptr< WriteableImage< int > > > m_group_images
std::shared_ptr< WriteableImage< float > > getMLDetectionImage(unsigned int plane_number, size_t index)
static std::unique_ptr< CheckImages > m_instance
void configure(Euclid::Configuration::ConfigManager &manager) override
Method which should initialize the object.
std::shared_ptr< WriteableImage< SeFloat > > getWriteableCheckImage(std::string id, int width, int height)
std::shared_ptr< WriteableImage< int > > getFittingWindowImage(unsigned int frame_number)
boost::filesystem::path m_auto_aperture_filename
std::map< unsigned int, std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > > m_check_image_model_fitting
boost::filesystem::path m_moffat_filename
std::vector< std::shared_ptr< Image< SeFloat > > > m_filtered_images
boost::filesystem::path m_snr_filename
std::vector< std::shared_ptr< Image< SeFloat > > > m_thresholded_images
boost::filesystem::path m_measurement_variance_filename
boost::filesystem::path m_psf_filename
std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > getPsfImage(unsigned int frame_number)
std::vector< std::shared_ptr< CoordinateSystem > > m_coordinate_systems
std::vector< std::shared_ptr< WriteableImage< int > > > m_partition_images
std::vector< std::shared_ptr< WriteableImage< int > > > m_aperture_images
boost::filesystem::path m_measurement_background_filename
boost::filesystem::path m_segmentation_filename
void reportConfigDependencies(Euclid::Configuration::ConfigManager &manager) const override
Registers all the Configuration dependencies.
std::vector< std::shared_ptr< WriteableImage< int > > > m_segmentation_images
std::vector< std::map< unsigned int, std::shared_ptr< WriteableImage< float > > > > m_check_image_ml_detection
boost::filesystem::path m_thresholded_filename
boost::filesystem::path m_aperture_filename
std::vector< std::shared_ptr< Image< SeFloat > > > m_snr_images
std::vector< std::shared_ptr< WriteableImage< int > > > m_auto_aperture_images
std::shared_ptr< WriteableImage< MeasurementImage::PixelType > > getModelFittingImage(unsigned int frame_number)
boost::filesystem::path m_background_filename
std::map< unsigned int, std::shared_ptr< WeightImage > > m_measurement_variance_images
std::vector< std::shared_ptr< WriteableImage< SeFloat > > > m_moffat_images
boost::filesystem::path m_model_fitting_image_filename
std::map< int, FrameInfo > m_measurement_frames
std::vector< std::shared_ptr< Image< SeFloat > > > m_background_images
std::map< unsigned int, std::shared_ptr< WriteableImage< int > > > m_check_image_fitting_window
std::map< boost::filesystem::path, std::tuple< std::shared_ptr< Image< SeFloat > >, bool > > m_custom_images
static std::shared_ptr< WriteableImage< T > > newTemporaryImage(const std::string &pattern, int width, int height)
Definition FitsWriter.h:77
static void writeFile(const Image< T > &image, const std::string &filename, const std::shared_ptr< CoordinateSystem > coord_system=nullptr, bool append=false)
Definition FitsWriter.h:54
static std::shared_ptr< WriteableImage< T > > newImage(const std::string &filename, int width, int height, const std::shared_ptr< CoordinateSystem > coord_system=nullptr, bool append=false)
Definition FitsWriter.h:68
Interface representing an image.
Definition Image.h:44
static std::shared_ptr< LockedWriteableImage< T > > create(Args &&... args)
static std::shared_ptr< ProcessedImage< T, SubtractOperation< T > > > 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
str filename
Definition conf.py:65
T dynamic_pointer_cast(T... args)
T str(T... args)
T to_string(T... args)