MOONS Pipeline Reference Manual 0.13.1
moo_params.c
1/*
2 * This file is part of the MOONS Pipeline
3 * Copyright (C) 2002-2016 European Southern Observatory
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20#ifdef HAVE_CONFIG_H
21#include <config.h>
22#endif
23
24/*-----------------------------------------------------------------------------
25 Includes
26 -----------------------------------------------------------------------------*/
27#include <math.h>
28#include <string.h>
29#include <cpl.h>
30#include <hdrl.h>
31#include <mf_parameters.h>
32#include "moo_utils.h"
33#include "moo_params.h"
34/*----------------------------------------------------------------------------*/
39/*----------------------------------------------------------------------------*/
40
43/*-----------------------------------------------------------------------------
44 Function codes
45 -----------------------------------------------------------------------------*/
46
47/*----------------------------------------------------------------------------*/
60/*----------------------------------------------------------------------------*/
61moo_params *
62moo_params_new(const char *pid, const char *recipe_id)
63{
64 cpl_ensure(recipe_id != NULL, CPL_ERROR_NULL_INPUT, NULL);
65 moo_params *res = (moo_params *)cpl_calloc(1, sizeof(moo_params));
66
67 if (res != NULL) {
68 char *paramsid = cpl_sprintf("%s.%s", pid, recipe_id);
69 res->recipe_id = paramsid;
70 }
71 return res;
72}
73
74/*----------------------------------------------------------------------------*/
83/*----------------------------------------------------------------------------*/
84void
85moo_params_delete(moo_params *self)
86{
87 if (self != NULL) {
88 cpl_free(self->recipe_id);
89 cpl_free(self);
90 }
91}
92
93/*----------------------------------------------------------------------------*/
108/*----------------------------------------------------------------------------*/
109cpl_error_code
110moo_params_add_string(moo_params *params,
111 cpl_parameterlist *list,
112 const char *name,
113 const char *alias,
114 const char *def,
115 const char *val)
116{
117 cpl_ensure_code(name != NULL, CPL_ERROR_NULL_INPUT);
118 cpl_ensure_code(params != NULL, CPL_ERROR_NULL_INPUT);
119 cpl_ensure_code(params->recipe_id != NULL, CPL_ERROR_NULL_INPUT);
120
121 cpl_parameter *p = NULL;
122 char *pname = cpl_sprintf("%s.%s", params->recipe_id, name);
123 cpl_ensure_code(pname != NULL, CPL_ERROR_NULL_INPUT);
124
125 moo_try_check(p = cpl_parameter_new_value(pname, CPL_TYPE_STRING, def,
126 params->recipe_id, val),
127 " ");
128 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, alias);
129 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
130 cpl_parameterlist_append(list, p);
131
132moo_try_cleanup:
133
134 cpl_free(pname);
135 return cpl_error_get_code();
136}
137
138/*----------------------------------------------------------------------------*/
153/*----------------------------------------------------------------------------*/
154cpl_error_code
155moo_params_add_double(moo_params *params,
156 cpl_parameterlist *list,
157 const char *name,
158 const char *alias,
159 const char *def,
160 double val)
161{
162 cpl_ensure_code(name != NULL, CPL_ERROR_NULL_INPUT);
163 cpl_ensure_code(params != NULL, CPL_ERROR_NULL_INPUT);
164 cpl_ensure_code(params->recipe_id != NULL, CPL_ERROR_NULL_INPUT);
165
166 cpl_parameter *p;
167 char *pname = cpl_sprintf("%s.%s", params->recipe_id, name);
168 p = cpl_parameter_new_value(pname, CPL_TYPE_DOUBLE, def, params->recipe_id,
169 val);
170 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, alias);
171 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
172 cpl_parameterlist_append(list, p);
173
174 cpl_free(pname);
175 return cpl_error_get_code();
176}
177
178/*----------------------------------------------------------------------------*/
193/*----------------------------------------------------------------------------*/
194cpl_error_code
195moo_params_add_int(moo_params *params,
196 cpl_parameterlist *list,
197 const char *name,
198 const char *alias,
199 const char *def,
200 int val)
201{
202 cpl_parameter *p;
203
204 cpl_ensure_code(name != NULL, CPL_ERROR_NULL_INPUT);
205 cpl_ensure_code(params != NULL, CPL_ERROR_NULL_INPUT);
206 cpl_ensure_code(params->recipe_id != NULL, CPL_ERROR_NULL_INPUT);
207
208 char *pname = cpl_sprintf("%s.%s", params->recipe_id, name);
209
210 p = cpl_parameter_new_value(pname, CPL_TYPE_INT, def, params->recipe_id,
211 val);
212 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, alias);
213 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
214 cpl_parameterlist_append(list, p);
215
216 cpl_free(pname);
217 return cpl_error_get_code();
218}
219
220/*----------------------------------------------------------------------------*/
235/*----------------------------------------------------------------------------*/
236cpl_error_code
237moo_params_add_bool(moo_params *params,
238 cpl_parameterlist *list,
239 const char *name,
240 const char *alias,
241 const char *def,
242 int val)
243{
244 cpl_parameter *p;
245
246 cpl_ensure_code(name != NULL, CPL_ERROR_NULL_INPUT);
247 cpl_ensure_code(params != NULL, CPL_ERROR_NULL_INPUT);
248 cpl_ensure_code(params->recipe_id != NULL, CPL_ERROR_NULL_INPUT);
249
250 char *pname = cpl_sprintf("%s.%s", params->recipe_id, name);
251 p = cpl_parameter_new_value(pname, CPL_TYPE_BOOL, def, params->recipe_id,
252 val);
253 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, alias);
254 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
255 cpl_parameterlist_append(list, p);
256
257 cpl_free(pname);
258 return cpl_error_get_code();
259}
260
261/*----------------------------------------------------------------------------*/
273/*----------------------------------------------------------------------------*/
274double
275moo_params_get_double(const moo_params *self,
276 const cpl_parameterlist *list,
277 const char *name)
278{
279 const cpl_parameter *p;
280
281 char *pname = cpl_sprintf("%s.%s", self->recipe_id, name);
282 p = cpl_parameterlist_find_const(list, pname);
283 double res = cpl_parameter_get_double(p);
284 cpl_free(pname);
285 return res;
286}
287
288/*----------------------------------------------------------------------------*/
300/*----------------------------------------------------------------------------*/
301int
302moo_params_get_int(const moo_params *self,
303 const cpl_parameterlist *list,
304 const char *name)
305{
306 const cpl_parameter *p;
307
308 char *pname = cpl_sprintf("%s.%s", self->recipe_id, name);
309 p = cpl_parameterlist_find_const(list, pname);
310 int res = cpl_parameter_get_int(p);
311 cpl_free(pname);
312
313 return res;
314}
315
316/*----------------------------------------------------------------------------*/
328/*----------------------------------------------------------------------------*/
329int
330moo_params_get_bool(const moo_params *self,
331 const cpl_parameterlist *list,
332 const char *name)
333{
334 const cpl_parameter *p;
335
336 char *pname = cpl_sprintf("%s.%s", self->recipe_id, name);
337
338 p = cpl_parameterlist_find_const(list, pname);
339 int res = cpl_parameter_get_bool(p);
340
341 cpl_free(pname);
342
343 return res;
344}
345
346/*----------------------------------------------------------------------------*/
358/*----------------------------------------------------------------------------*/
359const char *
360moo_params_get_string(const moo_params *self,
361 const cpl_parameterlist *list,
362 const char *name)
363{
364 const cpl_parameter *p;
365
366 char *pname = cpl_sprintf("%s.%s", self->recipe_id, name);
367 p = cpl_parameterlist_find_const(list, pname);
368
369 const char *res = cpl_parameter_get_string(p);
370
371 if (cpl_error_get_code() != CPL_ERROR_NONE) {
372 cpl_msg_error("moo_params", "Can't get string parameter %s", pname);
373 }
374 cpl_free(pname);
375 return res;
376}
377
378void
379_moo_params_get_tab_double(const moo_params *self,
380 double res[],
381 const cpl_parameterlist *list,
382 const char *name)
383{
384 double a, b, c, d, e, f;
385 const char *data = moo_params_get_string(self, list, name);
386 int nb = sscanf(data, "%lf,%lf,%lf,%lf,%lf,%lf", &a, &b, &c, &d, &e, &f);
387 if (nb == 1) {
388 res[0] = a;
389 res[1] = a;
390 res[2] = a;
391 res[3] = a;
392 res[4] = a;
393 res[5] = a;
394 }
395 else if (nb == 3) {
396 res[0] = a;
397 res[1] = b;
398 res[2] = c;
399 res[3] = a;
400 res[4] = b;
401 res[5] = c;
402 }
403 else if (nb == 6) {
404 res[0] = a;
405 res[1] = b;
406 res[2] = c;
407 res[3] = d;
408 res[4] = e;
409 res[5] = f;
410 }
411 else {
412 cpl_error_set_message(
413 cpl_func, CPL_ERROR_ILLEGAL_INPUT,
414 "Invalid parameter %s (%s) : %d values are read 1,3 or 6 expected",
415 name, data, nb);
416 }
417}
418
419static void
420_moo_params_get_tab3_double(const moo_params *self,
421 double res[],
422 const cpl_parameterlist *list,
423 const char *name)
424{
425 double a, b, c;
426 const char *data = moo_params_get_string(self, list, name);
427
428 int nb = sscanf(data, "%lf,%lf,%lf", &a, &b, &c);
429 if (nb == 1) {
430 res[0] = a;
431 res[1] = a;
432 res[2] = a;
433 }
434 else if (nb == 3) {
435 res[0] = a;
436 res[1] = b;
437 res[2] = c;
438 }
439 else {
440 cpl_error_set_message(
441 cpl_func, CPL_ERROR_ILLEGAL_INPUT,
442 "Invalid parameter %s (%s) : %d values are read 1,3 expected", name,
443 data, nb);
444 }
445}
446
447static void
448_moo_params_get_tab_int(const moo_params *self,
449 int res[],
450 const cpl_parameterlist *list,
451 const char *name)
452{
453 int a, b, c, d, e, f;
454 const char *data = moo_params_get_string(self, list, name);
455 int nb = sscanf(data, "%d,%d,%d,%d,%d,%d", &a, &b, &c, &d, &e, &f);
456 if (nb == 1) {
457 res[0] = a;
458 res[1] = a;
459 res[2] = a;
460 res[3] = a;
461 res[4] = a;
462 res[5] = a;
463 }
464 else if (nb == 3) {
465 res[0] = a;
466 res[1] = b;
467 res[2] = c;
468 res[3] = a;
469 res[4] = b;
470 res[5] = c;
471 }
472 else if (nb == 6) {
473 res[0] = a;
474 res[1] = b;
475 res[2] = c;
476 res[3] = d;
477 res[4] = e;
478 res[5] = f;
479 }
480 else {
481 cpl_error_set_message(
482 cpl_func, CPL_ERROR_ILLEGAL_INPUT,
483 "Invalid parameter %s (%s) : %d values are read 1,3 or 6 expected",
484 name, data, nb);
485 }
486}
487
488static void
489_moo_params_get_tab3_int(const moo_params *self,
490 int res[],
491 const cpl_parameterlist *list,
492 const char *name)
493{
494 int a, b, c;
495 const char *data = moo_params_get_string(self, list, name);
496 int nb = sscanf(data, "%d,%d,%d", &a, &b, &c);
497 if (nb == 1) {
498 res[0] = a;
499 res[1] = a;
500 res[2] = a;
501 }
502 else if (nb == 3) {
503 res[0] = a;
504 res[1] = b;
505 res[2] = c;
506 }
507 else {
508 cpl_error_set_message(
509 cpl_func, CPL_ERROR_ILLEGAL_INPUT,
510 "Invalid parameter %s (%s) : %d values are read 1 or 3 expected",
511 name, data, nb);
512 }
513}
514/*----------------------------------------------------------------------------*/
525/*----------------------------------------------------------------------------*/
526cpl_error_code
527moo_params_add_nos(moo_params *self, cpl_parameterlist *list)
528{
529 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
530
531 moo_params_add_double(self, list, "nos_clip_kappa", "nos-clip-kappa",
532 "multiple of sigma in sigma clipping", 5.0);
533 moo_params_add_double(self, list, "nos_clip_diff", "nos-clip-diff",
534 "minimum relative change in sigma for sigma clipping",
535 0.1);
536 moo_params_add_double(self, list, "nos_clip_maxfrac", "nos-max-frac",
537 "maximum fraction of bad pixels allowed", 0.1);
538 moo_params_add_int(self, list, "nos_clip_niter", "nos-clip-niter",
539 "maximum number of iterations for sigma clipping", 2);
540 return cpl_error_get_code();
541}
542
543/*----------------------------------------------------------------------------*/
554/*----------------------------------------------------------------------------*/
555cpl_error_code
556moo_params_add_hot(moo_params *self, cpl_parameterlist *list)
557{
558 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
559
560 moo_params_add_double(self, list, "hot_clip_kappa", "hot-clip-kappa",
561 "multiple of sigma in global sigma clipping", 3.0);
563 self, list, "hot_clip_diff", "hot-clip-diff",
564 "minimum relative change in sigma for global sigma clipping", 0.1);
565 moo_params_add_double(self, list, "hot_clip_maxfrac", "hot-max-frac",
566 "maximum fraction of bad pixels allowed", 0.1);
567 moo_params_add_int(self, list, "hot_clip_niter", "hot-clip-niter",
568 "maximum number of iterations for global sigma clipping",
569 6);
571 self, list, "hot_local_winhsize", "hot-local-winhsize",
572 "half window size in pixels for local detection of hot pixels.", 0);
573 moo_params_add_double(self, list, "hot_local_kappa", "hot-local-kappa",
574 "multiple of sigma in local sigma clipping", 5.0);
575
576 return cpl_error_get_code();
577}
578
579/*----------------------------------------------------------------------------*/
590/*----------------------------------------------------------------------------*/
591moo_hot_params *
593{
594 moo_hot_params *res =
595 (moo_hot_params *)cpl_calloc(1, sizeof(moo_hot_params));
596 return res;
597}
598/*----------------------------------------------------------------------------*/
607/*----------------------------------------------------------------------------*/
608void
609moo_hot_params_delete(moo_hot_params *self)
610{
611 if (self != NULL) {
612 cpl_free(self);
613 }
614}
615
616/*----------------------------------------------------------------------------*/
627/*----------------------------------------------------------------------------*/
628moo_nos_params *
630{
631 moo_nos_params *res =
632 (moo_nos_params *)cpl_calloc(1, sizeof(moo_nos_params));
633 return res;
634}
635/*----------------------------------------------------------------------------*/
644/*----------------------------------------------------------------------------*/
645void
646moo_nos_params_delete(moo_nos_params *self)
647{
648 if (self != NULL) {
649 cpl_free(self);
650 }
651}
652
653/*----------------------------------------------------------------------------*/
665/*----------------------------------------------------------------------------*/
666cpl_error_code
667moo_params_add_prepare(moo_params *self, cpl_parameterlist *list)
668{
669 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
670
671 moo_params_add_string(self, list, "prepare_ignore_detectors",
672 "prepare-ignore-detectors",
673 "ignore specified detector (0:used, 1:ignored), "
674 "ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2",
675 "0,0,0,0,0,0");
676 return cpl_error_get_code();
677}
678
679/*----------------------------------------------------------------------------*/
692/*----------------------------------------------------------------------------*/
693cpl_error_code
694moo_params_add_crh(moo_params *self,
695 cpl_parameterlist *list,
696 const char *method)
697{
698 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
699 cpl_ensure_code(method != NULL, CPL_ERROR_NULL_INPUT);
700
701 if (!((strcmp(method, MOO_CRH_METHOD_MEDIAN) == 0) ||
702 (strcmp(method, MOO_CRH_METHOD_MEAN) == 0) ||
703 (strcmp(method, MOO_CRH_METHOD_SIGCLIP) == 0))) {
704 return cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
705 "Invalid method %s", method);
706 }
707
708 moo_params_add_double(self, list, "crh_clip_kappa", "crh-clip-kappa",
709 "multiple of sigma in sigma clipping", 5.0);
710 moo_params_add_int(self, list, "crh_clip_niter", "crh-clip-niter",
711 "maximum number of iterations for sigma clipping", 5);
712 moo_params_add_string(self, list, "crh_method", "crh-method",
713 "method used for removing CRH (MEDIAN|SIGCLIP|MEAN).",
714 method);
715 return cpl_error_get_code();
716}
717
718moo_prepare_params *
719moo_prepare_params_new(void)
720{
721 moo_prepare_params *res =
722 (moo_prepare_params *)cpl_calloc(1, sizeof(moo_prepare_params));
723 return res;
724}
725
726void
727moo_prepare_params_delete(moo_prepare_params *self)
728{
729 if (self != NULL) {
730 cpl_free(self);
731 }
732}
733
734moo_crh_params *
735moo_crh_params_new(void)
736{
737 moo_crh_params *res =
738 (moo_crh_params *)cpl_calloc(1, sizeof(moo_crh_params));
739 return res;
740}
741
742void
743moo_crh_params_delete(moo_crh_params *self)
744{
745 if (self != NULL) {
746 cpl_free(self);
747 }
748}
749
750/*----------------------------------------------------------------------------*/
762/*----------------------------------------------------------------------------*/
763cpl_error_code
764moo_params_add_linear(moo_params *self, cpl_parameterlist *list)
765{
766 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
768 self, list, "bpmnl_clip_kappa", "bpmnl-clip-kappa",
769 "multiple of sigma in sigma-clipping, to create linearity bad pixel "
770 "map, for each detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
771 "40,70,50,40,70,50");
772 moo_params_add_string(self, list, "bpmnl_min_snr", "bpmnl-min-snr",
773 "minimum SNR used in longest exposure frame for each "
774 "detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
775 "10,10,10,10,10,10");
777 self, list, "detect_saturated_ron_kappa", "detect-saturated-ron-kappa",
778 "multiple of RON to detect flux plateau in pixel growth curves, for "
779 "each detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
780 "2,2,2,2,2,2");
781 moo_params_add_double(self, list, "detect_saturated_threshold",
782 "detect-saturated-threshold",
783 "saturate detection threshold",
784 MOO_SATURATED_THRESHOLD);
785 return cpl_error_get_code();
786}
787
788moo_linear_params *
789moo_linear_params_new(void)
790{
791 moo_linear_params *res =
792 (moo_linear_params *)cpl_calloc(1, sizeof(moo_linear_params));
793 return res;
794}
795
796void
797moo_linear_params_delete(moo_linear_params *self)
798{
799 if (self != NULL) {
800 cpl_free(self);
801 }
802}
803
804
805/*----------------------------------------------------------------------------*/
816/*----------------------------------------------------------------------------*/
817cpl_error_code
818moo_params_add_bias(moo_params *self, cpl_parameterlist *list)
819{
820 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
821
822 moo_params_add_string(self, list, "ron_estimation_method",
823 "ron-estimation-method",
824 "RON estimation method (GLOBAL|LOCAL)",
825 MOO_RON_ESTIMATION_METHOD_GLOBAL);
826
827 return cpl_error_get_code();
828}
829
830moo_bias_params *
831moo_bias_params_new(void)
832{
833 moo_bias_params *res =
834 (moo_bias_params *)cpl_calloc(1, sizeof(moo_bias_params));
835 return res;
836}
837
838void
839moo_bias_params_delete(moo_bias_params *self)
840{
841 if (self != NULL) {
842 cpl_free(self);
843 }
844}
845
846/*----------------------------------------------------------------------------*/
858/*----------------------------------------------------------------------------*/
859cpl_error_code
861 cpl_parameterlist *list,
862 const char *method)
863{
864 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
865
866 moo_params_add_string(self, list, "subtract_bias_method",
867 "subtract-bias-method",
868 "subtract bias method (MASTER|MEDIAN)", method);
869
870 return cpl_error_get_code();
871}
872
873moo_correct_bias_params *
874moo_correct_bias_params_new(void)
875{
876 moo_correct_bias_params *res =
877 (moo_correct_bias_params *)cpl_calloc(1,
878 sizeof(moo_correct_bias_params));
879 return res;
880}
881
882void
883moo_correct_bias_params_delete(moo_correct_bias_params *self)
884{
885 if (self != NULL) {
886 cpl_free(self);
887 }
888}
889/*----------------------------------------------------------------------------*/
900/*----------------------------------------------------------------------------*/
901cpl_error_code
902moo_params_add_extract(moo_params *self, cpl_parameterlist *list)
903{
904 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
905
906 moo_params_add_string(self, list, "extract_method", "extract-method",
907 "method used for extraction (SUM|OPTIMAL)",
908 MOO_EXTRACT_METHOD_SUM);
910 self, list, "extract_aperture", "extract-aperture",
911 "size of fibre aperture in pixels , for each detector, ordered as "
912 "RI_1,YJ_1,H_1,RI_2,YJ_2,H_2. If value <=0, use "
913 "localization detected edges (lo,up) for extraction.",
914 "-1,-1,-1,-1,-1,-1");
915
916 return 0;
917}
918
919/*----------------------------------------------------------------------------*/
930/*----------------------------------------------------------------------------*/
931cpl_error_code
932moo_params_add_keep_temp(moo_params *self, cpl_parameterlist *list)
933{
934 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
935 cpl_ensure_code(list != NULL, CPL_ERROR_NULL_INPUT);
936
937 moo_params_add_bool(self, list, "keep_temp", "keep-temp",
938 "keep INTERMEDIATE products", CPL_FALSE);
939
940 return cpl_error_get_code();
941}
942
943/*----------------------------------------------------------------------------*/
954/*----------------------------------------------------------------------------*/
955cpl_error_code
956moo_params_add_quicklook_fibre_list(moo_params *self, cpl_parameterlist *list)
957{
958 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
959 cpl_ensure_code(list != NULL, CPL_ERROR_NULL_INPUT);
960
962 self, list, "quicklook_fibre_list", "quicklook-fibre-list",
963 "list of FIBRE in fibres table to convert in CHECK_OBJECT", "");
964
965 return cpl_error_get_code();
966}
967/*----------------------------------------------------------------------------*/
978/*----------------------------------------------------------------------------*/
979cpl_error_code
980moo_nos_params_dump(const moo_nos_params *self, FILE *stream)
981{
982 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
983 cpl_ensure_code(stream != NULL, CPL_ERROR_NULL_INPUT);
984
985 fprintf(stream, "--moo_nos_params\n");
986 fprintf(stream, "clip-diff %f\n", self->clip_diff);
987 fprintf(stream, "clip-frac %f\n", self->clip_frac);
988 fprintf(stream, "clip-niter %d\n", self->clip_niter);
989 fprintf(stream, "clip-kappa %f\n", self->clip_kappa);
990 return CPL_ERROR_NONE;
991}
992
993/*----------------------------------------------------------------------------*/
1004/*----------------------------------------------------------------------------*/
1005moo_nos_params *
1006moo_params_get_nos(const moo_params *self, const cpl_parameterlist *list)
1007{
1008 moo_nos_params *res = NULL;
1009 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1010 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1011
1012 double kappa = moo_params_get_double(self, list, "nos_clip_kappa");
1013 double diff = moo_params_get_double(self, list, "nos_clip_diff");
1014 double maxfrac = moo_params_get_double(self, list, "nos_clip_maxfrac");
1015 int niter = moo_params_get_int(self, list, "nos_clip_niter");
1016 res = moo_nos_params_new();
1017 res->clip_diff = diff;
1018 res->clip_frac = maxfrac;
1019 res->clip_kappa = kappa;
1020 res->clip_niter = niter;
1021
1022 return res;
1023}
1024
1025/*----------------------------------------------------------------------------*/
1036/*----------------------------------------------------------------------------*/
1037moo_hot_params *
1038moo_params_get_hot(const moo_params *self, const cpl_parameterlist *list)
1039{
1040 moo_hot_params *res = NULL;
1041 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1042 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1043
1044 double kappa = moo_params_get_double(self, list, "hot_clip_kappa");
1045 double diff = moo_params_get_double(self, list, "hot_clip_diff");
1046 double maxfrac = moo_params_get_double(self, list, "hot_clip_maxfrac");
1047 int niter = moo_params_get_int(self, list, "hot_clip_niter");
1048 int lwinhsize = moo_params_get_int(self, list, "hot_local_winhsize");
1049 double lkappa = moo_params_get_double(self, list, "hot_local_kappa");
1050 res = moo_hot_params_new();
1051 res->clip_diff = diff;
1052 res->clip_frac = maxfrac;
1053 res->clip_kappa = kappa;
1054 res->clip_niter = niter;
1055 res->local_winhsize = lwinhsize;
1056 res->local_kappa = lkappa;
1057 return res;
1058}
1059
1060/*----------------------------------------------------------------------------*/
1071/*----------------------------------------------------------------------------*/
1072moo_prepare_params *
1073moo_params_get_prepare(const moo_params *self, const cpl_parameterlist *list)
1074{
1075 moo_prepare_params *res = NULL;
1076 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1077 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1078
1079 res = moo_prepare_params_new();
1080 _moo_params_get_tab_int(self, res->ignore_detector, list,
1081 "prepare_ignore_detectors");
1082
1083 return res;
1084}
1085
1086/*----------------------------------------------------------------------------*/
1097/*----------------------------------------------------------------------------*/
1098moo_crh_params *
1099moo_params_get_crh(const moo_params *self, const cpl_parameterlist *list)
1100{
1101 moo_crh_params *res = NULL;
1102 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1103 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1104
1105 double kappa = moo_params_get_double(self, list, "crh_clip_kappa");
1106 int niter = moo_params_get_int(self, list, "crh_clip_niter");
1107 const char *method = moo_params_get_string(self, list, "crh_method");
1108 moo_try_assure(((strcmp(method, MOO_CRH_METHOD_MEDIAN) == 0) ||
1109 (strcmp(method, MOO_CRH_METHOD_SIGCLIP) == 0) ||
1110 (strcmp(method, MOO_CRH_METHOD_MEAN) == 0)),
1111 CPL_ERROR_ILLEGAL_INPUT,
1112 "Supported crh method are %s or %s (%s is given)",
1113 MOO_CRH_METHOD_MEDIAN, MOO_CRH_METHOD_SIGCLIP, method);
1114
1115 res = moo_crh_params_new();
1116 res->method = method;
1117 res->niter = niter;
1118 res->kappa = kappa;
1119
1120moo_try_cleanup:
1121 return res;
1122}
1123
1124/*----------------------------------------------------------------------------*/
1135/*----------------------------------------------------------------------------*/
1136moo_bias_params *
1137moo_params_get_bias(const moo_params *self, const cpl_parameterlist *list)
1138{
1139 moo_bias_params *res = NULL;
1140 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1141 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1142
1143
1144 const char *ron_estimation_method =
1145 moo_params_get_string(self, list, "ron_estimation_method");
1146
1147 moo_try_check(res = moo_bias_params_new(), " ");
1148 res->ron_estimation_method = ron_estimation_method;
1149
1150moo_try_cleanup:
1151 return res;
1152}
1153
1154/*----------------------------------------------------------------------------*/
1165/*----------------------------------------------------------------------------*/
1166moo_correct_bias_params *
1167moo_params_get_correct_bias(const moo_params *self,
1168 const cpl_parameterlist *list)
1169{
1170 moo_correct_bias_params *res = NULL;
1171 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1172 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1173
1174
1175 const char *subtract_bias_method =
1176 moo_params_get_string(self, list, "subtract_bias_method");
1177 moo_try_check(res = moo_correct_bias_params_new(), " ");
1178 res->subtract_bias_method = subtract_bias_method;
1179
1180moo_try_cleanup:
1181 return res;
1182}
1183
1184/*----------------------------------------------------------------------------*/
1195/*----------------------------------------------------------------------------*/
1196moo_extract_params *
1197moo_params_get_extract(const moo_params *self, const cpl_parameterlist *list)
1198{
1199 moo_extract_params *res = NULL;
1200 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1201 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1202
1203 const char *method = NULL;
1204 moo_try_check(method = moo_params_get_string(self, list, "extract_method"),
1205 " ");
1206 moo_try_assure(((strcmp(method, MOO_EXTRACT_METHOD_SUM) == 0) ||
1207 (strcmp(method, MOO_EXTRACT_METHOD_OPTIMAL) == 0)),
1208 CPL_ERROR_ILLEGAL_INPUT,
1209 "Supported extract method are %s or %s (%s is given)",
1210 MOO_EXTRACT_METHOD_SUM, MOO_EXTRACT_METHOD_OPTIMAL, method);
1211
1212 res = moo_extract_params_new();
1213 res->method = method;
1214 _moo_params_get_tab_double(self, res->aperture, list, "extract_aperture");
1215
1216moo_try_cleanup:
1217 return res;
1218}
1219
1220/*----------------------------------------------------------------------------*/
1231/*----------------------------------------------------------------------------*/
1232moo_localise_params *
1233moo_params_get_localise(const moo_params *self, const cpl_parameterlist *list)
1234{
1235 moo_localise_params *res = NULL;
1236 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1237 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1238
1239 int central_pos = moo_params_get_int(self, list, "central_pos");
1240 int central_width = moo_params_get_int(self, list, "central_width");
1241 const char *method = moo_params_get_string(self, list, "loc_method");
1242 int keep_points = moo_params_get_bool(self, list, "keep_points");
1243 double rthresh = moo_params_get_double(self, list, "relative_thresh");
1244 double wdiff = moo_params_get_double(self, list, "wdiff_lim");
1245 double ydiff = moo_params_get_double(self, list, "ydiff_lim");
1246 int loc_xlim_hwin = moo_params_get_int(self, list, "loc_xlim_hwin");
1247 double loc_xlim_fracmin =
1248 moo_params_get_double(self, list, "loc_xlim_fracmin");
1249 res = moo_localise_params_new();
1250 res->centralpos = central_pos;
1251 res->centralwidth = central_width;
1252 res->method = method;
1253 res->keep_points = keep_points;
1254 res->relativethresh = rthresh;
1255 res->wdiff_lim = wdiff;
1256 res->ydiff_lim = ydiff;
1257 _moo_params_get_tab_double(self, res->ref_snr, list, "ref_snr");
1258
1259 res->loc_xlim_hwin = loc_xlim_hwin;
1260 res->loc_xlim_fracmin = loc_xlim_fracmin;
1261
1262 const char *backg_method =
1263 moo_params_get_string(self, list, "loc_backg_method");
1264 if ((strcmp(backg_method, MOO_LOCALISE_BACKG_METHOD_POLYNOMIAL) == 0) ||
1265 (strcmp(backg_method, MOO_LOCALISE_BACKG_METHOD_RUNNINGMIN) == 0)) {
1266 res->backg_method = backg_method;
1267 }
1268 else {
1269 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
1270 "Invalid parameter backg-method (%s) : "
1271 "POLYNOMIAL or RUNNINGMIN expected",
1272 backg_method);
1273 }
1274 _moo_params_get_tab_int(self, res->backg_winhsize, list,
1275 "loc_backg_winhsize");
1276 _moo_params_get_tab_int(self, res->backg_polydeg, list,
1277 "loc_backg_polydeg");
1278 _moo_params_get_tab_double(self, res->backg_clip_kappalow, list,
1279 "loc_backg_clip_kappalow");
1280 _moo_params_get_tab_double(self, res->backg_clip_kappaup, list,
1281 "loc_backg_clip_kappaup");
1282 _moo_params_get_tab_int(self, res->backg_clip_niter, list,
1283 "loc_backg_clip_niter");
1284 _moo_params_get_tab_int(self, res->detect_niter, list, "loc_detect_niter");
1285 int xgap_max = moo_params_get_int(self, list, "loc_xgap_max");
1286 res->xgap_max = xgap_max;
1287 _moo_params_get_tab_double(self, res->goodptsfrac_min, list,
1288 "loc_goodptsfrac_min");
1289 const char *poly_deg = moo_params_get_string(self, list, "loc_poly_deg");
1290 int a, b, c, d, e, f;
1291 int nb = sscanf(poly_deg, "%d,%d,%d,%d,%d,%d", &a, &b, &c, &d, &e, &f);
1292 if (nb == 1) {
1293 for (int i = 0; i < 6; i++) {
1294 res->polydeg[i] = a;
1295 }
1296 }
1297 else if (nb == 3) {
1298 for (int i = 0; i < 2; i++) {
1299 res->polydeg[i * 3] = a;
1300 res->polydeg[i * 3 + 1] = b;
1301 res->polydeg[i * 3 + 2] = c;
1302 }
1303 }
1304 else if (nb == 6) {
1305 res->polydeg[0] = a;
1306 res->polydeg[1] = b;
1307 res->polydeg[2] = c;
1308 res->polydeg[3] = d;
1309 res->polydeg[4] = e;
1310 res->polydeg[5] = f;
1311 }
1312 else {
1313 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
1314 "Invalid parameter poly-deg (%s) : %d values are "
1315 "read and 1,3 or 6 expected",
1316 poly_deg, nb);
1317 }
1318
1319 return res;
1320}
1321
1322/*----------------------------------------------------------------------------*/
1333/*----------------------------------------------------------------------------*/
1334int
1335moo_params_get_keep_temp(const moo_params *self, const cpl_parameterlist *list)
1336{
1337 int res = 0;
1338 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, 0);
1339 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, 0);
1340
1341 res = moo_params_get_bool(self, list, "keep_temp");
1342 return res;
1343}
1344
1345/*----------------------------------------------------------------------------*/
1356/*----------------------------------------------------------------------------*/
1357cpl_array *
1359 const cpl_parameterlist *list)
1360{
1361 cpl_array *res = NULL;
1362 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, 0);
1363 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, 0);
1364
1365 char *string =
1366 cpl_strdup(moo_params_get_string(self, list, "quicklook_fibre_list"));
1367 char *strToken = strtok(string, ",");
1368 int size = 0;
1369 res = cpl_array_new(size, CPL_TYPE_STRING);
1370
1371 while (strToken != NULL) {
1372 size++;
1373 cpl_array_set_size(res, size);
1374 cpl_array_set_string(res, size - 1, strToken);
1375 strToken = strtok(NULL, ",");
1376 }
1377 cpl_free(string);
1378 return res;
1379}
1380
1381moo_localise_params *
1382moo_localise_params_new(void)
1383{
1384 moo_localise_params *res =
1385 (moo_localise_params *)cpl_calloc(1, sizeof(moo_localise_params));
1386 return res;
1387}
1388
1389void
1390moo_localise_params_delete(moo_localise_params *self)
1391{
1392 if (self != NULL) {
1393 cpl_free(self);
1394 }
1395}
1396
1397/*----------------------------------------------------------------------------*/
1408/*----------------------------------------------------------------------------*/
1409cpl_error_code
1410moo_params_add_localise(moo_params *self, cpl_parameterlist *list)
1411{
1412 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1413 cpl_ensure_code(list != NULL, CPL_ERROR_NULL_INPUT);
1414
1416 self, list, "central_pos", "central-pos",
1417 "x location of the band where initial fibre positions are determined",
1418 2048);
1419 moo_params_add_int(self, list, "central_width", "central-width",
1420 "total width of the band in pixels", 25);
1422 self, list, "loc_backg_method", "loc-backg-method",
1423 "method for background fitting (POLYNOMIAL|RUNNINGMIN).", "POLYNOMIAL");
1424 moo_params_add_string(self, list, "loc_backg_winhsize",
1425 "loc-backg-winhsize",
1426 "half size of window for running minimum, for each "
1427 "detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
1428 "3,3,3,3,3,3");
1429 moo_params_add_string(self, list, "loc_backg_polydeg", "loc-backg-polydeg",
1430 "list of background fit polynomial degree, for each "
1431 "detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
1432 "4,4,4,4,4,4");
1434 self, list, "loc_backg_clip_kappalow", "loc-backg-clip-kappalow",
1435 "list of lower multiples of sigma in background fitting, for each "
1436 "detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
1437 "3,3,3,3,3,3");
1439 self, list, "loc_backg_clip_kappaup", "loc-backg-clip-kappaup",
1440 "list of upper multiples of sigma in background fitting, for each "
1441 "detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
1442 "1,1,1,1,1,1");
1444 self, list, "loc_backg_clip_niter", "loc-backg-clip-niter",
1445 "list of numbers of iterations in background fitting, for each "
1446 "detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
1447 "4,4,4,4,4,4");
1449 self, list, "loc_detect_niter", "loc-detect-niter",
1450 "list of number of iterations to detect fibres, for each detector, "
1451 "ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
1452 "10,10,10,10,10,10");
1454 self, list, "loc_xgap_max", "loc-xgap-max",
1455 "maximum allowed consecutive centroid detection failures before stop.",
1456 100);
1458 self, list, "loc_xlim_hwin", "loc-xlim-hwin",
1459 "half window size in pixels for x trace limits detections.", 30);
1461 self, list, "loc_xlim_fracmin", "loc-xlim-fracmin",
1462 "minimal allowed fraction of centroid determinations in the defined "
1463 "window, below which trace limit is set.",
1464 0.2);
1466 self, list, "loc_goodptsfrac_min", "loc-goodptsfrac-min",
1467 "minimum fraction of good pixels to detect fibres, for each detector, "
1468 "ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
1469 "0.6,0.6,0.6,0.6,0.6,0.6");
1470 moo_params_add_string(self, list, "loc_poly_deg", "loc-poly-deg",
1471 "list of polynomial degree for each detector, "
1472 "ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
1473 "9,8,10,9,8,10");
1475 self, list, "loc_method", "loc-method",
1476 "method used for fitting centroid (BARYCENTER,GAUSSIAN)",
1477 MOO_LOCALISE_METHOD_BARYCENTER);
1478 moo_params_add_bool(self, list, "keep_points", "keep-points",
1479 "keep measured edge positions and flag map", CPL_FALSE);
1480 moo_params_add_double(self, list, "relative_thresh", "relative-thresh",
1481 "relative detection threshold above background", 0.1);
1482 moo_params_add_double(self, list, "wdiff_lim", "wdiff-lim",
1483 "maximum allowed variation of localisation width", 1);
1484 moo_params_add_double(self, list, "ydiff_lim", "ydiff-lim",
1485 "maximum allowed variation of localisation centroid",
1486 0.5);
1488 self, list, "ref_snr", "ref-snr",
1489 "minimum reference SNR used for localisation tracking, for each "
1490 "detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
1491 "80.,80.,80.,80.,80.,80.");
1492 return 0;
1493}
1494
1495moo_model_flat_params *
1496moo_model_flat_params_new(void)
1497{
1498 moo_model_flat_params *res =
1499 (moo_model_flat_params *)cpl_calloc(1, sizeof(moo_model_flat_params));
1500 return res;
1501}
1502
1503void
1504moo_model_flat_params_delete(moo_model_flat_params *self)
1505{
1506 if (self != NULL) {
1507 cpl_free(self);
1508 }
1509}
1510
1511/*----------------------------------------------------------------------------*/
1522/*----------------------------------------------------------------------------*/
1523cpl_error_code
1524moo_params_add_model_flat(moo_params *self, cpl_parameterlist *list)
1525{
1526 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
1527 cpl_ensure_code(list != NULL, CPL_ERROR_NULL_INPUT);
1528
1529 moo_params_add_int(self, list, "modelflat_oversample",
1530 "modelflat-oversample",
1531 "oversample factor in Y direction", 5);
1532 moo_params_add_int(self, list, "modelflat_xstep", "modelflat-xstep",
1533 "step along X axis for computing parameters profile",
1534 10);
1536 self, list, "modelflat_winhsize", "modelflat-winhsize",
1537 "half size window along X axis for computing parameters profile", 20);
1538 return 0;
1539}
1540
1541/*----------------------------------------------------------------------------*/
1552/*----------------------------------------------------------------------------*/
1553moo_molecfit_model_params *
1554moo_params_get_molecfit_model(const moo_params *self,
1555 const cpl_parameterlist *list)
1556{
1557 moo_molecfit_model_params *res = NULL;
1558 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1559 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1560
1562 res->continuum_const =
1563 moo_params_get_double(self, list, MF_PARAMETERS_CONTINUUM_CONST);
1564 res->var_kern = moo_params_get_bool(self, list, MF_PARAMETERS_VAR_KERN);
1565 res->kern_mode = moo_params_get_bool(self, list, MF_PARAMETERS_KERN_MODE);
1566 res->kern_fac = moo_params_get_double(self, list, MF_PARAMETERS_KERN_FAC);
1567
1568 return res;
1569}
1570
1571/*----------------------------------------------------------------------------*/
1582/*----------------------------------------------------------------------------*/
1583moo_molecfit_calctrans_params *
1585 const cpl_parameterlist *list)
1586{
1587 moo_molecfit_calctrans_params *res = NULL;
1588 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1589 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1590
1592 _moo_params_get_tab3_double(self, res->min_snr, list,
1593 "molecfit_calctrans_min_snr");
1594 int filter_skyfibre =
1595 moo_params_get_bool(self, list, "molecfit_calctrans_filter_skyfibre");
1596 res->filter_skyfibre = filter_skyfibre;
1597
1598 return res;
1599}
1600
1601/*----------------------------------------------------------------------------*/
1612/*----------------------------------------------------------------------------*/
1613moo_create_s1d_params *
1614moo_params_get_create_s1d(const moo_params *self, const cpl_parameterlist *list)
1615{
1616 moo_create_s1d_params *res = NULL;
1617 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1618 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1619
1621 int do_s1d = moo_params_get_bool(self, list, "create_s1d");
1622 res->do_s1d = do_s1d;
1623
1624 return res;
1625}
1626
1627/*----------------------------------------------------------------------------*/
1638/*----------------------------------------------------------------------------*/
1639moo_model_flat_params *
1640moo_params_get_model_flat(const moo_params *self, const cpl_parameterlist *list)
1641{
1642 moo_model_flat_params *res = NULL;
1643 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1644 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1645
1646 int oversample = moo_params_get_int(self, list, "modelflat_oversample");
1647 int winhsize = moo_params_get_int(self, list, "modelflat_winhsize");
1648 int xstep = moo_params_get_int(self, list, "modelflat_xstep");
1649 res = moo_model_flat_params_new();
1650 res->oversamp = oversample;
1651 res->winhsize = winhsize;
1652 res->xstep = xstep;
1653 return res;
1654}
1655
1656moo_extract_params *
1657moo_extract_params_new(void)
1658{
1659 moo_extract_params *res =
1660 (moo_extract_params *)cpl_calloc(1, sizeof(moo_extract_params));
1661 return res;
1662}
1663
1664void
1665moo_extract_params_delete(moo_extract_params *self)
1666{
1667 if (self != NULL) {
1668 cpl_free(self);
1669 }
1670}
1671
1672moo_compute_fibtrans_params *
1673moo_compute_fibtrans_params_new(void)
1674{
1675 moo_compute_fibtrans_params *res = (moo_compute_fibtrans_params *)
1676 cpl_calloc(1, sizeof(moo_compute_fibtrans_params));
1677 return res;
1678}
1679
1680void
1681moo_compute_fibtrans_params_delete(moo_compute_fibtrans_params *self)
1682{
1683 if (self != NULL) {
1684 cpl_free(self);
1685 }
1686}
1687
1688moo_compute_resp_params *
1689moo_compute_resp_params_new(void)
1690{
1691 moo_compute_resp_params *res =
1692 (moo_compute_resp_params *)cpl_calloc(1,
1693 sizeof(moo_compute_resp_params));
1694 return res;
1695}
1696
1697void
1698moo_compute_resp_params_delete(moo_compute_resp_params *self)
1699{
1700 if (self != NULL) {
1701 cpl_free(self);
1702 }
1703}
1704
1705moo_wavesol_params *
1706moo_wavesol_params_new(void)
1707{
1708 moo_wavesol_params *res =
1709 (moo_wavesol_params *)cpl_calloc(1, sizeof(moo_wavesol_params));
1710
1711 return res;
1712}
1713
1714void
1715moo_wavesol_params_delete(moo_wavesol_params *self)
1716{
1717 if (self != NULL) {
1718 cpl_free(self);
1719 }
1720}
1721
1722moo_rebin_params *
1723moo_rebin_params_new(void)
1724{
1725 moo_rebin_params *res =
1726 (moo_rebin_params *)cpl_calloc(1, sizeof(moo_rebin_params));
1727 return res;
1728}
1729
1730void
1731moo_rebin_params_delete(moo_rebin_params *self)
1732{
1733 if (self != NULL) {
1734 cpl_free(self);
1735 }
1736}
1737
1738moo_sub_sky_stare_params *
1739moo_sub_sky_stare_params_new(void)
1740{
1741 moo_sub_sky_stare_params *res = (moo_sub_sky_stare_params *)
1742 cpl_calloc(1, sizeof(moo_sub_sky_stare_params));
1743 return res;
1744}
1745
1746void
1747moo_sub_sky_stare_params_delete(moo_sub_sky_stare_params *self)
1748{
1749 if (self != NULL) {
1750 moo_skycorr_params_delete(self->sk);
1751 cpl_free(self);
1752 }
1753}
1754
1755moo_skycorr_params *
1756moo_skycorr_params_new(void)
1757{
1758 moo_skycorr_params *res =
1759 (moo_skycorr_params *)cpl_calloc(1, sizeof(moo_skycorr_params));
1760 return res;
1761}
1762
1763void
1764moo_skycorr_params_delete(moo_skycorr_params *self)
1765{
1766 if (self != NULL) {
1767 cpl_free(self);
1768 }
1769}
1770
1771moo_combine_pair_params *
1772moo_combine_pair_params_new(void)
1773{
1774 moo_combine_pair_params *res =
1775 (moo_combine_pair_params *)cpl_calloc(1,
1776 sizeof(moo_combine_pair_params));
1777 return res;
1778}
1779
1780void
1781moo_combine_pair_params_delete(moo_combine_pair_params *self)
1782{
1783 if (self != NULL) {
1784 cpl_free(self);
1785 }
1786}
1787
1788moo_target_table_params *
1789moo_target_table_params_new(void)
1790{
1791 moo_target_table_params *res =
1792 (moo_target_table_params *)cpl_calloc(1,
1793 sizeof(moo_target_table_params));
1794 return res;
1795}
1796
1797void
1798moo_target_table_params_delete(moo_target_table_params *self)
1799{
1800 if (self != NULL) {
1801 cpl_free(self);
1802 }
1803}
1804
1805moo_compute_snr_params *
1806moo_compute_snr_params_new(void)
1807{
1808 moo_compute_snr_params *res =
1809 (moo_compute_snr_params *)cpl_calloc(1, sizeof(moo_compute_snr_params));
1810 return res;
1811}
1812
1813void
1814moo_compute_snr_params_delete(moo_compute_snr_params *self)
1815{
1816 if (self != NULL) {
1817 cpl_free(self);
1818 }
1819}
1820
1821moo_compute_slitoffset_params *
1822moo_compute_slitoffset_params_new(void)
1823{
1824 moo_compute_slitoffset_params *res = (moo_compute_slitoffset_params *)
1825 cpl_calloc(1, sizeof(moo_compute_slitoffset_params));
1826 return res;
1827}
1828
1829void
1830moo_compute_slitoffset_params_delete(moo_compute_slitoffset_params *self)
1831{
1832 if (self != NULL) {
1833 cpl_free(self);
1834 }
1835}
1836
1837moo_coadd_params *
1838moo_coadd_params_new(void)
1839{
1840 moo_coadd_params *res =
1841 (moo_coadd_params *)cpl_calloc(1, sizeof(moo_coadd_params));
1842 return res;
1843}
1844
1845void
1846moo_coadd_params_delete(moo_coadd_params *self)
1847{
1848 if (self != NULL) {
1849 cpl_free(self);
1850 }
1851}
1852
1853/*----------------------------------------------------------------------------*/
1864/*----------------------------------------------------------------------------*/
1865cpl_error_code
1866moo_params_add_compute_fibtrans(moo_params *self, cpl_parameterlist *list)
1867{
1868 moo_params_add_string(self, list, "ref_fibres", "ref-fibres",
1869 "couple of fibre ids for reference transmission, for "
1870 "each spectrograph, ordered as TAS1,TAS2.",
1871 "506,506");
1872 return cpl_error_get_code();
1873}
1874
1875/*----------------------------------------------------------------------------*/
1886/*----------------------------------------------------------------------------*/
1887cpl_error_code
1888moo_params_add_compute_resp(moo_params *self, cpl_parameterlist *list)
1889{
1891 self, list, "computeresp_filter_winhsize",
1892 "computeresp-filter-winhsize",
1893 "median filter half window size, for each band, ordered as RI,YJ,H.",
1894 "25,25,25");
1895 moo_params_add_string(self, list, "computeresp_degree",
1896 "computeresp-degree",
1897 "polynomial degree to fit the response, for each "
1898 "band, ordered as RI,YJ,H.",
1899 "4,4,4");
1900 moo_params_add_double(self, list, "computeresp_kappa_lo",
1901 "computeresp-kappa-lo",
1902 "lower multiple of sigma in response fitting.", 1);
1903 moo_params_add_double(self, list, "computeresp_kappa_up",
1904 "computeresp-kappa-up",
1905 "upper multiple of sigma in response fitting.", 4);
1906 moo_params_add_double(self, list, "computeresp_frac", "computeresp-frac",
1907 "maximum rejected fraction to fit the response", 0.7);
1908 moo_params_add_int(self, list, "computeresp_niter", "computeresp-niter",
1909 "number of iterations to fit the response", 5);
1910
1911 return cpl_error_get_code();
1912}
1913
1914/*----------------------------------------------------------------------------*/
1925/*----------------------------------------------------------------------------*/
1926moo_compute_fibtrans_params *
1927moo_params_get_compute_fibtrans(const moo_params *self,
1928 const cpl_parameterlist *list)
1929{
1930 moo_compute_fibtrans_params *res = NULL;
1931 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1932 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1933
1934
1935 res = moo_compute_fibtrans_params_new();
1936
1937
1938 const char *ref = moo_params_get_string(self, list, "ref_fibres");
1939 int a, b;
1940 int nb = sscanf(ref, "%d,%d", &a, &b);
1941 if (nb == 2) {
1942 res->fibref[0] = a;
1943 res->fibref[1] = b;
1944 }
1945 else {
1946 cpl_error_set_message(
1947 cpl_func, CPL_ERROR_ILLEGAL_INPUT,
1948 "Invalid parameter ref-fibres (%s) : %d values are read 2 expected",
1949 ref, nb);
1950 }
1951
1952 return res;
1953}
1954
1955/*----------------------------------------------------------------------------*/
1966/*----------------------------------------------------------------------------*/
1967moo_compute_resp_params *
1968moo_params_get_compute_resp(const moo_params *self,
1969 const cpl_parameterlist *list)
1970{
1971 moo_compute_resp_params *res = NULL;
1972 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
1973 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
1974
1975
1976 res = moo_compute_resp_params_new();
1977 _moo_params_get_tab3_int(self, res->filter_winhsize, list,
1978 "computeresp_filter_winhsize");
1979 _moo_params_get_tab3_int(self, res->degree, list, "computeresp_degree");
1980 res->frac = moo_params_get_double(self, list, "computeresp_frac");
1981 res->kappa_lo = moo_params_get_double(self, list, "computeresp_kappa_lo");
1982 res->kappa_up = moo_params_get_double(self, list, "computeresp_kappa_up");
1983 res->niter = moo_params_get_int(self, list, "computeresp_niter");
1984 return res;
1985}
1986
1987/*----------------------------------------------------------------------------*/
1998/*----------------------------------------------------------------------------*/
1999cpl_error_code
2000moo_params_add_wavesol(moo_params *self, cpl_parameterlist *list)
2001{
2003 self, list, "wavesol_linedetect_nlines", "wavesol-linedetect-nlines",
2004 "list of number of expected lines for peak detection for each "
2005 "detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
2006 "100,100,100,100,100,100");
2008 self, list, "wavesol_linedetect_winhsize",
2009 "wavesol-linedetect-winhsize",
2010 "list of half size window in pixel for gaussian fit for peak detection "
2011 "using for pattern matching for each detector, ordered as "
2012 "RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
2013 "2,2,2,2,2,2");
2014 moo_params_add_string(self, list, "wavesol_ppm_tolerance",
2015 "wavesol-ppm-tolerance",
2016 "list of pattern points matching tolerance for each "
2017 "detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
2018 "0.007,0.009,0.007,0.007,0.009,0.007");
2019 moo_params_add_string(self, list, "wavesol_ppm_wavemap_deg_x",
2020 "wavesol-ppm-wavemap-deg-x",
2021 "pattern matching polynomial wavelength map degree "
2022 "in x for each band, ordered as RI,YJ,H",
2023 "3,3,3");
2024 moo_params_add_int(self, list, "wavesol_ppm_wavemap_deg_y",
2025 "wavesol-ppm-wavemap-deg-y",
2026 "pattern matching polynomial wavelength map degree in y",
2027 1);
2028
2029 moo_params_add_string(self, list, "wavesol_min_fwhm", "wavesol-min-fwhm",
2030 "minimum FWHM to filter lines for each detector, "
2031 "ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
2032 "1.9,1.2,1.2,1.9,1.2,1.2");
2033 moo_params_add_string(self, list, "wavesol_max_fwhm", "wavesol-max-fwhm",
2034 "maximum FWHM to filter lines for each detector, "
2035 "ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
2036 "5,5,5,5,5,5");
2037 moo_params_add_string(self, list, "wavesol_min_sn", "wavesol-min-sn",
2038 "minimum SNR to filter lunes for each detector, "
2039 "ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
2040 "4,4,4,4,4,4");
2042 self, list, "wavesol_linefit_method", "wavesol-linefit-method",
2043 "method of centroid peak detection (GAUSSIAN|BARYCENTER)",
2044 MOO_WAVESOL_LINEFIT_GAUSSIAN);
2046 self, list, "wavesol_linefit_winhsize", "wavesol-linefit-winhsize",
2047 "list of half size window in pixel for gaussian fit for peak detection "
2048 "for each detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
2049 "2,2,2,2,2,2");
2051 self, list, "wavesol_linefit_recentre", "wavesol-linefit-recentre",
2052 "list of flags (0:FALSE, 1:TRUE) to use recentre mode for each "
2053 "detector, ordered as RI_1,YJ_1,H_1,RI_2,YJ_2,H_2.",
2054 "0,0,0,0,0,0");
2055 moo_params_add_string(self, list, "wavesol_model", "wavesol-model",
2056 "model of the polynomial wavelength solution (1D|2D)",
2057 MOO_WAVESOL_MODEL_1D);
2058 moo_params_add_string(self, list, "wavesol_wavemap_deg_x",
2059 "wavesol-wavemap-deg-x",
2060 "polynomial wavelength map degree in x for each "
2061 "band, ordered as RI,YJ,H.",
2062 "3,3,3");
2063
2064 moo_params_add_int(self, list, "wavesol_wavemap_deg_y",
2065 "wavesol-wavemap-deg-y",
2066 "polynomial wavelength map degree in y", 8);
2067 moo_params_add_double(self, list, "wavesol_clip_kappa",
2068 "wavesol-clip-kappa",
2069 "multiple of sigma in sigma clipping", 2.0);
2070 moo_params_add_double(self, list, "wavesol_clip_frac", "wavesol-clip-frac",
2071 "maximal fractions of rejected point allowed", 0.7);
2072 moo_params_add_int(self, list, "wavesol_clip_niter", "wavesol-clip-niter",
2073 "maximum number of iterations for sigma clipping", 10);
2074
2075 return cpl_error_get_code();
2076}
2077
2078/*----------------------------------------------------------------------------*/
2089/*----------------------------------------------------------------------------*/
2090cpl_error_code
2091moo_params_add_science_wavesol(moo_params *self, cpl_parameterlist *list)
2092{
2093 moo_params_add_string(self, list, "wavesol_control", "wavesol-control",
2094 "choose to create the wavelength solution using sky "
2095 "lines (NONE or CHECK or UPDATE)",
2096 "NONE");
2097 moo_params_add_string(self, list, "wavesol_min_fwhm", "wavesol-min-fwhm",
2098 "minimum FWHM to filter lines for each detectors",
2099 "1.9,1.2,1.2,1.9,1.2,1.2");
2100 moo_params_add_string(self, list, "wavesol_max_fwhm", "wavesol-max-fwhm",
2101 "maximum FWHM to filter lines for each detectors",
2102 "5,5,5,5,5,5");
2104 self, list, "wavesol_linefit_method", "wavesol-linefit-method",
2105 "method of centroid peak detection (GAUSSIAN|BARYCENTER)",
2106 MOO_WAVESOL_LINEFIT_GAUSSIAN);
2107 moo_params_add_string(self, list, "wavesol_linefit_winhsize",
2108 "wavesol-linefit-winhsize",
2109 "list of half size window in pixel for gaussian fit "
2110 "for peak detection for each detectors",
2111 "2,2,2,2,2,2");
2112 moo_params_add_string(self, list, "wavesol_linefit_recentre",
2113 "wavesol-linefit-recentre",
2114 "list of flags (0:FALSE 1:TRUE) to use recentre mode "
2115 "for each detectors",
2116 "0,0,0,0,0,0");
2117 moo_params_add_string(self, list, "wavesol_model", "wavesol-model",
2118 "model of the polynomial wavelength solution (1D|2D)",
2119 MOO_WAVESOL_MODEL_1D);
2120 moo_params_add_string(self, list, "wavesol_wavemap_deg_x",
2121 "wavesol-wavemap-deg-x",
2122 "polynomial wavelength map degree in x for each band",
2123 "3,3,3");
2124
2125 moo_params_add_int(self, list, "wavesol_wavemap_deg_y",
2126 "wavesol-wavemap-deg-y",
2127 "polynomial wavelength map degree in y", 8);
2128 moo_params_add_double(self, list, "wavesol_clip_kappa",
2129 "wavesol-clip-kappa",
2130 "multiple of sigma in sigma clipping", 2.0);
2131 moo_params_add_double(self, list, "wavesol_clip_frac", "wavesol-clip-frac",
2132 "maximal fractions of rejected point allowed", 0.7);
2133 moo_params_add_int(self, list, "wavesol_clip_niter", "wavesol-clip-niter",
2134 "maximum number of iterations for sigma clipping", 10);
2135
2136 return cpl_error_get_code();
2137}
2138
2139/*----------------------------------------------------------------------------*/
2150/*----------------------------------------------------------------------------*/
2151cpl_error_code
2152moo_params_add_rebin(moo_params *self, cpl_parameterlist *list)
2153{
2155 self, list, "rebin_step", "rebin-step",
2156 "list of bin step in nm for each band, ordered as RI,YJ,H.",
2157 "0.05,0.05,0.05");
2158 moo_params_add_string(self, list, "rebin_method", "rebin-method",
2159 "method of rebinning (INTEGRATE|INTERPOLATE)",
2160 MOO_REBIN_METHOD_INTEGRATE);
2161 moo_params_add_bool(self, list, "rebin_flux_conserv", "rebin-flux-conserv",
2162 "conserve the flux.", CPL_FALSE);
2163 return cpl_error_get_code();
2164}
2165
2166/*----------------------------------------------------------------------------*/
2177/*----------------------------------------------------------------------------*/
2178cpl_error_code
2179moo_params_add_sub_sky_stare(moo_params *self, cpl_parameterlist *list)
2180{
2181 moo_params_add_string(self, list, "subskystare_method",
2182 "subskystare-method",
2183 "method for sky subtraction (SIMPLE|SKYCORR)",
2184 MOO_SUB_SKY_STARE_METHOD_SIMPLE);
2186 self, list, "subskystare_radius_sky", "subskystare-radius-sky",
2187 "maximum distance in arcmin between sky and reference position", 1.5);
2189 self, list, "subskystare_radius_stepr", "subskystare-radius-stepr",
2190 "increase step in arcmin for the radius around reference position",
2191 0.15);
2193 self, list, "subskystare_min_sky", "subskystare-min-sky",
2194 "minimum number of sky to median in the region defined by radius-sky",
2195 5);
2196 moo_params_add_int(self, list, "subskystare_maxdistslit",
2197 "subskystare-maxdistslit",
2198 "maximum distance of sky fibres on slit", 20);
2199 moo_params_add_double(self, list, "subskystare_mintrans",
2200 "subskystare-mintrans",
2201 "minimum transmission of sky fibres on slit", 0);
2202 moo_params_add_skycorr(self, list);
2203
2204 return cpl_error_get_code();
2205}
2206
2207/*----------------------------------------------------------------------------*/
2218/*----------------------------------------------------------------------------*/
2219cpl_error_code
2220moo_params_add_sub_sky_stare_wnone(moo_params *self, cpl_parameterlist *list)
2221{
2222 moo_params_add_string(self, list, "subskystare_method",
2223 "subskystare-method",
2224 "method for sky subtraction (SIMPLE|SKYCORR|NONE)",
2225 MOO_SUB_SKY_STARE_METHOD_SIMPLE);
2227 self, list, "subskystare_radius_sky", "subskystare-radius-sky",
2228 "maximum distance in arcmin between sky and reference position", 1.5);
2230 self, list, "subskystare_radius_stepr", "subskystare-radius-stepr",
2231 "increase step in arcmin for the radius around reference position",
2232 0.15);
2234 self, list, "subskystare_min_sky", "subskystare-min-sky",
2235 "minimum number of sky to median in the region defined by radius-sky",
2236 5);
2237 moo_params_add_int(self, list, "subskystare_maxdistslit",
2238 "subskystare-maxdistslit",
2239 "maximum distance of sky fibres on slit", 20);
2240 moo_params_add_double(self, list, "subskystare_mintrans",
2241 "subskystare-mintrans",
2242 "minimum transmission of sky fibres on slit", 0);
2243 moo_params_add_skycorr(self, list);
2244
2245 return cpl_error_get_code();
2246}
2247
2248/*----------------------------------------------------------------------------*/
2259/*----------------------------------------------------------------------------*/
2260moo_molecfit_model_params *
2262{
2263 moo_molecfit_model_params *res = (moo_molecfit_model_params *)
2264 cpl_calloc(1, sizeof(moo_molecfit_model_params));
2265 return res;
2266}
2267/*----------------------------------------------------------------------------*/
2276/*----------------------------------------------------------------------------*/
2277void
2278moo_molecfit_model_params_delete(moo_molecfit_model_params *self)
2279{
2280 if (self != NULL) {
2281 cpl_free(self);
2282 }
2283}
2284
2285/*----------------------------------------------------------------------------*/
2297/*----------------------------------------------------------------------------*/
2298moo_molecfit_calctrans_params *
2300{
2301 moo_molecfit_calctrans_params *res = (moo_molecfit_calctrans_params *)
2302 cpl_calloc(1, sizeof(moo_molecfit_calctrans_params));
2303 return res;
2304}
2305/*----------------------------------------------------------------------------*/
2314/*----------------------------------------------------------------------------*/
2315void
2316moo_molecfit_calctrans_params_delete(moo_molecfit_calctrans_params *self)
2317{
2318 if (self != NULL) {
2319 cpl_free(self);
2320 }
2321}
2322/*----------------------------------------------------------------------------*/
2334/*----------------------------------------------------------------------------*/
2335moo_create_s1d_params *
2337{
2338 moo_create_s1d_params *res =
2339 (moo_create_s1d_params *)cpl_calloc(1, sizeof(moo_create_s1d_params));
2340 return res;
2341}
2342/*----------------------------------------------------------------------------*/
2351/*----------------------------------------------------------------------------*/
2352void
2353moo_create_s1d_params_delete(moo_create_s1d_params *self)
2354{
2355 if (self != NULL) {
2356 cpl_free(self);
2357 }
2358}
2359/*----------------------------------------------------------------------------*/
2371/*----------------------------------------------------------------------------*/
2372cpl_error_code
2373moo_params_add_molecfit_model(moo_params *self, cpl_parameterlist *list)
2374{
2375 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
2376
2377
2378 moo_params_add_double(self, list, MF_PARAMETERS_CONTINUUM_CONST,
2379 MF_PARAMETERS_CONTINUUM_CONST,
2380 MF_PARAMETERS_CONTINUUM_CONST_DESC,
2381 MF_PARAMETERS_CONTINUUM_CONST_INIT);
2382 moo_params_add_bool(self, list, MF_PARAMETERS_VAR_KERN,
2383 MF_PARAMETERS_VAR_KERN, MF_PARAMETERS_VAR_KERN_DESC,
2384 MF_PARAMETERS_VAR_KERN_INIT);
2385 moo_params_add_bool(self, list, MF_PARAMETERS_KERN_MODE,
2386 MF_PARAMETERS_KERN_MODE, MF_PARAMETERS_KERN_MODE_DESC,
2387 MF_PARAMETERS_KERN_MODE_INIT);
2388 moo_params_add_double(self, list, MF_PARAMETERS_KERN_FAC,
2389 MF_PARAMETERS_KERN_FAC, MF_PARAMETERS_KERN_FAC_DESC,
2390 MF_PARAMETERS_KERN_FAC_INIT);
2391
2392 return cpl_error_get_code();
2393}
2394
2395/*----------------------------------------------------------------------------*/
2407/*----------------------------------------------------------------------------*/
2408cpl_error_code
2409moo_params_add_molecfit_calctrans(moo_params *self, cpl_parameterlist *list)
2410{
2411 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
2412
2414 self, list, "molecfit_calctrans_min_snr", "molecfit-calctrans-min-snr",
2415 "list of minimum SNR (MEDIAN_SNR_{}_EXT) for each detectors",
2416 "15,15,15");
2417 moo_params_add_bool(self, list, "molecfit_calctrans_filter_skyfibre",
2418 "molecfit-calctrans-filter-skyfibre",
2419 "filter the SKY fibres.", CPL_TRUE);
2420
2421 return cpl_error_get_code();
2422}
2423/*----------------------------------------------------------------------------*/
2435/*----------------------------------------------------------------------------*/
2436cpl_error_code
2437moo_params_add_create_s1d(moo_params *self, cpl_parameterlist *list)
2438{
2439 cpl_ensure_code(self != NULL, CPL_ERROR_NULL_INPUT);
2440
2441 moo_params_add_bool(self, list, "create_s1d", "create-s1d",
2442 "Create the S1D files from the PRODUCT SCI", CPL_FALSE);
2443
2444 return cpl_error_get_code();
2445}
2446/*----------------------------------------------------------------------------*/
2457/*----------------------------------------------------------------------------*/
2458cpl_error_code
2459moo_params_add_sub_sky_stare_simple(moo_params *self, cpl_parameterlist *list)
2460{
2462 self, list, "subskystare_radius_sky", "subskystare-radius-sky",
2463 "maximum distance in arcmin between sky and reference position", 1.5);
2465 self, list, "subskystare_radius_stepr", "subskystare-radius-stepr",
2466 "increase step in arcmin for the radius around reference position",
2467 0.15);
2469 self, list, "subskystare_min_sky", "subskystare-min-sky",
2470 "minimum number of sky to median in the region defined by radius-sky",
2471 5);
2472 moo_params_add_int(self, list, "subskystare_maxdistslit",
2473 "subskystare-maxdistslit",
2474 "maximum distance of sky fibres on slit", 20);
2475 moo_params_add_double(self, list, "subskystare_mintrans",
2476 "subskystare-mintrans",
2477 "minimum transmission of sky fibres on slit", 0);
2478
2479 return cpl_error_get_code();
2480}
2481
2482/*----------------------------------------------------------------------------*/
2493/*----------------------------------------------------------------------------*/
2494cpl_error_code
2495moo_params_add_skycorr(moo_params *self, cpl_parameterlist *list)
2496{
2498 self, list, "skycorr_ltol", "skycorr-ltol",
2499 "LINE IDENTIFICATION: Relative FWHM convergence criterion ", 0.01);
2501 self, list, "skycorr_min_line_dist_fac", "skycorr-min-line-dist-fac",
2502 "LINE IDENTIFICATION: Minimum distance to neighbouring lines for\
2503 classification as isolated line:<MIN_LINE_DIST> * <FWHM> [pixel] ",
2504 2.5);
2506 self, list, "skycorr_min_line_flux_fac", "skycorr-min-line-flux-fac",
2507 "LINE IDENTIFICATION: Relative lower flux limit for isolated lines",
2508 0.);
2510 self, list, "skycorr_fluxlim", "skycorr-fluxlim",
2511 "LINE IDENTIFICATION: Minimum line peak flux for consideration of\
2512 lines from airglow line list:<FLUXLIM> * <median flux of identified lines>\
2513 Automatic search -> FLUXLIM = -1",
2514 -1);
2516 self, list, "skycorr_ftol", "skycorr-ftol",
2517 "FITTING OF SKY LINES: Relative chi^2 MPFIT convergence criterion",
2518 1e-3);
2520 self, list, "skycorr_xtol", "skycorr-xtol",
2521 "FITTING OF SKY LINES: Relative parameter MPFIT convergence criterion",
2522 1e-3);
2524 self, list, "skycorr_wtol", "skycorr-wtol",
2525 "FITTING OF SKY LINES: Relative chi^2 convergence criterion for iterative improvement of \
2526wavelength grid",
2527 1e-3);
2529 self, list, "skycorr_cheby_max", "skycorr-cheby-max",
2530 "FITTING OF SKY LINES: maximum degree of Chebyshev polynomial for\
2531 wavelength grid correction:-1 = no correction,0 = linear term (coef. = 1) \
2532is also considered but not fitted",
2533 7);
2535 self, list, "skycorr_cheby_min", "skycorr-cheby-min",
2536 "FITTING OF SKY LINES: Minimum degree of Chebyshev polynomial for \
2537wavelength grid correction. CHEBY_MIN <= CHEBY_MAX: - Iterative increase of \
2538polynomial degree at least until CHEBY_MIN - Procedure stops if chi^2 gets \
2539worse or CHEBY_MAX is reached.- Results of degree with best chi^2 are taken. \
2540CHEBY_MIN > CHEBY_MAX:- Iterative increase of polynomial degree until CHEBY_MAX \
2541is reached.- Results of degree CHEBY_MAX are taken. ",
2542 3);
2543
2545 self, list, "skycorr_cheby_const", "skycorr-cheby-const",
2546 "FITTING OF SKY LINES: Initial constant term for wavelength grid \
2547correction (shift relative to half wavelength range)",
2548 0);
2549 moo_params_add_int(self, list, "skycorr_rebintype", "skycorr-rebintype",
2550 "Type of rebinning: 0 = simple rebinning \
2551(summation of pixel fractions) 1 = convolution with asymmetric, damped sinc kernel",
2552 1);
2554 self, list, "skycorr_weightlim", "skycorr-weightlim",
2555 "minimum relative weight of the strongest line group of a pixel for\
2556 including a pixel in the line fitting procedure",
2557 0.67);
2558
2560 self, list, "skycorr_siglim", "skycorr-siglim",
2561 "sigma limit for excluding outliers (e.g. object emission lines) from "
2562 "estimate of group flux correction factors.",
2563 15.);
2564
2566 self, list, "skycorr_fitlim", "skycorr-fitlim",
2567 "Lower relative uncertainty limit for the consideration of a line \
2568group for the fitting procedure. The value is compared to the sigma-to-mean \
2569ratio of the group-specific flux correction factors of the initial estimate \
2570(0. -> include all fittable line groups).",
2571 0);
2572
2573
2574 return cpl_error_get_code();
2575}
2576
2577/*----------------------------------------------------------------------------*/
2589/*----------------------------------------------------------------------------*/
2590cpl_error_code
2592 cpl_parameterlist *list,
2593 int value)
2594{
2596 self, list, "combine_pair_optimal", "combine-pair-optimal",
2597 "Extract the best sky-subtracted spectra for each target", value);
2598
2599 return cpl_error_get_code();
2600}
2601
2602/*----------------------------------------------------------------------------*/
2614/*----------------------------------------------------------------------------*/
2615cpl_error_code
2617 cpl_parameterlist *list,
2618 int value)
2619{
2620 moo_params_add_bool(self, list, "target_table_nosky", "target-table-nosky",
2621 "ignore SKY fibres as OBJECT.", value);
2622
2623 return cpl_error_get_code();
2624}
2625
2626/*----------------------------------------------------------------------------*/
2637/*----------------------------------------------------------------------------*/
2638cpl_error_code
2639moo_params_add_compute_snr(moo_params *self, cpl_parameterlist *list)
2640{
2641 moo_params_add_string(self, list, "compute_snr_wmin", "compute-snr-wmin",
2642 "list of minimum wavelength in nm for each detectors",
2643 "810,1000,1605");
2644 moo_params_add_string(self, list, "compute_snr_wmax", "compute-snr-wmax",
2645 "list of maximum wavelength in nm for each detectors",
2646 "830,1100,1625");
2647 return cpl_error_get_code();
2648}
2649
2650/*----------------------------------------------------------------------------*/
2661/*----------------------------------------------------------------------------*/
2662cpl_error_code
2663moo_params_add_compute_slitoffset(moo_params *self, cpl_parameterlist *list)
2664{
2665 moo_params_add_double(self, list, "compute_slitoffset_min",
2666 "compute-slitoffset-min", "min offset range", -3);
2667 moo_params_add_double(self, list, "compute_slitoffset_max",
2668 "compute-slitoffset-max", "max offset range", 3);
2669 moo_params_add_double(self, list, "compute_slitoffset_step",
2670 "compute-slitoffset-step", "offset step", 0.1);
2671 return cpl_error_get_code();
2672}
2673
2674/*----------------------------------------------------------------------------*/
2685/*----------------------------------------------------------------------------*/
2686cpl_error_code
2687moo_params_add_coadd(moo_params *self, cpl_parameterlist *list)
2688{
2689 moo_params_add_string(self, list, "coadd_method", "coadd-method",
2690 "method for co-adding spectra: (MEAN|MEDIAN|SIGCLIP)",
2691 MOO_COADD_METHOD_MEAN);
2692 moo_params_add_double(self, list, "coadd_clip_kappa", "coadd-clip-kappa",
2693 "multiple of sigma in 1D spectra combination. ", 3.0);
2694 moo_params_add_int(self, list, "coadd_clip_niter", "coadd-clip-niter",
2695 "Number of iterations for sigma clipping", 5);
2696
2697 return cpl_error_get_code();
2698}
2699
2700
2701/*----------------------------------------------------------------------------*/
2712/*----------------------------------------------------------------------------*/
2713moo_wavesol_params *
2714moo_params_get_wavesol(const moo_params *self, const cpl_parameterlist *list)
2715{
2716 moo_wavesol_params *res = NULL;
2717 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
2718 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
2719
2720 res = moo_wavesol_params_new();
2721 _moo_params_get_tab_int(self, res->linedetect_nlines, list,
2722 "wavesol_linedetect_nlines");
2723 _moo_params_get_tab_int(self, res->linedetect_winhsize, list,
2724 "wavesol_linedetect_winhsize");
2725 _moo_params_get_tab_double(self, res->tolerance, list,
2726 "wavesol_ppm_tolerance");
2727 _moo_params_get_tab_int(self, res->ppm_wavemap_degx, list,
2728 "wavesol_ppm_wavemap_deg_x");
2729 res->ppm_wavemap_degy =
2730 moo_params_get_int(self, list, "wavesol_ppm_wavemap_deg_y");
2731
2732 double frac = moo_params_get_double(self, list, "wavesol_clip_frac");
2733 double kappa = moo_params_get_double(self, list, "wavesol_clip_kappa");
2734 int niter = moo_params_get_int(self, list, "wavesol_clip_niter");
2735 _moo_params_get_tab_int(self, res->wavemap_degx, list,
2736 "wavesol_wavemap_deg_x");
2737 int degy = moo_params_get_int(self, list, "wavesol_wavemap_deg_y");
2738 res->clip_frac = frac;
2739 res->clip_niter = niter;
2740 res->clip_kappa = kappa;
2741 res->wavemap_degy = degy;
2742 res->control = MOO_WAVESOL_CONTROL_NONE;
2743 const char *linefit_method =
2744 moo_params_get_string(self, list, "wavesol_linefit_method");
2745
2746 if ((strcmp(linefit_method, MOO_WAVESOL_LINEFIT_GAUSSIAN) == 0) ||
2747 (strcmp(linefit_method, MOO_WAVESOL_LINEFIT_BARYCENTER) == 0)) {
2748 res->linefit_method = linefit_method;
2749 }
2750 else {
2751 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
2752 "Invalid parameter wavesol-linefit-method (%s) : "
2753 "GAUSSIAN or BARYCENTER expected",
2754 linefit_method);
2755 }
2756 _moo_params_get_tab_int(self, res->linefit_winhsize, list,
2757 "wavesol_linefit_winhsize");
2758 _moo_params_get_tab_int(self, res->linefit_recentre, list,
2759 "wavesol_linefit_recentre");
2760 _moo_params_get_tab_double(self, res->fwhm_min, list, "wavesol_min_fwhm");
2761 _moo_params_get_tab_double(self, res->fwhm_max, list, "wavesol_max_fwhm");
2762 _moo_params_get_tab_double(self, res->min_snr, list, "wavesol_min_sn");
2763 const char *model = moo_params_get_string(self, list, "wavesol_model");
2764 if ((strcmp(model, MOO_WAVESOL_MODEL_1D) == 0) ||
2765 (strcmp(model, MOO_WAVESOL_MODEL_2D) == 0)) {
2766 res->model = model;
2767 }
2768 else {
2769 cpl_error_set_message(
2770 cpl_func, CPL_ERROR_ILLEGAL_INPUT,
2771 "Invalid parameter wavesol-model (%s) : 1D or 2D expected", model);
2772 }
2773
2774 return res;
2775}
2776
2777/*----------------------------------------------------------------------------*/
2788/*----------------------------------------------------------------------------*/
2789moo_wavesol_params *
2790moo_params_get_science_wavesol(const moo_params *self,
2791 const cpl_parameterlist *list)
2792{
2793 moo_wavesol_params *res = NULL;
2794 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
2795 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
2796
2797 res = moo_wavesol_params_new();
2798
2799 double frac = moo_params_get_double(self, list, "wavesol_clip_frac");
2800 double kappa = moo_params_get_double(self, list, "wavesol_clip_kappa");
2801 int niter = moo_params_get_int(self, list, "wavesol_clip_niter");
2802 _moo_params_get_tab_int(self, res->wavemap_degx, list,
2803 "wavesol_wavemap_deg_x");
2804 int degy = moo_params_get_int(self, list, "wavesol_wavemap_deg_y");
2805 res->clip_frac = frac;
2806 res->clip_niter = niter;
2807 res->clip_kappa = kappa;
2808 res->wavemap_degy = degy;
2809 const char *control = moo_params_get_string(self, list, "wavesol_control");
2810 if ((strcmp(control, MOO_WAVESOL_CONTROL_NONE) == 0) ||
2811 (strcmp(control, MOO_WAVESOL_CONTROL_CHECK) == 0) ||
2812 (strcmp(control, MOO_WAVESOL_CONTROL_UPDATE) == 0)) {
2813 res->control = control;
2814 }
2815 else {
2816 cpl_error_set_message(
2817 cpl_func, CPL_ERROR_ILLEGAL_INPUT,
2818 "Invalid parameter wavesol-control (%s) : NONE or CHECK or UPDATE",
2819 control);
2820 }
2821 const char *linefit_method =
2822 moo_params_get_string(self, list, "wavesol_linefit_method");
2823 if ((strcmp(linefit_method, MOO_WAVESOL_LINEFIT_GAUSSIAN) == 0) ||
2824 (strcmp(linefit_method, MOO_WAVESOL_LINEFIT_BARYCENTER) == 0)) {
2825 res->linefit_method = linefit_method;
2826 }
2827 else {
2828 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
2829 "Invalid parameter wavesol-linefit-method (%s) : "
2830 "GAUSSIAN or BARYCENTER expected",
2831 linefit_method);
2832 }
2833 _moo_params_get_tab_int(self, res->linefit_winhsize, list,
2834 "wavesol_linefit_winhsize");
2835 _moo_params_get_tab_int(self, res->linefit_recentre, list,
2836 "wavesol_linefit_recentre");
2837 _moo_params_get_tab_double(self, res->fwhm_min, list, "wavesol_min_fwhm");
2838 _moo_params_get_tab_double(self, res->fwhm_max, list, "wavesol_max_fwhm");
2839 const char *model = moo_params_get_string(self, list, "wavesol_model");
2840 if ((strcmp(model, MOO_WAVESOL_MODEL_1D) == 0) ||
2841 (strcmp(model, MOO_WAVESOL_MODEL_2D) == 0)) {
2842 res->model = model;
2843 }
2844 else {
2845 cpl_error_set_message(
2846 cpl_func, CPL_ERROR_ILLEGAL_INPUT,
2847 "Invalid parameter wavesol-model (%s) : 1D or 2D expected", model);
2848 }
2849
2850 return res;
2851}
2852
2853/*----------------------------------------------------------------------------*/
2864/*----------------------------------------------------------------------------*/
2865moo_rebin_params *
2866moo_params_get_rebin(const moo_params *self, const cpl_parameterlist *list)
2867{
2868 moo_rebin_params *res = NULL;
2869 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
2870 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
2871
2872
2873 res = moo_rebin_params_new();
2874
2875 const char *rebin_method =
2876 moo_params_get_string(self, list, "rebin_method");
2877
2878 if ((strcmp(rebin_method, MOO_REBIN_METHOD_INTERPOLATE) == 0) ||
2879 (strcmp(rebin_method, MOO_REBIN_METHOD_INTEGRATE) == 0)) {
2880 res->method = rebin_method;
2881 }
2882 else {
2883 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
2884 "Invalid parameter rebin-method (%s) : "
2885 "INTERPOLATE or INTEGRATE expected",
2886 rebin_method);
2887 return res;
2888 }
2889
2890 _moo_params_get_tab3_double(self, res->step, list, "rebin_step");
2891
2892 res->conserv_flux = moo_params_get_bool(self, list, "rebin_flux_conserv");
2893 return res;
2894}
2895
2896/*----------------------------------------------------------------------------*/
2907/*----------------------------------------------------------------------------*/
2908moo_sub_sky_stare_params *
2909moo_params_get_sub_sky_stare(const moo_params *self,
2910 const cpl_parameterlist *list)
2911{
2912 moo_sub_sky_stare_params *res = NULL;
2913 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
2914 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
2915
2916
2917 res = moo_sub_sky_stare_params_new();
2918 res->method = moo_params_get_string(self, list, "subskystare_method");
2919
2920 if ((strcmp(res->method, MOO_SUB_SKY_STARE_METHOD_SIMPLE) != 0) &&
2921 (strcmp(res->method, MOO_SUB_SKY_STARE_METHOD_SKYCORR) != 0) &&
2922 (strcmp(res->method, MOO_SUB_SKY_STARE_METHOD_NONE) != 0)) {
2923 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
2924 "Invalid parameter sub-sky-stare-method (%s) : "
2925 "SIMPLE, SKYCORR or NONE expected",
2926 res->method);
2927 moo_sub_sky_stare_params_delete(res);
2928 return NULL;
2929 }
2930
2931 res->maxdistslit =
2932 moo_params_get_int(self, list, "subskystare_maxdistslit");
2933 res->min_trans = moo_params_get_double(self, list, "subskystare_mintrans");
2934 res->min_sky = moo_params_get_int(self, list, "subskystare_min_sky");
2935 res->radius_sky =
2936 moo_params_get_double(self, list, "subskystare_radius_sky");
2937 res->step_r = moo_params_get_double(self, list, "subskystare_radius_stepr");
2938
2939 res->sk = moo_params_get_skycorr(self, list);
2940
2941 return res;
2942}
2943
2944/*----------------------------------------------------------------------------*/
2955/*----------------------------------------------------------------------------*/
2956moo_sub_sky_stare_params *
2958 const cpl_parameterlist *list)
2959{
2960 moo_sub_sky_stare_params *res = NULL;
2961 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
2962 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
2963
2964
2965 res = moo_sub_sky_stare_params_new();
2966 res->method = MOO_SUB_SKY_STARE_METHOD_SIMPLE;
2967
2968 res->maxdistslit =
2969 moo_params_get_int(self, list, "subskystare_maxdistslit");
2970 res->min_trans = moo_params_get_double(self, list, "subskystare_mintrans");
2971 res->min_sky = moo_params_get_int(self, list, "subskystare_min_sky");
2972 res->radius_sky =
2973 moo_params_get_double(self, list, "subskystare_radius_sky");
2974 res->step_r = moo_params_get_double(self, list, "subskystare_radius_stepr");
2975
2976 res->sk = NULL;
2977
2978 return res;
2979}
2980
2981/*----------------------------------------------------------------------------*/
2992/*----------------------------------------------------------------------------*/
2993moo_skycorr_params *
2994moo_params_get_skycorr(const moo_params *self, const cpl_parameterlist *list)
2995{
2996 moo_skycorr_params *res = NULL;
2997 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
2998 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
2999
3000
3001 res = moo_skycorr_params_new();
3002
3003 res->ltol = moo_params_get_double(self, list, "skycorr_ltol");
3004 res->min_line_dist_fac =
3005 moo_params_get_double(self, list, "skycorr_min_line_dist_fac");
3006 res->min_line_flux_fac =
3007 moo_params_get_double(self, list, "skycorr_min_line_flux_fac");
3008 res->fluxlim = moo_params_get_double(self, list, "skycorr_fluxlim");
3009 res->ftol = moo_params_get_double(self, list, "skycorr_ftol");
3010 res->xtol = moo_params_get_double(self, list, "skycorr_xtol");
3011 res->wtol = moo_params_get_double(self, list, "skycorr_wtol");
3012 res->cheby_max = moo_params_get_int(self, list, "skycorr_cheby_max");
3013 res->cheby_min = moo_params_get_int(self, list, "skycorr_cheby_min");
3014 res->rebintype = moo_params_get_int(self, list, "skycorr_rebintype");
3015 res->cheby_const = moo_params_get_double(self, list, "skycorr_cheby_const");
3016 res->fluxlim = moo_params_get_double(self, list, "skycorr_weightlim");
3017 res->siglim = moo_params_get_double(self, list, "skycorr_siglim");
3018 res->fitlim = moo_params_get_double(self, list, "skycorr_fitlim");
3019 return res;
3020}
3021
3022/*----------------------------------------------------------------------------*/
3033/*----------------------------------------------------------------------------*/
3034moo_combine_pair_params *
3035moo_params_get_combine_pair(const moo_params *self,
3036 const cpl_parameterlist *list)
3037{
3038 moo_combine_pair_params *res = NULL;
3039 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
3040 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
3041
3042
3043 res = moo_combine_pair_params_new();
3044
3045 res->optimal = moo_params_get_bool(self, list, "combine_pair_optimal");
3046
3047 return res;
3048}
3049
3050/*----------------------------------------------------------------------------*/
3061/*----------------------------------------------------------------------------*/
3062moo_target_table_params *
3063moo_params_get_target_table(const moo_params *self,
3064 const cpl_parameterlist *list)
3065{
3066 moo_target_table_params *res = NULL;
3067 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
3068 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
3069
3070
3071 res = moo_target_table_params_new();
3072
3073 res->nosky = moo_params_get_bool(self, list, "target_table_nosky");
3074
3075 return res;
3076}
3077
3078/*----------------------------------------------------------------------------*/
3089/*----------------------------------------------------------------------------*/
3090moo_compute_snr_params *
3091moo_params_get_compute_snr(const moo_params *self,
3092 const cpl_parameterlist *list)
3093{
3094 moo_compute_snr_params *res = NULL;
3095 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
3096 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
3097
3098
3099 res = moo_compute_snr_params_new();
3100 _moo_params_get_tab3_double(self, res->wmin, list, "compute_snr_wmin");
3101 _moo_params_get_tab3_double(self, res->wmax, list, "compute_snr_wmax");
3102
3103 return res;
3104}
3105
3106/*----------------------------------------------------------------------------*/
3117/*----------------------------------------------------------------------------*/
3118moo_compute_slitoffset_params *
3120 const cpl_parameterlist *list)
3121{
3122 moo_compute_slitoffset_params *res = NULL;
3123 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
3124 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
3125
3126
3127 res = moo_compute_slitoffset_params_new();
3128 res->min = moo_params_get_double(self, list, "compute_slitoffset_min");
3129 res->max = moo_params_get_double(self, list, "compute_slitoffset_max");
3130 res->step = moo_params_get_double(self, list, "compute_slitoffset_step");
3131
3132 return res;
3133}
3134/*------------------------------------------------------------------------*/
3145/*----------------------------------------------------------------------------*/
3146moo_coadd_params *
3147moo_params_get_coadd(const moo_params *self, const cpl_parameterlist *list)
3148{
3149 moo_coadd_params *res = NULL;
3150 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
3151 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
3152
3153
3154 res = moo_coadd_params_new();
3155
3156 const char *method = moo_params_get_string(self, list, "coadd_method");
3157 if ((strcmp(method, MOO_COADD_METHOD_MEAN) == 0) ||
3158 (strcmp(method, MOO_COADD_METHOD_MEDIAN) == 0) ||
3159 (strcmp(method, MOO_COADD_METHOD_SIGCLIP) == 0)) {
3160 res->method = method;
3161 }
3162 else {
3163 cpl_error_set_message(
3164 cpl_func, CPL_ERROR_ILLEGAL_INPUT,
3165 "Invalid parameter coadd-method (%s) : MEAN or MEDIAN or SIGCLIP",
3166 method);
3167 }
3168 res->clip_kappa = moo_params_get_double(self, list, "coadd_clip_kappa");
3169 res->clip_niter = moo_params_get_int(self, list, "coadd_clip_niter");
3170 return res;
3171}
3172
3173/*----------------------------------------------------------------------------*/
3184/*----------------------------------------------------------------------------*/
3185moo_linear_params *
3186moo_params_get_linear(const moo_params *self, const cpl_parameterlist *list)
3187{
3188 moo_linear_params *res = NULL;
3189 cpl_ensure(self != NULL, CPL_ERROR_NULL_INPUT, NULL);
3190 cpl_ensure(list != NULL, CPL_ERROR_NULL_INPUT, NULL);
3191
3192 res = moo_linear_params_new();
3193 _moo_params_get_tab_double(self, res->kappa, list, "bpmnl_clip_kappa");
3194 _moo_params_get_tab_double(self, res->saturate_kappa, list,
3195 "detect_saturated_ron_kappa");
3196 _moo_params_get_tab_double(self, res->min_snr, list, "bpmnl_min_snr");
3197 res->saturate_threshold =
3198 moo_params_get_double(self, list, "detect_saturated_threshold");
3199
3200 return res;
3201}
3202
moo_coadd_params * moo_params_get_coadd(const moo_params *self, const cpl_parameterlist *list)
Get coadd parameters from moons parameters list.
Definition: moo_params.c:3147
cpl_error_code moo_params_add_compute_fibtrans(moo_params *self, cpl_parameterlist *list)
Add default parameters for compute_fibtrans.
Definition: moo_params.c:1866
cpl_error_code moo_params_add_create_s1d(moo_params *self, cpl_parameterlist *list)
Add default parameters for create_s1d.
Definition: moo_params.c:2437
void moo_create_s1d_params_delete(moo_create_s1d_params *self)
Delete a moo_create_s1d_params.
Definition: moo_params.c:2353
moo_nos_params * moo_nos_params_new(void)
Create a new empty compute noise map set of parameters.
Definition: moo_params.c:629
cpl_array * moo_params_get_quicklook_fibre_list(const moo_params *self, const cpl_parameterlist *list)
Get quicklook_fibre_list parameter from moons parameters list.
Definition: moo_params.c:1358
moo_molecfit_calctrans_params * moo_molecfit_calctrans_params_new(void)
Create a new empty molecfit_calctrans set of parameters.
Definition: moo_params.c:2299
cpl_error_code moo_nos_params_dump(const moo_nos_params *self, FILE *stream)
Dump nos params.
Definition: moo_params.c:980
cpl_error_code moo_params_add_skycorr(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_skycorr.
Definition: moo_params.c:2495
cpl_error_code moo_params_add_extract(moo_params *self, cpl_parameterlist *list)
Add default parameters for extraction.
Definition: moo_params.c:902
cpl_error_code moo_params_add_sub_sky_stare(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_sub_sky_stare.
Definition: moo_params.c:2179
cpl_error_code moo_params_add_compute_snr(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_sci_compute_snr.
Definition: moo_params.c:2639
moo_create_s1d_params * moo_params_get_create_s1d(const moo_params *self, const cpl_parameterlist *list)
Get create s1d parameters from moons parameters list.
Definition: moo_params.c:1614
const char * moo_params_get_string(const moo_params *self, const cpl_parameterlist *list, const char *name)
Get string parameter from moons parameters list.
Definition: moo_params.c:360
cpl_error_code moo_params_add_molecfit_calctrans(moo_params *self, cpl_parameterlist *list)
Add default parameters for molecfit_calctrans.
Definition: moo_params.c:2409
cpl_error_code moo_params_add_linear(moo_params *self, cpl_parameterlist *list)
Add default parameters for linear.
Definition: moo_params.c:764
int moo_params_get_int(const moo_params *self, const cpl_parameterlist *list, const char *name)
Get int parameter from moons parameters list.
Definition: moo_params.c:302
moo_prepare_params * moo_params_get_prepare(const moo_params *self, const cpl_parameterlist *list)
Get remove prepare parameters from moons parameters list.
Definition: moo_params.c:1073
cpl_error_code moo_params_add_nos(moo_params *self, cpl_parameterlist *list)
Add default parameters for compute noise map.
Definition: moo_params.c:527
moo_sub_sky_stare_params * moo_params_get_sub_sky_stare(const moo_params *self, const cpl_parameterlist *list)
Get sub sky stare parameters from moons parameters list.
Definition: moo_params.c:2909
int moo_params_get_keep_temp(const moo_params *self, const cpl_parameterlist *list)
Get keep-temp parameter from moons parameters list.
Definition: moo_params.c:1335
cpl_error_code moo_params_add_int(moo_params *params, cpl_parameterlist *list, const char *name, const char *alias, const char *def, int val)
Add int parameter to moons parameters list.
Definition: moo_params.c:195
moo_create_s1d_params * moo_create_s1d_params_new(void)
Create a new empty create_s1d set of parameters.
Definition: moo_params.c:2336
moo_molecfit_calctrans_params * moo_params_get_molecfit_calctrans(const moo_params *self, const cpl_parameterlist *list)
Get molecfit calctrans parameters from moons parameters list.
Definition: moo_params.c:1584
moo_localise_params * moo_params_get_localise(const moo_params *self, const cpl_parameterlist *list)
Get localisation parameters from moons parameters list.
Definition: moo_params.c:1233
moo_compute_resp_params * moo_params_get_compute_resp(const moo_params *self, const cpl_parameterlist *list)
Get compute response parameters from moons parameters list.
Definition: moo_params.c:1968
int moo_params_get_bool(const moo_params *self, const cpl_parameterlist *list, const char *name)
Get boolean parameter from moons parameters list.
Definition: moo_params.c:330
moo_wavesol_params * moo_params_get_wavesol(const moo_params *self, const cpl_parameterlist *list)
Get wavesol parameters from moons parameters list.
Definition: moo_params.c:2714
moo_skycorr_params * moo_params_get_skycorr(const moo_params *self, const cpl_parameterlist *list)
Get skycorr parameters from moons parameters list.
Definition: moo_params.c:2994
moo_bias_params * moo_params_get_bias(const moo_params *self, const cpl_parameterlist *list)
Get bias parameters from moons parameters list.
Definition: moo_params.c:1137
cpl_error_code moo_params_add_compute_slitoffset(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_sci_compute_slitoffset.
Definition: moo_params.c:2663
moo_compute_slitoffset_params * moo_params_get_compute_slitoffset(const moo_params *self, const cpl_parameterlist *list)
Get compute_slitoffset parameters from moons parameters list.
Definition: moo_params.c:3119
cpl_error_code moo_params_add_hot(moo_params *self, cpl_parameterlist *list)
Add default parameters for compute hot map.
Definition: moo_params.c:556
moo_combine_pair_params * moo_params_get_combine_pair(const moo_params *self, const cpl_parameterlist *list)
Get combine_pair parameters from moons parameters list.
Definition: moo_params.c:3035
cpl_error_code moo_params_add_target_table(moo_params *self, cpl_parameterlist *list, int value)
Add default parameters for moo_create_target_table.
Definition: moo_params.c:2616
cpl_error_code moo_params_add_sub_sky_stare_simple(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_sub_sky_stare.
Definition: moo_params.c:2459
cpl_error_code moo_params_add_combine_pair(moo_params *self, cpl_parameterlist *list, int value)
Add default parameters for moo_combine_pair.
Definition: moo_params.c:2591
moo_target_table_params * moo_params_get_target_table(const moo_params *self, const cpl_parameterlist *list)
Get target_table parameters from moons parameters list.
Definition: moo_params.c:3063
moo_sub_sky_stare_params * moo_params_get_sub_sky_stare_simple(const moo_params *self, const cpl_parameterlist *list)
Get sub sky stare simple parameters from moons parameters list.
Definition: moo_params.c:2957
cpl_error_code moo_params_add_string(moo_params *params, cpl_parameterlist *list, const char *name, const char *alias, const char *def, const char *val)
Add string parameter to moons parameters list.
Definition: moo_params.c:110
moo_model_flat_params * moo_params_get_model_flat(const moo_params *self, const cpl_parameterlist *list)
Get model flat parameters from moons parameters list.
Definition: moo_params.c:1640
void moo_nos_params_delete(moo_nos_params *self)
Delete a moo_nos_params.
Definition: moo_params.c:646
cpl_error_code moo_params_add_science_wavesol(moo_params *self, cpl_parameterlist *list)
Add default science parameters for moo_wavesol.
Definition: moo_params.c:2091
cpl_error_code moo_params_add_quicklook_fibre_list(moo_params *self, cpl_parameterlist *list)
Add default parameters for quicklook.
Definition: moo_params.c:956
moo_compute_fibtrans_params * moo_params_get_compute_fibtrans(const moo_params *self, const cpl_parameterlist *list)
Get compute fibtrans parameters from moons parameters list.
Definition: moo_params.c:1927
moo_linear_params * moo_params_get_linear(const moo_params *self, const cpl_parameterlist *list)
Get linear parameters from moons parameters list.
Definition: moo_params.c:3186
moo_correct_bias_params * moo_params_get_correct_bias(const moo_params *self, const cpl_parameterlist *list)
Get correct_bias parameters from moons parameters list.
Definition: moo_params.c:1167
void moo_molecfit_model_params_delete(moo_molecfit_model_params *self)
Delete a moo_molecfit_model_params.
Definition: moo_params.c:2278
cpl_error_code moo_params_add_crh(moo_params *self, cpl_parameterlist *list, const char *method)
Add default parameters for remove crh.
Definition: moo_params.c:694
void moo_molecfit_calctrans_params_delete(moo_molecfit_calctrans_params *self)
Delete a moo_molecfit_calctrans_params.
Definition: moo_params.c:2316
moo_extract_params * moo_params_get_extract(const moo_params *self, const cpl_parameterlist *list)
Get extraction parameters from moons parameters list.
Definition: moo_params.c:1197
cpl_error_code moo_params_add_bool(moo_params *params, cpl_parameterlist *list, const char *name, const char *alias, const char *def, int val)
Add boolean parameter to moons parameters list.
Definition: moo_params.c:237
moo_wavesol_params * moo_params_get_science_wavesol(const moo_params *self, const cpl_parameterlist *list)
Get science_wavesol parameters from moons parameters list.
Definition: moo_params.c:2790
void moo_params_delete(moo_params *self)
Delete a moo_params.
Definition: moo_params.c:85
moo_crh_params * moo_params_get_crh(const moo_params *self, const cpl_parameterlist *list)
Get remove crh parameters from moons parameters list.
Definition: moo_params.c:1099
double moo_params_get_double(const moo_params *self, const cpl_parameterlist *list, const char *name)
Get double parameter from moons parameters list.
Definition: moo_params.c:275
cpl_error_code moo_params_add_sub_sky_stare_wnone(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_sub_sky_stare.
Definition: moo_params.c:2220
cpl_error_code moo_params_add_bias(moo_params *self, cpl_parameterlist *list)
Add default parameters for bias.
Definition: moo_params.c:818
void moo_hot_params_delete(moo_hot_params *self)
Delete a moo_hot_params.
Definition: moo_params.c:609
cpl_error_code moo_params_add_correct_bias(moo_params *self, cpl_parameterlist *list, const char *method)
Add default parameters for correct_bias.
Definition: moo_params.c:860
cpl_error_code moo_params_add_molecfit_model(moo_params *self, cpl_parameterlist *list)
Add default parameters for molecfit_model.
Definition: moo_params.c:2373
cpl_error_code moo_params_add_double(moo_params *params, cpl_parameterlist *list, const char *name, const char *alias, const char *def, double val)
Add double parameter to moons parameters list.
Definition: moo_params.c:155
cpl_error_code moo_params_add_compute_resp(moo_params *self, cpl_parameterlist *list)
Add default parameters for compute_resp.
Definition: moo_params.c:1888
moo_molecfit_model_params * moo_params_get_molecfit_model(const moo_params *self, const cpl_parameterlist *list)
Get molecfit model parameters from moons parameters list.
Definition: moo_params.c:1554
moo_nos_params * moo_params_get_nos(const moo_params *self, const cpl_parameterlist *list)
Get compute noise parameters from moons parameters list.
Definition: moo_params.c:1006
moo_hot_params * moo_params_get_hot(const moo_params *self, const cpl_parameterlist *list)
Get compute hot map parameters from moons parameters list.
Definition: moo_params.c:1038
cpl_error_code moo_params_add_keep_temp(moo_params *self, cpl_parameterlist *list)
Add default parameters for keep-temp.
Definition: moo_params.c:932
cpl_error_code moo_params_add_localise(moo_params *self, cpl_parameterlist *list)
Add default parameters for localisation.
Definition: moo_params.c:1410
cpl_error_code moo_params_add_wavesol(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_wavesol.
Definition: moo_params.c:2000
cpl_error_code moo_params_add_prepare(moo_params *self, cpl_parameterlist *list)
Add default parameters for prepare.
Definition: moo_params.c:667
cpl_error_code moo_params_add_model_flat(moo_params *self, cpl_parameterlist *list)
Add default parameters for model flat.
Definition: moo_params.c:1524
moo_rebin_params * moo_params_get_rebin(const moo_params *self, const cpl_parameterlist *list)
Get rebin parameters from moons parameters list.
Definition: moo_params.c:2866
cpl_error_code moo_params_add_coadd(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_coadd.
Definition: moo_params.c:2687
moo_params * moo_params_new(const char *pid, const char *recipe_id)
Create a new moo_params.
Definition: moo_params.c:62
moo_molecfit_model_params * moo_molecfit_model_params_new(void)
Create a new empty molecfit_model set of parameters.
Definition: moo_params.c:2261
moo_compute_snr_params * moo_params_get_compute_snr(const moo_params *self, const cpl_parameterlist *list)
Get compute_snr parameters from moons parameters list.
Definition: moo_params.c:3091
moo_hot_params * moo_hot_params_new(void)
Create a new empty compute hot map set of parameters.
Definition: moo_params.c:592
cpl_error_code moo_params_add_rebin(moo_params *self, cpl_parameterlist *list)
Add default parameters for moo_rebin.
Definition: moo_params.c:2152