SourceXtractorPlusPlus 0.19.2
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
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 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;
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
226CheckImages::getModelFittingImage(unsigned int frame_number) {
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 {
244 auto filename = m_model_fitting_image_filename.stem();
245 filename += "_" + frame_info.m_label;
246 filename += m_model_fitting_image_filename.extension();
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 != "") {
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 != "") {
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 != "") {
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 != "") {
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 != "") {
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}
T at(T... args)
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_residual_filename
std::map< unsigned int, std::shared_ptr< WriteableImage< int > > > m_measurement_auto_aperture_images
boost::filesystem::path m_filtered_filename
std::shared_ptr< WriteableImage< int > > getMeasurementApertureImage(unsigned int frame_number)
std::vector< std::shared_ptr< WriteableImage< int > > > m_group_images
std::shared_ptr< WriteableImage< float > > getMLDetectionImage(unsigned int plane_number, size_t index)
boost::filesystem::path m_model_background_filename
static std::unique_ptr< CheckImages > m_instance
boost::filesystem::path m_model_variance_filename
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)
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_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_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)
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< boost::filesystem::path, std::tuple< std::shared_ptr< Image< SeFloat > >, bool > > m_custom_images
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
Interface representing an image.
Definition Image.h:44
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
str filename
Definition conf.py:65
T size(T... args)
T str(T... args)
T to_string(T... args)