#include #include #include #include "mask.h" using namespace sli; static const int amp_n = 4; // アンプの数 static void flag_saturated(fits_image &image_hdu, fits_image &mask_hdu) { const int sat_level = 50000; image_hdu.convert_type(FITS::FLOAT_T); mdarray_float &image_data = image_hdu.float_array(); mdarray_uchar &mask_data = mask_hdu.uchar_array(); for (unsigned y = 0; y < image_data.length(1); y++) { for (unsigned x = 0; x < image_data.length(0); x++) { if (image_data(x, y) > sat_level) mask_data(x, y) |= SATURATED; } } } static void debias(fits_image &hdu) { hdu.convert_type(FITS::FLOAT_T); mdarray_float &data = hdu.float_array(); for (int amp = 1; amp <= amp_n; amp++) { const int os_min_x = hdu.headerf("S_OSMN%d1", amp).lvalue(), os_max_x = hdu.headerf("S_OSMX%d1", amp).lvalue(), ef_min_x = hdu.headerf("S_EFMN%d1", amp).lvalue(), ef_max_x = hdu.headerf("S_EFMX%d1", amp).lvalue(); sli__eprintf( "amp = %d os_min_x = % 5d os_max_x = % 5d ef_min_x = % 5d ef_max_x = % 5d\n", amp, os_min_x, os_max_x, ef_min_x, ef_max_x); mdarray_float overscan_region, mean_x; overscan_region = data.section(os_min_x - 1, os_max_x - os_min_x + 1); mean_x = md_mean_x(overscan_region); for (unsigned y = 0; y < data.length(1); y++) { for (int x = ef_min_x - 1; x < ef_max_x; x++) data(x, y) -= mean_x(0, y); } } } static void drop_overscan(fits_image &hdu) { mdarray_float &data = hdu.float_array(); // y方向で切り詰め const int ef_min_y = hdu.headerf("S_EFMN12").lvalue(), ef_max_y = hdu.headerf("S_EFMX12").lvalue(); data.crop(1, ef_min_y - 1, ef_max_y - ef_min_y + 1); // x方向で切り詰め int filled_width = 0; for (int amp = 1; amp <= amp_n; amp++) { const int ef_min_x = hdu.headerf("S_EFMN%d1", amp).lvalue(), ef_max_x = hdu.headerf("S_EFMX%d1", amp).lvalue(), width = ef_max_x - ef_min_x + 1; data.move(ef_min_x - 1, width, filled_width, false); filled_width += width; } data.crop(0, 0, filled_width); } int main(int argc, char *argv[]) { if (argc != 3) { sli__eprintf("usage: %s INPUT OUTPUT\n", argv[0]); exit(1); } fitscc fits; fits.read_stream(argv[1]); debias(fits.image(0L)); drop_overscan(fits.image(0L)); if (fits.length() < 2) fits.append_image("Mask", 0, FITS::BYTE_T, fits.image(0L).length(0), fits.image(0L).length(1)); flag_saturated(fits.image(0L), fits.image(1L)); fits.write_stream(argv[2]); return 0; }