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
00029
00030 #ifdef HAVE_CONFIG_H
00031 #include <config.h>
00032 #endif
00033
00034 #include <stdio.h>
00035 #include <string.h>
00036 #include <cpl.h>
00037 #include <math.h>
00038
00039 #include "vircam_utils.h"
00040 #include "vircam_mask.h"
00041 #include "vircam_pfits.h"
00042 #include "vircam_dfs.h"
00043 #include "vircam_mods.h"
00044 #include "vircam_fits.h"
00045 #include "vircam_tfits.h"
00046 #include "vircam_jmp_utils.h"
00047 #include "vircam_paf.h"
00048
00049
00050
00051 static int vircam_jitter_microstep_process_create(cpl_plugin *);
00052 static int vircam_jitter_microstep_process_exec(cpl_plugin *);
00053 static int vircam_jitter_microstep_process_destroy(cpl_plugin *);
00054 static int vircam_jitter_microstep_process(cpl_parameterlist *,
00055 cpl_frameset *);
00056 static cpl_propertylist *vircam_jitter_microstep_process_dummyqc(int type);
00057
00058
00059 static char vircam_jitter_microstep_process_description[] =
00060 "vircam_jitter_microstep_process -- VIRCAM science product recipe.\n\n"
00061 "Process a complete pawprint for VIRCAM data. Remove instrumental\n"
00062 "signature, interleave microstep sequences (if done), combine jitters\n"
00063 "photometrically and astrometrically calibrate the pawprint image\n\n"
00064 "The program accepts the following files in the SOF:\n\n"
00065 " Tag Description\n"
00066 " -----------------------------------------------------------------------\n"
00067 " %-21s A list of raw science images or\n"
00068 " %-21s A list of raw science images (extended)\n"
00069 " %-21s A list of offset sky exposures (optional)\n"
00070 " %-21s A master dark frame\n"
00071 " %-21s A master twilight flat frame\n"
00072 " %-21s A master sky frame (optional)\n"
00073 " %-21s A channel table\n"
00074 " %-21s A photometric calibration table\n"
00075 " %-21s A readnoise/gain file\n"
00076 " %-21s A master confidence map or\n"
00077 " %-21s A master bad pixel mask\n"
00078 " %-21s A master standard star index\n"
00079 "All of the above are required\n"
00080 "\n";
00081
00219
00220
00221
00229
00230
00231 int cpl_plugin_get_info(cpl_pluginlist *list) {
00232 cpl_recipe *recipe = cpl_calloc(1,sizeof(*recipe));
00233 cpl_plugin *plugin = &recipe->interface;
00234 char alldesc[SZ_ALLDESC];
00235 (void)snprintf(alldesc,SZ_ALLDESC,
00236 vircam_jitter_microstep_process_description,
00237 VIRCAM_SCI_OBJECT_RAW,VIRCAM_SCI_OBJECT_EXT_RAW,
00238 VIRCAM_OFFSET_SKY_RAW,VIRCAM_CAL_DARK,
00239 VIRCAM_CAL_TWILIGHT_FLAT,VIRCAM_CAL_SKY,VIRCAM_CAL_CHANTAB,
00240 VIRCAM_CAL_PHOTTAB,VIRCAM_CAL_READGAINFILE,VIRCAM_CAL_CONF,
00241 VIRCAM_CAL_BPM,VIRCAM_CAL_2MASS);
00242
00243 cpl_plugin_init(plugin,
00244 CPL_PLUGIN_API,
00245 VIRCAM_BINARY_VERSION,
00246 CPL_PLUGIN_TYPE_RECIPE,
00247 "vircam_jitter_microstep_process",
00248 "VIRCAM jitter microstep recipe",
00249 alldesc,
00250 "Jim Lewis",
00251 "jrl@ast.cam.ac.uk",
00252 vircam_get_license(),
00253 vircam_jitter_microstep_process_create,
00254 vircam_jitter_microstep_process_exec,
00255 vircam_jitter_microstep_process_destroy);
00256
00257 cpl_pluginlist_append(list,plugin);
00258
00259 return(0);
00260 }
00261
00262
00271
00272
00273 static int vircam_jitter_microstep_process_create(cpl_plugin *plugin) {
00274 cpl_recipe *recipe;
00275 cpl_parameter *p;
00276
00277
00278
00279 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00280 recipe = (cpl_recipe *)plugin;
00281 else
00282 return(-1);
00283
00284
00285
00286 recipe->parameters = cpl_parameterlist_new();
00287
00288
00289
00290 p = cpl_parameter_new_value("vircam.vircam_jitter_microstep_process.ipix",
00291 CPL_TYPE_INT,
00292 "Minimum pixel area for each detected object",
00293 "vircam.vircam_jitter_microstep_process",5);
00294 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"ipix");
00295 cpl_parameterlist_append(recipe->parameters,p);
00296
00297
00298
00299 p = cpl_parameter_new_value("vircam.vircam_jitter_microstep_process.thresh",
00300 CPL_TYPE_DOUBLE,
00301 "Detection threshold in sigma above sky",
00302 "vircam.vircam_jitter_microstep_process",2.0);
00303 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"thr");
00304 cpl_parameterlist_append(recipe->parameters,p);
00305
00306
00307
00308 p = cpl_parameter_new_value("vircam.vircam_jitter_microstep_process.icrowd",
00309 CPL_TYPE_BOOL,"Use deblending?",
00310 "vircam.vircam_jitter_microstep_process",1);
00311 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"icrowd");
00312 cpl_parameterlist_append(recipe->parameters,p);
00313
00314
00315
00316 p = cpl_parameter_new_value("vircam.vircam_jitter_microstep_process.rcore",
00317 CPL_TYPE_DOUBLE,"Value of Rcore in pixels",
00318 "vircam.vircam_jitter_microstep_process",3.0);
00319 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"rcore");
00320 cpl_parameterlist_append(recipe->parameters,p);
00321
00322
00323
00324 p = cpl_parameter_new_value("vircam.vircam_jitter_microstep_process.nbsize",
00325 CPL_TYPE_INT,"Background smoothing box size",
00326 "vircam.vircam_jitter_microstep_process",64);
00327 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"nb");
00328 cpl_parameterlist_append(recipe->parameters,p);
00329
00330
00331
00332 p = cpl_parameter_new_value("vircam.vircam_jitter_microstep_process.savecat",
00333 CPL_TYPE_BOOL,"Save catalogue?",
00334 "vircam.vircam_jitter_microstep_process",1);
00335 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"savecat");
00336 cpl_parameterlist_append(recipe->parameters,p);
00337
00338
00339
00340
00341 p = cpl_parameter_new_value("vircam.vircam_jitter_microstep_process.destripe",
00342 CPL_TYPE_BOOL,"Destripe images?",
00343 "vircam.vircam_jitter_microstep_process",1);
00344 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"destripe");
00345 cpl_parameterlist_append(recipe->parameters,p);
00346
00347
00348
00349 p = cpl_parameter_new_value("vircam.vircam_jitter_microstep_process.skycor",
00350 CPL_TYPE_BOOL,"Do a sky subtraction?",
00351 "vircam.vircam_jitter_microstep_process",1);
00352 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"skycor");
00353 cpl_parameterlist_append(recipe->parameters,p);
00354
00355
00356
00357 p = cpl_parameter_new_value("vircam.vircam_jitter_microstep_process.savesimple",
00358 CPL_TYPE_BOOL,"Save simple images?",
00359 "vircam.vircam_jitter_microstep_process",0);
00360 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"savesimple");
00361 cpl_parameterlist_append(recipe->parameters,p);
00362
00363
00364
00365 p = cpl_parameter_new_range("vircam.vircam_jitter_microstep_process.extenum",
00366 CPL_TYPE_INT,
00367 "Extension number to be done, 0 == all",
00368 "vircam.vircam_jitter_microstep_process",
00369 1,0,16);
00370 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"ext");
00371 cpl_parameterlist_append(recipe->parameters,p);
00372
00373
00374
00375 return(0);
00376 }
00377
00378
00379
00385
00386
00387 static int vircam_jitter_microstep_process_exec(cpl_plugin *plugin) {
00388 cpl_recipe *recipe;
00389
00390
00391
00392 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00393 recipe = (cpl_recipe *)plugin;
00394 else
00395 return(-1);
00396
00397 return(vircam_jitter_microstep_process(recipe->parameters,recipe->frames));
00398 }
00399
00400
00406
00407
00408 static int vircam_jitter_microstep_process_destroy(cpl_plugin *plugin) {
00409 cpl_recipe *recipe ;
00410
00411
00412
00413 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00414 recipe = (cpl_recipe *)plugin;
00415 else
00416 return(-1);
00417
00418 cpl_parameterlist_delete(recipe->parameters);
00419 return(0);
00420 }
00421
00422
00429
00430
00431 static int vircam_jitter_microstep_process(cpl_parameterlist *parlist,
00432 cpl_frameset *framelist) {
00433 const char *fctid="vircam_jitter_microstep_process";
00434 cpl_parameter *p;
00435 int jst,jfn,status,j,i,retval,nusteps,isconf,live,ndit;
00436 cpl_size nlab;
00437 float readnoise,gain,gaincor_fac;
00438 vir_fits *ff;
00439 cpl_frame *catindex;
00440 cpl_propertylist *pp;
00441
00442
00443
00444 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
00445 cpl_msg_error(fctid,"Input framelist NULL or has no input data");
00446 return(-1);
00447 }
00448
00449
00450
00451 if (vircam_frameset_fexists(framelist) != VIR_OK) {
00452 cpl_msg_error(fctid,"Input frameset is missing files. Check SOF");
00453 return(-1);
00454 }
00455
00456
00457
00458 vircam_jmp_init();
00459 (void)strncpy(vircam_recipename,fctid,VIRCAM_PATHSZ);
00460 (void)snprintf(vircam_recipepaf,VIRCAM_PATHSZ,"VIRCAM/%s",fctid);
00461 recflag = RECSCI;
00462
00463
00464
00465 p = cpl_parameterlist_find(parlist,
00466 "vircam.vircam_jitter_microstep_process.ipix");
00467 vircam_jmp_config.ipix = cpl_parameter_get_int(p);
00468 p = cpl_parameterlist_find(parlist,
00469 "vircam.vircam_jitter_microstep_process.thresh");
00470 vircam_jmp_config.threshold = (float)cpl_parameter_get_double(p);
00471 p = cpl_parameterlist_find(parlist,
00472 "vircam.vircam_jitter_microstep_process.icrowd");
00473 vircam_jmp_config.icrowd = cpl_parameter_get_bool(p);
00474 p = cpl_parameterlist_find(parlist,
00475 "vircam.vircam_jitter_microstep_process.rcore");
00476 vircam_jmp_config.rcore = (float)cpl_parameter_get_double(p);
00477 p = cpl_parameterlist_find(parlist,
00478 "vircam.vircam_jitter_microstep_process.nbsize");
00479 vircam_jmp_config.nbsize = cpl_parameter_get_int(p);
00480 p = cpl_parameterlist_find(parlist,
00481 "vircam.vircam_jitter_microstep_process.savecat");
00482 vircam_jmp_config.savecat = cpl_parameter_get_bool(p);
00483 p = cpl_parameterlist_find(parlist,
00484 "vircam.vircam_jitter_microstep_process.destripe");
00485 vircam_jmp_config.destripe = cpl_parameter_get_bool(p);
00486 p = cpl_parameterlist_find(parlist,
00487 "vircam.vircam_jitter_microstep_process.skycor");
00488 vircam_jmp_config.skycor = cpl_parameter_get_bool(p);
00489 p = cpl_parameterlist_find(parlist,
00490 "vircam.vircam_jitter_microstep_process.savesimple");
00491 vircam_jmp_config.savesimple = cpl_parameter_get_bool(p);
00492 p = cpl_parameterlist_find(parlist,
00493 "vircam.vircam_jitter_microstep_process.extenum");
00494 vircam_jmp_config.extenum = cpl_parameter_get_int(p);
00495
00496
00497
00498 if (vircam_dfs_set_groups(framelist) != VIR_OK) {
00499 cpl_msg_error(fctid,"Cannot identify RAW and CALIB frames");
00500 vircam_jmp_tidy(0);
00501 return(-1);
00502 }
00503
00504
00505
00506 if ((ps.labels = cpl_frameset_labelise(framelist,vircam_compare_tags,
00507 &nlab)) == NULL) {
00508 cpl_msg_error(fctid,"Cannot labelise the input frames");
00509 vircam_jmp_tidy(0);
00510 return(-1);
00511 }
00512
00513
00514
00515 if ((ps.science_frames =
00516 vircam_frameset_subgroup(framelist,ps.labels,nlab,
00517 VIRCAM_SCI_OBJECT_RAW)) == NULL) {
00518 if ((ps.science_frames =
00519 vircam_frameset_subgroup(framelist,ps.labels,nlab,
00520 VIRCAM_SCI_OBJECT_EXT_RAW)) == NULL) {
00521 cpl_msg_error(fctid,"No science images to process!");
00522 vircam_jmp_tidy(0);
00523 return(-1);
00524 }
00525 }
00526
00527
00528
00529 if ((ps.master_sky = vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00530 VIRCAM_CAL_SKY)) == NULL) {
00531 if ((ps.offset_skies =
00532 vircam_frameset_subgroup(framelist,ps.labels,nlab,
00533 VIRCAM_OFFSET_SKY_RAW)) == NULL)
00534 offsky = 0;
00535 else
00536 offsky = 1;
00537 } else {
00538 offsky = -1;
00539 }
00540
00541
00542
00543 if ((ps.master_dark =
00544 vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00545 VIRCAM_CAL_DARK)) == NULL) {
00546 cpl_msg_error(fctid,"No master dark found");
00547 vircam_jmp_tidy(0);
00548 return(-1);
00549 }
00550
00551
00552
00553 if ((ps.master_twilight_flat =
00554 vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00555 VIRCAM_CAL_TWILIGHT_FLAT)) == NULL) {
00556 cpl_msg_error(fctid,"No master twilight flat found");
00557 vircam_jmp_tidy(0);
00558 return(-1);
00559 }
00560
00561
00562
00563 status = VIR_OK;
00564 if (vircam_gaincor_calc(ps.master_twilight_flat,&i,&(ps.gaincors),
00565 &status) != VIR_OK) {
00566 cpl_msg_error(fctid,"Error calculating gain corrections");
00567 vircam_jmp_tidy(0);
00568 return(-1);
00569 }
00570
00571
00572
00573 if ((ps.readgain_file =
00574 vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00575 VIRCAM_CAL_READGAINFILE)) == NULL) {
00576 cpl_msg_error(fctid,"No master readnoise/gain file found");
00577 vircam_jmp_tidy(0);
00578 return(-1);
00579 }
00580
00581
00582
00583
00584
00585 isconf = 1;
00586 if ((ps.master_conf =
00587 vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00588 VIRCAM_CAL_CONF)) == NULL) {
00589 isconf = 0;
00590 if ((ps.master_conf =
00591 vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00592 VIRCAM_CAL_BPM)) == NULL) {
00593 cpl_msg_error(fctid,"No master confidence map found");
00594 vircam_jmp_tidy(0);
00595 return(-1);
00596 }
00597 }
00598 ps.mask = vircam_mask_define(framelist,ps.labels,nlab);
00599
00600
00601
00602 if ((ps.chantab = vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00603 VIRCAM_CAL_CHANTAB)) == NULL) {
00604 cpl_msg_error(fctid,"No channel table found");
00605 vircam_jmp_tidy(0);
00606 return(-1);
00607 }
00608
00609
00610
00611 if ((ps.phottab = vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00612 VIRCAM_CAL_PHOTTAB)) == NULL) {
00613 cpl_msg_error(fctid,"No photometric table found");
00614 vircam_jmp_tidy(0);
00615 return(-1);
00616 }
00617 if ((ps.tphottab = cpl_table_load(cpl_frame_get_filename(ps.phottab),1,0)) == NULL) {
00618 cpl_msg_error(fctid,"Unable to load photometric table");
00619 vircam_jmp_tidy(0);
00620 return(-1);
00621 }
00622
00623
00624
00625 if ((catindex = vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00626 VIRCAM_CAL_2MASS)) == NULL) {
00627 cpl_msg_info(fctid,"No 2MASS index found -- cannot continue");
00628 vircam_jmp_tidy(0);
00629 return(-1);
00630 }
00631
00632
00633
00634 if (vircam_catpars(catindex,&(ps.catpath),&(ps.catname)) == VIR_FATAL) {
00635 vircam_jmp_tidy(0);
00636 cpl_frame_delete(catindex);
00637 return(-1);
00638 }
00639 cpl_frame_delete(catindex);
00640
00641
00642
00643 (void)strcpy(current_catpath,ps.catpath);
00644 (void)strcpy(current_cat,ps.catname);
00645
00646
00647
00648 pp = cpl_propertylist_load(cpl_frame_get_filename(cpl_frameset_get_frame(ps.science_frames,0)),0);
00649 if (vircam_pfits_get_ndit(pp,&ndit) != VIR_OK) {
00650 cpl_msg_error(fctid,"No value for NDIT available");
00651 freepropertylist(pp);
00652 vircam_jmp_tidy(0);
00653 return(-1);
00654 }
00655 cpl_propertylist_delete(pp);
00656
00657
00658
00659
00660
00661 vircam_exten_range(vircam_jmp_config.extenum,
00662 (const cpl_frame *)cpl_frameset_get_frame(ps.science_frames,0),
00663 &jst,&jfn);
00664 if (jst == -1 || jfn == -1) {
00665 cpl_msg_error(fctid,"Unable to continue");
00666 vircam_jmp_tidy(0);
00667 return(-1);
00668 }
00669
00670
00671
00672 status = VIR_OK;
00673 for (j = jst; j <= jfn; j++) {
00674 isfirst = (j == jst);
00675 gaincor_fac = (ps.gaincors)[j-1];
00676 cpl_msg_info(fctid,"Beginning extension [%" CPL_SIZE_FORMAT "]",
00677 (cpl_size)j);
00678
00679
00680
00681
00682 ps.fdark = vircam_fits_load(ps.master_dark,CPL_TYPE_FLOAT,j);
00683 if (ps.fdark == NULL) {
00684 cpl_msg_error(fctid,
00685 "Error loading master dark %s[%" CPL_SIZE_FORMAT "]\n%s",
00686 cpl_frame_get_filename(ps.master_dark),(cpl_size)j,
00687 cpl_error_get_message());
00688 vircam_jmp_tidy(0);
00689 return(-1);
00690 }
00691 ps.fflat = vircam_fits_load(ps.master_twilight_flat,CPL_TYPE_FLOAT,j);
00692 if (ps.fflat == NULL) {
00693 cpl_msg_error(fctid,
00694 "Error loading master flat %s[%" CPL_SIZE_FORMAT "]\n%s",
00695 cpl_frame_get_filename(ps.master_twilight_flat),
00696 (cpl_size)j,cpl_error_get_message());
00697 vircam_jmp_tidy(0);
00698 return(-1);
00699 }
00700 ps.fconf = vircam_fits_load(ps.master_conf,CPL_TYPE_INT,j);
00701 if (ps.fconf == NULL) {
00702 cpl_msg_error(fctid,
00703 "Error loading master conf %s[%" CPL_SIZE_FORMAT "]\n%s",
00704 cpl_frame_get_filename(ps.master_conf),(cpl_size)j,
00705 cpl_error_get_message());
00706 vircam_jmp_tidy(0);
00707 return(-1);
00708 }
00709 if (! isconf)
00710 vircam_jmp_bpm2conf();
00711 if (vircam_mask_load(ps.mask,j,
00712 (int)cpl_image_get_size_x(vircam_fits_get_image(ps.fconf)),
00713 (int)cpl_image_get_size_y(vircam_fits_get_image(ps.fconf))) != VIR_OK) {
00714 cpl_msg_error(fctid,
00715 "Error loading mask from master conf %s[%" CPL_SIZE_FORMAT "]\n%s",
00716 cpl_frame_get_filename(ps.master_conf),(cpl_size)j,
00717 cpl_error_get_message());
00718 vircam_jmp_tidy(0);
00719 return(-1);
00720 }
00721 if (offsky == -1) {
00722 ps.fsky = vircam_fits_load(ps.master_sky,CPL_TYPE_FLOAT,j);
00723 if (ps.fsky == NULL) {
00724 cpl_msg_error(fctid,
00725 "Error loading master sky %s[%" CPL_SIZE_FORMAT "]\n%s",
00726 cpl_frame_get_filename(ps.master_sky),(cpl_size)j,
00727 cpl_error_get_message());
00728 vircam_jmp_tidy(0);
00729 return(-1);
00730 }
00731 }
00732 ps.fchantab = vircam_tfits_load(ps.chantab,j);
00733 if (ps.fchantab == NULL) {
00734 cpl_msg_error(fctid,
00735 "Error loading channel table %s[%" CPL_SIZE_FORMAT "]\n%s",
00736 cpl_frame_get_filename(ps.chantab),(cpl_size)j,
00737 cpl_error_get_message());
00738 vircam_jmp_tidy(0);
00739 return(-1);
00740 }
00741
00742
00743
00744 ps.nscience = cpl_frameset_get_size(ps.science_frames);
00745 ps.sci_fits = vircam_fits_load_list(ps.science_frames,CPL_TYPE_FLOAT,j);
00746 if (ps.sci_fits == NULL) {
00747 cpl_msg_error(fctid,
00748 "Error loading science frames extension %" CPL_SIZE_FORMAT ": %s",
00749 (cpl_size)j,cpl_error_get_message());
00750 vircam_jmp_tidy(0);
00751 return(-1);
00752 }
00753
00754
00755
00756 ps.phupaf = vircam_paf_phu_items(vircam_fits_get_phu(ps.sci_fits[0]));
00757
00758
00759
00760 if (offsky == 1) {
00761 ps.noffsets = cpl_frameset_get_size(ps.offset_skies);
00762 ps.offsky_fits = vircam_fits_load_list(ps.offset_skies,
00763 CPL_TYPE_FLOAT,j);
00764 if (ps.offsky_fits == NULL) {
00765 cpl_msg_error(fctid,
00766 "Error loading offset skies extension %" CPL_SIZE_FORMAT ": %s",
00767 (cpl_size)j,cpl_error_get_message());
00768 vircam_jmp_tidy(0);
00769 return(-1);
00770 }
00771 } else {
00772 ps.noffsets = 0;
00773 ps.offsky_fits = NULL;
00774 }
00775
00776
00777
00778
00779
00780 for (i = 0; i < ps.nscience; i++) {
00781 ff = ps.sci_fits[i];
00782 vircam_pfits_get_detlive(vircam_fits_get_ehu(ff),&live);
00783 if (! live)
00784 vircam_fits_set_error(ff,VIR_FATAL);
00785 if (vircam_check_crval(vircam_fits_get_phu(ff),
00786 vircam_fits_get_ehu(ff)) != VIR_OK) {
00787 cpl_msg_error(fctid,"Unable to correct CRVAL in %s",
00788 vircam_fits_get_fullname(ff));
00789 vircam_jmp_tidy(0);
00790 return(-1);
00791 }
00792 }
00793 for (i = 0; i < ps.noffsets; i++) {
00794 ff = ps.offsky_fits[i];
00795 vircam_pfits_get_detlive(vircam_fits_get_ehu(ff),&live);
00796 if (! live)
00797 vircam_fits_set_error(ff,VIR_FATAL);
00798 }
00799
00800
00801
00802 vircam_jmp_get_readnoise_gain(j,&readnoise,&gain);
00803
00804
00805
00806
00807 cpl_msg_info(fctid,"Doing stage1 corrections");
00808 for (i = 0; i < ps.nscience; i++) {
00809 ff = ps.sci_fits[i];
00810 cpl_propertylist_update_float(vircam_fits_get_ehu(ff),"READNOIS",
00811 readnoise);
00812 cpl_propertylist_set_comment(vircam_fits_get_ehu(ff),"READNOIS",
00813 "[e-] Readnoise used in processing");
00814 cpl_propertylist_update_float(vircam_fits_get_ehu(ff),"GAIN",gain);
00815 cpl_propertylist_set_comment(vircam_fits_get_ehu(ff),"GAIN",
00816 "[e-/adu] Gain used in processing");
00817 if (vircam_fits_get_status(ff) == VIR_FATAL) {
00818 cpl_msg_info(fctid,"Detector is flagged dead in %s",
00819 vircam_fits_get_fullname(ff));
00820 continue;
00821 }
00822 status = VIR_OK;
00823 (void)vircam_darkcor(ff,ps.fdark,1.0,&status);
00824 (void)vircam_lincor(ff,ps.fchantab,1,ndit,&status);
00825 (void)vircam_nditcor(ff,ndit,&status);
00826 (void)vircam_flatcor(ff,ps.fflat,&status);
00827 (void)vircam_gaincor(ff,gaincor_fac,&status);
00828 vircam_fits_set_error(ff,status);
00829 }
00830 for (i = 0; i < ps.noffsets; i++) {
00831 ff = ps.offsky_fits[i];
00832 if (vircam_fits_get_status(ff) == VIR_FATAL) {
00833 cpl_msg_info(fctid,"Detector is flagged dead in %s",
00834 vircam_fits_get_fullname(ff));
00835 continue;
00836 }
00837 status = VIR_OK;
00838 (void)vircam_darkcor(ff,ps.fdark,1.0,&status);
00839 (void)vircam_lincor(ff,ps.fchantab,1,ndit,&status);
00840 (void)vircam_nditcor(ff,ndit,&status);
00841 (void)vircam_flatcor(ff,ps.fflat,&status);
00842 (void)vircam_gaincor(ff,gaincor_fac,&status);
00843 vircam_fits_set_error(ff,status);
00844 }
00845
00846
00847
00848 if (vircam_jmp_config.skycor) {
00849 cpl_msg_info(fctid,"Doing sky correction");
00850 vircam_jmp_skycor();
00851 } else {
00852 for (i = 0; i < ps.nscience; i++) {
00853 pp = vircam_fits_get_ehu(ps.sci_fits[i]);
00854 cpl_propertylist_update_string(pp,"ESO DRS SKYCOR","none");
00855 cpl_propertylist_set_comment(pp,"ESO DRS SKYCOR",
00856 "Sky correction method");
00857 }
00858 }
00859
00860
00861
00862 if (vircam_jmp_config.destripe) {
00863 for (i = 0; i < ps.nscience; i++) {
00864 ff = ps.sci_fits[i];
00865 (void)vircam_destripe(ff,ps.mask,&status);
00866 vircam_fits_set_error(ff,status);
00867 }
00868 for (i = 0; i < ps.noffsets; i++) {
00869 ff = ps.offsky_fits[i];
00870 (void)vircam_destripe(ff,ps.mask,&status);
00871 vircam_fits_set_error(ff,status);
00872 }
00873 }
00874
00875
00876
00877
00878
00879 retval = vircam_pfits_get_nusteps(vircam_fits_get_phu(ps.sci_fits[0]),
00880 &nusteps);
00881 if (retval != VIR_OK) {
00882 cpl_msg_warning(fctid,"Unable to get nusteps from header.\nAssuming no microstepping");
00883 nusteps = 1;
00884 }
00885
00886
00887
00888
00889 ps.ndith = 0;
00890 if (nusteps < 4) {
00891 if (nusteps == 1)
00892 cpl_msg_info(fctid,"No interleaving will be done");
00893 else
00894 cpl_msg_warning(fctid,"Illegal number of microsteps: %" CPL_SIZE_FORMAT "\nNo interleaving will be done",
00895 (cpl_size)nusteps);
00896 ps.dith_input = cpl_malloc(ps.nscience*sizeof(vir_fits *));
00897 ps.dithc_input = cpl_malloc(sizeof(vir_fits *));
00898 for (i = 0; i < ps.nscience; i++) {
00899 if (vircam_fits_get_status(ps.sci_fits[i]) == VIR_OK)
00900 ps.dith_input[ps.ndith++] = ps.sci_fits[i];
00901 }
00902 ps.dithc_input[0] = ps.fconf;
00903 ps.ndithc = 1;
00904 interlv = 0;
00905
00906
00907
00908
00909
00910 } else {
00911 cpl_msg_info(fctid,"Interleaving");
00912 vircam_jmp_interleave();
00913 interlv = 1;
00914 }
00915
00916
00917
00918 cpl_msg_info(fctid,"Working out jitter offsets");
00919 vircam_jmp_dither_offsets();
00920 cpl_msg_info(fctid,"Stacking jittered frame");
00921 vircam_jmp_dither_images();
00922
00923
00924
00925 cpl_msg_info(fctid,"Doing object extraction");
00926 vircam_jmp_catalogue();
00927
00928
00929
00930 cpl_msg_info(fctid,"Matching objects with 2mass standards");
00931 vircam_jmp_matched_stds();
00932
00933
00934
00935 cpl_msg_info(fctid,"Fitting a WCS");
00936 vircam_jmp_wcsfit();
00937
00938
00939
00940 cpl_msg_info(fctid,"Doing photometric zeropoint calculation");
00941 vircam_jmp_photcal();
00942
00943
00944
00945 if (vircam_jmp_config.savesimple) {
00946 cpl_msg_info(fctid,"Saving simple images");
00947 if (vircam_jmp_save_simple(framelist,parlist) != 0) {
00948 vircam_jmp_tidy(0);
00949 return(-1);
00950 }
00951 }
00952 if (offsky == 1) {
00953 if (vircam_jmp_config.savesimple) {
00954 cpl_msg_info(fctid,"Saving offset sky simple images");
00955 if (vircam_jmp_save_simple_offsets(framelist,parlist) != 0) {
00956 vircam_jmp_tidy(0);
00957 return(-1);
00958 }
00959 }
00960 cpl_msg_info(fctid,"Saving mean offset sky image");
00961 if (vircam_jmp_save_offsky(framelist,parlist) != 0) {
00962 vircam_jmp_tidy(0);
00963 return(-1);
00964 }
00965 }
00966 vircam_mask_clear(ps.mask);
00967
00968
00969
00970 if (interlv) {
00971 cpl_msg_info(fctid,"Saving superframe images");
00972 if (vircam_jmp_save_super(framelist,parlist) != 0) {
00973 vircam_jmp_tidy(0);
00974 return(-1);
00975 }
00976 }
00977
00978
00979
00980 cpl_msg_info(fctid,"Saving stacked image");
00981 dummyqc = vircam_jitter_microstep_process_dummyqc(1);
00982 if (vircam_jmp_save_stack(framelist,parlist) != 0) {
00983 vircam_jmp_tidy(0);
00984 freepropertylist(dummyqc);
00985 return(-1);
00986 }
00987 freepropertylist(dummyqc);
00988 if (vircam_jmp_config.savecat) {
00989 cpl_msg_info(fctid,"Saving stacked image catalogue");
00990 dummyqc = vircam_jitter_microstep_process_dummyqc(2);
00991 if (vircam_jmp_save_catalogue(framelist,parlist) != 0) {
00992 vircam_jmp_tidy(0);
00993 freepropertylist(dummyqc);
00994 return(-1);
00995 }
00996 freepropertylist(dummyqc);
00997 }
00998
00999
01000
01001 vircam_jmp_tidy(1);
01002 }
01003
01004
01005
01006 vircam_jmp_tidy(0);
01007 return(0);
01008 }
01009
01010 static cpl_propertylist *vircam_jitter_microstep_process_dummyqc(int type) {
01011 cpl_propertylist *p;
01012
01013
01014
01015 p = cpl_propertylist_new();
01016
01017
01018
01019 switch (type) {
01020
01021
01022
01023 case 1:
01024 cpl_propertylist_update_double(p,"ESO QC WCS_DCRVAL1",0.0);
01025 cpl_propertylist_set_comment(p,"ESO QC WCS_DCRVAL1",
01026 "[deg] change in crval1");
01027 cpl_propertylist_update_double(p,"ESO QC WCS_DCRVAL2",0.0);
01028 cpl_propertylist_set_comment(p,"ESO QC WCS_DCRVAL2",
01029 "[deg] change in crval2");
01030 cpl_propertylist_update_double(p,"ESO QC WCS_DTHETA",0.0);
01031 cpl_propertylist_set_comment(p,"ESO QC WCS_DTHETA",
01032 "[deg] change in rotation");
01033 cpl_propertylist_update_double(p,"ESO QC WCS_SCALE",0.0);
01034 cpl_propertylist_set_comment(p,"ESO QC WCS_SCALE",
01035 "[arcsec] mean plate scale");
01036 cpl_propertylist_update_double(p,"ESO QC WCS_SHEAR",0.0);
01037 cpl_propertylist_set_comment(p,"ESO QC WCS_SHEAR",
01038 "[deg] abs(xrot) - abs(yrot)");
01039 cpl_propertylist_update_double(p,"ESO QC WCS_RMS",0.0);
01040 cpl_propertylist_set_comment(p,"ESO QC WCS_RMS",
01041 "[arcsec] Average error in WCS fit");
01042 cpl_propertylist_update_float(p,"ESO QC MAGZPT",0.0);
01043 cpl_propertylist_set_comment(p,"ESO QC MAGZPT",
01044 "[mag] photometric zeropoint");
01045 cpl_propertylist_update_float(p,"ESO QC MAGZERR",0.0);
01046 cpl_propertylist_set_comment(p,"ESO QC MAGZERR",
01047 "[mag] photometric zeropoint error");
01048 cpl_propertylist_update_int(p,"ESO QC MAGNZPT",0);
01049 cpl_propertylist_set_comment(p,"ESO QC MAGNZPT",
01050 "number of stars in magzpt calc");
01051 cpl_propertylist_update_int(p,"ESO QC MAGNCUT",0);
01052 cpl_propertylist_set_comment(p,"ESO QC MAGNCUT",
01053 "number of stars cut from magzpt calc");
01054 cpl_propertylist_update_float(p,"ESO QC LIMITING_MAG",0.0);
01055 cpl_propertylist_set_comment(p,"ESO QC LIMITING_MAG",
01056 "[mag] 5 sigma limiting mag");
01057 break;
01058
01059
01060
01061 case 2:
01062 cpl_propertylist_update_float(p,"ESO QC SATURATION",0.0);
01063 cpl_propertylist_set_comment(p,"ESO QC SATURATION",
01064 "[adu] Saturation level");
01065 cpl_propertylist_update_float(p,"ESO QC MEAN_SKY",0.0);
01066 cpl_propertylist_set_comment(p,"ESO QC MEAN_SKY",
01067 "[adu] Median sky brightness");
01068 cpl_propertylist_update_float(p,"ESO QC SKY_NOISE",0.0);
01069 cpl_propertylist_set_comment(p,"ESO QC SKY_NOISE",
01070 "[adu] Pixel noise at sky level");
01071 cpl_propertylist_update_float(p,"ESO QC IMAGE_SIZE",0.0);
01072 cpl_propertylist_set_comment(p,"ESO QC IMAGE_SIZE",
01073 "[pixels] Average FWHM of stellar objects")
01074 ;
01075 cpl_propertylist_update_float(p,"ESO QC ELLIPTICITY",0.0);
01076 cpl_propertylist_set_comment(p,"ESO QC ELLIPTICITY",
01077 "Average stellar ellipticity (1-b/a)");
01078 cpl_propertylist_update_float(p,"ESO QC APERTURE_CORR",0.0);
01079 cpl_propertylist_set_comment(p,"ESO QC APERTURE_CORR",
01080 "Stellar ap-corr 1x core flux");
01081 cpl_propertylist_update_int(p,"ESO QC NOISE_OBJ",0);
01082 cpl_propertylist_set_comment(p,"ESO QC NOISE_OBJ",
01083 "Number of noise objects");
01084 break;
01085 default:
01086 break;
01087 }
01088
01089
01090
01091 return(p);
01092 }
01093
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324