31 #include "muse_postproc.h"
32 #include "muse_instrument.h"
34 #include "muse_astro.h"
36 #include "muse_flux.h"
37 #include "muse_imagelist.h"
38 #include "muse_pfits.h"
39 #include "muse_utils.h"
70 case MUSE_POSTPROC_SCIPOST:
71 case MUSE_POSTPROC_STANDARD:
72 case MUSE_POSTPROC_ASTROMETRY:
76 cpl_msg_error(__func__,
"No such setup known: %d", aType);
77 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT);
101 cpl_propertylist_delete(aProp->
wcs);
129 if (!strncmp(aResampleString,
"nearest", 8)) {
132 if (!strncmp(aResampleString,
"linear", 7)) {
135 if (!strncmp(aResampleString,
"quadratic", 10)) {
138 if (!strncmp(aResampleString,
"renka", 6)) {
141 if (!strncmp(aResampleString,
"drizzle", 8)) {
144 if (!strncmp(aResampleString,
"lanczos", 8)) {
170 if (!strncmp(aCRTypeString,
"iraf", 5)) {
173 if (!strncmp(aCRTypeString,
"mean", 5)) {
176 if (!strncmp(aCRTypeString,
"median", 7)) {
201 if (!strncmp(aFormatString,
"Cube", 5)) {
204 if (!strncmp(aFormatString,
"Euro3D", 7)) {
207 if (!strncmp(aFormatString,
"xCube", 6)) {
210 if (!strncmp(aFormatString,
"xEuro3D", 8)) {
235 if (!strncmp(aWeightString,
"exptime", 8)) {
238 if (!strncmp(aWeightString,
"fwhm", 5)) {
270 const cpl_frame *aFrame,
float aWarnLimit,
273 cpl_ensure(aHeader && aFrame, CPL_ERROR_NULL_INPUT, NULL);
274 cpl_errorstate state = cpl_errorstate_get();
277 cpl_ensure(cpl_errorstate_is_equal(state), CPL_ERROR_DATA_NOT_FOUND, NULL);
278 cpl_msg_debug(__func__,
"reference coordinates: RA = %e deg, DEC =%e deg",
281 const char *fn = cpl_frame_get_filename(aFrame);
282 cpl_propertylist *header;
283 double dmin = FLT_MAX;
284 int iext, inearest = -1, next = cpl_fits_count_extensions(fn);
285 for (iext = 1; iext <= next; iext++) {
286 header = cpl_propertylist_load(fn, iext);
287 const char *extname = cpl_propertylist_get_string(header,
"EXTNAME");
291 cpl_msg_debug(__func__,
"extension %d [%s]: RA = %e deg, DEC = %e deg --> "
292 "d = %e deg", iext, extname, ra, dec, d);
297 cpl_propertylist_delete(header);
300 if (dmin * 3600. > aErrLimit) {
301 cpl_error_set_message(__func__, CPL_ERROR_INCOMPATIBLE_INPUT,
"Distance of "
302 "nearest reference table to observed position is %.2f "
303 "arcmin, certainly a wrong reference object!", dmin * 60.);
306 if (dmin * 3600. > aWarnLimit) {
307 cpl_msg_warning(__func__,
"Distance of nearest reference table to observed "
308 "position is %.2f arcmin! (Wrong reference object?)",
311 header = cpl_propertylist_load(fn, inearest);
312 const char *extname = cpl_propertylist_get_string(header,
"EXTNAME");
313 cpl_msg_info(__func__,
"Loading \"%s[%s]\" (distance %.1f arcsec)", fn,
314 extname, dmin * 3600.);
315 cpl_propertylist_delete(header);
316 cpl_table *table = cpl_table_load(fn, inearest, 1);
363 cpl_ensure(aProp && aProp->
exposures, CPL_ERROR_NULL_INPUT, NULL);
364 cpl_ensure((
int)aIndex < cpl_table_get_nrow(aProp->
exposures),
365 CPL_ERROR_ILLEGAL_INPUT, NULL);
366 cpl_msg_info(__func__,
"Starting to process exposure %d (DATE-OBS=%s)",
367 aIndex + 1, cpl_table_get_string(aProp->
exposures,
"DATE-OBS",
369 cpl_ensure(aProp->
exposures, CPL_ERROR_NULL_INPUT, NULL);
371 cpl_table *exposure = cpl_table_extract(aProp->
exposures, aIndex, 1);
375 cpl_table_delete(exposure);
380 cpl_propertylist_erase_regexp(pt->
header,
"ESO QC ", 0);
383 cpl_error_code rc = CPL_ERROR_NONE;
384 if (aProp->
type != MUSE_POSTPROC_STANDARD) {
388 cpl_msg_debug(__func__,
"Flux calibration returned rc=%d: %s", rc,
389 rc != CPL_ERROR_NONE ? cpl_error_get_message_default(rc) :
"");
391 cpl_msg_info(__func__,
"Skipping flux calibration (no %s curve)",
392 MUSE_TAG_STD_RESPONSE);
396 if (aProp->
skymethod == MUSE_POSTPROC_SKYMETHOD_MODEL && aProp->
sky) {
400 cpl_table_select_all(sky_pt->
table);
404 cpl_msg_info(__func__,
"Intermediate resampling to produce white-light image"
405 " for sky-spectrum creation:");
406 cpl_msg_indent_more();
413 cpl_msg_indent_less();
418 cpl_table_select_all(sky_pt->
table);
424 double lambda_low = cpl_array_get_min(lambda);
425 double lambda_high = cpl_array_get_max(lambda);
431 cpl_errorstate prestate = cpl_errorstate_get();
433 if (!cpl_errorstate_is_equal(prestate)) {
434 cpl_errorstate_dump(prestate, CPL_FALSE, NULL);
435 cpl_errorstate_set(prestate);
438 cpl_table_delete(aProp->
sky->
lines);
440 master->
lines = NULL;
448 cpl_table_name_column(aProp->
sky->
continuum,
"data",
"flux");
452 cpl_array_unwrap(lambda);
453 cpl_array_unwrap(data);
454 cpl_array_unwrap(stat);
456 cpl_table_delete(spectrum);
459 cpl_table_delete(fwhite);
464 if (((aProp->
skymethod == MUSE_POSTPROC_SKYMETHOD_NONE) ||
465 (aProp->
skymethod == MUSE_POSTPROC_SKYMETHOD_MODEL)) &&
467 cpl_msg_debug(__func__,
"doing sky subtraction by spectrum modeling");
470 if (aProp->
skymethod == MUSE_POSTPROC_SKYMETHOD_ROWBYROW) {
472 cpl_msg_debug(__func__,
"doing sky subtraction using row-by-row fitting");
476 #pragma omp parallel for default(none) \
477 shared(aProp, list, n)
478 for (k = 0; k < n; k++) {
489 cpl_boolean labdata = CPL_FALSE;
490 cpl_errorstate prestate = cpl_errorstate_get();
494 if (!cpl_errorstate_is_equal(prestate) || airmass < 1.) {
495 cpl_msg_warning(__func__,
"This seems to be lab data (RA=%f DEC=%f, "
496 "airmass=%f), not doing any DAR correction!", ra, dec,
498 cpl_errorstate_dump(prestate, CPL_FALSE, NULL);
499 cpl_errorstate_set(prestate);
503 cpl_msg_debug(__func__,
"WFM detected: starting DAR correction");
505 cpl_msg_debug(__func__,
"DAR correction returned rc=%d: %s", rc,
506 rc != CPL_ERROR_NONE ? cpl_error_get_message() :
"");
508 if (aProp->
darcheck != MUSE_POSTPROC_DARCHECK_NONE) {
509 cpl_boolean dorefine = aProp->
darcheck == MUSE_POSTPROC_DARCHECK_CORRECT;
510 cpl_msg_info(__func__,
"Carrying out DAR %s", dorefine ?
"correction" :
"check");
513 if (rc != CPL_ERROR_NONE) {
514 cpl_msg_warning(__func__,
"Maximum detected shift %f\'\' (rc = %d: %s)",
515 maxshift, rc, cpl_error_get_message());
517 cpl_msg_info(__func__,
"Maximum detected shift %f\'\'", maxshift);
523 if (aProp->
type == MUSE_POSTPROC_STANDARD) {
527 cpl_msg_error(__func__,
"Required input %s could not be loaded!",
528 MUSE_TAG_STD_FLUX_TABLE);
533 cpl_msg_error(__func__,
"%s does not have a recognized format!",
534 MUSE_TAG_STD_FLUX_TABLE);
535 cpl_table_delete(reftable);
540 prestate = cpl_errorstate_get();
543 if (flux->intimage) {
544 cpl_msg_debug(__func__,
"Flux integration found %"CPL_SIZE_FORMAT
" stars",
545 cpl_image_get_size_y(flux->intimage->
data));
549 cpl_msg_warning(__func__,
"Invalid airmass derived (%.3e), resetting to "
555 cpl_table_delete(reftable);
559 if (!cpl_errorstate_is_equal(prestate)) {
560 cpl_msg_warning(__func__,
"The following errors happened while computing "
561 "the flux calibration (rc = %d/%s):", rc,
562 cpl_error_get_message_default(rc));
569 if (aProp->
type == MUSE_POSTPROC_ASTROMETRY) {
573 cpl_msg_error(__func__,
"Required input %s could not be loaded!",
574 MUSE_TAG_ASTROMETRY_REFERENCE);
578 prestate = cpl_errorstate_get();
581 wcs->crpix1 = aProp->crpix1;
582 wcs->crpix2 = aProp->
crpix2;
586 cpl_table_delete(reftable);
587 cpl_msg_debug(__func__,
"Solving astrometry (initial radius %.1f pix, "
588 "initial relative accuracy %.1f, %d iterations with rejection"
589 " sigma %.2f) returned rc=%d: %s", aProp->
radius,
591 rc, rc != CPL_ERROR_NONE ? cpl_error_get_message() :
"");
594 if (!cpl_errorstate_is_equal(prestate)) {
595 cpl_msg_warning(__func__,
"The following errors happened while computing "
596 "the astrometric solution (rc = %d/%s):", rc,
597 cpl_error_get_message());
604 cpl_msg_debug(__func__,
"Astrometry correction returned rc=%d: %s", rc,
605 rc != CPL_ERROR_NONE ? cpl_error_get_message() :
"");
632 cpl_ensure(aProcessing, CPL_ERROR_NULL_INPUT, NULL);
635 MUSE_TAG_OUTPUT_WCS, 0, CPL_FALSE);
636 if (!fwcs || cpl_frameset_get_size(fwcs) <= 0) {
638 cpl_frameset_delete(fwcs);
641 cpl_frame *frame = cpl_frameset_get_position(fwcs, 0);
642 const char *fn = cpl_frame_get_filename(frame);
643 cpl_propertylist *header = NULL;
644 int iext, next = cpl_fits_count_extensions(fn);
645 for (iext = 0; iext <= next; iext++) {
646 header = cpl_propertylist_load(fn, iext);
647 cpl_errorstate es = cpl_errorstate_get();
648 cpl_wcs *wcs = cpl_wcs_new_from_propertylist(header);
649 if (!cpl_errorstate_is_equal(es)) {
650 cpl_errorstate_set(es);
653 cpl_propertylist_delete(header);
658 int naxis = cpl_wcs_get_image_naxis(wcs);
659 cpl_boolean valid = naxis == 2 || naxis == 3;
661 const cpl_array *ctypes = cpl_wcs_get_ctype(wcs);
662 if (valid && cpl_array_get_string(ctypes, 0)) {
663 valid = valid && !strncmp(cpl_array_get_string(ctypes, 0),
"RA---TAN", 9);
665 if (valid && cpl_array_get_string(ctypes, 1)) {
666 valid = valid && !strncmp(cpl_array_get_string(ctypes, 1),
"DEC--TAN", 9);
669 if (valid && cpl_array_get_string(ctypes, 2)) {
670 const char *ctype3 = cpl_array_get_string(ctypes, 2);
672 && (!strncmp(ctype3,
"AWAV", 5) || !strncmp(ctype3,
"AWAV-LOG", 9));
676 cpl_propertylist *pc = cpl_propertylist_new();
677 cpl_propertylist_copy_property_regexp(pc, header,
"^PC[0-9]+_[0-9]+", 0);
678 valid = cpl_propertylist_get_size(pc) == 0;
679 cpl_propertylist_delete(pc);
683 cpl_msg_debug(__func__,
"Apparently valid header %s found in extension %d"
684 " of \"%s\"", MUSE_TAG_OUTPUT_WCS, iext, fn);
688 cpl_propertylist_delete(header);
692 cpl_msg_warning(__func__,
"No valid headers for %s found in \"%s\"",
693 MUSE_TAG_OUTPUT_WCS, fn);
695 cpl_frameset_delete(fwcs);
725 cpl_ensure_code(aProcessing && aPixtable && aParams, CPL_ERROR_NULL_INPUT);
735 cpl_msg_info(__func__,
"Resampling to final cube follows, output format "
737 cpl_msg_indent_more();
739 cpl_msg_indent_less();
740 cpl_ensure_code(e3d, cpl_error_get_code());
743 cpl_msg_info(__func__,
"Resampling to final cube follows, output format "
745 cpl_msg_indent_more();
747 cpl_msg_indent_less();
748 cpl_ensure_code(fits, cpl_error_get_code());
754 int i, ipos = 0, nfilters = cpl_array_get_size(filters);
755 for (i = 0; i < nfilters; i++) {
758 cpl_array_get_string(filters, i));
768 if (getenv(
"MUSE_COLLAPSE_PIXTABLE") &&
769 atoi(getenv(
"MUSE_COLLAPSE_PIXTABLE")) > 0) {
778 cpl_table_delete(filter);
784 ((
muse_datacube *)cube)->recnames = cpl_array_new(0, CPL_TYPE_STRING);
789 cpl_array_set_size(((
muse_datacube *)cube)->recnames, ipos+1);
790 cpl_array_set_string(((
muse_datacube *)cube)->recnames, ipos,
791 cpl_array_get_string(filters, i));
795 cpl_array_get_string(filters, i));
796 cpl_propertylist_update_string(fov->
header, MUSE_HDR_FILTER,
797 cpl_array_get_string(filters, i));
803 cpl_array_delete(filters);
806 cpl_error_code rc = CPL_ERROR_NONE;
850 cpl_ensure_code(aProcessing && aCube, CPL_ERROR_NULL_INPUT);
853 char prefix[KEYWORD_LENGTH] =
"";
854 if (!strncmp(aProcessing->
recipeName,
"muse_scipost", 13)) {
855 strncpy(prefix, QC_POST_PREFIX_SCIPOST, KEYWORD_LENGTH);
856 }
else if (!strncmp(aProcessing->
recipeName,
"muse_exp_combine", 17)) {
857 strncpy(prefix, QC_POST_PREFIX_EXPCOMBINE, KEYWORD_LENGTH);
858 }
else if (!strncmp(aProcessing->
recipeName,
"muse_standard", 14)) {
859 strncpy(prefix, QC_POST_PREFIX_STANDARD, KEYWORD_LENGTH);
860 }
else if (!strncmp(aProcessing->
recipeName,
"muse_astrometry", 16)) {
861 strncpy(prefix, QC_POST_PREFIX_ASTROMETRY, KEYWORD_LENGTH);
863 cpl_msg_info(__func__,
"Recipe \"%s\" found, not generating QC1 keywords",
865 return CPL_ERROR_NONE;
870 int plane = cpl_imagelist_get_size(aCube->
data) / 2;
871 cpl_image *cim = cpl_imagelist_get(aCube->
data, plane);
872 double dsigmas[] = { 5., 4., 3. };
873 int ndsigmas =
sizeof(dsigmas) /
sizeof(
double);
874 cpl_vector *vsigmas = cpl_vector_wrap(ndsigmas, dsigmas);
875 cpl_size isigma = -1;
876 cpl_errorstate prestate = cpl_errorstate_get();
877 cpl_apertures *apertures = cpl_apertures_extract(cim, vsigmas, &isigma);
878 cpl_vector_unwrap(vsigmas);
879 if (!apertures || !cpl_errorstate_is_equal(prestate)) {
881 char keyword[KEYWORD_LENGTH];
882 snprintf(keyword, KEYWORD_LENGTH, QC_POST_POSX, prefix, 0);
883 cpl_propertylist_update_float(aCube->
header, keyword, -1.);
884 snprintf(keyword, KEYWORD_LENGTH, QC_POST_POSY, prefix, 0);
885 cpl_propertylist_update_float(aCube->
header, keyword, -1.);
886 snprintf(keyword, KEYWORD_LENGTH, QC_POST_FWHMX, prefix, 0);
887 cpl_propertylist_update_float(aCube->
header, keyword, -1.);
888 snprintf(keyword, KEYWORD_LENGTH, QC_POST_FWHMY, prefix, 0);
889 cpl_propertylist_update_float(aCube->
header, keyword, -1.);
891 cpl_errorstate_set(prestate);
892 cpl_msg_warning(__func__,
"No sources found for FWHM measurement down to "
893 "%.1f sigma limit on plane %d, QC parameters will not "
894 "contain useful information", dsigmas[ndsigmas-1], plane+1);
895 return CPL_ERROR_DATA_NOT_FOUND;
897 int ndet = cpl_apertures_get_size(apertures);
898 cpl_msg_info(__func__,
"Computing FWHM QC parameters for %d source%s found "
899 "down to the %.1f sigma threshold on plane %d", ndet,
900 ndet == 1 ?
"" :
"s", dsigmas[isigma], plane + 1);
904 double cd11 = kMuseSpaxelSizeX_WFM, cd12 = 0., cd21 = 0.,
905 cd22 = kMuseSpaxelSizeY_WFM;
906 cpl_errorstate es = cpl_errorstate_get();
907 cpl_wcs *wcs = cpl_wcs_new_from_propertylist(aCube->
header);
908 if (!cpl_errorstate_is_equal(es)) {
909 cpl_errorstate_set(es);
912 !strncasecmp(cpl_propertylist_get_string(aCube->
header,
"CTYPE1"),
914 cpl_msg_debug(__func__,
"QC1 FWHM parameter estimation (%d sources): "
915 "simple conversion to arcsec (CTYPE=%s/%s)!", ndet,
916 cpl_propertylist_get_string(aCube->
header,
"CTYPE1"),
917 cpl_propertylist_get_string(aCube->
header,
"CTYPE2"));
919 cd11 = kMuseSpaxelSizeX_WFM;
920 cd22 = kMuseSpaxelSizeY_WFM;
923 const cpl_matrix *cd = cpl_wcs_get_cd(wcs);
925 cd11 = fabs(cpl_matrix_get(cd, 0, 0)) * 3600.,
926 cd12 = fabs(cpl_matrix_get(cd, 0, 1)) * 3600.,
927 cd21 = fabs(cpl_matrix_get(cd, 1, 0)) * 3600.,
928 cd22 = fabs(cpl_matrix_get(cd, 1, 1)) * 3600.;
929 cpl_msg_debug(__func__,
"QC1 FWHM parameter estimation (%d sources): "
930 "full conversion to arcsec (CD=%f,%f,%f,%f)", ndet,
931 cd11, cd12, cd21, cd22);
937 printf(
"index RA_FWHM DEC_FWHM\n");
940 for (n = 1; n <= ndet; n++) {
941 cpl_size xcen = lround(cpl_apertures_get_centroid_x(apertures, n)),
942 ycen = lround(cpl_apertures_get_centroid_y(apertures, n));
944 cpl_image_get_fwhm(cim, xcen, ycen, &x, &y);
947 x = cd11 * x + cd12 * y;
948 y = cd22 * y + cd21 * x;
950 printf(
"%4d %f %f\n", n, x, y);
954 char keyword[KEYWORD_LENGTH];
955 snprintf(keyword, KEYWORD_LENGTH, QC_POST_POSX, prefix, n);
956 cpl_propertylist_update_float(aCube->
header, keyword, xcen);
957 snprintf(keyword, KEYWORD_LENGTH, QC_POST_POSY, prefix, n);
958 cpl_propertylist_update_float(aCube->
header, keyword, ycen);
959 snprintf(keyword, KEYWORD_LENGTH, QC_POST_FWHMX, prefix, n);
960 cpl_propertylist_update_float(aCube->
header, keyword, x);
961 snprintf(keyword, KEYWORD_LENGTH, QC_POST_FWHMY, prefix, n);
962 cpl_propertylist_update_float(aCube->
header, keyword, y);
967 cpl_apertures_delete(apertures);
969 return CPL_ERROR_NONE;
Structure definition of a MUSE datacube.
cpl_propertylist * muse_postproc_cube_load_output_wcs(muse_processing *aProcessing)
Find a file with a usable output WCS in the input frameset.
Structure definition for a collection of muse_images.
muse_postproc_properties * muse_postproc_properties_new(muse_postproc_type aType)
Create a post-processing properties object.
void muse_image_delete(muse_image *aImage)
Deallocate memory associated to a muse_image object.
muse_pixtable * muse_pixtable_duplicate(muse_pixtable *aPixtable)
Make a copy of the pixtanle.
muse_wcs_centroid_type centroid
double muse_pfits_get_ra(const cpl_propertylist *aHeaders)
find out the right ascension
cpl_image * data
the data extension
muse_xcombine_types muse_postproc_get_weight_type(const char *aWeightString)
Select correct weighting type for weight string.
cpl_error_code muse_dar_correct(muse_pixtable *aPixtable, double aLambdaRef)
Correct the pixel coordinates of all pixels of a given pixel table for differential atmospheric refra...
cpl_error_code muse_pixtable_and_selected_mask(muse_pixtable *aPixtable, muse_mask *aMask)
Select all pixels where the (x,y) positions are enabled in the given mask.
Structure to hold the MASTER SKY result.
muse_resampling_crstats_type muse_postproc_get_cr_type(const char *aCRTypeString)
Select correct cosmic ray rejection type for crtype string.
cpl_error_code muse_sky_subtract_rowbyrow(muse_image *, cpl_table *, float, unsigned int)
Subtract the sky row-by-row from a CCD-based image.
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_image * muse_datacube_collapse(muse_datacube *aCube, cpl_table *aFilter)
Integrate a FITS NAXIS=3 datacube along the wavelength direction.
cpl_error_code muse_dar_check(muse_pixtable *aPixtable, double *aMaxShift, cpl_boolean aCorrect, muse_datacube **aCube)
check that the continuum of objects in the frame is well-aligned perpendicular to the spatial axis...
cpl_error_code muse_flux_reference_table_check(cpl_table *aTable)
Check and/or adapt the standard flux reference table format.
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.
muse_mask * muse_sky_create_skymask(muse_image *, double)
Select spaxels to be considered as sky.
WCS object to store data needed while computing the astrometric solution.
Structure definition of MUSE three extension FITS file.
muse_flux_object * muse_flux_object_new(void)
Allocate memory for a new muse_flux_object object.
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 ...
cpl_table * table
The pixel table.
muse_flux_profile_type profile
muse_postproc_skymethod skymethod
cpl_propertylist * header
the FITS header
cpl_table * muse_table_load_filter(muse_processing *aProcessing, const char *aFilterName)
Load a table for a given filter name.
unsigned int muse_imagelist_get_size(muse_imagelist *aList)
Return the number of stored images.
muse_imagelist * muse_pixtable_to_imagelist(muse_pixtable *aPixtable)
Project a pixel table with data from one IFU back onto its image.
cpl_error_code muse_wcs_project_tan(muse_pixtable *aPixtable, const cpl_propertylist *aWCS)
Carry out a gnomonic projection of a pixel table into native spherical coordinates.
muse_resampling_crstats_type crtype
cpl_error_code muse_flux_get_telluric_table(muse_flux_object *aFluxObj)
Get the table of the telluric correction.
cpl_array * muse_cplarray_new_from_delimited_string(const char *aString, const char *aDelim)
Convert a delimited string into an array of strings.
cpl_error_code muse_flux_get_response_table(muse_flux_object *aFluxObj)
Get the table of the standard star response function.
Structure definition of MUSE pixel table.
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.
muse_cube_type muse_postproc_get_cube_format(const char *aFormatString)
Select correct cube format for format string.
muse_image * muse_imagelist_get(muse_imagelist *aList, unsigned int aIdx)
Get the muse_image of given list index.
cpl_array * muse_cpltable_extract_column(cpl_table *aTable, const char *aColumn)
Create an array from a section of a column.
cpl_table * lines
Table of Atmospheric emission lines and their intensities.
static cpl_table * muse_postproc_load_nearest(const cpl_propertylist *aHeader, const cpl_frame *aFrame, float aWarnLimit, float aErrLimit)
Load the calibration from a multi-table FITS file that is nearest on the sky.
muse_resampling_crstats_type
Cosmic ray rejection statistics type.
muse_resampling_params * muse_resampling_params_new(muse_resampling_type aMethod)
Create the resampling parameters structure.
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.
cpl_error_code muse_wcs_solve(muse_wcs_object *aWCSObj, cpl_table *aReference, float aRadius, float aFAccuracy, int aIter, float aThresh)
Find the world coordinate solution for a given field using coordinates of detected sources and coordi...
muse_wcs_object * muse_wcs_object_new(void)
Allocate memory for a new muse_wcs_object object.
Structure definition of the post-processing properties.
void muse_cplerrorstate_dump_some(unsigned aCurrent, unsigned aFirst, unsigned aLast)
Dump some CPL errors.
void muse_euro3dcube_delete(muse_euro3dcube *aEuro3D)
Deallocate memory associated to a muse_euro3dcube object.
void muse_postproc_properties_delete(muse_postproc_properties *aProp)
Free memory taken by a post-processing properties object and all its components.
cpl_error_code muse_flux_calibrate(muse_pixtable *aPixtable, const cpl_table *aResponse, const cpl_table *aExtinction, const cpl_table *aTelluric)
Convert the input pixel table from counts to fluxes.
cpl_imagelist * data
the cube containing the actual data values
cpl_error_code muse_sky_lines_set_range(cpl_table *, double, double)
Limit the lines in the table to a wavelength range.
Structure definition of a Euro3D datacube.
double muse_pfits_get_dec(const cpl_propertylist *aHeaders)
find out the declination
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.
void muse_sky_master_delete(muse_sky_master *)
Delete a MASTER SKY structure.
muse_datacube * muse_resampling_cube(muse_pixtable *aPixtable, muse_resampling_params *aParams, muse_pixgrid **aPixgrid)
Resample a pixel table onto a regular grid structure representing a FITS NAXIS=3 datacube.
muse_sky_master * muse_sky_master_fit(const cpl_array *, const cpl_array *, const cpl_array *, const cpl_table *)
Fit all entries of the pixel table to the master sky.
muse_image * muse_resampling_collapse_pixgrid(muse_pixtable *aPixtable, muse_pixgrid *aPixgrid, muse_datacube *aCube, cpl_table *aFilter, muse_resampling_params *aParams)
Integrate a pixel table / pixel grid along the wavelength direction.
void muse_pixgrid_delete(muse_pixgrid *aPixels)
Delete a pixgrid and remove its memory.
muse_postproc_type
Type of per-exposure processing to run.
cpl_error_code muse_flux_integrate_std(muse_pixtable *aPixtable, muse_flux_profile_type aProfile, muse_flux_object *aFluxObj)
Integrate the flux of the standard star(s) in the field over all wavelengths.
cpl_propertylist * header
the FITS header
int muse_processing_save_image(muse_processing *aProcessing, int aIFU, muse_image *aImage, const char *aTag)
Save a computed MUSE image to disk.
muse_pixtable * muse_pixtable_load_merge_channels(cpl_table *aExposureList, double aLambdaMin, double aLambdaMax)
Load and merge the pixel tables of the 24 MUSE sub-fields.
cpl_error_code muse_flux_response_compute(muse_flux_object *aFluxObj, double aAirmass, const cpl_table *aReference, const cpl_table *aTellBands, const cpl_table *aExtinct)
Compare measured flux distribution over wavelength with calibrated stellar fluxes and derive instrume...
muse_resampling_type muse_postproc_get_resampling_type(const char *aResampleString)
Select correct resampling type for resample string.
muse_image * muse_euro3dcube_collapse(muse_euro3dcube *aEuro3D, cpl_table *aFilter)
Integrate a Euro3D datacube along the wavelength direction.
cpl_error_code muse_pixtable_from_imagelist(muse_pixtable *aPixtable, muse_imagelist *aList)
Get pixel table values back from a per-IFU imagelist.
Handling of "mask" files.
muse_imagelist * muse_imagelist_new(void)
Create a new (empty) MUSE image list.
muse_resampling_type
Resampling types.
cpl_error_code muse_sky_subtract_rowbyrow_mask(muse_image *, cpl_table *)
Prepare an (object) mask for the sky row-by-row fitting.
muse_euro3dcube * muse_resampling_euro3d(muse_pixtable *aPixtable, muse_resampling_params *aParams)
Resample a pixel table onto a regular grid structure representing a Euro3D format file...
void muse_resampling_params_delete(muse_resampling_params *aParams)
Delete a resampling parameters structure.
void muse_mask_delete(muse_mask *aMask)
Deallocate memory associated to a muse_mask object.
void * muse_postproc_process_exposure(muse_postproc_properties *aProp, unsigned int aIndex)
Merge and process pixel tables from one exposure.
cpl_table * continuum
Continuum flux table
cpl_table * muse_resampling_spectrum(muse_pixtable *aPixtable, double aBinwidth)
Resample the selected pixels of a pixel table into a spectrum.
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
muse_sky_params skymodel_params
cpl_frameset * inputFrames
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.
cpl_error_code muse_imagelist_set(muse_imagelist *aList, muse_image *aImage, unsigned int aIdx)
Set the muse_image of given list index.
cpl_error_code muse_sky_subtract_pixtable(muse_pixtable *a, muse_sky_master *, muse_lsf_params **)
Subtract the sky spectrum from the "data" column of a pixel table.
double muse_astro_angular_distance(double aRA1, double aDEC1, double aRA2, double aDEC2)
Compute angular distance in the sky between two positions.
muse_lsf_params ** lsf
LSF parameter for the resampled spectrum.
muse_ins_mode muse_pfits_get_mode(const cpl_propertylist *aHeaders)
find out the observation mode
cpl_error_code muse_utils_copy_modified_header(cpl_propertylist *aH1, cpl_propertylist *aH2, const char *aKeyword, const char *aString)
Copy a modified header keyword from one header to another.
cpl_error_code muse_wcs_locate_sources(muse_pixtable *aPixtable, float aSigma, muse_wcs_centroid_type aCentroid, muse_wcs_object *aWCSObj)
Determine the centers of stars on an astrometric exposure.
double muse_astro_airmass(cpl_propertylist *aHeader)
Derive the effective airmass of an observation from information in a FITS header. ...
cpl_propertylist * header
The FITS header.