32#include "moo_saturate_map.h"
68 moo_saturate_map *res = cpl_calloc(1,
sizeof(moo_saturate_map));
73moo_saturate_map_load(
const cpl_frame *mapframe)
75 cpl_ensure(mapframe != NULL, CPL_ERROR_NULL_INPUT, NULL);
76 const char *filename = cpl_frame_get_filename(mapframe);
77 cpl_ensure(filename != NULL, CPL_ERROR_NULL_INPUT, NULL);
79 cpl_errorstate prev_state = cpl_errorstate_get();
82 for (
int i = 0; i < 2; i++) {
83 for (
int j = 0; j < 3; j++) {
85 char *name = cpl_sprintf(
"%s_%s", MOO_SATURATE_MAP_INDEX, extname);
86 cpl_propertylist *header = NULL;
87 header = moo_fits_load_extension_header(filename, NULL, name);
88 res->data_header[i * 3 + j] = header;
93 res->data[i * 3 + j] =
95 MOO_SATURATE_MAP_INDEX,
96 extname, CPL_TYPE_INT);
97 res->flux[i * 3 + j] =
99 MOO_SATURATE_MAP_FLUX,
100 extname, CPL_TYPE_DOUBLE);
101 res->err[i * 3 + j] =
103 MOO_SATURATE_MAP_ERR,
104 extname, CPL_TYPE_DOUBLE);
105 res->exptime[i * 3 + j] =
107 MOO_SATURATE_MAP_TIME,
108 extname, CPL_TYPE_DOUBLE);
114 if (!cpl_errorstate_is_equal(prev_state)) {
144 cpl_propertylist *header)
146 cpl_ensure_code(ntas >= 1 && ntas <= 2, CPL_ERROR_ILLEGAL_INPUT);
147 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
148 cpl_ensure_code(header != NULL, CPL_ERROR_NULL_INPUT);
150 self->data[(ntas - 1) * 3 + type] = data;
151 self->flux[(ntas - 1) * 3 + type] = flux;
152 self->err[(ntas - 1) * 3 + type] = err;
153 self->exptime[(ntas - 1) * 3 + type] = exptime;
154 self->data_header[(ntas - 1) * 3 + type] = header;
156 return CPL_ERROR_NONE;
182 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
183 cpl_ensure_code(self->filename != NULL, CPL_ERROR_NULL_INPUT);
184 cpl_error_code status = CPL_ERROR_NONE;
185 cpl_errorstate prev_state = cpl_errorstate_get();
187 cpl_propertylist *header = cpl_propertylist_new();
188 char *name = cpl_sprintf(
"%s_%s", MOO_SATURATE_MAP_INDEX, extname);
189 cpl_propertylist_append_string(header, MOO_PFITS_EXTNAME, name);
192 cpl_image_save(data, self->filename, CPL_TYPE_INT, header,
196 cpl_propertylist_save(header, self->filename, CPL_IO_EXTEND);
198 cpl_propertylist *tmp_header = cpl_propertylist_new();
199 name = cpl_sprintf(
"%s_%s", MOO_SATURATE_MAP_FLUX, extname);
200 cpl_propertylist_append_string(header, MOO_PFITS_EXTNAME, name);
203 cpl_image_save(flux, self->filename, CPL_TYPE_DOUBLE, header,
207 cpl_propertylist_save(header, self->filename, CPL_IO_EXTEND);
209 cpl_propertylist_delete(tmp_header);
211 tmp_header = cpl_propertylist_new();
212 name = cpl_sprintf(
"%s_%s", MOO_SATURATE_MAP_ERR, extname);
213 cpl_propertylist_append_string(header, MOO_PFITS_EXTNAME, name);
216 cpl_image_save(err, self->filename, CPL_TYPE_DOUBLE, header,
220 cpl_propertylist_save(header, self->filename, CPL_IO_EXTEND);
222 cpl_propertylist_delete(tmp_header);
224 tmp_header = cpl_propertylist_new();
225 name = cpl_sprintf(
"%s_%s", MOO_SATURATE_MAP_TIME, extname);
226 cpl_propertylist_append_string(header, MOO_PFITS_EXTNAME, name);
228 if (exptime != NULL) {
229 cpl_image_save(exptime, self->filename, CPL_TYPE_DOUBLE, header,
233 cpl_propertylist_save(header, self->filename, CPL_IO_EXTEND);
235 cpl_propertylist_delete(tmp_header);
240 if (!cpl_errorstate_is_equal(prev_state)) {
241 cpl_msg_error(__func__,
"Error for adding data to %s %s (%s)",
242 self->filename, extname,
243 cpl_error_get_message_default(cpl_error_get_code()));
244 status = cpl_error_get_code();
264 cpl_propertylist_save(self->primary_header, filename, CPL_IO_CREATE);
265 for (
int i = 0; i < 2; i++) {
266 for (
int j = 0; j < 3; j++) {
269 MOO_SATURATE_MAP_INDEX, extname,
271 self->data_header[i * 3 + j]);
273 MOO_SATURATE_MAP_FLUX, extname,
274 CPL_TYPE_DOUBLE, NULL);
276 MOO_SATURATE_MAP_ERR, extname,
277 CPL_TYPE_DOUBLE, NULL);
279 filename, MOO_SATURATE_MAP_TIME,
280 extname, CPL_TYPE_DOUBLE, NULL);
302 if (self->primary_header != NULL) {
303 cpl_propertylist_delete(self->primary_header);
305 for (i = 0; i < 6; i++) {
306 if (self->data[i] != NULL) {
307 cpl_image_delete(self->data[i]);
309 if (self->flux[i] != NULL) {
310 cpl_image_delete(self->flux[i]);
312 if (self->err[i] != NULL) {
313 cpl_image_delete(self->err[i]);
315 if (self->exptime[i] != NULL) {
316 cpl_image_delete(self->exptime[i]);
318 if (self->data_header[i] != NULL) {
319 cpl_propertylist_delete(self->data_header[i]);
322 if (self->filename != NULL) {
323 cpl_free(self->filename);
const char * moo_detector_get_extname(moo_detector_type type, int ntas)
Get the extension name of a detector.
enum _moo_detector_type_ moo_detector_type
The type code type.
cpl_error_code moo_fits_write_extension_image(cpl_image *image, const char *filename, const char *name, const char *detectorname, cpl_type type, cpl_propertylist *header)
Write an image as extension in FITS file.
cpl_image * moo_fits_load_extension_image(const char *filename, const char *name, const char *detectorname, cpl_type type)
Load an image from FITS file.
cpl_error_code moo_saturate_map_add_data(moo_saturate_map *self, cpl_image *data, cpl_image *flux, cpl_image *err, cpl_image *exptime, moo_detector_type type, int ntas)
Add CPL_IMAGE extension to MAP filename and update moo_saurate_map structure.
moo_saturate_map * moo_saturate_map_new(void)
Create a new moo_saturate_map.
void moo_saturate_map_delete(moo_saturate_map *self)
Delete a moo_map_saturate.
void moo_saturate_map_save(moo_saturate_map *self, const char *filename)
Save a moo_saturate_map to a FITS file.
cpl_error_code moo_saturate_map_set_data(moo_saturate_map *self, moo_detector_type type, int ntas, cpl_image *data, cpl_image *flux, cpl_image *err, cpl_image *exptime, cpl_propertylist *header)
set saturate map data for relevant extension
int moo_pfits_get_naxis(const cpl_propertylist *plist)
find out the NAXIS value