00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef HAVE_CONFIG_H
00023 #include <config.h>
00024 #endif
00025
00026
00027
00028
00029 #include <string.h>
00030
00031 #include <muse.h>
00032 #include "muse_astrometry_z.h"
00033
00034
00035
00036
00037
00038
00051
00052 int
00053 muse_astrometry_compute(muse_processing *aProcessing,
00054 muse_astrometry_params_t *aParams)
00055 {
00056 cpl_errorstate state = cpl_errorstate_get();
00057
00058 muse_postproc_properties *prop = muse_postproc_properties_new(MUSE_POSTPROC_ASTROMETRY);
00059
00060 prop->lambdamin = aParams->lambdamin;
00061 prop->lambdamax = aParams->lambdamax;
00062 prop->lambdaref = aParams->lambdaref;
00063 prop->darcheck = MUSE_POSTPROC_DARCHECK_NONE;
00064 if (aParams->darcheck == MUSE_ASTROMETRY_PARAM_DARCHECK_CHECK) {
00065 prop->darcheck = MUSE_POSTPROC_DARCHECK_CHECK;
00066 } else if (aParams->darcheck == MUSE_ASTROMETRY_PARAM_DARCHECK_CORRECT) {
00067 prop->darcheck = MUSE_POSTPROC_DARCHECK_CORRECT;
00068 }
00069
00070 prop->detsigma = aParams->detsigma;
00071 prop->radius = aParams->radius;
00072 prop->faccuracy = aParams->faccuracy;
00073 prop->rejsigma = aParams->rejsigma;
00074 prop->niter = aParams->niter;
00075 prop->centroid = MUSE_WCS_CENTROID_GAUSSIAN;
00076 if (aParams->centroid == MUSE_ASTROMETRY_PARAM_CENTROID_MOFFAT) {
00077 prop->centroid = MUSE_WCS_CENTROID_MOFFAT;
00078 } else if (aParams->centroid == MUSE_ASTROMETRY_PARAM_CENTROID_BOX) {
00079 prop->centroid = MUSE_WCS_CENTROID_BOX;
00080 } else if (aParams->centroid != MUSE_ASTROMETRY_PARAM_CENTROID_GAUSSIAN) {
00081 cpl_msg_error(__func__, "unknown centroiding method \"%s\"", aParams->centroid_s);
00082 muse_postproc_properties_delete(prop);
00083 return -1;
00084 }
00085
00086 cpl_array *rotcenter = muse_cplarray_new_from_delimited_string(aParams->rotcenter, ",");
00087 if (rotcenter && cpl_array_get_size(rotcenter) >= 2) {
00088 prop->crpix1 = atof(cpl_array_get_string(rotcenter, 0));
00089 prop->crpix2 = atof(cpl_array_get_string(rotcenter, 1));
00090 }
00091 cpl_array_delete(rotcenter);
00092
00093
00094 prop->response = muse_table_load(aProcessing, MUSE_TAG_STD_RESPONSE, 0);
00095 prop->extinction = muse_table_load(aProcessing, MUSE_TAG_EXTINCT_TABLE, 0);
00096 prop->telluric = muse_table_load(aProcessing, MUSE_TAG_STD_TELLURIC, 0);
00097
00098 prop->refframe = muse_frameset_find_master(aProcessing->inframes,
00099 MUSE_TAG_ASTROMETRY_REFERENCE, 0);
00100 if (!prop->refframe) {
00101 cpl_msg_error(__func__, "Required input %s not found in input files",
00102 MUSE_TAG_ASTROMETRY_REFERENCE);
00103 cpl_error_set_message(__func__, CPL_ERROR_NULL_INPUT,
00104 MUSE_TAG_ASTROMETRY_REFERENCE" missing");
00105 muse_postproc_properties_delete(prop);
00106 return -1;
00107 }
00108 muse_processing_append_used(aProcessing, prop->refframe,
00109 CPL_FRAME_GROUP_CALIB, 1);
00110
00111
00112 prop->exposures = muse_processing_sort_exposures(aProcessing);
00113 if (!prop->exposures) {
00114 cpl_msg_error(__func__, "no astrometric exposures found in input");
00115 muse_postproc_properties_delete(prop);
00116 return -1;
00117 }
00118 int nexposures = cpl_table_get_nrow(prop->exposures);
00119
00120
00121 muse_wcs_object **wcsobjs = cpl_calloc(nexposures, sizeof(muse_wcs_object *));
00122 int i;
00123 for (i = 0; i < nexposures; i++) {
00124 wcsobjs[i] = muse_postproc_process_exposure(prop, i, NULL);
00125 if (!wcsobjs[i]) {
00126 int i2;
00127 for (i2 = 0; i2 <= i; i2++) {
00128 muse_wcs_object_delete(wcsobjs[i2]);
00129 }
00130 cpl_free(wcsobjs);
00131 muse_postproc_properties_delete(prop);
00132 return -1;
00133 }
00134 }
00135 muse_postproc_properties_delete(prop);
00136
00137
00138
00139 for (i = 0; i < nexposures; i++) {
00140
00141
00142 muse_postproc_qc_fwhm(aProcessing, wcsobjs[i]->cube);
00143 muse_datacube_convert_dq(wcsobjs[i]->cube);
00144 muse_processing_save_cube(aProcessing, -1, wcsobjs[i]->cube,
00145 MUSE_TAG_CUBE_ASTROMETRY, MUSE_CUBE_TYPE_FITS);
00146
00147
00148 char *object = cpl_sprintf("Astrometric calibration (%s)",
00149 cpl_propertylist_get_string(wcsobjs[i]->cube->header,
00150 "OBJECT"));
00151 cpl_propertylist_update_string(wcsobjs[i]->wcs, "OBJECT", object);
00152 cpl_error_code rc = muse_processing_save_header(aProcessing, -1,
00153 wcsobjs[i]->wcs,
00154 MUSE_TAG_ASTROMETRY_WCS);
00155 cpl_free(object);
00156 if (rc != CPL_ERROR_NONE) {
00157 for ( ; i < nexposures; i++) {
00158 muse_wcs_object_delete(wcsobjs[i]);
00159 }
00160 break;
00161 }
00162
00163
00164
00165 muse_wcs_object_delete(wcsobjs[i]);
00166 }
00167 cpl_free(wcsobjs);
00168
00169 return cpl_errorstate_is_equal(state) ? 0 : -1;
00170 }