39 #include "hawki_image_stats.h"
40 #include "hawki_dfs.h"
41 #include "hawki_utils.h"
42 #include "hawki_load.h"
47 float hawki_tools_get_kth_float(
float * a,
70 (cpl_table ** raw_stats)
74 cpl_errorstate prestate = cpl_errorstate_get();
79 for( idet=0 ; idet<HAWKI_NB_DETECTORS ; idet++)
81 if(raw_stats[idet] == NULL)
86 for( idet=0 ; idet<HAWKI_NB_DETECTORS ; idet++)
89 (raw_stats[idet],HAWKI_COL_STAT_MIN,CPL_TYPE_DOUBLE);
90 cpl_table_set_column_unit(raw_stats[idet],HAWKI_COL_STAT_MIN,
"ADU");
92 (raw_stats[idet],HAWKI_COL_STAT_MAX,CPL_TYPE_DOUBLE);
93 cpl_table_set_column_unit(raw_stats[idet],HAWKI_COL_STAT_MAX,
"ADU");
95 (raw_stats[idet],HAWKI_COL_STAT_MED,CPL_TYPE_DOUBLE);
96 cpl_table_set_column_unit(raw_stats[idet],HAWKI_COL_STAT_MED,
"ADU");
98 (raw_stats[idet],HAWKI_COL_STAT_MEAN,CPL_TYPE_DOUBLE);
99 cpl_table_set_column_unit(raw_stats[idet],HAWKI_COL_STAT_MEAN,
"ADU");
101 (raw_stats[idet],HAWKI_COL_STAT_RMS,CPL_TYPE_DOUBLE);
102 cpl_table_set_column_unit(raw_stats[idet],HAWKI_COL_STAT_RMS,
"ADU");
104 (raw_stats[idet],HAWKI_COL_STAT_USED,CPL_TYPE_INT);
108 if(!cpl_errorstate_is_equal(prestate))
137 (cpl_table ** image_stats,
138 const cpl_image * image,
152 cpl_stats * stats_ima ;
155 cpl_errorstate prestate = cpl_errorstate_get();
158 if(image_stats == NULL || image == NULL)
162 stats_ima = cpl_stats_new_from_image_window
163 (image, CPL_STATS_ALL, llx, lly, urx, ury) ;
164 if(stats_ima == NULL)
168 minval = cpl_stats_get_min(stats_ima);
169 maxval = cpl_stats_get_max(stats_ima);
170 median = cpl_stats_get_median(stats_ima);
171 stdev = cpl_stats_get_stdev(stats_ima);
172 mean = cpl_stats_get_mean(stats_ima);
173 cpl_stats_delete(stats_ima);
176 cpl_table_set_double(image_stats[idet], HAWKI_COL_STAT_MIN,
178 cpl_table_set_double(image_stats[idet], HAWKI_COL_STAT_MAX,
180 cpl_table_set_double(image_stats[idet], HAWKI_COL_STAT_MED,
182 cpl_table_set_double(image_stats[idet], HAWKI_COL_STAT_MEAN,
184 cpl_table_set_double(image_stats[idet], HAWKI_COL_STAT_RMS,
186 cpl_table_set_int(image_stats[idet], HAWKI_COL_STAT_USED,
190 if(!cpl_errorstate_is_equal(prestate))
195 int hawki_image_stats_odd_even_column_row_fill_from_image
196 (cpl_table ** odd_column_stats,
197 cpl_table ** even_column_stats,
198 cpl_table ** odd_row_stats,
199 cpl_table ** even_row_stats,
200 const cpl_image * image,
214 cpl_stats * stats_ima;
219 cpl_errorstate prestate = cpl_errorstate_get();
222 if(odd_column_stats == NULL ||
223 even_column_stats == NULL ||
224 odd_row_stats == NULL ||
225 even_row_stats == NULL ||
230 tmp_ima = cpl_image_duplicate(image);
231 nx = cpl_image_get_size_x(tmp_ima);
232 ny = cpl_image_get_size_y(tmp_ima);
235 mask = cpl_image_get_bpm(tmp_ima);
236 for(i=0 ; i < nx ; ++i)
239 for(j=0 ; j < ny ; ++j)
241 cpl_mask_set(mask, i + 1, j + 1, CPL_BINARY_1);
244 stats_ima = cpl_stats_new_from_image
245 (tmp_ima, CPL_STATS_ALL);
246 if(stats_ima == NULL)
248 cpl_image_delete(tmp_ima);
253 minval = cpl_stats_get_min(stats_ima);
254 maxval = cpl_stats_get_max(stats_ima);
255 median = cpl_stats_get_median(stats_ima);
256 stdev = cpl_stats_get_stdev(stats_ima);
257 mean = cpl_stats_get_mean(stats_ima);
258 cpl_stats_delete(stats_ima);
261 cpl_table_set_double(odd_column_stats[idet], HAWKI_COL_STAT_MIN,
263 cpl_table_set_double(odd_column_stats[idet], HAWKI_COL_STAT_MAX,
265 cpl_table_set_double(odd_column_stats[idet], HAWKI_COL_STAT_MED,
267 cpl_table_set_double(odd_column_stats[idet], HAWKI_COL_STAT_MEAN,
269 cpl_table_set_double(odd_column_stats[idet], HAWKI_COL_STAT_RMS,
271 cpl_table_set_int(odd_column_stats[idet], HAWKI_COL_STAT_USED,
276 cpl_image_accept_all(tmp_ima);
277 mask = cpl_image_get_bpm(tmp_ima);
278 for(i=0 ; i < nx ; ++i)
281 for(j=0 ; j < ny ; ++j)
283 cpl_mask_set(mask, i + 1, j + 1, CPL_BINARY_1);
286 stats_ima = cpl_stats_new_from_image
287 (tmp_ima, CPL_STATS_ALL);
288 if(stats_ima == NULL)
290 cpl_image_delete(tmp_ima);
295 minval = cpl_stats_get_min(stats_ima);
296 maxval = cpl_stats_get_max(stats_ima);
297 median = cpl_stats_get_median(stats_ima);
298 stdev = cpl_stats_get_stdev(stats_ima);
299 mean = cpl_stats_get_mean(stats_ima);
300 cpl_stats_delete(stats_ima);
303 cpl_table_set_double(even_column_stats[idet], HAWKI_COL_STAT_MIN,
305 cpl_table_set_double(even_column_stats[idet], HAWKI_COL_STAT_MAX,
307 cpl_table_set_double(even_column_stats[idet], HAWKI_COL_STAT_MED,
309 cpl_table_set_double(even_column_stats[idet], HAWKI_COL_STAT_MEAN,
311 cpl_table_set_double(even_column_stats[idet], HAWKI_COL_STAT_RMS,
313 cpl_table_set_int(even_column_stats[idet], HAWKI_COL_STAT_USED,
317 cpl_image_accept_all(tmp_ima);
318 mask = cpl_image_get_bpm(tmp_ima);
319 for(j=0 ; j < ny ; ++j)
322 for(i=0 ; i < nx ; ++i)
324 cpl_mask_set(mask, i + 1, j + 1, CPL_BINARY_1);
327 stats_ima = cpl_stats_new_from_image
328 (tmp_ima, CPL_STATS_ALL) ;
329 if(stats_ima == NULL)
331 cpl_image_delete(tmp_ima);
336 minval = cpl_stats_get_min(stats_ima);
337 maxval = cpl_stats_get_max(stats_ima);
338 median = cpl_stats_get_median(stats_ima);
339 stdev = cpl_stats_get_stdev(stats_ima);
340 mean = cpl_stats_get_mean(stats_ima);
341 cpl_stats_delete(stats_ima);
344 cpl_table_set_double(odd_row_stats[idet], HAWKI_COL_STAT_MIN,
346 cpl_table_set_double(odd_row_stats[idet], HAWKI_COL_STAT_MAX,
348 cpl_table_set_double(odd_row_stats[idet], HAWKI_COL_STAT_MED,
350 cpl_table_set_double(odd_row_stats[idet], HAWKI_COL_STAT_MEAN,
352 cpl_table_set_double(odd_row_stats[idet], HAWKI_COL_STAT_RMS,
354 cpl_table_set_int(odd_row_stats[idet], HAWKI_COL_STAT_USED,
358 cpl_image_accept_all(tmp_ima);
359 mask = cpl_image_get_bpm(tmp_ima);
360 for(j=0 ; j < ny ; ++j)
363 for(i=0 ; i < nx ; ++i)
365 cpl_mask_set(mask, i + 1, j + 1, CPL_BINARY_1);
368 stats_ima = cpl_stats_new_from_image
369 (tmp_ima, CPL_STATS_ALL) ;
370 if(stats_ima == NULL)
372 cpl_image_delete(tmp_ima);
377 minval = cpl_stats_get_min(stats_ima);
378 maxval = cpl_stats_get_max(stats_ima);
379 median = cpl_stats_get_median(stats_ima);
380 stdev = cpl_stats_get_stdev(stats_ima);
381 mean = cpl_stats_get_mean(stats_ima);
382 cpl_stats_delete(stats_ima);
385 cpl_table_set_double(even_row_stats[idet], HAWKI_COL_STAT_MIN,
387 cpl_table_set_double(even_row_stats[idet], HAWKI_COL_STAT_MAX,
389 cpl_table_set_double(even_row_stats[idet], HAWKI_COL_STAT_MED,
391 cpl_table_set_double(even_row_stats[idet], HAWKI_COL_STAT_MEAN,
393 cpl_table_set_double(even_row_stats[idet], HAWKI_COL_STAT_RMS,
395 cpl_table_set_int(even_row_stats[idet], HAWKI_COL_STAT_USED,
399 cpl_image_delete(tmp_ima);
402 if(!cpl_errorstate_is_equal(prestate))
430 (cpl_table ** image_stats,
431 const cpl_frame * frame,
435 cpl_imagelist * images;
441 cpl_msg_error(__func__,
"Could not read file %s",
442 cpl_frame_get_filename(frame));
446 for(idet = 0; idet < HAWKI_NB_DETECTORS; ++idet)
449 nx = cpl_image_get_size_x(cpl_imagelist_get(images,idet));
450 ny = cpl_image_get_size_y(cpl_imagelist_get(images,idet));
453 cpl_imagelist_get(images,idet),
454 1, 1, nx, ny, idet, irow);
458 cpl_imagelist_delete(images);
462 int hawki_image_stats_print
463 (cpl_table ** table_stats)
469 cpl_msg_info(__func__,
"Stats summary") ;
472 cpl_msg_indent_more();
473 for( idet = 0; idet < HAWKI_NB_DETECTORS; ++idet)
477 cpl_msg_info(__func__,
"Chip number %d", idet+1) ;
478 cpl_msg_info(__func__,
"image min max med rms") ;
479 cpl_msg_info(__func__,
"--------------------------------------------") ;
482 for(istat = 0; istat < cpl_table_get_nrow(table_stats[idet]); ++istat)
484 cpl_msg_info(__func__,
"%02d %10.2f %10.2f %10.2f %10.2f",
486 cpl_table_get_double(table_stats[idet],
487 HAWKI_COL_STAT_MIN,istat,NULL),
488 cpl_table_get_double(table_stats[idet],
489 HAWKI_COL_STAT_MAX,istat,NULL),
490 cpl_table_get_double(table_stats[idet],
491 HAWKI_COL_STAT_MED,istat,NULL ),
492 cpl_table_get_double(table_stats[idet],
493 HAWKI_COL_STAT_RMS,istat,NULL ));
496 cpl_msg_indent_less();
512 (cpl_table ** image_stats,
513 cpl_propertylist ** stats_stats)
515 cpl_array * col_names;
520 if(image_stats == NULL || stats_stats == NULL)
524 col_names = cpl_array_new(5, CPL_TYPE_STRING);
525 cpl_array_set_string(col_names, 0, HAWKI_COL_STAT_MIN);
526 cpl_array_set_string(col_names, 1, HAWKI_COL_STAT_MAX);
527 cpl_array_set_string(col_names, 2, HAWKI_COL_STAT_MED);
528 cpl_array_set_string(col_names, 3, HAWKI_COL_STAT_MEAN);
529 cpl_array_set_string(col_names, 4, HAWKI_COL_STAT_RMS);
531 for (idet=0 ; idet<HAWKI_NB_DETECTORS ; ++idet)
533 for(icol = 0;icol < 5; ++icol)
535 const char * this_col_name = cpl_array_get_string(col_names, icol);
536 char mean_col_name[256] =
"ESO QC RAW ";
537 char median_col_name[256] =
"ESO QC RAW ";
538 char minimum_col_name[256] =
"ESO QC RAW ";
539 char maximum_col_name[256] =
"ESO QC RAW ";
540 char stdev_col_name[256] =
"ESO QC RAW ";
541 strncat(mean_col_name, this_col_name, 244);
542 strncat(mean_col_name,
" MEAN", 236);
543 cpl_propertylist_append_double
544 (stats_stats[idet], mean_col_name,
545 cpl_table_get_column_mean(image_stats[idet],this_col_name));
546 strncat(median_col_name, this_col_name, 255);
547 strncat(median_col_name,
" MEDIAN", 236);
548 cpl_propertylist_append_double
549 (stats_stats[idet], median_col_name,
550 cpl_table_get_column_median(image_stats[idet],this_col_name));
551 strncat(minimum_col_name, this_col_name, 255);
552 strncat(minimum_col_name,
" MINIMUM", 236);
553 cpl_propertylist_append_double
554 (stats_stats[idet], minimum_col_name,
555 cpl_table_get_column_min(image_stats[idet],this_col_name));
556 strncat(maximum_col_name, this_col_name, 255);
557 strncat(maximum_col_name,
" MAXIMUM", 236);
558 cpl_propertylist_append_double
559 (stats_stats[idet], maximum_col_name,
560 cpl_table_get_column_max(image_stats[idet],this_col_name));
561 strncat(stdev_col_name, this_col_name, 255);
562 strncat(stdev_col_name,
" STDEV", 236);
563 cpl_propertylist_append_double
564 (stats_stats[idet], stdev_col_name,
565 cpl_table_get_column_stdev(image_stats[idet],this_col_name));
570 cpl_array_delete(col_names);
587 double first_quartil;
588 double third_quartil;
589 double sigma_from_quartile;
592 npixels = cpl_image_get_size_x(image) * cpl_image_get_size_y(image);
593 data = cpl_image_get_data(image);
594 ipix_0_25 = (int)(npixels * 0.25);
595 ipix_0_75 = (int)(npixels * 0.75);
597 first_quartil = hawki_tools_get_kth_float(data, npixels, ipix_0_25);
598 third_quartil = hawki_tools_get_kth_float(data, npixels, ipix_0_75);
599 sigma_from_quartile = (third_quartil - first_quartil) / 1.35;
600 return sigma_from_quartile;
606 #define SWAP(a,b) { register float t=(a);(a)=(b);(b)=t; }
608 float hawki_tools_get_kth_float(
float * a,
613 register int i, j, l, m;
615 cpl_ensure(a, CPL_ERROR_NULL_INPUT, 0.00);