예제 #1
0
 def setUp(self):
     self.input_file = 'input_image.fits'
     self.mask_file = 'rolloff_defects_mask.fits'
     self.image_file = 'my_temp_mask_image.fits'
     self.outer_edge_width = 10
     self.bloom_stop_width = 5
     self.signal = 10
     self.amp_geoms \
         = (AmplifierGeometry(amp_loc=amp_loc['E2V']),
            AmplifierGeometry(prescan=3, nx=509, ny=2000,
                              amp_loc=amp_loc['ITL'], vendor='ITL'))
예제 #2
0
    def setUpClass(cls):
        cls.amp_geom = AmplifierGeometry()
        cls.bias_image = afwImage.ImageF(cls.amp_geom.full_segment)
        imarr = cls.bias_image.getArray()
        ny, nx = imarr.shape
        yvals = np.arange(0, ny, dtype=np.float)
        bias_func = BiasFunc(cls.bias_slope, cls.bias_intercept)
        for x in range(nx):
            imarr[:, x] += bias_func(yvals)
        ccd = sim_tools.CCD(exptime=cls.exptime,
                            gain=cls.gain,
                            geometry=cls.amp_geom)
        for amp in ccd.segments:
            ccd.segments[amp].image += cls.bias_image
        ccd.writeto(cls.image_file)

        cls.mean_bias_image = afwImage.ImageF(cls.amp_geom.full_segment)
        imarr = cls.mean_bias_image.getArray()
        ny, nx = imarr.shape
        mu, sig = 27316.92, 6.53
        for x in range(nx):
            imarr[:, x] += np.random.normal(mu, sig, ny)
        ccd = sim_tools.CCD(exptime=cls.exptime,
                            gain=cls.gain,
                            geometry=cls.amp_geom)
        for amp in ccd.segments:
            ccd.segments[amp].image += cls.mean_bias_image
        ccd.writeto(cls.mean_image_file)
예제 #3
0
    def setUp(self):
        self.e2v = AmplifierGeometry(prescan=10,
                                     nx=512,
                                     ny=2002,
                                     detxsize=4336,
                                     detysize=4044,
                                     amp_loc=amp_loc['E2V'])
        self.e2v_test_file = 'test_e2v_image.fits'
        ccd0 = sim_tools.CCD(geometry=self.e2v)
        ccd0.writeto(self.e2v_test_file, bitpix=16)

        self.itl = AmplifierGeometry(prescan=3,
                                     nx=509,
                                     ny=2000,
                                     amp_loc=amp_loc['ITL'])
        self.itl_test_file = 'test_itl_image.fits'
        ccd1 = sim_tools.CCD(geometry=self.itl)
        ccd1.writeto(self.itl_test_file, bitpix=16)
예제 #4
0
 def setUp(self):
     self.input_file = 'input_image.fits'
     self.mask_file = 'rolloff_defects_mask.fits'
     self.image_file = 'my_temp_mask_image.fits'
     self.outer_edge_width = 10
     self.bloom_stop_width = 5
     self.signal = 10
     ccd = sim_tools.CCD(geometry=AmplifierGeometry(amp_loc=amp_loc['E2V']))
     ccd.writeto(self.input_file, bitpix=16)
