35 #include "muse_qi_mask_z.h"
63 static const char *muse_qi_mask_help =
64 "Trace and wavelength calibration tables (24 of them each, one per IFU) are used to build wavelength maps. If the input data is binned, the wavelength maps are binned in the same way (averaging of pixels). The wavelength maps are then thresholded to create masks of the desired wavelength range. Finally, the mask is &untrimmed&, i.e. empty regions for the pre- and overscans are added (in a simple way, assuming quadrants of equal size, and padding of 32 pixels on all quadrant edges). Note: this recipe is not part of the main MUSE pipeline but to be used in the integration phase to create image masks until the system is fully qualified. It therefore does only minimal error checking.";
66 static const char *muse_qi_mask_help_esorex =
67 "\n\nInput frames for raw frame tag \"BIAS\":\n"
68 "\n Frame tag Type Req #Fr Description"
69 "\n -------------------- ---- --- --- ------------"
70 "\n BIAS raw . 1 Raw bias"
71 "\n TRACE_TABLE calib Y 1 Tracing table for all slices"
72 "\n WAVECAL_TABLE calib Y 1 Wavelength calibration table"
73 "\n\nProduct frames for raw frame tag \"BIAS\":\n"
74 "\n Frame tag Level Description"
75 "\n -------------------- -------- ------------"
76 "\n MASK_IMAGE final Image masks for quick image reconstruction";
87 static cpl_recipeconfig *
88 muse_qi_mask_new_recipeconfig(
void)
90 cpl_recipeconfig *recipeconfig = cpl_recipeconfig_new();
94 cpl_recipeconfig_set_tag(recipeconfig, tag, -1, 1);
95 cpl_recipeconfig_set_input(recipeconfig, tag,
"TRACE_TABLE", 1, 1);
96 cpl_recipeconfig_set_input(recipeconfig, tag,
"WAVECAL_TABLE", 1, 1);
97 cpl_recipeconfig_set_output(recipeconfig, tag,
"MASK_IMAGE");
113 static cpl_error_code
114 muse_qi_mask_prepare_header(
const char *aFrametag, cpl_propertylist *aHeader)
116 cpl_ensure_code(aFrametag, CPL_ERROR_NULL_INPUT);
117 cpl_ensure_code(aHeader, CPL_ERROR_NULL_INPUT);
118 if (!strcmp(aFrametag,
"MASK_IMAGE")) {
120 cpl_msg_warning(__func__,
"Frame tag %s is not defined", aFrametag);
121 return CPL_ERROR_ILLEGAL_INPUT;
123 return CPL_ERROR_NONE;
136 static cpl_frame_level
137 muse_qi_mask_get_frame_level(
const char *aFrametag)
140 return CPL_FRAME_LEVEL_NONE;
142 if (!strcmp(aFrametag,
"MASK_IMAGE")) {
143 return CPL_FRAME_LEVEL_FINAL;
145 return CPL_FRAME_LEVEL_NONE;
159 muse_qi_mask_get_frame_mode(
const char *aFrametag)
164 if (!strcmp(aFrametag,
"MASK_IMAGE")) {
182 muse_qi_mask_create(cpl_plugin *aPlugin)
186 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
187 recipe = (cpl_recipe *)aPlugin;
195 muse_qi_mask_new_recipeconfig(),
196 muse_qi_mask_prepare_header,
197 muse_qi_mask_get_frame_level,
198 muse_qi_mask_get_frame_mode);
203 cpl_msg_set_time_on();
207 recipe->parameters = cpl_parameterlist_new();
212 p = cpl_parameter_new_enum(
"muse.muse_qi_mask.wrange",
214 "Wavelength range (filter name) of the setup. Set this to \"custom\" to set up a new wavelength range using the wmin/wmax parameters.",
216 (
const char *)
"MUSE",
218 (
const char *)
"MUSE",
223 (
const char *)
"custom");
224 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"wrange");
225 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"wrange");
227 cpl_parameterlist_append(recipe->parameters, p);
230 p = cpl_parameter_new_value(
"muse.muse_qi_mask.wmin",
232 "Lower boundary of the wavelength range [Angstrom]. Only used when wrange=custom.",
235 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"wmin");
236 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"wmin");
238 cpl_parameterlist_append(recipe->parameters, p);
241 p = cpl_parameter_new_value(
"muse.muse_qi_mask.wmax",
243 "Lower boundary of the wavelength range [Angstrom]. Only used when wrange=custom.",
246 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"wmax");
247 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"wmax");
249 cpl_parameterlist_append(recipe->parameters, p);
252 p = cpl_parameter_new_range(
"muse.muse_qi_mask.nifu",
254 "IFU to handle. If set to 0, all IFUs are processed serially, which is the recommendation for this recipe, since only then all extensions end up in the same output file.",
259 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"nifu");
260 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"nifu");
262 cpl_parameterlist_append(recipe->parameters, p);
282 cpl_ensure_code(aParams, CPL_ERROR_NULL_INPUT);
283 cpl_ensure_code(aParameters, CPL_ERROR_NULL_INPUT);
286 p = cpl_parameterlist_find(aParameters,
"muse.muse_qi_mask.wrange");
287 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
288 aParams->
wrange_s = cpl_parameter_get_string(p);
290 (!strcasecmp(aParams->
wrange_s,
"MUSE")) ? MUSE_QI_MASK_PARAM_WRANGE_MUSE :
291 (!strcasecmp(aParams->
wrange_s,
"B")) ? MUSE_QI_MASK_PARAM_WRANGE_B :
292 (!strcasecmp(aParams->
wrange_s,
"V")) ? MUSE_QI_MASK_PARAM_WRANGE_V :
293 (!strcasecmp(aParams->
wrange_s,
"R")) ? MUSE_QI_MASK_PARAM_WRANGE_R :
294 (!strcasecmp(aParams->
wrange_s,
"I")) ? MUSE_QI_MASK_PARAM_WRANGE_I :
295 (!strcasecmp(aParams->
wrange_s,
"custom")) ? MUSE_QI_MASK_PARAM_WRANGE_CUSTOM :
296 MUSE_QI_MASK_PARAM_WRANGE_INVALID_VALUE;
297 cpl_ensure_code(aParams->
wrange != MUSE_QI_MASK_PARAM_WRANGE_INVALID_VALUE,
298 CPL_ERROR_ILLEGAL_INPUT);
300 p = cpl_parameterlist_find(aParameters,
"muse.muse_qi_mask.wmin");
301 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
302 aParams->
wmin = cpl_parameter_get_double(p);
304 p = cpl_parameterlist_find(aParameters,
"muse.muse_qi_mask.wmax");
305 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
306 aParams->
wmax = cpl_parameter_get_double(p);
308 p = cpl_parameterlist_find(aParameters,
"muse.muse_qi_mask.nifu");
309 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
310 aParams->
nifu = cpl_parameter_get_int(p);
324 muse_qi_mask_exec(cpl_plugin *aPlugin)
326 if (cpl_plugin_get_type(aPlugin) != CPL_PLUGIN_TYPE_RECIPE) {
329 cpl_recipe *recipe = (cpl_recipe *)aPlugin;
330 cpl_msg_set_threadid_on();
332 cpl_frameset *usedframes = cpl_frameset_new(),
333 *outframes = cpl_frameset_new();
335 muse_qi_mask_params_fill(¶ms, recipe->parameters);
337 cpl_errorstate prestate = cpl_errorstate_get();
341 int rc = muse_qi_mask_compute(proc, ¶ms);
342 cpl_frameset_join(usedframes, proc->
usedFrames);
346 if (!cpl_errorstate_is_equal(prestate)) {
350 cpl_msg_set_level(CPL_MSG_INFO);
360 cpl_frameset_join(recipe->frames, usedframes);
361 cpl_frameset_join(recipe->frames, outframes);
362 cpl_frameset_delete(usedframes);
363 cpl_frameset_delete(outframes);
376 muse_qi_mask_destroy(cpl_plugin *aPlugin)
380 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
381 recipe = (cpl_recipe *)aPlugin;
387 cpl_parameterlist_delete(recipe->parameters);
404 cpl_plugin_get_info(cpl_pluginlist *aList)
406 cpl_recipe *recipe = cpl_calloc(1,
sizeof *recipe);
407 cpl_plugin *plugin = &recipe->interface;
411 helptext = cpl_sprintf(
"%s%s", muse_qi_mask_help,
412 muse_qi_mask_help_esorex);
414 helptext = cpl_sprintf(
"%s", muse_qi_mask_help);
418 cpl_plugin_init(plugin, CPL_PLUGIN_API, MUSE_BINARY_VERSION,
419 CPL_PLUGIN_TYPE_RECIPE,
421 "Create image masks for use with the quick image reconstruction.",
428 muse_qi_mask_destroy);
429 cpl_pluginlist_append(aList, plugin);
void muse_processing_delete(muse_processing *aProcessing)
Free the muse_processing structure.
muse_cplframework_type muse_cplframework(void)
Return the CPL framework the recipe is run under.
const char * muse_get_license(void)
Get the pipeline copyright and license.
double wmax
Lower boundary of the wavelength range [Angstrom]. Only used when wrange=custom.
muse_processing * muse_processing_new(const char *aRecipeName, cpl_recipe *aRecipe)
Create a new processing structure.
cpl_frameset * outputFrames
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.
const char * wrange_s
Wavelength range (filter name) of the setup. Set this to "custom" to set up a new wavelength range us...
int wrange
Wavelength range (filter name) of the setup. Set this to "custom" to set up a new wavelength range us...
double wmin
Lower boundary of the wavelength range [Angstrom]. Only used when wrange=custom.
Structure to hold the parameters of the muse_qi_mask recipe.
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.
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.
cpl_frameset * usedFrames
int nifu
IFU to handle. If set to 0, all IFUs are processed serially, which is the recommendation for this rec...