Commit 81e2570f authored by Zhang Xin's avatar Zhang Xin
Browse files

fix unittest for ccd Effect model

parent 042e5887
Loading
Loading
Loading
Loading
+35 −25
Original line number Diff line number Diff line
@@ -6,18 +6,28 @@ import matplotlib.pyplot as plt
import os,sys,math,copy
from numpy.random import Generator, PCG64
import warnings
from astropy.io import fits

warnings.filterwarnings("ignore", '.*Numba.*',)

width = 9216
height = 9232

if os.path.isdir('./output/'):
class DetTest(unittest.TestCase):

    def __init__(self, methodName='runTest'):
        super(DetTest,self).__init__(methodName)
        self.filePath('csst_fz_gc0')

    def filePath(self, file_name):
        self.datafn = os.path.join(os.getenv('UNIT_TEST_DATA_ROOT'), file_name)
        self.outDataFn = os.path.join(self.datafn,'output')
        if os.path.isdir(self.outDataFn):
            pass
        else:
    os.mkdir('./output/')
            os.mkdir(self.outDataFn)
        

class DetTest(unittest.TestCase):
    def test_prnu(self):
        '''
        Unit test for PRNU. Expected result: a randomized GS image contains PRNU with sigma=0.01, mean=1.
@@ -64,12 +74,12 @@ class DetTest(unittest.TestCase):
        img.addNoise(galsim.GaussianNoise(sigma=7))
        # plt.imshow(img.array)
        # plt.show()
        filename1 = os.path.join('output','test_satu_initimg.fits')
        filename1 = os.path.join(self.outDataFn,'test_satu_initimg.fits')
        img.write(filename1)
        newimg = Effects.SaturBloom(img, fullwell=9e4)
        # plt.imshow(newimg.array)
        # plt.show()
        filename2 = os.path.join('output','test_satu_bleedimg.fits')
        filename2 = os.path.join(self.outDataFn,'test_satu_bleedimg.fits')
        newimg.write(filename2)
        del img,newimg, star

@@ -79,16 +89,16 @@ class DetTest(unittest.TestCase):
        '''
        imgarr = np.arange(1,9e4,4).reshape((150,150))
        img = galsim.Image(copy.deepcopy(imgarr))
        filename1 = os.path.join('output','test_nonlinear_initimg.fits')
        filename1 = os.path.join(self.outDataFn,'test_nonlinear_initimg.fits')
        img.write(filename1)
        newimg = Effects.NonLinearity(img, beta1=5E-7, beta2=0)
        filename2 = os.path.join('output','test_nonlinear_finalimg.fits')
        filename2 = os.path.join(self.outDataFn,'test_nonlinear_finalimg.fits')
        newimg.write(filename2)
        plt.scatter(imgarr.flatten(), newimg.array.flatten(), s=2, alpha=0.5)
        plt.plot([-1e3,9e4],[-1e3,9e4],color='black', lw=1, ls='--')
        plt.xlabel('input (e-)')
        plt.ylabel('output (e-)')
        plt.savefig('./output/test_nonlinearity.png', dpi=200)
        plt.savefig(os.path.join(self.outDataFn,'test_nonlinearity.png'), dpi=200)
        plt.show()
        del img,newimg,imgarr

@@ -97,35 +107,35 @@ class DetTest(unittest.TestCase):
        rgbadpix = Generator(PCG64(20210911))
        badfraction = 5E-5*(rgbadpix.random()*0.5+0.7)
        img = Effects.DefectivePixels(img, IfHotPix=True, IfDeadPix=True, fraction=badfraction, seed=20210911, biaslevel=0)
        img.write('./output/test_badpixel_HtrDtr.fits')
        img.write(os.path.join(self.outDataFn,'test_badpixel_HtrDtr.fits'))
        del img
    def test_badpixel_HfsDtr(self):
        img = galsim.Image(500,500,init_value=1000)
        rgbadpix = Generator(PCG64(20210911))
        badfraction = 5E-5*(rgbadpix.random()*0.5+0.7)
        img = Effects.DefectivePixels(img, IfHotPix=False, IfDeadPix=True, fraction=badfraction, seed=20210911, biaslevel=0)
        img.write('./output/test_badpixel_HfsDtr.fits')
        img.write(os.path.join(self.outDataFn,'test_badpixel_HfsDtr.fits'))
        del img
    def test_badpixel_HtrDfs(self):
        img = galsim.Image(500,500,init_value=1000)
        rgbadpix = Generator(PCG64(20210911))
        badfraction = 5E-5*(rgbadpix.random()*0.5+0.7)
        img = Effects.DefectivePixels(img, IfHotPix=True, IfDeadPix=False, fraction=badfraction, seed=20210911, biaslevel=0)
        img.write('./output/test_badpixel_HtrDfs.fits')
        img.write(os.path.join(self.outDataFn,'test_badpixel_HtrDfs.fits'))
        del img
    def test_badpixel_HfsDfs(self):
        img = galsim.Image(500,500,init_value=1000)
        rgbadpix = Generator(PCG64(20210911))
        badfraction = 5E-5*(rgbadpix.random()*0.5+0.7)
        img = Effects.DefectivePixels(img, IfHotPix=False, IfDeadPix=False, fraction=badfraction, seed=20210911, biaslevel=0)
        img.write('./output/test_badpixel_HfsDfs.fits')
        img.write(os.path.join(self.outDataFn,'test_badpixel_HfsDfs.fits'))
        del img

    def test_badlines(self):
        img = galsim.Image(500,500,init_value=-1000)
        img.addNoise(galsim.GaussianNoise(sigma=7))
        newimg = Effects.BadColumns(copy.deepcopy(img), seed=20210911)
        newimg.write('./output/test_badlines.fits')
        newimg.write(os.path.join(self.outDataFn,'test_badlines.fits'))
        del newimg,img

    def test_cte(self):
