MOONS Pipeline Reference Manual 0.13.1
moo_saturate_map.c
1/*
2 * This file is part of the MOONS Pipeline
3 * Copyright (C) 2002-2016 European Southern Observatory
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20#ifdef HAVE_CONFIG_H
21#include <config.h>
22#endif
23
24/*-----------------------------------------------------------------------------
25 Includes
26 -----------------------------------------------------------------------------*/
27#include <math.h>
28#include <cpl.h>
29#include "moo_pfits.h"
30#include "moo_fits.h"
31#include "moo_qc.h"
32#include "moo_saturate_map.h"
33/*----------------------------------------------------------------------------*/
48/*----------------------------------------------------------------------------*/
49
52/*-----------------------------------------------------------------------------
53 Function codes
54 -----------------------------------------------------------------------------*/
55
56/*----------------------------------------------------------------------------*/
64/*----------------------------------------------------------------------------*/
65moo_saturate_map *
67{
68 moo_saturate_map *res = cpl_calloc(1, sizeof(moo_saturate_map));
69 return res;
70}
71
72moo_saturate_map *
73moo_saturate_map_load(const cpl_frame *mapframe)
74{
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);
78
79 cpl_errorstate prev_state = cpl_errorstate_get();
80 moo_saturate_map *res = moo_saturate_map_new();
81
82 for (int i = 0; i < 2; i++) {
83 for (int j = 0; j < 3; j++) {
84 const char *extname = moo_detector_get_extname(j, i + 1);
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;
89
90 if (header != NULL) {
91 int naxis = moo_pfits_get_naxis(header);
92 if (naxis == 2) {
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);
109 }
110 }
111 cpl_free(name);
112 }
113 }
114 if (!cpl_errorstate_is_equal(prev_state)) {
116 res = NULL;
117 }
118
119 return res;
120}
121/*----------------------------------------------------------------------------*/
135/*----------------------------------------------------------------------------*/
136cpl_error_code
137moo_saturate_map_set_data(moo_saturate_map *self,
139 int ntas,
140 cpl_image *data,
141 cpl_image *flux,
142 cpl_image *err,
143 cpl_image *exptime,
144 cpl_propertylist *header)
145{
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);
149
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;
155
156 return CPL_ERROR_NONE;
157}
158/*----------------------------------------------------------------------------*/
172/*----------------------------------------------------------------------------*/
173cpl_error_code
174moo_saturate_map_add_data(moo_saturate_map *self,
175 cpl_image *data,
176 cpl_image *flux,
177 cpl_image *err,
178 cpl_image *exptime,
180 int ntas)
181{
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();
186 const char *extname = moo_detector_get_extname(type, ntas);
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);
190 cpl_free(name);
191 if (data != NULL) {
192 cpl_image_save(data, self->filename, CPL_TYPE_INT, header,
193 CPL_IO_EXTEND);
194 }
195 else {
196 cpl_propertylist_save(header, self->filename, CPL_IO_EXTEND);
197 }
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);
201 cpl_free(name);
202 if (flux != NULL) {
203 cpl_image_save(flux, self->filename, CPL_TYPE_DOUBLE, header,
204 CPL_IO_EXTEND);
205 }
206 else {
207 cpl_propertylist_save(header, self->filename, CPL_IO_EXTEND);
208 }
209 cpl_propertylist_delete(tmp_header);
210
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);
214 cpl_free(name);
215 if (err != NULL) {
216 cpl_image_save(err, self->filename, CPL_TYPE_DOUBLE, header,
217 CPL_IO_EXTEND);
218 }
219 else {
220 cpl_propertylist_save(header, self->filename, CPL_IO_EXTEND);
221 }
222 cpl_propertylist_delete(tmp_header);
223
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);
227 cpl_free(name);
228 if (exptime != NULL) {
229 cpl_image_save(exptime, self->filename, CPL_TYPE_DOUBLE, header,
230 CPL_IO_EXTEND);
231 }
232 else {
233 cpl_propertylist_save(header, self->filename, CPL_IO_EXTEND);
234 }
235 cpl_propertylist_delete(tmp_header);
236
237 moo_saturate_map_set_data(self, type, ntas, data, flux, err, exptime,
238 header);
239
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();
245 }
246 return status;
247}
248
249/*----------------------------------------------------------------------------*/
259/*----------------------------------------------------------------------------*/
260void
261moo_saturate_map_save(moo_saturate_map *self, const char *filename)
262{
263 if (self != NULL) {
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++) {
267 const char *extname = moo_detector_get_extname(j, i + 1);
268 moo_fits_write_extension_image(self->data[i * 3 + j], filename,
269 MOO_SATURATE_MAP_INDEX, extname,
270 CPL_TYPE_INT,
271 self->data_header[i * 3 + j]);
272 moo_fits_write_extension_image(self->flux[i * 3 + j], filename,
273 MOO_SATURATE_MAP_FLUX, extname,
274 CPL_TYPE_DOUBLE, NULL);
275 moo_fits_write_extension_image(self->err[i * 3 + j], filename,
276 MOO_SATURATE_MAP_ERR, extname,
277 CPL_TYPE_DOUBLE, NULL);
278 moo_fits_write_extension_image(self->exptime[i * 3 + j],
279 filename, MOO_SATURATE_MAP_TIME,
280 extname, CPL_TYPE_DOUBLE, NULL);
281 }
282 }
283 }
284}
285
286/*----------------------------------------------------------------------------*/
295/*----------------------------------------------------------------------------*/
296
297void
298moo_saturate_map_delete(moo_saturate_map *self)
299{
300 if (self != NULL) {
301 int i;
302 if (self->primary_header != NULL) {
303 cpl_propertylist_delete(self->primary_header);
304 }
305 for (i = 0; i < 6; i++) {
306 if (self->data[i] != NULL) {
307 cpl_image_delete(self->data[i]);
308 }
309 if (self->flux[i] != NULL) {
310 cpl_image_delete(self->flux[i]);
311 }
312 if (self->err[i] != NULL) {
313 cpl_image_delete(self->err[i]);
314 }
315 if (self->exptime[i] != NULL) {
316 cpl_image_delete(self->exptime[i]);
317 }
318 if (self->data_header[i] != NULL) {
319 cpl_propertylist_delete(self->data_header[i]);
320 }
321 }
322 if (self->filename != NULL) {
323 cpl_free(self->filename);
324 }
325 cpl_free(self);
326 }
327}
const char * moo_detector_get_extname(moo_detector_type type, int ntas)
Get the extension name of a detector.
Definition: moo_detector.c:137
enum _moo_detector_type_ moo_detector_type
The type code type.
Definition: moo_detector.h:64
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.
Definition: moo_fits.c:123
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.
Definition: moo_fits.c:311
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
Definition: moo_pfits.c:980