vircam_dark_current.c

00001 /* $Id: vircam_dark_current.c,v 1.46 2007/11/20 09:40:27 jim Exp $
00002  *
00003  * This file is part of the VIRCAM Pipeline
00004  * Copyright (C) 2005 Cambridge Astronomy Survey Unit
00005  *
00006  * This program is free software; you can redistribute it and/or modify
00007  * it under the terms of the GNU General Public License as published by
00008  * the Free Software Foundation; either version 2 of the License, or
00009  * (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software
00018  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  */
00020 
00021 /*
00022  * $Author: jim $
00023  * $Date: 2007/11/20 09:40:27 $
00024  * $Revision: 1.46 $
00025  * $Name:  $
00026  */
00027 
00028 /* Includes */
00029 
00030 #ifdef HAVE_CONFIG_H
00031 #include <config.h>
00032 #endif
00033 
00034 #include <cpl.h>
00035 #include <stdio.h>
00036 #include <math.h>
00037 
00038 #include "vircam_utils.h"
00039 #include "vircam_mask.h"
00040 #include "vircam_pfits.h"
00041 #include "vircam_dfs.h"
00042 #include "vircam_stats.h"
00043 #include "vircam_paf.h"
00044 
00045 /* Function prototypes */
00046 
00047 static int vircam_dark_current_create(cpl_plugin *) ;
00048 static int vircam_dark_current_exec(cpl_plugin *) ;
00049 static int vircam_dark_current_destroy(cpl_plugin *) ;
00050 static int vircam_dark_current(cpl_parameterlist *, cpl_frameset *) ;
00051 static int vircam_dark_current_save(cpl_frameset *filelist,
00052                                     cpl_parameterlist *parlist);
00053 static int vircam_dark_current_lastbit(int jext, cpl_frameset *framelist,
00054                                        cpl_parameterlist *parlist);
00055 static void vircam_dark_current_init(void);
00056 static void vircam_dark_current_tidy();
00057 
00058 /* Static global variables */
00059 
00060 static struct {
00061 
00062     /* Input */
00063 
00064     float       thresh;
00065     int         extenum;
00066 
00067     /* Output */
00068 
00069     float       mean_dark_current;
00070 } vircam_dark_current_config;
00071 
00072 static struct {
00073     int              *labels;
00074     cpl_frameset     *darklist;
00075     vir_mask         *master_mask;
00076     int              nframes;
00077     float            **data;
00078     vir_fits         **allfits;
00079     double           *subset;
00080     double           *exps;
00081     cpl_image        *outimage;
00082     vir_fits         **good;
00083     int              ngood;
00084     cpl_propertylist *phupaf;
00085 } ps;
00086 
00087 static cpl_frame *product_frame = NULL;
00088 static int isfirst;
00089 static int dummy;
00090 
00091 static char vircam_dark_current_description[] =
00092 "vircam_dark_current -- VIRCAM recipe for measuring dark current.\n"
00093 "A list of dark frames is given. A robust estimate of the dark current\n"
00094 "is calculated by fitting a median slope to the dark value vs exposure time\n"
00095 "for each pixel. The output is to a dark current map which shows the dark\n"
00096 "current in counts per second for each input pixel.\n\n"
00097 "The program requires the following files in the SOF:\n\n"
00098 "    Tag                   Description\n"
00099 "    -----------------------------------------------------------------------\n"
00100 "    %-21s A list of raw dark images with various exposure times\n"
00101 "    %-21s Optional master bad pixel map or\n"
00102 "    %-21s Optional master confidence map\n"
00103 "\n";
00104 
00167 /* Function code */
00168 
00169 /*---------------------------------------------------------------------------*/
00177 /*---------------------------------------------------------------------------*/
00178 
00179 int cpl_plugin_get_info(cpl_pluginlist *list) {
00180     cpl_recipe  *recipe = cpl_calloc(1,sizeof(*recipe));
00181     cpl_plugin  *plugin = &recipe->interface;
00182     char alldesc[SZ_ALLDESC];
00183     (void)snprintf(alldesc,SZ_ALLDESC,vircam_dark_current_description,
00184                    VIRCAM_DARKCUR_RAW,VIRCAM_CAL_BPM,VIRCAM_CAL_CONF);
00185 
00186     cpl_plugin_init(plugin,
00187                     CPL_PLUGIN_API,
00188                     VIRCAM_BINARY_VERSION,
00189                     CPL_PLUGIN_TYPE_RECIPE,
00190                     "vircam_dark_current",
00191                     "VIRCAM recipe to determine detector dark current",
00192                     alldesc,
00193                     "Jim Lewis",
00194                     "jrl@ast.cam.ac.uk",
00195                     vircam_get_license(),
00196                     vircam_dark_current_create,
00197                     vircam_dark_current_exec,
00198                     vircam_dark_current_destroy);
00199 
00200     cpl_pluginlist_append(list,plugin);
00201 
00202     return(0);
00203 }
00204 
00205 /*---------------------------------------------------------------------------*/
00214 /*---------------------------------------------------------------------------*/
00215 
00216 static int vircam_dark_current_create(cpl_plugin *plugin) {
00217     cpl_recipe      *recipe;
00218     cpl_parameter   *p;
00219 
00220     /* Get the recipe out of the plugin */
00221 
00222     if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00223         recipe = (cpl_recipe *)plugin;
00224     else
00225         return(-1);
00226 
00227     /* Create the parameters list in the cpl_recipe object */
00228 
00229     recipe->parameters = cpl_parameterlist_new();
00230 
00231     /* Fill in the rejection threshold parameter */
00232 
00233     p = cpl_parameter_new_value("vircam.vircam_dark_current.thresh",
00234                                 CPL_TYPE_DOUBLE,
00235                                 "Rejection threshold in sigma above background",                                "vircam.vircam_dark_current",5.0);
00236     cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"thresh");
00237     cpl_parameterlist_append(recipe->parameters,p);
00238 
00239     /* Extension number of input frames to use */
00240 
00241     p = cpl_parameter_new_range("vircam.vircam_dark_current.extenum",
00242                                 CPL_TYPE_INT,
00243                                 "Extension number to be done, 0 == all",
00244                                 "vircam.vircam_dark_current",
00245                                 1,0,16);
00246     cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"ext");
00247     cpl_parameterlist_append(recipe->parameters,p);
00248 
00249     /* Get out of here */
00250 
00251     return(0);
00252 }
00253 
00254 
00255 /*---------------------------------------------------------------------------*/
00261 /*---------------------------------------------------------------------------*/
00262 
00263 static int vircam_dark_current_destroy(cpl_plugin *plugin) {
00264     cpl_recipe *recipe ;
00265 
00266     /* Get the recipe out of the plugin */
00267 
00268     if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00269         recipe = (cpl_recipe *)plugin;
00270     else
00271         return(-1);
00272 
00273     cpl_parameterlist_delete(recipe->parameters);
00274     return(0);
00275 }
00276 
00277 
00278 /*---------------------------------------------------------------------------*/
00284 /*---------------------------------------------------------------------------*/
00285 
00286 static int vircam_dark_current_exec(cpl_plugin *plugin) {
00287     cpl_recipe  *recipe;
00288 
00289     /* Get the recipe out of the plugin */
00290 
00291     if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00292         recipe = (cpl_recipe *)plugin;
00293     else
00294         return(-1);
00295 
00296     return(vircam_dark_current(recipe->parameters,recipe->frames));
00297 }
00298 
00299 /*---------------------------------------------------------------------------*/
00306 /*---------------------------------------------------------------------------*/
00307 
00308 static int vircam_dark_current(cpl_parameterlist *parlist, 
00309                                cpl_frameset *framelist) {
00310     int jst,jfn,nlab,i,j,nx,ny,n,retval,live;
00311     long npts;
00312     double intercept,slope,sig;
00313     const char *fctid = "vircam_dark_current";
00314     float *outdata,val;
00315     unsigned char *bpm;
00316     vir_fits *ff;
00317     cpl_frame *cur_frame;
00318     cpl_propertylist *plist;
00319     cpl_parameter *p;
00320     
00321     /* Check validity of input frameset */
00322 
00323     if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
00324         cpl_msg_error(fctid,"Input framelist NULL or has no input data\n");
00325         return(-1);
00326     }
00327 
00328     /* Initialise some variables */
00329 
00330     vircam_dark_current_init();
00331 
00332     /* Get the parameters */
00333 
00334     p = cpl_parameterlist_find(parlist,"vircam.vircam_dark_current.thresh");
00335     vircam_dark_current_config.thresh = (float)cpl_parameter_get_double(p);
00336     p = cpl_parameterlist_find(parlist,"vircam.vircam_dark_current.extenum");
00337     vircam_dark_current_config.extenum = cpl_parameter_get_int(p);
00338 
00339     /* Sort out raw from calib frames */
00340 
00341     if (vircam_dfs_set_groups(framelist) != VIR_OK) {
00342         cpl_msg_error(fctid,"Cannot identify RAW and CALIB frames");
00343         return(-1);
00344     }
00345 
00346     /* Get dark frames. Make sure there are at least 2 of them */
00347 
00348     if ((ps.labels = cpl_frameset_labelise(framelist,vircam_compare_tags,
00349                                            &nlab)) == NULL) {
00350         cpl_msg_error(fctid,"Cannot labelise the input frameset");
00351         vircam_dark_current_tidy();
00352         return(-1);
00353     }
00354     if ((ps.darklist = vircam_frameset_subgroup(framelist,ps.labels,nlab,
00355                                                 VIRCAM_DARKCUR_RAW)) == NULL) {
00356         cpl_msg_error(fctid,"Cannot find dark frames in input frameset");
00357         vircam_dark_current_tidy();
00358         return(-1);
00359     }
00360     ps.nframes = cpl_frameset_get_size(ps.darklist);
00361     if (ps.nframes < 2) {
00362         cpl_msg_error(fctid,"Dark frameset doesn't have enough frames");
00363         vircam_dark_current_tidy();
00364         return(-1);
00365     }
00366 
00367     /* Check to see if there is a master bad pixel map. If there isn't one 
00368        then look for a confidence map */
00369 
00370     ps.master_mask = vircam_mask_define(framelist,ps.labels,nlab);
00371 
00372     /* Get some workspace for the data arrays */
00373 
00374     ps.data = cpl_malloc(ps.nframes*sizeof(float *));
00375     ps.subset = cpl_malloc(ps.nframes*sizeof(double));
00376     ps.exps = cpl_malloc(ps.nframes*sizeof(double));
00377 
00378     /* Fill in the exposure times */
00379 
00380     for (i = 0; i < ps.nframes; i++) {
00381         cur_frame = cpl_frameset_get_frame(ps.darklist,i);
00382         plist = cpl_propertylist_load(cpl_frame_get_filename(cur_frame),0);
00383         if (vircam_pfits_get_exptime(plist,&val) != VIR_OK) {
00384             cpl_msg_error(fctid,"Unable to get exposure time for %s",
00385                           cpl_frame_get_filename(cur_frame));
00386             return(-1);
00387         }
00388         ps.exps[i] = (double)val;
00389         cpl_propertylist_delete(plist);
00390     }
00391 
00392     /* Now, how many image extensions do we want to do? If the extension
00393        number is zero, then we loop for all possible extensions. If it
00394        isn't then we just do the extension specified */
00395 
00396     vircam_exten_range(vircam_dark_current_config.extenum,
00397                        (const cpl_frame *)cpl_frameset_get_frame(ps.darklist,0),
00398                        &jst,&jfn);
00399     if (jst == -1 || jfn == -1) {
00400         cpl_msg_error(fctid,"Unable to continue");
00401         vircam_dark_current_tidy();
00402         return(-1);
00403     }
00404 
00405     /* Get some space for the good frames */
00406 
00407     ps.good = cpl_malloc(ps.nframes*sizeof(vir_fits *));
00408 
00409     /* Now loop for all the extensions... */
00410 
00411     for (j = jst; j <= jfn; j++) {
00412         isfirst = (j == jst);
00413         dummy = 0;
00414         vircam_dark_current_config.mean_dark_current = 0.0;
00415 
00416         /* Load the image data from each frame. If there was an
00417            error loading, then just create a dummy output */
00418 
00419         ps.allfits = vircam_fits_load_list(ps.darklist,CPL_TYPE_FLOAT,j);
00420         if (ps.allfits == NULL) {
00421             cpl_msg_info(fctid,"Extension %d darks wouldn't load",j);
00422             dummy = 1;
00423             retval = vircam_dark_current_lastbit(j,framelist,parlist);
00424             if (retval != 0)
00425                 return(-1);
00426             continue;
00427         }
00428 
00429         /* Are any of these images good? */
00430 
00431         ps.ngood = 0;
00432         for (i = 0; i < ps.nframes; i++) {
00433             ff = ps.allfits[i];
00434             vircam_pfits_get_detlive(vircam_fits_get_ehu(ff),&live);
00435             if (! live) {
00436                 cpl_msg_info(fctid,"Detector flagged dead %s",
00437                              vircam_fits_get_fullname(ff));
00438                 vircam_fits_set_error(ff,VIR_FATAL);
00439             } else {
00440                 ps.good[ps.ngood] = ff;
00441                 ps.ngood += 1;
00442             }
00443         }       
00444 
00445         /* If there are too few good images, then signal that we need to 
00446            create some dummy products and move on */
00447 
00448         if (ps.ngood < 2) {
00449             cpl_msg_warning(fctid,"Need at least 2 good images -- %d found",
00450                           ps.ngood);
00451             dummy = 1;
00452             retval = vircam_dark_current_lastbit(j,framelist,parlist);
00453             freefitslist(ps.allfits,ps.nframes);
00454             freeimage(ps.outimage);
00455             if (retval != 0) 
00456                 return(-1);
00457             continue;
00458         }
00459 
00460         /* Get the data arrays */
00461 
00462         for (i = 0; i < ps.ngood; i++)
00463             ps.data[i] = cpl_image_get_data(vircam_fits_get_image(ps.allfits[i]));
00464 
00465         /* Load the BPM */
00466 
00467         nx = cpl_image_get_size_x(vircam_fits_get_image(ps.good[0]));
00468         ny = cpl_image_get_size_y(vircam_fits_get_image(ps.good[0]));
00469         retval = vircam_mask_load(ps.master_mask,j,nx,ny);      
00470         if (retval == VIR_FATAL) {
00471             cpl_msg_info(fctid,"Unable to load mask image %s[%d]",
00472                          vircam_mask_get_filename(ps.master_mask),j);
00473             cpl_msg_info(fctid,"Forcing all pixels to be good from now on");
00474             vircam_mask_force(ps.master_mask,nx,ny);
00475         }
00476         bpm = vircam_mask_get_data(ps.master_mask);
00477 
00478         /* Get an output image */
00479 
00480         ps.outimage = cpl_image_new(nx,ny,CPL_TYPE_FLOAT);
00481         outdata = cpl_image_get_data(ps.outimage);
00482 
00483         /* Now loop over all pixels and work out the slope */
00484 
00485         cpl_msg_info(fctid,"Doing dark current fits for extension %d",j);
00486         npts = (long)(nx*ny);
00487         for (n = 0; n < npts; n++) {
00488             if (bpm[n] != 0) {
00489                 slope = 0.0;
00490             } else {
00491                 for (i = 0; i < ps.ngood; i++)
00492                     ps.subset[i] = (double)(ps.data[i][n]);
00493                 vircam_linfit(ps.ngood,ps.exps,ps.subset,&intercept,&slope,
00494                     &sig);
00495             }
00496 
00497             /* Store the slope away */
00498 
00499             outdata[n] = (float)slope;
00500         }
00501 
00502         /* Get the median value of the dark current */
00503 
00504         vircam_dark_current_config.mean_dark_current = 
00505             vircam_med(outdata,bpm,npts);
00506 
00507         /* Save the last part of the processing and saving */
00508 
00509         (void)vircam_dark_current_lastbit(j,framelist,parlist);
00510 
00511         /* Tidy up */
00512 
00513         freeimage(ps.outimage);
00514         vircam_mask_clear(ps.master_mask);
00515         freefitslist(ps.allfits,ps.nframes);
00516     }
00517 
00518     /* Tidy up */
00519 
00520     vircam_dark_current_tidy();
00521 
00522     return(0);
00523 }
00524 
00525 /*---------------------------------------------------------------------------*/
00532 /*---------------------------------------------------------------------------*/
00533 
00534 static int vircam_dark_current_save(cpl_frameset *framelist, 
00535                                     cpl_parameterlist *parlist) {
00536     cpl_propertylist *plist,*p;
00537     const char *fctid = "vircam_dark_current_save";
00538     const char *outfile = "darkcurrent.fits";
00539     const char *outpaf = "darkcurrent";
00540     const char *recipeid = "vircam_dark_current";
00541     float darkcur_med;
00542 
00543     /* If we need to make a PHU then do that now based on the first frame
00544        in the input frame list */
00545 
00546     darkcur_med = vircam_dark_current_config.mean_dark_current;
00547     if (isfirst) {
00548 
00549         /* Create a new product frame object and define some tags */
00550 
00551         product_frame = cpl_frame_new();
00552         cpl_frame_set_filename(product_frame,outfile);
00553         cpl_frame_set_tag(product_frame,VIRCAM_PRO_DARKCUR);
00554         cpl_frame_set_type(product_frame,CPL_FRAME_TYPE_IMAGE);
00555         cpl_frame_set_group(product_frame,CPL_FRAME_GROUP_PRODUCT);
00556         cpl_frame_set_level(product_frame,CPL_FRAME_LEVEL_FINAL);
00557 
00558         /* Set the PHU header */
00559 
00560         plist = vircam_fits_get_phu(ps.allfits[0]);
00561         vircam_dfs_set_product_primary_header(plist,product_frame,framelist,
00562                                               parlist,(char *)recipeid,
00563                                               "PRO-1.15");
00564         ps.phupaf = vircam_paf_phu_items(plist);
00565 
00566         /* 'Save' the PHU image */
00567 
00568         if (cpl_image_save(NULL,outfile,CPL_BPP_8_UNSIGNED,plist,
00569                            CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
00570             cpl_msg_error(fctid,"Cannot save product PHU");
00571             cpl_propertylist_delete(plist);
00572             return(-1);
00573         }
00574         cpl_frameset_insert(framelist,product_frame);
00575     }
00576 
00577     /* Get the header for the extension */
00578 
00579     plist = vircam_fits_get_ehu(ps.allfits[0]);
00580     vircam_dfs_set_product_exten_header(plist,product_frame,framelist,
00581                                         parlist,(char *)recipeid,
00582                                         "PRO-1.15");
00583 
00584     /* Add the mean dark current to the header as a QC parameter */
00585 
00586     cpl_propertylist_update_float(plist,"ESO QC DARKCURRENT",darkcur_med);
00587     cpl_propertylist_set_comment(plist,"ESO QC DARKCURRENT",
00588                                  "[ADU/s] Median dark current");
00589     if (dummy)
00590         vircam_dummy_property(plist);
00591 
00592     /* Now save the image */
00593 
00594     if (cpl_image_save(ps.outimage,outfile,CPL_BPP_IEEE_FLOAT,plist,
00595                        CPL_IO_EXTEND) != CPL_ERROR_NONE) {
00596         cpl_msg_error(fctid,"Cannot save product image extension");
00597         cpl_propertylist_delete(plist);
00598         return(-1);
00599     }
00600 
00601     /* Write a PAF now */
00602 
00603     p = vircam_paf_req_items(plist);
00604     vircam_merge_propertylists(p,ps.phupaf);
00605     if (vircam_paf_print((char *)outpaf,"VIRCAM/vircam_dark_current","QC file",
00606                          p) != VIR_OK)
00607         cpl_msg_warning(fctid,"Unable to write PAF\n");
00608     cpl_propertylist_delete(p);
00609 
00610     /* Get out of here */
00611 
00612     return(0);
00613 }
00614 
00615 /*---------------------------------------------------------------------------*/
00623 /*---------------------------------------------------------------------------*/
00624 
00625 static int vircam_dark_current_lastbit(int jext, cpl_frameset *framelist,
00626                                        cpl_parameterlist *parlist) {
00627     int retval;
00628     const char *fctid="vircam_dark_current_lastbit";
00629 
00630     /* If this is a dummy result then create it now */
00631 
00632     if (dummy)
00633         ps.outimage = vircam_dummy_image(ps.allfits[0]);
00634                        
00635     /* Save the result */
00636 
00637     cpl_msg_info(fctid,"Saving products for extension %d",jext);
00638     retval = vircam_dark_current_save(framelist,parlist);
00639     if (retval != 0) {
00640         vircam_dark_current_tidy();
00641         return(-1);
00642     }
00643     return(0);
00644 }
00645 
00646 
00647 /*---------------------------------------------------------------------------*/
00651 /*---------------------------------------------------------------------------*/
00652 
00653 static void vircam_dark_current_init(void) {
00654     ps.labels = NULL;
00655     ps.darklist = NULL;
00656     ps.master_mask = NULL;
00657     ps.data = NULL;
00658     ps.allfits = NULL;
00659     ps.subset = NULL;
00660     ps.exps = NULL;
00661     ps.outimage = NULL;
00662     ps.nframes = 0;
00663     ps.good = NULL;
00664     ps.phupaf = NULL;
00665 }
00666 
00667 /*---------------------------------------------------------------------------*/
00671 /*---------------------------------------------------------------------------*/
00672 
00673 static void vircam_dark_current_tidy(void) {
00674 
00675     freespace(ps.labels);
00676     freeframeset(ps.darklist);
00677     freemask(ps.master_mask);
00678     freespace(ps.data);
00679     freespace(ps.subset);
00680     freespace(ps.exps);
00681     freeimage(ps.outimage);
00682     freefitslist(ps.allfits,ps.nframes);
00683     ps.nframes = 0;
00684     freespace(ps.good);
00685     freepropertylist(ps.phupaf);
00686 }
00687 
00690 /*
00691 
00692 $Log: vircam_dark_current.c,v $
00693 Revision 1.46  2007/11/20 09:40:27  jim
00694 changed values for linear fit to doubles
00695 
00696 Revision 1.45  2007/11/14 14:47:53  jim
00697 vircam_linfit now works only with doubles
00698 
00699 Revision 1.44  2007/10/25 18:39:22  jim
00700 Altered to remove some lint messages
00701 
00702 Revision 1.43  2007/10/15 12:53:26  jim
00703 Modified for compatibiliity with cpl_4.0
00704 
00705 Revision 1.42  2007/09/06 21:37:53  jim
00706 fixed call to vircam_dfs_setup_product_ routines to use the full input
00707 frameset
00708 
00709 Revision 1.41  2007/08/23 09:01:34  jim
00710 Error when there aren't enough frames is now just a warning
00711 
00712 Revision 1.40  2007/07/18 15:35:41  jim
00713 Added better error handling for missing or corrupt mask extensions
00714 
00715 Revision 1.39  2007/07/09 13:21:55  jim
00716 Modified to use new version of vircam_exten_range
00717 
00718 Revision 1.38  2007/06/13 08:11:27  jim
00719 Modified docs to reflect changes in DFS tags
00720 
00721 Revision 1.37  2007/04/04 10:36:18  jim
00722 Modified to use new dfs tags
00723 
00724 Revision 1.36  2007/03/29 12:19:38  jim
00725 Little changes to improve documentation
00726 
00727 Revision 1.35  2007/03/01 12:41:48  jim
00728 Modified slightly after code checking
00729 
00730 Revision 1.34  2007/02/25 06:26:35  jim
00731 Plugged a few memory leaks
00732 
00733 Revision 1.33  2007/02/15 06:59:37  jim
00734 Added ability to write QC paf files
00735 
00736 Revision 1.32  2007/02/07 10:12:39  jim
00737 Removed calls to vircam_ndit_correct as this is now no longer necessary
00738 
00739 Revision 1.31  2007/02/06 13:11:11  jim
00740 Fixed entry for PRO dictionary in cpl_dfs_set_product_header
00741 
00742 Revision 1.30  2006/11/27 12:13:21  jim
00743 Swapped calls to cpl_propertylist_append to cpl_propertylist_update
00744 
00745 Revision 1.29  2006/11/10 09:19:47  jim
00746 fixed typo
00747 
00748 Revision 1.28  2006/09/29 11:19:30  jim
00749 changed aliases on parameter names
00750 
00751 Revision 1.27  2006/09/09 16:49:39  jim
00752 Header comment update
00753 
00754 Revision 1.26  2006/09/04 23:02:14  jim
00755 Modified to deal with det live issues. Also does a better job of dealing
00756 with duff input
00757 
00758 Revision 1.25  2006/06/20 19:07:00  jim
00759 Corrects for ndit != 1
00760 
00761 Revision 1.24  2006/06/15 09:58:57  jim
00762 Minor changes to docs
00763 
00764 Revision 1.23  2006/06/09 11:32:59  jim
00765 A few more minor fixes for lint
00766 
00767 Revision 1.22  2006/06/09 11:26:25  jim
00768 Small changes to keep lint happy
00769 
00770 Revision 1.21  2006/05/17 11:15:38  jim
00771 plugged memory leak
00772 
00773 Revision 1.20  2006/05/04 11:53:14  jim
00774 Fixed the way the _save routine works to be more consistent with the
00775 standard CPL way of doing things
00776 
00777 Revision 1.19  2006/04/27 09:46:01  jim
00778 Modified DFS frame types to conform to new dictionary
00779 
00780 Revision 1.18  2006/04/25 13:45:56  jim
00781 Fixed to adhere to new calling sequence for vircam_dfs routines
00782 
00783 Revision 1.17  2006/03/23 21:18:45  jim
00784 Minor changes mainly to comment headers
00785 
00786 Revision 1.16  2006/03/22 12:13:51  jim
00787 Modified to use new vircam_mask capability
00788 
00789 Revision 1.15  2006/03/15 10:43:40  jim
00790 Fixed a few things
00791 
00792 Revision 1.14  2006/03/03 14:29:06  jim
00793 Now calls routines with vir_fits.
00794 
00795 Revision 1.13  2006/02/18 11:50:43  jim
00796 Modified the way the dfs product keywords are written using the vircam
00797 routines, rather than the cpl routine that doesn't understand image
00798 extensions
00799 
00800 Revision 1.12  2006/01/23 10:35:55  jim
00801 Now allows either an BPM or CPM to be used as a mask
00802 
00803 Revision 1.11  2005/12/14 22:19:12  jim
00804 fixed docs
00805 
00806 Revision 1.10  2005/12/09 09:47:58  jim
00807 Many changes to add more documentation
00808 
00809 Revision 1.9  2005/12/02 10:45:37  jim
00810 The tags used in the sof are now written to the description string in the
00811 constructor. This is so that if they change in the vircam_dfs.h file, they
00812 aren't then hardcopied into each of the recipes...
00813 
00814 Revision 1.8  2005/12/01 16:25:06  jim
00815 Fixed default output file extension
00816 
00817 Revision 1.7  2005/11/25 09:37:10  jim
00818 Fitting now done by vircam_linfit
00819 
00820 Revision 1.6  2005/11/23 14:57:40  jim
00821 A bit of tidying in response to splint messages
00822 
00823 Revision 1.5  2005/11/08 12:47:44  jim
00824 Made garbage collection a little better
00825 
00826 Revision 1.4  2005/11/03 15:16:28  jim
00827 Lots of changes mainly to strengthen error reporting
00828 
00829 Revision 1.3  2005/08/09 11:09:39  jim
00830 Replaced dodgy call to cpl_framelist_delete with correct cpl_frameset_delete
00831 
00832 Revision 1.2  2005/08/09 10:24:38  jim
00833 Replaced dodgy calls to cpl_msg_err with correct cpl_msg_error
00834 
00835 Revision 1.1.1.1  2005/08/05 08:29:09  jim
00836 Initial import
00837 
00838 
00839 */

Generated on Wed Apr 10 04:01:55 2013 for VIRCAM Pipeline by  doxygen 1.5.1