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_rvcorrect.h"
40 #include "muse_utils.h"
71 case MUSE_POSTPROC_SCIPOST:
72 case MUSE_POSTPROC_STANDARD:
73 case MUSE_POSTPROC_ASTROMETRY:
77 cpl_msg_error(__func__,
"No such setup known: %d", aType);
78 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT);
103 cpl_propertylist_delete(aProp->
wcs);
122 cpl_ensure(aSave, CPL_ERROR_NULL_INPUT, CPL_FALSE);
123 if (strlen(aSave) < 4) {
124 cpl_error_set_message(__func__, CPL_ERROR_DATA_NOT_FOUND,
125 "no (valid) save option given!");
129 cpl_boolean allvalid = CPL_TRUE;
133 ns = cpl_array_get_size(asave),
134 nv = cpl_array_get_size(avalid);
135 for (i = 0; i < ns; i++) {
136 cpl_boolean valid = CPL_FALSE;
137 for (j = 0; j < nv; j++) {
138 if (!strcmp(cpl_array_get_string(asave, i),
139 cpl_array_get_string(avalid, j))) {
144 cpl_error_set_message(__func__, CPL_ERROR_ILLEGAL_INPUT,
145 "save option %d (%s) is not valid!", i + 1,
146 cpl_array_get_string(asave, i));
147 allvalid = CPL_FALSE;
150 cpl_array_delete(asave);
151 cpl_array_delete(avalid);
175 if (!strncmp(aResampleString,
"nearest", 8)) {
178 if (!strncmp(aResampleString,
"linear", 7)) {
181 if (!strncmp(aResampleString,
"quadratic", 10)) {
184 if (!strncmp(aResampleString,
"renka", 6)) {
187 if (!strncmp(aResampleString,
"drizzle", 8)) {
190 if (!strncmp(aResampleString,
"lanczos", 8)) {
216 if (!strncmp(aCRTypeString,
"iraf", 5)) {
219 if (!strncmp(aCRTypeString,
"mean", 5)) {
222 if (!strncmp(aCRTypeString,
"median", 7)) {
247 if (!strncmp(aFormatString,
"Cube", 5)) {
250 if (!strncmp(aFormatString,
"Euro3D", 7)) {
253 if (!strncmp(aFormatString,
"xCube", 6)) {
256 if (!strncmp(aFormatString,
"xEuro3D", 8)) {
281 if (!strncmp(aWeightString,
"exptime", 8)) {
284 if (!strncmp(aWeightString,
"fwhm", 5)) {
287 if (!strncmp(aWeightString,
"none", 5)) {
321 const cpl_frame *aFrame,
float aWarnLimit,
322 float aErrLimit,
double *aRA,
double *aDEC)
324 cpl_ensure(aHeader && aFrame, CPL_ERROR_NULL_INPUT, NULL);
325 cpl_errorstate state = cpl_errorstate_get();
328 cpl_ensure(cpl_errorstate_is_equal(state), CPL_ERROR_DATA_NOT_FOUND, NULL);
329 cpl_msg_debug(__func__,
"reference coordinates: RA = %e deg, DEC =%e deg",
338 const char *fn = cpl_frame_get_filename(aFrame);
339 cpl_propertylist *header;
340 double dmin = FLT_MAX;
341 int iext, inearest = -1, next = cpl_fits_count_extensions(fn);
342 for (iext = 1; iext <= next; iext++) {
343 header = cpl_propertylist_load(fn, iext);
344 const char *extname = cpl_propertylist_get_string(header,
"EXTNAME");
348 cpl_msg_debug(__func__,
"extension %d [%s]: RA = %e deg, DEC = %e deg --> "
349 "d = %e deg", iext, extname, ra, dec, d);
354 cpl_propertylist_delete(header);
357 if (dmin * 3600. > aErrLimit) {
358 char *msg = cpl_sprintf(
"Distance of nearest reference table to observed "
359 "position is %.2f arcmin, certainly a wrong "
360 "reference object!", dmin * 60.);
361 cpl_msg_error(__func__,
"%s", msg);
362 cpl_error_set_message(__func__, CPL_ERROR_INCOMPATIBLE_INPUT,
"%s", msg);
366 if (dmin * 3600. > aWarnLimit) {
367 cpl_msg_warning(__func__,
"Distance of nearest reference table to observed "
368 "position is %.2f arcmin! (Wrong reference object?)",
371 header = cpl_propertylist_load(fn, inearest);
372 const char *extname = cpl_propertylist_get_string(header,
"EXTNAME");
373 cpl_msg_info(__func__,
"Loading \"%s[%s]\" (distance %.1f arcsec)", fn,
374 extname, dmin * 3600.);
375 cpl_propertylist_delete(header);
376 cpl_table *table = cpl_table_load(fn, inearest, 1);
429 cpl_ensure(aProp && aProp->
exposures, CPL_ERROR_NULL_INPUT, NULL);
430 cpl_ensure((
int)aIndex < cpl_table_get_nrow(aProp->
exposures),
431 CPL_ERROR_ILLEGAL_INPUT, NULL);
432 cpl_msg_info(__func__,
"Starting to process exposure %d (DATE-OBS=%s)",
433 aIndex + 1, cpl_table_get_string(aProp->
exposures,
"DATE-OBS",
435 cpl_ensure(aProp->
exposures, CPL_ERROR_NULL_INPUT, NULL);
437 cpl_table *exposure = cpl_table_extract(aProp->
exposures, aIndex, 1);
441 cpl_table_delete(exposure);
446 cpl_propertylist_erase_regexp(pt->
header,
"ESO QC ", 0);
450 cpl_boolean labdata = CPL_FALSE;
451 cpl_errorstate prestate = cpl_errorstate_get();
455 if (!cpl_errorstate_is_equal(prestate) || airmass < 1.) {
456 cpl_msg_warning(__func__,
"This seems to be lab data (RA=%f DEC=%f, "
457 "airmass=%f), not doing any DAR correction!", ra, dec,
459 cpl_errorstate_dump(prestate, CPL_FALSE, NULL);
460 cpl_errorstate_set(prestate);
463 cpl_error_code rc = CPL_ERROR_NONE;
465 cpl_msg_debug(__func__,
"WFM detected: starting DAR correction");
467 cpl_msg_debug(__func__,
"DAR correction returned rc=%d: %s", rc,
468 rc != CPL_ERROR_NONE ? cpl_error_get_message() :
"");
470 if (aProp->
darcheck != MUSE_POSTPROC_DARCHECK_NONE) {
471 cpl_boolean dorefine = aProp->
darcheck == MUSE_POSTPROC_DARCHECK_CORRECT;
472 cpl_msg_info(__func__,
"Carrying out DAR %s", dorefine ?
"correction" :
"check");
475 if (rc != CPL_ERROR_NONE) {
476 cpl_msg_warning(__func__,
"Maximum detected shift %f\'\' (rc = %d: %s)",
477 maxshift, rc, cpl_error_get_message());
479 cpl_msg_info(__func__,
"Maximum detected shift %f\'\'", maxshift);
485 if (aProp->
type != MUSE_POSTPROC_STANDARD) {
489 cpl_msg_debug(__func__,
"Flux calibration returned rc=%d: %s", rc,
490 rc != CPL_ERROR_NONE ? cpl_error_get_message_default(rc) :
"");
492 cpl_msg_info(__func__,
"Skipping flux calibration (no %s curve)",
493 MUSE_TAG_STD_RESPONSE);
497 cpl_table *sky_cont = NULL,
500 aProp->
skymethod == MUSE_POSTPROC_SKYMETHOD_MODEL &&
505 cpl_table_select_all(sky_pt->
table);
509 cpl_msg_info(__func__,
"Intermediate resampling to produce white-light image"
510 " for sky-spectrum creation:");
511 cpl_msg_indent_more();
517 cpl_msg_error(__func__,
"Could not create cube for whitelight image");
524 cpl_msg_indent_less();
530 cpl_table_select_all(sky_pt->
table);
536 double lambda_low = cpl_array_get_min(lambda);
537 double lambda_high = cpl_array_get_max(lambda);
539 sky_lines = cpl_table_duplicate(aProp->
sky->
lines);
545 prestate = cpl_errorstate_get();
547 if (!cpl_errorstate_is_equal(prestate)) {
548 cpl_errorstate_dump(prestate, CPL_FALSE, NULL);
549 cpl_errorstate_set(prestate);
551 cpl_table_delete(sky_lines);
552 sky_lines = cpl_table_duplicate(master->
lines);
556 cpl_msg_info(__func__,
"No sky continuum given, create it from the data");
563 cpl_table_erase_column(sky_cont,
"stat");
564 cpl_table_erase_column(sky_cont,
"dq");
565 cpl_table_name_column(sky_cont,
"data",
"flux");
567 cpl_msg_info(__func__,
"Using sky continuum given as input");
572 cpl_array_unwrap(lambda);
573 cpl_array_unwrap(data);
574 cpl_array_unwrap(stat);
577 aSkyOut->
mask = sky_mask;
581 cpl_table_delete(spectrum);
584 cpl_table_delete(fwhite);
593 ((aProp->
skymethod == MUSE_POSTPROC_SKYMETHOD_NONE) ||
594 (aProp->
skymethod == MUSE_POSTPROC_SKYMETHOD_MODEL))) {
599 cpl_msg_debug(__func__,
"doing sky continuum subtraction with input "
602 }
else if (sky_cont) {
603 cpl_msg_debug(__func__,
"doing sky continuum subtraction with created "
605 sky->
continuum = cpl_table_duplicate(sky_cont);
608 cpl_msg_debug(__func__,
"doing sky line subtraction with created list");
609 sky->
lines = cpl_table_duplicate(sky_lines);
611 cpl_msg_debug(__func__,
"doing sky line subtraction with input list");
614 cpl_msg_debug(__func__,
"doing sky subtraction by spectrum modeling");
621 aSkyOut->
lines = sky_lines;
624 cpl_table_delete(sky_lines);
625 cpl_table_delete(sky_cont);
627 if (aProp->
skymethod == MUSE_POSTPROC_SKYMETHOD_ROWBYROW) {
629 cpl_msg_debug(__func__,
"doing sky subtraction using row-by-row fitting");
633 #pragma omp parallel for default(none) \
634 shared(aProp, list, n)
635 for (k = 0; k < n; k++) {
648 if (aProp->
type == MUSE_POSTPROC_STANDARD) {
649 double raref, decref;
654 cpl_msg_error(__func__,
"Correct %s could not be loaded, observed "
655 "target not listed?", MUSE_TAG_STD_FLUX_TABLE);
660 cpl_msg_error(__func__,
"%s does not have a recognized format!",
661 MUSE_TAG_STD_FLUX_TABLE);
662 cpl_table_delete(reftable);
667 prestate = cpl_errorstate_get();
671 cpl_msg_debug(__func__,
"Flux integration found %"CPL_SIZE_FORMAT
" stars",
676 cpl_msg_warning(__func__,
"Invalid airmass derived (%.3e), resetting to "
684 cpl_table_delete(reftable);
688 if (!cpl_errorstate_is_equal(prestate)) {
689 cpl_msg_warning(__func__,
"The following errors happened while computing "
690 "the flux calibration (rc = %d/%s):", rc,
691 cpl_error_get_message_default(rc));
698 if (aProp->
type == MUSE_POSTPROC_ASTROMETRY) {
703 cpl_msg_error(__func__,
"Correct %s could not be loaded, observed "
704 "target not listed?", MUSE_TAG_ASTROMETRY_REFERENCE);
708 prestate = cpl_errorstate_get();
711 wcs->crpix1 = aProp->crpix1;
712 wcs->crpix2 = aProp->
crpix2;
716 cpl_table_delete(reftable);
717 cpl_msg_debug(__func__,
"Solving astrometry (initial radius %.1f pix, "
718 "initial relative accuracy %.1f, %d iterations with rejection"
719 " sigma %.2f) returned rc=%d: %s", aProp->
radius,
721 rc, rc != CPL_ERROR_NONE ? cpl_error_get_message() :
"");
724 if (!cpl_errorstate_is_equal(prestate)) {
725 cpl_msg_warning(__func__,
"The following errors happened while computing "
726 "the astrometric solution (rc = %d/%s):", rc,
727 cpl_error_get_message());
734 cpl_msg_debug(__func__,
"Astrometry correction returned rc=%d: %s", rc,
735 rc != CPL_ERROR_NONE ? cpl_error_get_message() :
"");
762 cpl_ensure(aProcessing, CPL_ERROR_NULL_INPUT, NULL);
765 MUSE_TAG_OUTPUT_WCS, 0, CPL_FALSE);
766 if (!fwcs || cpl_frameset_get_size(fwcs) <= 0) {
768 cpl_frameset_delete(fwcs);
771 cpl_frame *frame = cpl_frameset_get_position(fwcs, 0);
772 const char *fn = cpl_frame_get_filename(frame);
773 cpl_propertylist *header = NULL;
774 int iext, next = cpl_fits_count_extensions(fn);
775 for (iext = 0; iext <= next; iext++) {
776 header = cpl_propertylist_load(fn, iext);
777 cpl_errorstate es = cpl_errorstate_get();
778 cpl_wcs *wcs = cpl_wcs_new_from_propertylist(header);
779 if (!cpl_errorstate_is_equal(es)) {
780 cpl_errorstate_set(es);
783 cpl_propertylist_delete(header);
788 int naxis = cpl_wcs_get_image_naxis(wcs);
789 cpl_boolean valid = naxis == 2 || naxis == 3;
791 const cpl_array *ctypes = cpl_wcs_get_ctype(wcs);
792 if (valid && cpl_array_get_string(ctypes, 0)) {
793 valid = valid && !strncmp(cpl_array_get_string(ctypes, 0),
"RA---TAN", 9);
795 if (valid && cpl_array_get_string(ctypes, 1)) {
796 valid = valid && !strncmp(cpl_array_get_string(ctypes, 1),
"DEC--TAN", 9);
799 if (valid && cpl_array_get_string(ctypes, 2)) {
800 const char *ctype3 = cpl_array_get_string(ctypes, 2);
802 && (!strncmp(ctype3,
"AWAV", 5) || !strncmp(ctype3,
"AWAV-LOG", 9));
806 cpl_propertylist *pc = cpl_propertylist_new();
807 cpl_propertylist_copy_property_regexp(pc, header,
"^PC[0-9]+_[0-9]+", 0);
808 valid = cpl_propertylist_get_size(pc) == 0;
809 cpl_propertylist_delete(pc);
813 cpl_msg_debug(__func__,
"Apparently valid header %s found in extension %d"
814 " of \"%s\"", MUSE_TAG_OUTPUT_WCS, iext, fn);
818 cpl_propertylist_delete(header);
822 cpl_msg_warning(__func__,
"No valid headers for %s found in \"%s\"",
823 MUSE_TAG_OUTPUT_WCS, fn);
825 cpl_frameset_delete(fwcs);
855 cpl_ensure_code(aProcessing && aPixtable && aParams, CPL_ERROR_NULL_INPUT);
865 cpl_msg_info(__func__,
"Resampling to final cube follows, output format "
867 cpl_msg_indent_more();
869 cpl_msg_indent_less();
870 cpl_ensure_code(e3d, cpl_error_get_code());
873 cpl_msg_info(__func__,
"Resampling to final cube follows, output format "
875 cpl_msg_indent_more();
877 cpl_msg_indent_less();
878 cpl_ensure_code(fits, cpl_error_get_code());
884 int i, ipos = 0, nfilters = cpl_array_get_size(filters);
885 for (i = 0; i < nfilters; i++) {
888 cpl_array_get_string(filters, i));
898 if (getenv(
"MUSE_COLLAPSE_PIXTABLE") &&
899 atoi(getenv(
"MUSE_COLLAPSE_PIXTABLE")) > 0) {
908 cpl_table_delete(filter);
914 ((
muse_datacube *)cube)->recnames = cpl_array_new(0, CPL_TYPE_STRING);
919 cpl_array_set_size(((
muse_datacube *)cube)->recnames, ipos+1);
920 cpl_array_set_string(((
muse_datacube *)cube)->recnames, ipos,
921 cpl_array_get_string(filters, i));
927 cpl_array_get_string(filters, i));
928 cpl_propertylist_update_string(fov->
header, MUSE_HDR_FILTER,
929 cpl_array_get_string(filters, i));
935 cpl_array_delete(filters);
938 cpl_error_code rc = CPL_ERROR_NONE;
982 cpl_ensure_code(aProcessing && aCube, CPL_ERROR_NULL_INPUT);
985 char prefix[KEYWORD_LENGTH] =
"";
986 if (!strncmp(aProcessing->
name,
"muse_scipost", 13)) {
987 strncpy(prefix, QC_POST_PREFIX_SCIPOST, KEYWORD_LENGTH);
988 }
else if (!strncmp(aProcessing->
name,
"muse_exp_combine", 17)) {
989 strncpy(prefix, QC_POST_PREFIX_EXPCOMBINE, KEYWORD_LENGTH);
990 }
else if (!strncmp(aProcessing->
name,
"muse_standard", 14)) {
991 strncpy(prefix, QC_POST_PREFIX_STANDARD, KEYWORD_LENGTH);
992 }
else if (!strncmp(aProcessing->
name,
"muse_astrometry", 16)) {
993 strncpy(prefix, QC_POST_PREFIX_ASTROMETRY, KEYWORD_LENGTH);
995 cpl_msg_info(__func__,
"Recipe \"%s\" found, not generating QC1 keywords",
997 return CPL_ERROR_NONE;
1002 int plane = cpl_imagelist_get_size(aCube->
data) / 2;
1003 cpl_image *cim = cpl_imagelist_get(aCube->
data, plane);
1004 double dsigmas[] = { 5., 4., 3. };
1005 int ndsigmas =
sizeof(dsigmas) /
sizeof(
double);
1006 cpl_vector *vsigmas = cpl_vector_wrap(ndsigmas, dsigmas);
1007 cpl_size isigma = -1;
1008 cpl_errorstate prestate = cpl_errorstate_get();
1009 cpl_apertures *apertures = cpl_apertures_extract(cim, vsigmas, &isigma);
1010 cpl_vector_unwrap(vsigmas);
1011 if (!apertures || !cpl_errorstate_is_equal(prestate)) {
1013 char keyword[KEYWORD_LENGTH];
1014 snprintf(keyword, KEYWORD_LENGTH, QC_POST_POSX, prefix, 0);
1015 cpl_propertylist_update_float(aCube->
header, keyword, -1.);
1016 snprintf(keyword, KEYWORD_LENGTH, QC_POST_POSY, prefix, 0);
1017 cpl_propertylist_update_float(aCube->
header, keyword, -1.);
1018 snprintf(keyword, KEYWORD_LENGTH, QC_POST_FWHMX, prefix, 0);
1019 cpl_propertylist_update_float(aCube->
header, keyword, -1.);
1020 snprintf(keyword, KEYWORD_LENGTH, QC_POST_FWHMY, prefix, 0);
1021 cpl_propertylist_update_float(aCube->
header, keyword, -1.);
1023 cpl_errorstate_set(prestate);
1024 cpl_msg_warning(__func__,
"No sources found for FWHM measurement down to "
1025 "%.1f sigma limit on plane %d, QC parameters will not "
1026 "contain useful information", dsigmas[ndsigmas-1], plane+1);
1027 return CPL_ERROR_DATA_NOT_FOUND;
1029 int ndet = cpl_apertures_get_size(apertures);
1030 cpl_msg_info(__func__,
"Computing FWHM QC parameters for %d source%s found "
1031 "down to the %.1f sigma threshold on plane %d", ndet,
1032 ndet == 1 ?
"" :
"s", dsigmas[isigma], plane + 1);
1036 double cd11 = kMuseSpaxelSizeX_WFM, cd12 = 0., cd21 = 0.,
1037 cd22 = kMuseSpaxelSizeY_WFM;
1038 cpl_errorstate es = cpl_errorstate_get();
1039 cpl_wcs *wcs = cpl_wcs_new_from_propertylist(aCube->
header);
1040 if (!cpl_errorstate_is_equal(es)) {
1041 cpl_errorstate_set(es);
1044 !strncasecmp(cpl_propertylist_get_string(aCube->
header,
"CTYPE1"),
1046 cpl_msg_debug(__func__,
"QC1 FWHM parameter estimation (%d sources): "
1047 "simple conversion to arcsec (CTYPE=%s/%s)!", ndet,
1048 cpl_propertylist_get_string(aCube->
header,
"CTYPE1"),
1049 cpl_propertylist_get_string(aCube->
header,
"CTYPE2"));
1051 cd11 = kMuseSpaxelSizeX_WFM;
1052 cd22 = kMuseSpaxelSizeY_WFM;
1055 const cpl_matrix *cd = cpl_wcs_get_cd(wcs);
1057 cd11 = fabs(cpl_matrix_get(cd, 0, 0)) * 3600.,
1058 cd12 = fabs(cpl_matrix_get(cd, 0, 1)) * 3600.,
1059 cd21 = fabs(cpl_matrix_get(cd, 1, 0)) * 3600.,
1060 cd22 = fabs(cpl_matrix_get(cd, 1, 1)) * 3600.;
1061 cpl_msg_debug(__func__,
"QC1 FWHM parameter estimation (%d sources): "
1062 "full conversion to arcsec (CD=%f,%f,%f,%f)", ndet,
1063 cd11, cd12, cd21, cd22);
1065 cpl_wcs_delete(wcs);
1069 printf(
"index RA_FWHM DEC_FWHM\n");
1072 for (n = 1; n <= ndet; n++) {
1073 cpl_size xcen = lround(cpl_apertures_get_centroid_x(apertures, n)),
1074 ycen = lround(cpl_apertures_get_centroid_y(apertures, n));
1076 cpl_image_get_fwhm(cim, xcen, ycen, &x, &y);
1079 x = cd11 * x + cd12 * y;
1080 y = cd22 * y + cd21 * x;
1082 printf(
"%4d %f %f\n", n, x, y);
1086 char keyword[KEYWORD_LENGTH];
1087 snprintf(keyword, KEYWORD_LENGTH, QC_POST_POSX, prefix, n);
1088 cpl_propertylist_update_float(aCube->
header, keyword, xcen);
1089 snprintf(keyword, KEYWORD_LENGTH, QC_POST_POSY, prefix, n);
1090 cpl_propertylist_update_float(aCube->
header, keyword, ycen);
1091 snprintf(keyword, KEYWORD_LENGTH, QC_POST_FWHMX, prefix, n);
1092 cpl_propertylist_update_float(aCube->
header, keyword, x);
1093 snprintf(keyword, KEYWORD_LENGTH, QC_POST_FWHMY, prefix, n);
1094 cpl_propertylist_update_float(aCube->
header, keyword, y);
1099 cpl_apertures_delete(apertures);
1101 return CPL_ERROR_NONE;
Structure definition of a MUSE datacube.
muse_rvcorrect_type rvtype
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.
muse_flux_selection_type select
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
cpl_error_code muse_rvcorrect(muse_pixtable *aPixtable, muse_rvcorrect_type aType)
Correct the wavelengths of all pixels of a given pixel table for radial velocity shift.
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, const char *)
Select spaxels to be considered as sky.
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.
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.
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_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.
cpl_error_code muse_flux_response_compute(muse_flux_object *aFluxObj, muse_flux_selection_type aSelect, 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_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...
cpl_boolean muse_pixtable_is_fluxcal(muse_pixtable *aPixtable)
Determine whether the pixel table is flux calibrated.
muse_wcs_object * muse_wcs_object_new(void)
Allocate memory for a new muse_wcs_object object.
muse_flux_smooth_type smooth
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.
cpl_error_code muse_flux_get_response_table(muse_flux_object *aFluxObj, muse_flux_smooth_type aSmooth)
Get the table of the standard star response function.
void muse_sky_master_delete(muse_sky_master *)
Delete a MASTER SKY structure.
static cpl_table * muse_postproc_load_nearest(const cpl_propertylist *aHeader, const cpl_frame *aFrame, float aWarnLimit, float aErrLimit, double *aRA, double *aDEC)
Load the calibration from a multi-table FITS file that is nearest on the sky.
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.
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...
Structure definition of the post-processing output sky data.
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.
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
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.
cpl_error_code muse_image_dq_to_nan(muse_image *aImage)
Convert pixels flagged in the DQ extension to NANs in DATA (and STAT, if present).
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.
muse_sky_master * muse_sky_master_new(void)
Create a muse_sky_master structure.