36 #include "muse_scibasic_z.h" 64 cpl_table *aTrace, cpl_table *aWave, cpl_table *aGeo,
69 cpl_ensure(aImage && aTrace && aWave, CPL_ERROR_NULL_INPUT, -1);
76 char *intag = cpl_strdup(cpl_propertylist_get_string(aImage->
header,
79 char *tag = cpl_sprintf(
"%s_RED", intag);
87 cpl_msg_error(__func__,
"Pixel table was not created for IFU %d: %s",
88 aParams->
nifu, cpl_error_get_message());
95 int nrej = cpl_array_get_size(rejpars);
98 unsigned char niter = 1;
99 if (nrej > 0 && cpl_array_get_string(rejpars, 0)) {
101 hsigma = atof(cpl_array_get_string(rejpars, 0));
103 if (nrej > 1 && cpl_array_get_string(rejpars, 1)) {
105 lsigma = atof(cpl_array_get_string(rejpars, 1));
107 if (nrej > 2 && cpl_array_get_string(rejpars, 2)) {
109 niter = atoi(cpl_array_get_string(rejpars, 2));
111 cpl_array_delete(rejpars);
119 const double llimN = kMuseUsefulNLambdaMin - FLT_EPSILON,
120 llimE = kMuseUsefulELambdaMin - FLT_EPSILON,
121 llimA = kMuseUsefulAOLambdaMin - FLT_EPSILON,
122 hlim = kMuseUsefulLambdaMax + FLT_EPSILON;
125 if ((mode == MUSE_MODE_WFM_AO_N) || (mode == MUSE_MODE_NFM_AO_N)) {
126 cpl_msg_info(__func__,
"Nominal AO mode: cropping the pixel table of IFU " 127 "%d to %.1f...%.1f Angstrom", aParams->
nifu, llimA, hlim);
129 }
else if (mode == MUSE_MODE_WFM_NONAO_N) {
130 cpl_msg_info(__func__,
"Nominal mode: cropping the pixel table of IFU %d" 131 " to %.1f...%.1f Angstrom", aParams->
nifu, llimN, hlim);
134 cpl_msg_info(__func__,
"Extended mode: cropping the pixel table of IFU %d" 135 " to %.1f...%.1f Angstrom", aParams->
nifu, llimE, hlim);
139 if (mode > MUSE_MODE_WFM_NONAO_N) {
149 for (icor = 0; aTwilights && aTwilights[icor]; icor++) {
150 cpl_msg_info(__func__,
"Starting twilight correction %d in IFU %d",
151 icor + 1, aParams->
nifu);
161 char *tag = cpl_sprintf(
"%s_RESAMPLED", intag);
163 cpl_propertylist_erase_regexp(image->
header, QC_SCIBASIC_PREFIX, 0);
170 char *outtag = cpl_sprintf(
"PIXTABLE_%s", intag);
195 cpl_msg_warning(__func__,
"Found REDUCED files on input, ignoring all " 200 for (i = 0; i < n; i++) {
202 cpl_propertylist_update_string(img->
header, MUSE_HDR_TMP_INTAG,
203 cpl_array_get_string(aProcessing->
intags, 0));
207 "muse.muse_scibasic");
216 cpl_error_set(__func__, cpl_error_get_code());
225 if (!tracetable || !wavecaltable || !geotable) {
226 cpl_msg_error(__func__,
"Calibration could not be loaded for IFU %d:%s%s%s",
227 aParams->
nifu, !tracetable ?
" "MUSE_TAG_TRACE_TABLE :
"",
228 !wavecaltable ?
" "MUSE_TAG_WAVECAL_TABLE :
"",
229 !geotable ?
" "MUSE_TAG_GEOMETRY_TABLE :
"");
232 cpl_table_delete(tracetable);
233 cpl_table_delete(wavecaltable);
234 cpl_table_delete(geotable);
240 MUSE_TAG_TWILIGHT_CUBE, 0, 0);
241 int i, ntwilight = cpl_frameset_get_size(fset);
243 for (i = 0; i < ntwilight; i++) {
244 cpl_frame *ftwilight = cpl_frameset_get_position(fset, i);
245 const char *fn = cpl_frame_get_filename(ftwilight);
248 cpl_msg_warning(__func__,
"Could not load %s from \"%s\"",
249 MUSE_TAG_TWILIGHT_CUBE, fn);
253 if (catg && strncmp(MUSE_TAG_TWILIGHT_CUBE, catg,
254 strlen(MUSE_TAG_TWILIGHT_CUBE) + 1)) {
255 cpl_msg_warning(__func__,
"Supposed %s (\"%s\") has wrong PRO.CATG: %s",
256 MUSE_TAG_TWILIGHT_CUBE, fn, catg);
260 cpl_frameset_delete(fset);
264 cpl_array_delete(lines);
267 "muse.muse_scibasic");
268 if (cpars->combine == MUSE_COMBINE_NONE) {
272 wavecaltable, geotable);
274 for (k = 0; k < nimages && !rc; k++) {
276 rc = muse_scibasic_per_exposure(aProcessing, aParams, tracetable,
277 wavecaltable, geotable, image, skylines,
278 masterflat, tattached, twilights);
280 cpl_table_delete(tattached);
282 int ntags = cpl_array_get_size(aProcessing->
intags);
284 cpl_msg_warning(__func__,
"Combining images of %d different tags, but " 285 "will use %s for output!", ntags,
286 cpl_array_get_string(aProcessing->
intags, 0));
288 cpl_msg_debug(__func__,
"Combining images with %d tag", ntags);
292 cpl_propertylist_update_string(image->
header, MUSE_HDR_TMP_INTAG,
293 cpl_array_get_string(aProcessing->
intags, 0));
294 rc = muse_scibasic_per_exposure(aProcessing, aParams, tracetable,
295 wavecaltable, geotable, image, skylines,
296 masterflat, NULL, twilights);
300 cpl_array_delete(skylines);
305 cpl_table_delete(tracetable);
306 cpl_table_delete(wavecaltable);
307 cpl_table_delete(geotable);
308 for (i = 0; twilights[i]; i++) {
muse_imagelist * muse_basicproc_load(muse_processing *aProcessing, unsigned char aIFU, muse_basicproc_params *aBPars)
Load the raw input files from disk and do basic processing.
Structure definition of a MUSE datacube.
muse_image * muse_resampling_image(muse_pixtable *aPixtable, muse_resampling_type aMethod, double aDX, double aDLambda)
Resample a pixel table onto a two-dimensional regular grid.
const char * skyreject
Sigma clipping parameters for the intermediate spectrum to do the Gaussian fit to each sky emission l...
Structure definition for a collection of muse_images.
void muse_image_delete(muse_image *aImage)
Deallocate memory associated to a muse_image object.
muse_datacube * muse_datacube_load(const char *aFilename)
Load header, DATA and optionally STAT and DQ extensions as well as the reconstructed images of a MUSE...
cpl_array * muse_cplarray_string_to_double(const cpl_array *aArray)
Convert a string array into an array of type double.
void muse_datacube_delete(muse_datacube *aCube)
Deallocate memory associated to a muse_datacube object.
void muse_imagelist_delete(muse_imagelist *aList)
Free the memory of the MUSE image list.
muse_imagelist * muse_basicproc_load_reduced(muse_processing *aProcessing, unsigned char aIFU)
Load reduced input files from disk.
muse_basicproc_params * muse_basicproc_params_new(cpl_parameterlist *aParameters, const char *aPrefix)
Create a new structure of basic processing parameters.
double dlambda
Wavelength step (in Angstrom per pixel) to use for resampling.
muse_image * muse_combine_images(muse_combinepar *aCPars, muse_imagelist *aImages)
Combine several images into one.
Structure definition of MUSE three extension FITS file.
void muse_basicproc_params_delete(muse_basicproc_params *aBPars)
Free a structure of basic processing parameters.
cpl_propertylist * header
the FITS header
cpl_boolean muse_processing_check_intags(muse_processing *aProcessing, const char *aTag, int aNChars)
Check that a tag is part of the input tags of a processing structure.
unsigned int muse_imagelist_get_size(muse_imagelist *aList)
Return the number of stored images.
void muse_combinepar_delete(muse_combinepar *aCPars)
Clear the combination parameters.
cpl_error_code muse_pixtable_append_ff(muse_pixtable *aPixtable, muse_image *aFF, cpl_table *aTrace, cpl_table *aWave, float aSampling)
Create flat-field spectrum and append to pixel table.
cpl_error_code muse_pixtable_restrict_wavelength(muse_pixtable *aPixtable, double aLow, double aHigh)
Restrict a pixel table to a certain wavelength range.
int saveimage
Save the pre-processed CCD-based image of each input exposure before it is transformed into a pixel t...
cpl_array * muse_cplarray_new_from_delimited_string(const char *aString, const char *aDelim)
Convert a delimited string into an array of strings.
Structure definition of MUSE pixel table.
cpl_error_code muse_basicproc_shift_pixtable(muse_pixtable *aPt, cpl_array *aLines, double aHalfWidth, double aBinWidth, float aLo, float aHi, unsigned char aIter)
Compute wavelength corrections for science data based on reference sky lines.
muse_image * muse_imagelist_get(muse_imagelist *aList, unsigned int aIdx)
Get the muse_image of given list index.
cpl_error_code muse_basicproc_apply_twilight(muse_pixtable *aPT, muse_datacube *aTwilight)
Apply an attached flat-field to a pixel table.
int resample
Resample the input science data into 2D spectral images using all supplied calibrations for a visual ...
muse_combinepar * muse_combinepar_new(cpl_parameterlist *aParameters, const char *aPrefix)
Create a new set of combination parameters.
int nifu
IFU to handle. If set to 0, all IFUs are processed serially. If set to -1, all IFUs are processed in ...
double skyhalfwidth
Half-width of the extraction box (in Angstrom) around each sky emission line.
void muse_processing_append_used(muse_processing *aProcessing, cpl_frame *aFrame, cpl_frame_group aGroup, int aDuplicate)
Add a frame to the set of used frames.
int crop
Automatically crop the output pixel tables in wavelength depending on the expected useful wavelength ...
muse_pixtable * muse_pixtable_create(muse_image *aImage, cpl_table *aTrace, cpl_table *aWave, cpl_table *aGeoTable)
Create the pixel table for one CCD.
cpl_table * muse_basicproc_get_illum(muse_imagelist *aImages, cpl_table *aTrace, cpl_table *aWave, cpl_table *aGeo)
Get an illum/attached flat-field from an imagelist and prepare it for use.
int muse_processing_save_image(muse_processing *aProcessing, int aIFU, muse_image *aImage, const char *aTag)
Save a computed MUSE image to disk.
cpl_table * muse_processing_load_ctable(muse_processing *aProcessing, const char *aTag, unsigned char aIFU)
Load a CPL table according to its tag and IFU/channel number.
Structure to hold the parameters of the muse_scibasic recipe.
double skybinsize
Size of the bins (in Angstrom per pixel) for the intermediate spectrum to do the Gaussian fit to each...
cpl_error_code muse_basicproc_mask_notch_filter(muse_pixtable *aPT, unsigned char aIFU)
Mask the range of the NaD notch filter in the given pixel table.
cpl_error_code muse_processing_save_table(muse_processing *aProcessing, int aIFU, void *aTable, cpl_propertylist *aHeader, const char *aTag, muse_table_type aType)
Save a computed table to disk.
Structure of basic processing parameters.
const char * muse_pfits_get_pro_catg(const cpl_propertylist *aHeaders)
find out the PRO category
const char * skylines
List of wavelengths of sky emission lines (in Angstrom) to use as reference for wavelength offset cor...
cpl_error_code muse_basicproc_apply_illum(muse_pixtable *aPT, cpl_table *aAttached)
Apply an illum/attached flat-field to a pixel table.
cpl_frameset * muse_frameset_find(const cpl_frameset *aFrames, const char *aTag, unsigned char aIFU, cpl_boolean aInvert)
return frameset containing data from an IFU/channel with a certain tag
void muse_pixtable_delete(muse_pixtable *aPixtable)
Deallocate memory associated to a pixel table object.
muse_ins_mode muse_pfits_get_mode(const cpl_propertylist *aHeaders)
find out the observation mode
cpl_parameterlist * parameters
cpl_propertylist * header
The FITS header.
cpl_error_code muse_basicproc_qc_saturated(muse_image *aImage, const char *aPrefix)
Add QC parameter about saturated pixels to a muse_image.