Commit df22b3b0 authored by Fang Yuedong's avatar Fang Yuedong
Browse files

Merge branch 'master' into 'release_v3.0'

Release version v3.2.0

See merge request !33
parents 1b4f4012 428f2c1e
...@@ -79,7 +79,7 @@ for iobj in range(nobj): ...@@ -79,7 +79,7 @@ for iobj in range(nobj):
if True: if True:
fn = "psf_{:}.{:}.{:}.fits".format(chipID, iobj, i) fn = "psf_{:}.{:}.{:}.fits".format(chipID, iobj, i)
if fn != None: if fn is not None:
if os.path.exists(fn): if os.path.exists(fn):
os.remove(fn) os.remove(fn)
hdu = fitsio.PrimaryHDU() hdu = fitsio.PrimaryHDU()
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# get_pointing # get_pointing
# PURPOSE: # PURPOSE:
# Return the pointing of CSST from a given [ra, dec] # Return the pointing of CSST from a given [ra, dec]
# CALLING: # CALLING:
# pointing = findPointingbyChipID(chipID=tchip, ra=tra, dec=tdec) # pointing = findPointingbyChipID(chipID=tchip, ra=tra, dec=tdec)
# INPUTS: # INPUTS:
# chipID - chip-# of CSST, int # chipID - chip-# of CSST, int
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
# HISTORY: # HISTORY:
# Written by Xin Zhang, 23 Apr. 2023 # Written by Xin Zhang, 23 Apr. 2023
# Included by csst-simulation, C.W. 25 Apr. 2023 # Included by csst-simulation, C.W. 25 Apr. 2023
# #
# #
from tkinter.tix import INTEGER from tkinter.tix import INTEGER
import astropy.coordinates as coord import astropy.coordinates as coord
...@@ -25,6 +25,7 @@ import galsim ...@@ -25,6 +25,7 @@ import galsim
import math import math
# from numba import jit # from numba import jit
class Chip(object): class Chip(object):
def __init__(self, chipID): def __init__(self, chipID):
self.chipID = chipID self.chipID = chipID
...@@ -41,9 +42,9 @@ class Chip(object): ...@@ -41,9 +42,9 @@ class Chip(object):
self.npix_x = 9216 self.npix_x = 9216
self.npix_y = 9232 self.npix_y = 9232
self.pix_scale = 0.074 self.pix_scale = 0.074
def getTanWCS(self, ra, dec, img_rot, pix_scale = None, xcen=None, ycen=None, logger=None): def getTanWCS(self, ra, dec, img_rot, pix_scale=None, xcen=None, ycen=None, logger=None):
""" Get the WCS of the image mosaic using Gnomonic/TAN projection """ Get the WCS of the image mosaic using Gnomonic/TAN projection
Parameter: Parameter:
...@@ -57,11 +58,12 @@ class Chip(object): ...@@ -57,11 +58,12 @@ class Chip(object):
WCS of the focal plane WCS of the focal plane
""" """
if logger is not None: if logger is not None:
logger.info(" Construct the wcs of the entire image mosaic using Gnomonic/TAN projection") logger.info(
if (xcen == None) or (ycen == None): " Construct the wcs of the entire image mosaic using Gnomonic/TAN projection")
if (xcen is None) or (ycen is None):
xcen = self.cen_pix_x xcen = self.cen_pix_x
ycen = self.cen_pix_y ycen = self.cen_pix_y
if pix_scale == None: if pix_scale is None:
pix_scale = self.pix_scale pix_scale = self.pix_scale
# dudx = -np.cos(img_rot.rad) * pix_scale # dudx = -np.cos(img_rot.rad) * pix_scale
# dudy = -np.sin(img_rot.rad) * pix_scale # dudy = -np.sin(img_rot.rad) * pix_scale
...@@ -72,23 +74,24 @@ class Chip(object): ...@@ -72,23 +74,24 @@ class Chip(object):
dudy = +np.sin(img_rot.rad) * pix_scale dudy = +np.sin(img_rot.rad) * pix_scale
dvdx = -np.sin(img_rot.rad) * pix_scale dvdx = -np.sin(img_rot.rad) * pix_scale
dvdy = -np.cos(img_rot.rad) * pix_scale dvdy = -np.cos(img_rot.rad) * pix_scale
# dudx = +np.sin(img_rot.rad) * pix_scale # dudx = +np.sin(img_rot.rad) * pix_scale
# dudy = +np.cos(img_rot.rad) * pix_scale # dudy = +np.cos(img_rot.rad) * pix_scale
# dvdx = -np.cos(img_rot.rad) * pix_scale # dvdx = -np.cos(img_rot.rad) * pix_scale
# dvdy = +np.sin(img_rot.rad) * pix_scale # dvdy = +np.sin(img_rot.rad) * pix_scale
moscen = galsim.PositionD(x=xcen, y=ycen) moscen = galsim.PositionD(x=xcen, y=ycen)
sky_center = galsim.CelestialCoord(ra=ra*galsim.degrees, dec=dec*galsim.degrees) sky_center = galsim.CelestialCoord(
ra=ra*galsim.degrees, dec=dec*galsim.degrees)
affine = galsim.AffineTransform(dudx, dudy, dvdx, dvdy, origin=moscen) affine = galsim.AffineTransform(dudx, dudy, dvdx, dvdy, origin=moscen)
WCS = galsim.TanWCS(affine, sky_center, units=galsim.arcsec) WCS = galsim.TanWCS(affine, sky_center, units=galsim.arcsec)
return WCS return WCS
def getChipRowCol(self, chipID): def getChipRowCol(self, chipID):
rowID = ((chipID - 1) % 5) + 1 rowID = ((chipID - 1) % 5) + 1
colID = 6 - ((chipID - 1) // 5) colID = 6 - ((chipID - 1) // 5)
return rowID, colID return rowID, colID
def getChipCenter(self): def getChipCenter(self):
"""Calculate the edges in pixel for a given CCD chip on the focal plane """Calculate the edges in pixel for a given CCD chip on the focal plane
NOTE: There are 5*4 CCD chips in the focus plane for photometric observation. NOTE: There are 5*4 CCD chips in the focus plane for photometric observation.
...@@ -99,8 +102,6 @@ class Chip(object): ...@@ -99,8 +102,6 @@ class Chip(object):
A galsim BoundsD object A galsim BoundsD object
""" """
chipID = self.chipID chipID = self.chipID
rowID, colID = self.getChipRowCol(chipID) rowID, colID = self.getChipRowCol(chipID)
...@@ -125,37 +126,42 @@ class Chip(object): ...@@ -125,37 +126,42 @@ class Chip(object):
return galsim.PositionD(xcen, ycen) return galsim.PositionD(xcen, ycen)
def transRaDec2D(ra, dec): def transRaDec2D(ra, dec):
x1 = np.cos(dec / 57.2957795) * np.cos(ra / 57.2957795); x1 = np.cos(dec / 57.2957795) * np.cos(ra / 57.2957795)
y1 = np.cos(dec / 57.2957795) * np.sin(ra / 57.2957795); y1 = np.cos(dec / 57.2957795) * np.sin(ra / 57.2957795)
z1 = np.sin(dec / 57.2957795); z1 = np.sin(dec / 57.2957795)
return np.array([x1, y1, z1]) return np.array([x1, y1, z1])
def getobsPA(ra, dec): def getobsPA(ra, dec):
l1 = np.array([0,0,1]) l1 = np.array([0, 0, 1])
l2 = transRaDec2D(ra, dec) l2 = transRaDec2D(ra, dec)
polar_ec = coord.SkyCoord(0*u.degree, 90*u.degree,frame='barycentrictrueecliptic') polar_ec = coord.SkyCoord(0*u.degree, 90*u.degree,
frame='barycentrictrueecliptic')
polar_eq = polar_ec.transform_to('icrs') polar_eq = polar_ec.transform_to('icrs')
# print(polar_eq.ra.value,polar_eq.dec.value) # print(polar_eq.ra.value,polar_eq.dec.value)
polar_d = transRaDec2D(polar_eq.ra.value, polar_eq.dec.value) polar_d = transRaDec2D(polar_eq.ra.value, polar_eq.dec.value)
l1l2cross = np.cross(l2,l1) l1l2cross = np.cross(l2, l1)
pdl2cross = np.cross(l2,polar_d) pdl2cross = np.cross(l2, polar_d)
angle = math.acos(np.dot(l1l2cross,pdl2cross)/(np.linalg.norm(l1l2cross)*np.linalg.norm(pdl2cross))) angle = math.acos(np.dot(l1l2cross, pdl2cross) /
(np.linalg.norm(l1l2cross)*np.linalg.norm(pdl2cross)))
angle = (angle)/math.pi*180 angle = (angle)/math.pi*180
angle = angle + 90 angle = angle + 90
if (ra<90 or ra> 270): if (ra < 90 or ra > 270):
angle=-angle angle = -angle
return angle return angle
# @jit() # @jit()
def getSelectPointingList(center = [60,-40], radius = 2):
def getSelectPointingList(center=[60, -40], radius=2):
points = np.loadtxt('sky.dat') points = np.loadtxt('sky.dat')
center = center # ra dec
center = center#ra dec radius = radius # degree
radius = radius # degree
radii_dec = 1 radii_dec = 1
radii_ra = 1/math.cos(math.pi*center[1]/180) radii_ra = 1/math.cos(math.pi*center[1]/180)
...@@ -163,7 +169,8 @@ def getSelectPointingList(center = [60,-40], radius = 2): ...@@ -163,7 +169,8 @@ def getSelectPointingList(center = [60,-40], radius = 2):
if radii_ra > 180: if radii_ra > 180:
radii_ra = 180 radii_ra = 180
c_eclip = coord.SkyCoord(points[:,2]*u.degree, points[:,1]*u.degree,frame='barycentrictrueecliptic') c_eclip = coord.SkyCoord(
points[:, 2]*u.degree, points[:, 1]*u.degree, frame='barycentrictrueecliptic')
c_equtor = c_eclip.transform_to('icrs') c_equtor = c_eclip.transform_to('icrs')
# print(np.min((c_equtor.ra*u.degree).value), np.max((c_equtor.ra*u.degree).value)) # print(np.min((c_equtor.ra*u.degree).value), np.max((c_equtor.ra*u.degree).value))
...@@ -174,13 +181,15 @@ def getSelectPointingList(center = [60,-40], radius = 2): ...@@ -174,13 +181,15 @@ def getSelectPointingList(center = [60,-40], radius = 2):
ra_range_lo = center[0]-radii_ra ra_range_lo = center[0]-radii_ra
ra_range_hi = center[0]+radii_ra ra_range_hi = center[0]+radii_ra
if ra_range_lo< 0: if ra_range_lo < 0:
ids1 = ((c_equtor.ra*u.degree).value<ra_range_hi) | ((c_equtor.ra*u.degree).value>360+ra_range_lo) ids1 = ((c_equtor.ra*u.degree).value <
ra_range_hi) | ((c_equtor.ra*u.degree).value > 360+ra_range_lo)
elif ra_range_hi > 360: elif ra_range_hi > 360:
ids1 = ((c_equtor.ra*u.degree).value>ra_range_lo) | ((c_equtor.ra*u.degree).value<ra_range_hi-360) ids1 = ((c_equtor.ra*u.degree).value >
ra_range_lo) | ((c_equtor.ra*u.degree).value < ra_range_hi-360)
else: else:
ids1 = ((c_equtor.ra*u.degree).value > ra_range_lo) & ((c_equtor.ra*u.degree).value < ra_range_hi) ids1 = ((c_equtor.ra*u.degree).value >
ra_range_lo) & ((c_equtor.ra*u.degree).value < ra_range_hi)
dec_range_lo = center[1]-radii_dec dec_range_lo = center[1]-radii_dec
if center[1]-radii_dec < -90: if center[1]-radii_dec < -90:
...@@ -189,7 +198,7 @@ def getSelectPointingList(center = [60,-40], radius = 2): ...@@ -189,7 +198,7 @@ def getSelectPointingList(center = [60,-40], radius = 2):
dec_range_hi = center[1]+radii_dec dec_range_hi = center[1]+radii_dec
if center[1]+radii_dec > 90: if center[1]+radii_dec > 90:
dec_range_hi = 90 dec_range_hi = 90
ids3 = (c_equtor[ids1].dec*u.degree).value > dec_range_lo ids3 = (c_equtor[ids1].dec*u.degree).value > dec_range_lo
ids4 = (c_equtor[ids1][ids3].dec*u.degree).value < dec_range_hi ids4 = (c_equtor[ids1][ids3].dec*u.degree).value < dec_range_hi
...@@ -198,25 +207,24 @@ def getSelectPointingList(center = [60,-40], radius = 2): ...@@ -198,25 +207,24 @@ def getSelectPointingList(center = [60,-40], radius = 2):
p_result = np.zeros([num, 5]) p_result = np.zeros([num, 5])
i = 0 i = 0
for p,p_ in zip(points[ids1][ids3][ids4],c_equtor[ids1][ids3][ids4]): for p, p_ in zip(points[ids1][ids3][ids4], c_equtor[ids1][ids3][ids4]):
ra = (p_.ra*u.degree).value ra = (p_.ra*u.degree).value
dec = (p_.dec*u.degree).value dec = (p_.dec*u.degree).value
# print(ra, dec) # print(ra, dec)
lon = p[2] lon = p[2]
lat = p[1] lat = p[1]
p_result[i,0] = ra p_result[i, 0] = ra
p_result[i,1] = dec p_result[i, 1] = dec
p_result[i,2] = lon p_result[i, 2] = lon
p_result[i,3] = lat p_result[i, 3] = lat
p_result[i,4] = getobsPA(ra, dec) + 90 p_result[i, 4] = getobsPA(ra, dec) + 90
i = i + 1 i = i + 1
return p_result
return p_result
def findPointingbyChipID(chipID = 8, ra = 60., dec = -40.): def findPointingbyChipID(chipID=8, ra=60., dec=-40.):
"""_summary_ """_summary_
Args: Args:
...@@ -226,9 +234,9 @@ def findPointingbyChipID(chipID = 8, ra = 60., dec = -40.): ...@@ -226,9 +234,9 @@ def findPointingbyChipID(chipID = 8, ra = 60., dec = -40.):
Returns: Returns:
_type_: [ra, dec, rotation angle] _type_: [ra, dec, rotation angle]
""" """
chip_center = [ra, dec] chip_center = [ra, dec]
p_list = getSelectPointingList(center = chip_center) p_list = getSelectPointingList(center=chip_center)
pchip = Chip(chipID) pchip = Chip(chipID)
p_num = p_list.shape[0] p_num = p_list.shape[0]
...@@ -238,10 +246,10 @@ def findPointingbyChipID(chipID = 8, ra = 60., dec = -40.): ...@@ -238,10 +246,10 @@ def findPointingbyChipID(chipID = 8, ra = 60., dec = -40.):
r_ra = ra r_ra = ra
r_dec = dec r_dec = dec
r_rot = 0. r_rot = 0.
for i in np.arange(0,p_num,1): for i in np.arange(0, p_num, 1):
ra_n = p_list[i,0] ra_n = p_list[i, 0]
dec_n = p_list[i,1] dec_n = p_list[i, 1]
rot = p_list[i,4]*galsim.degrees rot = p_list[i, 4]*galsim.degrees
chip_wcs = pchip.getTanWCS(ra_n, dec_n, rot) chip_wcs = pchip.getTanWCS(ra_n, dec_n, rot)
c_center = pchip.getChipCenter() c_center = pchip.getChipCenter()
...@@ -257,15 +265,14 @@ def findPointingbyChipID(chipID = 8, ra = 60., dec = -40.): ...@@ -257,15 +265,14 @@ def findPointingbyChipID(chipID = 8, ra = 60., dec = -40.):
r_ra = ra_n r_ra = ra_n
r_dec = dec_n r_dec = dec_n
r_rot = rot.deg r_rot = rot.deg
if min_d == max_value: if min_d == max_value:
print("RA:%f,Dec:%f不在指向范围内,请于巡天规划序列比对!!!!!"%(ra, dec)) print("RA:%f,Dec:%f不在指向范围内,请于巡天规划序列比对!!!!!" % (ra, dec))
return [r_ra, r_dec , r_rot] return [r_ra, r_dec, r_rot]
if __name__ == "__main__": if __name__ == "__main__":
tchip, tra, tdec = 13, 60., -40. tchip, tra, tdec = 13, 60., -40.
pointing = findPointingbyChipID(chipID=tchip, ra=tra, dec=tdec) pointing = findPointingbyChipID(chipID=tchip, ra=tra, dec=tdec)
print("[ra_center, dec_center, image_rot]: ", pointing) print("[ra_center, dec_center, image_rot]: ", pointing)
from pylab import * from pylab import *
import math, sys, numpy as np import math
import sys
import numpy as np
import astropy.coordinates as coord import astropy.coordinates as coord
from astropy.coordinates import SkyCoord from astropy.coordinates import SkyCoord
from astropy import wcs, units as u from astropy import wcs, units as u
...@@ -14,8 +16,9 @@ def transRaDec2D(ra, dec): ...@@ -14,8 +16,9 @@ def transRaDec2D(ra, dec):
z1 = np.sin(dec / 57.2957795) z1 = np.sin(dec / 57.2957795)
return np.array([x1, y1, z1]) return np.array([x1, y1, z1])
def ecl2radec(lon_ecl, lat_ecl): def ecl2radec(lon_ecl, lat_ecl):
## convert from ecliptic coordinates to equatorial coordinates # convert from ecliptic coordinates to equatorial coordinates
c_ecl = SkyCoord( c_ecl = SkyCoord(
lon=lon_ecl * u.degree, lat=lat_ecl * u.degree, frame="barycentrictrueecliptic" lon=lon_ecl * u.degree, lat=lat_ecl * u.degree, frame="barycentrictrueecliptic"
) )
...@@ -25,25 +28,26 @@ def ecl2radec(lon_ecl, lat_ecl): ...@@ -25,25 +28,26 @@ def ecl2radec(lon_ecl, lat_ecl):
def radec2ecl(ra, dec): def radec2ecl(ra, dec):
## convert from equatorial coordinates to ecliptic coordinates # convert from equatorial coordinates to ecliptic coordinates
c_eq = SkyCoord(ra=ra * u.degree, dec=dec * u.degree, frame="icrs") c_eq = SkyCoord(ra=ra * u.degree, dec=dec * u.degree, frame="icrs")
c_ecl = c_eq.transform_to("barycentrictrueecliptic") c_ecl = c_eq.transform_to("barycentrictrueecliptic")
lon_ecl, lat_ecl = c_ecl.lon.degree, c_ecl.lat.degree lon_ecl, lat_ecl = c_ecl.lon.degree, c_ecl.lat.degree
return lon_ecl, lat_ecl return lon_ecl, lat_ecl
def cal_FoVcenter_1P_equatorial(ra_FieldCenter, dec_FieldCenter, chipID = 1, pa = -23.5):
### [ra_FieldCenter, dec_FieldCenter] is the center ra, dec of calibration fileds, such as: NEP, NGC 6397, etc. def cal_FoVcenter_1P_equatorial(ra_FieldCenter, dec_FieldCenter, chipID=1, pa=-23.5):
### [ra_ChipCenter, dec_ChipCenter] is the center ra, dec of the Chip center.
### [ra_PointCenter, dec_PointCenter] is the telescope pointing center. # [ra_FieldCenter, dec_FieldCenter] is the center ra, dec of calibration fileds, such as: NEP, NGC 6397, etc.
## Calculate PA angle # [ra_ChipCenter, dec_ChipCenter] is the center ra, dec of the Chip center.
# [ra_PointCenter, dec_PointCenter] is the telescope pointing center.
# Calculate PA angle
chip = Chip(chipID) chip = Chip(chipID)
h_ext = ImageHeader.generateExtensionHeader( h_ext = ImageHeader.generateExtensionHeader(
chip=chip, chip=chip,
xlen=chip.npix_x, xlen=chip.npix_x,
ylen=chip.npix_y, ylen=chip.npix_y,
ra=(ra_FieldCenter * u.degree).value, ra=(ra_FieldCenter * u.degree).value,
dec=(dec_FieldCenter * u.degree).value, dec=(dec_FieldCenter * u.degree).value,
pa=pa, pa=pa,
gain=chip.gain, gain=chip.gain,
...@@ -54,7 +58,7 @@ def cal_FoVcenter_1P_equatorial(ra_FieldCenter, dec_FieldCenter, chipID = 1, pa ...@@ -54,7 +58,7 @@ def cal_FoVcenter_1P_equatorial(ra_FieldCenter, dec_FieldCenter, chipID = 1, pa
pixel_size=chip.pix_size, pixel_size=chip.pix_size,
xcen=chip.x_cen, xcen=chip.x_cen,
ycen=chip.y_cen, ycen=chip.y_cen,
) )
# assume that the telescope point to the sky center; then abtain the chip center under this situation; then calculate the differenc between the assumed telescope center and chip center; then add this difference to the sky center # assume that the telescope point to the sky center; then abtain the chip center under this situation; then calculate the differenc between the assumed telescope center and chip center; then add this difference to the sky center
...@@ -75,24 +79,25 @@ def cal_FoVcenter_1P_equatorial(ra_FieldCenter, dec_FieldCenter, chipID = 1, pa ...@@ -75,24 +79,25 @@ def cal_FoVcenter_1P_equatorial(ra_FieldCenter, dec_FieldCenter, chipID = 1, pa
return ra_PointCenter, dec_PointCenter, lon_ecl_PointCenter, lat_ecl_PointCenter return ra_PointCenter, dec_PointCenter, lon_ecl_PointCenter, lat_ecl_PointCenter
def cal_FoVcenter_1P_ecliptic(lon_ecl_FieldCenter, lat_ecl_FieldCenter, chipID = 1, pa = -23.5):
### [ra_FieldCenter, dec_FieldCenter] is the center ra, dec of calibration fileds, such as: NEP, NGC 6397, etc. def cal_FoVcenter_1P_ecliptic(lon_ecl_FieldCenter, lat_ecl_FieldCenter, chipID=1, pa=-23.5):
### [ra_ChipCenter, dec_ChipCenter] is the center ra, dec of the Chip center.
### [ra_PointCenter, dec_PointCenter] is the telescope pointing center. # [ra_FieldCenter, dec_FieldCenter] is the center ra, dec of calibration fileds, such as: NEP, NGC 6397, etc.
# [ra_ChipCenter, dec_ChipCenter] is the center ra, dec of the Chip center.
# [ra_PointCenter, dec_PointCenter] is the telescope pointing center.
ra_FieldCenter, dec_FieldCenter = ecl2radec( ra_FieldCenter, dec_FieldCenter = ecl2radec(
lon_ecl_FieldCenter, lat_ecl_FieldCenter lon_ecl_FieldCenter, lat_ecl_FieldCenter
) )
## Calculate PA angle # Calculate PA angle
chip = Chip(chipID) chip = Chip(chipID)
h_ext = ImageHeader.generateExtensionHeader( h_ext = ImageHeader.generateExtensionHeader(
chip=chip, chip=chip,
xlen=chip.npix_x, xlen=chip.npix_x,
ylen=chip.npix_y, ylen=chip.npix_y,
ra=(ra_FieldCenter * u.degree).value, ra=(ra_FieldCenter * u.degree).value,
dec=(dec_FieldCenter * u.degree).value, dec=(dec_FieldCenter * u.degree).value,
pa=pa, pa=pa,
gain=chip.gain, gain=chip.gain,
...@@ -103,7 +108,7 @@ def cal_FoVcenter_1P_ecliptic(lon_ecl_FieldCenter, lat_ecl_FieldCenter, chipID = ...@@ -103,7 +108,7 @@ def cal_FoVcenter_1P_ecliptic(lon_ecl_FieldCenter, lat_ecl_FieldCenter, chipID =
pixel_size=chip.pix_size, pixel_size=chip.pix_size,
xcen=chip.x_cen, xcen=chip.x_cen,
ycen=chip.y_cen, ycen=chip.y_cen,
) )
# assume that the telescope point to the sky center; then abtain the chip center under this situation; then calculate the differenc between the assumed telescope center and chip center; then add this difference to the sky center # assume that the telescope point to the sky center; then abtain the chip center under this situation; then calculate the differenc between the assumed telescope center and chip center; then add this difference to the sky center
...@@ -124,14 +129,15 @@ def cal_FoVcenter_1P_ecliptic(lon_ecl_FieldCenter, lat_ecl_FieldCenter, chipID = ...@@ -124,14 +129,15 @@ def cal_FoVcenter_1P_ecliptic(lon_ecl_FieldCenter, lat_ecl_FieldCenter, chipID =
return ra_PointCenter, dec_PointCenter, lon_ecl_PointCenter, lat_ecl_PointCenter return ra_PointCenter, dec_PointCenter, lon_ecl_PointCenter, lat_ecl_PointCenter
def getChipCenterRaDec(chipID = 1, p_ra = 60., p_dec = -40.):
def getChipCenterRaDec(chipID=1, p_ra=60., p_dec=-40.):
chip = Chip(chipID) chip = Chip(chipID)
h_ext = ImageHeader.generateExtensionHeader( h_ext = ImageHeader.generateExtensionHeader(
chip=chip, chip=chip,
xlen=chip.npix_x, xlen=chip.npix_x,
ylen=chip.npix_y, ylen=chip.npix_y,
ra=(p_ra * u.degree).value, ra=(p_ra * u.degree).value,
dec=(p_dec * u.degree).value, dec=(p_dec * u.degree).value,
pa=pa, pa=pa,
gain=chip.gain, gain=chip.gain,
...@@ -142,24 +148,25 @@ def getChipCenterRaDec(chipID = 1, p_ra = 60., p_dec = -40.): ...@@ -142,24 +148,25 @@ def getChipCenterRaDec(chipID = 1, p_ra = 60., p_dec = -40.):
pixel_size=chip.pix_size, pixel_size=chip.pix_size,
xcen=chip.x_cen, xcen=chip.x_cen,
ycen=chip.y_cen, ycen=chip.y_cen,
) )
wcs_h = wcs.WCS(h_ext) wcs_h = wcs.WCS(h_ext)
pixs = np.array([[4608, 4616]]) pixs = np.array([[4608, 4616]])
world_point = wcs_h.wcs_pix2world(pixs, 0) world_point = wcs_h.wcs_pix2world(pixs, 0)
RA_chip, Dec_chip = world_point[0][0], world_point[0][1] RA_chip, Dec_chip = world_point[0][0], world_point[0][1]
return RA_chip, Dec_chip return RA_chip, Dec_chip
if __name__ == '__main__': if __name__ == '__main__':
ra_input, dec_input = 270.00000, 66.56000 # NEP ra_input, dec_input = 270.00000, 66.56000 # NEP
pa = 23.5 pa = 23.5
# chipid = 2 # chipid = 2
for chipid in np.arange(1,31,1): for chipid in np.arange(1, 31, 1):
ra, dec, lon_ecl, lat_ecl = cal_FoVcenter_1P_equatorial( ra, dec, lon_ecl, lat_ecl = cal_FoVcenter_1P_equatorial(
ra_input, dec_input,chipID=chipid, pa=pa) ra_input, dec_input, chipID=chipid, pa=pa)
print("chip id is %d, chip center [ra,dec] is [%f, %f], pointing center calculated [ra,dec] is [%f, %f]"%(chipid, ra_input, dec_input, ra, dec)) print("chip id is %d, chip center [ra,dec] is [%f, %f], pointing center calculated [ra,dec] is [%f, %f]" % (
#for check the result chipid, ra_input, dec_input, ra, dec))
# for check the result
# testRA, testDec = getChipCenterRaDec(chipID = chipid, p_ra = ra, p_dec = dec) # testRA, testDec = getChipCenterRaDec(chipID = chipid, p_ra = ra, p_dec = dec)
# print(ra_input-testRA, dec_input-testDec) # print(ra_input-testRA, dec_input-testDec)
from flask import Flask, render_template, request, redirect
import yaml
import ast
app = Flask(__name__)
key_type_map = {
'obs_type': str,
'obs_type_code': str,
'obs_id': str,
'run_chips': list,
'call_sequence': {
'scie_obs': {
'shutter_effect': bool,
'flat_fielding': bool,
'field_dist': bool,
},
'sky_background': {
'shutter_effect': bool,
'flat_fielding': bool,
'enable_straylight_model': bool,
'flat_level': None,
'flat_level_filt': None,
},
'PRNU_effect': {},
'cosmic_rays': {
'save_cosmic_img': bool,
},
'poisson_and_dark': {
'add_dark': bool,
},
'bright_fatter': {},
'detector_defects': {
'hot_pixels': bool,
'dead_pixels': bool,
'bad_columns': bool,
},
'nonlinearity': {},
'blooming': {},
'prescan_overscan': {
'add_dark': bool,
},
'bias': {
'bias_16channel': bool,
},
'readout_noise': {},
'gain': {
'gain_16channel': bool,
},
'quantization_and_output': {
'format_output': bool,
},
},
}
def convert_dict_values(d, key_type_map):
for key, value in d.items():
if isinstance(value, dict):
convert_dict_values(value, key_type_map[key])
elif key in key_type_map:
if key_type_map[key] is int:
d[key] = int(value)
if key_type_map[key] is float:
d[key] = float(value)
if key_type_map[key] is bool:
if d[key].lower() == 'yes' or d[key].lower() == 'true':
d[key] = True
else:
d[key] = False
if key_type_map[key] is str:
d[key] = str(value)
if key_type_map[key] is list:
d[key] = ast.literal_eval(value)
if key_type_map[key] is None:
d[key] = None
def load_yaml():
with open('templates/obs_config_SCI.yaml', 'r') as file:
return yaml.safe_load(file)
def save_yaml(data):
convert_dict_values(data, key_type_map)
with open('config_reset/obs_config_SCI_reset.yaml', 'w') as file:
yaml.dump(data, file, default_flow_style=False, sort_keys=False)
def render_form(data, parent_key=''):
form_html = ''
for key, value in data.items():
full_key = f"{parent_key}.{key}" if parent_key else key
if isinstance(value, dict): # 处理字典
form_html += f"<div class='block'><h2>{key}</h2>{render_form(value, full_key)}</div>"
else:
form_html += f"<label for='{full_key}'>{key}:</label>"
form_html += f"<input type='text' id='{full_key}' name='{full_key}' value='{value}'><br>"
return form_html
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
data = load_yaml()
for key in request.form:
keys = key.split('.')
temp = data
for k in keys[:-1]:
temp = temp[k]
temp[keys[-1]] = request.form[key]
save_yaml(data)
return redirect('/')
data = load_yaml()
form_html = render_form(data)
return render_template('index_obs.html', form_html=form_html)
if __name__ == '__main__':
app.run(debug=True)
from flask import Flask, render_template, request, redirect
import yaml
import ast
app = Flask(__name__)
key_type_map = {
'work_dir': str,
'run_name': str,
'project_cycle': int,
'run_counter': int,
'run_option': {
'out_cat_only': bool,
},
'catalog_options': {
'input_path': {
'cat_dir': str,
'star_cat': str,
'galaxy_cat': str,
},
'SED_templates_path': {
'star_SED': str,
'galaxy_SED': str,
'AGN_SED': str,
},
'star_only': bool,
'galaxy_only': bool,
'rotateEll': float,
'enable_mw_ext_gal': bool,
'planck_ebv_map': str,
},
'obs_setting': {
'pointing_file': str,
'obs_config_file': str,
'run_pointings': list,
'enable_astrometric_model': bool,
'cut_in_band': str,
'mag_sat_margin': float,
'mag_lim_margin': float,
},
'psf_setting': {
'psf_model': str,
'psf_pho_dir': str,
'psf_sls_dir': str,
},
'shear_setting': {
'shear_type': str,
'reduced_g1': float,
'reduced_g2': float,
},
'output_setting': {
'output_format': str,
'shutter_output': bool,
'prnu_output': bool,
},
'random_seeds': {
'seed_poisson': int,
'seed_CR': int,
'seed_flat': int,
'seed_prnu': int,
'seed_gainNonUniform': int,
'seed_biasNonUniform': int,
'seed_rnNonUniform': int,
'seed_badcolumns': int,
'seed_defective': int,
'seed_readout': int,
},
}
def convert_dict_values(d, key_type_map):
for key, value in d.items():
if isinstance(value, dict):
convert_dict_values(value, key_type_map[key])
elif key in key_type_map:
if key_type_map[key] is int:
d[key] = int(value)
if key_type_map[key] is float:
d[key] = float(value)
if key_type_map[key] is bool:
if d[key].lower() == 'yes' or d[key].lower() == 'true':
d[key] = True
else:
d[key] = False
if key_type_map[key] is str:
d[key] = str(value)
if key_type_map[key] is list:
d[key] = ast.literal_eval(value)
def load_yaml():
with open('templates/config_overall.yaml', 'r') as file:
return yaml.safe_load(file)
def save_yaml(data):
convert_dict_values(data, key_type_map)
with open('config_reset/config_overall_reset.yaml', 'w') as file:
yaml.dump(data, file, default_flow_style=False, sort_keys=False)
def render_form(data, parent_key=''):
form_html = ''
for key, value in data.items():
full_key = f"{parent_key}.{key}" if parent_key else key
if isinstance(value, dict): # 处理字典
form_html += f"<div class='block'><h2>{key}</h2>{render_form(value, full_key)}</div>"
else:
form_html += f"<label for='{full_key}'>{key}:</label>"
form_html += f"<input type='text' id='{full_key}' name='{full_key}' value='{value}'><br>"
return form_html
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
data = load_yaml()
for key in request.form:
keys = key.split('.')
temp = data
for k in keys[:-1]:
temp = temp[k]
temp[keys[-1]] = request.form[key]
save_yaml(data)
return redirect('/')
data = load_yaml()
form_html = render_form(data)
return render_template('index_overall.html', form_html=form_html)
if __name__ == '__main__':
app.run(debug=True)
---
###############################################
#
# Configuration file for CSST simulation
# Overall settings
# CSST-Sim Group, 2024/01/08
#
###############################################
# 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: "/public/home/fangyuedong/project/workplace/"
run_name: "ext_on"
# Project cycle and run counter are used to name the outputs
project_cycle: 9
run_counter: 1
# Run options
run_option:
# Output catalog only?
# If yes, no imaging simulation will be run. Only the catalogs
# of corresponding footprints will be generated.
out_cat_only: NO
###############################################
# Catalog setting
###############################################
# Configure the input catalog: options should be implemented
# in the corresponding (user defined) 'Catalog' class
catalog_options:
input_path:
cat_dir: "/public/share/yangxuliu/CSSOSDataProductsSims/data_50sqDeg/"
star_cat: "starcat_C9/"
galaxy_cat: "qsocat/cat2CSSTSim_bundle-50sqDeg/"
SED_templates_path:
star_SED: "/public/share/yangxuliu/CSSOSDataProductsSims/data_50sqDeg/starcat_C9/"
galaxy_SED: "/public/share/yangxuliu/CSSOSDataProductsSims/data_50sqDeg/sedlibs/"
AGN_SED: "/public/share/yangxuliu/CSSOSDataProductsSims/data_50sqDeg/qsocat/qsosed/"
# Only simulate stars?
star_only: NO
# Only simulate galaxies?
galaxy_only: NO
# rotate galaxy ellipticity
rotateEll: 0. # [degree]
# Whether to apply milky way extinction to galaxies
enable_mw_ext_gal: YES
planck_ebv_map: "/public/home/fangyuedong/project/ext_maps/planck/HFI_CompMap_ThermalDustModel_2048_R1.20.fits"
###############################################
# Observation setting
###############################################
obs_setting:
# (Optional) a file of point list
# if you just want to run default pointing:
# - pointing_dir: null
# - pointing_file: null
pointing_file: "/public/share/yangxuliu/CSSOSDataProductsSims/data_50sqDeg/pointing50_C9/pointing_50_1_n.dat"
obs_config_file: "/public/home/fangyuedong/project/csst_msc_sim/config/obs_config_SCI.yaml"
# 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: [0, 1, 2, 3, 4]
# Whether to enable astrometric modeling
enable_astrometric_model: YES
# Cut by saturation magnitude in which band?
cut_in_band: "z"
# saturation magnitude margin
mag_sat_margin: -2.5
# mag_sat_margin: -15.
# limiting magnitude margin
mag_lim_margin: +1.0
###############################################
# 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 models for photometry survey simulation
psf_pho_dir: "/public/share/yangxuliu/CSSOSDataProductsSims/dataC6/psfCube1"
# PSF models for slitless spectrum survey simulation
psf_sls_dir: "/public/share/yangxuliu/CSSOSDataProductsSims/data_50sqDeg/SLS_PSF_PCA_fp/"
###############################################
# Shear setting
###############################################
shear_setting:
# Options to generate mock shear field:
# "constant": all galaxies are assigned a constant reduced shear
# "catalog": get shear values from catalog
shear_type: "constant"
# For constant shear field
reduced_g1: 0.
reduced_g2: 0.
###############################################
# Output options
###############################################
output_setting:
output_format: "channels" # Whether to export as 16 channels (subimages) with pre- and over-scan ("image"/"channels")
shutter_output: NO # Whether to export shutter effect 16-bit image
prnu_output: NO # Whether to export the PRNU (pixel-to-pixel flat-fielding) files
###############################################
# Random seeds
###############################################
random_seeds:
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
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>csst_msc_sim_CONF</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" rel="stylesheet">
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f4f4f4;
color: #333;
}
h1 {
text-align: center;
color: #4CAF50;
}
.container {
max-width: 800px;
margin: 0 auto;
background: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.block {
margin-bottom: 20px;
border: 1px solid #ccc;
border-radius: 4px;
padding: 10px;
background-color: #fafafa;
}
h2 {
color: #4CAF50;
font-size: 1.2em;
margin-bottom: 10px;
}
label {
display: block;
margin: 5px 0;
}
input[type="text"] {
width: calc(100% - 22px);
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
margin-bottom: 10px;
transition: border 0.3s;
}
input[type="text"]:focus {
border-color: #4CAF50;
outline: none;
}
input[type="submit"] {
background-color: #4CAF50;
color: white;
border: none;
padding: 10px 15px;
border-radius: 4px;
cursor: pointer;
font-size: 1em;
transition: background-color 0.3s;
}
input[type="submit"]:hover {
background-color: #45a049;
}
table {
width: 100%;
border: 1px solid #ddd;
border-radius: 8px; /* 圆角 */
overflow: hidden; /* 隐藏超出表格的内容 */
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* 添加阴影 */
}
th, td {
border-bottom: 1px solid #ddd; /* 单元格底部边框 */
padding: 12px; /* 内边距 */
text-align: left;
}
tr:hover {
background-color: #ADD8E6; /* 悬停时背景颜色 */
}
</style>
</head>
<body>
<div class="container">
<h1>配置obs_config_SCI.yaml</h1>
<p><strong>说明:</strong>
1,该脚本可用于生成CSST主巡天成像仿真的参数文件,相关参数说明见本页脚注;2,用户必须修改相关路径参数,其他参数可参考默认值
.
</p>
<hr style="border: 2px solid green;">
<form method="POST">
{{ form_html | safe }}
<input type="submit" value="保存">
</form>
</div>
<footer class="mt-4">
<p class="text-center">这是一个有用的网页</p>
<table>
<tr>
<th>KEYS</th>
<th>VALUES</th>
<th>COMMENTS</th>
</tr>
<tr>
<th>obs_type</th>
<td>"SCI", [str]</td>
<td>仿真图像类型</td>
</tr>
<tr>
<th>obs_type_code</th>
<td>"101", [str]</td>
<td>数据系统内部标号</td>
</tr>
<tr>
<th>obs_id</th>
<td>"00000001", [str]</td>
<td>this setting will only be used if pointing list file is not given</td>
</tr>
<tr>
<th>run_chips</th>
<td>[7,8,9], [list]</td>
<td>Define list of chips</td>
</tr>
<tr>
<th>scie_obs:<span style="font-weight: normal;">shutter_effect</span></th>
<td>YES, [bool]</td>
<td>是否应用快门效应</td>
</tr>
<tr>
<th>scie_obs:<span style="font-weight: normal;">flat_fielding</span></th>
<td>YES, [bool]</td>
<td>是否应用平场模块</td>
</tr>
<tr>
<th>scie_obs:<span style="font-weight: normal;">field_dist</span></th>
<td>YES, [bool]</td>
<td> </td>
</tr>
<tr>
<th>sky_background:<span style="font-weight: normal;">shutter_effect</span></th>
<td>YES, [bool]</td>
<td>是否应用快门效应</td>
</tr>
<tr>
<th>sky_background:<span style="font-weight: normal;">flat_fielding</span></th>
<td>YES, [bool]</td>
<td>是否应用平场模块</td>
</tr>
<tr>
<th>sky_background:<span style="font-weight: normal;">enable_straylight_model</span></th>
<td>YES, [bool]</td>
<td>是否应用杂散光模块</td>
</tr>
<tr>
<th>sky_background:<span style="font-weight: normal;">flat_level</span></th>
<td>null [null or int]</td>
<td>set the total skybackground value (e-) in the exptime,if none,set null, or delete the key</td>
</tr>
<tr>
<th>sky_background:<span style="font-weight: normal;">flat_level_filt</span></th>
<td>null, [str]</td>
<td>the vale of "flat_level" is in the filter "flat_level_filt", can set NUV, u, g, r, i, z, y, if none,set null,or delete the key</td>
</tr>
<tr>
<th>PRNU_effect<span style="font-weight: normal;"></span></th>
<td>---</td>
<td>应用像素间不均匀响应模块;如果需关闭,请在生成的yaml文件中直接注释</td>
</tr>
<tr>
<th>cosmic_rays:<span style="font-weight: normal;">save_cosmic_img</span></th>
<td>YES, [bool]</td>
<td>是否保存宇宙线图像</td>
</tr>
<tr>
<th>poisson_and_dark:<span style="font-weight: normal;">add_dark</span></th>
<td>YES, [bool]</td>
<td>是否添加暗电流</td>
</tr>
<tr>
<th>bright_fatter<span style="font-weight: normal;"></span></th>
<td>YES, [bool]</td>
<td>应用亮胖效应模块;如果需关闭,请在生成的yaml文件中直接注释</td>
</tr>
<tr>
<th>detector_defects:<span style="font-weight: normal;">hot_pixels</span></th>
<td>YES, [bool]</td>
<td>是否添加热像元</td>
</tr>
<tr>
<th>detector_defects:<span style="font-weight: normal;">dead_pixels</span></th>
<td>YES, [bool]</td>
<td>是否添加坏像元</td>
</tr>
<tr>
<th>detector_defects:<span style="font-weight: normal;">bad_columns</span></th>
<td>YES, [bool]</td>
<td>是否添加坏像列</td>
</tr>
<tr>
<th>nonlinearity<span style="font-weight: normal;"></span></th>
<td>---</td>
<td>应用非线性响应模块;如果需关闭,请在生成的yaml文件中直接注释</td>
</tr>
<tr>
<th>blooming<span style="font-weight: normal;"></span></th>
<td>---</td>
<td>是否应用饱和溢出模块;如果需关闭,请在生成的yaml文件中直接注释</td>
</tr>
<tr>
<th>prescan_overscan:<span style="font-weight: normal;">add_dark</span></th>
<td>YES, [bool]</td>
<td> 是否在pre/over-scan区域添加暗电流/</td>
</tr>
<tr>
<th>bias:<span style="font-weight: normal;">bias_16channel</span></th>
<td>YES, [bool]</td>
<td>是否添加16通道的偏置电压</td>
</tr>
<tr>
<th>readout_noise<span style="font-weight: normal;"></span></th>
<td>---</td>
<td>添加读出噪声;如果需关闭,请在生成的yaml文件中直接注释</td>
</tr>
<tr>
<th>gain:<span style="font-weight: normal;">gain_16channel</span></th>
<td>YES, [bool]</td>
<td>是否应用增益</td>
</tr>
<tr>
<th>quantization_and_output:<span style="font-weight: normal;">format_output</span></th>
<td>YES, [bool]</td>
<td>是否按0级数据格式定义输出图像</td>
</tr>
</table>
</footer>
</body>
</html>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>csst_msc_sim_CONF</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" rel="stylesheet">
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f4f4f4;
color: #333;
}
h1 {
text-align: center;
color: #4CAF50;
}
.container {
max-width: 800px;
margin: 0 auto;
background: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.block {
margin-bottom: 20px;
border: 1px solid #ccc;
border-radius: 4px;
padding: 10px;
background-color: #fafafa;
}
h2 {
color: #4CAF50;
font-size: 1.2em;
margin-bottom: 10px;
}
label {
display: block;
margin: 5px 0;
}
input[type="text"] {
width: calc(100% - 22px);
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
margin-bottom: 10px;
transition: border 0.3s;
}
input[type="text"]:focus {
border-color: #4CAF50;
outline: none;
}
input[type="submit"] {
background-color: #4CAF50;
color: white;
border: none;
padding: 10px 15px;
border-radius: 4px;
cursor: pointer;
font-size: 1em;
transition: background-color 0.3s;
}
input[type="submit"]:hover {
background-color: #45a049;
}
table {
width: 100%;
border: 1px solid #ddd;
border-radius: 8px; /* 圆角 */
overflow: hidden; /* 隐藏超出表格的内容 */
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* 添加阴影 */
}
th, td {
border-bottom: 1px solid #ddd; /* 单元格底部边框 */
padding: 12px; /* 内边距 */
text-align: left;
}
tr:hover {
background-color: #ADD8E6; /* 悬停时背景颜色 */
}
</style>
</head>
<body>
<div class="container">
<h1>配置config_overall.yaml</h1>
<p><strong>说明:</strong>
1,该脚本可用于生成CSST主巡天成像仿真的参数文件,相关参数说明见本页脚注;2,用户必须修改相关路径参数,其他参数可参考默认值.
</p>
<hr style="border: 2px solid green;">
<form method="POST">
{{ form_html | safe }}
<input type="submit" value="保存">
</form>
</div>
<footer class="mt-4">
<p class="text-center">这是一个有用的网页</p>
<table>
<tr>
<th>KEYS</th>
<th>VALUES</th>
<th>COMMENTS</th>
</tr>
<tr>
<th>work_dir</th>
<td>/localpath, [str]</td>
<td>工作目录-仿真输出的文件路径</td>
</tr>
<tr>
<th>run_name</th>
<td>testRun, [str]</td>
<td>当前仿真目录</td>
</tr>
<tr>
<th>project_cycle</th>
<td>10, [int]</td>
<td>CSST数据系统开发阶段-C10</td>
</tr>
<tr>
<th>project_cycle</th>
<td>0, [int]</td>
<td>仿真次数标号-0</td>
</tr>
<tr>
<th>run_option:<span style="font-weight: normal;">out_cat_only</span></th>
<td>NO, [bool]</td>
<td>是否仅输出星表-YES,不产生开展成像仿真,直接输出星表文件;NO,开展成像仿真</td>
</tr>
<tr>
<th>catalog_options:<span style="font-weight: normal;">input_path</span></th>
<td>/localpath, [str]</td>
<td>"cat_dir": 输入星表路径, "star_cat": 恒星星表目录, "galaxy_cat": 星系星表目录</td>
</tr>
<tr>
<th>catalog_options:<span style="font-weight: normal;">SED_templates_path</span></th>
<td>/localpath, [str]</td>
<td>"star_SED": 恒星SED路径,"galaxy_SED": 星系SED路径,"AGN_SED": 类星体SED路径</td>
</tr>
<tr>
<th>catalog_options:<span style="font-weight: normal;">star_only</span></th>
<td>NO, [bool]</td>
<td>YES,只对恒星成像;NO,包含其他天体成像</td>
</tr>
<tr>
<th>catalog_options:<span style="font-weight: normal;">galaxy_only</span></th>
<td>NO, [bool]</td>
<td>YES,只对星系成像;NO,包含其他天体成像</td>
</tr>
<tr>
<th>catalog_options:<span style="font-weight: normal;">rotateEll</span></th>
<td>0.0, [float]</td>
<td>旋转星系指向(度)</td>
</tr>
<tr>
<th>catalog_options:<span style="font-weight: normal;">enable_mw_ext_gal</span></th>
<td>NO, [bool]</td>
<td>是否应用银河系消光</td>
</tr>
<tr>
<th>catalog_options:<span style="font-weight: normal;">planck_ebv_map</span></th>
<td>/localpath, [str]</td>
<td>消光模型</td>
</tr>
<tr>
<th>obs_setting:<span style="font-weight: normal;">pointing_file</span></th>
<td>/localpath, [str]</td>
<td>曝光指向文件路径</td>
</tr>
<tr>
<th>obs_setting:<span style="font-weight: normal;">obs_config_file</span></th>
<td>/localpath, [str]</td>
<td>观测配置文件路径</td>
</tr>
<tr>
<th>obs_setting:<span style="font-weight: normal;">run_pointings</span></th>
<td>[0], [int]</td>
<td>give a list of indexes of pointings</td>
</tr>
<tr>
<th>obs_setting:<span style="font-weight: normal;">enable_astrometric_model</span></th>
<td>YES, [bool]</td>
<td>是否应用天测模块</td>
</tr>
<tr>
<th>obs_setting:<span style="font-weight: normal;">cut_in_band</span></th>
<td>"z", [str]</td>
<td>Cut by saturation magnitude in which band</td>
</tr>
<tr>
<th>obs_setting:<span style="font-weight: normal;">mag_sat_margin</span></th>
<td>-2.5, [float]</td>
<td>saturation magnitude margin</td>
</tr>
<tr>
<th>obs_setting:<span style="font-weight: normal;">mag_lim_margin</span></th>
<td>+1.0, [float]</td>
<td>limiting magnitude margin</td>
</tr>
<tr>
<th>psf_setting:<span style="font-weight: normal;">psf_model</span></th>
<td>"Interp", [str]</td>
<td>Interp-Interpolated PSF from sampled ray-tracing data; Gauss-simple gaussian profile</td>
</tr>
<tr>
<th>psf_setting:<span style="font-weight: normal;">psf_pho_dir</span></th>
<td>/localpath, [str]</td>
<td>多色成像PSF数据库路径</td>
</tr>
<tr>
<th>psf_setting:<span style="font-weight: normal;">psf_sls_dir</span></th>
<td>/localpath, [str]</td>
<td>无缝光谱PSF数据库路径</td>
</tr>
<tr>
<th>shear_setting:<span style="font-weight: normal;">shear_type</span></th>
<td>constant, [str]</td>
<td>constant-all galaxies are assigned a constant reduced shear; catalog-get shear values from catalog</td>
</tr>
<tr>
<th>shear_setting:<span style="font-weight: normal;">reduced_g1</span></th>
<td>0.0, [float]</td>
<td>weak lensing shear, gamma_1</td>
</tr>
<tr>
<th>shear_setting:<span style="font-weight: normal;"></span>reduced_g1</th>
<td>0.0, [float]</td>
<td>weak lensing shear, gamma_2</td>
</tr>
<tr>
<th>output_setting:<span style="font-weight: normal;">output_format</span></th>
<td>channels, [str]</td>
<td>Whether to export as 16 channels (subimages) with pre- and over-scan (\"image\"/\"channels\")</td>
</tr>
<tr>
<th>output_setting:<span style="font-weight: normal;">shutter_output</span></th>
<td>NO, [bool]</td>
<td>Whether to export shutter effect 16-bit image</td>
</tr>
<tr>
<th>output_setting:<span style="font-weight: normal;">prnu_output</span></th>
<td>NO, [bool]</td>
<td>Whether to export the PRNU (pixel-to-pixel flat-fielding) files</td>
</tr>
<tr>
<th>random_seeds</th>
<td>[int]</td>
<td>设置随机数种子</td>
</tr>
</table>
</footer>
</body>
</html>
---
###############################################
#
# Configuration file for CSST simulation
# For single exposure type:
# SCI-WIDE
# CSST-Sim Group, 2024/01/08
#
###############################################
# Observation type
obs_type: "SCI"
obs_type_code: "101"
obs_id: "00000001" # this setting will only be used if pointing list file is not given
# Define list of chips
# run_chips: [6,7,8,9,11,12,13,14,15,16,17,18,19,20,22,23,24,25] # Photometric chips
#run_chips: [1,2,3,4,5,10,21,26,27,28,29,30] # Spectroscopic chips
run_chips: [17, 22]
# Define observation sequence
call_sequence:
# Accumulate fluxes from objects
scie_obs:
# [Optional]: exposure time of the pointing will be used as default.
# Set it here is you want to override the default
# exptime: 150. # [s]
shutter_effect: YES
flat_fielding: YES
field_dist: YES
# Accumulate fluxes from sky background
sky_background:
# [Optional]: exposure time of the pointing will be used as default.
# Set it here is you want to override the default
# exptime: 150. # [s]
shutter_effect: YES
flat_fielding: YES
enable_straylight_model: YES
# flat_level: set the total skybackground value (e-) in the exptime,if none,set null, or delete the key
# flat_level_filt: the vale of "flat_level" is in the filter "flat_level_filt", can set NUV, u, g, r, i, z, y, if
# none,set null,or delete the key
flat_level: null
flat_level_filt: null
# Apply PRNU to accumulated photons
PRNU_effect: {}
# Accumulate photons caused by cosmic rays
cosmic_rays:
# [Optional]: exposure time of the pointing will be used as default.
# Set it here is you want to override the default
# exptime: 150. # [s]
save_cosmic_img: YES # # Whether to export cosmic ray image
# Add Poission noise and dark current
poisson_and_dark:
# [Optional]: exposure time of the pointing will be used as default.
# Set it here is you want to override the default
# exptime: 150. # [s]
add_dark: YES
# Simulate brighter fatter effects
bright_fatter: {}
# Add detector defects: hot/warm pixels, bad columns
detector_defects:
hot_pixels: YES
dead_pixels: YES
bad_columns: YES
# Apply response nonlinearity
nonlinearity: {}
# Apply CCD Saturation & Blooming
blooming: {}
# Run CTE simulation
# CTE_effect: {}
# Add prescan and overscan
prescan_overscan:
add_dark: YES
# Add bias
bias:
bias_16channel: YES
# Add readout noise
readout_noise: {}
# Apply gain
gain:
gain_16channel: YES
# Output the final image
quantization_and_output:
format_output: YES
...
...@@ -26,7 +26,7 @@ def focalPlaneInf(ra_target, dec_target, ra_point, dec_point, image_rot=-113.433 ...@@ -26,7 +26,7 @@ def focalPlaneInf(ra_target, dec_target, ra_point, dec_point, image_rot=-113.433
float, in unit of degrees; float, in unit of degrees;
image_rot : orientation of the camera with respect the sky; image_rot : orientation of the camera with respect the sky;
float, in unit of degrees; float, in unit of degrees;
NOTE: image_rot=-113.4333 is the default value NOTE: image_rot=-113.4333 is the default value
in current CSST image simulation; in current CSST image simulation;
figout : location of the target object in the focal plane; figout : location of the target object in the focal plane;
str str
...@@ -36,7 +36,7 @@ def focalPlaneInf(ra_target, dec_target, ra_point, dec_point, image_rot=-113.433 ...@@ -36,7 +36,7 @@ def focalPlaneInf(ra_target, dec_target, ra_point, dec_point, image_rot=-113.433
the pointing center (ra_point dec_point) of the telescope the pointing center (ra_point dec_point) of the telescope
1) open a terminal 1) open a terminal
2) type >> python TargetLocationCheck.py ra_target dec_target ra_point dec_point 2) type >> python TargetLocationCheck.py ra_target dec_target ra_point dec_point
or type >> python TargetLocationCheck.py ra_target dec_target ra_point dec_point -image_rot=floatNum or type >> python TargetLocationCheck.py ra_target dec_target ra_point dec_point -image_rot=floatNum
or type >> python TargetLocationCheck.py ra_target dec_target ra_point dec_point -image_rot=floatNum -figout=FigureName or type >> python TargetLocationCheck.py ra_target dec_target ra_point dec_point -image_rot=floatNum -figout=FigureName
""" """
print("^_^ Input target coordinate: [Ra, Dec] = [%10.6f, %10.6f]" % ( print("^_^ Input target coordinate: [Ra, Dec] = [%10.6f, %10.6f]" % (
...@@ -105,7 +105,7 @@ def ccdParam(): ...@@ -105,7 +105,7 @@ def ccdParam():
def getTanWCS(ra, dec, img_rot, pix_scale=0.074): def getTanWCS(ra, dec, img_rot, pix_scale=0.074):
""" """
Get the WCS of the image mosaic using Gnomonic/TAN projection Get the WCS of the image mosaic using Gnomonic/TAN projection
Parameter: Parameter:
ra, dec: float ra, dec: float
...@@ -221,8 +221,8 @@ def ccdLayout(xpixTar, ypixTar, figout="ccdLayout.pdf"): ...@@ -221,8 +221,8 @@ def ccdLayout(xpixTar, ypixTar, figout="ccdLayout.pdf"):
ax.text(ix0+500, iy0+1500, "%s#%s" % ax.text(ix0+500, iy0+1500, "%s#%s" %
(fType, ischip), fontsize=12, color="grey") (fType, ischip), fontsize=12, color="grey")
ax.plot(xpixTar, ypixTar, "r*", ms=12) ax.plot(xpixTar, ypixTar, "r*", ms=12)
ax.set_xlabel("$X\,[\mathrm{pixels}]$", fontsize=20) ax.set_xlabel(r"$X\,[\mathrm{pixels}]$", fontsize=20)
ax.set_ylabel("$Y\,[\mathrm{pixels}]$", fontsize=20) ax.set_ylabel(r"$Y\,[\mathrm{pixels}]$", fontsize=20)
ax.invert_yaxis() ax.invert_yaxis()
ax.axis('off') ax.axis('off')
plt.savefig(figout) plt.savefig(figout)
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment