30#include "moo_skycorr.h"
31#include "sc_skycorr.h"
32#include "hdrl_types.h"
33#include "moo_params.h"
45_moo_spectrum_to_table(hdrl_image *himg,
50 cpl_parameterlist *parlist)
52 cpl_table *result = NULL;
54 char errtxt[SC_MAXLEN];
57 cpl_ensure(himg != NULL, CPL_ERROR_NULL_INPUT, NULL);
59 int nrow = hdrl_image_get_size_x(himg);
61 result = cpl_table_new(nrow);
64 p = cpl_parameterlist_find(parlist,
"wlgtomicron");
65 double wlgtomicron = cpl_parameter_get_double(p);
67 cpl_table_new_column(result,
"lambda", CPL_TYPE_DOUBLE);
68 cpl_table_new_column(result,
"flux", CPL_TYPE_DOUBLE);
69 cpl_table_new_column(result,
"dflux", CPL_TYPE_DOUBLE);
70 cpl_table_new_column(result,
"mask", CPL_TYPE_INT);
71 cpl_table_new_column(result,
"weight", CPL_TYPE_DOUBLE);
73 for (
int i = 1; i <= nrow; i++) {
76 double wave = crval1 + (i - crpix1) * cd1_1;
77 wave = wave * wlgtomicron;
78 hdrl_value val = hdrl_image_get_pixel(himg, i, index, &rej);
80 int rejected = rej != 0 || isnan(val.data);
81 cpl_table_set(result,
"lambda", i - 1, wave);
82 cpl_table_set(result,
"flux", i - 1, val.data);
83 cpl_table_set(result,
"dflux", i - 1, val.error);
84 cpl_table_set(result,
"mask", i - 1, !rejected);
85 if (val.error <= 0. || rejected) {
86 cpl_table_set(result,
"weight", i - 1, 0.);
87 cpl_table_set(result,
"flux", i - 1, 0.);
88 cpl_table_set(result,
"dflux", i - 1, 0.);
91 cpl_table_set(result,
"weight", i - 1, 1. / val.error);
95 if (cpl_table_get_nrow(result) == 0) {
96 sprintf(errtxt,
"%s: cpl_table *spec", SC_ERROR_NDA_TXT);
97 cpl_error_set_message(cpl_func, SC_ERROR_NDA,
"%s", errtxt);
102 if (cpl_table_get_column_max(result,
"weight") == 0) {
103 sprintf(errtxt,
"%s: cpl_table *spec (all weights = 0)",
105 cpl_error_set_message(cpl_func, SC_ERROR_IOV,
"%s", errtxt);
110 meanlam = 0.5 * (cpl_table_get(result,
"lambda", 0, NULL) +
111 cpl_table_get(result,
"lambda",
112 cpl_table_get_nrow(result) - 1, NULL));
113 p = cpl_parameterlist_find(parlist,
"meanlam");
114 cpl_parameter_set_double(p, meanlam);
121__mo_sc_readspec_header(cpl_parameterlist *parlist, cpl_propertylist *header)
150 char key[SC_NKEY][SC_LENLINE + 1] = {
"",
"",
"" }, errtxt[SC_MAXLEN];
155 char keypar[SC_NKEY][SC_LENLINE + 1] = {
"date_key",
"time_key",
157 char valpar[SC_NKEY][SC_LENLINE + 1] = {
"date_val",
"time_val",
160 for (i = 0; i < SC_NKEY; i++) {
162 p = cpl_parameterlist_find(parlist, valpar[i]);
163 val = cpl_parameter_get_double(p);
166 p = cpl_parameterlist_find(parlist, keypar[i]);
167 strncpy(key[i], cpl_parameter_get_string(p), SC_LENLINE + 1);
173 prop = cpl_propertylist_get_property(header, key[i]);
175 if (prop == NULL && val == -1.) {
178 sprintf(errtxt,
"%s: (keyword %s not found)", SC_ERROR_UFS_TXT,
180 cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s", errtxt);
187 type = cpl_property_get_type(prop);
188 if (type == CPL_TYPE_DOUBLE) {
189 val = cpl_property_get_double(prop);
191 else if (type == CPL_TYPE_FLOAT) {
192 val = (double)cpl_property_get_float(prop);
194 else if (type == CPL_TYPE_INT) {
195 val = (double)cpl_property_get_int(prop);
199 sprintf(errtxt,
"%s: (non-numerical keyword %s)",
200 SC_ERROR_UFS_TXT, key[i]);
201 cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s", errtxt);
207 if (i == 0 && val > 3000.) {
208 p = cpl_parameterlist_find(parlist,
"mjd");
209 cpl_parameter_set_double(p, val);
210 val = sc_basic_mjd2fracyear(val);
214 p = cpl_parameterlist_find(parlist, valpar[i]);
215 cpl_parameter_set_double(p, val);
224 return CPL_ERROR_NONE;
228_moo_sc_lines_readlist(cpl_table *groups,
const char *linetabfile)
247 char errtxt[SC_MAXLEN], str[SC_LENLINE + 2];
248 cpl_boolean isoutrange = CPL_FALSE;
249 int nhead = 0, nrec = 0, feat = 0, syst = 0, agroup = 0, bgroup = 0;
250 int ncol0 = 0, ncolmin = 7, i = 0, ncol = 0;
251 double lam = 0., flux = 0., trans = 0.;
254 cpl_table_new_column(groups,
"lambda", CPL_TYPE_DOUBLE);
255 cpl_table_new_column(groups,
"flux", CPL_TYPE_DOUBLE);
256 cpl_table_new_column(groups,
"trans", CPL_TYPE_DOUBLE);
257 cpl_table_new_column(groups,
"feat", CPL_TYPE_INT);
258 cpl_table_new_column(groups,
"system", CPL_TYPE_INT);
259 cpl_table_new_column(groups,
"groupA", CPL_TYPE_INT);
260 cpl_table_new_column(groups,
"groupB", CPL_TYPE_INT);
262 if ((stream = fopen(linetabfile,
"r")) == NULL) {
263 sprintf(errtxt,
"%s: %s", SC_ERROR_FOF_TXT, linetabfile);
264 return cpl_error_set_message(cpl_func, SC_ERROR_FOF,
"%s", errtxt);
271 while (fgets(str, SC_LENLINE + 2, stream) != NULL) {
276 sprintf(errtxt,
"%s: %s (comment line in data part)",
277 SC_ERROR_UFS_TXT, linetabfile);
278 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s",
282 else if (isdigit(str[0]) || isspace(str[0]) || str[0] ==
'-') {
285 ncol0 = sscanf(str,
"%le %le %le %d %d %d %d", &lam, &flux,
286 &trans, &feat, &syst, &agroup, &bgroup);
289 sprintf(errtxt,
"%s: %s (empty line)", SC_ERROR_UFS_TXT,
291 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s",
294 else if (ncol0 < ncolmin) {
296 sprintf(errtxt,
"%s: %s (too low number of columns)",
297 SC_ERROR_UFS_TXT, linetabfile);
298 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s",
306 sprintf(errtxt,
"%s: %s (unexpected first character at line)",
307 SC_ERROR_UFS_TXT, linetabfile);
308 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s", errtxt);
316 sprintf(errtxt,
"%s: %s (no data)", SC_ERROR_UFS_TXT, linetabfile);
317 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s", errtxt);
321 cpl_table_set_size(groups, nrec);
324 for (i = 0; i < nhead; i++) {
325 if (fgets(str, SC_LENLINE + 2, stream)) {
331 for (i = 0; i < nrec; i++) {
332 ncol = fscanf(stream,
"%le %le %le %d %d %d %d", &lam, &flux, &trans,
333 &feat, &syst, &agroup, &bgroup);
336 cpl_table_set_size(groups, 0);
338 sprintf(errtxt,
"%s: %s (unexpected number of values at line)",
339 SC_ERROR_UFS_TXT, linetabfile);
340 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s", errtxt);
343 cpl_table_set(groups,
"lambda", i, lam);
344 cpl_table_set(groups,
"flux", i, flux);
345 cpl_table_set(groups,
"trans", i, trans);
346 cpl_table_set(groups,
"feat", i, feat);
347 cpl_table_set(groups,
"system", i, syst);
348 cpl_table_set(groups,
"groupA", i, agroup);
349 if (syst > 0 && bgroup == 0) {
351 cpl_table_set(groups,
"groupB", i, -syst);
354 cpl_table_set(groups,
"groupB", i, bgroup);
359 isoutrange = CPL_TRUE;
364 isoutrange = CPL_TRUE;
369 isoutrange = CPL_TRUE;
374 isoutrange = CPL_TRUE;
379 isoutrange = CPL_TRUE;
384 isoutrange = CPL_TRUE;
390 if (isoutrange == CPL_TRUE) {
391 cpl_msg_warning(cpl_func,
392 "%s: Input value(s) out of range -> "
393 "Take lowest/highest allowed value(s)",
397 return CPL_ERROR_NONE;
401_moo_sc_lines_readsolflux(cpl_parameterlist *parlist,
const char *soldatfile)
425 char soldatsource[SC_MAXLEN];
426 char errtxt[SC_MAXLEN], str[SC_LENLINE + 2];
427 int year = 0, month = 0, i = 0, y = 0, m = 0, ncol = 0, ncolmin = 5;
428 double obsflux = 0., adjflux = 0., absflux = 0., solflux = -1.;
431 p = cpl_parameterlist_find(parlist,
"year");
432 year = cpl_parameter_get_int(p);
433 p = cpl_parameterlist_find(parlist,
"month");
434 month = cpl_parameter_get_int(p);
437 p = cpl_parameterlist_find(parlist,
"solflux");
438 cpl_parameter_set_double(p, -1.);
441 p = cpl_parameterlist_find(parlist,
"soldatsource");
442 strncpy(soldatsource, cpl_parameter_get_string(p), SC_MAXLEN);
445 if ((strcmp(soldatsource,
"LOCAL") != 0 &&
446 strcmp(soldatsource,
"WEB") != 0) ||
447 (strcmp(soldatsource,
"WEB") == 0 &&
448 ((year == 1947 && month == 1) || year < 1947))) {
449 p = cpl_parameterlist_find(parlist,
"solflux");
450 cpl_parameter_set_double(p, 130.);
453 return CPL_ERROR_NONE;
461 if ((stream = fopen(soldatfile,
"r")) == NULL) {
462 sprintf(errtxt,
"%s: %s", SC_ERROR_FOF_TXT, soldatfile);
463 return cpl_error_set_message(cpl_func, SC_ERROR_FOF,
"%s", errtxt);
467 for (i = 0; i < 2; i++) {
468 if (fgets(str, SC_LENLINE + 2, stream)) {
474 while (fgets(str, SC_LENLINE + 2, stream) != NULL) {
475 if (isdigit(str[0]) || isspace(str[0])) {
477 ncol = sscanf(str,
"%d %d %le %le %le", &y, &m, &obsflux, &adjflux,
483 sprintf(errtxt,
"%s: %s (empty line)", SC_ERROR_UFS_TXT,
485 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s",
488 else if (ncol < ncolmin) {
490 sprintf(errtxt,
"%s: %s (too low number of columns)",
491 SC_ERROR_UFS_TXT, soldatfile);
492 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s",
497 if (y < 1947 || m < 1 || m > 12 || obsflux < 0.) {
499 sprintf(errtxt,
"%s: %s (invalid value(s))", SC_ERROR_UFS_TXT,
501 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s",
506 if (y == year && m == month) {
514 sprintf(errtxt,
"%s: %s (unexpected first character at line)",
515 SC_ERROR_UFS_TXT, soldatfile);
516 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s", errtxt);
524 if (strcmp(soldatsource,
"WEB") == 0) {
525 if ((month != 1 && m < month - 1 && y == year) ||
526 (month != 1 && y < year) ||
527 (month == 1 && m < 12 && y == year - 1) ||
528 (month == 1 && y < year - 1)) {
530 cpl_msg_warning(cpl_func,
"Solar radio fluxes until %d/%d only", m,
533 if (obsflux != solflux) {
539 p = cpl_parameterlist_find(parlist,
"solflux");
540 cpl_parameter_set_double(p, floor(solflux + 0.5));
542 return CPL_ERROR_NONE;
546_moo_sc_lines_getmodelbins(cpl_parameterlist *parlist,
547 const cpl_frame *solflux_frame)
573 cpl_error_code status = CPL_ERROR_NONE;
574 cpl_parameter *p, *q;
575 char errtxt[SC_MAXLEN];
576 int year = 0, month = 0, day = 0, hh = 0, mm = 0;
577 int season = 0, timebin = 0;
578 double ss = 0., fracyear = 0., ut = 0., nlen = 0.;
579 double tlim1 = 0., tlim2 = 0.;
580 double nstart[6] = { 0.98, 0.48, -0.44, -0.57, -0.23, 0.29 };
581 double nend[6] = { 8.50, 9.29, 9.77, 10.07, 9.61, 8.60 };
584 p = cpl_parameterlist_find(parlist,
"date_val");
585 fracyear = cpl_parameter_get_double(p);
586 p = cpl_parameterlist_find(parlist,
"time_val");
587 ut = cpl_parameter_get_double(p) / 3600.;
590 if (fracyear < 0 || ut < 0) {
592 "%s: cpl_parameterlist *parlist (invalid date_val "
595 return cpl_error_set_message(cpl_func, SC_ERROR_IOV,
"%s", errtxt);
599 sc_basic_fracyear2date(&year, &month, &day, &hh, &mm, &ss, &fracyear);
604 season = floor((
float)month / 2) + 1;
611 nlen = nend[season - 1] - nstart[season - 1];
612 tlim1 = nstart[season - 1] + nlen / 3;
613 tlim2 = nend[season - 1] - nlen / 3;
617 else if (ut >= tlim2) {
625 p = cpl_parameter_new_value(
"season", CPL_TYPE_INT,
"",
"", season);
626 cpl_parameterlist_append(parlist, p);
627 p = cpl_parameter_new_value(
"timebin", CPL_TYPE_INT,
"",
"", timebin);
628 cpl_parameterlist_append(parlist, p);
631 p = cpl_parameter_new_value(
"year", CPL_TYPE_INT,
"",
"", year);
632 cpl_parameterlist_append(parlist, p);
633 p = cpl_parameter_new_value(
"month", CPL_TYPE_INT,
"",
"", month);
634 cpl_parameterlist_append(parlist, p);
637 q = cpl_parameterlist_find(parlist,
"solflux");
639 if (cpl_parameter_get_double(q) >= 0) {
642 return CPL_ERROR_NONE;
646 p = cpl_parameterlist_find(parlist,
"soldatsource");
647 cpl_parameter_set_string(p,
"LOCAL");
648 const char *solflux_filename = cpl_frame_get_filename(solflux_frame);
649 status = _moo_sc_lines_readsolflux(parlist, solflux_filename);
652 q = cpl_parameterlist_find(parlist,
"solflux");
655 if (cpl_parameter_get_double(q) < 0) {
656 cpl_parameter_set_string(p,
"NONE");
657 _moo_sc_lines_readsolflux(parlist, NULL);
661 q = cpl_parameterlist_find(parlist,
"solflux");
668_moo_sc_lines_readvarpar(cpl_array *varpar,
669 cpl_parameterlist *parlist,
670 const char *vardatfile)
695 scpar x[SC_MAXPAR], m[SC_MAXPAR];
696 char errtxt[SC_MAXLEN];
697 int n = SC_MAXPAR, nfeat = 0, nseason = 0, ntime = 0, season = 0;
698 int timebin = 0, i = 0, j = 0;
699 double alt = 0., solflux = 0., height = 0., scale = 0., cons = 0.;
700 double slope = 0., mean = 0., z = 0., cvr = 0., csol = 0.;
702 if ((stream = fopen(vardatfile,
"r")) == NULL) {
703 sprintf(errtxt,
"%s: %s", SC_ERROR_FOF_TXT, vardatfile);
704 return cpl_error_set_message(cpl_func, SC_ERROR_FOF,
"%s", errtxt);
713 sc_basic_readline(stream, x, &n);
715 sc_basic_readline(stream, x, &n);
722 if (nfeat == 0 || nseason == 0 || ntime == 0) {
724 sprintf(errtxt,
"%s: %s (nfeat == 0 || nseason == 0 || ntime == 0)",
725 SC_ERROR_UFS_TXT, vardatfile);
726 return cpl_error_set_message(cpl_func, SC_ERROR_UFS,
"%s", errtxt);
730 p = cpl_parameterlist_find(parlist,
"telalt_val");
731 alt = cpl_parameter_get_double(p);
732 p = cpl_parameterlist_find(parlist,
"solflux");
733 solflux = cpl_parameter_get_double(p);
734 p = cpl_parameterlist_find(parlist,
"season");
735 season = cpl_parameter_get_int(p);
736 p = cpl_parameterlist_find(parlist,
"timebin");
737 timebin = cpl_parameter_get_int(p);
738 if (alt < 0. || alt > 90. || solflux < 0. || season < 0 ||
739 season > nseason || timebin < 0 || timebin > ntime) {
742 "%s: cpl_parameterlist *parlist (telalt, solflux, "
743 "season, and/or timebin out of range) ",
745 return cpl_error_set_message(cpl_func, SC_ERROR_IOV,
"%s", errtxt);
749 cpl_array_set_size(varpar, nfeat);
754 for (i = 0; i < nfeat; i++) {
756 sc_basic_readline(stream, x, &n);
757 sc_basic_readline(stream, x, &n);
758 sc_basic_readline(stream, x, &n);
760 sc_basic_readline(stream, x, &n);
762 sc_basic_readline(stream, x, &n);
767 for (j = 0; j < ntime + 1; j++) {
768 sc_basic_readline(stream, m, &n);
775 for (j = 0; j < ntime + 1; j++) {
776 sc_basic_readline(stream, m, &n);
781 z = (90. - alt) * CPL_MATH_RAD_DEG;
782 cvr = 1 / sqrt(1 - pow((SC_ERAD / (SC_ERAD + height)) * sin(z), 2));
785 csol = slope * solflux + cons;
788 cpl_array_set(varpar, i, scale * cvr * csol * mean);
794 return CPL_ERROR_NONE;
798_moo_sc_lines(cpl_table *groups,
799 cpl_parameterlist *parlist,
800 const cpl_frame *solflux_frame,
801 const cpl_frame *airglow_group_frame,
802 const cpl_frame *airglow_var_frame)
824 cpl_error_code status = CPL_ERROR_NONE;
827 const char *airglow_group_filename =
828 cpl_frame_get_filename(airglow_group_frame);
829 const char *airglow_var_filename =
830 cpl_frame_get_filename(airglow_var_frame);
833 if ((status = _moo_sc_lines_readlist(groups, airglow_group_filename)) !=
838 if ((status = _moo_sc_lines_getmodelbins(parlist, solflux_frame)) !=
844 varpar = cpl_array_new(0, CPL_TYPE_DOUBLE);
846 _moo_sc_lines_readvarpar(varpar, parlist, airglow_var_filename)) !=
848 cpl_array_delete(varpar);
855 sc_lines_scalelines(groups, varpar, parlist);
859 if ((status = sc_lines_vactoair(groups, parlist)) != CPL_ERROR_NONE) {
860 cpl_array_delete(varpar);
865 cpl_array_delete(varpar);
867 return CPL_ERROR_NONE;
871_moo_table_to_spectrum(cpl_table *scispec,
890 cpl_ensure_code(himg != NULL, CPL_ERROR_NULL_INPUT);
891 cpl_ensure_code(sky != NULL, CPL_ERROR_NULL_INPUT);
893 int nrow = hdrl_image_get_size_x(himg);
895 for (
int i = 1; i <= nrow; i++) {
896 int mask = cpl_table_get_int(scispec,
"mask", i - 1, NULL);
899 double sky_flux = cpl_table_get_double(scispec,
"mflux", i - 1, NULL);
900 cpl_image_set(sky, i, index, sky_flux);
903 flux = cpl_table_get_double(scispec,
"scflux", i - 1, NULL);
904 err = cpl_table_get_double(scispec,
"scdflux", i - 1, NULL);
909 hdrl_image_set_pixel(himg, i, index, val);
912 return CPL_ERROR_NONE;
946 cpl_propertylist *header,
947 const cpl_frame *solflux_frame,
948 const cpl_frame *airglow_group_frame,
949 const cpl_frame *airglow_var_frame,
950 moo_skycorr_params *params,
954 cpl_error_code status = CPL_ERROR_NONE;
955 char errtxt[SC_MAXLEN];
956 cpl_table *scispec = NULL;
957 cpl_table *skyspec = NULL;
958 cpl_table *groups = NULL;
959 cpl_table *skylinetab = NULL;
960 cpl_table *scilinetab = NULL;
961 cpl_parameterlist *parlist = NULL;
962 cpl_parameter *p = NULL;
964 cpl_ensure_code(header != NULL, CPL_ERROR_NULL_INPUT);
965 cpl_ensure_code(airglow_var_frame != NULL, CPL_ERROR_NULL_INPUT);
966 double ltol = params->ltol;
967 double min_line_dist_fac = params->min_line_dist_fac;
968 double min_line_flux_fac = params->min_line_flux_fac;
970 double fluxlim = params->fluxlim;
972 double ftol = params->ftol;
973 double xtol = params->xtol;
974 double wtol = params->wtol;
975 int cheby_max = params->cheby_max;
976 int cheby_min = params->cheby_min;
977 double cheby_const = params->cheby_const;
978 int rebintype = params->rebintype;
979 double weightlim = params->weightlim;
980 double siglim = params->siglim;
981 double fitlim = params->fitlim;
983 cpl_msg_info(
"test",
"call SC with indextarg %d indexrbn %d", indextarg,
985 parlist = cpl_parameterlist_new();
987 p = cpl_parameter_new_value(
"col_dflux", CPL_TYPE_STRING,
"",
"",
"dflux");
988 cpl_parameterlist_append(parlist, p);
990 p = cpl_parameter_new_value(
"vac_air", CPL_TYPE_STRING,
"",
"",
"air");
991 cpl_parameterlist_append(parlist, p);
992 p = cpl_parameter_new_value(
"wlgtomicron", CPL_TYPE_DOUBLE,
"",
"", 1e-03);
993 cpl_parameterlist_append(parlist, p);
994 p = cpl_parameter_new_value(
"date_key", CPL_TYPE_STRING,
"",
"",
"MJD-OBS");
995 cpl_parameterlist_append(parlist, p);
996 p = cpl_parameter_new_value(
"date_val", CPL_TYPE_DOUBLE,
"",
"", -1.);
997 cpl_parameterlist_append(parlist, p);
998 p = cpl_parameter_new_value(
"mjd", CPL_TYPE_DOUBLE,
"",
"", -1.);
999 cpl_parameterlist_append(parlist, p);
1000 p = cpl_parameter_new_value(
"time_key", CPL_TYPE_STRING,
"",
"",
1002 cpl_parameterlist_append(parlist, p);
1003 p = cpl_parameter_new_value(
"time_val", CPL_TYPE_DOUBLE,
"",
"", -1.);
1004 cpl_parameterlist_append(parlist, p);
1005 p = cpl_parameter_new_value(
"telalt_key", CPL_TYPE_STRING,
"",
"",
1007 cpl_parameterlist_append(parlist, p);
1008 p = cpl_parameter_new_value(
"telalt_val", CPL_TYPE_DOUBLE,
"",
"", -1.);
1009 cpl_parameterlist_append(parlist, p);
1012 p = cpl_parameter_new_value(
"linetabname", CPL_TYPE_STRING,
"",
"",
1014 cpl_parameterlist_append(parlist, p);
1015 p = cpl_parameter_new_value(
"vardatname", CPL_TYPE_STRING,
"",
"",
1017 cpl_parameterlist_append(parlist, p);
1018 p = cpl_parameter_new_value(
1019 "soldaturl", CPL_TYPE_STRING,
"",
"",
1020 "ftp.geolab.nrcan.gc.ca/data/solar_flux/monthly_averages");
1021 cpl_parameterlist_append(parlist, p);
1022 p = cpl_parameter_new_value(
"soldatname", CPL_TYPE_STRING,
"",
"",
1023 "solflux_monthly_average.txt");
1024 cpl_parameterlist_append(parlist, p);
1025 p = cpl_parameter_new_value(
"soldatsource", CPL_TYPE_STRING,
"",
"",
1027 cpl_parameterlist_append(parlist, p);
1028 p = cpl_parameter_new_value(
"solflux", CPL_TYPE_DOUBLE,
"",
"", -1.);
1029 cpl_parameterlist_append(parlist, p);
1032 p = cpl_parameter_new_value(
"fwhm", CPL_TYPE_DOUBLE,
"",
"", MOO_SC_FWHM);
1033 cpl_parameterlist_append(parlist, p);
1034 p = cpl_parameter_new_range(
"varfwhm", CPL_TYPE_INT,
"",
"", MOO_SC_VARFWHM,
1036 cpl_parameterlist_append(parlist, p);
1037 p = cpl_parameter_new_value(
"meanlam", CPL_TYPE_DOUBLE,
"",
"", 1.);
1038 cpl_parameterlist_append(parlist, p);
1039 p = cpl_parameter_new_value(
"ltol", CPL_TYPE_DOUBLE,
"",
"", ltol);
1040 cpl_parameterlist_append(parlist, p);
1041 p = cpl_parameter_new_value(
"min_line_dist_fac", CPL_TYPE_DOUBLE,
"",
"",
1043 cpl_parameterlist_append(parlist, p);
1044 p = cpl_parameter_new_value(
"min_line_flux_fac", CPL_TYPE_DOUBLE,
"",
"",
1046 cpl_parameterlist_append(parlist, p);
1047 p = cpl_parameter_new_value(
"fluxlim", CPL_TYPE_DOUBLE,
"",
"", fluxlim);
1048 cpl_parameterlist_append(parlist, p);
1049 p = cpl_parameter_new_value(
"iteration", CPL_TYPE_INT,
"",
"", 0);
1050 cpl_parameterlist_append(parlist, p);
1053 p = cpl_parameter_new_value(
"ftol", CPL_TYPE_DOUBLE,
"",
"", ftol);
1054 cpl_parameterlist_append(parlist, p);
1055 p = cpl_parameter_new_value(
"xtol", CPL_TYPE_DOUBLE,
"",
"", xtol);
1056 cpl_parameterlist_append(parlist, p);
1057 p = cpl_parameter_new_value(
"wtol", CPL_TYPE_DOUBLE,
"",
"", wtol);
1058 cpl_parameterlist_append(parlist, p);
1059 p = cpl_parameter_new_value(
"cheby_max", CPL_TYPE_INT,
"",
"", cheby_max);
1060 cpl_parameterlist_append(parlist, p);
1061 p = cpl_parameter_new_value(
"cheby_min", CPL_TYPE_INT,
"",
"", cheby_min);
1062 cpl_parameterlist_append(parlist, p);
1063 p = cpl_parameter_new_value(
"cheby_const", CPL_TYPE_DOUBLE,
"",
"",
1065 cpl_parameterlist_append(parlist, p);
1066 p = cpl_parameter_new_value(
"rebintype", CPL_TYPE_INT,
"",
"", rebintype);
1067 cpl_parameterlist_append(parlist, p);
1068 p = cpl_parameter_new_value(
"weightlim", CPL_TYPE_DOUBLE,
"",
"",
1070 cpl_parameterlist_append(parlist, p);
1071 p = cpl_parameter_new_value(
"siglim", CPL_TYPE_DOUBLE,
"",
"", siglim);
1072 cpl_parameterlist_append(parlist, p);
1073 p = cpl_parameter_new_value(
"fitlim", CPL_TYPE_DOUBLE,
"",
"", fitlim);
1074 cpl_parameterlist_append(parlist, p);
1077 p = cpl_parameter_new_value(
"plot_type", CPL_TYPE_STRING,
"",
"",
"N");
1078 cpl_parameterlist_append(parlist, p);
1081 _moo_spectrum_to_table(rbn, indexrbn, crpix1, crval1, cd1_1, parlist);
1083 skyspec = _moo_spectrum_to_table(sky, 1, crpix1, crval1, cd1_1, parlist);
1085 moo_try_check(status = __mo_sc_readspec_header(parlist, header),
1086 "error initialising SKYCORR");
1087 groups = cpl_table_new(0);
1088 _moo_sc_lines(groups, parlist, solflux_frame, airglow_group_frame,
1091 scilinetab = cpl_table_new(0);
1092 sc_specdiss_init_linetab(scilinetab);
1098 sc_skycorr_subcont(scispec, scilinetab, parlist, groups);
1100 if ((status = cpl_error_get_code()) != CPL_ERROR_NONE) {
1102 "%s: error while separating lines and continuum of "
1105 cpl_error_set_message(cpl_func, SC_ERROR_EIS,
"%s", errtxt);
1109 skylinetab = cpl_table_new(0);
1110 sc_specdiss_init_linetab(skylinetab);
1112 sc_skycorr_subcont(skyspec, skylinetab, parlist, groups);
1114 if ((status = cpl_error_get_code()) != CPL_ERROR_NONE) {
1116 "%s: error while separating lines and continuum of "
1119 cpl_error_set_message(cpl_func, SC_ERROR_EIS,
"%s", errtxt);
1126 sc_skycorr_fit(scispec, skyspec, groups, parlist);
1130 sc_skycorr_subsky(scispec);
1132#if MOO_DEBUG_SKYCORR
1134 char *namesci = cpl_sprintf(
"SKYCORR_SCI_%d.fits", indextarg);
1135 cpl_table_save(scispec, header, NULL, namesci, CPL_IO_CREATE);
1138 char *namesky = cpl_sprintf(
"SKYCORR_SKY_%d.fits", indextarg);
1139 cpl_table_save(skyspec, header, NULL, namesky, CPL_IO_CREATE);
1143 _moo_table_to_spectrum(scispec, sci, sci_sky, indextarg);
1146 cpl_table_delete(skylinetab);
1147 cpl_table_delete(scilinetab);
1148 cpl_table_delete(scispec);
1149 cpl_table_delete(skyspec);
1150 cpl_table_delete(groups);
1151 cpl_parameterlist_delete(parlist);
cpl_error_code moo_skycorr(hdrl_image *rbn, hdrl_image *sky, int indextarg, int indexrbn, double crpix1, double crval1, double cd1_1, cpl_propertylist *header, const cpl_frame *solflux_frame, const cpl_frame *airglow_group_frame, const cpl_frame *airglow_var_frame, moo_skycorr_params *params, hdrl_image *sci, cpl_image *sci_sky)
call the skycorr subtract sky function