예제 #5
0
class SegmentExposureTestCase(unittest.TestCase):
    amp_geom = AmplifierGeometry()
    bias_method = 'row'

    def setUp(self):
        self.seg = sim_tools.SegmentExposure(exptime=100, gain=1, ccdtemp=-100,
                                             geometry=self.amp_geom)
        self.intensity = 100
        self.full_well = 1.5e5

    def tearDown(self):
        pass

    def test_expose_flat(self):
        times = np.arange(0, 1000, self.seg.exptime)
        for i, time in enumerate(times):
            image = imutils.unbias_and_trim(im=self.seg.image,
                                            overscan=self.amp_geom.serial_overscan,
                                            bias_method=self.bias_method,
					    imaging=self.amp_geom.imaging)
            image_mean = imutils.mean(image)
            illum = i*self.intensity*self.seg.exptime/self.seg.gain
            if i != 0:
                self.assertTrue((illum - image_mean)/illum < 3e-4)
            self.seg.expose_flat(intensity=self.intensity)

    def test_full_well(self):
        self.seg.full_well = self.full_well
        times = np.arange(0, 2000, self.seg.exptime)
        for i, time in enumerate(times):
            image = imutils.unbias_and_trim(im=self.seg.image,
                                            overscan=self.amp_geom.serial_overscan,
					    bias_method=self.bias_method,
                                            imaging=self.amp_geom.imaging)
            Ne_mean = imutils.mean(image)*self.seg.gain
            self.assertTrue(Ne_mean <= self.full_well)
            self.seg.expose_flat(intensity=self.intensity)
