33#include "cr2res_pfits.h"
34#include "cr2res_dfs.h"
36#include "cr2res_splice.h"
42#define RECIPE_STRING "cr2res_util_splice"
48int cpl_plugin_get_info(cpl_pluginlist * list);
54static int cr2res_util_splice_create(cpl_plugin *);
55static int cr2res_util_splice_exec(cpl_plugin *);
56static int cr2res_util_splice_destroy(cpl_plugin *);
57static int cr2res_util_splice(cpl_frameset *,
const cpl_parameterlist *);
63static char cr2res_util_splice_description[] =
"\
64Continuum normalization and splicing together spectra. \n\
68 blaze.fits " CR2RES_CAL_FLAT_EXTRACT_1D_PROCATG
" [1] \n\
69 trace.fits " CR2RES_CAL_FLAT_TW_PROCATG
" [1] \n\
70 or " CR2RES_CAL_FLAT_TW_MERGED_PROCATG
" \n\
71 or " CR2RES_UTIL_TRACE_TW_PROCATG
" \n\
72 or " CR2RES_UTIL_WAVE_TW_PROCATG
" \n\
73 or " CR2RES_CAL_WAVE_TW_PROCATG
" \n\
74 or " CR2RES_UTIL_SLIT_CURV_TW_PROCATG
" \n\
75 extracted.fits " CR2RES_UTIL_EXTRACT_1D_PROCATG
" [1] \n\
81 Library functions used: \n\
99int cpl_plugin_get_info(cpl_pluginlist * list)
101 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
102 cpl_plugin * plugin = &recipe->interface;
104 if (cpl_plugin_init(plugin,
106 CR2RES_BINARY_VERSION,
107 CPL_PLUGIN_TYPE_RECIPE,
110 cr2res_util_splice_description,
111 CR2RES_PIPELINE_AUTHORS,
114 cr2res_util_splice_create,
115 cr2res_util_splice_exec,
116 cr2res_util_splice_destroy)) {
117 cpl_msg_error(cpl_func,
"Plugin initialization failed");
118 (void)cpl_error_set_where(cpl_func);
122 if (cpl_pluginlist_append(list, plugin)) {
123 cpl_msg_error(cpl_func,
"Error adding plugin to list");
124 (void)cpl_error_set_where(cpl_func);
140static int cr2res_util_splice_create(cpl_plugin * plugin)
146 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
147 recipe = (cpl_recipe *)plugin;
152 recipe->parameters = cpl_parameterlist_new();
155 p = cpl_parameter_new_value(
"cr2res.cr2res_util_splice.detector",
156 CPL_TYPE_INT,
"Only reduce the specified detector",
157 "cr2res.cr2res_util_splice", 0);
158 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"detector");
159 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
160 cpl_parameterlist_append(recipe->parameters, p);
172static int cr2res_util_splice_exec(cpl_plugin * plugin)
177 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
178 recipe = (cpl_recipe *)plugin;
181 return cr2res_util_splice(recipe->frames, recipe->parameters);
191static int cr2res_util_splice_destroy(cpl_plugin * plugin)
196 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
197 recipe = (cpl_recipe *)plugin;
200 cpl_parameterlist_delete(recipe->parameters);
212static int cr2res_util_splice(
213 cpl_frameset * frameset,
214 const cpl_parameterlist * parlist)
216 cpl_frameset * trace_fset ;
217 cpl_frameset * extracted_fset ;
218 cpl_frameset * blaze_fset ;
219 const char * trace_file ;
220 const char * extracted_file ;
221 const char * blaze_file ;
222 cpl_table * trace_table ;
223 cpl_table * extracted_table ;
224 cpl_table * blaze_table ;
225 cpl_table ** trace_tables ;
226 cpl_table ** blaze_tables ;
227 cpl_table ** extracted_tables ;
228 cpl_bivector * spliced ;
229 cpl_bivector * spliced_err ;
230 cpl_table * spliced_table ;
232 cpl_size nframes, i ;
233 int ext_nr_trace, ext_nr_blaze, ext_nr_extracted,
242 cpl_msg_error(__func__,
"Cannot identify RAW and CALIB frames") ;
243 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
250 CR2RES_UTIL_EXTRACT_1D_PROCATG) ;
252 CR2RES_CAL_FLAT_EXTRACT_1D_PROCATG) ;
255 if (trace_fset==NULL || extracted_fset==NULL || blaze_fset==NULL) {
256 cpl_msg_error(__func__,
"Missing Inputs") ;
257 if (trace_fset != NULL) cpl_frameset_delete(trace_fset) ;
258 if (extracted_fset != NULL) cpl_frameset_delete(extracted_fset) ;
259 if (blaze_fset != NULL) cpl_frameset_delete(blaze_fset) ;
262 nframes = cpl_frameset_get_size(trace_fset) ;
263 if (cpl_frameset_get_size(extracted_fset) != nframes ||
264 cpl_frameset_get_size(blaze_fset) != nframes) {
265 cpl_msg_error(__func__,
"Inconsistent Inputs") ;
266 cpl_frameset_delete(trace_fset) ;
267 cpl_frameset_delete(extracted_fset) ;
268 cpl_frameset_delete(blaze_fset) ;
273 cpl_msg_error(__func__,
"No valid frames could be found") ;
274 cpl_frameset_delete(trace_fset) ;
275 cpl_frameset_delete(extracted_fset) ;
276 cpl_frameset_delete(blaze_fset) ;
280 cpl_msg_info(__func__,
281 "Detected %"CPL_SIZE_FORMAT
" BLAZE/EXTRACTED/TRACE triplet(s)",
288 for (i=0 ; i<nframes; i++) {
291 trace_file = cpl_frame_get_filename(
292 cpl_frameset_get_position(trace_fset, i)) ;
293 extracted_file = cpl_frame_get_filename(
294 cpl_frameset_get_position(extracted_fset, i)) ;
295 blaze_file = cpl_frame_get_filename(
296 cpl_frameset_get_position(blaze_fset, i)) ;
299 for (det_nr=1 ; det_nr<=CR2RES_NB_DETECTORS ; det_nr++) {
308 if (ext_nr_trace<0 || ext_nr_extracted<0 || ext_nr_blaze<0)
317 if (trace_table != NULL && blaze_table != NULL &&
318 extracted_table != NULL) {
324 if (trace_table!= NULL) cpl_table_delete(trace_table);
325 if (blaze_table!= NULL) cpl_table_delete(blaze_table);
326 if (extracted_table!= NULL) cpl_table_delete(extracted_table);
331 cpl_msg_error(__func__,
"No valid data could be found") ;
332 cpl_frameset_delete(trace_fset) ;
333 cpl_frameset_delete(extracted_fset) ;
334 cpl_frameset_delete(blaze_fset) ;
338 cpl_msg_info(__func__,
"Loading %d Detector(s) for splicing", nb_det) ;
341 blaze_tables = cpl_malloc(nb_det *
sizeof(cpl_table*)) ;
342 extracted_tables = cpl_malloc(nb_det *
sizeof(cpl_table*)) ;
343 trace_tables = cpl_malloc(nb_det *
sizeof(cpl_table*)) ;
348 for (i=0 ; i<nframes; i++) {
350 trace_file = cpl_frame_get_filename(
351 cpl_frameset_get_position(trace_fset, i)) ;
352 extracted_file = cpl_frame_get_filename(
353 cpl_frameset_get_position(extracted_fset, i)) ;
354 blaze_file = cpl_frame_get_filename(
355 cpl_frameset_get_position(blaze_fset, i)) ;
358 for (det_nr=1 ; det_nr<=CR2RES_NB_DETECTORS ; det_nr++) {
366 if (ext_nr_trace<0 || ext_nr_extracted<0 || ext_nr_blaze<0)
375 if (trace_table!=NULL && blaze_table!=NULL &&
376 extracted_table!=NULL) {
377 trace_tables[nb_det] = trace_table;
378 extracted_tables[nb_det] = extracted_table;
379 blaze_tables[nb_det] = blaze_table;
383 if (trace_table!= NULL) cpl_table_delete(trace_table);
384 if (blaze_table!= NULL) cpl_table_delete(blaze_table);
385 if (extracted_table!= NULL) cpl_table_delete(extracted_table);
389 cpl_frameset_delete(trace_fset) ;
390 cpl_frameset_delete(blaze_fset) ;
394 ret = cr2res_splice(extracted_tables, blaze_tables, trace_tables,
395 nb_det, &spliced, &spliced_err) ;
399 for (i=0 ; i<nb_det ; i++) {
400 cpl_table_delete(blaze_tables[i]) ;
401 cpl_table_delete(extracted_tables[i]) ;
402 cpl_table_delete(trace_tables[i]) ;
404 cpl_free(blaze_tables) ;
405 cpl_free(extracted_tables) ;
406 cpl_free(trace_tables) ;
409 cpl_msg_error(__func__,
"Splicing Error");
410 spliced_table = NULL ;
413 spliced_table = cr2res_splice_SPLICED_1D_create(spliced, spliced_err) ;
416 cpl_bivector_delete(spliced) ;
417 cpl_bivector_delete(spliced_err) ;
420 if (spliced_table == NULL) {
421 cpl_msg_error(__func__,
"Failed to create the SPLICED table");
424 cpl_propertylist *ext_plist;
426 extracted_file = cpl_frame_get_filename(
427 cpl_frameset_get_position(extracted_fset, 0)) ;
428 ext_plist = cpl_propertylist_load(extracted_file, 1) ;
429 out_file = cpl_sprintf(
"%s_spliced.fits",
432 spliced_table, NULL, ext_plist,
433 CR2RES_UTIL_SPLICE_SPLICED_1D_PROCATG, RECIPE_STRING) ;
435 cpl_propertylist_delete(ext_plist);
436 cpl_table_delete(spliced_table) ;
441 cpl_frameset_delete(extracted_fset) ;
442 return (
int)cpl_error_get_code();
cpl_error_code cr2res_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
cpl_table * cr2res_io_load_EXTRACT_1D(const char *filename, int detector)
Load a table from a EXTRACT_1D.
int cr2res_io_save_SPLICED_1D(const char *filename, cpl_frameset *allframes, cpl_frameset *inframes, const cpl_parameterlist *parlist, cpl_table *spliced_1d, const cpl_propertylist *qc_list, cpl_propertylist *ext_plist, const char *procatg, const char *recipe)
Save a SPLICED_1D.
cpl_frameset * cr2res_io_find_TRACE_WAVE_all(const cpl_frameset *in)
Get the CR2RES_TW_DRSTYPE frames from a frameset.
int cr2res_io_get_ext_idx(const char *filename, int detector, int data)
Get the wished extension number for a detector.
cpl_table * cr2res_io_load_TRACE_WAVE(const char *filename, int detector)
Load a table from a TRACE_WAVE.
char * cr2res_get_root_name(const char *filename)
Find out the root part of a basename (name without extension).
cpl_frameset * cr2res_extract_frameset(const cpl_frameset *in, const char *tag)
Extract the frames with the given tag from a frameset.
char * cr2res_get_base_name(const char *filename)
Find out the base name of a file (i.e. without prefix path)
const char * cr2res_get_license(void)
Get the pipeline copyright and license.