35 #include "muse_ampl_z.h" 69 static const char *muse_ampl_help =
70 "This recipe combines several separate amplifier images (flat-fields with special FITS headers containing pico amplifier measurements) into one master image file and computes the instrumental throughput per IFU (and slice). Processing trims the raw data and records the overscan statistics, subtracts the bias (taking account of the overscan, if overscan is not \"none\"), and optionally, the dark from each raw input image, converts them from adu to count, scales them according to their exposure time, and combines them using input parameters. To compute the throughput the image is converted into a pixel table, the flux is then integrated over the given filter band, and the ratio of the expected flux (FITS header INS.AMPL2.CURR) to measured flux is taken, in the same units. If a geometry table was given as input, the relative area of the IFUs is taken into account when computing the flux per unit area. The resulting ratio is the instrument efficiency (throughput) and saved as QC parameters for the whole input image and per slice in the output pixel table.";
72 static const char *muse_ampl_help_esorex =
73 "\n\nInput frames for raw frame tag \"AMPL\":\n" 74 "\n Frame tag Type Req #Fr Description" 75 "\n -------------------- ---- --- --- ------------" 76 "\n AMPL raw Y >=3 Special raw flat-field taken with pico-amplifier readings in the FITS header" 77 "\n MASTER_BIAS calib Y 1 Master bias" 78 "\n MASTER_DARK calib . 1 Master dark" 79 "\n BADPIX_TABLE calib . Known bad pixels" 80 "\n GEOMETRY_TABLE calib . 1 Relative positions of the slices in the field of view" 81 "\n FILTER_LIST calib Y 1 Filter definitions; here, it has to contain the filter curve for the filter given in INS.AMPL2.FILTER" 82 "\n TRACE_TABLE calib Y 1 Trace table" 83 "\n WAVECAL_TABLE calib Y 1 Wavelength calibration table" 84 "\n\nProduct frames for raw frame tag \"AMPL\":\n" 85 "\n Frame tag Level Description" 86 "\n -------------------- -------- ------------" 87 "\n MASTER_AMPL final Combined master AMPL image, written if --savemaster=true" 88 "\n TABLE_AMPL final Output table with computations for each CCD pixel, written if --savetable=true." 89 "\n AMPL_CONVOLVED final Combined and convolved master AMPL image";
100 static cpl_recipeconfig *
101 muse_ampl_new_recipeconfig(
void)
103 cpl_recipeconfig *recipeconfig = cpl_recipeconfig_new();
105 cpl_recipeconfig_set_tag(recipeconfig,
"AMPL", 3, -1);
106 cpl_recipeconfig_set_input(recipeconfig,
"AMPL",
"MASTER_BIAS", 1, 1);
107 cpl_recipeconfig_set_input(recipeconfig,
"AMPL",
"MASTER_DARK", -1, 1);
108 cpl_recipeconfig_set_input(recipeconfig,
"AMPL",
"BADPIX_TABLE", -1, -1);
109 cpl_recipeconfig_set_input(recipeconfig,
"AMPL",
"GEOMETRY_TABLE", -1, 1);
110 cpl_recipeconfig_set_input(recipeconfig,
"AMPL",
"FILTER_LIST", 1, 1);
111 cpl_recipeconfig_set_input(recipeconfig,
"AMPL",
"TRACE_TABLE", 1, 1);
112 cpl_recipeconfig_set_input(recipeconfig,
"AMPL",
"WAVECAL_TABLE", 1, 1);
113 cpl_recipeconfig_set_output(recipeconfig,
"AMPL",
"MASTER_AMPL");
114 cpl_recipeconfig_set_output(recipeconfig,
"AMPL",
"TABLE_AMPL");
115 cpl_recipeconfig_set_output(recipeconfig,
"AMPL",
"AMPL_CONVOLVED");
131 static cpl_error_code
132 muse_ampl_prepare_header(
const char *aFrametag, cpl_propertylist *aHeader)
134 cpl_ensure_code(aFrametag, CPL_ERROR_NULL_INPUT);
135 cpl_ensure_code(aHeader, CPL_ERROR_NULL_INPUT);
136 if (!strcmp(aFrametag,
"MASTER_AMPL")) {
139 "Number of saturated pixels in raw image i in input list");
142 "Number of saturated pixels in output master image");
143 }
else if (!strcmp(aFrametag,
"TABLE_AMPL")) {
146 "[ph] Integrated number of photons detected on the CCD");
149 "[W] Integrated power detected on the CCD");
152 "[%] Channel throughput compared to photodiode a");
155 "[%] Estimated error of throughput compared to photodiode 2");
158 "[%] Slice j throughput compared to photodiode 2");
159 }
else if (!strcmp(aFrametag,
"AMPL_CONVOLVED")) {
162 "Number of saturated pixels in raw image i in input list");
165 "Number of saturated pixels in output master image");
168 "[ph] Integrated number of photons detected on the CCD");
171 "[W] Integrated power detected on the CCD");
174 "[%] Channel throughput compared to photodiode a");
177 "[%] Estimated error of throughput compared to photodiode 2");
180 "[%] Slice j throughput compared to photodiode 2");
182 cpl_msg_warning(__func__,
"Frame tag %s is not defined", aFrametag);
183 return CPL_ERROR_ILLEGAL_INPUT;
185 return CPL_ERROR_NONE;
198 static cpl_frame_level
199 muse_ampl_get_frame_level(
const char *aFrametag)
202 return CPL_FRAME_LEVEL_NONE;
204 if (!strcmp(aFrametag,
"MASTER_AMPL")) {
205 return CPL_FRAME_LEVEL_FINAL;
207 if (!strcmp(aFrametag,
"TABLE_AMPL")) {
208 return CPL_FRAME_LEVEL_FINAL;
210 if (!strcmp(aFrametag,
"AMPL_CONVOLVED")) {
211 return CPL_FRAME_LEVEL_FINAL;
213 return CPL_FRAME_LEVEL_NONE;
227 muse_ampl_get_frame_mode(
const char *aFrametag)
232 if (!strcmp(aFrametag,
"MASTER_AMPL")) {
235 if (!strcmp(aFrametag,
"TABLE_AMPL")) {
238 if (!strcmp(aFrametag,
"AMPL_CONVOLVED")) {
256 muse_ampl_create(cpl_plugin *aPlugin)
260 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
261 recipe = (cpl_recipe *)aPlugin;
269 muse_ampl_new_recipeconfig(),
270 muse_ampl_prepare_header,
271 muse_ampl_get_frame_level,
272 muse_ampl_get_frame_mode);
277 cpl_msg_set_time_on();
281 recipe->parameters = cpl_parameterlist_new();
286 p = cpl_parameter_new_range(
"muse.muse_ampl.nifu",
288 "IFU to handle. If set to 0, all IFUs are processed serially. If set to -1, all IFUs are processed in parallel.",
293 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"nifu");
294 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"nifu");
296 cpl_parameterlist_append(recipe->parameters, p);
299 p = cpl_parameter_new_value(
"muse.muse_ampl.overscan",
301 "If this is \"none\", stop when detecting discrepant overscan levels (see ovscsigma), for \"offset\" it assumes that the mean overscan level represents the real offset in the bias levels of the exposures involved, and adjusts the data accordingly; for \"vpoly\", a polynomial is fit to the vertical overscan and subtracted from the whole quadrant.",
303 (
const char *)
"vpoly");
304 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"overscan");
305 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"overscan");
307 cpl_parameterlist_append(recipe->parameters, p);
310 p = cpl_parameter_new_value(
"muse.muse_ampl.ovscreject",
312 "This influences how values are rejected when computing overscan statistics. Either no rejection at all (\"none\"), rejection using the DCR algorithm (\"dcr\"), or rejection using an iterative constant fit (\"fit\").",
314 (
const char *)
"dcr");
315 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"ovscreject");
316 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"ovscreject");
318 cpl_parameterlist_append(recipe->parameters, p);
321 p = cpl_parameter_new_value(
"muse.muse_ampl.ovscsigma",
323 "If the deviation of mean overscan levels between a raw input image and the reference image is higher than |ovscsigma x stdev|, stop the processing. If overscan=\"vpoly\", this is used as sigma rejection level for the iterative polynomial fit (the level comparison is then done afterwards with |100 x stdev| to guard against incompatible settings). Has no effect for overscan=\"offset\".",
326 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"ovscsigma");
327 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"ovscsigma");
329 cpl_parameterlist_append(recipe->parameters, p);
332 p = cpl_parameter_new_value(
"muse.muse_ampl.ovscignore",
334 "The number of pixels of the overscan adjacent to the data section of the CCD that are ignored when computing statistics or fits.",
337 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"ovscignore");
338 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"ovscignore");
340 cpl_parameterlist_append(recipe->parameters, p);
343 p = cpl_parameter_new_enum(
"muse.muse_ampl.combine",
345 "Type of combination to use",
347 (
const char *)
"sigclip",
349 (
const char *)
"average",
350 (
const char *)
"median",
351 (
const char *)
"minmax",
352 (
const char *)
"sigclip");
353 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"combine");
354 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"combine");
356 cpl_parameterlist_append(recipe->parameters, p);
359 p = cpl_parameter_new_value(
"muse.muse_ampl.nlow",
361 "Number of minimum pixels to reject with minmax",
364 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"nlow");
365 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"nlow");
367 cpl_parameterlist_append(recipe->parameters, p);
370 p = cpl_parameter_new_value(
"muse.muse_ampl.nhigh",
372 "Number of maximum pixels to reject with minmax",
375 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"nhigh");
376 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"nhigh");
378 cpl_parameterlist_append(recipe->parameters, p);
381 p = cpl_parameter_new_value(
"muse.muse_ampl.nkeep",
383 "Number of pixels to keep with minmax",
386 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"nkeep");
387 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"nkeep");
389 cpl_parameterlist_append(recipe->parameters, p);
392 p = cpl_parameter_new_value(
"muse.muse_ampl.lsigma",
394 "Low sigma for pixel rejection with sigclip",
397 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"lsigma");
398 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"lsigma");
400 cpl_parameterlist_append(recipe->parameters, p);
403 p = cpl_parameter_new_value(
"muse.muse_ampl.hsigma",
405 "High sigma for pixel rejection with sigclip",
408 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"hsigma");
409 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"hsigma");
411 cpl_parameterlist_append(recipe->parameters, p);
414 p = cpl_parameter_new_value(
"muse.muse_ampl.fbeam",
416 "Factor to describe the widening of the beam from the focal plane to photo diode 2.",
419 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"fbeam");
420 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"fbeam");
422 cpl_parameterlist_append(recipe->parameters, p);
425 p = cpl_parameter_new_value(
"muse.muse_ampl.temp",
427 "Lamp temperature [K] used to create the black body function.",
430 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"temp");
431 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"temp");
433 cpl_parameterlist_append(recipe->parameters, p);
436 p = cpl_parameter_new_value(
"muse.muse_ampl.savemaster",
438 "Save the processed and combined master image before any concolution is done.",
441 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"savemaster");
442 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"savemaster");
444 cpl_parameterlist_append(recipe->parameters, p);
447 p = cpl_parameter_new_value(
"muse.muse_ampl.savetable",
449 "Save the table with all the processed pixel values.",
452 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"savetable");
453 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"savetable");
455 cpl_parameterlist_append(recipe->parameters, p);
458 p = cpl_parameter_new_value(
"muse.muse_ampl.merge",
460 "Merge output products from different IFUs into a common file.",
463 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"merge");
464 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"merge");
466 cpl_parameterlist_append(recipe->parameters, p);
486 cpl_ensure_code(aParams, CPL_ERROR_NULL_INPUT);
487 cpl_ensure_code(aParameters, CPL_ERROR_NULL_INPUT);
490 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.nifu");
491 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
492 aParams->
nifu = cpl_parameter_get_int(p);
494 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.overscan");
495 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
496 aParams->
overscan = cpl_parameter_get_string(p);
498 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.ovscreject");
499 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
500 aParams->
ovscreject = cpl_parameter_get_string(p);
502 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.ovscsigma");
503 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
504 aParams->
ovscsigma = cpl_parameter_get_double(p);
506 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.ovscignore");
507 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
508 aParams->
ovscignore = cpl_parameter_get_int(p);
510 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.combine");
511 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
512 aParams->
combine_s = cpl_parameter_get_string(p);
514 (!strcasecmp(aParams->
combine_s,
"average")) ? MUSE_AMPL_PARAM_COMBINE_AVERAGE :
515 (!strcasecmp(aParams->
combine_s,
"median")) ? MUSE_AMPL_PARAM_COMBINE_MEDIAN :
516 (!strcasecmp(aParams->
combine_s,
"minmax")) ? MUSE_AMPL_PARAM_COMBINE_MINMAX :
517 (!strcasecmp(aParams->
combine_s,
"sigclip")) ? MUSE_AMPL_PARAM_COMBINE_SIGCLIP :
518 MUSE_AMPL_PARAM_COMBINE_INVALID_VALUE;
519 cpl_ensure_code(aParams->
combine != MUSE_AMPL_PARAM_COMBINE_INVALID_VALUE,
520 CPL_ERROR_ILLEGAL_INPUT);
522 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.nlow");
523 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
524 aParams->
nlow = cpl_parameter_get_int(p);
526 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.nhigh");
527 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
528 aParams->
nhigh = cpl_parameter_get_int(p);
530 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.nkeep");
531 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
532 aParams->
nkeep = cpl_parameter_get_int(p);
534 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.lsigma");
535 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
536 aParams->
lsigma = cpl_parameter_get_double(p);
538 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.hsigma");
539 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
540 aParams->
hsigma = cpl_parameter_get_double(p);
542 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.fbeam");
543 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
544 aParams->
fbeam = cpl_parameter_get_double(p);
546 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.temp");
547 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
548 aParams->
temp = cpl_parameter_get_double(p);
550 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.savemaster");
551 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
552 aParams->
savemaster = cpl_parameter_get_bool(p);
554 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.savetable");
555 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
556 aParams->
savetable = cpl_parameter_get_bool(p);
558 p = cpl_parameterlist_find(aParameters,
"muse.muse_ampl.merge");
559 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
560 aParams->
merge = cpl_parameter_get_bool(p);
574 muse_ampl_exec(cpl_plugin *aPlugin)
576 if (cpl_plugin_get_type(aPlugin) != CPL_PLUGIN_TYPE_RECIPE) {
580 cpl_recipe *recipe = (cpl_recipe *)aPlugin;
581 cpl_msg_set_threadid_on();
583 cpl_frameset *usedframes = cpl_frameset_new(),
584 *outframes = cpl_frameset_new();
586 muse_ampl_params_fill(¶ms, recipe->parameters);
588 cpl_errorstate prestate = cpl_errorstate_get();
590 if (params.
nifu < -1 || params.
nifu > kMuseNumIFUs) {
591 cpl_msg_error(__func__,
"Please specify a valid IFU number (between 1 and " 592 "%d), 0 (to process all IFUs consecutively), or -1 (to " 593 "process all IFUs in parallel) using --nifu.", kMuseNumIFUs);
597 cpl_boolean donotmerge = CPL_FALSE;
599 if (params.
nifu > 0) {
602 rc = muse_ampl_compute(proc, ¶ms);
603 cpl_frameset_join(usedframes, proc->
usedframes);
604 cpl_frameset_join(outframes, proc->
outframes);
606 donotmerge = CPL_TRUE;
607 }
else if (params.
nifu < 0) {
608 int *rcs = cpl_calloc(kMuseNumIFUs,
sizeof(
int));
610 #pragma omp parallel for default(none) \ 611 shared(outframes, params, rcs, recipe, usedframes) 612 for (nifu = 1; nifu <= kMuseNumIFUs; nifu++) {
618 int *rci = rcs + (nifu - 1);
619 *rci = muse_ampl_compute(proc, pars);
620 if (rci && (
int)cpl_error_get_code() == MUSE_ERROR_CHIP_NOT_LIVE) {
624 #pragma omp critical(muse_processing_used_frames) 625 cpl_frameset_join(usedframes, proc->
usedframes);
626 #pragma omp critical(muse_processing_output_frames) 627 cpl_frameset_join(outframes, proc->
outframes);
632 for (nifu = 1; nifu <= kMuseNumIFUs; nifu++) {
633 if (rcs[nifu-1] != 0) {
639 for (params.
nifu = 1; params.
nifu <= kMuseNumIFUs && !rc; params.
nifu++) {
642 rc = muse_ampl_compute(proc, ¶ms);
643 if (rc && (
int)cpl_error_get_code() == MUSE_ERROR_CHIP_NOT_LIVE) {
646 cpl_frameset_join(usedframes, proc->
usedframes);
647 cpl_frameset_join(outframes, proc->
outframes);
651 UNUSED_ARGUMENT(donotmerge);
653 if (!cpl_errorstate_is_equal(prestate)) {
657 cpl_msg_set_level(CPL_MSG_INFO);
664 if (params.
merge && !donotmerge) {
673 cpl_frameset_join(recipe->frames, usedframes);
674 cpl_frameset_join(recipe->frames, outframes);
675 cpl_frameset_delete(usedframes);
676 cpl_frameset_delete(outframes);
689 muse_ampl_destroy(cpl_plugin *aPlugin)
693 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
694 recipe = (cpl_recipe *)aPlugin;
700 cpl_parameterlist_delete(recipe->parameters);
717 cpl_plugin_get_info(cpl_pluginlist *aList)
719 cpl_recipe *recipe = cpl_calloc(1,
sizeof *recipe);
720 cpl_plugin *plugin = &recipe->interface;
724 helptext = cpl_sprintf(
"%s%s", muse_ampl_help,
725 muse_ampl_help_esorex);
727 helptext = cpl_sprintf(
"%s", muse_ampl_help);
731 cpl_plugin_init(plugin, CPL_PLUGIN_API, MUSE_BINARY_VERSION,
732 CPL_PLUGIN_TYPE_RECIPE,
734 "Determine the instrumental throughput from exposures taken with the pico-amplifier / photo diode readings.",
742 cpl_pluginlist_append(aList, plugin);
void muse_processing_delete(muse_processing *aProcessing)
Free the muse_processing structure.
int nifu
IFU to handle. If set to 0, all IFUs are processed serially. If set to -1, all IFUs are processed in ...
Structure to hold the parameters of the muse_ampl recipe.
muse_cplframework_type muse_cplframework(void)
Return the CPL framework the recipe is run under.
int nhigh
Number of maximum pixels to reject with minmax.
double ovscsigma
If the deviation of mean overscan levels between a raw input image and the reference image is higher ...
double temp
Lamp temperature [K] used to create the black body function.
cpl_frameset * usedframes
muse_processing * muse_processing_new(const char *aName, cpl_recipe *aRecipe)
Create a new processing structure.
const char * muse_get_license(void)
Get the pipeline copyright and license.
int nlow
Number of minimum pixels to reject with minmax.
int combine
Type of combination to use.
int ovscignore
The number of pixels of the overscan adjacent to the data section of the CCD that are ignored when co...
const char * overscan
If this is "none", stop when detecting discrepant overscan levels (see ovscsigma), for "offset" it assumes that the mean overscan level represents the real offset in the bias levels of the exposures involved, and adjusts the data accordingly; for "vpoly", a polynomial is fit to the vertical overscan and subtracted from the whole quadrant.
int merge
Merge output products from different IFUs into a common file.
int savetable
Save the table with all the processed pixel values.
int nkeep
Number of pixels to keep with minmax.
void muse_cplerrorstate_dump_some(unsigned aCurrent, unsigned aFirst, unsigned aLast)
Dump some CPL errors.
void muse_processinginfo_delete(cpl_recipe *)
Clear all information from the processing info and from the recipe config.
double hsigma
High sigma for pixel rejection with sigclip.
const char * ovscreject
This influences how values are rejected when computing overscan statistics. Either no rejection at al...
double fbeam
Factor to describe the widening of the beam from the focal plane to photo diode 2.
const char * combine_s
Type of combination to use (as string)
cpl_error_code muse_cplframeset_erase_duplicate(cpl_frameset *aFrames)
Erase all duplicate frames from a frameset.
cpl_error_code muse_cplframeset_erase_all(cpl_frameset *aFrames)
Erase all frames in a frameset.
int savemaster
Save the processed and combined master image before any concolution is done.
void muse_processinginfo_register(cpl_recipe *, cpl_recipeconfig *, muse_processing_prepare_header_func *, muse_processing_get_frame_level_func *, muse_processing_get_frame_mode_func *)
Register extended functionalities for MUSE recipes.
double lsigma
Low sigma for pixel rejection with sigclip.
void muse_processing_recipeinfo(cpl_plugin *)
Output main pipeline configuration, inputs, and parameters.
cpl_error_code muse_utils_frameset_merge_frames(cpl_frameset *aFrames, cpl_boolean aDelete)
Merge IFU-specific files from a frameset to create multi-IFU outputs.
cpl_error_code muse_processing_prepare_property(cpl_propertylist *, const char *, cpl_type, const char *)
Prepare and check the specified property.