00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031
00032
00033
00034
00035
00036 #include <assert.h>
00037 #include <cpl.h>
00038
00039 #include "irplib_utils.h"
00040
00041 #include "visir_utils.h"
00042 #include "visir_pfits.h"
00043 #include "visir_dfs.h"
00044 #include "visir_inputs.h"
00045
00046
00047
00048
00049
00050 static int visir_img_combine_create(cpl_plugin *);
00051 static int visir_img_combine_exec(cpl_plugin *);
00052 static int visir_img_combine_destroy(cpl_plugin *);
00053 static int visir_img_combine(cpl_parameterlist *, cpl_frameset *);
00054 static int visir_img_combine_save(const cpl_image *, const cpl_image *,
00055 const cpl_parameterlist *, cpl_frameset *);
00056
00057
00058
00059
00060
00061 enum _visir_img_mode_ {
00062 visir_img_none = 0,
00063 visir_img_dj,
00064 visir_img_cj,
00065 visir_img_nj,
00066 visir_img_cnj
00067 };
00068
00069 typedef enum _visir_img_mode_ visir_img_mode;
00070
00071 static const char * recipename = "visir_img_combine";
00072
00073 static struct {
00074
00075 visir_img_mode img_mode;
00076 char offsets[512];
00077 char objects[512];
00078 char nodding[512];
00079 int auto_bpm;
00080 int rem_glitch;
00081 int purge_bad;
00082 int refine;
00083 int sx;
00084 int sy;
00085 int mx;
00086 int my;
00087 int union_flag;
00088 int rej_low;
00089 int rej_high;
00090 int plot;
00091
00092
00093 double bg_mean;
00094 } visir_img_combine_config;
00095
00096 static char visir_img_combine_description[] =
00097 "This recipe recombines the data observed in chopping/nodding or\n"
00098 "chopping or nodding modes into one combined image using optionally\n"
00099 "cross-correlation methods.\n"
00100 "The files listed in the Set Of Frames (sof-file) must be tagged:\n"
00101 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_CNJ " or\n"
00102 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_CJ " or\n"
00103 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_NJ " or\n"
00104 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_DJ "\n"
00105 "\n"
00106 "The corresponding primary product will have a FITS card\n"
00107 "'HIERARCH ESO PRO CATG' with a value of\n"
00108 VISIR_IMG_COMBINE_COMBINED_PROCATG_CNJ " or\n"
00109 VISIR_IMG_COMBINE_COMBINED_PROCATG_CJ " or\n"
00110 VISIR_IMG_COMBINE_COMBINED_PROCATG_NJ " or\n"
00111 VISIR_IMG_COMBINE_COMBINED_PROCATG_DJ
00112 "\n";
00113
00114
00115
00116
00117
00118
00127
00128 int cpl_plugin_get_info(cpl_pluginlist * list)
00129 {
00130 cpl_recipe * recipe = cpl_calloc(1, sizeof(*recipe));
00131 cpl_plugin * plugin = &recipe->interface;
00132
00133
00134 if (cpl_plugin_init(plugin,
00135 CPL_PLUGIN_API,
00136 VISIR_BINARY_VERSION,
00137 CPL_PLUGIN_TYPE_RECIPE,
00138 recipename,
00139 "Images combination recipe",
00140 visir_img_combine_description,
00141 "Lars Lundin",
00142 PACKAGE_BUGREPORT,
00143 visir_get_license(),
00144 visir_img_combine_create,
00145 visir_img_combine_exec,
00146 visir_img_combine_destroy)) return 1;
00147
00148 if (cpl_pluginlist_append(list, plugin)) return 1;
00149
00150 return 0;
00151 }
00152
00153
00162
00163 static int visir_img_combine_create(cpl_plugin * plugin)
00164 {
00165 cpl_recipe * recipe = (cpl_recipe *)plugin;
00166
00167
00168 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) return 1;
00169
00170
00171 recipe->parameters = cpl_parameterlist_new();
00172
00173
00174 return visir_parameter_set(recipe->parameters, recipename,
00175 VISIR_PARAM_REFINE | VISIR_PARAM_XCORR |
00176 VISIR_PARAM_OFFSETS | VISIR_PARAM_OBJECTS |
00177 VISIR_PARAM_NODPOS | VISIR_PARAM_AUTOBPM |
00178 VISIR_PARAM_GLITCH | VISIR_PARAM_PURGE |
00179 VISIR_PARAM_UNION | VISIR_PARAM_REJECT |
00180 VISIR_PARAM_PLOT);
00181
00182 }
00183
00184
00190
00191 static int visir_img_combine_exec(cpl_plugin * plugin)
00192 {
00193 cpl_recipe * recipe = (cpl_recipe *)plugin;
00194
00195
00196 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) return 1;
00197
00198 return visir_img_combine(recipe->parameters, recipe->frames);
00199 }
00200
00201
00207
00208 static int visir_img_combine_destroy(cpl_plugin * plugin)
00209 {
00210 cpl_recipe * recipe = (cpl_recipe *)plugin;
00211
00212
00213 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) return 1;
00214 cpl_parameterlist_delete(recipe->parameters);
00215 return 0;
00216 }
00217
00218
00225
00226 static int visir_img_combine(
00227 cpl_parameterlist * parlist,
00228 cpl_frameset * framelist)
00229 {
00230 cpl_parameter * par;
00231 const char * badpix;
00232 const char * flat;
00233 cpl_frameset * rawframes = NULL;
00234 cpl_image ** combined = NULL;
00235 const char * sval;
00236
00237
00238 if (cpl_error_get_code()) return cpl_error_get_code();
00239
00240 visir_img_combine_config.bg_mean = -1.0;
00241
00242
00243 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.offsets");
00244 strcpy(visir_img_combine_config.offsets, cpl_parameter_get_string(par));
00245 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.objects");
00246 strcpy(visir_img_combine_config.objects, cpl_parameter_get_string(par));
00247 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.nodding");
00248 strcpy(visir_img_combine_config.nodding, cpl_parameter_get_string(par));
00249 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.auto_bpm");
00250 visir_img_combine_config.auto_bpm = cpl_parameter_get_bool(par);
00251 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.rem_glitch");
00252 visir_img_combine_config.rem_glitch = cpl_parameter_get_bool(par);
00253 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.purge_bad");
00254 visir_img_combine_config.purge_bad = cpl_parameter_get_bool(par);
00255 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.refine");
00256 visir_img_combine_config.refine = cpl_parameter_get_bool(par);
00257 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.xcorr");
00258 sval = cpl_parameter_get_string(par);
00259 skip_if (sscanf(sval, "%d %d %d %d",
00260 &visir_img_combine_config.sx,
00261 &visir_img_combine_config.sy,
00262 &visir_img_combine_config.mx,
00263 &visir_img_combine_config.my) != 4);
00264
00265 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.union");
00266 visir_img_combine_config.union_flag = cpl_parameter_get_bool(par);
00267 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.rej");
00268 sval = cpl_parameter_get_string(par);
00269 skip_if (sscanf(sval, "%d %d",
00270 &visir_img_combine_config.rej_low,
00271 &visir_img_combine_config.rej_high) !=2 );
00272
00273 par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.plot");
00274 visir_img_combine_config.plot = cpl_parameter_get_int(par);
00275
00276
00277 skip_if (visir_dfs_set_groups(framelist));
00278
00279
00280 rawframes = irplib_frameset_extract_regexp(framelist, "^("
00281 VISIR_IMG_COMBINE_CNJ "|"
00282 VISIR_IMG_COMBINE_CJ "|"
00283 VISIR_IMG_COMBINE_NJ "|"
00284 VISIR_IMG_COMBINE_DJ ")$");
00285 skip_if (rawframes == NULL);
00286
00287 skip_if(visir_dfs_check_frameset_tag(rawframes));
00288
00289
00290 visir_img_combine_config.img_mode = visir_img_none;
00291 if (cpl_frameset_find(rawframes, VISIR_IMG_COMBINE_DJ))
00292 visir_img_combine_config.img_mode = visir_img_dj;
00293 if (cpl_frameset_find(rawframes, VISIR_IMG_COMBINE_NJ)) {
00294 skip_if (visir_img_combine_config.img_mode);
00295 visir_img_combine_config.img_mode = visir_img_nj;
00296 }
00297 if (cpl_frameset_find(rawframes, VISIR_IMG_COMBINE_CJ)) {
00298 skip_if (visir_img_combine_config.img_mode);
00299 visir_img_combine_config.img_mode = visir_img_cj;
00300 }
00301 if (cpl_frameset_find(rawframes, VISIR_IMG_COMBINE_CNJ)) {
00302 skip_if (visir_img_combine_config.img_mode);
00303 visir_img_combine_config.img_mode = visir_img_cnj;
00304 }
00305
00306
00307 badpix = irplib_frameset_find_file(framelist, VISIR_CALIB_BPM);
00308
00309
00310 flat = irplib_frameset_find_file(framelist, VISIR_CALIB_FLAT);
00311
00312
00313 combined = visir_img_recombine(rawframes, badpix, flat,
00314 visir_img_combine_config.offsets,
00315 visir_img_combine_config.objects,
00316 visir_img_combine_config.nodding,
00317 visir_img_combine_config.auto_bpm,
00318 visir_img_combine_config.rem_glitch,
00319 visir_img_combine_config.purge_bad,
00320 visir_img_combine_config.refine,
00321 visir_img_combine_config.sx,
00322 visir_img_combine_config.sy,
00323 visir_img_combine_config.mx,
00324 visir_img_combine_config.my,
00325 visir_img_combine_config.rej_low,
00326 visir_img_combine_config.rej_high,
00327 visir_img_combine_config.union_flag,
00328 CPL_FALSE, 0, 0, 0,0,0,0,
00329 visir_img_combine_config.plot);
00330
00331
00332 if (combined == NULL) {
00333 cpl_msg_error(__func__, "Could not combine the input frames");
00334 skip_if(1);
00335 }
00336
00337
00338 visir_img_combine_config.bg_mean = visir_hcycle_background(rawframes, 0, 0);
00339
00340 skip_if (cpl_error_get_code());
00341
00342
00343 cpl_msg_info(__func__, "Save the combined image and contribution map");
00344 visir_img_combine_save(combined[0], combined[1], parlist, framelist);
00345
00346 if (cpl_error_get_code()) {
00347 cpl_msg_error(__func__, "Cannot save products");
00348 skip_if(1);
00349 }
00350
00351 end_skip;
00352
00353 if (combined) {
00354 cpl_image_delete(combined[0]);
00355 cpl_image_delete(combined[1]);
00356 cpl_free(combined);
00357 }
00358
00359 cpl_frameset_delete(rawframes);
00360
00361 return cpl_error_get_code();
00362 }
00363
00364
00373
00374 static int visir_img_combine_save(
00375 const cpl_image * combined,
00376 const cpl_image * contrib,
00377 const cpl_parameterlist * parlist,
00378 cpl_frameset * set)
00379 {
00380
00381 const char * ref_file =
00382 cpl_frame_get_filename(irplib_frameset_get_first_from_group(set,
00383 CPL_FRAME_GROUP_RAW));
00384 cpl_propertylist * plist = cpl_propertylist_load(ref_file, 0);
00385 cpl_propertylist * qclist = cpl_propertylist_new();
00386 const char * capa = visir_get_capa(plist);
00387 const char * pafcopy = "^(DATE-OBS|ARCFILE|ESO TPL ID|ESO DET DIT"
00388 "|MJD-OBS|ESO INS PFOV)$";
00389 const char * procatg_combine;
00390 const char * procatg_contrib;
00391 FILE * paf = NULL;
00392
00393
00394
00395 skip_if (cpl_error_get_code());
00396
00397 skip_if (cpl_propertylist_copy_property_regexp(qclist, plist, pafcopy));
00398
00399
00400 skip_if (!(paf = visir_paf_init(recipename)));
00401
00402 skip_if (irplib_propertylist_dump_paf(qclist, paf));
00403
00404
00405 cpl_propertylist_empty(qclist);
00406
00407 cpl_propertylist_empty(plist);
00408
00409
00410 skip_if (cpl_propertylist_append_double(qclist, "ESO QC BACKGD MEAN",
00411 visir_img_combine_config.bg_mean));
00412
00413
00414 skip_if (capa != NULL &&
00415 cpl_propertylist_append_string(qclist, "ESO QC CAPA", capa));
00416
00417 switch (visir_img_combine_config.img_mode) {
00418 case visir_img_dj:
00419 procatg_combine = VISIR_IMG_COMBINE_COMBINED_PROCATG_DJ;
00420 procatg_contrib = VISIR_IMG_COMBINE_CONTRIB_PROCATG_DJ;
00421 break;
00422 case visir_img_cj:
00423 procatg_combine = VISIR_IMG_COMBINE_COMBINED_PROCATG_CJ;
00424 procatg_contrib = VISIR_IMG_COMBINE_CONTRIB_PROCATG_CJ;
00425 break;
00426 case visir_img_nj:
00427 procatg_combine = VISIR_IMG_COMBINE_COMBINED_PROCATG_NJ;
00428 procatg_contrib = VISIR_IMG_COMBINE_CONTRIB_PROCATG_NJ;
00429 break;
00430 case visir_img_cnj:
00431 procatg_combine = VISIR_IMG_COMBINE_COMBINED_PROCATG_CNJ;
00432 procatg_contrib = VISIR_IMG_COMBINE_CONTRIB_PROCATG_CNJ;
00433 break;
00434 default:
00435 assert (0);
00436 }
00437
00438
00439 skip_if (visir_image_save(parlist, set, combined, recipename,
00440 procatg_combine,
00441 qclist, NULL));
00442
00443
00444 skip_if (visir_image_save(parlist, set, contrib, recipename,
00445 procatg_contrib,
00446 qclist, "_contrib"));
00447
00448 skip_if (irplib_propertylist_dump_paf(qclist, paf));
00449
00450 end_skip;
00451
00452 visir_paf_end(paf);
00453
00454 cpl_propertylist_delete(qclist);
00455 cpl_propertylist_delete(plist);
00456
00457 return cpl_error_get_code();
00458 }