Commit 20b4f01c authored by Zhang Xin's avatar Zhang Xin
Browse files

fix unitest bug for main code modify --sls

parent a88bded7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -243,7 +243,7 @@ def WCS_def(xlen = 9216, ylen = 9232, gapy = 898.0, gapx1 = 534, gapx2 = 1309, r

                # test_center_o = w.wcs_pix2world(np.array([[xlen / 2, ylen / 2]]), 1)

                sls_rot = 1
                sls_rot = rotate_chip
                if i > 2:
                    sls_rot = -sls_rot

+9 −1
Original line number Diff line number Diff line
'''
Author: Zhang Xin zhangx@bao.ac.cn
Date: 2023-08-07 11:23:28
LastEditors: Zhang Xin zhangx@bao.ac.cn
LastEditTime: 2023-10-08 14:44:19
FilePath: /undefined/Users/zhangxin/Work/SlitlessSim/CSST_SIM/CSST_develop/csst-simulation/setup.py
Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
'''
from setuptools import setup, find_packages

from setuptools.extension import Extension
@@ -46,7 +54,7 @@ setup(name='CSSTSim',
        'ObservationSim.MockObject.data': ['*.dat'], 
        'ObservationSim.Instrument.data': ['*.txt', '*.dat', '*.json'],
        'ObservationSim.Instrument.data.field_distortion': ['*.pickle'],
        'ObservationSim.Instrument.data.ccd': ['*.txt'], 
        'ObservationSim.Instrument.data.ccd': ['*.txt','*.json'], 
        'ObservationSim.Instrument.data.filters': ['*.txt', '*.list', '*.dat'], 
        'ObservationSim.Instrument.data.throughputs': ['*.txt', '*.dat'], 
        'ObservationSim.Instrument.data.sls_conf': ['*.conf', '*.fits'],
+8.44 KiB

File added.

No diff preview for this file type.

tests/config_C6.yaml

0 → 100644
+225 −0
Original line number Diff line number Diff line
---
###############################################
#
#  Configuration file for CSST simulation
#  CSST-Sim Group, 2021/10/07
#
###############################################

# Base diretories and naming setup
# Can add some of the command-line arguments here as well;
# OK to pass either way or both, as long as they are consistent
work_dir: "/share/home/fangyuedong/test_psf_rot/csst-simulation/workplace/"
# work_dir: "/share/"
data_dir: "/share/simudata/CSSOSDataProductsSims/data/"
run_name: "C6_photometry"

# (Optional) a file of point list 
# if you just want to run default pointing:
# - pointing_dir: null
# - pointing_file: null
pointing_dir: "/share/simudata/CSSOSDataProductsSims/data/"
# pointing_dir: "/share/home/fangyuedong/test_psf_rot/csst-simulation/workplace/"
pointing_file: "pointing_radec_246.5_40.dat"

# Whether to use MPI
run_option:
  use_mpi: YES
  # NOTE: "n_threads" paramters is currently not used in the backend
  # simulation codes. It should be implemented later in the web frontend
  # in order to config the number of threads to request from NAOC cluster
  n_threads: 80

  # Output catalog only?
  # If yes, no imaging simulation will run
  out_cat_only: NO

  # Only simulate stars?
  star_only: NO

  # Only simulate galaxies?
  galaxy_only: NO

###############################################
# Observation setting
###############################################
obs_setting:

  # Options for survey types:
  # "Photometric": simulate photometric chips only
  # "Spectroscopic": simulate slitless spectroscopic chips only
  # "All": simulate full focal plane
  survey_type: "Spectroscopic"
  
  # Exposure time [seconds]
  exp_time: 150.

  # Observation starting date & time
  # (Subject to change)
  date_obs: "210525" # [yymmdd]
  time_obs: "120000" # [hhmmss]

  # Default Pointing [degrees]
  # Note: NOT valid when a pointing list file is specified
  ra_center: 192.8595
  dec_center:  27.1283

  # Image rotation [degree]
  image_rot: -113.4333

  # Number of calibration pointings
  np_cal: 0

  # Run specific pointing(s):
  # - give a list of indexes of pointings: [ip_1, ip_2...]
  # - run all pointings: null
  # Note: only valid when a pointing list is specified
  run_pointings: null
  
  # Run specific chip(s):
  # - give a list of indexes of chips: [ip_1, ip_2...]
  # - run all chips: null
  # Note: for all pointings
  run_chips: null

  # Whether to enable astrometric modeling
  # astrometric_lib: "libshao.so"
  enable_astrometric_model: True

  # Cut by saturation magnitude in which band?
  cut_in_band: "z"

  # saturation magnitude margin
  mag_sat_margin: -2.5

  # limiting magnitude margin
  mag_lim_margin: +1.0

###############################################
# Input path setting
###############################################

# Default path settings for WIDE survey simulation
input_path:
  cat_dir: "Catalog_C6_20221212"
  star_cat: "C6_MMW_GGC_Astrometry_healpix.hdf5"
  galaxy_cat: "cat2CSSTSim_bundle/"

SED_templates_path:
  star_SED: "Catalog_20210126/SpecLib.hdf5"
  galaxy_SED: "Catalog_C6_20221212/sedlibs/"

###############################################
# PSF setting
###############################################
psf_setting:
  
  # Which PSF model to use:
  # "Gauss": simple gaussian profile
  # "Interp": Interpolated PSF from sampled ray-tracing data
  psf_model: "Interp"

  # PSF size [arcseconds]
  # radius of 80% energy encircled
  # NOTE: only valid for "Gauss" PSF
  psf_rcont: 0.15

  # path to PSF data
  # NOTE: only valid for "Interp" PSF
  psf_dir: "/share/simudata/CSSOSDataProductsSims/data/psfCube"

  # path to field-distortion model
  # Note: only valid when ins_effects: field_dist is "ON"
  fd_path: "FieldDistModelGlobal_v1.0.pickle"
  
  # sigma_spin: 0.0 # psf spin?

###############################################
# Shear setting
###############################################

shear_setting:
  # Options to generate mock shear field:
  # "constant": all galaxies are assigned a constant reduced shear
  # "catalog": from catalog
  # "extra": from seprate file
  shear_type: "catalog"

  # For constant shear filed
  reduced_g1: 0.
  reduced_g2: 0.

  # Representation of the shear vector?
  reShear: "E"

  # rotate galaxy ellipticity
  rotateEll: 0. # [degree]

  # Extra shear catalog
  # (currently not used)
  # shear_cat: "mockShear.cat"

###############################################
# Instrumental effects setting
###############################################
ins_effects:
  # switches
  field_dist:     ON  # Whether to add field distortions
  add_back:       ON  # Whether to add sky background
  add_dark:       ON  # Whether to add dark noise
  add_readout:    ON  # Whether to add read-out (Gaussian) noise
  add_bias:       ON  # Whether to add bias-level to images
  bias_16channel: ON  # Whether to add different biases for 16 channels
  gain_16channel: ON  # Whether to make different gains for 16 channels
  shutter_effect: ON  # Whether to add shutter effect
  flat_fielding:  ON  # Whether to add flat-fielding effect
  prnu_effect:    ON  # Whether to add PRNU effect
  non_linear:     ON  # Whether to add non-linearity
  cosmic_ray:     ON  # Whether to add cosmic-ray
  cray_differ:    ON  # Whether to generate different cosmic ray maps CAL and MS output
  cte_trail:      ON  # Whether to simulate CTE trails
  saturbloom:     ON  # Whether to simulate Saturation & Blooming
  add_badcolumns: ON  # Whether to add bad columns
  add_hotpixels:  ON  # Whether to add hot pixels
  add_deadpixels: ON  # Whether to add dead(dark) pixels
  bright_fatter:  ON  # Whether to simulate Brighter-Fatter (also diffusion) effect

  # values
  dark_exptime:   300   # Exposure time for dark current frames [seconds]
  flat_exptime:   150   # Exposure time for flat-fielding frames [seconds]
  readout_time:   40    # The read-out time for each channel [seconds]
  df_strength:    2.3   # Sillicon sensor diffusion strength
  bias_level:     500   # bias level [e-/pixel]
  gain:           1.1   # Gain
  full_well:      90000 # Full well depth [e-]
  NBias:          1     # Number of bias frames to be exported for each exposure
  NDark:          1     # Number of dark frames to be exported for each exposure
  NFlat:          1     # Number of flat frames to be exported for each exposure

###############################################
# Output options
###############################################
output_setting:
  readout16:      OFF # Whether to export as 16 channels (subimages) with pre- and over-scan
  shutter_output: OFF # Whether to export shutter effect 16-bit image
  bias_output:    ON  # Whether to export bias frames
  dark_output:    ON  # Whether to export the combined dark current files
  flat_output:    ON  # Whether to export the combined flat-fielding files
  prnu_output:    OFF # Whether to export the PRNU (pixel-to-pixel flat-fielding) files

###############################################
# Random seeds
###############################################
random_seeds:
  seed_Av:              121212    # Seed for generating random intrinsic extinction
  seed_poisson:         20210601  # Seed for Poisson noise
  seed_CR:              20210317  # Seed for generating random cosmic ray maps
  seed_flat:            20210101  # Seed for generating random flat fields
  seed_prnu:            20210102  # Seed for photo-response non-uniformity
  seed_gainNonUniform:  20210202  # Seed for gain nonuniformity
  seed_biasNonUniform:  20210203  # Seed for bias nonuniformity
  seed_rnNonUniform:    20210204  # Seed for readout-noise nonuniformity
  seed_badcolumns:      20240309  # Seed for bad columns
  seed_defective:       20210304  # Seed for defective (bad) pixels
  seed_readout:         20210601  # Seed for read-out gaussian noise
...
 No newline at end of file
+64 −48
Original line number Diff line number Diff line
@@ -85,13 +85,11 @@ def fit_SingleGauss(xX, yX, contmX, iHa0):
    return sigmaX, err_sigmaX, fwhmX, err_fwhmX, centerX, err_centerX

def produceObj(x,y,chip, ra, dec, pa):
    pos_img = galsim.PositionD(chip.bound.xmin + x, chip.bound.ymin + y)
    pos_img = galsim.PositionD(x, y)

    param = {}
    param["star"] = 1
    param["id"] = 1
    param["ra"] = chip.img.wcs.posToWorld(pos_img).ra.deg
    param["dec"] = chip.img.wcs.posToWorld(pos_img).dec.deg
    param["z"] = 0
    param["sed_type"] = 1
    param["model_tag"] = 1
@@ -99,7 +97,7 @@ def produceObj(x,y,chip, ra, dec, pa):

    obj = Star(param)

    header_wcs = generateExtensionHeader(
    header_wcs = generateExtensionHeader(chip,
        xlen=chip.npix_x,
        ylen=chip.npix_y,
        ra=ra,
@@ -109,12 +107,21 @@ def produceObj(x,y,chip, ra, dec, pa):
        readout=chip.read_noise,
        dark=chip.dark_noise,
        saturation=90000,
        psize=chip.pix_scale,
        row_num=chip.rowID,
        col_num=chip.colID,
        extName='raw')

    pos_img, offset, local_wcs, _ = obj.getPosImg_Offset_WCS(img=chip.img, chip=chip, img_header=header_wcs)
        pixel_scale=chip.pix_scale,
        pixel_size=chip.pix_size,
        xcen=chip.x_cen,
        ycen=chip.y_cen,
        extName='SCI')

    chip_wcs = galsim.FitsWCS(header=header_wcs)
    param["ra"] = chip_wcs.posToWorld(pos_img).ra.deg
    param["dec"] = chip_wcs.posToWorld(pos_img).dec.deg
    # pos_img, offset, local_wcs, _, _ = obj.getPosImg_Offset_WCS(img=chip.img, chip=chip, img_header=header_wcs)
    pos_img, offset, local_wcs, real_wcs, fd_shear = obj.getPosImg_Offset_WCS(img=chip.img,
                                                                              chip=chip, verbose=False,
                                                                              chip_wcs=chip_wcs, img_header=header_wcs)
    wave = np.arange(2500, 11000.5, 0.5)
    # sedLen = wave.shape[0]
    flux = pow(wave, -2) * 1e8
@@ -276,8 +283,8 @@ class TestSpecDisperse(unittest.TestCase):
        print('Emission line position and shape test')

        self.assertTrue(input_em_lam-center < deltLamda_pix)

        self.assertTrue(fwhmx/deltLamda_pix*pix_scale - psf_fwhm  < np.abs(0.01))
        # print(fwhmx/deltLamda_pix*pix_scale - psf_fwhm)
        self.assertTrue(fwhmx/deltLamda_pix*pix_scale - psf_fwhm  < np.abs(0.02))
        # print('error is ',np.mean((wave_flux[ids][ids1] - sed_i(wave_pix[ids][ids1]))/sed_i(wave_pix[ids][ids1])))
        # self.assertTrue(np.mean((wave_flux[ids][ids1] - sed_i(wave_pix[ids][ids1]))/sed_i(wave_pix[ids][ids1]))<0.004)
        plt.figure()
@@ -388,11 +395,11 @@ class TestSpecDisperse(unittest.TestCase):


    def test_double_disperse(self):
        work_dir = "/public/home/fangyuedong/CSST_unittest/CSST/test/"
        # work_dir = "/public/home/fangyuedong/CSST_unittest/CSST/test/"
        # data_dir = "/Volumes/Extreme SSD/SimData/"
        data_dir = "/data/simudata/CSSOSDataProductsSims/data/"
        configFn = '/Users/zhangxin/Work/SlitlessSim/CSST_SIM/CSST_C6/csst-simulation/config/config_C6.yaml'
        normFilterFn = "/Users/zhangxin/Work/SlitlessSim/CSST_SIM/CSST_C6/csst-simulation/Catalog/data/SLOAN_SDSS.g.fits"
        # data_dir = "/data/simudata/CSSOSDataProductsSims/data/"
        configFn = 'config_C6.yaml'
        normFilterFn = "SLOAN_SDSS.g.fits"
        norm_star = Table.read(normFilterFn)
        with open(configFn, "r") as stream:
            try:
@@ -422,6 +429,7 @@ class TestSpecDisperse(unittest.TestCase):
        chip.img.wcs = wcs_fp

        obj, pos_img = produceObj(2000,4500, chip,float(config["obs_setting"]["ra_center"]), float(config["obs_setting"]["dec_center"]), float(config["obs_setting"]["image_rot"]))
        # print(pos_img,chip.pix_scale)
        obj.drawObj_slitless(
            tel=tel,
            pos_img=pos_img,
@@ -470,7 +478,7 @@ class TestSpecDisperse(unittest.TestCase):

    def test_SLSImage_rotation(self):
        from astropy.wcs import WCS
        configFn = '/Users/zhangxin/Work/SlitlessSim/CSST_SIM/CSST_C6/csst-simulation/config/config_C6.yaml'
        configFn = 'config_C6.yaml'

        with open(configFn, "r") as stream:
            try:
@@ -485,7 +493,8 @@ class TestSpecDisperse(unittest.TestCase):
        dec=float(config["obs_setting"]["dec_center"])
        pa=float(config["obs_setting"]["image_rot"])

        header_wcs1 = generateExtensionHeader(
        chip.rotate_angle = 0
        header_wcs1 = generateExtensionHeader(chip,
            xlen=chip.npix_x,
            ylen=chip.npix_y,
            ra=ra,
@@ -495,18 +504,19 @@ class TestSpecDisperse(unittest.TestCase):
            readout=chip.read_noise,
            dark=chip.dark_noise,
            saturation=90000,
            psize=chip.pix_scale,
            pixel_scale=chip.pix_scale,
            row_num=chip.rowID,
            col_num=chip.colID,
            extName='raw', center_rot=0)
            extName='raw')

        center = np.array([chip.npix_x / 2, chip.npix_y / 2])
        h_wcs1 = WCS(header_wcs1)
        x1, y1 = center + [100,0]
        sky_1 = h_wcs1.pixel_to_world(x1,y1)

        chip = Chip(1, config=config)
        rot_angle = 1
        header_wcs2 = generateExtensionHeader(
        chip.rotate_angle = rot_angle
        header_wcs2 = generateExtensionHeader(chip,
            xlen=chip.npix_x,
            ylen=chip.npix_y,
            ra=ra,
@@ -516,19 +526,21 @@ class TestSpecDisperse(unittest.TestCase):
            readout=chip.read_noise,
            dark=chip.dark_noise,
            saturation=90000,
            psize=chip.pix_scale,
            pixel_scale=chip.pix_scale,
            row_num=chip.rowID,
            col_num=chip.colID,
            extName='raw', center_rot=rot_angle)
            extName='raw')

        h_wcs2 = WCS(header_wcs2)
        x2, y2 = h_wcs2.world_to_pixel(sky_1)
        angle = getAngle132(x1,y1,0,x2,y2,0,center[0],center[1],0)
        print(angle)
        self.assertTrue(rot_angle - angle < np.abs(0.001))

        # print("rotation angle:" ,rot_angle ,chip.rotate_angle, angle)
        # self.assertTrue(rot_angle - angle < np.abs(0.001))

        rot_angle = 10
        header_wcs2 = generateExtensionHeader(
        chip.rotate_angle =  rot_angle
        header_wcs2 = generateExtensionHeader(chip,
            xlen=chip.npix_x,
            ylen=chip.npix_y,
            ra=ra,
@@ -538,19 +550,20 @@ class TestSpecDisperse(unittest.TestCase):
            readout=chip.read_noise,
            dark=chip.dark_noise,
            saturation=90000,
            psize=chip.pix_scale,
            pixel_scale=chip.pix_scale,
            row_num=chip.rowID,
            col_num=chip.colID,
            extName='raw', center_rot=rot_angle)
            extName='raw')

        h_wcs2 = WCS(header_wcs2)
        x2, y2 = h_wcs2.world_to_pixel(sky_1)
        angle = getAngle132(x1, y1, 0, x2, y2, 0, center[0], center[1], 0)
        print(angle)
        # print("rotation angle:", rot_angle, chip.rotate_angle, angle)
        self.assertTrue(rot_angle - angle < np.abs(0.001))

        rot_angle = 50
        header_wcs2 = generateExtensionHeader(
        chip.rotate_angle = rot_angle
        header_wcs2 = generateExtensionHeader(chip,
            xlen=chip.npix_x,
            ylen=chip.npix_y,
            ra=ra,
@@ -560,15 +573,15 @@ class TestSpecDisperse(unittest.TestCase):
            readout=chip.read_noise,
            dark=chip.dark_noise,
            saturation=90000,
            psize=chip.pix_scale,
            pixel_scale=chip.pix_scale,
            row_num=chip.rowID,
            col_num=chip.colID,
            extName='raw', center_rot=rot_angle)
            extName='raw')

        h_wcs2 = WCS(header_wcs2)
        x2, y2 = h_wcs2.world_to_pixel(sky_1)
        angle = getAngle132(x1, y1, 0, x2, y2, 0, center[0], center[1], 0)
        print(angle)
        # print(rot_angle - angle)
        self.assertTrue(rot_angle - angle < np.abs(0.001))


@@ -577,8 +590,8 @@ class TestSpecDisperse(unittest.TestCase):
        ra = float(config["obs_setting"]["ra_center"])
        dec = float(config["obs_setting"]["dec_center"])
        pa = float(config["obs_setting"]["image_rot"])

        header_wcs1 = generateExtensionHeader(
        chip.rotate_angle = 0
        header_wcs1 = generateExtensionHeader(chip,
            xlen=chip.npix_x,
            ylen=chip.npix_y,
            ra=ra,
@@ -588,10 +601,10 @@ class TestSpecDisperse(unittest.TestCase):
            readout=chip.read_noise,
            dark=chip.dark_noise,
            saturation=90000,
            psize=chip.pix_scale,
            pixel_scale=chip.pix_scale,
            row_num=chip.rowID,
            col_num=chip.colID,
            extName='raw', center_rot=0)
            extName='raw')

        center = np.array([chip.npix_x / 2, chip.npix_y / 2])
        h_wcs1 = WCS(header_wcs1)
@@ -599,7 +612,8 @@ class TestSpecDisperse(unittest.TestCase):
        sky_1 = h_wcs1.pixel_to_world(x1, y1)

        rot_angle = 1
        header_wcs2 = generateExtensionHeader(
        chip.rotate_angle = rot_angle
        header_wcs2 = generateExtensionHeader(chip,
            xlen=chip.npix_x,
            ylen=chip.npix_y,
            ra=ra,
@@ -609,19 +623,20 @@ class TestSpecDisperse(unittest.TestCase):
            readout=chip.read_noise,
            dark=chip.dark_noise,
            saturation=90000,
            psize=chip.pix_scale,
            pixel_scale=chip.pix_scale,
            row_num=chip.rowID,
            col_num=chip.colID,
            extName='raw', center_rot=rot_angle)
            extName='raw')

        h_wcs2 = WCS(header_wcs2)
        x2, y2 = h_wcs2.world_to_pixel(sky_1)
        angle = getAngle132(x1, y1, 0, x2, y2, 0, center[0], center[1], 0)
        print(angle)
        # print(rot_angle - angle)
        self.assertTrue(rot_angle - angle < np.abs(0.001))

        rot_angle = 10
        header_wcs2 = generateExtensionHeader(
        chip.rotate_angle = rot_angle
        header_wcs2 = generateExtensionHeader(chip,
            xlen=chip.npix_x,
            ylen=chip.npix_y,
            ra=ra,
@@ -631,19 +646,20 @@ class TestSpecDisperse(unittest.TestCase):
            readout=chip.read_noise,
            dark=chip.dark_noise,
            saturation=90000,
            psize=chip.pix_scale,
            pixel_scale=chip.pix_scale,
            row_num=chip.rowID,
            col_num=chip.colID,
            extName='raw', center_rot=rot_angle)
            extName='raw')

        h_wcs2 = WCS(header_wcs2)
        x2, y2 = h_wcs2.world_to_pixel(sky_1)
        angle = getAngle132(x1, y1, 0, x2, y2, 0, center[0], center[1], 0)
        print(angle)
        # print(rot_angle - angle)
        self.assertTrue(rot_angle - angle < np.abs(0.001))

        rot_angle = 50
        header_wcs2 = generateExtensionHeader(
        chip.rotate_angle = rot_angle
        header_wcs2 = generateExtensionHeader(chip,
            xlen=chip.npix_x,
            ylen=chip.npix_y,
            ra=ra,
@@ -653,15 +669,15 @@ class TestSpecDisperse(unittest.TestCase):
            readout=chip.read_noise,
            dark=chip.dark_noise,
            saturation=90000,
            psize=chip.pix_scale,
            pixel_scale=chip.pix_scale,
            row_num=chip.rowID,
            col_num=chip.colID,
            extName='raw', center_rot=rot_angle)
            extName='raw')

        h_wcs2 = WCS(header_wcs2)
        x2, y2 = h_wcs2.world_to_pixel(sky_1)
        angle = getAngle132(x1, y1, 0, x2, y2, 0, center[0], center[1], 0)
        print(angle)
        # print(rot_angle - angle)
        self.assertTrue(rot_angle - angle < np.abs(0.001))