00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 #ifndef UVES_UTILS_H
00148 #define UVES_UTILS_H
00149
00150
00151 #ifdef HAVE_CONFIG_H
00152 # include <config.h>
00153 #endif
00154
00155
00156
00157
00158
00159 #include <uves_utils_polynomial.h>
00160 #include <uves_extract_iterate.h>
00161 #include <uves_extract_profile.h>
00162 #include <uves_chip.h>
00163
00164 #include <cpl.h>
00165 #include <math.h>
00166
00167
00168
00169
00170
00171
00172 #if defined HAVE_DECL___FUNC__ && !HAVE_DECL___FUNC__
00173
00174 #ifndef __func__
00175 #define __func__ "<fct.id>"
00176 #endif
00177 #endif
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 #ifndef WANT_BIG_LOGFILE
00191 #define WANT_BIG_LOGFILE 0
00192 #endif
00193
00194
00195
00196
00197
00198 #ifndef WANT_TIME_MEASURE
00199 #define WANT_TIME_MEASURE 0
00200 #endif
00201
00202
00203 #if WANT_TIME_MEASURE
00204 #define UVES_TIME_START(what) uves_msg("Timing (%s, l%d) %s start", \
00205 __FILE__, __LINE__, what)
00206 #define UVES_TIME_END uves_msg("Timing (%s, l%d) end", \
00207 __FILE__, __LINE__)
00208 #else
00209 #define UVES_TIME_START(what) uves_msg_debug("Timing (%s, l%d) %s start", \
00210 __FILE__, __LINE__, what)
00211 #define UVES_TIME_END uves_msg_debug("Timing (%s, l%d) end", \
00212 __FILE__, __LINE__)
00213 #endif
00214
00215
00216 #ifndef stringify
00217 #ifndef make_str
00218 #define stringify(X) #X
00219 #define make_str(X) stringify(X)
00220 #endif
00221 #endif
00222
00223 #define TWOSQRT2LN2 2.35482004503095
00224
00225 #ifndef M_PI
00226 #define M_PI 3.1415926535897932384626433832795
00227 #endif
00228
00229 #define SPEED_OF_LIGHT 299792458
00230
00231 #define COS_DEG(x) cos(((x)/180)*M_PI)
00232 #define SIN_DEG(x) sin(((x)/180)*M_PI)
00233 #define ACOS_DEG(x) (acos(x)*180/M_PI)
00234
00235
00236
00237
00238
00239 cpl_image *
00240 uves_create_image(uves_iterate_position *pos, enum uves_chip chip,
00241 const cpl_image *spectrum, const cpl_image *sky,
00242 const cpl_image *cosmic_image,
00243 const uves_extract_profile *profile,
00244 cpl_image **image_noise, uves_propertylist **image_header);
00245 cpl_frameset *
00246 uves_frameset_extract(const cpl_frameset *frames,const char *tag);
00247
00248 double uves_gaussrand(void);
00249 double uves_pow_int(double x, int y);
00250 long uves_round_double(double x);
00251 double uves_max_double(double x, double y);
00252 int uves_max_int(int x, int y);
00253 double uves_min_double(double x, double y);
00254 int uves_min_int(int x, int y);
00255 double uves_error_fraction(double x, double y, double dx, double dy);
00256 const char *uves_get_license(void);
00257 cpl_error_code uves_get_version(int *major, int *minor, int *micro);
00258 int uves_get_version_binary(void);
00259
00260 char * uves_initialize(cpl_frameset *frames, const cpl_parameterlist *parlist,
00261 const char *recipe_id, const char *short_descr);
00262 cpl_error_code uves_end(const char *recipe_id, const cpl_frameset *frames);
00263
00264 uves_propertylist *uves_initialize_image_header(const char *ctype1, const char *ctype2,
00265 const char *bunit,
00266 double crval1 , double crval2,
00267 double crpix1 , double crpix2,
00268 double crdelt1, double crdelt2);
00269
00270 cpl_image *uves_define_noise(const cpl_image *image, const uves_propertylist *image_header,
00271 int ncom, enum uves_chip);
00272 cpl_image *uves_average_images(const cpl_image *image1, const cpl_image *noise1,
00273 const cpl_image *image2, const cpl_image *noise2,
00274 cpl_image **noise);
00275
00276
00277 cpl_error_code uves_subtract_bias(cpl_image *image, const cpl_image *master_bias);
00278 cpl_error_code uves_subtract_dark(cpl_image *image, const uves_propertylist *image_header,
00279 const cpl_image *master_dark,
00280 const uves_propertylist *mdark_header);
00281
00282 polynomial *
00283 uves_polynomial_regression_2d_autodegree(cpl_table *t,
00284 const char *X1, const char *X2, const char *Y,
00285 const char *sigmaY,
00286 const char *polynomial_fit,
00287 const char *residual_square,
00288 const char *variance_fit,
00289 double *mean_squared_error, double *red_chisq,
00290 polynomial **variance, double kappa,
00291 int maxdeg1, int maxdeg2, double min_rms,
00292 double min_reject,
00293 bool verbose,
00294 const double *min_val,
00295 const double *max_val,
00296 int npos, double positions[][2]);
00297
00298 polynomial *
00299 uves_polynomial_regression_2d(cpl_table *t,
00300 const char *X1, const char *X2, const char *Y,
00301 const char *sigmaY,
00302 int degree1, int degree2,
00303 const char *polynomial_fit, const char *residual_square,
00304 const char *variance_fit,
00305 double *mse, double *red_chisq,
00306 polynomial **variance, double kappa,
00307 double min_reject);
00308
00309 polynomial *uves_polynomial_regression_1d(cpl_table *t,
00310 const char *X, const char *Y, const char *sigmaY,
00311 int degree,
00312 const char *polynomial_fit, const char *residual_square,
00313 double *mean_squared_error, const double kappa);
00314
00315 const char *uves_remove_string_prefix(const char *s, const char *prefix);
00316
00317 double uves_spline_hermite_table( double xp, const cpl_table *t, const char *column_x,
00318 const char *column_y, int *istart );
00319
00320 double uves_spline_hermite( double xp, const double *x, const double *y, int n, int *istart );
00321
00322 double uves_spline_cubic(double xp, double *x, float *y, float *y2, int n, int *kstart );
00323
00324 int uves_absolute_order(int first_abs_order, int last_abs_order, int relative_order);
00325
00326 double uves_average_reject(cpl_table *t,
00327 const char *column,
00328 const char *residual2,
00329 double kappa);
00330
00331
00332 cpl_table *uves_ordertable_traces_new(void);
00333 cpl_error_code uves_ordertable_traces_add(cpl_table *traces,
00334 int fibre_ID, double fibre_offset, int fibre_mask);
00335 bool uves_table_is_sorted_double(const cpl_table *t, const char *column, const bool reverse);
00336
00337 int uves_moffat(const double x[], const double a[], double *result);
00338 int uves_moffat_derivative(const double x[], const double a[], double result[]);
00339 int uves_gauss(const double x[], const double a[], double *result);
00340 int uves_gauss_derivative(const double x[], const double a[], double result[]);
00341 int uves_gauss_linear(const double x[], const double a[], double *result);
00342 int uves_gauss_linear_derivative(const double x[], const double a[], double result[]);
00343 void uves_check_version(void);
00344 void uves_frameset_dump(cpl_frameset* set);
00345
00346 #endif