@@ -134,8 +144,8 @@ class DetTest(unittest.TestCase):
        img.array[150,150] = 3e4
        newimgcol = Effects.CTE_Effect(copy.deepcopy(img),direction='column')
        newimgrow = Effects.CTE_Effect(copy.deepcopy(img),direction='row')
        newimgcol.write('./output/test_ctecol.fits')
        newimgrow.write('./output/test_cterow.fits')
        newimgcol.write(os.path.join(self.outDataFn,'test_ctecol.fits'))
        newimgrow.write(os.path.join(self.outDataFn,'test_cterow.fits'))
        del img,newimgcol,newimgrow

    def test_readnoise(self):
@@ -144,7 +154,7 @@ class DetTest(unittest.TestCase):
        rng_readout = galsim.BaseDeviate(seed)
        readout_noise = galsim.GaussianNoise(rng=rng_readout, sigma=5)
        img.addNoise(readout_noise)
        img.write('./output/test_readnoise.fits')
        img.write(os.path.join(self.outDataFn,'test_readnoise.fits'))
        stdval = np.std(img.array)
        self.assertTrue(np.abs(stdval-5)<0.01*5)
        print('\nUnit test for readout noise has been passed.')
@@ -158,8 +168,8 @@ class DetTest(unittest.TestCase):

    def test_apply16gains(self):
        img = galsim.Image(500,500,init_value=100)
        img = Effects.ApplyGainNonUniform16(img, gain=1.5, nsecy=2, nsecx=8, seed=202102)
        img.write("./output/test_apply16gains.fits")
        img,_ = Effects.ApplyGainNonUniform16(img, gain=1.5, nsecy=2, nsecx=8, seed=202102)
        img.write(os.path.join(self.outDataFn,'test_apply16gains.fits'))
        rightedge = int(500/8)*8
        print('gain=%6.2f' % 1.5)
        meanimg = np.mean(img.array[:,:rightedge])
@@ -172,20 +182,20 @@ class DetTest(unittest.TestCase):


    def test_cosmicray(self):
        attachedSizes = np.loadtxt('../ObservationSim/Instrument/Chip/wfc-cr-attachpixel.dat')
        cr_map = Effects.produceCR_Map(
        attachedSizes = np.loadtxt(os.path.join(self.datafn,'wfc-cr-attachpixel.dat'))
        cr_map,_ = Effects.produceCR_Map(
                xLen=500, yLen=500, exTime=150+0.5*40, 
                cr_pixelRatio=0.003*(1+0.5*40/150), 
                gain=1, attachedSizes=attachedSizes, seed=20210911)
        crimg = galsim.Image(cr_map)
        crimg.write('./output/test_cosmicray.fits')
        crimg.write(os.path.join(self.outDataFn,'test_cosmicray.fits'))
        del cr_map,crimg

    def test_shutter(self):
        img = galsim.Image(5000,5000,init_value=1000)
        shuttimg = Effects.ShutterEffectArr(img, t_exp=150, t_shutter=1.3, dist_bearing=735, dt=1E-3)    # shutter effect normalized image for this chip
        img *= shuttimg
        img.write('./output/test_shutter.fits')
        img.write(os.path.join(self.outDataFn,'test_shutter.fits'))
        del img

    def test_vignette(self):
@@ -195,7 +205,7 @@ class DetTest(unittest.TestCase):
        img.setOrigin(10000,10000)
        flat_img = Effects.MakeFlatSmooth(img.bounds,20210911)
        flat_normal = flat_img / np.mean(flat_img.array)
        flat_normal.write('./output/test_vignette.fits')
        flat_normal.write(os.path.join(self.outDataFn,'test_vignette.fits'))
        del flat_img,img,flat_normal


+42 −0
Original line number Diff line number Diff line
# Graph from wfc-cr-attach, page 1
0.00000	0.004684
0.5031	0.004684
0.5283	0.01873
1.509	0.01873
1.534	0.09327
2.490	0.09327
2.515	0.1034
3.496	0.1034
3.522	0.2440
4.503	0.2440
4.528	0.1107
5.509	0.1107
5.534	0.1013
6.490	0.1013
6.515	0.06090
7.496	0.06090
7.522	0.05834
8.503	0.05834
8.528	0.03875
9.509	0.03875
9.534	0.03066
10.49	0.03066
10.51	0.01788
11.47	0.01788
11.49	0.01831
13.50	0.01831
13.53	0.01235
13.53	0.01235
14.49	0.01235
14.51	0.01064
15.49	0.01064
15.52	0.008091
16.50	0.008091
16.52	0.004684
17.48	0.004684
17.53	0.003833
18.49	0.003833
18.51	0.005536
19.47	0.005536
19.52	0.004684
20.00	0.004684