KMOS Pipeline Reference Manual  1.0.8
kmo_dev_setup.c
00001 /* $Id: kmo_dev_setup.c,v 1.7 2013/01/09 13:51:03 aagudo Exp $
00002  *
00003  * This file is part of the KMOS Pipeline
00004  * Copyright (C) 2002,2003 European Southern Observatory
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: aagudo $
00023  * $Date: 2013/01/09 13:51:03 $
00024  * $Revision: 1.7 $
00025  * $Name: kmosp_v1_0_8__20130220 $
00026  */
00027 
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031 
00032 /*-----------------------------------------------------------------------------
00033  *                              Includes
00034  *----------------------------------------------------------------------------*/
00035 
00036 
00037 #include <math.h>
00038 #include <string.h>
00039 
00040 #include <cpl.h>
00041 #include "kmclipm_math.h"
00042 
00043 #include "kmo_priv_reconstruct.h"
00044 #include "kmo_priv_functions.h"
00045 #include "kmo_priv_fits_stack.h"
00046 #include "kmo_cpl_extensions.h"
00047 #include "kmo_dfs.h"
00048 #include "kmo_error.h"
00049 #include "kmo_constants.h"
00050 #include "kmo_debug.h"
00051 
00052 /*-----------------------------------------------------------------------------
00053  *                          Functions prototypes
00054  *----------------------------------------------------------------------------*/
00055 
00056 static int kmo_dev_setup_create(cpl_plugin *);
00057 static int kmo_dev_setup_exec(cpl_plugin *);
00058 static int kmo_dev_setup_destroy(cpl_plugin *);
00059 static int kmo_dev_setup(cpl_parameterlist *, cpl_frameset *);
00060 
00061 /*-----------------------------------------------------------------------------
00062  *                          Static variables
00063  *----------------------------------------------------------------------------*/
00064 
00065 static char kmo_dev_setup_description[] =
00066 "     #############################################\n"
00067 "     ### INTENDED FOR PIPELINE DEVELOPERS ONLY ###\n"
00068 "     #############################################\n"
00069 "\n"
00070 "This recipe is intended to create KMOS conform files in a semi-automatic manner.\n"
00071 "It is sufficient to provide a single FITS file and a few parameters to create\n"
00072 "KMOS conform FITS files suited for different recipes. Internally it calls repea-\n"
00073 "tedly the recipe kmo_fits_stack. There are also parameters that allow to prepare\n"
00074 "the frames, i.e. early test out of the lab, in a way they can be processed.\n"
00075 "\n"
00076 "One extension from the input frame is taken, some noise is added automatically\n"
00077 "in order to create similar frames for the other extensions.\n"
00078 "\n"
00079 "BASIC PARAMETERS:\n"
00080 "-----------------\n"
00081 "--type\n"
00082 "Defines for which recipe the files should be created ('DARK', \n"
00083 "'FLAT_ON', 'FLAT_OFF', 'ARC_ON', 'ARC_OFF', 'STD', 'SKY').\n"
00084 "\n"
00085 "--extension\n"
00086 "Defines which extension is used to craete frames\n"
00087 "\n"
00088 "--xshift\n"
00089 "--yshift\n"
00090 "Shift frames in x and y\n"
00091 "\n"
00092 "--rotangle\n"
00093 "Sets the ESO OCS ROT NAANGLE keyword in the primary header.\n"
00094 "\n"
00095 "--topcrop\n"
00096 "--bottomcrop\n"
00097 "--leftcrop\n"
00098 "--rightcrop\n"
00099 "These are cropping the image (filled with 0).\n"
00100 "\n"
00101 "--mainkey\n"
00102 "--subkey\n"
00103 "Add individual keywords to primary- or sub-header\n"
00104 "\n"
00105 "--valid\n"
00106 "Defines if IFUs are active or inactive\n"
00107 "\n"
00108 "--objects\n"
00109 "Defines if IFUs contain object or sky.\n"
00110 "\n"
00111 "--date\n"
00112 "Sets the DATE-OBS keword in the primary header.\n"
00113 "\n"
00114 "--filter\n"
00115 "Sets the filter type for all extensions.\n"
00116 "\n"
00117 "--grating\n"
00118 "Sets the grating type for all extensions.\n"
00119 "\n"
00120 "-------------------------------------------------------------------------------\n"
00121 "  Input files:\n"
00122 "\n"
00123 "   DO                     KMOS                                                 \n"
00124 "   category               Type  Explanation                    Required #Frames\n"
00125 "   --------               ----- -----------                    -------- -------\n"
00126 "    DARK        or        RAW   Frame to create Master dark or    Y        1   \n"
00127 "    FLAT_ON     or              Flat-on or                                     \n"
00128 "    FLAT_OFF    or              Flat-off or                                    \n"
00129 "    ARC_ON      or              Arc-on or                                      \n"
00130 "    ARC_OFF     or              Arc-off or                                     \n"
00131 "    SKY         or              Sky or                                         \n"
00132 "    STD         or              Std star or                                    \n"
00133 "    GENERIC                     any other generic KMOS frame                   \n"
00134 "\n"
00135 "  Output files:\n"
00136 "\n"
00137 "   DO                    KMOS\n"
00138 "   category              Type   Explanation\n"
00139 "   --------              -----  -----------\n"
00140 "   <see comment>         RAW    Named depending on --type parameter\n"
00141 "-------------------------------------------------------------------------------\n"
00142 "\n";
00143 
00144 /*-----------------------------------------------------------------------------
00145  *                              Functions code
00146  *----------------------------------------------------------------------------*/
00147 
00164 int cpl_plugin_get_info(cpl_pluginlist *list)
00165 {
00166     cpl_recipe *recipe = cpl_calloc(1, sizeof *recipe);
00167     cpl_plugin *plugin = &recipe->interface;
00168 
00169     cpl_plugin_init(plugin,
00170                         CPL_PLUGIN_API,
00171                         KMOS_BINARY_VERSION,
00172                         CPL_PLUGIN_TYPE_RECIPE,
00173                         "kmo_dev_setup",
00174                         "Create aligned KMOS files out of test frames",
00175                         kmo_dev_setup_description,
00176                         "Alex Agudo Berbel",
00177                         "agudo@mpe.mpg.de",
00178                         kmos_get_license(),
00179                         kmo_dev_setup_create,
00180                         kmo_dev_setup_exec,
00181                         kmo_dev_setup_destroy);
00182 
00183     cpl_pluginlist_append(list, plugin);
00184 
00185     return 0;
00186 }
00187 
00195 static int kmo_dev_setup_create(cpl_plugin *plugin)
00196 {
00197     cpl_recipe *recipe;
00198     cpl_parameter *p;
00199 
00200     /* Check that the plugin is part of a valid recipe */
00201     if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE) 
00202         recipe = (cpl_recipe *)plugin;
00203     else
00204         return -1;
00205 
00206     /* Create the parameters list in the cpl_recipe object */
00207     recipe->parameters = cpl_parameterlist_new();
00208 
00209      /* Fill the parameters list */
00210     /* --type */
00211     p = cpl_parameter_new_value("kmos.kmo_dev_setup.type",
00212                                 CPL_TYPE_STRING,
00213                                 "FITS type to create (DARK, FLAT_ON, "
00214                                 "FLAT_OFF, ARC_ON, ARC_OFF, SKY, GENERIC, STD)",
00215                                 "kmos.kmo_dev_setup",
00216                                 "");
00217     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "type");
00218     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00219     cpl_parameterlist_append(recipe->parameters, p);
00220 
00221     /* --extension */
00222     p = cpl_parameter_new_value("kmos.kmo_dev_setup.extension",
00223                                 CPL_TYPE_INT,
00224                                 "FITS extension to process (0: primary, 1, 2,...)",
00225                                 "kmos.kmo_dev_setup",
00226                                 0);
00227     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "extension");
00228     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00229     cpl_parameterlist_append(recipe->parameters, p);
00230 
00231     /* --xshift */
00232     p = cpl_parameter_new_value("kmos.kmo_dev_setup.xshift",
00233                                 CPL_TYPE_INT,
00234                                 "integer shift in x (to the right -> pos)",
00235                                 "kmos.kmo_dev_setup",
00236                                 0);
00237     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "xshift");
00238     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00239     cpl_parameterlist_append(recipe->parameters, p);
00240 
00241     /* --yshift */
00242     p = cpl_parameter_new_value("kmos.kmo_dev_setup.yshift",
00243                                 CPL_TYPE_INT,
00244                                 "integer shift in y (to the top -> pos)",
00245                                 "kmos.kmo_dev_setup",
00246                                 0);
00247     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "yshift");
00248     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00249     cpl_parameterlist_append(recipe->parameters, p);
00250 
00251 //    /* --rotation */
00252 //    p = cpl_parameter_new_value("kmos.kmo_dev_setup.rotation",
00253 //                                CPL_TYPE_DOUBLE,
00254 //                                "rotation in degrees (CCW)",
00255 //                                "kmos.kmo_dev_setup",
00256 //                                0.0);
00257 //    cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "rotation");
00258 //    cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00259 //    cpl_parameterlist_append(recipe->parameters, p);
00260 
00261     /* --rotangle */
00262     p = cpl_parameter_new_value("kmos.kmo_dev_setup.rotangle",
00263                                 CPL_TYPE_DOUBLE,
00264                                 "Rotator offset angle in degrees (CCW)",
00265                                 "kmos.kmo_dev_setup",
00266                                 -1.0);
00267     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "rotangle");
00268     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00269     cpl_parameterlist_append(recipe->parameters, p);
00270 
00271     /* --topcrop */
00272     p = cpl_parameter_new_value("kmos.kmo_dev_setup.topcrop",
00273                                 CPL_TYPE_INT,
00274                                 "number of rows to crop at top",
00275                                 "kmos.kmo_dev_setup",
00276                                 0);
00277     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "topcrop");
00278     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00279     cpl_parameterlist_append(recipe->parameters, p);
00280 
00281     /* --bottomcrop */
00282     p = cpl_parameter_new_value("kmos.kmo_dev_setup.bottomcrop",
00283                                 CPL_TYPE_INT,
00284                                 "number of rows to crop at bottom",
00285                                 "kmos.kmo_dev_setup",
00286                                 0);
00287     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "bottomcrop");
00288     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00289     cpl_parameterlist_append(recipe->parameters, p);
00290 
00291     /* --leftcrop */
00292     p = cpl_parameter_new_value("kmos.kmo_dev_setup.leftcrop",
00293                                 CPL_TYPE_INT,
00294                                 "number of columns to crop at left",
00295                                 "kmos.kmo_dev_setup",
00296                                 0);
00297     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "leftcrop");
00298     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00299     cpl_parameterlist_append(recipe->parameters, p);
00300 
00301     /* --rightcrop */
00302     p = cpl_parameter_new_value("kmos.kmo_dev_setup.rightcrop",
00303                                 CPL_TYPE_INT,
00304                                 "number of columns to crop at right",
00305                                 "kmos.kmo_dev_setup",
00306                                 0);
00307     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "rightcrop");
00308     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00309     cpl_parameterlist_append(recipe->parameters, p);
00310 
00311     /* --mainkey */
00312     p = cpl_parameter_new_value("kmos.kmo_dev_setup.mainkey",
00313                              CPL_TYPE_STRING,
00314                              "Optional: Additional keywords for primary header",
00315                              "kmos.kmo_dev_setup",
00316                              "");
00317     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "mainkey");
00318     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00319     cpl_parameterlist_append(recipe->parameters, p);
00320 
00321     /* --subkey */
00322     p = cpl_parameter_new_value("kmos.kmo_dev_setup.subkey",
00323                                 CPL_TYPE_STRING,
00324                                 "Optional: Additional keywords for sub headers",
00325                                 "kmos.kmo_dev_setup",
00326                                 "");
00327     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "subkey");
00328     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00329     cpl_parameterlist_append(recipe->parameters, p);
00330 
00331     /* --valid */
00332     p = cpl_parameter_new_value("kmos.kmo_dev_setup.valid",
00333                                 CPL_TYPE_STRING,
00334                                 "Optional: Specify which IFUs are active. "
00335                                 "Either empty string or string with 8 elements"
00336                                 " (ones or zeros) e.g: [1;0;1;0;0;...;1]",
00337                                 "kmos.kmo_dev_setup",
00338                                 "");
00339     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "valid");
00340     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00341     cpl_parameterlist_append(recipe->parameters, p);
00342 
00343     /* --objects */
00344     p = cpl_parameter_new_value("kmos.kmo_dev_setup.objects",
00345                                 CPL_TYPE_STRING,
00346                                 "Optional (STD only): Specify which IFUs contain"
00347                                 " objects. Either empty string or string with 8"
00348                                 " elements (ones or zeros) "
00349                                 "e.g: [1;0;1;0;0;...;1]",
00350                                 "kmos.kmo_dev_setup",
00351                                 "");
00352     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "objects");
00353     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00354     cpl_parameterlist_append(recipe->parameters, p);
00355 
00356     /* --date */
00357     p = cpl_parameter_new_value("kmos.kmo_dev_setup.date",
00358                                 CPL_TYPE_STRING,
00359                                 "Optional (STD only): Specify the date to save "
00360                                 "into DATE-OBS "
00361                                 "e.g: [2010-01-31T11:53:15.9789]",
00362                                 "kmos.kmo_dev_setup",
00363                                 "");
00364     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "date");
00365     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00366     cpl_parameterlist_append(recipe->parameters, p);
00367 
00368     /* --filter */
00369     p = cpl_parameter_new_value("kmos.kmo_dev_setup.filter",
00370                                 CPL_TYPE_STRING,
00371                                 "filter type (K, H, HK, etc.)",
00372                                 "kmos.kmo_dev_setup",
00373                                 "");
00374     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "filter");
00375     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00376     cpl_parameterlist_append(recipe->parameters, p);
00377 
00378     /* --grating */
00379     p = cpl_parameter_new_value("kmos.kmo_dev_setup.grating",
00380                                 CPL_TYPE_STRING,
00381                                 "grating type (K, H, HK, etc.)",
00382                                 "kmos.kmo_dev_setup",
00383                                 "");
00384     cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "grating");
00385     cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
00386     cpl_parameterlist_append(recipe->parameters, p);
00387 
00388     return 0;
00389 }
00390 
00396 static int kmo_dev_setup_exec(cpl_plugin *plugin)
00397 {
00398     cpl_recipe  *recipe;
00399 
00400     /* Get the recipe out of the plugin */
00401     if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE) 
00402         recipe = (cpl_recipe *)plugin;
00403     else return -1;
00404 
00405     return kmo_dev_setup(recipe->parameters, recipe->frames);
00406 }
00407 
00413 static int kmo_dev_setup_destroy(cpl_plugin *plugin)
00414 {
00415     cpl_recipe *recipe;
00416 
00417     /* Get the recipe out of the plugin */
00418     if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE) 
00419         recipe = (cpl_recipe *)plugin;
00420     else return -1 ;
00421 
00422     cpl_parameterlist_delete(recipe->parameters);
00423     return 0 ;
00424 }
00425 
00426 cpl_frameset* dev_frameset(const char *p1, const char *p2, const char *p3) {
00427     cpl_frameset *frset = NULL;
00428     cpl_frame *fr = NULL;
00429 
00430     KMO_TRY
00431     {
00432 
00433         KMO_TRY_EXIT_IF_NULL(
00434             frset = cpl_frameset_new());
00435 
00436         KMO_TRY_EXIT_IF_NULL(
00437             fr = cpl_frame_new());
00438         KMO_TRY_EXIT_IF_ERROR(
00439             cpl_frame_set_filename(fr, p1));
00440         KMO_TRY_EXIT_IF_ERROR(
00441             cpl_frame_set_tag(fr, FS_DATA));
00442         KMO_TRY_EXIT_IF_ERROR(
00443             cpl_frame_set_type(fr, CPL_FRAME_TYPE_NONE));
00444         KMO_TRY_EXIT_IF_ERROR(
00445             cpl_frame_set_group(fr, CPL_FRAME_GROUP_NONE));
00446         KMO_TRY_EXIT_IF_ERROR(
00447             cpl_frame_set_level(fr, CPL_FRAME_LEVEL_NONE));
00448         KMO_TRY_EXIT_IF_ERROR(
00449             cpl_frameset_insert(frset, fr));
00450 
00451         KMO_TRY_EXIT_IF_NULL(
00452             fr = cpl_frame_new());
00453         KMO_TRY_EXIT_IF_ERROR(
00454             cpl_frame_set_filename(fr, p2));
00455         KMO_TRY_EXIT_IF_ERROR(
00456             cpl_frame_set_tag(fr, FS_DATA));
00457         KMO_TRY_EXIT_IF_ERROR(
00458             cpl_frame_set_type(fr, CPL_FRAME_TYPE_NONE));
00459         KMO_TRY_EXIT_IF_ERROR(
00460             cpl_frame_set_group(fr, CPL_FRAME_GROUP_NONE));
00461         KMO_TRY_EXIT_IF_ERROR(
00462             cpl_frame_set_level(fr, CPL_FRAME_LEVEL_NONE));
00463         KMO_TRY_EXIT_IF_ERROR(
00464             cpl_frameset_insert(frset, fr));
00465 
00466         KMO_TRY_EXIT_IF_NULL(
00467             fr = cpl_frame_new());
00468         KMO_TRY_EXIT_IF_ERROR(
00469             cpl_frame_set_filename(fr, p3));
00470         KMO_TRY_EXIT_IF_ERROR(
00471             cpl_frame_set_tag(fr, FS_DATA));
00472         KMO_TRY_EXIT_IF_ERROR(
00473             cpl_frame_set_type(fr, CPL_FRAME_TYPE_NONE));
00474         KMO_TRY_EXIT_IF_ERROR(
00475             cpl_frame_set_group(fr, CPL_FRAME_GROUP_NONE));
00476         KMO_TRY_EXIT_IF_ERROR(
00477             cpl_frame_set_level(fr, CPL_FRAME_LEVEL_NONE));
00478         KMO_TRY_EXIT_IF_ERROR(
00479             cpl_frameset_insert(frset, fr));
00480     }
00481     KMO_CATCH
00482     {
00483         cpl_frameset_delete(frset); frset = NULL;
00484     }
00485     return frset;
00486 }
00487 
00488 cpl_frameset* dev_frameset_master(const char *p1) {
00489     cpl_frameset *frset = NULL;
00490 
00491     cpl_frame *fr = NULL;
00492 
00493     KMO_TRY
00494     {
00495 
00496         KMO_TRY_EXIT_IF_NULL(
00497             frset = cpl_frameset_new());
00498         for (int i = 0; i < 3; i++) {
00499             KMO_TRY_EXIT_IF_NULL(
00500                 fr = cpl_frame_new());
00501             KMO_TRY_EXIT_IF_ERROR(
00502                 cpl_frame_set_filename(fr, p1));
00503             KMO_TRY_EXIT_IF_ERROR(
00504                 cpl_frame_set_tag(fr, FS_DATA));
00505             KMO_TRY_EXIT_IF_ERROR(
00506                 cpl_frame_set_type(fr, CPL_FRAME_TYPE_NONE));
00507             KMO_TRY_EXIT_IF_ERROR(
00508                 cpl_frame_set_group(fr, CPL_FRAME_GROUP_NONE));
00509             KMO_TRY_EXIT_IF_ERROR(
00510                 cpl_frame_set_level(fr, CPL_FRAME_LEVEL_NONE));
00511             KMO_TRY_EXIT_IF_ERROR(
00512                 cpl_frameset_insert(frset, fr));
00513 
00514             KMO_TRY_EXIT_IF_NULL(
00515                 fr = cpl_frame_new());
00516             KMO_TRY_EXIT_IF_ERROR(
00517                 cpl_frame_set_filename(fr, p1));
00518             KMO_TRY_EXIT_IF_ERROR(
00519                 cpl_frame_set_tag(fr, FS_NOISE));
00520             KMO_TRY_EXIT_IF_ERROR(
00521                 cpl_frame_set_type(fr, CPL_FRAME_TYPE_NONE));
00522             KMO_TRY_EXIT_IF_ERROR(
00523                 cpl_frame_set_group(fr, CPL_FRAME_GROUP_NONE));
00524             KMO_TRY_EXIT_IF_ERROR(
00525                 cpl_frame_set_level(fr, CPL_FRAME_LEVEL_NONE));
00526             KMO_TRY_EXIT_IF_ERROR(
00527                 cpl_frameset_insert(frset, fr));
00528         }
00529     }
00530     KMO_CATCH
00531     {
00532         cpl_frameset_delete(frset); frset = NULL;
00533     }
00534     return frset;
00535 }
00536 
00551 static int kmo_dev_setup(cpl_parameterlist *parlist, cpl_frameset *frameset)
00552 {
00553     int         ret_val     = 0,
00554                 ext         = 0,
00555                 xshift      = 0,
00556                 yshift      = 0,
00557                 topcrop     = 0,
00558                 bottomcrop  = 0,
00559                 leftcrop    = 0,
00560                 rightcrop   = 0,
00561                 x           = 0,
00562                 y           = 0,
00563                 nx          = 0,
00564                 ny          = 0;
00565 
00566 //    double      rotation    = 0.0;
00567     double      rotangle    = 0.0;
00568 
00569     float       *pimg1      = NULL,
00570                 *ptmp_img   = NULL;
00571 
00572     const char  *type       = NULL,
00573                 *mainkey    = NULL,
00574                 *subkey     = NULL,
00575                 *valid      = NULL,
00576                 *objects_txt= NULL,
00577                 *date       = NULL,
00578                 *filter     = NULL,
00579                 *grating    = NULL;
00580 
00581     char        pmainkey[2048],
00582                 psubkey[2048],
00583                 pvalid[2048],
00584                 pfilename[2048],
00585                 tmp_str[256];
00586 
00587     const char *obsid        = "-2147483648",
00588                *exptime_min  = "2.47624",
00589                *exptime_long  = "600";
00590 
00591 
00592     cpl_frame   *frame      = NULL;
00593 
00594     cpl_image   *img1       = NULL,
00595                 *img_copy   = NULL,
00596                 *noise      = NULL,
00597                 *noise_copy = NULL,
00598                 *img_noise1 = NULL,
00599                 *img_noise2 = NULL,
00600                 *img_noise3 = NULL,
00601                 *tmp_img    = NULL;
00602 
00603     cpl_vector  *objects    = NULL;
00604 
00605     cpl_frameset *frset     = NULL;
00606 
00607 //    cpl_frame   *fr         = NULL;
00608 
00609     cpl_parameterlist *plist    = NULL;
00610 
00611     cpl_parameter *p        = NULL;
00612 
00613     KMO_TRY
00614     {
00615         strcpy(pmainkey, "");
00616         strcpy(psubkey, "");
00617         strcpy(pvalid, "");
00618         strcpy(pfilename, "");
00619         strcpy(tmp_str, "");
00620 
00621         /* --- check input --- */
00622         KMO_TRY_ASSURE((parlist != NULL) &&
00623                        (frameset != NULL),
00624                        CPL_ERROR_NULL_INPUT,
00625                        "Not all input data is provided!");
00626 
00627         /* --- get parameters --- */
00628         cpl_msg_info("", "--- Parameter setup for kmo_dev_setup -----");
00629 
00630         KMO_TRY_EXIT_IF_NULL(
00631             type = kmo_dfs_get_parameter_string(parlist,
00632                                             "kmos.kmo_dev_setup.type"));
00633         KMO_TRY_EXIT_IF_ERROR(
00634             kmo_dfs_print_parameter_help(parlist,
00635                                         "kmos.kmo_dev_setup.type"));
00636 
00637         ext = kmo_dfs_get_parameter_int(parlist,
00638                                         "kmos.kmo_dev_setup.extension");
00639         KMO_TRY_CHECK_ERROR_STATE();
00640         KMO_TRY_ASSURE(ext >= 0,
00641                        CPL_ERROR_ILLEGAL_INPUT,
00642                        "ext >= 0!");
00643         KMO_TRY_EXIT_IF_ERROR(
00644             kmo_dfs_print_parameter_help(parlist,
00645                                         "kmos.kmo_dev_setup.extension"));
00646 
00647         xshift = kmo_dfs_get_parameter_int(parlist,
00648                                            "kmos.kmo_dev_setup.xshift");
00649         KMO_TRY_CHECK_ERROR_STATE();
00650         KMO_TRY_EXIT_IF_ERROR(
00651             kmo_dfs_print_parameter_help(parlist,
00652                                         "kmos.kmo_dev_setup.xshift"));
00653 
00654         yshift = kmo_dfs_get_parameter_int(parlist,
00655                                            "kmos.kmo_dev_setup.yshift");
00656         KMO_TRY_CHECK_ERROR_STATE();
00657         KMO_TRY_EXIT_IF_ERROR(
00658             kmo_dfs_print_parameter_help(parlist,
00659                                         "kmos.kmo_dev_setup.yshift"));
00660 
00661 //        rotation = kmo_dfs_get_parameter_double(parlist,
00662 //                                           "kmos.kmo_dev_setup.rotation");
00663 //        KMO_TRY_CHECK_ERROR_STATE();
00664 //        KMO_TRY_EXIT_IF_ERROR(
00665 //            kmo_dfs_print_parameter_help(parlist,
00666 //                                        "kmos.kmo_dev_setup.rotation"));
00667 
00668         topcrop = kmo_dfs_get_parameter_int(parlist,
00669                                            "kmos.kmo_dev_setup.topcrop");
00670         KMO_TRY_CHECK_ERROR_STATE();
00671         KMO_TRY_EXIT_IF_ERROR(
00672             kmo_dfs_print_parameter_help(parlist,
00673                                         "kmos.kmo_dev_setup.topcrop"));
00674 
00675         bottomcrop = kmo_dfs_get_parameter_int(parlist,
00676                                            "kmos.kmo_dev_setup.bottomcrop");
00677         KMO_TRY_CHECK_ERROR_STATE();
00678         KMO_TRY_EXIT_IF_ERROR(
00679             kmo_dfs_print_parameter_help(parlist,
00680                                         "kmos.kmo_dev_setup.bottomcrop"));
00681 
00682         leftcrop = kmo_dfs_get_parameter_int(parlist,
00683                                            "kmos.kmo_dev_setup.leftcrop");
00684         KMO_TRY_CHECK_ERROR_STATE();
00685         KMO_TRY_EXIT_IF_ERROR(
00686             kmo_dfs_print_parameter_help(parlist,
00687                                         "kmos.kmo_dev_setup.leftcrop"));
00688 
00689         rightcrop = kmo_dfs_get_parameter_int(parlist,
00690                                            "kmos.kmo_dev_setup.rightcrop");
00691         KMO_TRY_CHECK_ERROR_STATE();
00692         KMO_TRY_EXIT_IF_ERROR(
00693             kmo_dfs_print_parameter_help(parlist,
00694                                         "kmos.kmo_dev_setup.rightcrop"));
00695 
00696         KMO_TRY_EXIT_IF_NULL(
00697             mainkey = kmo_dfs_get_parameter_string(parlist,
00698                                             "kmos.kmo_dev_setup.mainkey"));
00699         KMO_TRY_EXIT_IF_ERROR(
00700             kmo_dfs_print_parameter_help(parlist,
00701                                         "kmos.kmo_dev_setup.mainkey"));
00702 
00703         KMO_TRY_EXIT_IF_NULL(
00704             subkey = kmo_dfs_get_parameter_string(parlist,
00705                                             "kmos.kmo_dev_setup.subkey"));
00706         KMO_TRY_EXIT_IF_ERROR(
00707             kmo_dfs_print_parameter_help(parlist,
00708                                         "kmos.kmo_dev_setup.subkey"));
00709 
00710         KMO_TRY_EXIT_IF_NULL(
00711             valid = kmo_dfs_get_parameter_string(parlist,
00712                                             "kmos.kmo_dev_setup.valid"));
00713         KMO_TRY_EXIT_IF_ERROR(
00714             kmo_dfs_print_parameter_help(parlist,
00715                                         "kmos.kmo_dev_setup.valid"));
00716 
00717         KMO_TRY_EXIT_IF_NULL(
00718             objects_txt = kmo_dfs_get_parameter_string(parlist,
00719                                             "kmos.kmo_dev_setup.objects"));
00720         KMO_TRY_EXIT_IF_ERROR(
00721             kmo_dfs_print_parameter_help(parlist,
00722                                         "kmos.kmo_dev_setup.objects"));
00723 
00724         KMO_TRY_EXIT_IF_NULL(
00725             date = kmo_dfs_get_parameter_string(parlist,
00726                                             "kmos.kmo_dev_setup.date"));
00727         KMO_TRY_EXIT_IF_ERROR(
00728             kmo_dfs_print_parameter_help(parlist,
00729                                         "kmos.kmo_dev_setup.date"));
00730 
00731         KMO_TRY_EXIT_IF_NULL(
00732             filter = kmo_dfs_get_parameter_string(parlist,
00733                                             "kmos.kmo_dev_setup.filter"));
00734         KMO_TRY_EXIT_IF_ERROR(
00735             kmo_dfs_print_parameter_help(parlist,
00736                                         "kmos.kmo_dev_setup.filter"));
00737 
00738         KMO_TRY_EXIT_IF_NULL(
00739             grating = kmo_dfs_get_parameter_string(parlist,
00740                                             "kmos.kmo_dev_setup.grating"));
00741         KMO_TRY_EXIT_IF_ERROR(
00742             kmo_dfs_print_parameter_help(parlist,
00743                                         "kmos.kmo_dev_setup.grating"));
00744 
00745         cpl_msg_info("", "-------------------------------------------");
00746 
00747         KMO_TRY_ASSURE((strcmp(type, "DARK") == 0) ||
00748                        (strcmp(type, "FLAT_ON") == 0) ||
00749                        (strcmp(type, "FLAT_OFF") == 0) ||
00750                        (strcmp(type, "ARC_ON") == 0) ||
00751                        (strcmp(type, "ARC_OFF") == 0) ||
00752                        (strcmp(type, "SKY") == 0) ||
00753                        (strcmp(type, "STD") == 0) ||
00754                        (strcmp(type, "MASTER_FLAT") == 0) ||
00755                        (strcmp(type, "GENERIC") == 0),
00756                        CPL_ERROR_ILLEGAL_INPUT,
00757                        "Wrong type!");
00758 
00759         // get frame
00760         KMO_TRY_EXIT_IF_NULL(
00761             frame = kmo_dfs_get_frame(frameset, "0"));
00762 
00763         // load data
00764         KMO_TRY_EXIT_IF_NULL(
00765             img1 = kmclipm_image_load(cpl_frame_get_filename(frame),
00766                                 CPL_TYPE_FLOAT,
00767                                 0,
00768                                 ext));
00769 
00770         //
00771         // SHIFT
00772         //
00773         if ((xshift != 0) || (yshift != 0)) {
00774             cpl_msg_info(cpl_func, "shift: x=%d, y=%d", xshift, yshift);
00775             KMO_TRY_EXIT_IF_ERROR(
00776                 cpl_image_shift(img1, xshift, yshift));
00777         } else {
00778             cpl_msg_info(cpl_func, "no shift applied.");
00779         }
00780 //cpl_image_save(img1, "dev_shift.fits", CPL_BPP_IEEE_FLOAT, NULL, CPL_IO_CREATE);
00781 
00782 //        //
00783 //        // ROTATION
00784 //        //
00785 //        if (fabs(rotation) >= 0.0001) {
00786 //            cpl_msg_info(cpl_func, "rotation: r=%g CCW", rotation);
00787 //            KMO_TRY_EXIT_IF_NULL(
00788 //                    img2 = kmo_dev_rotate(img1, rotation,
00789 //                                          1, "BCS", NONE_NANS));
00790 //        } else {
00791 //            cpl_msg_info(cpl_func, "no rotation applied.");
00792 //            img2 = img1;
00793 //        }
00794 //cpl_image_save(img2, "dev_rotation.fits", CPL_BPP_IEEE_FLOAT, NULL, CPL_IO_CREATE);
00795 
00796         nx = cpl_image_get_size_x(img1);
00797         ny = cpl_image_get_size_y(img1);
00798 
00799         //
00800         // CROP
00801         //
00802         if ((topcrop != 0) || (bottomcrop != 0) ||
00803             (leftcrop != 0) || (rightcrop != 0)) {
00804             cpl_msg_info(cpl_func, "crop: top=%d, bottom=%d, left=%d, right=%d",
00805                          topcrop, bottomcrop, leftcrop, rightcrop);
00806 
00807             KMO_TRY_EXIT_IF_NULL(
00808                 pimg1 = cpl_image_get_data_float(img1));
00809 
00810             // bottomcrop
00811             for (y = 0; y < bottomcrop; y++) {
00812                 for (x = 0; x < nx; x++) {
00813                     pimg1[x+y*nx] = 0.0;
00814                 }
00815             }
00816 
00817             // topcrop
00818             for (y = nx-topcrop; y < nx; y++) {
00819                 for (x = 0; x < nx; x++) {
00820                     pimg1[x+y*nx] = 0.0;
00821                 }
00822             }
00823 
00824             // leftcrop
00825             for (y = 0; y < ny; y++) {
00826                 for (x = 0; x < leftcrop; x++) {
00827                     pimg1[x+y*nx] = 0.0;
00828                 }
00829             }
00830 
00831             // rightcrop
00832             for (y = 0; y < ny; y++) {
00833                 for (x = nx-rightcrop; x < nx; x++) {
00834                     pimg1[x+y*nx] = 0.0;
00835                 }
00836             }
00837         } else {
00838             cpl_msg_info(cpl_func, "no crop applied.");
00839         }
00840 //cpl_image_save(img1, "dev_crop.fits", CPL_BPP_IEEE_FLOAT, NULL, CPL_IO_CREATE);
00841 
00842         //
00843         // NOISIFY
00844         //
00845         KMO_TRY_EXIT_IF_NULL(
00846             noise = cpl_image_new(nx, ny, CPL_TYPE_FLOAT));
00847         KMO_TRY_EXIT_IF_ERROR(
00848             cpl_image_fill_noise_uniform(noise, -1.0, 1.0));
00849 
00850         // calculate level
00851         float level = 0.0;
00852         if ((strcmp(type, "DARK") == 0) ||
00853             (strcmp(type, "SKY") == 0))
00854         {
00855             KMO_TRY_EXIT_IF_NULL(
00856                 tmp_img = cpl_image_duplicate(img1));
00857             KMO_TRY_EXIT_IF_NULL(
00858                 ptmp_img = cpl_image_get_data(tmp_img));
00859             for (int i = 0; i < nx*ny; i++) {
00860                 if (kmclipm_is_nan_or_inf(ptmp_img[i])) {
00861                     ptmp_img[i] = 0;
00862                 }
00863             }
00864             KMO_TRY_CHECK_ERROR_STATE();
00865             level = cpl_image_get_stdev(tmp_img);
00866             KMO_TRY_CHECK_ERROR_STATE();
00867             cpl_image_delete(tmp_img); tmp_img = NULL;
00868 
00869             KMO_TRY_EXIT_IF_ERROR(
00870                 cpl_image_multiply_scalar(noise, level));
00871 
00872             // img_noise1:
00873             img_noise1 = img1;
00874 
00875             // img_noise2: just add noise
00876             KMO_TRY_EXIT_IF_NULL(
00877                 img_noise2 = cpl_image_add_create(img1, noise));
00878 
00879             // img_noise3: add noise flipped horizontally
00880             cpl_image_flip(noise, 0);
00881             KMO_TRY_EXIT_IF_NULL(
00882                 img_noise3 = cpl_image_add_create(img1, noise));
00883         } else {
00884             KMO_TRY_EXIT_IF_NULL(
00885                 img_copy = cpl_image_duplicate(img1));
00886 
00887             KMO_TRY_EXIT_IF_NULL(
00888                 noise_copy = cpl_image_duplicate(noise));
00889 
00890             // img_noise1:
00891             img_noise1 = img1;
00892 
00893             // img_noise2: add noise level 1
00894             KMO_TRY_EXIT_IF_ERROR(
00895                 cpl_image_multiply_scalar(noise, 10));
00896             KMO_TRY_EXIT_IF_NULL(
00897                 img_noise2 = cpl_image_add_create(img1, noise));
00898 
00899             // img_noise3: add noise level 2
00900             KMO_TRY_EXIT_IF_ERROR(
00901                 cpl_image_multiply_scalar(noise_copy, 15));
00902             KMO_TRY_EXIT_IF_NULL(
00903                 img_noise3 = cpl_image_add_create(img_copy, noise_copy));
00904 
00905             cpl_image_delete(img_copy); img_copy = NULL;
00906             cpl_image_delete(noise_copy); noise_copy = NULL;
00907         }
00908         cpl_image_delete(noise); noise = NULL;
00909 
00910         // these have to be stored!
00911         kmclipm_image_save(img_noise1, "tmp_delete1.fits", CPL_BPP_IEEE_FLOAT,
00912                            NULL, CPL_IO_CREATE, 0);
00913         kmclipm_image_save(img_noise2, "tmp_delete2.fits", CPL_BPP_IEEE_FLOAT,
00914                            NULL, CPL_IO_CREATE, 0);
00915         kmclipm_image_save(img_noise3, "tmp_delete3.fits", CPL_BPP_IEEE_FLOAT,
00916                            NULL, CPL_IO_CREATE, 0);
00917         cpl_image_delete(img_noise2); img_noise2 = NULL;
00918         cpl_image_delete(img_noise3); img_noise3 = NULL;
00919 
00920         //
00921         // STACK
00922         //
00923 
00924         // setup parameterlist
00925 
00926 // all types
00927         /* --mainkey */
00928 
00929         if (strcmp(mainkey, "") != 0) {
00930             strcpy(pmainkey, mainkey);
00931             strcat(pmainkey, ";");
00932             strcat(pmainkey,"ESO OBS ID;int;");strcat(pmainkey, obsid);
00933         } else {
00934             strcpy(pmainkey,"ESO OBS ID;int;");strcat(pmainkey, obsid);
00935         }
00936 //        strcat(pmainkey, ";");
00937         if (rotangle != -1) {
00938             char *nr = NULL;
00939             KMO_TRY_EXIT_IF_NULL(
00940                 nr = cpl_sprintf("%g", rotangle));
00941             strcat(pmainkey,";ESO OCS ROT NAANGLE;double;");strcat(pmainkey, nr);
00942             cpl_free(nr); nr = NULL;
00943         }
00944 
00945         if (strcmp(filter, "") != 0) {
00946             strcat(pmainkey, ";ESO INS FILT1 ID;string;");strcat(pmainkey, filter);
00947             strcat(pmainkey,";ESO INS FILT2 ID;string;");strcat(pmainkey, filter);
00948             strcat(pmainkey,";ESO INS FILT3 ID;string;");strcat(pmainkey, filter);
00949         }
00950 
00951         if (strcmp(grating, "") != 0) {
00952             strcat(pmainkey,";ESO INS GRAT1 ID;string;");strcat(pmainkey, grating);
00953             strcat(pmainkey,";ESO INS GRAT2 ID;string;");strcat(pmainkey, grating);
00954             strcat(pmainkey,";ESO INS GRAT3 ID;string;");strcat(pmainkey, grating);
00955         }
00956         KMO_TRY_CHECK_ERROR_STATE();
00957 
00958         /* --subkey */
00959         if (strcmp(subkey, "") != 0) {
00960             strcpy(psubkey, subkey);
00961         }
00962         KMO_TRY_CHECK_ERROR_STATE();
00963 
00964 //        if (strcmp(type, "DARK") == 0) {
00965             /* --mainkey */
00966             strcat(pmainkey, ";ESO DET SEQ1 MINDIT;double;");strcat(pmainkey, exptime_min);
00967             strcat(pmainkey, ";ESO DET NDIT;int;1");
00968             strcat(pmainkey, ";EXPTIME;double;");strcat(pmainkey, exptime_long);
00969             strcat(pmainkey, ";ESO DET READ CURNAME;string;Double");
00970 
00971             /* --subkey */
00972             if (strcmp(subkey, "") != 0) strcat(psubkey, ";");
00973             strcat(psubkey, "EXPTIME;double;");strcat(psubkey, exptime_long);
00974 //        }
00975 
00976         if (strcmp(type, "FLAT_ON") == 0) {
00977             /* --mainkey */
00978             strcat(pmainkey,";ESO INS LAMP3 ST;bool;1");
00979 //            strcat(pmainkey, "EXPTIME;double;");strcat(pmainkey, exptime_long);
00980 
00981             /* --subkey */
00982 //            if (strcmp(subkey, "") != 0)  strcat(psubkey, ";");
00983 //            strcat(psubkey, "EXPTIME;double;");strcat(psubkey, exptime_long);
00984         }
00985         KMO_TRY_CHECK_ERROR_STATE();
00986 
00987         if (strcmp(type, "ARC_ON") == 0)
00988         {
00989             strcat(pmainkey,";ESO INS LAMP1 ST;bool;1");
00990 //            strcat(pmainkey, "EXPTIME;double;");strcat(pmainkey, exptime_long);
00991 
00992             /* --subkey */
00993             if (strcmp(subkey, "") != 0)  strcat(psubkey, ";");
00994 //            strcat(psubkey, "EXPTIME;double;");strcat(psubkey, exptime_long);
00995         }
00996         KMO_TRY_CHECK_ERROR_STATE();
00997 
00998         if ((strcmp(type, "FLAT_OFF") == 0) ||
00999             (strcmp(type, "ARC_OFF") == 0)) {
01000             /* --mainkey */
01001 //            strcat(pmainkey, "EXPTIME;double;");strcat(pmainkey, exptime_long);
01002 
01003             /* --subkey */
01004             if (strcmp(subkey, "") != 0)  strcat(psubkey, ";");
01005 //            strcat(psubkey, "EXPTIME;double;");strcat(psubkey, exptime_long);
01006         }
01007         KMO_TRY_CHECK_ERROR_STATE();
01008 
01009         if ((strcmp(type, "SKY") == 0) ||
01010             (strcmp(type, "MASTER_FLAT") == 0) ||
01011             (strcmp(type, "STD") == 0) ||
01012             (strcmp(type, "GENERIC") == 0))
01013         {
01014             /* --mainkey */
01015             if (strcmp(type, "STD") == 0) {
01016                 // add DATE-OBS keyword
01017 //                strcat(pmainkey,";");
01018                 strcat(pmainkey,";DATE-OBS;string;");strcat(pmainkey, date);
01019 //                strcat(pmainkey, ";EXPTIME;double;");strcat(pmainkey, exptime_long);
01020 
01021                 // add ESO OCS ARMi TYPE keywords
01022                 objects = kmo_identify_values(objects_txt);
01023                 KMO_TRY_ASSURE(cpl_vector_get_size(objects) == KMOS_IFUS_PER_DETECTOR,
01024                                CPL_ERROR_ILLEGAL_INPUT,
01025                                "valid parameter must have 8 elements!");
01026 
01027                 for (int i = 0; i < cpl_vector_get_size(objects)*3; i++) {
01028                     strcat(pmainkey,";");
01029                     strcat(pmainkey,"ESO OCS ARM");
01030                     sprintf(tmp_str, "%d ", i+1);
01031                     strcat(pmainkey,tmp_str);
01032                     strcat(pmainkey,"TYPE;string;");
01033 
01034                     if (fabs(cpl_vector_get(objects, i%KMOS_IFUS_PER_DETECTOR)-1) > 0.01 ) {
01035                         // sky
01036                         strcat(pmainkey,"S");
01037                     } else {
01038                         //object
01039                         strcat(pmainkey,"O");
01040                     }
01041                 }
01042                 cpl_vector_delete(objects); objects = NULL;
01043             }
01044 //printf("----------\n");
01045 //printf("%s\n", pmainkey);
01046 //printf("----------\n");
01047 //            /* --subkey */
01048 //            if (strcmp(subkey, "") != 0) {
01049 //                strcat(psubkey, ";");
01050 //            }
01051 //            strcat(psubkey, ";EXPTIME;double;");
01052 //            strcat(psubkey, exptime_long);
01053         }
01054         KMO_TRY_CHECK_ERROR_STATE();
01055 
01056 // SETUP PARAMETERLIST
01057         plist = cpl_parameterlist_new();
01058 
01059         /* --valid */
01060         strcpy(pvalid, valid);
01061         strcat(pvalid, ";");
01062         strcat(pvalid, valid);
01063         strcat(pvalid, ";");
01064         strcat(pvalid, valid);
01065 
01066         p = cpl_parameter_new_value("kmos.kmo_fits_stack.valid",
01067                                     CPL_TYPE_STRING,
01068                                     "Optional: Specify which IFUs are active. "
01069                                     "Either empty string or string with 24 elements"
01070                                     " (ones or zeros) e.g: [1;0;1;0;0;...;1]",
01071                                     "kmos.kmo_fits_stack",
01072                                     pvalid);
01073         cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "valid");
01074         cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
01075         cpl_parameterlist_append(plist, p);
01076 
01077         if (strcmp(type, "MASTER_FLAT") != 0) {
01078             // all types except MASTER_FLAT
01079 
01080             /* --type (RAW, F1D, F2D, F1I, F2I, F3I) */
01081             p = cpl_parameter_new_value("kmos.kmo_fits_stack.type",
01082                                         CPL_TYPE_STRING,
01083                                         "The KMOS data format type (either \"RAW\", "
01084                                         "\"F1D\", \"F2D\", \"F1I\", \"F2I\", \"F3I\", "
01085                                         "\"F1S\", \"F1L\", \"F2L\")",
01086                                         "kmos.kmo_fits_stack",
01087                                         RAW);
01088             cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "type");
01089             cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
01090             cpl_parameterlist_append(plist, p);
01091             KMO_TRY_CHECK_ERROR_STATE();
01092 
01093             /* --mainkey */
01094             p = cpl_parameter_new_value("kmos.kmo_fits_stack.mainkey",
01095                                      CPL_TYPE_STRING,
01096                                      "Optional: Additional keywords for primary header",
01097                                      "kmos.kmo_fits_stack",
01098                                      pmainkey);
01099             cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "mainkey");
01100             cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
01101             cpl_parameterlist_append(plist, p);
01102 
01103             /* --subkey */
01104             p = cpl_parameter_new_value("kmos.kmo_fits_stack.subkey",
01105                                         CPL_TYPE_STRING,
01106                                         "Optional: Additional keywords for sub headers",
01107                                         "kmos.kmo_fits_stack",
01108                                         psubkey);
01109             cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "subkey");
01110             cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
01111             cpl_parameterlist_append(plist, p);
01112             KMO_TRY_CHECK_ERROR_STATE();
01113 
01114             // stack 1st
01115             KMO_TRY_EXIT_IF_NULL(
01116                 frset = dev_frameset("tmp_delete1.fits", "tmp_delete2.fits", "tmp_delete3.fits"));
01117             KMO_TRY_CHECK_ERROR_STATE();
01118 
01119             /* --filename */
01120             strcpy(pfilename, type);
01121             strcat(pfilename, "_123");
01122             p = cpl_parameter_new_value("kmos.kmo_fits_stack.filename",
01123                                         CPL_TYPE_STRING,
01124                                         "Optional: The output filename (.fits will be "
01125                                                                     "added as postfix)",
01126                                         "kmos.kmo_fits_stack",
01127                                         pfilename);
01128             cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "filename");
01129             cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
01130             cpl_parameterlist_append(plist, p);
01131 
01132             kmo_priv_fits_stack(plist, frset);
01133             KMO_TRY_CHECK_ERROR_STATE();
01134             cpl_frameset_delete(frset); frset = NULL;
01135 
01136             if ((strcmp(type, "DARK") == 0) ||
01137                 (strcmp(type, "FLAT_ON") == 0) ||
01138                 (strcmp(type, "FLAT_OFF") == 0) ||
01139                 (strcmp(type, "SKY") == 0))
01140             {
01141                 // stack 2nd
01142                 KMO_TRY_EXIT_IF_NULL(
01143                     frset = dev_frameset("tmp_delete2.fits", "tmp_delete3.fits", "tmp_delete1.fits"));
01144                 strcpy(pfilename, type);
01145                 strcat(pfilename, "_231");
01146                 KMO_TRY_EXIT_IF_NULL(
01147                     p = cpl_parameterlist_find(plist, "kmos.kmo_fits_stack.filename"));
01148                 KMO_TRY_EXIT_IF_ERROR(
01149                     cpl_parameter_set_string(p, pfilename));
01150 
01151                 kmo_priv_fits_stack(plist, frset);
01152                 KMO_TRY_CHECK_ERROR_STATE();
01153                 cpl_frameset_delete(frset); frset = NULL;
01154 
01155                 // stack 3rd
01156                 KMO_TRY_EXIT_IF_NULL(
01157                     frset = dev_frameset("tmp_delete3.fits", "tmp_delete1.fits", "tmp_delete2.fits"));
01158                 strcpy(pfilename, type);
01159                 strcat(pfilename, "_312");
01160                 KMO_TRY_EXIT_IF_NULL(
01161                     p = cpl_parameterlist_find(plist, "kmos.kmo_fits_stack.filename"));
01162                 KMO_TRY_EXIT_IF_ERROR(
01163                     cpl_parameter_set_string(p, pfilename));
01164 
01165                 kmo_priv_fits_stack(plist, frset);
01166                 KMO_TRY_CHECK_ERROR_STATE();
01167                 cpl_frameset_delete(frset); frset = NULL;
01168             }
01169         } else{
01170             /* --type (RAW, F1D, F2D, F1I, F2I, F3I) */
01171             p = cpl_parameter_new_value("kmos.kmo_fits_stack.type",
01172                                         CPL_TYPE_STRING,
01173                                         "The KMOS data format type (either \"RAW\", "
01174                                         "\"F1D\", \"F2D\", \"F1I\", \"F2I\", \"F3I\", "
01175                                         "\"F1S\", \"F1L\", \"F2L\")",
01176                                         "kmos.kmo_fits_stack",
01177                                         F2D);
01178             cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "type");
01179             cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
01180             cpl_parameterlist_append(plist, p);
01181             KMO_TRY_CHECK_ERROR_STATE();
01182 
01183             /* --mainkey */
01184             p = cpl_parameter_new_value("kmos.kmo_fits_stack.mainkey",
01185                                      CPL_TYPE_STRING,
01186                                      "Optional: Additional keywords for primary header",
01187                                      "kmos.kmo_fits_stack",
01188                                      pmainkey);
01189             cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "mainkey");
01190             cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
01191             cpl_parameterlist_append(plist, p);
01192 
01193             /* --subkey */
01194             p = cpl_parameter_new_value("kmos.kmo_fits_stack.subkey",
01195                                         CPL_TYPE_STRING,
01196                                         "Optional: Additional keywords for sub headers",
01197                                         "kmos.kmo_fits_stack",
01198                                         psubkey);
01199             cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "subkey");
01200             cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
01201             cpl_parameterlist_append(plist, p);
01202             KMO_TRY_CHECK_ERROR_STATE();
01203 
01204             /* --filename */
01205             strcpy(pfilename, "master_flat_ones");
01206             p = cpl_parameter_new_value("kmos.kmo_fits_stack.filename",
01207                                         CPL_TYPE_STRING,
01208                                         "Optional: The output filename (.fits will be "
01209                                                                     "added as postfix)",
01210                                         "kmos.kmo_fits_stack",
01211                                         pfilename);
01212             cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "filename");
01213             cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
01214             cpl_parameterlist_append(plist, p);
01215 
01216             KMO_TRY_EXIT_IF_NULL(
01217                 frset = dev_frameset_master(cpl_frame_get_filename(frame)));
01218             KMO_TRY_CHECK_ERROR_STATE();
01219 
01220             kmo_priv_fits_stack(plist, frset);
01221             KMO_TRY_CHECK_ERROR_STATE();
01222             cpl_frameset_delete(frset); frset = NULL;
01223         }
01224 
01225         KMO_TRY_CHECK_ERROR_STATE();
01226         cpl_msg_info("", "*******************************************");
01227         cpl_msg_info("", "Saved a set of KMOS frames for recipe %s.", type );
01228         cpl_msg_info("", "*******************************************");
01229     }
01230     KMO_CATCH
01231     {
01232         KMO_CATCH_MSG();
01233         ret_val = -1;
01234     }
01235 
01236     cpl_image_delete(img1); img1 = NULL;
01237     cpl_parameterlist_delete(plist); plist = NULL;
01238 
01239     return ret_val;
01240 }
01241