36 #include "crires_recipe.h"
37 #include "irplib_utils.h"
43 #define RECIPE_STRING "crires_win_dark"
49 static double crires_win_dark_ron(
const cpl_image *,
const cpl_image *,
int) ;
50 static int crires_win_dark_save(
const cpl_imagelist *,
51 const cpl_parameterlist *, cpl_frameset *) ;
53 static char crires_win_dark_description[] =
54 "crires_win_dark -- Dark recipe in Windowing Mode\n"
55 "The files listed in the Set Of Frames (sof-file) must be tagged:\n"
56 "raw-file.fits "CRIRES_WIN_DARK_RAW
".\n" ;
58 CRIRES_RECIPE_DEFINE(crires_win_dark,
59 CRIRES_PARAM_RON_SAMPLES |
61 "Dark recipe in Windowing Mode",
62 crires_win_dark_description) ;
73 double dark_med[CRIRES_NB_DETECTORS] ;
74 double dark_stdev[CRIRES_NB_DETECTORS] ;
75 double ron1[CRIRES_NB_DETECTORS] ;
76 double ron2[CRIRES_NB_DETECTORS] ;
77 } crires_win_dark_config ;
91 static int crires_win_dark(
92 cpl_frameset * frameset,
93 const cpl_parameterlist * parlist)
95 cpl_frameset * rawframes ;
96 cpl_frame * ref_frame ;
97 cpl_propertylist * plist ;
100 cpl_imagelist * darks ;
101 cpl_imagelist * darks_chip ;
102 cpl_image * dark[CRIRES_NB_DETECTORS] ;
103 cpl_vector * medians ;
109 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
110 crires_win_dark_config.ron1[i] = -1.0 ;
111 crires_win_dark_config.ron2[i] = -1.0 ;
112 crires_win_dark_config.dark_med[i] = -1.0 ;
113 crires_win_dark_config.dark_stdev[i] = -1.0 ;
118 crires_win_dark_config.hsize = crires_parameterlist_get_int(parlist,
119 RECIPE_STRING, CRIRES_PARAM_RON_SZ) ;
120 crires_win_dark_config.nsamples = crires_parameterlist_get_int(parlist,
121 RECIPE_STRING, CRIRES_PARAM_RON_SAMPLES) ;
124 if (crires_dfs_set_groups(frameset,
"crires_win_dark")) {
125 cpl_msg_error(__func__,
"Cannot identify RAW and CALIB frames") ;
130 if ((rawframes = crires_extract_frameset(frameset,
131 CRIRES_WIN_DARK_RAW)) == NULL) {
132 cpl_msg_error(__func__,
"No raw frame in input") ;
137 if (cpl_frameset_get_size(rawframes) < 3) {
138 cpl_msg_error(__func__,
"Not enough input frames");
139 cpl_frameset_delete(rawframes) ;
144 ref_frame = cpl_frameset_get_position(rawframes, 0) ;
145 if ((plist=cpl_propertylist_load(cpl_frame_get_filename(ref_frame),
147 cpl_msg_error(__func__,
"Cannot get header from frame");
148 cpl_msg_indent_less() ;
149 cpl_frameset_delete(rawframes) ;
152 dit = crires_pfits_get_dit(plist) ;
153 ndit = crires_pfits_get_ndit(plist) ;
154 cpl_propertylist_delete(plist) ;
155 if (cpl_error_get_code() != CPL_ERROR_NONE) {
156 cpl_msg_error(__func__,
"Cannot get the DIT/NDIT from the header") ;
157 cpl_msg_indent_less() ;
158 cpl_frameset_delete(rawframes) ;
161 cpl_msg_info(__func__,
"DIT value: %g sec.", dit) ;
162 cpl_msg_info(__func__,
"NDIT value: %d", ndit) ;
165 cpl_msg_info(__func__,
"Dark computation") ;
166 cpl_msg_indent_more() ;
167 for (i=1 ; i<CRIRES_NB_DETECTORS-1 ; i++) {
170 cpl_msg_info(__func__,
"Load chip number %d", i+1) ;
171 if ((darks_chip = crires_load_frameset(rawframes,
172 CRIRES_ILLUM_FULL_DETECTOR, i+1,
173 CPL_TYPE_FLOAT)) == NULL) {
174 cpl_msg_error(__func__,
"Cannot load chip number %d", i+1) ;
175 cpl_msg_indent_less() ;
176 cpl_frameset_delete(rawframes) ;
177 for (j=1 ; j<i ; j++)
178 cpl_image_delete(dark[j]) ;
182 cpl_msg_info(__func__,
"Collapse images for chip number %d", i+1) ;
183 if ((dark[i] = cpl_imagelist_collapse_create(darks_chip)) == NULL) {
184 cpl_msg_error(__func__,
"Cannot average for chip number %d", i+1) ;
185 cpl_msg_indent_less() ;
186 cpl_frameset_delete(rawframes) ;
187 for (j=1 ; j<i ; j++)
188 cpl_image_delete(dark[j]) ;
189 cpl_imagelist_delete(darks_chip) ;
194 medians = cpl_vector_new(cpl_imagelist_get_size(darks_chip));
195 for (j=0 ; j<cpl_imagelist_get_size(darks_chip) ; j++) {
196 med = cpl_image_get_median(cpl_imagelist_get(darks_chip, j)) ;
197 cpl_vector_set(medians, j, med) ;
199 crires_win_dark_config.dark_med[i] = cpl_vector_get_mean(medians) ;
200 crires_win_dark_config.dark_stdev[i] = cpl_vector_get_stdev(medians) ;
201 cpl_vector_delete(medians) ;
204 crires_win_dark_config.ron1[i] = crires_win_dark_ron(
205 cpl_imagelist_get(darks_chip, 0),
206 cpl_imagelist_get(darks_chip, 1),
208 crires_win_dark_config.ron2[i] = crires_win_dark_ron(
209 cpl_imagelist_get(darks_chip, 1),
210 cpl_imagelist_get(darks_chip, 2),
212 cpl_imagelist_delete(darks_chip) ;
214 cpl_frameset_delete(rawframes) ;
215 cpl_msg_indent_less() ;
218 if (dark[1] != NULL) {
219 dark[0] = cpl_image_duplicate(dark[1]) ;
220 cpl_image_multiply_scalar(dark[0], 0.0) ;
221 dark[CRIRES_NB_DETECTORS-1] = cpl_image_duplicate(dark[0]) ;
225 darks = cpl_imagelist_new() ;
226 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++)
227 cpl_imagelist_set(darks, dark[i], i) ;
230 cpl_msg_info(__func__,
"Division by DIT") ;
231 cpl_imagelist_divide_scalar(darks, dit) ;
234 cpl_msg_info(__func__,
"Save the product") ;
235 cpl_msg_indent_more() ;
236 if (crires_win_dark_save(darks, parlist, frameset)) {
237 cpl_msg_error(__func__,
"Cannot save the product") ;
238 cpl_imagelist_delete(darks) ;
239 cpl_msg_indent_less() ;
242 cpl_imagelist_delete(darks) ;
243 cpl_msg_indent_less() ;
246 if (cpl_error_get_code())
return -1 ;
259 static double crires_win_dark_ron(
260 const cpl_image * ima1,
261 const cpl_image * ima2,
269 if (ima1 == NULL)
return -1.0 ;
270 if (ima2 == NULL)
return -1.0 ;
271 if (ndit < 1)
return -1.0 ;
278 if ((ima = cpl_image_subtract_create(ima2, ima1)) == NULL)
return -1.0 ;
281 cpl_flux_get_noise_window(ima, NULL, crires_win_dark_config.hsize,
282 crires_win_dark_config.nsamples, &ron, NULL) ;
283 cpl_image_delete(ima) ;
296 static int crires_win_dark_save(
297 const cpl_imagelist * dark,
298 const cpl_parameterlist * parlist,
301 cpl_propertylist ** qclists ;
302 const cpl_frame * ref_frame ;
303 cpl_propertylist * inputlist ;
304 const char * recipe_name =
"crires_win_dark" ;
308 ref_frame = irplib_frameset_get_first_from_group(set, CPL_FRAME_GROUP_RAW) ;
311 qclists = cpl_malloc(CRIRES_NB_DETECTORS *
sizeof(cpl_propertylist*)) ;
312 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
313 qclists[i] = cpl_propertylist_new() ;
314 cpl_propertylist_append_double(qclists[i],
"ESO QC RON1",
315 crires_win_dark_config.ron1[i]) ;
316 cpl_propertylist_append_double(qclists[i],
"ESO QC RON2",
317 crires_win_dark_config.ron2[i]) ;
318 cpl_propertylist_append_double(qclists[i],
"ESO QC DARKMED",
319 crires_win_dark_config.dark_med[i]) ;
320 cpl_propertylist_append_double(qclists[i],
"ESO QC DARKSTDEV",
321 crires_win_dark_config.dark_stdev[i]) ;
324 inputlist = cpl_propertylist_load_regexp(
325 cpl_frame_get_filename(ref_frame), i+1,
326 CRIRES_HEADER_EXT_FORWARD, 0) ;
327 cpl_propertylist_copy_property_regexp(qclists[i], inputlist,
328 CRIRES_HEADER_EXT_FORWARD, 0) ;
329 cpl_propertylist_delete(inputlist) ;
333 crires_image_save(set,
338 CRIRES_CALPRO_DARK_WIN,
340 CRIRES_ILLUM_FULL_DETECTOR,
342 (
const cpl_propertylist**)qclists,
343 PACKAGE
"/" PACKAGE_VERSION,
344 "crires_win_dark.fits") ;
347 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
348 cpl_propertylist_erase_regexp(qclists[i], CRIRES_HEADER_EXT_FORWARD, 0);
352 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
353 cpl_propertylist_delete(qclists[i]) ;