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 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031
00032 #include <fors_star.h>
00033
00034 #include <fors_utils.h>
00035
00036 #include <cpl.h>
00037
00038 #include <math.h>
00039 #include <assert.h>
00040
00049
00050
00051
00052
00053 static
00054 double _get_optional_table_value( const cpl_table *tab,
00055 unsigned int row,
00056 const char *colname);
00057
00058
00059
00060
00061
00062
00063 #undef cleanup
00064 #define cleanup
00065
00071
00072 static
00073 double _get_optional_table_value( const cpl_table *tab,
00074 unsigned int row,
00075 const char *colname)
00076 {
00077 int null;
00078 if (colname != NULL && colname[0] != '\0')
00079 {
00080 double d;
00081 d = cpl_table_get( tab, colname, row, &null);
00082 assure( !cpl_error_get_code(),
00083 return d,
00084 "Missing column: %s",
00085 colname);
00086 return d;
00087
00088 }
00089 else
00090 return 0.0;
00091 }
00092
00093
00094
00095
00096
00097
00098 #undef cleanup
00099 #define cleanup
00100
00113
00114 fors_star *fors_star_new(double x, double y,
00115 double fwhm,
00116 double smajor, double sminor,
00117 double orientation,
00118 double m, double dm,
00119 double si)
00120 {
00121 assure( smajor >= sminor && sminor >= 0, return NULL,
00122 "Illegal semi major/minor axes: %g, %g",
00123 smajor, sminor );
00124
00125 assure( 0 <= si && si <= 1, return NULL,
00126 "Stellarity index must be between 0 and 1, is %f",
00127 si);
00128
00129 assure( fwhm >= 0, return NULL,
00130 "Star FWHM must be non-negative, is %f",
00131 fwhm);
00132
00133 fors_star *s = cpl_malloc(sizeof(*s));
00134
00135 s->pixel = fors_point_new(x, y);
00136 s->fwhm = fwhm;
00137 s->semi_major = smajor;
00138 s->semi_minor = sminor;
00139 s->stellarity_index = si;
00140 s->orientation = orientation;
00141 s->magnitude = m;
00142 s->dmagnitude = dm;
00143 s->magnitude_corr = 0;
00144 s->dmagnitude_corr = 0;
00145 s->id = NULL;
00146 s->weight = 0;
00147
00148 return s;
00149 }
00150
00151
00152 #undef cleanup
00153 #define cleanup fors_star_delete(&s)
00154
00169
00170 fors_star *fors_star_new_from_table(const cpl_table *tab,
00171 unsigned int row,
00172 const char *x_col,
00173 const char *y_col,
00174 const char *fwhm_col,
00175 const char *smaj_col,
00176 const char *smin_col,
00177 const char *theta_col,
00178 const char *mag_col,
00179 const char *dmag_col,
00180 const char *stlndx_col)
00181 {
00182 int null;
00183 fors_star *s = cpl_malloc(sizeof(*s));
00184
00185 s->pixel = fors_point_new( _get_optional_table_value(tab, row, x_col),
00186 _get_optional_table_value(tab, row, y_col));
00187 assure(!cpl_error_get_code(), return s, NULL);
00188
00189 s->fwhm = _get_optional_table_value(tab, row, fwhm_col);
00190 assure(!cpl_error_get_code(), return s, NULL);
00191
00192 s->semi_major = _get_optional_table_value(tab, row, smaj_col);
00193 assure(!cpl_error_get_code(), return s, NULL);
00194
00195 s->semi_minor = _get_optional_table_value(tab, row, smin_col);
00196 assure(!cpl_error_get_code(), return s, NULL);
00197
00198 s->stellarity_index = _get_optional_table_value(tab, row, stlndx_col);
00199 assure(!cpl_error_get_code(), return s, NULL);
00200
00201 s->orientation = _get_optional_table_value(tab, row, theta_col);
00202 assure(!cpl_error_get_code(), return s, NULL);
00203
00204 s->magnitude = _get_optional_table_value(tab, row, mag_col);
00205 assure(!cpl_error_get_code(), return s, NULL);
00206
00207 s->dmagnitude = _get_optional_table_value(tab, row, dmag_col);
00208 assure(!cpl_error_get_code(), return s, NULL);
00209
00210 s->magnitude_corr = 0;
00211 s->dmagnitude_corr = 0;
00212 s->id = NULL;
00213 s->weight = 0;
00214
00215 return s;
00216 }
00217
00218
00219 #undef cleanup
00220 #define cleanup
00221
00226
00227 bool fors_star_check_values( const fors_star *star)
00228 {
00229 bool success = 1;
00230
00231 success &= (star != NULL);
00232 success &= (star->semi_major >= star->semi_minor);
00233 success &= (0.0 <= star->stellarity_index && star->stellarity_index <= 1.0);
00234 success &= (star->fwhm > 0.0);
00235
00236 return success;
00237 }
00238
00239
00240 #undef cleanup
00241 #define cleanup
00242
00247
00248 fors_star *fors_star_duplicate(const fors_star *star)
00249 {
00250 fors_star *d;
00251
00252 assure( star != NULL, return NULL, NULL );
00253
00254 d = cpl_malloc(sizeof(*d));
00255 *d = *star;
00256
00257
00258 d->pixel = fors_point_duplicate(star->pixel);
00259
00260 if (star->id != NULL) {
00261 d->id = fors_std_star_duplicate(star->id);
00262 }
00263
00264 return d;
00265 }
00266
00267
00272
00273 void fors_star_delete(fors_star **star)
00274 {
00275 if (star && *star) {
00276 fors_point_delete(&(*star)->pixel);
00277 if ((*star)->id != NULL) {
00278 fors_std_star_delete_const(&((*star)->id));
00279 }
00280 cpl_free(*star); *star = NULL;
00281 }
00282 return;
00283 }
00284
00285
00290
00291 void fors_star_delete_but_standard(fors_star **star)
00292 {
00293 if (star && *star) {
00294 fors_point_delete(&(*star)->pixel);
00295 cpl_free(*star); *star = NULL;
00296 }
00297 return;
00298 }
00299
00300
00307
00308 bool
00309 fors_star_equal(const fors_star *s,
00310 const fors_star *t)
00311 {
00312 assure( s != NULL && t != NULL, return true, NULL );
00313
00314 return (fors_point_equal(s->pixel, t->pixel));
00315 }
00316
00317
00318 #undef clenaup
00319 #define cleanup
00320
00327
00328 bool
00329 fors_star_brighter_than(const fors_star *s1,
00330 const fors_star *s2,
00331 void *data)
00332 {
00333 data = data;
00334 return (s1->magnitude < s2->magnitude);
00335 }
00336
00337
00338 #undef cleanup
00339 #define cleanup
00340
00346
00347 double fors_star_distsq(const fors_star *s, const fors_star *t)
00348 {
00349 assure( s != NULL, return 0, NULL );
00350 assure( t != NULL, return 0, NULL );
00351
00352 return fors_point_distsq(s->pixel, t->pixel);
00353 }
00354
00355
00356 #undef cleanup
00357 #define cleanup
00358
00364
00365 double fors_star_extension(const fors_star *s, void *data)
00366 {
00367 assure( s != NULL, return -1, NULL );
00368 data = data;
00369
00370
00371 return s->fwhm / TWOSQRT2LN2;
00372 }
00373
00374
00375 #undef cleanup
00376 #define cleanup
00377
00383
00384 double fors_star_stellarity(const fors_star *s, void *data)
00385 {
00386 assure( s != NULL, return -1, NULL );
00387 data = data;
00388
00389 return s->stellarity_index;
00390 }
00391
00392
00393 #undef cleanup
00394 #define cleanup
00395
00401
00402 double fors_star_ellipticity(const fors_star *s, void *data)
00403 {
00404 assure( s != NULL, return -1, NULL );
00405 data = data;
00406
00407 if (s->semi_major <= 0) return 1;
00408 else return 1 - (s->semi_minor / s->semi_major);
00409 }
00410
00411
00417
00418 void fors_star_print(cpl_msg_severity level, const fors_star *s)
00419 {
00420 if (s == NULL) {
00421 fors_msg(level, "[NULL]");
00422 }
00423 else {
00424 fors_msg(level, "at (%7.2f, %7.2f): m = %g +- %g (mc = %g +- %g), "
00425 "shape: (%g, %g, %g)",
00426 s->pixel->x, s->pixel->y,
00427 s->magnitude, s->dmagnitude,
00428 s->magnitude_corr, s->dmagnitude_corr,
00429 s->orientation, s->semi_major, s->semi_minor);
00430 }
00431
00432 return;
00433 }
00434
00435
00441
00442 void
00443 fors_star_print_list(cpl_msg_severity level, const fors_star_list *sl)
00444 {
00445 if (sl == NULL) fors_msg(level, "Null list");
00446 else {
00447 const fors_star *s;
00448
00449 for (s = fors_star_list_first_const(sl);
00450 s != NULL;
00451 s = fors_star_list_next_const(sl)) {
00452 fors_star_print(level, s);
00453 }
00454 }
00455 return;
00456 }
00457
00458
00465
00466 double
00467 fors_star_get_x(const fors_star *s, void *data)
00468 {
00469 assure( s != NULL, return -1, NULL );
00470
00471 data = data;
00472
00473 return s->pixel->x;
00474 }
00475
00476
00483
00484 double
00485 fors_star_get_y(const fors_star *s, void *data)
00486 {
00487 assure( s != NULL, return -1, NULL );
00488
00489 data = data;
00490
00491 return s->pixel->y;
00492 }
00493
00494
00495
00502
00503 double
00504 fors_star_get_zeropoint(const fors_star *s, void *data)
00505 {
00506 assure( s != NULL, return 0, NULL );
00507 assure( s->id != NULL, return 0, NULL );
00508 data = data;
00509
00510 return (s->id->magnitude - s->magnitude_corr);
00511 }
00512
00513
00520
00521 double
00522 fors_star_get_zeropoint_err(const fors_star *s, void *data)
00523 {
00524 assure( s != NULL, return 0, NULL );
00525 assure( s->id != NULL, return 0, NULL );
00526 data = data;
00527
00528 return sqrt(s->dmagnitude_corr * s->dmagnitude_corr +
00529 s->id->dmagnitude * s->id->dmagnitude);
00530 }
00531
00532
00539
00540 bool
00541 fors_star_is_identified(const fors_star *s, void *data)
00542 {
00543 data = data;
00544 assure( s != NULL, return 0, NULL );
00545 return (s->id != NULL && s->id->trusted);
00546 }
00547
00548 #define LIST_DEFINE
00549 #undef LIST_ELEM
00550 #define LIST_ELEM fors_star
00551 #include <list.h>
00552