32 #include "muse_standard_z.h" 56 cpl_errorstate state = cpl_errorstate_get();
63 prop->
darcheck = MUSE_POSTPROC_DARCHECK_NONE;
64 if (aParams->
darcheck == MUSE_STANDARD_PARAM_DARCHECK_CHECK) {
65 prop->
darcheck = MUSE_POSTPROC_DARCHECK_CHECK;
66 }
else if (aParams->
darcheck == MUSE_STANDARD_PARAM_DARCHECK_CORRECT) {
67 prop->
darcheck = MUSE_POSTPROC_DARCHECK_CORRECT;
71 if (aParams->
profile == MUSE_STANDARD_PARAM_PROFILE_MOFFAT) {
73 }
else if (aParams->
profile == MUSE_STANDARD_PARAM_PROFILE_CIRCLE) {
75 }
else if (aParams->
profile == MUSE_STANDARD_PARAM_PROFILE_SQUARE) {
77 }
else if (aParams->
profile != MUSE_STANDARD_PARAM_PROFILE_GAUSSIAN) {
78 cpl_msg_error(__func__,
"unknown profile \"%s\"", aParams->
profile_s);
84 MUSE_TAG_STD_FLUX_TABLE, 0);
86 cpl_msg_error(__func__,
"Required input %s not found in input files",
87 MUSE_TAG_STD_FLUX_TABLE);
88 cpl_error_set_message(__func__, CPL_ERROR_NULL_INPUT,
89 MUSE_TAG_STD_FLUX_TABLE
" missing");
94 CPL_FRAME_GROUP_CALIB, 1);
96 if (aParams->
select == MUSE_STANDARD_PARAM_SELECT_DISTANCE) {
98 }
else if (aParams->
select != MUSE_STANDARD_PARAM_SELECT_FLUX) {
99 cpl_msg_error(__func__,
"unknown selection \"%s\"", aParams->
select_s);
104 if (aParams->
smooth == MUSE_STANDARD_PARAM_SMOOTH_MEDIAN) {
106 }
else if (aParams->
smooth == MUSE_STANDARD_PARAM_SMOOTH_NONE) {
108 }
else if (aParams->
smooth != MUSE_STANDARD_PARAM_SMOOTH_PPOLY) {
109 cpl_msg_error(__func__,
"unknown smoothing \"%s\"", aParams->
smooth_s);
114 MUSE_TAG_EXTINCT_TABLE, 0);
118 cpl_msg_debug(__func__,
"%s could not be found or loaded, using defaults",
125 cpl_msg_error(__func__,
"No standard star exposures found in input!");
129 int nexposures = cpl_table_get_nrow(prop->
exposures);
134 for (i = 0; i < nexposures; i++) {
138 for (i2 = 0; i2 <= i; i2++) {
152 for (i = 0; i < nexposures; i++) {
153 int ifilt, ipos = 0, nfilt = cpl_array_get_size(filters);
154 for (ifilt = 0; ifilt < nfilt; ifilt++) {
156 const char *filtername = cpl_array_get_string(filters, ifilt);
163 if (!fluxobjs[i]->cube->recimages) {
165 fluxobjs[i]->
cube->
recnames = cpl_array_new(0, CPL_TYPE_STRING);
168 cpl_array_set_size(fluxobjs[i]->cube->recnames, ipos+1);
169 cpl_array_set_string(fluxobjs[i]->cube->recnames, ipos,
170 cpl_array_get_string(filters, ifilt));
173 if (!strncmp(filtername,
"Johnson_V", 10) ||
174 !strncmp(filtername,
"Cousins_R", 10) ||
175 !strncmp(filtername,
"Cousins_I", 10)) {
188 MUSE_TAG_STD_INTIMAGE);
191 cpl_propertylist *header = cpl_propertylist_duplicate(fluxobjs[i]->cube->header);
192 cpl_propertylist_erase_regexp(header,
"^NAXIS|^EXPTIME$|"MUSE_WCS_KEYS, 0);
193 char *objorig = cpl_strdup(cpl_propertylist_get_string(header,
"OBJECT"));
194 char *
object = cpl_sprintf(
"Response curve (%s)", objorig);
195 cpl_propertylist_update_string(header,
"OBJECT",
object);
197 fluxobjs[i]->response,
199 MUSE_TAG_STD_RESPONSE,
202 if (rc != CPL_ERROR_NONE) {
204 cpl_propertylist_delete(header);
205 for ( ; i < nexposures; i++) {
210 object = cpl_sprintf(
"Telluric correction (%s)", objorig);
211 cpl_propertylist_update_string(header,
"OBJECT",
object);
216 cpl_propertylist_delete(header);
218 if (rc != CPL_ERROR_NONE) {
219 for ( ; i < nexposures; i++) {
225 cpl_array_delete(filters);
228 return cpl_errorstate_is_equal(state) ? 0 : -1;
muse_postproc_properties * muse_postproc_properties_new(muse_postproc_type aType)
Create a post-processing properties object.
muse_flux_selection_type select
int profile
Type of flux integration to use. "gaussian" and "moffat" use 2D profile fitting, circle and square ar...
cpl_error_code muse_postproc_qc_fwhm(muse_processing *aProcessing, muse_datacube *aCube)
Compute QC1 parameters for datacubes and save them in the FITS header.
int select
How to select the star for flux integration, "flux" uses the brightest star in the field...
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.
int smooth
How to smooth the response curve before writing it to disk. "none" does not do any kind of smoothing ...
const char * profile_s
Type of flux integration to use. "gaussian" and "moffat" use 2D profile fitting, circle and square ar...
Structure definition of MUSE three extension FITS file.
const char * select_s
How to select the star for flux integration, "flux" uses the brightest star in the field...
cpl_array * recnames
the reconstructed image filter names
muse_flux_profile_type profile
cpl_error_code muse_flux_compute_qc_zp(muse_flux_object *aFluxObj, const muse_table *aFilter, const char *aName)
Compute QC zeropoint for given filter.
cpl_array * muse_cplarray_new_from_delimited_string(const char *aString, const char *aDelim)
Convert a delimited string into an array of strings.
Flux object to store data needed while computing the flux calibration.
cpl_error_code muse_datacube_convert_dq(muse_datacube *aCube)
Convert the DQ extension of a datacube to NANs in DATA and STAT.
#define MUSE_WCS_KEYS
regular expression for WCS properties
double lambdamin
Cut off the data below this wavelength after loading the pixel table(s).
cpl_error_code muse_processing_save_cube(muse_processing *aProcessing, int aIFU, void *aCube, const char *aTag, muse_cube_type aType)
Save a MUSE datacube to disk.
muse_flux_smooth_type smooth
Structure definition of the post-processing properties.
muse_table * muse_table_load_filter(muse_processing *aProcessing, const char *aFilterName)
Load a table for a given filter name.
void muse_postproc_properties_delete(muse_postproc_properties *aProp)
Free memory taken by a post-processing properties object and all its components.
double lambdaref
Reference wavelength used for correction of differential atmospheric refraction. The R-band (peak wav...
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.
Structure to store a table together with a property list.
void muse_table_delete(muse_table *aTable)
Deallocate memory associated to a muse_table object.
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.
Structure to hold the parameters of the muse_standard recipe.
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.
muse_imagelist * muse_imagelist_new(void)
Create a new (empty) MUSE image list.
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_image * muse_datacube_collapse(muse_datacube *aCube, const muse_table *aFilter)
Integrate a FITS NAXIS=3 datacube along the wavelength direction.
int darcheck
Carry out a check of the theoretical DAR correction using source centroiding. If "correct" it will al...
cpl_table * muse_processing_sort_exposures(muse_processing *aProcessing)
Sort input frames (containing lists of pixel table filenames) into different exposures.
muse_postproc_darcheck darcheck
cpl_error_code muse_imagelist_set(muse_imagelist *aList, muse_image *aImage, unsigned int aIdx)
Set the muse_image of given list index.
cpl_frame * muse_frameset_find_master(const cpl_frameset *aFrames, const char *aTag, unsigned char aIFU)
find the master frame according to its CCD number and tag
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...
void muse_flux_object_delete(muse_flux_object *aFluxObj)
Deallocate memory associated to a muse_flux_object.
muse_imagelist * recimages
the reconstructed image data
const char * smooth_s
How to smooth the response curve before writing it to disk. "none" does not do any kind of smoothing ...