00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031
00032
00033
00034
00035
00036
00037 #include <cpl.h>
00038 #include <math.h>
00039
00040 #include "crires_utils.h"
00041 #include "crires_pfits.h"
00042 #include "crires_dfs.h"
00043 #include "crires_model_computation.h"
00044
00045
00046
00047
00048
00049 static int crires_test_model_compute_create(cpl_plugin *) ;
00050 static int crires_test_model_compute_exec(cpl_plugin *) ;
00051 static int crires_test_model_compute_destroy(cpl_plugin *) ;
00052 static int crires_test_model_compute(cpl_parameterlist *, cpl_frameset *) ;
00053
00054
00055
00056
00057
00058 static struct {
00059 int order_calc_flag ;
00060 int order_out_flag ;
00061 int trace_out_flag ;
00062 int is_out_flag ;
00063 int back_map_flag ;
00064 int continuum ;
00065 int morder ;
00066 double flux_scale ;
00067 double spotsize ;
00068 } crires_test_model_compute_config ;
00069
00070 static char crires_test_model_compute_description[] =
00071 " This recipe uses a specified physical model configuration\n (model-cfg.fits in the sof, see below), to generate a variety of\n simulated datasets. There are three principle tasks that may be\n performed with this recipe:\n1. Generate a 2D simulated image of a calibration emission lamp and\n write it to the FITS file <chips_out.fits>. Statistics are also\n written to the ascii file <centres.dat>. The calibration source\n line list should be a FITS table with two columns: wavelength(nm);\n relative intensity. This is the line-list.fits wile in the sof (see\n below).\n2. Generate a wavelength map and write to FITS. This is now superseded\n by the crires_model_wlmap recipe.\n3. Trace the locus of the spectrum for a given instrument\n configuration (see the crires_model_profile function above) and\n write the result to the ascii file <trace.dat>\nThe files listed in the Set Of Frames (sof-file) must be tagged:\n model-cfg.fits CRIRES_MODEL_CONFIG\n line-list.fits CRIRES_MODEL_WAVE_EG\n";
00072
00073
00074
00075
00076
00077
00086
00087 int cpl_plugin_get_info(cpl_pluginlist * list)
00088 {
00089 cpl_recipe * recipe = cpl_calloc(1, sizeof *recipe ) ;
00090 cpl_plugin * plugin = &recipe->interface ;
00091
00092 cpl_plugin_init(plugin,
00093 CPL_PLUGIN_API,
00094 CRIRES_BINARY_VERSION,
00095 CPL_PLUGIN_TYPE_RECIPE,
00096 "crires_test_model_compute",
00097 "Compute detector locations for given wavelength and cfg",
00098 crires_test_model_compute_description,
00099 "Paul Bristow",
00100 "bristowp@eso.org",
00101 crires_get_license(),
00102 crires_test_model_compute_create,
00103 crires_test_model_compute_exec,
00104 crires_test_model_compute_destroy) ;
00105
00106 cpl_pluginlist_append(list, plugin) ;
00107
00108 return 0;
00109 }
00110
00111
00119
00120 static int crires_test_model_compute_create(cpl_plugin * plugin)
00121 {
00122 cpl_recipe * recipe ;
00123 cpl_parameter * p ;
00124
00125
00126 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00127 recipe = (cpl_recipe *)plugin ;
00128 else return -1 ;
00129
00130
00131 recipe->parameters = cpl_parameterlist_new() ;
00132
00133
00134
00135 p = cpl_parameter_new_value("crires.crires_test_model_compute.order_calc",
00136 CPL_TYPE_BOOL,"order_calc flag","crires.crires_test_model_compute",
00137 FALSE);
00138 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "order_calc") ;
00139 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV) ;
00140 cpl_parameterlist_append(recipe->parameters, p) ;
00141
00142 p = cpl_parameter_new_value("crires.crires_test_model_compute.order_out",
00143 CPL_TYPE_BOOL,"order_out flag","crires.crires_test_model_compute",FALSE);
00144 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "order_out") ;
00145 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV) ;
00146 cpl_parameterlist_append(recipe->parameters, p) ;
00147
00148 p = cpl_parameter_new_value("crires.crires_test_model_compute.trace_out",
00149 CPL_TYPE_BOOL,"trace_out flag","crires.crires_test_model_compute",FALSE);
00150 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "trace_out") ;
00151 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV) ;
00152 cpl_parameterlist_append(recipe->parameters, p) ;
00153
00154 p = cpl_parameter_new_value("crires.crires_test_model_compute.is_out",
00155 CPL_TYPE_BOOL, "is_out flag", "crires.crires_test_model_compute", FALSE);
00156 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "is_out") ;
00157 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV) ;
00158 cpl_parameterlist_append(recipe->parameters, p) ;
00159
00160 p = cpl_parameter_new_value("crires.crires_test_model_compute.back_map",
00161 CPL_TYPE_BOOL, "back_map flag","crires.crires_test_model_compute",FALSE);
00162 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "back_map") ;
00163 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV) ;
00164 cpl_parameterlist_append(recipe->parameters, p) ;
00165
00166 p = cpl_parameter_new_value("crires.crires_test_model_compute.continuum",
00167 CPL_TYPE_INT, "continuum", "crires.crires_test_model_compute", 0);
00168 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "continuum") ;
00169 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV) ;
00170 cpl_parameterlist_append(recipe->parameters, p) ;
00171
00172 p = cpl_parameter_new_value("crires.crires_test_model_compute.morder",
00173 CPL_TYPE_INT, "morder", "crires.crires_test_model_compute", 31);
00174 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "morder") ;
00175 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV) ;
00176 cpl_parameterlist_append(recipe->parameters, p) ;
00177
00178 p = cpl_parameter_new_value("crires.crires_test_model_compute.flux_scale",
00179 CPL_TYPE_DOUBLE, "flux_scale", "crires.crires_test_model_compute",100.0);
00180 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "flux_scale") ;
00181 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV) ;
00182 cpl_parameterlist_append(recipe->parameters, p) ;
00183
00184 p = cpl_parameter_new_value("crires.crires_test_model_compute.spotsize",
00185 CPL_TYPE_DOUBLE, "spotsize", "crires.crires_test_model_compute", 0.025);
00186 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "spotsize") ;
00187 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV) ;
00188 cpl_parameterlist_append(recipe->parameters, p) ;
00189
00190
00191 return 0;
00192 }
00193
00194
00200
00201 static int crires_test_model_compute_exec(cpl_plugin * plugin)
00202 {
00203 cpl_recipe * recipe ;
00204
00205
00206 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00207 recipe = (cpl_recipe *)plugin ;
00208 else return -1 ;
00209
00210 return crires_test_model_compute(recipe->parameters, recipe->frames) ;
00211 }
00212
00213
00219
00220 static int crires_test_model_compute_destroy(cpl_plugin * plugin)
00221 {
00222 cpl_recipe * recipe ;
00223
00224
00225 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00226 recipe = (cpl_recipe *)plugin ;
00227 else return -1 ;
00228
00229 cpl_parameterlist_delete(recipe->parameters) ;
00230 return 0 ;
00231 }
00232
00233
00240
00241 static int crires_test_model_compute(
00242 cpl_parameterlist * parlist,
00243 cpl_frameset * frameset)
00244 {
00245 cpl_parameter * par ;
00246 cpl_frame * cri_config ;
00247 cpl_frame * wave_eg ;
00248
00249
00250
00251 par = cpl_parameterlist_find(parlist,
00252 "crires.crires_test_model_compute.order_calc");
00253 crires_test_model_compute_config.order_calc_flag = cpl_parameter_get_bool(par) ;
00254
00255 par = cpl_parameterlist_find(parlist,
00256 "crires.crires_test_model_compute.order_out");
00257 crires_test_model_compute_config.order_out_flag = cpl_parameter_get_bool(par) ;
00258
00259 par = cpl_parameterlist_find(parlist,
00260 "crires.crires_test_model_compute.trace_out");
00261 crires_test_model_compute_config.trace_out_flag = cpl_parameter_get_bool(par) ;
00262
00263 par = cpl_parameterlist_find(parlist, "crires.crires_test_model_compute.is_out");
00264 crires_test_model_compute_config.is_out_flag = cpl_parameter_get_bool(par) ;
00265
00266 par = cpl_parameterlist_find(parlist,
00267 "crires.crires_test_model_compute.back_map");
00268 crires_test_model_compute_config.back_map_flag = cpl_parameter_get_bool(par) ;
00269
00270 par = cpl_parameterlist_find(parlist,
00271 "crires.crires_test_model_compute.continuum");
00272 crires_test_model_compute_config.continuum = cpl_parameter_get_int(par) ;
00273
00274 par = cpl_parameterlist_find(parlist,
00275 "crires.crires_test_model_compute.morder");
00276 crires_test_model_compute_config.morder = cpl_parameter_get_int(par) ;
00277
00278 par = cpl_parameterlist_find(parlist,
00279 "crires.crires_test_model_compute.flux_scale");
00280 crires_test_model_compute_config.flux_scale = cpl_parameter_get_double(par) ;
00281
00282 par = cpl_parameterlist_find(parlist,
00283 "crires.crires_test_model_compute.spotsize");
00284 crires_test_model_compute_config.spotsize = cpl_parameter_get_double(par) ;
00285
00286
00287 if (crires_dfs_set_groups(frameset, NULL)) {
00288 cpl_msg_error(__func__, "Cannot identify RAW and CALIB frames") ;
00289 return -1 ;
00290 }
00291
00292
00293 cri_config = cpl_frameset_find(frameset, CRIRES_CALPRO_MODEL_CONFIG) ;
00294 wave_eg = cpl_frameset_find(frameset, CRIRES_CALPRO_MODEL_WAVEEG) ;
00295
00296
00297 if (crires_model_computation(cpl_frame_get_filename(cri_config),
00298 cpl_frame_get_filename(wave_eg),
00299 crires_test_model_compute_config.order_calc_flag,
00300 crires_test_model_compute_config.order_out_flag,
00301 crires_test_model_compute_config.trace_out_flag,
00302 crires_test_model_compute_config.is_out_flag,
00303 crires_test_model_compute_config.back_map_flag,
00304 crires_test_model_compute_config.continuum,
00305 crires_test_model_compute_config.morder,
00306 crires_test_model_compute_config.flux_scale,
00307 crires_test_model_compute_config.spotsize) == -1) {
00308 cpl_msg_error(__func__, "Failed computing the model") ;
00309 return -1 ;
00310 }
00311
00312
00313 if (cpl_error_get_code())
00314 return -1 ;
00315 else
00316 return 0 ;
00317 }
00318