Skip to content
test_BF_CTE.py 5.36 KiB
Newer Older
Wei Chengliang's avatar
Wei Chengliang committed
import unittest

Fang Yuedong's avatar
Fang Yuedong committed
import sys
import os
import math
Wei Chengliang's avatar
Wei Chengliang committed
from itertools import islice
import numpy as np
import copy
import ctypes
import galsim
import yaml
from astropy.io import fits

Fang Yuedong's avatar
Fang Yuedong committed
from observation_sim.instruments import Chip, Filter, FilterParam, FocalPlane
from observation_sim.instruments.chip import chip_util
from observation_sim.instruments.chip.libCTI.CTI_modeling import CTI_sim
Wei Chengliang's avatar
Wei Chengliang committed

try:
    import importlib.resources as pkg_resources
except ImportError:
    # Try backported to PY<37 'importlib_resources'
    import importlib_resources as pkg_resources


### test FUNCTION --- START ###
def add_brighter_fatter(img):
Fang Yuedong's avatar
Fang Yuedong committed
    # Inital dynamic lib
Wei Chengliang's avatar
Wei Chengliang committed
    try:
Fang Yuedong's avatar
Fang Yuedong committed
        with pkg_resources.files('observation_sim.instruments.chip.libBF').joinpath("libmoduleBF.so") as lib_path:
Wei Chengliang's avatar
Wei Chengliang committed
            lib_bf = ctypes.CDLL(lib_path)
    except AttributeError:
Fang Yuedong's avatar
Fang Yuedong committed
        with pkg_resources.path('observation_sim.instruments.chip.libBF', "libmoduleBF.so") as lib_path:
Wei Chengliang's avatar
Wei Chengliang committed
            lib_bf = ctypes.CDLL(lib_path)
Fang Yuedong's avatar
Fang Yuedong committed
    lib_bf.addEffects.argtypes = [ctypes.c_int, ctypes.c_int, ctypes.POINTER(
        ctypes.c_float), ctypes.POINTER(ctypes.c_float), ctypes.c_int]
Wei Chengliang's avatar
Wei Chengliang committed

    # Set bit flag
    bit_flag = 1
    bit_flag = bit_flag | (1 << 2)

    nx, ny = img.array.shape
    nn = nx * ny
Fang Yuedong's avatar
Fang Yuedong committed
    arr_ima = (ctypes.c_float*nn)()
    arr_imc = (ctypes.c_float*nn)()
Wei Chengliang's avatar
Wei Chengliang committed

Fang Yuedong's avatar
Fang Yuedong committed
    arr_ima[:] = img.array.reshape(nn)
    arr_imc[:] = np.zeros(nn)
Wei Chengliang's avatar
Wei Chengliang committed

    lib_bf.addEffects(nx, ny, arr_ima, arr_imc, bit_flag)
    img.array[:, :] = np.reshape(arr_imc, [nx, ny])
    del arr_ima, arr_imc
    return img
### test FUNCTION --- END ###

Fang Yuedong's avatar
Fang Yuedong committed

Wei Chengliang's avatar
Wei Chengliang committed
def defineCCD(iccd, config_file):
    with open(config_file, "r") as stream:
        try:
            config = yaml.safe_load(stream)
Fang Yuedong's avatar
Fang Yuedong committed
            # for key, value in config.items():
Wei Chengliang's avatar
Wei Chengliang committed
            #    print (key + " : " + str(value))
        except yaml.YAMLError as exc:
            print(exc)
    chip = Chip(chipID=iccd, config=config)
Fang Yuedong's avatar
Fang Yuedong committed
    # galsim.ImageF(chip.npix_x, chip.npix_y)
    chip.img = galsim.ImageF(400, 200)
Wei Chengliang's avatar
Wei Chengliang committed
    focal_plane = FocalPlane(chip_list=[iccd])
Fang Yuedong's avatar
Fang Yuedong committed
    chip.img.wcs = focal_plane.getTanWCS(
        192.8595, 27.1283, -113.4333*galsim.degrees, chip.pix_scale)
Wei Chengliang's avatar
Wei Chengliang committed
    return chip

Fang Yuedong's avatar
Fang Yuedong committed

Wei Chengliang's avatar
Wei Chengliang committed
def defineFilt(chip):
    filter_param = FilterParam()
    filter_id, filter_type = chip.getChipFilter()
    filt = Filter(
        filter_id=filter_id,
        filter_type=filter_type,
        filter_param=filter_param,
        ccd_bandpass=chip.effCurve)
    bandpass_list = filt.bandpass_sub_list
    return filt


class detModule_coverage(unittest.TestCase):
    def __init__(self, methodName='runTest'):
        super(detModule_coverage, self).__init__(methodName)
