36 #include "crires_recipe.h"
37 #include "irplib_utils.h"
43 #define RECIPE_STRING "crires_spec_dark"
49 static double crires_spec_dark_ron(
const cpl_image *,
const cpl_image *,
int) ;
50 static int crires_spec_dark_save(
const cpl_imagelist *,
51 const cpl_parameterlist *, cpl_frameset *) ;
53 static char crires_spec_dark_description[] =
54 "crires_spec_dark -- Dark recipe\n"
55 "The files listed in the Set Of Frames (sof-file) must be tagged:\n"
56 "raw-file.fits "CRIRES_SPEC_DARK_RAW
".\n" ;
58 CRIRES_RECIPE_DEFINE(crires_spec_dark,
59 CRIRES_PARAM_RON_SAMPLES |
62 crires_spec_dark_description) ;
73 crires_illum_period period ;
74 double dark_med[CRIRES_NB_DETECTORS] ;
75 double dark_stdev[CRIRES_NB_DETECTORS] ;
76 double ron1[CRIRES_NB_DETECTORS] ;
77 double ron2[CRIRES_NB_DETECTORS] ;
78 } crires_spec_dark_config ;
92 static int crires_spec_dark(
93 cpl_frameset * frameset,
94 const cpl_parameterlist * parlist)
96 cpl_frameset * rawframes ;
97 cpl_frame * ref_frame ;
98 cpl_propertylist * plist ;
100 int ndit, ly, uy, ysize ;
101 cpl_imagelist * darks ;
102 cpl_imagelist * darks_chip ;
103 cpl_image * tmp_dark ;
104 cpl_vector * medians ;
111 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
112 crires_spec_dark_config.ron1[i] = -1.0 ;
113 crires_spec_dark_config.ron2[i] = -1.0 ;
114 crires_spec_dark_config.dark_med[i] = -1.0 ;
115 crires_spec_dark_config.dark_stdev[i] = -1.0 ;
119 crires_spec_dark_config.hsize = crires_parameterlist_get_int(parlist,
120 RECIPE_STRING, CRIRES_PARAM_RON_SZ) ;
121 crires_spec_dark_config.nsamples = crires_parameterlist_get_int(parlist,
122 RECIPE_STRING, CRIRES_PARAM_RON_SAMPLES) ;
125 if (crires_dfs_set_groups(frameset,
"crires_spec_dark")) {
126 cpl_msg_error(__func__,
"Cannot identify RAW and CALIB frames") ;
131 if ((rawframes = crires_extract_frameset(frameset,
132 CRIRES_SPEC_DARK_RAW)) == NULL) {
133 cpl_msg_error(__func__,
"No raw frame in input") ;
138 if (cpl_frameset_get_size(rawframes) < 3) {
139 cpl_msg_error(__func__,
"Not enough input frames");
140 cpl_frameset_delete(rawframes) ;
145 crires_spec_dark_config.period =
146 crires_get_detector_illum_period(
147 cpl_frame_get_filename(cpl_frameset_get_position(rawframes, 0))) ;
148 if (crires_spec_dark_config.period == CRIRES_ILLUM_UNKNOWN) {
149 cpl_msg_error(__func__,
150 "Cannot determine the detector illumination period") ;
151 cpl_frameset_delete(rawframes) ;
154 crires_display_detector_illum(crires_spec_dark_config.period) ;
158 ref_frame = cpl_frameset_get_position(rawframes, 0) ;
159 if ((plist=cpl_propertylist_load(cpl_frame_get_filename(ref_frame),
161 cpl_msg_error(__func__,
"Cannot get header from frame");
162 cpl_msg_indent_less() ;
163 cpl_frameset_delete(rawframes) ;
166 dit = crires_pfits_get_dit(plist) ;
167 ndit = crires_pfits_get_ndit(plist) ;
168 cpl_propertylist_delete(plist) ;
169 if (cpl_error_get_code() != CPL_ERROR_NONE) {
170 cpl_msg_error(__func__,
"Cannot get the DIT/NDIT from the header") ;
171 cpl_msg_indent_less() ;
172 cpl_frameset_delete(rawframes) ;
175 cpl_msg_info(__func__,
"DIT value: %g sec.", dit) ;
176 cpl_msg_info(__func__,
"NDIT value: %d", ndit) ;
179 darks = cpl_imagelist_new() ;
180 cpl_msg_info(__func__,
"Dark computation") ;
181 cpl_msg_indent_more() ;
182 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
185 ly=crires_get_detector_ly1(crires_spec_dark_config.period);
186 uy=crires_get_detector_uy1(crires_spec_dark_config.period);
188 ly=crires_get_detector_ly2(crires_spec_dark_config.period);
189 uy=crires_get_detector_uy2(crires_spec_dark_config.period);
191 ly=crires_get_detector_ly3(crires_spec_dark_config.period);
192 uy=crires_get_detector_uy3(crires_spec_dark_config.period);
194 ly=crires_get_detector_ly4(crires_spec_dark_config.period);
195 uy=crires_get_detector_uy4(crires_spec_dark_config.period);
198 if (128-ly <= 0) ly = 1 ;
200 if (ly+256 >= ysize) uy = ysize ;
204 cpl_msg_info(__func__,
"Load chip number %d", i+1) ;
205 if ((darks_chip = crires_load_frameset(rawframes,
206 crires_spec_dark_config.period, i+1,
207 CPL_TYPE_FLOAT)) == NULL) {
208 cpl_msg_error(__func__,
"Cannot load chip number %d", i+1) ;
209 cpl_msg_indent_less() ;
210 cpl_imagelist_delete(darks) ;
211 cpl_frameset_delete(rawframes) ;
215 cpl_msg_info(__func__,
"Collapse images for chip number %d", i+1) ;
216 if ((tmp_dark = cpl_imagelist_collapse_create(darks_chip)) == NULL) {
217 cpl_msg_error(__func__,
"Cannot average for chip number %d", i+1) ;
218 cpl_msg_indent_less() ;
219 cpl_imagelist_delete(darks) ;
220 cpl_frameset_delete(rawframes) ;
221 cpl_imagelist_delete(darks_chip) ;
225 cpl_imagelist_set(darks, tmp_dark, i) ;
228 medians = cpl_vector_new(cpl_imagelist_get_size(darks_chip));
229 for (j=0 ; j<cpl_imagelist_get_size(darks_chip) ; j++) {
230 med = cpl_image_get_median_window(cpl_imagelist_get(darks_chip, j),
232 cpl_vector_set(medians, j, med) ;
234 crires_spec_dark_config.dark_med[i] = cpl_vector_get_mean(medians) ;
235 crires_spec_dark_config.dark_stdev[i] = cpl_vector_get_stdev(medians) ;
236 cpl_vector_delete(medians) ;
239 crires_spec_dark_config.ron1[i] = crires_spec_dark_ron(
240 cpl_imagelist_get(darks_chip, 0),
241 cpl_imagelist_get(darks_chip, 1),
243 crires_spec_dark_config.ron2[i] = crires_spec_dark_ron(
244 cpl_imagelist_get(darks_chip, 1),
245 cpl_imagelist_get(darks_chip, 2),
247 cpl_imagelist_delete(darks_chip) ;
249 cpl_frameset_delete(rawframes) ;
250 cpl_msg_indent_less() ;
253 cpl_msg_info(__func__,
"Division by DIT") ;
254 cpl_imagelist_divide_scalar(darks, dit) ;
257 cpl_msg_info(__func__,
"Save the product") ;
258 cpl_msg_indent_more() ;
259 if (crires_spec_dark_save(darks, parlist, frameset)) {
260 cpl_msg_error(__func__,
"Cannot save the product") ;
261 cpl_imagelist_delete(darks) ;
262 cpl_msg_indent_less() ;
265 cpl_imagelist_delete(darks) ;
266 cpl_msg_indent_less() ;
269 if (cpl_error_get_code())
return -1 ;
282 static double crires_spec_dark_ron(
283 const cpl_image * ima1,
284 const cpl_image * ima2,
292 if (ima1 == NULL)
return -1.0 ;
293 if (ima2 == NULL)
return -1.0 ;
294 if (ndit < 1)
return -1.0 ;
301 if ((ima = cpl_image_subtract_create(ima2, ima1)) == NULL)
return -1.0 ;
304 cpl_flux_get_noise_window(ima, NULL, crires_spec_dark_config.hsize,
305 crires_spec_dark_config.nsamples, &ron, NULL) ;
306 cpl_image_delete(ima) ;
319 static int crires_spec_dark_save(
320 const cpl_imagelist * dark,
321 const cpl_parameterlist * parlist,
324 cpl_propertylist ** qclists ;
325 const cpl_frame * ref_frame ;
326 cpl_propertylist * inputlist ;
327 const char * recipe_name =
"crires_spec_dark" ;
331 ref_frame = irplib_frameset_get_first_from_group(set, CPL_FRAME_GROUP_RAW) ;
334 qclists = cpl_malloc(CRIRES_NB_DETECTORS *
sizeof(cpl_propertylist*)) ;
335 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
336 qclists[i] = cpl_propertylist_new() ;
337 cpl_propertylist_append_double(qclists[i],
"ESO QC RON1",
338 crires_spec_dark_config.ron1[i]) ;
339 cpl_propertylist_append_double(qclists[i],
"ESO QC RON2",
340 crires_spec_dark_config.ron2[i]) ;
341 cpl_propertylist_append_double(qclists[i],
"ESO QC DARKMED",
342 crires_spec_dark_config.dark_med[i]) ;
343 cpl_propertylist_append_double(qclists[i],
"ESO QC DARKSTDEV",
344 crires_spec_dark_config.dark_stdev[i]) ;
347 inputlist = cpl_propertylist_load_regexp(
348 cpl_frame_get_filename(ref_frame), i+1,
349 CRIRES_HEADER_EXT_FORWARD, 0) ;
350 cpl_propertylist_copy_property_regexp(qclists[i], inputlist,
351 CRIRES_HEADER_EXT_FORWARD, 0) ;
352 cpl_propertylist_delete(inputlist) ;
356 crires_image_save(set,
363 crires_spec_dark_config.period,
365 (
const cpl_propertylist**)qclists,
366 PACKAGE
"/" PACKAGE_VERSION,
367 "crires_spec_dark.fits") ;
370 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
371 cpl_propertylist_erase_regexp(qclists[i], CRIRES_HEADER_EXT_FORWARD, 0);
375 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
376 cpl_propertylist_delete(qclists[i]) ;