예제 #6
0
class BiasHandlingTestCase(unittest.TestCase):
    bias_slope = 1e-3
    bias_intercept = 0.5
    exptime = 1
    gain = 1
    kwargs = {
        'fit_order': 1,
        'k': 3,
        's': 8000,
        't': None,
        'imaging': AmplifierGeometry().imaging
    }
    image_file = 'test_image.fits'
    mean_image_file = 'test_mean_image.fits'

    @classmethod
    def setUpClass(cls):
        cls.amp_geom = AmplifierGeometry()
        cls.bias_image = afwImage.ImageF(cls.amp_geom.full_segment)
        imarr = cls.bias_image.getArray()
        ny, nx = imarr.shape
        yvals = np.arange(0, ny, dtype=np.float)
        bias_func = BiasFunc(cls.bias_slope, cls.bias_intercept)
        for x in range(nx):
            imarr[:, x] += bias_func(yvals)
        ccd = sim_tools.CCD(exptime=cls.exptime,
                            gain=cls.gain,
                            geometry=cls.amp_geom)
        for amp in ccd.segments:
            ccd.segments[amp].image += cls.bias_image
        ccd.writeto(cls.image_file)

        cls.mean_bias_image = afwImage.ImageF(cls.amp_geom.full_segment)
        imarr = cls.mean_bias_image.getArray()
        ny, nx = imarr.shape
        mu, sig = 27316.92, 6.53
        for x in range(nx):
            imarr[:, x] += np.random.normal(mu, sig, ny)
        ccd = sim_tools.CCD(exptime=cls.exptime,
                            gain=cls.gain,
                            geometry=cls.amp_geom)
        for amp in ccd.segments:
            ccd.segments[amp].image += cls.mean_bias_image
        ccd.writeto(cls.mean_image_file)

    @classmethod
    def tearDownClass(cls):
        os.remove(cls.image_file)
        os.remove(cls.mean_image_file)

    def test_bias_func(self):
        bias_func = BiasFunc(self.bias_slope, self.bias_intercept)
        ccd = MaskedCCD(self.image_file)
        for amp in ccd:
            bf_i = imutils.bias_func(ccd[amp].getImage(),
                                     self.amp_geom.serial_overscan,
                                     **self.kwargs)
            bf_m = imutils.bias_func(ccd[amp], self.amp_geom.serial_overscan,
                                     **self.kwargs)
            for y in range(2022):
                self.assertEqual(bf_i(y), bf_m(y))
                self.assertAlmostEqual(bias_func(y), bf_m(y))
            # Test that row-by-row median operates.
            row_bias = imutils.bias_row(ccd[amp],
                                        self.amp_geom.serial_overscan)
            for y in range(2022):
                self.assertAlmostEqual(bf_i(y), row_bias(y), places=5)

    def test_bias_image(self):
        ccd = MaskedCCD(self.image_file)
        overscan = makeAmplifierGeometry(self.image_file)
        ccd_mean = MaskedCCD(self.mean_image_file)
        overscan_mean = makeAmplifierGeometry(self.mean_image_file)
        for amp in ccd:
            for method in ['mean', 'row', 'func', 'spline']:
                if method == 'mean':
                    my_bias_image = imutils.bias_image(
                        ccd_mean[amp],
                        overscan_mean.serial_overscan,
                        bias_method=method,
                        **self.kwargs)
                    fracdiff = ((self.mean_bias_image.getArray() -
                                 my_bias_image.getArray()) /
                                self.mean_bias_image.getArray())
                    self.assertTrue(max(np.abs(fracdiff.flat)) < 1.5e-3)
                else:
                    my_bias_image = imutils.bias_image(
                        ccd[amp],
                        overscan.serial_overscan,
                        bias_method=method,
                        **self.kwargs)
                    fracdiff = ((self.bias_image.getArray() -
                                 my_bias_image.getArray()) /
                                self.bias_image.getArray())
                    self.assertTrue(max(np.abs(fracdiff.flat)) < 1e-6)
            my_bias_image = imutils.bias_image(ccd[amp],
                                               self.amp_geom.serial_overscan)
            fracdiff = (
                (self.bias_image.getArray() - my_bias_image.getArray()) /
                self.bias_image.getArray())
            self.assertTrue(max(np.abs(fracdiff.flat)) < 1e-6)

    def test_unbias_and_trim(self):
        ccd = MaskedCCD(self.image_file)
        overscan = makeAmplifierGeometry(self.image_file)
        for amp in ccd:
            for method in ['mean', 'row', 'func', 'spline']:
                image = imutils.unbias_and_trim(ccd[amp],
                                                overscan.serial_overscan,
                                                bias_method=method,
                                                **self.kwargs)
                imarr = image.getImage().getArray()
                if method == 'mean':
                    self.assertTrue(max(np.abs(imarr.flat)) < 2)
                else:
                    self.assertTrue(max(np.abs(imarr.flat)) < 1e-6)
                    #
                    # Test of corresponding MaskedCCD method.
                    #
                    image = ccd.unbiased_and_trimmed_image(
                        amp, overscan.serial_overscan, **self.kwargs)
                    imarr = image.getImage().getArray()
                    self.assertTrue(max(np.abs(imarr.flat)) < 1e-6)

    def test_bias_row(self):
        ccd = MaskedCCD(self.image_file)
        overscan = makeAmplifierGeometry(self.image_file)
        for amp in ccd:
            # Unmasked image
            br_i = imutils.bias_row(ccd[amp].getImage(),
                                    overscan.serial_overscan)
            # Masked image
            br_m = imutils.bias_row(ccd[amp], overscan.serial_overscan)
            for ii in range(2022):
                self.assertEqual(br_i(ii), br_m(ii))

    def test_bias_spline(self):
        ccd = MaskedCCD(self.image_file)
        overscan = makeAmplifierGeometry(self.image_file)
        for amp in ccd:
            # Unmasked image
            bs_i = imutils.bias_spline(ccd[amp].getImage(),
                                       overscan.serial_overscan)
            # Masked image
            bs_m = imutils.bias_spline(ccd[amp], overscan.serial_overscan)
            ny = len(bs_i)
            for ii in range(ny):
                self.assertEqual(interpolate.splev(ii, bs_i),
                                 interpolate.splev(ii, bs_m))

    def test_stack(self):
        ccd = MaskedCCD(self.image_file)
        overscan = makeAmplifierGeometry(self.image_file)
        for method in ['mean', 'row', 'func']:
            corrected = []
            for image in ccd.values():
                corrected.append(
                    imutils.unbias_and_trim(image,
                                            overscan.serial_overscan,
                                            bias_method=method,
                                            **self.kwargs).getImage())
            stacked = imutils.stack(corrected)
            imarr = stacked.getArray()
            if method == 'mean':
                self.assertTrue(max(np.abs(imarr.flat)) < 2)
            else:
                self.assertTrue(max(np.abs(imarr.flat)) < 1e-6)