Fang Yuedong's avatar
Fang Yuedong committed
        # self.dataPath = "/public/home/chengliang/CSSOSDataProductsSims/csst-simulation/tests/UNIT_TEST_DATA" ##os.path.join(os.getenv('UNIT_TEST_DATA_ROOT'), 'csst_fz_gc1')
        self.dataPath = os.path.join(
            os.getenv('UNIT_TEST_DATA_ROOT'), 'csst_msc_sim/csst_fz_msc')
Wei Chengliang's avatar
Wei Chengliang committed
        self.iccd = 1

    def test_add_brighter_fatter(self):
        config_file = os.path.join(self.dataPath, 'config_test.yaml')
        chip = defineCCD(self.iccd, config_file)
        filt = defineFilt(chip)
        print(chip.chipID)
        print(chip.cen_pix_x, chip.cen_pix_y)

Fang Yuedong's avatar
Fang Yuedong committed
        # objA-lowSFB
Wei Chengliang's avatar
Wei Chengliang committed
        obj = galsim.Gaussian(sigma=0.2, flux=1000)
        arr = obj.drawImage(nx=64, ny=64, scale=0.074).array
Fang Yuedong's avatar
Fang Yuedong committed
        chip.img.array[(100-32):(100+32), (200-32):(200+32)] = arr[:, :]
Wei Chengliang's avatar
Wei Chengliang committed
        img_old = copy.deepcopy(chip.img)
        img_new = add_brighter_fatter(img=chip.img)
Fang Yuedong's avatar
Fang Yuedong committed
        arr1 = img_old.array
        arr2 = img_new.array
Wei Chengliang's avatar
Wei Chengliang committed
        deltaA_max = np.max(np.abs(arr2-arr1))
Fang Yuedong's avatar
Fang Yuedong committed
        print('deltaA-max:', np.max(np.abs(arr2-arr1)))
        print('deltaA-min:', np.min(np.abs(arr2-arr1)))
Wei Chengliang's avatar
Wei Chengliang committed

Fang Yuedong's avatar
Fang Yuedong committed
        # objB-highSFB
Wei Chengliang's avatar
Wei Chengliang committed
        obj = galsim.Gaussian(sigma=0.2, flux=10000)
        arr = obj.drawImage(nx=64, ny=64, scale=0.074).array
Fang Yuedong's avatar
Fang Yuedong committed
        chip.img.array[(100-32):(100+32), (200-32):(200+32)] = arr[:, :]
Wei Chengliang's avatar
Wei Chengliang committed
        img_old = copy.deepcopy(chip.img)
        img_new = add_brighter_fatter(img=chip.img)
Fang Yuedong's avatar
Fang Yuedong committed
        arr3 = img_old.array
        arr4 = img_new.array
Wei Chengliang's avatar
Wei Chengliang committed
        deltaB_max = np.max(np.abs(arr4-arr3))
Fang Yuedong's avatar
Fang Yuedong committed
        print('deltaB-max:', np.max(np.abs(arr4-arr3)))
        print('deltaB-min:', np.min(np.abs(arr4-arr3)))
Wei Chengliang's avatar
Wei Chengliang committed

Fang Yuedong's avatar
Fang Yuedong committed
        self.assertTrue(deltaB_max > deltaA_max)
Wei Chengliang's avatar
Wei Chengliang committed

    def test_apply_CTE(self):
        config_file = os.path.join(self.dataPath, 'config_test.yaml')
        chip = defineCCD(self.iccd, config_file)
        filt = defineFilt(chip)
        print(chip.chipID)
        print(chip.cen_pix_x, chip.cen_pix_y)

        print("  Apply CTE Effect")
Fang Yuedong's avatar
Fang Yuedong committed
        nx, ny, noverscan, nsp, nmax = 4608, 4616, 84, 3, 10
Wei Chengliang's avatar
Wei Chengliang committed
        ntotal = 4700
Fang Yuedong's avatar
Fang Yuedong committed
        beta, w, c = 0.478, 84700, 0
        t = np.array([0.74, 7.7, 37], dtype=np.float32)
        rho_trap = np.array([0.6, 1.6, 1.4], dtype=np.float32)
        trap_seeds = np.array([0, 100, 1000], dtype=np.int32)
Wei Chengliang's avatar
Wei Chengliang committed
        release_seed = 500
Fang Yuedong's avatar
Fang Yuedong committed
        image = fits.getdata(os.path.join(
            self.dataPath, "testCTE_image_before.fits")).astype(np.int32)
        # get_trap_map(trap_seeds,nx,ny,nmax,rho_trap,beta,c,".")
        # bin2fits("trap.bin",".",nsp,nx,ny,nmax)
        image_cti = CTI_sim(image, nx, ny, noverscan, nsp, nmax,
                            beta, w, c, t, rho_trap, trap_seeds, release_seed)
        fits.writeto(os.path.join(
            self.dataPath, "testCTE_image_after.fits"), data=image_cti, overwrite=True)
Wei Chengliang's avatar
Wei Chengliang committed


if __name__ == '__main__':
    unittest.main()