38 #include "irplib_utils.h"
40 #include "isaac_utils.h"
41 #include "isaac_pfits.h"
42 #include "isaac_dfs.h"
48 static int isaac_util_genlines_create(cpl_plugin *);
49 static int isaac_util_genlines_exec(cpl_plugin *);
50 static int isaac_util_genlines_destroy(cpl_plugin *);
51 static int isaac_util_genlines(cpl_parameterlist *, cpl_frameset *);
52 static int isaac_util_genlines_save(cpl_table *, cpl_parameterlist *,
66 } isaac_util_genlines_config;
68 static char isaac_util_genlines_description[] =
69 "This recipe is used to generate spectrum calibration tables.\n"
70 "The sof file contains the names of the input ASCII file\n"
71 "tagged with "ISAAC_UTIL_GENLINES_RAW
".\n"
72 "The ASCII file must contain two columns:\n"
73 "1st: Wavelengths in increasing order (the unit is corrected by\n"
74 " the factor option to obtain nanometers).\n"
75 "2nd: The atmospheric emission.\n"
76 "The ASCII files are in the catalogs/ directory of the ISAAC distribution.\n"
77 "This recipe produces 1 file:\n"
78 "First product: the table with the lines.\n"
79 " (PRO CATG = "ISAAC_UTIL_GENLINES_OH_CAT
") or\n"
80 " (PRO CATG = "ISAAC_UTIL_GENLINES_XE_CAT
") or\n"
81 " (PRO CATG = "ISAAC_UTIL_GENLINES_AR_CAT
")\n";
96 int cpl_plugin_get_info(cpl_pluginlist * list)
98 cpl_recipe * recipe = cpl_calloc(1,
sizeof(*recipe));
99 cpl_plugin * plugin = &recipe->interface;
101 cpl_plugin_init(plugin,
103 ISAAC_BINARY_VERSION,
104 CPL_PLUGIN_TYPE_RECIPE,
105 "isaac_util_genlines",
106 "Generate spectrum calibration FITS tables",
107 isaac_util_genlines_description,
111 isaac_util_genlines_create,
112 isaac_util_genlines_exec,
113 isaac_util_genlines_destroy);
115 cpl_pluginlist_append(list, plugin);
130 static int isaac_util_genlines_create(cpl_plugin * plugin)
136 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
137 recipe = (cpl_recipe *)plugin;
138 else return CPL_ERROR_UNSPECIFIED;
141 recipe->parameters = cpl_parameterlist_new();
145 p = cpl_parameter_new_value(
"isaac.isaac_util_genlines.fill_blanks",
146 CPL_TYPE_BOOL,
"flag to fill blanks",
"isaac.isaac_util_genlines",
148 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"fill_blanks");
149 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
150 cpl_parameterlist_append(recipe->parameters, p);
152 p = cpl_parameter_new_value(
"isaac.isaac_util_genlines.display",
153 CPL_TYPE_BOOL,
"flag to plot",
"isaac.isaac_util_genlines",
155 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"display");
156 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
157 cpl_parameterlist_append(recipe->parameters, p);
159 p = cpl_parameter_new_value(
"isaac.isaac_util_genlines.mode",
160 CPL_TYPE_INT,
"1-OH, 2-XE, 3-AR",
161 "isaac.isaac_util_genlines", 1);
162 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"mode");
163 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
164 cpl_parameterlist_append(recipe->parameters, p);
166 p = cpl_parameter_new_value(
"isaac.isaac_util_genlines.wl_factor",
167 CPL_TYPE_DOUBLE,
"The factor used to multiply the wl",
168 "isaac.isaac_util_genlines", 1.0);
169 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"wl_factor");
170 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
171 cpl_parameterlist_append(recipe->parameters, p);
183 static int isaac_util_genlines_exec(cpl_plugin * plugin)
188 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
189 recipe = (cpl_recipe *)plugin;
190 else return CPL_ERROR_UNSPECIFIED;
192 return isaac_util_genlines(recipe->parameters, recipe->frames);
202 static int isaac_util_genlines_destroy(cpl_plugin * plugin)
207 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
208 recipe = (cpl_recipe *)plugin;
209 else return CPL_ERROR_UNSPECIFIED;
211 cpl_parameterlist_delete(recipe->parameters);
225 static int isaac_util_genlines(
226 cpl_parameterlist * parlist,
227 cpl_frameset * framelist)
229 cpl_bivector * bivec;
232 cpl_bivector * bivec_fill;
233 double * pbivec_fill_x;
234 double * pbivec_fill_y;
235 cpl_frame * cur_frame;
236 int nvals, nb_new_vals;
247 par = cpl_parameterlist_find(parlist,
248 "isaac.isaac_util_genlines.fill_blanks");
249 isaac_util_genlines_config.fill_blanks = cpl_parameter_get_bool(par);
251 par = cpl_parameterlist_find(parlist,
"isaac.isaac_util_genlines.display");
252 isaac_util_genlines_config.display = cpl_parameter_get_bool(par);
254 par = cpl_parameterlist_find(parlist,
"isaac.isaac_util_genlines.mode");
255 isaac_util_genlines_config.mode = cpl_parameter_get_int(par);
257 par=cpl_parameterlist_find(parlist,
"isaac.isaac_util_genlines.wl_factor");
258 isaac_util_genlines_config.wl_factor = cpl_parameter_get_double(par);
262 cpl_msg_error(cpl_func,
"Cannot identify RAW and CALIB frames");
263 return CPL_ERROR_UNSPECIFIED;
267 cur_frame = cpl_frameset_get_position(framelist, 0);
268 if ((bivec=cpl_bivector_read(cpl_frame_get_filename(cur_frame)))==NULL) {
269 cpl_msg_error(cpl_func,
"Cannot load the file in the bivector");
270 return CPL_ERROR_UNSPECIFIED;
272 nvals = cpl_bivector_get_size(bivec);
275 if (isaac_util_genlines_config.fill_blanks) {
276 nb_new_vals = 3 * nvals;
277 bivec_fill = cpl_bivector_new(nb_new_vals);
278 pbivec_fill_x = cpl_bivector_get_x_data(bivec_fill);
279 pbivec_fill_y = cpl_bivector_get_y_data(bivec_fill);
280 pbivec_x = cpl_bivector_get_x_data(bivec);
281 pbivec_y = cpl_bivector_get_y_data(bivec);
282 for (i=0; i<nvals; i++) {
283 wavel = pbivec_x[i] * isaac_util_genlines_config.wl_factor;
284 pbivec_fill_x[3*i] = wavel - 0.01;
285 pbivec_fill_y[3*i] = 0.0;
286 pbivec_fill_x[3*i+1] = wavel;
287 pbivec_fill_y[3*i+1] = pbivec_y[i];
288 pbivec_fill_x[3*i+2] = wavel + 0.01;
289 pbivec_fill_y[3*i+2] = 0.0;
291 cpl_bivector_delete(bivec);
294 nvals = cpl_bivector_get_size(bivec);
296 cpl_vector_multiply_scalar(cpl_bivector_get_x(bivec),
297 isaac_util_genlines_config.wl_factor);
301 if (isaac_util_genlines_config.display) {
303 "set grid;set xlabel 'Wavelength (A)';set ylabel 'Emission';",
304 "t 'Catalog lines' w lines",
"", bivec);
308 tab = cpl_table_new(nvals);
309 cpl_table_wrap_double(tab, cpl_bivector_get_x_data(bivec),
310 ISAAC_COL_WAVELENGTH);
311 cpl_table_wrap_double(tab, cpl_bivector_get_y_data(bivec),
315 cpl_msg_info(cpl_func,
"Saving the table with %d rows", nvals);
316 if (isaac_util_genlines_save(tab, parlist, framelist) == -1) {
317 cpl_msg_error(cpl_func,
"Cannot write the table");
318 cpl_bivector_delete(bivec);
319 cpl_table_unwrap(tab, ISAAC_COL_WAVELENGTH);
320 cpl_table_unwrap(tab, ISAAC_COL_EMISSION);
321 cpl_table_delete(tab);
322 return CPL_ERROR_UNSPECIFIED;
324 cpl_bivector_delete(bivec);
325 cpl_table_unwrap(tab, ISAAC_COL_WAVELENGTH);
326 cpl_table_unwrap(tab, ISAAC_COL_EMISSION);
327 cpl_table_delete(tab);
340 static int isaac_util_genlines_save(
341 cpl_table * out_table,
342 cpl_parameterlist * parlist,
346 cpl_propertylist * plist;
347 cpl_frame * product_frame;
350 sprintf(name_o,
"isaac_util_genlines_save.fits");
351 cpl_msg_info(cpl_func,
"Writing %s" , name_o);
354 plist = cpl_propertylist_new();
355 cpl_propertylist_append_string(plist,
"INSTRUME",
"ISAAC");
358 product_frame = cpl_frame_new();
359 cpl_frame_set_filename(product_frame, name_o);
360 if (isaac_util_genlines_config.mode == 1)
361 cpl_frame_set_tag(product_frame, ISAAC_UTIL_GENLINES_OH_CAT);
362 else if (isaac_util_genlines_config.mode == 2)
363 cpl_frame_set_tag(product_frame, ISAAC_UTIL_GENLINES_XE_CAT);
364 else if (isaac_util_genlines_config.mode == 3)
365 cpl_frame_set_tag(product_frame, ISAAC_UTIL_GENLINES_AR_CAT);
367 cpl_frame_set_tag(product_frame,
"UNKNOWN");
369 cpl_frame_set_type(product_frame, CPL_FRAME_TYPE_TABLE);
370 cpl_frame_set_group(product_frame, CPL_FRAME_GROUP_PRODUCT);
371 cpl_frame_set_level(product_frame, CPL_FRAME_LEVEL_FINAL);
374 if (cpl_dfs_setup_product_header(plist, product_frame, set, parlist,
375 "isaac_util_genlines", PACKAGE
"/" PACKAGE_VERSION,
376 "PRO-1.15", NULL)!=CPL_ERROR_NONE) {
377 cpl_msg_warning(cpl_func,
"Problem in the product DFS-compliance");
382 if (cpl_table_save(out_table, plist, NULL, name_o,
383 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
384 cpl_msg_error(cpl_func,
"Cannot save the product");
385 cpl_frame_delete(product_frame);
386 cpl_propertylist_delete(plist);
387 return CPL_ERROR_UNSPECIFIED;
389 cpl_propertylist_delete(plist);
392 cpl_frameset_insert(set, product_frame);
int isaac_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
const char * isaac_get_license(void)
Get the pipeline copyright and license.