32 #include "muse_scipost_z.h"
59 const char *savevalid =
"cube,skymodel,individual,positioned,combined,stacked";
68 prop->
darcheck = MUSE_POSTPROC_DARCHECK_NONE;
69 if (aParams->
darcheck == MUSE_SCIPOST_PARAM_DARCHECK_CHECK) {
70 prop->
darcheck = MUSE_POSTPROC_DARCHECK_CHECK;
71 }
else if (aParams->
darcheck == MUSE_SCIPOST_PARAM_DARCHECK_CORRECT) {
72 prop->
darcheck = MUSE_POSTPROC_DARCHECK_CORRECT;
84 cpl_msg_warning(__func__,
"Using default MUSE WFM astrometry, output "
85 "world coordinates will be inaccurate!");
94 { MUSE_SCIPOST_PARAM_SKYMETHOD_NONE, MUSE_POSTPROC_SKYMETHOD_NONE },
95 { MUSE_SCIPOST_PARAM_SKYMETHOD_SUBTRACT_MODEL, MUSE_POSTPROC_SKYMETHOD_NONE },
96 { MUSE_SCIPOST_PARAM_SKYMETHOD_MODEL, MUSE_POSTPROC_SKYMETHOD_MODEL },
98 { MUSE_SCIPOST_PARAM_SKYMETHOD_INVALID_VALUE, MUSE_POSTPROC_SKYMETHOD_MODEL },
100 prop->
skymethod = MUSE_POSTPROC_SKYMETHOD_MODEL;
103 skymethod[i_method].par != MUSE_SCIPOST_PARAM_SKYMETHOD_INVALID_VALUE;
105 if (skymethod[i_method].par == aParams->
skymethod) {
106 prop->
skymethod = skymethod[i_method].postproc;
115 if (aParams->
skymethod == MUSE_SCIPOST_PARAM_SKYMETHOD_SUBTRACT_MODEL) {
117 if (prop->
sky->
lsf != NULL) {
120 cpl_msg_warning(__func__,
"Sky lines missing for subtraction");
124 }
else if (aParams->
skymethod == MUSE_SCIPOST_PARAM_SKYMETHOD_MODEL) {
126 if (prop->
sky->
lsf == NULL) {
127 cpl_msg_error(__func__,
"Missing required LSF parameter frames for sky model");
131 cpl_msg_error(__func__,
"Missing required sky lines frame for sky model");
144 cpl_msg_error(__func__,
"no science exposures found in input");
148 int nexposures = cpl_table_get_nrow(prop->
exposures);
154 for (i = 0; i < nexposures; i++) {
159 for (i2 = 0; i2 <= i; i2++) {
167 if (strstr(aParams->
save,
"skymodel")) {
172 cpl_propertylist *header = cpl_propertylist_duplicate(pixtables[i]->header);
173 cpl_propertylist_erase_regexp(header, MUSE_HDR_PT_REGEXP, 0);
176 cpl_propertylist_delete(header);
179 cpl_propertylist *header = cpl_propertylist_duplicate(pixtables[i]->header);
180 cpl_propertylist_erase_regexp(header, MUSE_HDR_PT_REGEXP, 0);
183 cpl_propertylist_delete(header);
186 cpl_propertylist *header = cpl_propertylist_duplicate(pixtables[i]->header);
187 cpl_propertylist_erase_regexp(header, MUSE_HDR_PT_REGEXP, 0);
190 cpl_propertylist_delete(header);
195 cpl_table_delete(skyout->
lines);
199 if (strstr(aParams->
save,
"individual")) {
201 MUSE_TAG_PIXTABLE_REDUCED,
204 if (strstr(aParams->
save,
"positioned")) {
212 MUSE_TAG_PIXTABLE_POSITIONED,
221 if (nexposures > 1) {
224 if (rc != CPL_ERROR_NONE) {
225 cpl_msg_error(__func__,
"weighting the pixel tables didn't work: %s",
226 cpl_error_get_message());
227 for (i = 0; i < nexposures; i++) {
236 cpl_msg_error(__func__,
"combining the pixel tables didn't work: %s",
237 cpl_error_get_message());
238 for (i = 0; i < nexposures; i++) {
245 bigpixtable = pixtables[0];
252 cpl_error_code rc = CPL_ERROR_NONE;
253 if (strstr(aParams->
save,
"cube")) {
257 rp->
dx = aParams->
dx;
258 rp->dy = aParams->
dy;
259 rp->dlambda = aParams->
dlambda;
262 rp->
ld = aParams->
ld;
263 rp->
rc = aParams->
rc;
269 cpl_propertylist_delete(outwcs);
272 format, rp, aParams->
filter);
275 if (strstr(aParams->
save,
"combined")) {
277 MUSE_TAG_PIXTABLE_COMBINED,
280 if (strstr(aParams->
save,
"stacked")) {
281 cpl_msg_debug(__func__,
"additional output as column-stacked image");
292 return rc == CPL_ERROR_NONE ? 0 : -1;
muse_rvcorrect_type rvtype
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.
cpl_propertylist * muse_postproc_cube_load_output_wcs(muse_processing *aProcessing)
Find a file with a usable output WCS in the input frameset.
muse_postproc_properties * muse_postproc_properties_new(muse_postproc_type aType)
Create a post-processing properties object.
muse_postproc_skymethod
Method of sky subtraction to apply.
void muse_image_delete(muse_image *aImage)
Deallocate memory associated to a muse_image object.
double lambdamin
Cut off the data below this wavelength after loading the pixel table(s).
muse_pixtable * muse_pixtable_duplicate(muse_pixtable *aPixtable)
Make a copy of the pixtanle.
int muse_processing_save_mask(muse_processing *aProcessing, int aIFU, muse_mask *aMask, const char *aTag)
Save a computed MUSE mask to disk.
double muse_pfits_get_ra(const cpl_propertylist *aHeaders)
find out the right ascension
cpl_error_code muse_resampling_params_set_wcs(muse_resampling_params *aParams, const cpl_propertylist *aWCS)
Set an output WCS (and wavelength scale) in the resampling parameters.
cpl_error_code muse_sky_lines_save(muse_processing *, const cpl_table *, cpl_propertylist *)
Save sky lines table to file.
muse_xcombine_types muse_postproc_get_weight_type(const char *aWeightString)
Select correct weighting type for weight string.
cpl_table * muse_sky_lines_load(muse_processing *)
Load the sky data files.
muse_resampling_crstats_type muse_postproc_get_cr_type(const char *aCRTypeString)
Select correct cosmic ray rejection type for crtype string.
int ld
Number of adjacent pixels to take into account during resampling in all three directions (loop distan...
const char * rvcorr_s
Correct the radial velocity of the telescope with reference to either the barycenter of the Solar Sys...
muse_rvcorrect_type muse_rvcorrect_select_type(const char *aTypeString)
Select type of radial velocity correction to be done from type string.
void muse_sky_qc_lines(cpl_propertylist *, cpl_table *, const char *)
Fill a header with the QC parameters for the sky lines.
void * muse_postproc_process_exposure(muse_postproc_properties *aProp, unsigned int aIndex, muse_postproc_sky_outputs *aSkyOut)
Merge and process pixel tables from one exposure.
Structure definition of MUSE three extension FITS file.
cpl_error_code muse_postproc_cube_resample_and_collapse(muse_processing *aProcessing, muse_pixtable *aPixtable, muse_cube_type aFormat, muse_resampling_params *aParams, const char *aFilter)
High level function to resample to a datacube and collapse that to an image of the field of view and ...
muse_mask * muse_processing_mask_load(muse_processing *aProcessing, const char *aTag)
Load a mask file and its FITS header.
cpl_error_code muse_xcombine_weights(muse_pixtable **aPixtables, muse_xcombine_types aWeighting)
compute the weights for combination of two or more exposures
muse_postproc_skymethod skymethod
const char * filter
The filter name(s) to be used for the output field-of-view image. Each name has to correspond to an E...
muse_resampling_crstats_type crtype
void muse_sky_qc_continuum(cpl_propertylist *, cpl_table *, const char *)
Fill a header with the QC parameters for the sky continuum.
const char * weight_s
Type of weighting scheme to use when combining multiple exposures. "exptime" just uses the exposure t...
cpl_table * muse_sky_continuum_load(muse_processing *)
Load the SKY_CONTINUUM spectrum.
Structure definition of MUSE pixel table.
muse_cube_type muse_postproc_get_cube_format(const char *aFormatString)
Select correct cube format for format string.
double dy
Vertical step size for resampling (in arcsec or pixel). The following defaults are taken when this va...
cpl_boolean muse_postproc_check_save_param(const char *aSave, const char *aValid)
Check the –save parameter contents against allowed options.
cpl_table * lines
Table of Atmospheric emission lines and their intensities.
muse_resampling_params * muse_resampling_params_new(muse_resampling_type aMethod)
Create the resampling parameters structure.
double pixfrac
Pixel down-scaling factor for the "drizzle" resampling method.
double lambdaref
Reference wavelength used for correction of differential atmospheric refraction. The R-band (peak wav...
double rc
Critical radius for the "renka" resampling method.
Structure definition of the post-processing properties.
double skymodel_fraction
Fraction of the image to be considered as sky. If an input sky mask is provided, the fraction is appl...
void muse_postproc_properties_delete(muse_postproc_properties *aProp)
Free memory taken by a post-processing properties object and all its components.
const char * crtype_s
Type of statistics used for detection of cosmic rays during final resampling. "iraf" uses the varianc...
int darcheck
Carry out a check of the theoretical DAR correction using source centroiding. If "correct" it will al...
double skymodel_sampling
Spectral sampling of the sky spectrum [Angstrom].
double muse_pfits_get_dec(const cpl_propertylist *aHeaders)
find out the declination
int astrometry
If false, skip any astrometric calibration, even if one was passed in the input set of files...
double skymodel_csampling
Spectral sampling of the continuum spectrum [Angstrom].
const char * format_s
Type of output file format, "Cube" is a standard FITS cube with NAXIS=3 and multiple extensions (for ...
double lambdamax
Cut off the data above this wavelength after loading the pixel table(s).
int muse_processing_save_image(muse_processing *aProcessing, int aIFU, muse_image *aImage, const char *aTag)
Save a computed MUSE image to disk.
muse_resampling_type muse_postproc_get_resampling_type(const char *aResampleString)
Select correct resampling type for resample string.
double dx
Horizontal step size for resampling (in arcsec or pixel). The following defaults are taken when this ...
muse_pixtable * muse_xcombine_tables(muse_pixtable **aPixtables)
combine the pixel tables of several exposures into one
int skymethod
The method used to subtract the sky background. "model" should work in all cases, it uses a global sk...
Structure to hold the parameters of the muse_scipost recipe.
cpl_table * muse_table_load(muse_processing *aProcessing, const char *aTag, unsigned char aIFU)
load a table according to its tag and IFU/channel number
double crsigma
Sigma rejection factor to use for cosmic ray rejection during final resampling. A zero or negative va...
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.
muse_resampling_type
Resampling types.
Structure definition of the post-processing output sky data.
void muse_resampling_params_delete(muse_resampling_params *aParams)
Delete a resampling parameters structure.
muse_lsf_params ** muse_processing_lsf_params_load(muse_processing *aProcessing, int aIFU)
Load slice LSF parameters.
void muse_mask_delete(muse_mask *aMask)
Deallocate memory associated to a muse_mask object.
cpl_propertylist * muse_propertylist_load(muse_processing *aProcessing, const char *aTag)
load a propertylist according to its tag
cpl_table * continuum
Continuum flux table
cpl_error_code muse_wcs_position_celestial(muse_pixtable *aPixtable, double aRA, double aDEC)
Convert native to celestial spherical coordinates in a pixel table.
muse_sky_params skymodel_params
cpl_table * muse_processing_sort_exposures(muse_processing *aProcessing)
Sort input frames (containing lists of pixel table filenames) into different exposures.
void muse_pixtable_delete(muse_pixtable *aPixtable)
Deallocate memory associated to a pixel table object.
muse_postproc_darcheck darcheck
muse_xcombine_types
Xposure combination types.
double dlambda
Wavelength step size (in Angstrom). Natural instrument sampling is used, if this is 0...
muse_lsf_params ** lsf
LSF parameter for the resampled spectrum.
const char * resample_s
The resampling technique to use for the final output cube. (as string)
cpl_propertylist * header
The FITS header.
muse_sky_master * muse_sky_master_new(void)
Create a muse_sky_master structure.
const char * save
Select output product(s) to save. Can contain one or more of "cube", "skymodel", "individual", "positioned", "combined", and "stacked". If several options are given, they have to be comma-separated. ("cube": output cube and associated images, if this is not given, no final resampling is done at all – "skymodel": up to four additional output products about the effectively used sky that was subtracted with the "model" method – "individual": fully reduced pixel table for each individual exposure – "positioned": fully reduced and positioned pixel table for each individual exposure, the difference to "individual" is that here, the output pixel tables have coordinates in RA and DEC; this is only useful, if both the relative exposure weighting and the final resampling are to be done externally – "combined": fully reduced and combined pixel table for the full set of exposures, the difference to "positioned" is that all pixel tables are combined into one, with an added weight column; this is useful, if only the final resampling step is to be done separately – "stacked": an additional output file in form of a 2D column-stacked image, i.e. x direction is pseudo-spatial, y direction is wavelength.)
cpl_propertylist * muse_wcs_create_default(void)
Create FITS headers containing a default (relative) WCS.
cpl_error_code muse_sky_save_continuum(muse_processing *, const cpl_table *, cpl_propertylist *)
Save sky continuum table to file.