53 const double* xbin, cpl_table* tab,
double* local_median,
54 double* local_stdev,
int* group_nbin,
double* group_mean,
65 for (
int i = 0; i < nbins; i++) {
66 j_lo = (0 > (i - local_sz / 2)) ? 0 : (i - local_sz / 2);
67 j_hi = ((j_lo + local_sz) < (nbins - 1)) ?
68 (j_lo + local_sz) : (nbins - 1);
73 cpl_table_and_selected_double(tab,
"WAVE", CPL_GREATER_THAN, wmin);
74 cpl_table_and_selected_double(tab,
"WAVE", CPL_LESS_THAN, wmax);
75 xtab = cpl_table_extract_selected(tab);
76 local_median[i] = cpl_table_get_column_median(xtab,
"FLUX");
77 local_stdev[i] = cpl_table_get_column_stdev(xtab,
"FLUX");
78 cpl_table_select_all(tab);
81 ilo = ((i - nside) > 0) ? (i - nside) : 0;
82 ihi = ((i + nside) < (nbins - 1)) ? (i + nside) : nbins - 1;
86 cpl_table_and_selected_double(tab,
"WAVE", CPL_GREATER_THAN, wmin);
87 cpl_table_and_selected_double(tab,
"WAVE", CPL_LESS_THAN, wmax);
88 xtab = cpl_table_extract_selected(tab);
89 group_nbin[i] = ihi - ilo + 1;
90 group_mean[i] = cpl_table_get_column_mean(xtab,
"FLUX");
91 group_median[i] = cpl_table_get_column_median(xtab,
"FLUX");
94 group_nbin[i],group_mean[i],group_median[i]);
97 cpl_table_select_all(tab);
100 return cpl_error_get_code();
105 const double bin, cpl_table* tab,
106 const int* h,
double* xbin,
double* ybin,
113 for (
int i = 0; i < nbins; i++) {
114 xbin[i] = wmin + bin * (i + 0.5);
115 cpl_table_and_selected_double(tab,
"WAVE", CPL_GREATER_THAN,
117 cpl_table_and_selected_double(tab,
"WAVE", CPL_LESS_THAN,
119 xtab = cpl_table_extract_selected(tab);
120 ybin[i] = cpl_table_get_column_median(xtab,
"FLUX");
122 fct = (h[i] > 0) ? h[i] : 1;
124 ysig[i] = cpl_table_get_column_stdev(xtab,
"FLUX");
130 ysig[i] /= sqrt(fct);
138 cpl_table_select_all(tab);
141 return cpl_error_get_code();
146 const double intermed_bk_space,
const double* local_median,
147 const double* local_stdev,
const int* group_nbin,
148 const double* group_mean,
const double* group_median,
149 int* pltype,
double* bk_space_list)
152 double* em_lines_thresh = cpl_calloc(nbins,
sizeof(
double));
153 for (
int i = 0; i < nbins; i++) {
154 em_lines_thresh[i] = local_median[i]
155 + 3. * local_stdev[i] / sqrt(group_nbin[i]);
159 for (
int i = 0; i < nbins; i++) {
160 if (((group_mean[i] >= em_lines_thresh[i])
161 && (group_median[i] >= local_median[i] + local_stdev[i]))) {
168 if (n_em_lines != 0) {
169 for (
int j = 0; j < nbins; j++) {
172 if (pltype[j] == 1) {
174 int ilo = ((i - nside) > 0) ? (i - nside) : 0;
175 int ihi = ((i + nside) < (nbins - 1)) ? (i + nside) : nbins - 1;
176 bk_space_list[i] = min_bk_space;
177 for (
int k = ilo; k < ihi; k++) {
179 (intermed_bk_space < bk_space_list[k]) ?
186 return em_lines_thresh;
191 const double intermed_bk_space,
const double* local_median,
192 const double* local_stdev,
const int* group_nbin,
193 const double* group_mean,
const double* group_median,
194 int* pltype,
double* bk_space_list)
197 double* abs_lines_thresh = cpl_calloc(nbins,
sizeof(
double));
198 for (
int i = 0; i < nbins; i++) {
199 abs_lines_thresh[i] = local_median[i]
200 - 3. * local_stdev[i] / sqrt(group_nbin[i]);
204 for (
int i = 0; i < nbins; i++) {
205 if (((group_mean[i] <= abs_lines_thresh[i])
206 && (group_median[i] <= local_median[i] + local_stdev[i]))) {
212 if (n_abs_lines != 0) {
213 for (
int j = 0; j < nbins; j++) {
216 if (pltype[j] == 2) {
218 int ilo = ((i - nside) > 0) ? (i - nside) : 0;
219 int ihi = ((i + nside) < (nbins - 1)) ? (i + nside) : nbins - 1;
220 bk_space_list[i] = min_bk_space;
221 for (
int k = ilo; k < ihi; k++) {
223 (intermed_bk_space < bk_space_list[k]) ?
230 return abs_lines_thresh;
235 const double min_bk_space,
236 const double* ybin,
const double* ysig,
237 int* pltype,
double* bk_space_list)
249 double* ker1 = cpl_calloc(3,
sizeof(
double));
253 double* d2y = cpl_calloc(nbins,
sizeof(
double));
254 memcpy(d2y, ybin, nbins *
sizeof(
double));
255 for (
int i = 1; i < nbins - 1; i++) {
256 d2y[i] = ybin[i - 1] * ker1[0] + ybin[i] * ker1[1]
257 + ybin[i + 1] * ker1[1];
260 double* d2y_var = cpl_calloc(nbins,
sizeof(
double));
261 double* yvar = cpl_calloc(nbins,
sizeof(
double));
262 memcpy(yvar, ysig, nbins *
sizeof(
double));
263 for (
int i = 1; i < nbins - 1; i++) {
266 double* ker2 = cpl_calloc(3,
sizeof(
double));
270 for (
int i = 1; i < nbins - 1; i++) {
271 d2y_var[i] = yvar[i - 1] * ker2[0] + yvar[i] * ker2[1]
272 + yvar[i + 1] * ker2[1];
276 double* d2y_sig = cpl_calloc(nbins,
sizeof(
double));
277 for (
int i = 1; i < nbins - 1; i++) {
278 d2y_sig[i] = sqrt(d2y_var[i]);
282 int n_slope_change = 0;
283 for (
int i = 0; i < nbins; i++) {
284 if (fabs(d2y[i]) >= (4 * d2y_sig[i]) && pltype[i] == 0) {
292 if (n_slope_change != 0) {
293 for (
int j = 0; j < nbins; j++) {
296 if (pltype[j] == 3) {
298 int ilo = ((i - nside) > 0) ? (i - nside) : 0;
299 int ihi = ((i + nside) < (nbins - 1)) ? (i + nside) : nbins - 1;
301 for (
int k = ilo; k < ihi; k++) {
303 (min_bk_space < bk_space_list[k]) ?
313 return cpl_error_get_code();
319 double* wave = cpl_table_get_data_double(stab,
"WAVE");
320 double* flux = cpl_table_get_data_double(stab,
"FLUX");
321 double wmin = cpl_table_get_column_min(stab,
"WAVE");
322 double wmax = cpl_table_get_column_max(stab,
"WAVE");
323 int nrow=cpl_table_get_nrow(stab);
330 double dispersion = 0.049439349;
331 double bin = dispersion;
332 int nbins = (wmax - wmin) / bin+1;
336 cpl_table* histogram =
xsh_histogram(stab,
"WAVE", nbins, wmin, wmax);
337 cpl_table_save(histogram, NULL, NULL,
"histogram.fits", CPL_IO_DEFAULT);
338 double* xbin = cpl_calloc(nbins,
sizeof(
double));
339 double* ybin = cpl_calloc(nbins,
sizeof(
double));
340 double* ysig = cpl_calloc(nbins,
sizeof(
double));
341 int* h = cpl_table_get_data_int(histogram,
"HY");
343 xsh_msg_warning(
"xbin=%16.14g,%16.14g,%16.14g,%16.14g,%16.14g",xbin[0],xbin[1],xbin[2],xbin[nbins-2],xbin[nbins-1]);
344 xsh_msg_warning(
"ybin=%16.14g,%16.14g,%16.14g,%16.14g,%16.14g",ybin[0],ybin[1],ybin[2],ybin[nbins-2],ybin[nbins-1]);
345 xsh_msg_warning(
"h=%d,%d,%d,%d,%d,%d,%d",h[0],h[1],h[2],h[3],h[4],h[nbins-2],h[nbins-1]);
350 int local_sz = nbins / 10.;
353 int bin_per_group = 2 * nside + 1;
354 int* group_nbin = cpl_calloc(nbins,
sizeof(
int));
355 double* group_mean = cpl_calloc(nbins,
sizeof(
double));
356 double* group_median = cpl_calloc(nbins,
sizeof(
double));
357 double* local_median = cpl_calloc(nbins,
sizeof(
double));
358 double* local_stdev = cpl_calloc(nbins,
sizeof(
double));
359 double* bk_space_list = (
double*) cpl_calloc(nbins,
sizeof(
double));
361 local_stdev, group_nbin, group_mean, group_median);
364 cpl_table* lines_tab=cpl_table_new(nbins);
365 cpl_table_wrap_double(lines_tab,group_mean,
"YBIN");
366 cpl_table_wrap_int(lines_tab,group_nbin,
"GNBIN");
367 cpl_table_wrap_double(lines_tab,group_mean,
"GMEDIAN");
368 cpl_table_wrap_double(lines_tab,group_mean,
"GMEAN");
369 cpl_table_wrap_double(lines_tab,local_median,
"LMEDIAN");
370 cpl_table_wrap_double(lines_tab,local_stdev,
"LSTDEV");
371 cpl_table_wrap_double(lines_tab,bk_space_list,
"BKSPACE");
372 cpl_table_new_column(lines_tab,
"LTYPE",CPL_TYPE_INT);
374 cpl_table_fill_column_window_int(lines_tab,
"LTYPE",0,nbins,0);
375 int* pltype=cpl_table_get_data_int(lines_tab,
"LTYPE");
376 double* pbk_space_list=cpl_table_get_data_double(lines_tab,
"BKSPACE");
378 double bk_space = 0.015262156;
379 double min_bk_space = 0.0025436927;
380 bk_space = (bk_space > min_bk_space) ? bk_space : min_bk_space;
384 double intermed_bk_space = min_bk_space + 0.3 * (bk_space - min_bk_space);
388 for(
int i=0;i<nbins; i++) {
389 pbk_space_list[i] = bk_space;
395 intermed_bk_space, local_median, local_stdev, group_nbin,
396 group_mean, group_median, pltype, pbk_space_list);
397 cpl_table_save(lines_tab,NULL,NULL,
"lines_tab.fits",CPL_IO_DEFAULT);
401 intermed_bk_space, local_median, local_stdev, group_nbin,
402 group_mean, group_median, pltype, pbk_space_list);
417 pltype, pbk_space_list);
421 int region_nside = 10;
422 cpl_table* xtab=NULL;
423 for (
int i = 0; i < nbins; i++) {
425 int ilo = ((i - region_nside) > 0) ? (i - region_nside) : 0;
426 int ihi = ((i + region_nside) < (nbins - 1)) ? (i + region_nside) : (nbins - 1);
431 cpl_table_dump_structure(lines_tab,stdout);
432 cpl_table_and_selected_double(lines_tab,
"WAVE", CPL_GREATER_THAN, wmin);
434 cpl_table_and_selected_double(lines_tab,
"WAVE", CPL_LESS_THAN, wmax);
436 xtab = cpl_table_extract_selected(lines_tab);
438 double* region_bkspace = NULL;
439 int nrow = cpl_table_get_nrow(xtab) ;
440 double* pregion_bkspace = cpl_table_get_data_double(lines_tab,
"BKSPACE");
442 double* pregion_ybin = cpl_table_get_data_double(lines_tab,
"YBIN");
444 for (
int j = 0; j< nrow; j++ ) {
447 if ( pregion_bkspace[j] == bk_space ) {
451 cpl_table_and_selected_int(xtab,
"LTYPE",CPL_EQUAL_TO,4);
452 cpl_table* stab=cpl_table_extract_selected(xtab);
453 if(n_max >= region_nside) {
455 double stdev_bin = cpl_table_get_column_stdev(stab,
"YBIN");
456 double stdev_group = cpl_table_get_column_stdev(stab,
"GMEAN");
457 if( stdev_bin/stdev_group <= 0.7 * sqrt (bin_per_group) ) {
461 for (
int k = ilo; k< ihi; k++ ) {
463 pbk_space_list[k] = ( (pregion_bkspace[k] < intermed_bk_space) )? pregion_bkspace[k] : intermed_bk_space;
468 cpl_table_select_all(lines_tab);
491 cpl_table_unwrap(lines_tab,
"YBIN");
492 cpl_table_unwrap(lines_tab,
"GNBIN");
493 cpl_table_unwrap(lines_tab,
"GMEDIAN");
494 cpl_table_unwrap(lines_tab,
"GMEAN");
495 cpl_table_unwrap(lines_tab,
"LMEDIAN");
496 cpl_table_unwrap(lines_tab,
"LSTDEV");
497 cpl_table_unwrap(lines_tab,
"BKSPACE");
504 cpl_free(group_nbin);
505 cpl_free(group_mean);
506 cpl_free(group_median);
507 cpl_free(local_median);
508 cpl_free(local_stdev);
509 cpl_free(bk_space_list);
510 cpl_free(em_lines_thresh);
511 cpl_free(abs_lines_thresh);
516 return cpl_error_get_code();
529int main(
int argc,
char **argv)
534 cpl_test_init(PACKAGE_BUGREPORT,CPL_MSG_WARNING);
543 cpl_table* tab=cpl_table_load(fname,1,0);
546 return cpl_test_end(0);
int main()
Unit test of xsh_bspline_interpol.
#define xsh_msg_warning(...)
Print an warning message.
cpl_table * xsh_histogram(const cpl_table *data, const char *cname, const int nbins, const double min, const double max)
void xsh_free_table(cpl_table **t)
Deallocate a table and set the pointer to NULL.
int xsh_print_rec_status(const int val)
Check if an error has happened and returns error kind and location.