si_rec_objnod.c

00001 /* $Id: si_rec_objnod.c,v 1.45 2005/10/08 10:34:50 amodigli Exp $
00002  *
00003  * This file is part of the CPL (Common Pipeline Library)
00004  * Copyright (C) 2002 European Southern Observatory
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Lesser General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2.1 of the License, or (at your option) any later version.
00010  *
00011  * This library 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 GNU
00014  * Lesser General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public
00017  * License along with this library; if not, write to the Free Software
00018  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  */
00020 /*
00021  * $Author: amodigli $
00022  * $Date: 2005/10/08 10:34:50 $
00023  * $Revision: 1.45 $
00024  * $Name:  $
00025  */
00026 
00027  /****************************************************************
00028   *           Object Data reduction                              *
00029   ****************************************************************/
00030 
00031 #ifdef HAVE_CONFIG_H
00032 #include <config.h>          /* allows the program compilation */
00033 #endif
00034 
00035 /*-----------------------------------------------------------------------------
00036                                 Includes
00037  -----------------------------------------------------------------------------*/
00038 
00039 /* std */
00040 #include <strings.h>
00041 #include <string.h>
00042 #include <stdio.h>
00043 #include <math.h>
00044 #include <libgen.h>
00045 
00046 /* cx */
00047 #include <cxmacros.h>
00048 #include <cxtypes.h>
00049 #include <cxmessages.h>  
00050 #include <cpl_memory.h>    
00051 
00052 /* cpl */
00053 #include <cpl.h>  
00054 
00055 /* qfits */
00056 #include <xmemory.h>
00057 
00058 /* sinfoni */
00059 #include <sinfoni_pro_types.h>
00060 #include <sinfoni_prepare_stacked_frames_config.h>
00061 #include <sinfoni_objnod_config.h>
00062 #include <objnod.h>
00063 #include <objnod_rel.h>
00064 #include <prepare_stacked_frames.h>
00065 #include <sinfoni_key_names.h>
00066 #include <sinfoni_raw_types.h>
00067 #include <sinfoni_functions.h>
00068 #include <sinfoni_tpl_utils.h>
00069 #include <sinfoni_tpl_dfs.h>
00070 #include <sinfoni_hidden.h>
00071 #include <sinfoni_globals.h>
00072 #include "si_rec_utils.h"
00073 #include <sinfoni_memory.h>
00074 
00075 
00076 
00077 
00078 
00079 #define EPSILON      1.e-6
00080 /*-----------------------------------------------------------------------------
00081                             Functions prototypes
00082  -----------------------------------------------------------------------------*/
00083 
00084 static cxint si_rec_objnod(cpl_parameterlist *, cpl_frameset *);
00085 
00086 /*-----------------------------------------------------------------------------
00087                             Static variables
00088  -----------------------------------------------------------------------------*/
00089 
00090 static char si_rec_objnod_description1[] =
00091 "This recipe performs science data reduction.\n"
00092 "The input files are science object and sky frames with tags OBJECT_NODDING and SKY_NODDING\n"
00093 "Master calibration frames:\n";
00094 
00095 
00096 static char si_rec_objnod_description2[] =
00097 "A corresponding (band,preoptics) wavelength map image with tag WAVE_MAP\n"
00098 "A corresponding (band,preoptics) master flat field with tag MASTER_FLAT_LAMP\n"
00099 "A corresponding (band,preoptics) master bad pixel map with tag MASTER_BP_MAP\n"
00100 "A corresponding (band,preoptics) slitlets position frame with tag SLIT_POS\n"
00101 "A corresponding (band) distortion table with tag DISTORTION\n"
00102 "A corresponding (band) slitlet distance table with tag SLITLETS_DISTANCE\n";
00103 
00104 
00105 static char si_rec_objnod_description3[] =
00106 "The output is an image resulting from the IMA1 op IMA2 where op indicates\n"
00107 "A reference table with the position of the first  column with tag FIRST_COLUMN\n"
00108 "Relevant outputs are:\n"
00109 "combined cubes (PRO.CATG=x_OBS x=STD,OBJ,PSF)\n"
00110 "reconstructed cube (PRO.CATG=COADD_x_OBS x=STD,OBJ,PSF)\n"
00111 "An average along Z of the reconstructed cube (PRO.CATG=MED_x_OBS x=STD,OBJ,PSF)\n"
00112 "The bad pixel map associated to the cube (PRO.CATG=BP_MAP_COADD_x_OBS x=STD,OBJ,PSF)\n";
00113 
00114 
00115 static char si_rec_objnod_description4[] =
00116 "Information on relevant parameters can be found with\n"
00117 "esorex --params si_rec_objnod\n"
00118 "esorex --help si_rec_objnod\n"
00119 "\n";
00120 
00121 static char si_rec_objnod_description[1300];
00122 
00123 /*-----------------------------------------------------------------------------
00124                                 Functions code
00125  -----------------------------------------------------------------------------*/
00126 
00127 
00128 cxint
00129 si_rec_objnod_create(cpl_plugin *plugin)
00130 {
00131 
00132   /*
00133    * We have to provide the option we accept to the application.
00134    * We need to setup our parameter list and hook it into the recipe
00135    * interface.
00136    */
00137   cpl_recipe *recipe = (cpl_recipe *)plugin;
00138   recipe->parameters = cpl_parameterlist_new();
00139   if(recipe->parameters == NULL) {
00140     return 1;
00141   }
00142 
00143   /*
00144    * Fill the parameter list.
00145    */
00146 
00147   sinfoni_prepare_stacked_frames_config_add(recipe->parameters);
00148   sinfoni_objnod_config_add(recipe->parameters); 
00149  
00150   return 0;
00151 
00152 }
00153 
00154 cxint
00155 si_rec_objnod_exec(cpl_plugin *plugin)
00156 {
00157  
00158   cpl_recipe *recipe = (cpl_recipe *) plugin;
00159   if(recipe->parameters == NULL) {
00160     return 1;
00161   }
00162   if(recipe->frames == NULL) {
00163     return 1;
00164   }
00165   cpl_error_reset();
00166   return si_rec_objnod(recipe->parameters, recipe->frames);
00167 
00168 }
00169 
00170 cxint
00171 si_rec_objnod_destroy(cpl_plugin *plugin)
00172 {
00173   cpl_recipe *recipe = (cpl_recipe *) plugin;
00174   /*
00175    * We just destroy what was created during the plugin initializzation phase
00176    * i.e. the parameter list. The frame set is managed by the application which
00177    * called us, so that we must not touch it.
00178    */
00179 
00180   cpl_parameterlist_delete(recipe->parameters);
00181 
00182   return 0;
00183 
00184 }
00185 
00186 
00187 int
00188 cpl_plugin_get_info(cpl_pluginlist *list)
00189 {
00190 
00191   cpl_recipe *recipe = cpl_calloc(1, sizeof *recipe);
00192   cpl_plugin *plugin = &recipe->interface;
00193 
00194   strcpy(si_rec_objnod_description,si_rec_objnod_description1);
00195   strcat(si_rec_objnod_description,si_rec_objnod_description2);
00196   strcat(si_rec_objnod_description,si_rec_objnod_description3);
00197   strcat(si_rec_objnod_description,si_rec_objnod_description4);
00198 
00199   cpl_plugin_init(plugin,
00200           CPL_PLUGIN_API,
00201           SINFONI_BINARY_VERSION,
00202           CPL_PLUGIN_TYPE_RECIPE,
00203           "si_rec_objnod",
00204           "Object data reduction",
00205            si_rec_objnod_description,
00206           "Andrea Modigliani",
00207           "Andrea.Mdigliani@eso.org",
00208           sinfoni_get_license(),
00209           si_rec_objnod_create,
00210           si_rec_objnod_exec,
00211           si_rec_objnod_destroy);
00212 
00213   cpl_pluginlist_append(list, plugin);
00214 
00215   return 0;
00216 
00217 }
00218 
00219 /*
00220  * The actual recipe actually start here.
00221  */
00222 
00223 static cxint
00224 si_rec_objnod(cpl_parameterlist *config, cpl_frameset *set)
00225 {
00226   const char *_id = "si_rec_objnod";
00227   char filename[FILE_NAME_SZ];
00228   char outname[FILE_NAME_SZ];
00229 
00230   int i=0;
00231   int j=0;
00232   int k=0;
00233 
00234   int ind=0;
00235   int nsky=0;
00236   int nobj=0;
00237   int ncdb=0;
00238   int nstk=0;
00239   int ntot=0;
00240 
00241   int aj_meth=0;
00242 
00243   double mjd_obj=0;
00244   double mjd_sky=0;
00245   double mjd_sky_frm=0;
00246 
00247   cpl_frameset  * obj_set=NULL;
00248   cpl_frameset  * sky_set=NULL;
00249   cpl_frameset  * cdb_set=NULL;
00250   cpl_frameset  * wrk_set=NULL;
00251   cpl_frameset  * stk_set=NULL;
00252   cpl_frameset  * tot_set=NULL;
00253   cpl_frame     * sky_frm=NULL;
00254 
00255   cpl_frame     * dup_frm=NULL; 
00256   cpl_frame     * obj_frm=NULL; 
00257   cpl_frame     * cdb_frm=NULL;
00258   cpl_frame     * wrk_frm=NULL;
00259   cpl_frameset* ref_set=NULL;
00260 
00261 
00262   cpl_parameter * p=NULL;       
00263   fake* fk=fake_new();
00264 
00265 
00266   /* cpl_parameterlist_dump(config); */
00267 
00268    if(sinfoni_dfs_set_groups(set)) {
00269        cpl_msg_error(_id, "Cannot indentify RAW and CALIB frames") ;
00270        return -1;
00271     }
00272    ref_set=cpl_frameset_duplicate(set);
00273      /* =============================================================== 
00274         Defines several framesets each with a pair obj-sky 
00275         =============================================================== */
00276   obj_set=cpl_frameset_new();
00277   sky_set=cpl_frameset_new();
00278   cdb_set=cpl_frameset_new();
00279 
00280   sinfoni_extract_obj_frames(set,obj_set);
00281   sinfoni_extract_sky_frames(set,sky_set);
00282   sinfoni_extract_mst_frames(set,cdb_set);
00283 
00284   /*extract_ao_info(obj_set,&set,_id,config);*/
00285 
00286 
00287   nobj=cpl_frameset_get_size(obj_set);
00288   nsky=cpl_frameset_get_size(sky_set);
00289   ncdb=cpl_frameset_get_size(cdb_set);
00290 
00291   if ((nobj==0) && (nsky==0)) {
00292     cpl_msg_error(_id,"Empty input set");
00293     cpl_frameset_delete(obj_set);
00294     cpl_frameset_delete(sky_set);
00295     cpl_frameset_delete(cdb_set);
00296     cpl_frameset_delete(ref_set);
00297     fake_delete(fk);
00298     return -1;
00299   }
00300 
00301 
00302 
00303   if ( (nobj != 0) && (nsky != 0) ) {
00304     /* We have either OBJ and SKY: we need to create OBJ-SKY pairs */
00305     cpl_msg_info (_id,"------------------------------") ; 
00306     cpl_msg_info(_id,"generates OBJ-SKY pairs");
00307     cpl_msg_info (_id,"------------------------------") ; 
00308     tot_set=cpl_frameset_new();
00309     p = cpl_parameterlist_find(config,"sinfoni.objnod.autojitter_method");
00310     cpl_parameter_set_int(p,0);
00311 
00312 
00313 
00314     for (i=0;i<nobj;i++) {
00315 
00316        wrk_set=cpl_frameset_new();
00317        obj_frm=cpl_frameset_get_frame(obj_set,i);
00318        mjd_obj=sinfoni_get_mjd_obs(obj_frm);
00319        sky_frm=cpl_frameset_get_frame(sky_set,0);
00320        mjd_sky=sinfoni_get_mjd_obs(sky_frm);
00321        strcpy(filename,cpl_frame_get_filename(obj_frm));
00322 
00323 
00324        for (j=1;j<nsky;j++) {
00325           mjd_sky_frm = sinfoni_get_mjd_obs(cpl_frameset_get_frame(sky_set,j));
00326           if(1000.*(mjd_sky_frm-mjd_obj)*(mjd_sky_frm-mjd_obj) <
00327              1000.*(mjd_sky-    mjd_obj)*(mjd_sky-    mjd_obj) ) {
00328          mjd_sky=mjd_sky_frm;
00329              sky_frm=cpl_frameset_get_frame(sky_set,j);
00330       }
00331        }
00332        strcpy(filename,cpl_frame_get_filename(sky_frm));
00333 
00334 
00335 
00336        /* monitors whih obj-sky frames are inserted in each wrk_set */
00337        dup_frm=cpl_frame_duplicate(obj_frm);
00338        cpl_frameset_insert(wrk_set,dup_frm);
00339        dup_frm=cpl_frame_duplicate(sky_frm);
00340        cpl_frameset_insert(wrk_set,dup_frm);
00341 
00342        /* merged CDB frames to work set */
00343           for(k=0;k<ncdb;k++) {
00344             cdb_frm=cpl_frameset_get_frame(cdb_set,k);
00345             dup_frm=cpl_frame_duplicate(cdb_frm);
00346         cpl_frameset_insert(wrk_set,dup_frm);
00347       }
00348 
00349 
00350        /* defines a new name for the output stacked frame */ 
00351        sprintf(outname,"%s%d%s","out_stack",i,".fits");
00352        if(-1 == stack_frames(config,wrk_set,
00353                  PRO_OBJECT_NODDING_STACKED,i,fk,_id)) {
00354 
00355          cpl_frameset_delete(wrk_set);
00356          cpl_frameset_delete(tot_set);
00357          cpl_frameset_delete(obj_set);
00358          cpl_frameset_delete(sky_set);
00359          cpl_frameset_delete(cdb_set);
00360          cpl_frameset_delete(ref_set);
00361          fake_delete(fk);
00362          sinfoni_memory_status();
00363      return -1;
00364 
00365        }
00366 
00367        stk_set=cpl_frameset_new();
00368        sinfoni_contains_frames_kind(wrk_set,stk_set,PRO_STACKED);
00369        nstk=cpl_frameset_get_size(stk_set);
00370 
00371        for(k=0;k<nstk;k++) {
00372          wrk_frm=cpl_frameset_get_frame(stk_set,k);
00373          dup_frm = cpl_frame_duplicate(wrk_frm);
00374      cpl_frameset_insert(tot_set,dup_frm);
00375        }
00376        cpl_frameset_delete(stk_set);
00377        cpl_frameset_delete(wrk_set);
00378 
00379 
00380 
00381 
00382     }
00383 
00384     
00385     ntot=cpl_frameset_get_size(tot_set);
00386     for(k=0;k<ntot;k++) {
00387       wrk_frm=cpl_frameset_get_frame(tot_set,k);
00388       dup_frm = cpl_frame_duplicate(wrk_frm);
00389       cpl_frameset_insert(set,dup_frm);
00390     }
00391     cpl_frameset_delete(tot_set);
00392   }
00393 
00394   if ( (nobj == 0) && (nsky != 0) ) {
00395 
00396      /* =============================================================== 
00397         SKY FRAMES STACKING 
00398         =============================================================== */
00399 
00400     {
00401     cpl_msg_info (_id,"------------------------------") ; 
00402     cpl_msg_info (_id,"SKY ONLY FRAMES DATA REDUCTION NOT SUPPORTED") ; 
00403     cpl_msg_info (_id,"------------------------------") ; 
00404         cpl_frameset_delete(obj_set);
00405         cpl_frameset_delete(sky_set);
00406         cpl_frameset_delete(cdb_set);
00407         cpl_frameset_delete(ref_set);
00408         fake_delete(fk);
00409         return 0;
00410     }    
00411 
00412 
00413   }
00414 
00415 
00416   if ( (nobj != 0) && (nsky == 0) ) {
00417 
00418      /* =============================================================== 
00419         OBJ FRAMES STACKING 
00420         =============================================================== */
00421       p = cpl_parameterlist_find(config,"sinfoni.objnod.autojitter_method");
00422       aj_meth =  cpl_parameter_get_int(p);
00423     if(aj_meth == 2) {
00424 
00425       cpl_msg_info(_id,"Dummy sky case"); 
00426       cpl_msg_info(_id,"fake sky is coming from median of all objects"); 
00427       if( (sky_frm = get_dummy_sky(obj_set)) == NULL) {
00428 
00429     cpl_msg_error(_id,"Problem to get dummy frame");
00430     return -1;
00431 
00432       }
00433       cpl_msg_info (_id,"------------------------------") ;
00434       cpl_msg_info(_id,"generates OBJ-SKY pairs");
00435       cpl_msg_info (_id,"------------------------------") ; 
00436       tot_set=cpl_frameset_new();
00437 
00438       
00439       for (i=0;i<nobj;i++) {
00440 
00441     wrk_set=cpl_frameset_new();
00442     obj_frm=cpl_frameset_get_frame(obj_set,i);
00443         dup_frm=cpl_frame_duplicate(obj_frm);
00444     cpl_frameset_insert(wrk_set,dup_frm);
00445         dup_frm=cpl_frame_duplicate(sky_frm);
00446     cpl_frameset_insert(wrk_set,dup_frm);
00447     for(k=0;k<ncdb;k++) {
00448       cdb_frm=cpl_frameset_get_frame(cdb_set,k);
00449           dup_frm=cpl_frame_duplicate(cdb_frm);
00450       cpl_frameset_insert(wrk_set,dup_frm);
00451     }
00452  
00453     sprintf(outname,"%s%d%s","out_stack",i,".fits");
00454         if(-1 == stack_frames(config,wrk_set,
00455                   PRO_OBJECT_NODDING_STACKED,i,fk,_id)) {
00456 
00457           cpl_msg_error(_id,"cannot stack frames");
00458           cpl_frame_delete(sky_frm);
00459           cpl_frameset_delete(wrk_set);
00460           cpl_frameset_delete(tot_set);
00461 
00462 
00463           cpl_frameset_delete(obj_set);
00464           cpl_frameset_delete(sky_set);
00465           cpl_frameset_delete(cdb_set);
00466           cpl_frameset_delete(ref_set);
00467 
00468           fake_delete(fk);
00469           sinfoni_memory_status();
00470       return -1;
00471     }
00472 
00473     stk_set=cpl_frameset_new();
00474     sinfoni_contains_frames_kind(wrk_set,stk_set,PRO_STACKED);
00475     nstk=cpl_frameset_get_size(stk_set);
00476     for(k=0;k<nstk;k++) {
00477       wrk_frm=cpl_frameset_get_frame(stk_set,k);
00478           dup_frm=cpl_frame_duplicate(wrk_frm);
00479       cpl_frameset_insert(tot_set,dup_frm);
00480     }
00481         cpl_frameset_delete(stk_set);
00482         cpl_frameset_delete(wrk_set);
00483 
00484       }
00485       ntot=cpl_frameset_get_size(tot_set);
00486       for(k=0;k<ntot;k++) {
00487     wrk_frm=cpl_frameset_get_frame(tot_set,k);
00488         dup_frm=cpl_frame_duplicate(wrk_frm);
00489     cpl_frameset_insert(set,dup_frm);
00490       }
00491       cpl_frameset_delete(tot_set);
00492       cpl_frame_delete(sky_frm);
00493     } else if(aj_meth == 1 ) {
00494 
00495 
00496         cpl_msg_info(_id,"Dummy obj-sky case");  
00497         cpl_msg_info(_id,"fake sky is coming from each next object");  
00498 
00499     if(nobj > 1) {
00500       
00501        if( get_dummy_obj_sky_stacked(obj_set,&set,config,fk,PRO_OBJECT_NODDING_STACKED,_id) == -1 ) {
00502          cpl_msg_error(_id,"Found error to get obj-sky-stacked frame");
00503         cpl_frameset_delete(obj_set);
00504         cpl_frameset_delete(sky_set);
00505         cpl_frameset_delete(cdb_set);
00506         cpl_frameset_delete(ref_set);
00507         fake_delete(fk);
00508         sinfoni_memory_status();
00509          return -1;
00510        }
00511      
00512     } else {
00513       cpl_msg_info (_id,"Only one object frame, no sky");
00514           if(-1==stack_frames(config,set,
00515                  PRO_OBJECT_NODDING_STACKED,0,fk,_id)) {
00516         cpl_frameset_delete(obj_set);
00517         cpl_frameset_delete(sky_set);
00518         cpl_frameset_delete(cdb_set);
00519         cpl_frameset_delete(ref_set);
00520         fake_delete(fk);
00521         sinfoni_memory_status();
00522         return -1;
00523       }
00524     }
00525 
00526     } else {
00527 
00528       cpl_msg_info (_id,"------------------------------") ;
00529       cpl_msg_info (_id,"staks each OBJECT ");
00530       cpl_msg_info (_id,"------------------------------") ; 
00531       tot_set=cpl_frameset_new();
00532 
00533       for (i=0;i<nobj;i++) {
00534 
00535     wrk_set=cpl_frameset_new();
00536     obj_frm=cpl_frameset_get_frame(obj_set,i);
00537         dup_frm=cpl_frame_duplicate(obj_frm);
00538     cpl_frameset_insert(wrk_set,dup_frm);
00539     for(k=0;k<ncdb;k++) {
00540       cdb_frm=cpl_frameset_get_frame(cdb_set,k);
00541           dup_frm=cpl_frame_duplicate(cdb_frm);
00542       cpl_frameset_insert(wrk_set,dup_frm);
00543     }
00544 
00545  
00546     sprintf(outname,"%s%d%s","out_stack",i,".fits");
00547         if(-1==stack_frames(config,wrk_set,
00548                 PRO_OBJECT_NODDING_STACKED,i,fk,_id)) {
00549         cpl_frameset_delete(wrk_set);
00550         cpl_frameset_delete(obj_set);
00551         cpl_frameset_delete(sky_set);
00552         cpl_frameset_delete(cdb_set);
00553         cpl_frameset_delete(ref_set);
00554         cpl_frameset_delete(tot_set);
00555         fake_delete(fk);
00556         sinfoni_memory_status();
00557 
00558 
00559       return -1;
00560     }
00561 
00562     stk_set=cpl_frameset_new();
00563     sinfoni_contains_frames_kind(wrk_set,stk_set,PRO_STACKED);
00564     nstk=cpl_frameset_get_size(stk_set);
00565     for(k=0;k<nstk;k++) {
00566       wrk_frm=cpl_frameset_get_frame(stk_set,k);
00567       dup_frm=cpl_frame_duplicate(wrk_frm);
00568       cpl_frameset_insert(tot_set,dup_frm);
00569     }
00570         cpl_frameset_delete(stk_set);
00571         cpl_frameset_delete(wrk_set);
00572 
00573       }
00574 
00575       ntot=cpl_frameset_get_size(tot_set);
00576       for(k=0;k<ntot;k++) {
00577     wrk_frm=cpl_frameset_get_frame(tot_set,k);
00578     dup_frm=cpl_frame_duplicate(wrk_frm);
00579     cpl_frameset_insert(set,dup_frm);
00580       }
00581       cpl_frameset_delete(tot_set);
00582     }
00583   }
00584 
00585 
00586 
00587     /* =============================================================== 
00588         SCI OBJNOD 
00589         =============================================================== */
00590 
00591     {
00592         /* Launch the recipe */
00593     /* 
00594      * MAIN CALL TO spiffi_objnod recipe
00595      */
00596       
00597         cpl_msg_info (_id,"------------------------------") ; 
00598             cpl_msg_info(_id,"NODDING SCIENCE FRAMES");
00599         cpl_msg_info (_id,"------------------------------") ; 
00600 
00601 
00602         if ( -1 == (ind = objnod(_id,config, set, PRO_COADD_OBJ ) ) )
00603         {
00604             cpl_msg_error(_id,"NODDING SCIENCE FRAMES no. %d\n", ind) ;
00605                 cpl_frameset_delete(obj_set);
00606                 cpl_frameset_delete(sky_set);
00607                 cpl_frameset_delete(cdb_set);
00608                 cpl_frameset_delete(ref_set);
00609                 fake_delete(fk);
00610 
00611         return -1 ;
00612         }
00613         cpl_msg_info (_id,"------------------------------") ; 
00614             cpl_msg_info(_id,"NODDED SCIENCE FRAMES");
00615         cpl_msg_info (_id,"------------------------------") ; 
00616       
00617     } 
00618   cpl_frameset_delete(obj_set);
00619   cpl_frameset_delete(sky_set);
00620   cpl_frameset_delete(cdb_set);
00621   cpl_frameset_delete(ref_set);
00622 
00623   fake_delete(fk);
00624   sinfoni_memory_status();
00625   return 0 ;
00626 }
00627 

Generated on Wed Oct 26 13:08:54 2005 for SINFONI Pipeline Reference Manual by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001