31#include "moo_target_table.h"
32#include "moo_fibres_table.h"
33#include "moo_rbn_single.h"
62 const char *res[] = {
"STARE",
"STARENOD",
"XSWITCH" };
96 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
99 res->primary_header = cpl_propertylist_duplicate(self->primary_header);
100 res->table = cpl_table_duplicate(self->table);
111 case MOO_MODE_STARENOD:
113 case MOO_MODE_XSWITCH:
121moo_create_empty_target_table(
void)
124 cpl_table *table = NULL;
126 cpl_errorstate prestate = cpl_errorstate_get();
128 table = cpl_table_new(0);
130 moo_try_check(cpl_table_new_column(table, MOO_TARGET_TABLE_INDEXTARG,
133 moo_try_check(cpl_table_new_column(table, MOO_TARGET_TABLE_TARGNAME,
136 moo_try_check(cpl_table_new_column(table, MOO_TARGET_TABLE_TARGALPHA,
139 moo_try_check(cpl_table_new_column(table, MOO_TARGET_TABLE_TARGDELTA,
142 moo_try_check(cpl_table_new_column(table, MOO_TARGET_TABLE_TYPE,
145 moo_try_check(cpl_table_new_column(table, MOO_TARGET_TABLE_FIBRE,
148 moo_try_check(cpl_table_new_column(table, MOO_TARGET_TABLE_INDEX,
151 cpl_table_new_column(table, MOO_TARGET_TABLE_PAIREDFIBRE, CPL_TYPE_INT);
152 moo_try_check(cpl_table_new_column(table, MOO_TARGET_TABLE_MAG,
155 moo_try_check(cpl_table_new_column(table, MOO_TARGET_TABLE_INDEXRBN,
158 cpl_table_new_column(table, MOO_TARGET_TABLE_PAIREDINDEXRBN, CPL_TYPE_INT);
159 cpl_table_new_column(table, MOO_TARGET_TABLE_EXPTIMERI, CPL_TYPE_DOUBLE);
160 cpl_table_new_column(table, MOO_TARGET_TABLE_EXPTIMEYJ, CPL_TYPE_DOUBLE);
161 cpl_table_new_column(table, MOO_TARGET_TABLE_EXPTIMEH, CPL_TYPE_DOUBLE);
162 cpl_table_new_column(table, MOO_TARGET_TABLE_OBSTYPE, CPL_TYPE_STRING);
163 cpl_table_new_column(table, MOO_TARGET_TABLE_SUBSKYMODE, CPL_TYPE_STRING);
164 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRRI_SCI, CPL_TYPE_DOUBLE);
165 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRYJ_SCI, CPL_TYPE_DOUBLE);
166 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRH_SCI, CPL_TYPE_DOUBLE);
167 cpl_table_new_column(table, MOO_TARGET_TABLE_TRANSRI, CPL_TYPE_FLOAT);
168 cpl_table_new_column(table, MOO_TARGET_TABLE_TRANSYJ, CPL_TYPE_FLOAT);
169 cpl_table_new_column(table, MOO_TARGET_TABLE_TRANSH, CPL_TYPE_FLOAT);
170 cpl_table_new_column(table, MOO_TARGET_TABLE_NBSKY, CPL_TYPE_INT);
171 cpl_table_new_column(table, MOO_TARGET_TABLE_MAX_DIST_SLIT, CPL_TYPE_INT);
172 cpl_table_new_column(table, MOO_TARGET_TABLE_MAX_DIST_SKY, CPL_TYPE_FLOAT);
173 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRRI_EXT, CPL_TYPE_FLOAT);
174 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRYJ_EXT, CPL_TYPE_FLOAT);
175 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRH_EXT, CPL_TYPE_FLOAT);
176 cpl_table_new_column(table, MOO_TARGET_TABLE_DERSNRRI_EXT, CPL_TYPE_FLOAT);
177 cpl_table_new_column(table, MOO_TARGET_TABLE_DERSNRYJ_EXT, CPL_TYPE_FLOAT);
178 cpl_table_new_column(table, MOO_TARGET_TABLE_DERSNRH_EXT, CPL_TYPE_FLOAT);
179 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRRI_RBN, CPL_TYPE_FLOAT);
180 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRYJ_RBN, CPL_TYPE_FLOAT);
181 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRH_RBN, CPL_TYPE_FLOAT);
182 cpl_table_new_column(table, MOO_TARGET_TABLE_PTRANSRI, CPL_TYPE_FLOAT);
183 cpl_table_new_column(table, MOO_TARGET_TABLE_PTRANSYJ, CPL_TYPE_FLOAT);
184 cpl_table_new_column(table, MOO_TARGET_TABLE_PTRANSH, CPL_TYPE_FLOAT);
185 cpl_table_new_column(table, MOO_TARGET_TABLE_PNBSKY, CPL_TYPE_INT);
186 cpl_table_new_column(table, MOO_TARGET_TABLE_PMAX_DIST_SLIT, CPL_TYPE_INT);
187 cpl_table_new_column(table, MOO_TARGET_TABLE_PMAX_DIST_SKY, CPL_TYPE_FLOAT);
188 cpl_table_new_column(table, MOO_TARGET_TABLE_PMEDSNRRI_EXT, CPL_TYPE_FLOAT);
189 cpl_table_new_column(table, MOO_TARGET_TABLE_PMEDSNRYJ_EXT, CPL_TYPE_FLOAT);
190 cpl_table_new_column(table, MOO_TARGET_TABLE_PMEDSNRH_EXT, CPL_TYPE_FLOAT);
191 cpl_table_new_column(table, MOO_TARGET_TABLE_PDERSNRRI_EXT, CPL_TYPE_FLOAT);
192 cpl_table_new_column(table, MOO_TARGET_TABLE_PDERSNRYJ_EXT, CPL_TYPE_FLOAT);
193 cpl_table_new_column(table, MOO_TARGET_TABLE_PDERSNRH_EXT, CPL_TYPE_FLOAT);
194 cpl_table_new_column(table, MOO_TARGET_TABLE_PMEDSNRRI_RBN, CPL_TYPE_FLOAT);
195 cpl_table_new_column(table, MOO_TARGET_TABLE_PMEDSNRYJ_RBN, CPL_TYPE_FLOAT);
196 cpl_table_new_column(table, MOO_TARGET_TABLE_PMEDSNRH_RBN, CPL_TYPE_FLOAT);
199 result->table = table;
200 result->primary_header = cpl_propertylist_new();
203 if (!cpl_errorstate_is_equal(prestate)) {
211_moo_create_target_table(moo_rbn *rbn, moo_target_table_params *params)
214 cpl_table *table = NULL;
215 cpl_ensure(rbn != NULL, CPL_ERROR_NULL_INPUT, NULL);
217 cpl_ensure(fibre_table, CPL_ERROR_NULL_INPUT, NULL);
219 cpl_errorstate prestate = cpl_errorstate_get();
220 int nrow = cpl_table_get_nrow(fibre_table);
222 table = cpl_table_new(nrow);
223 moo_try_check(cpl_table_new_column(table, MOO_TARGET_TABLE_INDEXTARG,
226 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_TARGNAME,
228 MOO_FIBRES_TABLE_TARGNAME),
230 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_TARGALPHA,
232 MOO_FIBRES_TABLE_TARGALPHA),
234 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_TARGDELTA,
236 MOO_FIBRES_TABLE_TARGDELTA),
238 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_TYPE,
240 MOO_FIBRES_TABLE_TYPE),
242 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_FIBRE,
244 MOO_FIBRES_TABLE_FIBRE),
246 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_SPECTRO,
248 MOO_FIBRES_TABLE_SPECTRO),
250 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_INDEX,
252 MOO_FIBRES_TABLE_INDEX),
254 moo_try_check(cpl_table_duplicate_column(table,
255 MOO_TARGET_TABLE_PAIREDFIBRE,
257 MOO_FIBRES_TABLE_PAIREDFIBRE),
259 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_MAG,
260 fibre_table, MOO_FIBRES_TABLE_MAG),
262 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_INDEXRBN,
264 MOO_FIBRES_TABLE_INDEXRBN),
266 cpl_table_new_column(table, MOO_TARGET_TABLE_PAIREDINDEXRBN, CPL_TYPE_INT);
267 cpl_table_new_column(table, MOO_TARGET_TABLE_EXPTIMERI, CPL_TYPE_DOUBLE);
268 cpl_table_new_column(table, MOO_TARGET_TABLE_EXPTIMEYJ, CPL_TYPE_DOUBLE);
269 cpl_table_new_column(table, MOO_TARGET_TABLE_EXPTIMEH, CPL_TYPE_DOUBLE);
270 cpl_table_new_column(table, MOO_TARGET_TABLE_OBSTYPE, CPL_TYPE_STRING);
271 cpl_table_new_column(table, MOO_TARGET_TABLE_SUBSKYMODE, CPL_TYPE_STRING);
272 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRRI_SCI, CPL_TYPE_DOUBLE);
273 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRYJ_SCI, CPL_TYPE_DOUBLE);
274 cpl_table_new_column(table, MOO_TARGET_TABLE_MEDSNRH_SCI, CPL_TYPE_DOUBLE);
275 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_TRANSRI,
277 MOO_FIBRES_TABLE_TRANS_RI),
279 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_TRANSYJ,
281 MOO_FIBRES_TABLE_TRANS_YJ),
283 moo_try_check(cpl_table_duplicate_column(table, MOO_TARGET_TABLE_TRANSH,
285 MOO_FIBRES_TABLE_TRANS_H),
287 cpl_table_new_column(table, MOO_TARGET_TABLE_NBSKY, CPL_TYPE_INT);
288 cpl_table_new_column(table, MOO_TARGET_TABLE_MAX_DIST_SLIT, CPL_TYPE_INT);
289 cpl_table_new_column(table, MOO_TARGET_TABLE_MAX_DIST_SKY, CPL_TYPE_FLOAT);
290 moo_try_check(cpl_table_duplicate_column(table,
291 MOO_TARGET_TABLE_MEDSNRRI_EXT,
293 MOO_FIBRES_TABLE_MEDSNR_RI_EXT),
295 moo_try_check(cpl_table_duplicate_column(table,
296 MOO_TARGET_TABLE_MEDSNRYJ_EXT,
298 MOO_FIBRES_TABLE_MEDSNR_YJ_EXT),
300 moo_try_check(cpl_table_duplicate_column(table,
301 MOO_TARGET_TABLE_MEDSNRH_EXT,
303 MOO_FIBRES_TABLE_MEDSNR_H_EXT),
305 moo_try_check(cpl_table_duplicate_column(table,
306 MOO_TARGET_TABLE_DERSNRRI_EXT,
308 MOO_FIBRES_TABLE_DERSNR_RI_EXT),
310 moo_try_check(cpl_table_duplicate_column(table,
311 MOO_TARGET_TABLE_DERSNRYJ_EXT,
313 MOO_FIBRES_TABLE_DERSNR_YJ_EXT),
315 moo_try_check(cpl_table_duplicate_column(table,
316 MOO_TARGET_TABLE_DERSNRH_EXT,
318 MOO_FIBRES_TABLE_DERSNR_H_EXT),
320 moo_try_check(cpl_table_duplicate_column(table,
321 MOO_TARGET_TABLE_MEDSNRRI_RBN,
323 MOO_FIBRES_TABLE_MEDSNR_RI_RBN),
325 moo_try_check(cpl_table_duplicate_column(table,
326 MOO_TARGET_TABLE_MEDSNRYJ_RBN,
328 MOO_FIBRES_TABLE_MEDSNR_YJ_RBN),
330 moo_try_check(cpl_table_duplicate_column(table,
331 MOO_TARGET_TABLE_MEDSNRH_RBN,
333 MOO_FIBRES_TABLE_MEDSNR_H_RBN),
337 cpl_table_get_data_int_const(fibre_table, MOO_FIBRES_TABLE_HEALTH);
339 cpl_table_get_data_string_const(fibre_table, MOO_FIBRES_TABLE_TYPE);
340 const int *indexrbnt =
341 cpl_table_get_data_int_const(fibre_table, MOO_FIBRES_TABLE_INDEXRBN);
342 cpl_table_select_all(table);
344 for (
int i = 0; i < nrow; i++) {
345 int health = healtht[i];
346 const char *type = typet[i];
347 int indexrbn = indexrbnt[i];
349 if (health != 1 || indexrbn == 0) {
350 cpl_table_unselect_row(table, i);
352 else if (strcmp(type, MOO_FIBRES_TABLE_TYPE_SKYCONTAM) == 0 ||
353 strcmp(type, MOO_FIBRES_TABLE_TYPE_BLANK) == 0) {
354 cpl_table_unselect_row(table, i);
356 else if (params->nosky == 1 &&
357 strcmp(type, MOO_FIBRES_TABLE_TYPE_SKY) == 0) {
358 cpl_table_unselect_row(table, i);
361 cpl_table_set_int(table, MOO_TARGET_TABLE_PAIREDINDEXRBN, i, -1);
362 cpl_table_set_double(table, MOO_TARGET_TABLE_EXPTIMERI, i, NAN);
363 cpl_table_set_double(table, MOO_TARGET_TABLE_EXPTIMEYJ, i, NAN);
364 cpl_table_set_double(table, MOO_TARGET_TABLE_EXPTIMEH, i, NAN);
365 cpl_table_set_double(table, MOO_TARGET_TABLE_MEDSNRRI_SCI, i, NAN);
366 cpl_table_set_double(table, MOO_TARGET_TABLE_MEDSNRYJ_SCI, i, NAN);
367 cpl_table_set_double(table, MOO_TARGET_TABLE_MEDSNRH_SCI, i, NAN);
368 cpl_table_set_int(table, MOO_TARGET_TABLE_NBSKY, i, -1);
369 cpl_table_set_int(table, MOO_TARGET_TABLE_MAX_DIST_SLIT, i, -1);
370 cpl_table_set_float(table, MOO_TARGET_TABLE_MAX_DIST_SKY, i, NAN);
373 cpl_table *good = cpl_table_extract_selected(table);
374 result->table = good;
375 result->primary_header = cpl_propertylist_new();
378 cpl_table_delete(table);
379 if (!cpl_errorstate_is_equal(prestate)) {
388_moo_create_target_table_stare(moo_rbn *rbn, moo_target_table_params *params)
392 cpl_ensure(rbn != NULL, CPL_ERROR_NULL_INPUT, NULL);
394 cpl_ensure(fibre_table, CPL_ERROR_NULL_INPUT, NULL);
396 cpl_errorstate prestate = cpl_errorstate_get();
397 moo_try_check(result = _moo_create_target_table(rbn, params),
" ");
398 cpl_table *table = result->table;
399 int nrow = cpl_table_get_nrow(table);
400 char **obstype = cpl_table_get_data_string(table, MOO_TARGET_TABLE_OBSTYPE);
402 cpl_table_get_data_string_const(table, MOO_TARGET_TABLE_TYPE);
404 for (
int i = 0; i < nrow; i++) {
405 const char *type = types[i];
406 if (strcmp(type, MOO_FIBRES_TABLE_TYPE_SKY) == 0) {
407 obstype[i] = cpl_strdup(MOO_OBSTYPE_SKYSTARE);
410 obstype[i] = cpl_strdup(MOO_OBSTYPE_OBSSTARE);
412 cpl_table_set_int(table, MOO_TARGET_TABLE_PAIREDFIBRE, i, -1);
413 cpl_table_set_int(table, MOO_TARGET_TABLE_PAIREDINDEXRBN, i, -1);
417 if (!cpl_errorstate_is_equal(prestate)) {
427 cpl_table *fibre_table,
430 cpl_table *target = self->table;
432 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_RI_EXT, ft_idx,
435 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_DERSNR_RI_EXT, ft_idx,
438 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_YJ_EXT, ft_idx,
441 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_DERSNR_YJ_EXT, ft_idx,
444 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_H_EXT, ft_idx,
447 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_DERSNR_H_EXT, ft_idx,
450 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_RI_RBN, ft_idx,
453 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_YJ_RBN, ft_idx,
456 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_H_RBN, ft_idx,
459 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRRI_EXT, idx, snrriext);
460 cpl_table_set_float(target, MOO_TARGET_TABLE_DERSNRRI_EXT, idx, dsnrriext);
461 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRYJ_EXT, idx, snryjext);
462 cpl_table_set_float(target, MOO_TARGET_TABLE_DERSNRYJ_EXT, idx, dsnryjext);
463 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRH_EXT, idx, snrhext);
464 cpl_table_set_float(target, MOO_TARGET_TABLE_DERSNRH_EXT, idx, dsnrhext);
466 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRRI_RBN, idx, snrrirbn);
467 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRYJ_RBN, idx, snryjrbn);
468 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRH_RBN, idx, snrhrbn);
470 return CPL_ERROR_NONE;
479 cpl_table *target = self->table;
480 cpl_table *origin = tocopy->table;
481 int nbsky = cpl_table_get_int(origin, MOO_TARGET_TABLE_NBSKY, ft_idx, NULL);
483 cpl_table_get_int(origin, MOO_TARGET_TABLE_MAX_DIST_SLIT, ft_idx, NULL);
485 cpl_table_get_float(origin, MOO_TARGET_TABLE_MAX_DIST_SKY, ft_idx,
488 cpl_table_get_int(origin, MOO_TARGET_TABLE_PNBSKY, ft_idx, NULL);
490 cpl_table_get_int(origin, MOO_TARGET_TABLE_PMAX_DIST_SLIT, ft_idx,
493 cpl_table_get_float(origin, MOO_TARGET_TABLE_PMAX_DIST_SKY, ft_idx,
495 float snrriext = cpl_table_get_float(origin, MOO_TARGET_TABLE_MEDSNRRI_EXT,
497 float dsnrriext = cpl_table_get_float(origin, MOO_TARGET_TABLE_DERSNRRI_EXT,
499 float snryjext = cpl_table_get_float(origin, MOO_TARGET_TABLE_MEDSNRYJ_EXT,
501 float dsnryjext = cpl_table_get_float(origin, MOO_TARGET_TABLE_DERSNRYJ_EXT,
504 cpl_table_get_float(origin, MOO_TARGET_TABLE_MEDSNRH_EXT, ft_idx, NULL);
506 cpl_table_get_float(origin, MOO_TARGET_TABLE_DERSNRH_EXT, ft_idx, NULL);
507 float snrrirbn = cpl_table_get_float(origin, MOO_TARGET_TABLE_MEDSNRRI_RBN,
509 float snryjrbn = cpl_table_get_float(origin, MOO_TARGET_TABLE_MEDSNRYJ_RBN,
512 cpl_table_get_float(origin, MOO_TARGET_TABLE_MEDSNRH_RBN, ft_idx, NULL);
515 cpl_table_get_float(origin, MOO_TARGET_TABLE_PMEDSNRRI_EXT, ft_idx,
518 cpl_table_get_float(origin, MOO_TARGET_TABLE_PDERSNRRI_EXT, ft_idx,
521 cpl_table_get_float(origin, MOO_TARGET_TABLE_PMEDSNRYJ_EXT, ft_idx,
524 cpl_table_get_float(origin, MOO_TARGET_TABLE_PDERSNRYJ_EXT, ft_idx,
526 float psnrhext = cpl_table_get_float(origin, MOO_TARGET_TABLE_PMEDSNRH_EXT,
528 float pdsnrhext = cpl_table_get_float(origin, MOO_TARGET_TABLE_PDERSNRH_EXT,
531 cpl_table_get_float(origin, MOO_TARGET_TABLE_PMEDSNRRI_RBN, ft_idx,
534 cpl_table_get_float(origin, MOO_TARGET_TABLE_PMEDSNRYJ_RBN, ft_idx,
536 float psnrhrbn = cpl_table_get_float(origin, MOO_TARGET_TABLE_PMEDSNRH_RBN,
539 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRRI_EXT, idx, snrriext);
540 cpl_table_set_float(target, MOO_TARGET_TABLE_DERSNRRI_EXT, idx, dsnrriext);
541 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRYJ_EXT, idx, snryjext);
542 cpl_table_set_float(target, MOO_TARGET_TABLE_DERSNRYJ_EXT, idx, dsnryjext);
543 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRH_EXT, idx, snrhext);
544 cpl_table_set_float(target, MOO_TARGET_TABLE_DERSNRH_EXT, idx, dsnrhext);
546 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRRI_RBN, idx, snrrirbn);
547 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRYJ_RBN, idx, snryjrbn);
548 cpl_table_set_float(target, MOO_TARGET_TABLE_MEDSNRH_RBN, idx, snrhrbn);
550 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRRI_EXT, idx, psnrriext);
551 cpl_table_set_float(target, MOO_TARGET_TABLE_PDERSNRRI_EXT, idx,
553 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRYJ_EXT, idx, psnryjext);
554 cpl_table_set_float(target, MOO_TARGET_TABLE_PDERSNRYJ_EXT, idx,
556 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRH_EXT, idx, psnrhext);
557 cpl_table_set_float(target, MOO_TARGET_TABLE_PDERSNRH_EXT, idx, pdsnrhext);
559 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRRI_RBN, idx, psnrrirbn);
560 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRYJ_RBN, idx, psnryjrbn);
561 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRH_RBN, idx, psnrhrbn);
563 cpl_table_set_int(target, MOO_TARGET_TABLE_NBSKY, idx, nbsky);
564 cpl_table_set_int(target, MOO_TARGET_TABLE_MAX_DIST_SLIT, idx, maxdistslit);
565 cpl_table_set_float(target, MOO_TARGET_TABLE_MAX_DIST_SKY, idx, maxdistsky);
567 cpl_table_set_int(target, MOO_TARGET_TABLE_PNBSKY, idx, pnbsky);
568 cpl_table_set_int(target, MOO_TARGET_TABLE_PMAX_DIST_SLIT, idx,
570 cpl_table_set_float(target, MOO_TARGET_TABLE_PMAX_DIST_SKY, idx,
572 return CPL_ERROR_NONE;
578 cpl_table *fibre_table,
581 cpl_table *target = self->table;
583 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_RI_EXT, ft_idx,
586 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_DERSNR_RI_EXT, ft_idx,
589 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_YJ_EXT, ft_idx,
592 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_DERSNR_YJ_EXT, ft_idx,
595 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_H_EXT, ft_idx,
598 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_DERSNR_H_EXT, ft_idx,
601 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_RI_RBN, ft_idx,
604 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_YJ_RBN, ft_idx,
607 cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_MEDSNR_H_RBN, ft_idx,
610 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRRI_EXT, idx, snrriext);
611 cpl_table_set_float(target, MOO_TARGET_TABLE_PDERSNRRI_EXT, idx, dsnrriext);
612 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRYJ_EXT, idx, snryjext);
613 cpl_table_set_float(target, MOO_TARGET_TABLE_PDERSNRYJ_EXT, idx, dsnryjext);
614 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRH_EXT, idx, snrhext);
615 cpl_table_set_float(target, MOO_TARGET_TABLE_PDERSNRH_EXT, idx, dsnrhext);
616 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRRI_RBN, idx, snrrirbn);
617 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRYJ_RBN, idx, snryjrbn);
618 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRH_RBN, idx, snrhrbn);
620 return CPL_ERROR_NONE;
629 cpl_table *target = self->table;
630 cpl_table *origin = torigin->table;
631 moo_target_table_set_ft_psnr(self, idx, origin, ft_idx);
634 cpl_table_get_int(origin, MOO_TARGET_TABLE_NBSKY, ft_idx, NULL);
636 cpl_table_get_int(origin, MOO_TARGET_TABLE_MAX_DIST_SLIT, ft_idx, NULL);
638 cpl_table_get_float(origin, MOO_TARGET_TABLE_MAX_DIST_SKY, ft_idx,
640 cpl_table_set_int(target, MOO_TARGET_TABLE_PNBSKY, idx, pnbsky);
641 cpl_table_set_int(target, MOO_TARGET_TABLE_PMAX_DIST_SLIT, idx,
643 cpl_table_set_float(target, MOO_TARGET_TABLE_PMAX_DIST_SKY, idx,
646 return CPL_ERROR_NONE;
650_moo_target_table_add_from_ft(cpl_table *target,
651 cpl_table *fibre_table,
652 cpl_table *pfibre_table,
657 cpl_table_set_size(target, nrow);
660 cpl_table_get_string(fibre_table, MOO_FIBRES_TABLE_TYPE, ft_idx);
661 const char *targname =
662 cpl_table_get_string(fibre_table, MOO_FIBRES_TABLE_TARGNAME, ft_idx);
664 cpl_table_get_double(fibre_table, MOO_FIBRES_TABLE_TARGALPHA, ft_idx,
667 cpl_table_get_double(fibre_table, MOO_FIBRES_TABLE_TARGDELTA, ft_idx,
670 cpl_table_get_string(fibre_table, MOO_FIBRES_TABLE_FIBRE, ft_idx);
672 cpl_table_get_int(fibre_table, MOO_FIBRES_TABLE_INDEX, ft_idx, NULL);
673 int pfibre = cpl_table_get_int(fibre_table, MOO_FIBRES_TABLE_PAIREDFIBRE,
676 cpl_table_get_int(fibre_table, MOO_FIBRES_TABLE_INDEXRBN, ft_idx, NULL);
678 float ptransri = NAN;
679 float ptransyj = NAN;
682 int health = cpl_table_get_int(pfibre_table, MOO_FIBRES_TABLE_HEALTH,
686 cpl_table_get_int(pfibre_table, MOO_FIBRES_TABLE_INDEXRBN,
689 cpl_table_get_float(pfibre_table, MOO_FIBRES_TABLE_TRANS_RI,
692 cpl_table_get_float(pfibre_table, MOO_FIBRES_TABLE_TRANS_YJ,
695 cpl_table_get_float(pfibre_table, MOO_FIBRES_TABLE_TRANS_H,
698 cpl_table_get_float(pfibre_table, MOO_FIBRES_TABLE_TRANS_RI,
703 cpl_table_get_double(fibre_table, MOO_FIBRES_TABLE_MAG, ft_idx, NULL);
704 float transri = cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_TRANS_RI,
706 float transyj = cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_TRANS_YJ,
708 float transh = cpl_table_get_float(fibre_table, MOO_FIBRES_TABLE_TRANS_H,
711 cpl_table_set_int(target, MOO_TARGET_TABLE_INDEXTARG, nrow - 1, -1);
712 cpl_table_set_int(target, MOO_TARGET_TABLE_NBSKY, nrow - 1, -1);
713 cpl_table_set_int(target, MOO_TARGET_TABLE_MAX_DIST_SLIT, nrow - 1, -1);
714 cpl_table_set_float(target, MOO_TARGET_TABLE_MAX_DIST_SKY, nrow - 1, NAN);
715 cpl_table_set_int(target, MOO_TARGET_TABLE_PNBSKY, nrow - 1, -1);
716 cpl_table_set_int(target, MOO_TARGET_TABLE_PMAX_DIST_SLIT, nrow - 1, -1);
717 cpl_table_set_float(target, MOO_TARGET_TABLE_PMAX_DIST_SKY, nrow - 1, NAN);
719 cpl_table_set_string(target, MOO_TARGET_TABLE_TARGNAME, nrow - 1, targname);
720 cpl_table_set_double(target, MOO_TARGET_TABLE_TARGALPHA, nrow - 1,
722 cpl_table_set_double(target, MOO_TARGET_TABLE_TARGDELTA, nrow - 1,
724 cpl_table_set_double(target, MOO_TARGET_TABLE_MAG, nrow - 1, mag);
725 cpl_table_set_string(target, MOO_TARGET_TABLE_FIBRE, nrow - 1, fibre);
726 cpl_table_set_int(target, MOO_TARGET_TABLE_INDEX, nrow - 1, index);
727 cpl_table_set_int(target, MOO_TARGET_TABLE_PAIREDFIBRE, nrow - 1, pfibre);
728 cpl_table_set_string(target, MOO_TARGET_TABLE_TYPE, nrow - 1, type);
729 cpl_table_set_string(target, MOO_TARGET_TABLE_OBSTYPE, nrow - 1, obstype);
730 cpl_table_set_int(target, MOO_TARGET_TABLE_INDEXRBN, nrow - 1, indexrbn);
731 cpl_table_set_int(target, MOO_TARGET_TABLE_PAIREDINDEXRBN, nrow - 1,
733 cpl_table_set_float(target, MOO_TARGET_TABLE_TRANSRI, nrow - 1, transri);
734 cpl_table_set_float(target, MOO_TARGET_TABLE_TRANSYJ, nrow - 1, transyj);
735 cpl_table_set_float(target, MOO_TARGET_TABLE_TRANSH, nrow - 1, transh);
736 cpl_table_set_float(target, MOO_TARGET_TABLE_PTRANSRI, nrow - 1, ptransri);
737 cpl_table_set_float(target, MOO_TARGET_TABLE_PTRANSYJ, nrow - 1, ptransyj);
738 cpl_table_set_float(target, MOO_TARGET_TABLE_PTRANSH, nrow - 1, ptransh);
740 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRRI_EXT, nrow - 1, NAN);
741 cpl_table_set_float(target, MOO_TARGET_TABLE_PDERSNRRI_EXT, nrow - 1, NAN);
742 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRYJ_EXT, nrow - 1, NAN);
743 cpl_table_set_float(target, MOO_TARGET_TABLE_PDERSNRYJ_EXT, nrow - 1, NAN);
744 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRH_EXT, nrow - 1, NAN);
745 cpl_table_set_float(target, MOO_TARGET_TABLE_PDERSNRH_EXT, nrow - 1, NAN);
746 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRRI_RBN, nrow - 1, NAN);
747 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRYJ_RBN, nrow - 1, NAN);
748 cpl_table_set_float(target, MOO_TARGET_TABLE_PMEDSNRH_RBN, nrow - 1, NAN);
749 return CPL_ERROR_NONE;
752_moo_create_target_table_xswitch(moo_rbn *rbnA,
754 moo_target_table_params *params)
758 cpl_ensure(rbnA != NULL, CPL_ERROR_NULL_INPUT, NULL);
759 cpl_ensure(rbnB != NULL, CPL_ERROR_NULL_INPUT, NULL);
763 cpl_ensure(fibre_tableA, CPL_ERROR_NULL_INPUT, NULL);
764 cpl_ensure(fibre_tableB, CPL_ERROR_NULL_INPUT, NULL);
769 cpl_errorstate prestate = cpl_errorstate_get();
770 moo_try_check(result = moo_create_empty_target_table(),
" ");
771 cpl_table *table = result->table;
773 int nrow = cpl_table_get_nrow(table);
775 int *hAt = cpl_table_get_data_int(fibre_tableA, MOO_FIBRES_TABLE_HEALTH);
777 cpl_table_get_data_int(fibre_tableA, MOO_FIBRES_TABLE_INDEXRBN);
779 cpl_table_get_data_int(fibre_tableA, MOO_FIBRES_TABLE_PAIREDFIBRE);
781 cpl_table_get_data_string(fibre_tableA, MOO_FIBRES_TABLE_TYPE);
782 int frow = cpl_table_get_nrow(fibre_tableA);
785 cpl_table_get_data_int(fibre_tableB, MOO_FIBRES_TABLE_PAIREDFIBRE);
787 cpl_table_get_data_string(fibre_tableB, MOO_FIBRES_TABLE_TYPE);
789 int *fdone = cpl_calloc(
sizeof(
int), frow);
791 for (
int i = 0; i < frow; i++) {
792 const char *obstype = NULL;
794 int indexrbnA = indexrbnAt[i];
795 char *typeA = typeAt[i];
796 char *typeB = typeBt[i];
800 if (fdone[i] == 0 && hA != 0 && indexrbnA > 0) {
801 if (strcmp(typeA, MOO_FIBRES_TABLE_TYPE_SCIENCE) == 0) {
803 if (pfA >= 0 && hAt[pfA] != 0) {
805 char *ptypeA = typeAt[pfA];
806 if (strcmp(ptypeA, MOO_FIBRES_TABLE_TYPE_SKY) == 0) {
807 if (strcmp(typeB, MOO_FIBRES_TABLE_TYPE_SKY) == 0) {
808 obstype = MOO_OBSTYPE_OBSSWITCH;
811 obstype = MOO_OBSTYPE_OBSPNODSTARE;
815 if (strcmp(typeB, MOO_FIBRES_TABLE_TYPE_SKY) == 0) {
816 obstype = MOO_OBSTYPE_OBSNODSTARE;
819 obstype = MOO_OBSTYPE_OBSSWITCHSTARE;
824 if (strcmp(typeB, MOO_FIBRES_TABLE_TYPE_SKY) == 0) {
825 obstype = MOO_OBSTYPE_OBSNOD;
828 obstype = MOO_OBSTYPE_OBSSTARE;
832 _moo_target_table_add_from_ft(table, fibre_tableA, fibre_tableB,
835 else if (strcmp(typeB, MOO_FIBRES_TABLE_TYPE_SCIENCE) == 0) {
837 if (pfB < 0 || hAt[pfB] == 0) {
838 if (strcmp(typeA, MOO_FIBRES_TABLE_TYPE_SKY) == 0) {
839 obstype = MOO_OBSTYPE_OBSPNOD;
842 obstype = MOO_OBSTYPE_OBSPSTARE;
845 _moo_target_table_add_from_ft(table, fibre_tableB,
846 fibre_tableA, i, nrow,
850 else if (strcmp(typeA, MOO_FIBRES_TABLE_TYPE_SKY) == 0 &&
851 strcmp(typeB, MOO_FIBRES_TABLE_TYPE_SKY) == 0 &&
852 params->nosky == 0) {
853 obstype = MOO_OBSTYPE_SKYRESNOD;
855 _moo_target_table_add_from_ft(table, fibre_tableA, fibre_tableB,
858 else if (strcmp(typeA, MOO_FIBRES_TABLE_TYPE_SKY) == 0 &&
859 strcmp(typeB, MOO_FIBRES_TABLE_TYPE_SKYCONTAM) == 0 &&
860 params->nosky == 0) {
861 obstype = MOO_OBSTYPE_SKYRESSTARE;
863 _moo_target_table_add_from_ft(table, fibre_tableA, fibre_tableB,
866 else if (strcmp(typeA, MOO_FIBRES_TABLE_TYPE_SKYCONTAM) == 0 &&
867 strcmp(typeB, MOO_FIBRES_TABLE_TYPE_SKY) == 0 &&
868 params->nosky == 0) {
869 obstype = MOO_OBSTYPE_SKYRESPSTARE;
871 _moo_target_table_add_from_ft(table, fibre_tableB, fibre_tableA,
878 if (!cpl_errorstate_is_equal(prestate)) {
904 moo_target_table_params *params)
906 cpl_ensure(rbnA != NULL, CPL_ERROR_NULL_INPUT, NULL);
907 cpl_ensure(params != NULL, CPL_ERROR_NULL_INPUT, NULL);
910 cpl_msg_info(__func__,
"Create target table for mode %s",
911 moo_target_table_get_mode_name(mode));
913 if (mode == MOO_MODE_STARE) {
914 result = _moo_create_target_table_stare(rbnA, params);
916 else if (mode == MOO_MODE_XSWITCH || mode == MOO_MODE_STARENOD) {
917 result = _moo_create_target_table_xswitch(rbnA, rbnB, params);
927 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
928 cpl_ensure_code(filename != NULL, CPL_ERROR_NULL_INPUT);
930 self->filename = filename;
931 cpl_error_code status = cpl_table_save(self->table, self->primary_header,
932 NULL, filename, CPL_IO_CREATE);
952 if (self->table != NULL) {
953 cpl_table_delete(self->table);
955 if (self->primary_header != NULL) {
956 cpl_propertylist_delete(self->primary_header);
975 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
977 cpl_table *table = self->table;
978 cpl_propertylist *order = cpl_propertylist_new();
979 cpl_propertylist_append_bool(order, MOO_TARGET_TABLE_INDEXRBN, CPL_FALSE);
980 cpl_table_sort(table, order);
981 cpl_propertylist_delete(order);
983 if (sky_rbn == NULL) {
984 cpl_table_unselect_all(table);
985 cpl_table_or_selected_string(table, MOO_TARGET_TABLE_OBSTYPE,
986 CPL_EQUAL_TO, MOO_OBSTYPE_SKYSTARE);
989 if (cpl_table_has_column(table, MOO_TARGET_TABLE_TYPENOD)) {
990 cpl_table_select_all(table);
991 cpl_table_and_selected_string(table, MOO_TARGET_TABLE_TYPENOD,
993 MOO_FIBRES_TABLE_TYPE_SKYCONTAM);
998 cpl_table_unselect_all(table);
999 cpl_table_or_selected_string(table, MOO_FIBRES_TABLE_TYPE,
1001 MOO_FIBRES_TABLE_TYPE_SKY);
1002 cpl_table_and_selected_string(table, MOO_FIBRES_TABLE_TYPE,
1004 MOO_FIBRES_TABLE_TYPE_SKYCONTAM);
1005 cpl_table_and_selected_int(table, MOO_FIBRES_TABLE_HEALTH,
1006 CPL_GREATER_THAN, 0);
1007 cpl_table_and_selected_int(table, MOO_FIBRES_TABLE_INDEXRBN,
1008 CPL_GREATER_THAN, 0);
1012 cpl_array *res = cpl_table_where_selected(table);
1029 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1030 cpl_ensure_code(self->table != NULL, CPL_ERROR_NULL_INPUT);
1032 cpl_table_unselect_all(self->table);
1033 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1034 CPL_EQUAL_TO, MOO_OBSTYPE_OBSSTARE);
1035 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1036 CPL_EQUAL_TO, MOO_OBSTYPE_SKYSTARE);
1037 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1038 CPL_EQUAL_TO, MOO_OBSTYPE_SKYRESSTARE);
1039 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1040 CPL_EQUAL_TO, MOO_OBSTYPE_OBSPNODSTARE);
1041 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1042 CPL_EQUAL_TO, MOO_OBSTYPE_OBSSWITCHSTARE);
1043 return CPL_ERROR_NONE;
1058 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1059 cpl_ensure_code(self->table != NULL, CPL_ERROR_NULL_INPUT);
1061 cpl_table_unselect_all(self->table);
1062 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1063 CPL_EQUAL_TO, MOO_OBSTYPE_OBSPSTARE);
1064 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1065 CPL_EQUAL_TO, MOO_OBSTYPE_SKYRESPSTARE);
1066 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1067 CPL_EQUAL_TO, MOO_OBSTYPE_OBSNODSTARE);
1068 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1069 CPL_EQUAL_TO, MOO_OBSTYPE_OBSSWITCHSTARE);
1070 return CPL_ERROR_NONE;
1085 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1086 cpl_ensure_code(self->table != NULL, CPL_ERROR_NULL_INPUT);
1088 cpl_table_unselect_all(self->table);
1089 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1090 CPL_EQUAL_TO, MOO_OBSTYPE_OBSNOD);
1091 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1092 CPL_EQUAL_TO, MOO_OBSTYPE_OBSSWITCH);
1093 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1094 CPL_EQUAL_TO, MOO_OBSTYPE_SKYRESNOD);
1095 return CPL_ERROR_NONE;
1110 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1111 cpl_ensure_code(self->table != NULL, CPL_ERROR_NULL_INPUT);
1113 cpl_table_unselect_all(self->table);
1114 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1115 CPL_EQUAL_TO, MOO_OBSTYPE_OBSPNOD);
1116 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1117 CPL_EQUAL_TO, MOO_OBSTYPE_OBSSWITCH);
1118 return CPL_ERROR_NONE;
1133 cpl_error_code status = CPL_ERROR_NONE;
1134 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1136 const char *transname[] = { MOO_TARGET_TABLE_TRANSRI,
1137 MOO_TARGET_TABLE_TRANSYJ,
1138 MOO_TARGET_TABLE_TRANSH };
1139 const char *ptransname[] = { MOO_TARGET_TABLE_PTRANSRI,
1140 MOO_TARGET_TABLE_PTRANSYJ,
1141 MOO_TARGET_TABLE_PTRANSH };
1143 cpl_table *table = self->table;
1144 int nrow = cpl_table_get_nrow(table);
1145 for (
int i = 0; i < nrow; i++) {
1147 cpl_table_get_int(table, MOO_TARGET_TABLE_INDEXRBN, i, NULL);
1149 cpl_table_get_int(table, MOO_TARGET_TABLE_PAIREDINDEXRBN, i, NULL);
1150 int index = cpl_table_get_int(table, MOO_TARGET_TABLE_INDEX, i, NULL);
1152 cpl_table_get_int(table, MOO_TARGET_TABLE_PAIREDFIBRE, i, NULL);
1155 cpl_table_set_int(table, MOO_TARGET_TABLE_INDEX, i, pindex);
1156 cpl_table_set_int(table, MOO_TARGET_TABLE_PAIREDFIBRE, i, index);
1158 if (pindexrbn != -1) {
1159 cpl_table_set_int(table, MOO_TARGET_TABLE_INDEXRBN, i, pindexrbn);
1160 cpl_table_set_int(table, MOO_TARGET_TABLE_PAIREDINDEXRBN, i,
1163 for (
int j = 0; j < 3; j++) {
1164 float trans = cpl_table_get_float(table, transname[j], i, NULL);
1165 float ptrans = cpl_table_get_float(table, ptransname[j], i, NULL);
1166 cpl_table_set_float(table, transname[j], i, ptrans);
1167 cpl_table_set_float(table, ptransname[j], i, trans);
1186 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1187 cpl_propertylist *order = cpl_propertylist_new();
1188 cpl_propertylist_append_bool(order, MOO_TARGET_TABLE_INDEXRBN, CPL_FALSE);
1189 cpl_table_sort(self->table, order);
1190 cpl_propertylist_delete(order);
1192 cpl_table_unselect_all(self->table);
1194 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1195 CPL_EQUAL_TO, MOO_OBSTYPE_OBSSWITCHSTARE);
1196 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1197 CPL_EQUAL_TO, MOO_OBSTYPE_OBSNODSTARE);
1198 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1199 CPL_EQUAL_TO, MOO_OBSTYPE_SKYRESPSTARE);
1202 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1203 CPL_EQUAL_TO, MOO_OBSTYPE_OBSSTARE);
1204 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1205 CPL_EQUAL_TO, MOO_OBSTYPE_SKYSTARE);
1206 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1207 CPL_EQUAL_TO, MOO_OBSTYPE_SKYRESSTARE);
1208 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1209 CPL_EQUAL_TO, MOO_OBSTYPE_OBSSWITCHSTARE);
1210 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1211 CPL_EQUAL_TO, MOO_OBSTYPE_OBSPNODSTARE);
1212 cpl_table_or_selected_string(self->table, MOO_TARGET_TABLE_OBSTYPE,
1213 CPL_EQUAL_TO, MOO_OBSTYPE_OBSPSTARE);
1216 cpl_array *res = cpl_table_where_selected(self->table);
1236 cpl_ensure(frame != NULL, CPL_ERROR_NULL_INPUT, NULL);
1237 const char *filename = cpl_frame_get_filename(frame);
1238 cpl_ensure(filename != NULL, CPL_ERROR_NULL_INPUT, NULL);
1240 cpl_errorstate prev_state = cpl_errorstate_get();
1243 res->filename = filename;
1244 res->table = cpl_table_load(filename, 1, 0);
1245 res->primary_header = cpl_propertylist_load(filename, 0);
1247 if (!cpl_errorstate_is_equal(prev_state)) {
1248 cpl_msg_error(
"moo_target_table",
"can't load TARGET_TABLE %s",
1252 cpl_errorstate_set(prev_state);
1258_moo_merge_row(cpl_table *a, cpl_size rowa, cpl_table *b, cpl_size rowb)
1261 cpl_table_get_int(a, MOO_TARGET_TABLE_INDEXRBN, rowa, NULL);
1263 cpl_table_get_int(b, MOO_TARGET_TABLE_INDEXRBN, rowb, NULL);
1265 if (indexspecA != indexspecB) {
1266 cpl_table_set_invalid(a, MOO_TARGET_TABLE_INDEXRBN, rowa);
1267 cpl_table_set_int(a, MOO_TARGET_TABLE_INDEXRBN, rowa, 0);
1271 cpl_table_get_int(a, MOO_TARGET_TABLE_PAIREDINDEXRBN, rowa, NULL);
1273 cpl_table_get_int(b, MOO_TARGET_TABLE_PAIREDINDEXRBN, rowb, NULL);
1275 if (pindexspecA != pindexspecB) {
1276 cpl_table_set_invalid(a, MOO_TARGET_TABLE_PAIREDINDEXRBN, rowa);
1277 cpl_table_set_int(a, MOO_TARGET_TABLE_PAIREDINDEXRBN, rowa, 0);
1296 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1297 cpl_ensure_code(tomerge != NULL, CPL_ERROR_NULL_INPUT);
1299 cpl_table *res_table = self->table;
1301 cpl_table *mtable = tomerge->table;
1302 const char **mtargnames =
1303 cpl_table_get_data_string_const(mtable, MOO_TARGET_TABLE_TARGNAME);
1305 int nrow = cpl_table_get_nrow(mtable);
1308 for (
int j = 0; j < nrow; j++) {
1309 const char *mtargname = mtargnames[j];
1311 cpl_table_unselect_all(res_table);
1313 MOO_TARGET_TABLE_TARGNAME,
1317 int rrow = cpl_table_get_nrow(res_table);
1318 cpl_table_unselect_all(mtable);
1319 cpl_table_or_selected_window(mtable, j, 1);
1320 cpl_table *sel = cpl_table_extract_selected(mtable);
1321 cpl_table_set_int(sel, MOO_TARGET_TABLE_INDEXTARG, 0, rrow + 1);
1322 cpl_table_insert(res_table, sel, rrow);
1323 cpl_table_delete(sel);
1327 cpl_array *indexes = cpl_table_where_selected(res_table);
1328 int idx = cpl_array_get_cplsize(indexes, 0, NULL);
1329 _moo_merge_row(res_table, idx, mtable, j);
1330 cpl_array_delete(indexes);
1333 cpl_error_set_message(
1334 "moo_target_table", CPL_ERROR_ILLEGAL_INPUT,
1335 "Error in merging %s : multiple objects (%d) found", mtargname,
1337 return CPL_ERROR_ILLEGAL_INPUT;
1340 return CPL_ERROR_NONE;
1360 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, index);
1361 cpl_ensure(targname != NULL, CPL_ERROR_NULL_INPUT, index);
1362 cpl_ensure(self->table != NULL, CPL_ERROR_ILLEGAL_INPUT, index);
1364 cpl_table_unselect_all(self->table);
1366 MOO_TARGET_TABLE_TARGNAME,
1369 const int *indextarg =
1370 cpl_table_get_data_int_const(self->table, MOO_TARGET_TABLE_INDEXTARG);
1373 cpl_array *indexes = cpl_table_where_selected(self->table);
1374 int idx = cpl_array_get_cplsize(indexes, 0, NULL);
1375 index = indextarg[idx];
1376 cpl_array_delete(indexes);
1392 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1393 cpl_table *table = self->table;
1394 if (table != NULL) {
1395 cpl_errorstate prev_state = cpl_errorstate_get();
1396 cpl_table_erase_column(table, MOO_TARGET_TABLE_OBSTYPE);
1397 cpl_table_erase_column(table, MOO_TARGET_TABLE_MEDSNRRI_EXT);
1398 cpl_table_erase_column(table, MOO_TARGET_TABLE_MEDSNRYJ_EXT);
1399 cpl_table_erase_column(table, MOO_TARGET_TABLE_MEDSNRH_EXT);
1401 cpl_table_erase_column(table, MOO_TARGET_TABLE_DERSNRRI_EXT);
1402 cpl_table_erase_column(table, MOO_TARGET_TABLE_DERSNRYJ_EXT);
1403 cpl_table_erase_column(table, MOO_TARGET_TABLE_DERSNRH_EXT);
1404 cpl_table_erase_column(table, MOO_TARGET_TABLE_MEDSNRRI_RBN);
1405 cpl_table_erase_column(table, MOO_TARGET_TABLE_MEDSNRYJ_RBN);
1406 cpl_table_erase_column(table, MOO_TARGET_TABLE_MEDSNRH_RBN);
1407 cpl_table_erase_column(table, MOO_TARGET_TABLE_PMEDSNRRI_EXT);
1408 cpl_table_erase_column(table, MOO_TARGET_TABLE_PMEDSNRYJ_EXT);
1409 cpl_table_erase_column(table, MOO_TARGET_TABLE_PMEDSNRH_EXT);
1410 cpl_table_erase_column(table, MOO_TARGET_TABLE_PDERSNRRI_EXT);
1411 cpl_table_erase_column(table, MOO_TARGET_TABLE_PDERSNRYJ_EXT);
1412 cpl_table_erase_column(table, MOO_TARGET_TABLE_PDERSNRH_EXT);
1414 cpl_table_erase_column(table, MOO_TARGET_TABLE_PMEDSNRRI_RBN);
1415 cpl_table_erase_column(table, MOO_TARGET_TABLE_PMEDSNRYJ_RBN);
1416 cpl_table_erase_column(table, MOO_TARGET_TABLE_PMEDSNRH_RBN);
1418 cpl_errorstate_set(prev_state);
1419 int nrow = cpl_table_get_nrow(table);
1420 for (
int i = 0; i < nrow; i++) {
1421 cpl_table_set(table, MOO_TARGET_TABLE_MEDSNRRI_SCI, i, NAN);
1422 cpl_table_set(table, MOO_TARGET_TABLE_MEDSNRYJ_SCI, i, NAN);
1423 cpl_table_set(table, MOO_TARGET_TABLE_MEDSNRH_SCI, i, NAN);
1426 return CPL_ERROR_NONE;
1446 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, index);
1447 cpl_ensure(targname != NULL, CPL_ERROR_NULL_INPUT, index);
1448 cpl_ensure(self->table != NULL, CPL_ERROR_ILLEGAL_INPUT, index);
1450 cpl_table_unselect_all(self->table);
1452 MOO_TARGET_TABLE_TARGNAME,
1457 cpl_array *indexes = cpl_table_where_selected(self->table);
1458 int idx = cpl_array_get_cplsize(indexes, 0, NULL);
1460 cpl_array_delete(indexes);
1468 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1478 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1479 cpl_ensure_code(exptimeA != NULL, CPL_ERROR_NULL_INPUT);
1480 cpl_ensure_code(exptimeB != NULL, CPL_ERROR_NULL_INPUT);
1482 int nrow = cpl_table_get_nrow(self->table);
1484 cpl_table_get_data_string(self->table, MOO_TARGET_TABLE_OBSTYPE);
1486 for (
int i = 0; i < nrow; i++) {
1487 const char *obstype = obstypet[i];
1488 for (
int j = 0; j < 3; j++) {
1489 double exptime = exptimeA[j];
1491 if (strcmp(obstype, MOO_OBSTYPE_OBSSWITCH) == 0) {
1492 exptime += exptimeB[j];
1494 moo_target_table_set_exptime(self, i, j, exptime);
1497 return CPL_ERROR_NONE;
1506 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1508 const char *exptimecols[] = { MOO_TARGET_TABLE_EXPTIMERI,
1509 MOO_TARGET_TABLE_EXPTIMEYJ,
1510 MOO_TARGET_TABLE_EXPTIMEH };
1512 cpl_table_set_double(self->table, exptimecols[j], i, exptime);
1514 return CPL_ERROR_NONE;
1532 const char *exptimecols[] = { MOO_TARGET_TABLE_EXPTIMERI,
1533 MOO_TARGET_TABLE_EXPTIMEYJ,
1534 MOO_TARGET_TABLE_EXPTIMEH };
1536 res = cpl_table_get_double(self->table, exptimecols[j], i, NULL);
1542moo_is_obstype_stare(
const char *obstype)
1544 return (strcmp(obstype, MOO_OBSTYPE_SKYSTARE) == 0 ||
1545 strcmp(obstype, MOO_OBSTYPE_OBSSTARE) == 0 ||
1546 strcmp(obstype, MOO_OBSTYPE_OBSPSTARE) == 0 ||
1547 strcmp(obstype, MOO_OBSTYPE_OBSNODSTARE) == 0 ||
1548 strcmp(obstype, MOO_OBSTYPE_OBSPNODSTARE) == 0 ||
1549 strcmp(obstype, MOO_OBSTYPE_OBSSWITCHSTARE) == 0 ||
1550 strcmp(obstype, MOO_OBSTYPE_SKYRESSTARE) == 0 ||
1551 strcmp(obstype, MOO_OBSTYPE_SKYRESPSTARE) == 0);
cpl_error_code moo_fibres_table_by_index(cpl_table *table)
Order fibres table by INDEX (ASC)
const char * moo_fibres_table_get_std_name(cpl_table *table)
get the object name of the STD type in the fibre table
cpl_error_code moo_fibres_table_by_indexrbn(cpl_table *table)
Order fibres table by INDEXRBN (ASC)
cpl_table * moo_rbn_get_fibre_table(moo_rbn *self)
Get the FIBRE TABLE in RBN.
cpl_array * moo_target_table_select_sky_index(moo_target_table *self, moo_rbn *sky_rbn)
get the index of the sky in the target table sort by indexspec
cpl_error_code moo_target_table_select_pstare(moo_target_table *self)
select PSTARE object in trget table
void moo_target_table_delete(moo_target_table *self)
Delete a moo_target_table.
double moo_target_table_get_exptime(moo_target_table *self, int i, int j)
rget the exptime of a target
moo_target_table * moo_target_table_load(const cpl_frame *frame)
Load a TARGET_TABLE frame and create a moo_target_table.
moo_target_table * moo_target_table_new(void)
Create a new moo_target_table.
moo_target_table * moo_target_table_duplicate(moo_target_table *self)
Duplicate an existing target_table.
enum _moo_target_table_mode_ moo_target_table_mode
The type code type.
cpl_error_code moo_target_table_merge(moo_target_table *self, moo_target_table *tomerge)
Merge two TARGET_TABLE.
cpl_error_code moo_target_table_select_stare(moo_target_table *self)
select STARE object in trget table
int moo_target_table_find_index(moo_target_table *self, const char *targname)
find target indexspec in TARGET_TABLE
int moo_target_table_find_target(moo_target_table *self, const char *targname)
find target targindex in TARGET_TABLE
moo_target_table * moo_create_target_table(moo_rbn *rbnA, moo_rbn *rbnB, moo_target_table_mode mode, moo_target_table_params *params)
Prepare target table for SCI frames using their attached fibre.
cpl_error_code moo_target_table_select_nod(moo_target_table *self)
select STARE object in trget table
cpl_error_code moo_target_table_select_pnod(moo_target_table *self)
select STARE object in trget table
int moo_target_table_xswitch_paired(moo_target_table *self)
get the index of the object in the target table sort by indexrbn
cpl_array * moo_target_table_select_obj_index(moo_target_table *self, int ispaired)
get the index of the object in the target table sort by indexrbn
const char * moo_target_table_mode_get_name(moo_target_table_mode m)
Get the name of target mode.
cpl_error_code moo_target_table_remove_coadd_cols(moo_target_table *self)
remove columns for coadd in target_table
cpl_size moo_table_or_selected_sequal_string(cpl_table *table, const char *name, const char *string)
Select from unselected table rows, by comparing column values with a constant.
the different type of detectors