Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
csst-sims
csst_msc_sim
Commits
2c2dac03
Commit
2c2dac03
authored
May 12, 2024
by
Fang Yuedong
Browse files
remove files
parent
4afd1181
Changes
211
Expand all
Show whitespace changes
Inline
Side-by-side
Catalog/C9_Catalog.py
deleted
100644 → 0
View file @
4afd1181
This diff is collapsed.
Click to expand it.
Catalog/Catalog_example.py
deleted
100644 → 0
View file @
4afd1181
import
os
import
numpy
as
np
import
astropy.constants
as
cons
from
astropy.table
import
Table
from
scipy
import
interpolate
from
ObservationSim.MockObject
import
CatalogBase
,
Star
,
Galaxy
,
Quasar
class
Catalog
(
CatalogBase
):
"""An user customizable class for reading in catalog(s) of objects and SEDs.
NOTE: must inherit the "CatalogBase" abstract class
...
Attributes
----------
cat_dir : str
a directory that contains the catalog file(s)
star_path : str
path to the star catalog file
star_SED_path : str
path to the star SED data
objs : list
a list of ObservationSim.MockObject (Star, Galaxy, or Quasar)
NOTE: must have "obj" list when implement your own Catalog
Methods
----------
load_sed(obj, **kwargs):
load the corresponding SED data for one object
load_norm_filt(obj):
load the filter throughput for the input catalog's photometric system.
"""
def
__init__
(
self
,
config
,
chip
,
**
kwargs
):
"""Constructor method.
Parameters
----------
config : dict
configuration dictionary which is parsed from the input YAML file
chip: ObservationSim.Instrument.Chip
an ObservationSim.Instrument.Chip instance, can be used to identify the band etc.
**kwargs : dict
other needed input parameters (in key-value pairs), please modify corresponding
initialization call in "ObservationSim.py" as you need.
Returns
----------
None
"""
super
().
__init__
()
self
.
cat_dir
=
os
.
path
.
join
(
config
[
"data_dir"
],
config
[
"catalog_options"
][
"input_path"
][
"cat_dir"
])
self
.
chip
=
chip
if
"star_cat"
in
config
[
"catalog_options"
][
"input_path"
]
and
config
[
"catalog_options"
][
"input_path"
][
"star_cat"
]:
star_file
=
config
[
"catalog_options"
][
"input_path"
][
"star_cat"
]
star_SED_file
=
config
[
"catalog_options"
][
"SED_templates_path"
][
"star_SED"
]
self
.
star_path
=
os
.
path
.
join
(
self
.
cat_dir
,
star_file
)
self
.
star_SED_path
=
os
.
path
.
join
(
config
[
"data_dir"
],
star_SED_file
)
# NOTE: must call _load() method here to read in all objects
self
.
objs
=
[]
self
.
_load
()
def
_load
(
self
,
**
kwargs
):
"""Read in all objects in from the catalog file(s).
This is a must implemented method which is used to read in all objects, and
then convert them to ObservationSim.MockObject (Star, Galaxy, or Quasar).
Currently,
the model of ObservationSim.MockObject.Star class requires:
param["star"] : int
specify the object type: 0: galaxy, 1: star, 2: quasar
param["id"] : int
ID number of the object
param["ra"] : float
Right ascension (in degrees)
param["dec"] : float
Declination (in degrees)
param["mag_use_normal"]: float
the absolute magnitude in a particular filter
NOTE: if that filter is not the corresponding CSST filter, the
load_norm_filt(obj) function must be implemented to load the filter
throughput of that particular photometric system
the model of ObservationSim.MockObject.Galaxy class requires:
param["star"] : int
specify the object type: 0: galaxy, 1: star, 2: quasar
param["id"] : int
ID number of the object
param["ra"] : float
Right ascension (in degrees)
param["dec"] : float
Declination (in degrees)
param["mag_use_normal"]: float
the absolute magnitude in a particular filter
NOTE: if that filter is not the corresponding CSST filter, the
load_norm_filt(obj) function must be implemented to load the filter
throughput of that particular photometric system
param["bfrac"] : float
the bulge fraction
param["hlr_bulge"] : float
the half-light-radius of the bulge
param["hlr_disk"] : float
the half-light-radius of the disk
param["e1_bulge"], param["e2_bulge"] : float
the ellipticity of the bulge components
param["e1_disk"], param["e2_disk"] : float
the ellipticity of the disk components
(Optional parameters):
param['disk_sersic_idx']: float
Sersic index for galaxy disk component
param['bulge_sersic_idx']: float
Sersic index for galaxy bulge component
param['g1'], param['g2']: float
Reduced weak lensing shear components (valid for shear type: catalog)
the model of ObservationSim.MockObject.Galaxy class requires:
Currently a Quasar is modeled as a point source, just like a Star.
NOTE: To construct an object, according to its type, just call:
Star(param), Galaxy(param), or Quasar(param)
NOTE: All constructed objects should be appened to "self.objs".
NOTE: Any other parameters can also be set within "param" dict:
Used to calculate required quantities and/or SEDs etc.
Parameters
----------
**kwargs : dict
other needed input parameters (in key-value pairs), please modify corresponding
initialization call in "ObservationSim.py" as you need.
Returns
----------
None
"""
stars
=
Table
.
read
(
self
.
star_path
)
nstars
=
stars
[
'sourceID'
].
size
for
istars
in
range
(
nstars
):
param
=
self
.
initialize_param
()
param
[
'id'
]
=
istars
+
1
param
[
'ra'
]
=
stars
[
'RA'
][
istars
]
param
[
'dec'
]
=
stars
[
'Dec'
][
istars
]
param
[
'sed_type'
]
=
stars
[
'sourceID'
][
istars
]
param
[
'model_tag'
]
=
stars
[
'model_tag'
][
istars
]
param
[
'z'
]
=
0.0
param
[
'star'
]
=
1
# Star
param
[
'mag_use_normal'
]
=
stars
[
'app_sdss_g'
][
istars
]
obj
=
Star
(
param
)
self
.
objs
.
append
(
obj
)
def
load_sed
(
self
,
obj
,
**
kwargs
):
"""Load the corresponding SED data for a particular obj.
Parameters
----------
obj : ObservationSim.MockObject
the object to get SED data for
**kwargs : dict
other needed input parameters (in key-value pairs), please modify corresponding
initialization call in "ObservationSim.py" as you need.
Returns
----------
sed : Astropy.Table
the SED Table with two columns (namely, "WAVELENGTH", "FLUX"):
sed["WAVELENGTH"] : wavelength in Angstroms
sed["FLUX"] : fluxes in photons/s/m^2/A
NOTE: the range of wavelengthes must at least cover [2450 - 11000] Angstorms
"""
if
obj
.
type
==
'star'
:
wave
=
Table
.
read
(
self
.
star_SED_path
,
path
=
f
"/SED/wave_
{
obj
.
model_tag
}
"
)
flux
=
Table
.
read
(
self
.
star_SED_path
,
path
=
f
"/SED/
{
obj
.
sed_type
}
"
)
wave
,
flux
=
wave
[
'col0'
].
data
,
flux
[
'col0'
].
data
else
:
raise
ValueError
(
"Object type not known"
)
speci
=
interpolate
.
interp1d
(
wave
,
flux
)
lamb
=
np
.
arange
(
2400
,
11001
+
0.5
,
0.5
)
y
=
speci
(
lamb
)
# erg/s/cm^2/A --> photons/s/m^2/A
all_sed
=
y
*
lamb
/
(
cons
.
h
.
value
*
cons
.
c
.
value
)
*
1e-13
sed
=
Table
(
np
.
array
([
lamb
,
all_sed
]).
T
,
names
=
(
'WAVELENGTH'
,
'FLUX'
))
return
sed
def
load_norm_filt
(
self
,
obj
):
"""Load the corresponding thourghput for the input magnitude "param["mag_use_normal"]".
NOTE: if the input magnitude is already in CSST magnitude, simply return None
Parameters
----------
obj : ObservationSim.MockObject
the object to get thourghput data for
Returns
----------
norm_filt : Astropy.Table
the throughput Table with two columns (namely, "WAVELENGTH", "SENSITIVITY"):
norm_filt["WAVELENGTH"] : wavelengthes in Angstroms
norm_filt["SENSITIVITY"] : efficiencies
"""
return
None
\ No newline at end of file
Catalog/data/SLOAN_SDSS.g.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
Catalog/data/__init__.py
deleted
100644 → 0
View file @
4afd1181
Catalog/data/lsst_throuput_g.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
Catalog/data/starSpecInterp.so
deleted
100755 → 0
View file @
4afd1181
File deleted
Catalog/testCat_fits.py
deleted
100644 → 0
View file @
4afd1181
import
os
import
galsim
import
random
import
numpy
as
np
import
h5py
as
h5
import
healpy
as
hp
import
astropy.constants
as
cons
import
traceback
from
astropy.coordinates
import
spherical_to_cartesian
from
astropy.table
import
Table
from
scipy
import
interpolate
from
datetime
import
datetime
from
ObservationSim.MockObject
import
CatalogBase
,
Star
,
Galaxy
,
Quasar
,
Stamp
from
ObservationSim.MockObject._util
import
tag_sed
,
getObservedSED
,
getABMAG
,
integrate_sed_bandpass
,
comoving_dist
from
ObservationSim.Astrometry.Astrometry_util
import
on_orbit_obs_position
import
astropy.io.fits
as
fitsio
from
ObservationSim.MockObject._util
import
seds
,
sed_assign
,
extAv
# (TEST)
from
astropy.cosmology
import
FlatLambdaCDM
from
astropy
import
constants
from
astropy
import
units
as
U
try
:
import
importlib.resources
as
pkg_resources
except
ImportError
:
# Try backported to PY<37 'importlib_resources'
import
importlib_resources
as
pkg_resources
NSIDE
=
128
class
Catalog
(
CatalogBase
):
def
__init__
(
self
,
config
,
chip
,
pointing
,
chip_output
,
filt
,
**
kwargs
):
super
().
__init__
()
self
.
cat_dir
=
config
[
"catalog_options"
][
"input_path"
][
"cat_dir"
]
self
.
seed_Av
=
121212
#config["catalog_options"]["seed_Av"]
# (TEST)
self
.
cosmo
=
FlatLambdaCDM
(
H0
=
67.66
,
Om0
=
0.3111
)
self
.
chip_output
=
chip_output
self
.
filt
=
filt
self
.
logger
=
chip_output
.
logger
with
pkg_resources
.
path
(
'Catalog.data'
,
'SLOAN_SDSS.g.fits'
)
as
filter_path
:
self
.
normF_star
=
Table
.
read
(
str
(
filter_path
))
with
pkg_resources
.
path
(
'Catalog.data'
,
'lsst_throuput_g.fits'
)
as
filter_path
:
self
.
normF_galaxy
=
Table
.
read
(
str
(
filter_path
))
self
.
config
=
config
self
.
chip
=
chip
self
.
pointing
=
pointing
self
.
max_size
=
0.
if
"stamp_cat"
in
config
[
"catalog_options"
][
"input_path"
]
and
config
[
"catalog_options"
][
"input_path"
][
"stamp_cat"
]
and
config
[
"catalog_options"
][
"stamp_yes"
]:
stamp_file
=
config
[
"catalog_options"
][
"input_path"
][
"stamp_cat"
]
self
.
stamp_path
=
os
.
path
.
join
(
self
.
cat_dir
,
stamp_file
)
#self.stamp_SED_path = os.path.join(config["data_dir"], config["SED_templates_path"]["stamp_SED"]) ###shoule be stamp-SED
#self._load_SED_lib_stamps() ###shoule be stamp-SED
self
.
tempSed_gal
,
self
.
tempRed_gal
=
seds
(
"galaxy.list"
,
seddir
=
"/public/home/chengliang/CSSOSDataProductsSims/testCats/Templates/Galaxy/"
)
#only for test
self
.
_add_output_columns_header
()
self
.
_get_healpix_list
()
self
.
_load
()
def
_add_output_columns_header
(
self
):
self
.
add_hdr
=
" model_tag teff logg feh"
self
.
add_hdr
+=
" bulgemass diskmass detA e1 e2 kappa g1 g2 size galType veldisp "
self
.
add_fmt
=
" %10s %8.4f %8.4f %8.4f"
self
.
add_fmt
+=
" %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %4d %8.4f "
self
.
chip_output
.
update_output_header
(
additional_column_names
=
self
.
add_hdr
)
def
_get_healpix_list
(
self
):
self
.
sky_coverage
=
self
.
chip
.
getSkyCoverageEnlarged
(
self
.
chip
.
img
.
wcs
,
margin
=
0.2
)
ra_min
,
ra_max
,
dec_min
,
dec_max
=
self
.
sky_coverage
.
xmin
,
self
.
sky_coverage
.
xmax
,
self
.
sky_coverage
.
ymin
,
self
.
sky_coverage
.
ymax
ra
=
np
.
deg2rad
(
np
.
array
([
ra_min
,
ra_max
,
ra_max
,
ra_min
]))
dec
=
np
.
deg2rad
(
np
.
array
([
dec_max
,
dec_max
,
dec_min
,
dec_min
]))
# vertices = spherical_to_cartesian(1., dec, ra)
self
.
pix_list
=
hp
.
query_polygon
(
NSIDE
,
hp
.
ang2vec
(
np
.
radians
(
90.
)
-
dec
,
ra
),
inclusive
=
True
)
# self.pix_list = hp.query_polygon(NSIDE, np.array(vertices).T, inclusive=True)
if
self
.
logger
is
not
None
:
msg
=
str
((
"HEALPix List: "
,
self
.
pix_list
))
self
.
logger
.
info
(
msg
)
else
:
print
(
"HEALPix List: "
,
self
.
pix_list
)
def
load_norm_filt
(
self
,
obj
):
if
obj
.
type
==
"stamp"
:
return
self
.
normF_galaxy
###normalize_filter for stamp
else
:
return
None
def
_load_stamps
(
self
,
stamps
,
pix_id
=
None
):
print
(
"debug:: load_stamps"
)
nstamps
=
len
(
stamps
[
'filename'
])
self
.
rng_sedGal
=
random
.
Random
()
self
.
rng_sedGal
.
seed
(
float
(
pix_id
))
# Use healpix index as the random seed
self
.
ud
=
galsim
.
UniformDeviate
(
pix_id
)
for
istamp
in
range
(
nstamps
):
print
(
"debug::"
,
istamp
)
fitsfile
=
os
.
path
.
join
(
self
.
cat_dir
,
"stampCats/"
+
stamps
[
'filename'
][
istamp
].
decode
(
'utf-8'
))
print
(
"debug::"
,
istamp
,
fitsfile
)
hdu
=
fitsio
.
open
(
fitsfile
)
param
=
self
.
initialize_param
()
param
[
'id'
]
=
hdu
[
0
].
header
[
'index'
]
#istamp
param
[
'star'
]
=
3
# Stamp type in .cat file
param
[
'ra'
]
=
hdu
[
0
].
header
[
'ra'
]
param
[
'dec'
]
=
hdu
[
0
].
header
[
'dec'
]
param
[
'pixScale'
]
=
hdu
[
0
].
header
[
'pixScale'
]
#param['srcGalaxyID'] = hdu[0].header['srcGID']
#param['mu']= hdu[0].header['mu']
#param['PA']= hdu[0].header['PA']
#param['bfrac']= hdu[0].header['bfrac']
#param['z']= hdu[0].header['z']
param
[
'mag_use_normal'
]
=
hdu
[
0
].
header
[
'mag_g'
]
#gals['mag_true_g_lsst']
# Apply astrometric modeling
# in C3 case only aberration
param
[
'ra_orig'
]
=
param
[
'ra'
]
param
[
'dec_orig'
]
=
param
[
'dec'
]
if
self
.
config
[
"obs_setting"
][
"enable_astrometric_model"
]:
ra_list
=
[
param
[
'ra'
]]
#ra_arr.tolist()
dec_list
=
[
param
[
'dec'
]]
#dec_arr.tolist()
pmra_list
=
np
.
zeros
(
1
).
tolist
()
pmdec_list
=
np
.
zeros
(
1
).
tolist
()
rv_list
=
np
.
zeros
(
1
).
tolist
()
parallax_list
=
[
1e-9
]
*
1
dt
=
datetime
.
fromtimestamp
(
self
.
pointing
.
timestamp
)
date_str
=
dt
.
date
().
isoformat
()
time_str
=
dt
.
time
().
isoformat
()
ra_arr
,
dec_arr
=
on_orbit_obs_position
(
input_ra_list
=
ra_list
,
input_dec_list
=
dec_list
,
input_pmra_list
=
pmra_list
,
input_pmdec_list
=
pmdec_list
,
input_rv_list
=
rv_list
,
input_parallax_list
=
parallax_list
,
input_nstars
=
1
,
input_x
=
self
.
pointing
.
sat_x
,
input_y
=
self
.
pointing
.
sat_y
,
input_z
=
self
.
pointing
.
sat_z
,
input_vx
=
self
.
pointing
.
sat_vx
,
input_vy
=
self
.
pointing
.
sat_vy
,
input_vz
=
self
.
pointing
.
sat_vz
,
input_epoch
=
"J2015.5"
,
input_date_str
=
date_str
,
input_time_str
=
time_str
)
param
[
'ra'
]
=
ra_arr
[
0
]
param
[
'dec'
]
=
dec_arr
[
0
]
# Assign each galaxy a template SED
param
[
'sed_type'
]
=
sed_assign
(
phz
=
param
[
'z'
],
btt
=
param
[
'bfrac'
],
rng
=
self
.
rng_sedGal
)
param
[
'redden'
]
=
self
.
tempRed_gal
[
param
[
'sed_type'
]]
param
[
'av'
]
=
0.0
param
[
'redden'
]
=
0
param
[
'mu'
]
=
1
#param["CSSTmag"]= True
#param["mag_r"] = 20.
#param['']
###more keywords for stamp###
param
[
'image'
]
=
hdu
[
0
].
data
param
[
'image'
]
=
param
[
'image'
]
/
(
np
.
sum
(
param
[
'image'
]))
obj
=
Stamp
(
param
)
self
.
objs
.
append
(
obj
)
def
_load
(
self
,
**
kwargs
):
self
.
objs
=
[]
self
.
ids
=
0
if
"stamp_cat"
in
self
.
config
[
"catalog_options"
][
"input_path"
]
and
self
.
config
[
"catalog_options"
][
"input_path"
][
"stamp_cat"
]
and
self
.
config
[
"catalog_options"
][
"stamp_yes"
]:
stamps_cat
=
h5
.
File
(
self
.
stamp_path
,
'r'
)[
'Stamps'
]
print
(
"debug::"
,
stamps_cat
.
keys
())
for
pix
in
self
.
pix_list
:
try
:
stamps
=
stamps_cat
[
str
(
pix
)]
print
(
"debug::"
,
stamps
.
keys
())
self
.
_load_stamps
(
stamps
,
pix_id
=
pix
)
del
stamps
except
Exception
as
e
:
self
.
logger
.
error
(
str
(
e
))
print
(
e
)
if
self
.
logger
is
not
None
:
self
.
logger
.
info
(
"maximum galaxy size: %.4f"
%
(
self
.
max_size
))
self
.
logger
.
info
(
"number of objects in catalog: %d"
%
(
len
(
self
.
objs
)))
else
:
print
(
"number of objects in catalog: "
,
len
(
self
.
objs
))
def
load_sed
(
self
,
obj
,
**
kwargs
):
if
obj
.
type
==
'stamp'
:
sed_data
=
getObservedSED
(
sedCat
=
self
.
tempSed_gal
[
obj
.
sed_type
],
redshift
=
obj
.
z
,
av
=
obj
.
param
[
"av"
],
redden
=
obj
.
param
[
"redden"
]
)
wave
,
flux
=
sed_data
[
0
],
sed_data
[
1
]
else
:
raise
ValueError
(
"Object type not known"
)
speci
=
interpolate
.
interp1d
(
wave
,
flux
)
lamb
=
np
.
arange
(
2000
,
11001
+
0.5
,
0.5
)
y
=
speci
(
lamb
)
# erg/s/cm2/A --> photon/s/m2/A
all_sed
=
y
*
lamb
/
(
cons
.
h
.
value
*
cons
.
c
.
value
)
*
1e-13
sed
=
Table
(
np
.
array
([
lamb
,
all_sed
]).
T
,
names
=
(
'WAVELENGTH'
,
'FLUX'
))
del
wave
del
flux
return
sed
ObservationSim/Astrometry/Astrometry_util.py
deleted
100644 → 0
View file @
4afd1181
from
ctypes
import
*
import
numpy
as
np
try
:
import
importlib.resources
as
pkg_resources
except
ImportError
:
# Try backported to PY<37 'importlib_resources'
import
importlib_resources
as
pkg_resources
def
checkInputList
(
input_list
,
n
):
if
not
isinstance
(
input_list
,
list
):
raise
TypeError
(
"Input type is not list!"
,
input_list
)
for
i
in
input_list
:
if
type
(
i
)
!=
type
(
1.1
):
if
type
(
i
)
!=
type
(
1
):
raise
TypeError
(
"Input list's element is not float or int!"
,
input_list
)
if
len
(
input_list
)
!=
n
:
raise
RuntimeError
(
"Length of input list is not equal to stars' number!"
,
input_list
)
def
on_orbit_obs_position
(
input_ra_list
,
input_dec_list
,
input_pmra_list
,
input_pmdec_list
,
input_rv_list
,
input_parallax_list
,
input_nstars
,
input_x
,
input_y
,
input_z
,
input_vx
,
input_vy
,
input_vz
,
input_epoch
,
input_date_str
,
input_time_str
,
lib_path
=
None
):
#Check input parameters
if
not
isinstance
(
input_nstars
,
int
):
raise
TypeError
(
"Parameter 7 is not int!"
,
input_nstars
)
checkInputList
(
input_ra_list
,
input_nstars
)
checkInputList
(
input_dec_list
,
input_nstars
)
checkInputList
(
input_pmra_list
,
input_nstars
)
checkInputList
(
input_pmdec_list
,
input_nstars
)
checkInputList
(
input_rv_list
,
input_nstars
)
checkInputList
(
input_parallax_list
,
input_nstars
)
if
not
isinstance
(
input_x
,
float
):
raise
TypeError
(
"Parameter 8 is not double!"
,
input_x
)
if
not
isinstance
(
input_y
,
float
):
raise
TypeError
(
"Parameter 9 is not double!"
,
input_y
)
if
not
isinstance
(
input_z
,
float
):
raise
TypeError
(
"Parameter 10 is not double!"
,
input_z
)
if
not
isinstance
(
input_vx
,
float
):
raise
TypeError
(
"Parameter 11 is not double!"
,
input_vx
)
if
not
isinstance
(
input_vy
,
float
):
raise
TypeError
(
"Parameter 12 is not double!"
,
input_vy
)
if
not
isinstance
(
input_vz
,
float
):
raise
TypeError
(
"Parameter 13 is not double!"
,
input_vz
)
#Convert km -> m
input_x
=
input_x
*
1000.0
input_y
=
input_y
*
1000.0
input_z
=
input_z
*
1000.0
input_vx
=
input_vx
*
1000.0
input_vy
=
input_vy
*
1000.0
input_vz
=
input_vz
*
1000.0
if
not
isinstance
(
input_date_str
,
str
):
raise
TypeError
(
"Parameter 15 is not string!"
,
input_date_str
)
else
:
input_date_str
=
input_date_str
.
strip
()
if
not
(
input_date_str
[
4
]
==
"-"
and
input_date_str
[
7
]
==
"-"
):
raise
TypeError
(
"Parameter 15 format error (1)!"
,
input_date_str
)
else
:
tmp
=
input_date_str
.
split
(
"-"
)
if
len
(
tmp
)
!=
3
:
raise
TypeError
(
"Parameter 15 format error (2)!"
,
input_date_str
)
input_year
=
int
(
tmp
[
0
])
input_month
=
int
(
tmp
[
1
])
input_day
=
int
(
tmp
[
2
])
if
not
(
input_year
>=
1900
and
input_year
<=
2100
):
raise
TypeError
(
"Parameter 15 year range error [1900 ~ 2100]!"
,
input_year
)
if
not
(
input_month
>=
1
and
input_month
<=
12
):
raise
TypeError
(
"Parameter 15 month range error [1 ~ 12]!"
,
input_month
)
if
not
(
input_day
>=
1
and
input_day
<=
31
):
raise
TypeError
(
"Parameter 15 day range error [1 ~ 31]!"
,
input_day
)
if
not
isinstance
(
input_time_str
,
str
):
raise
TypeError
(
"Parameter 16 is not string!"
,
input_time_str
)
else
:
input_time_str
=
input_time_str
.
strip
()
if
not
(
input_time_str
[
2
]
==
":"
and
input_time_str
[
5
]
==
":"
):
raise
TypeError
(
"Parameter 16 format error (1)!"
,
input_time_str
)
else
:
tmp
=
input_time_str
.
split
(
":"
)
if
len
(
tmp
)
!=
3
:
raise
TypeError
(
"Parameter 16 format error (2)!"
,
input_time_str
)
input_hour
=
int
(
tmp
[
0
])
input_minute
=
int
(
tmp
[
1
])
input_second
=
float
(
tmp
[
2
])
if
not
(
input_hour
>=
0
and
input_hour
<=
23
):
raise
TypeError
(
"Parameter 16 hour range error [0 ~ 23]!"
,
input_hour
)
if
not
(
input_minute
>=
0
and
input_minute
<=
59
):
raise
TypeError
(
"Parameter 16 minute range error [0 ~ 59]!"
,
input_minute
)
if
not
(
input_second
>=
0
and
input_second
<
60.0
):
raise
TypeError
(
"Parameter 16 second range error [0 ~ 60)!"
,
input_second
)
#Inital dynamic lib
try
:
with
pkg_resources
.
files
(
'ObservationSim.Astrometry.lib'
).
joinpath
(
"libshao.so"
)
as
lib_path
:
shao
=
cdll
.
LoadLibrary
(
lib_path
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Astrometry.lib'
,
"libshao.so"
)
as
lib_path
:
shao
=
cdll
.
LoadLibrary
(
lib_path
)
shao
.
onOrbitObs
.
restype
=
c_int
d3
=
c_double
*
3
shao
.
onOrbitObs
.
argtypes
=
[
c_double
,
c_double
,
c_double
,
c_double
,
c_double
,
c_double
,
\
c_int
,
c_int
,
c_int
,
c_int
,
c_int
,
c_double
,
\
c_double
,
POINTER
(
d3
),
POINTER
(
d3
),
\
c_int
,
c_int
,
c_int
,
c_int
,
c_int
,
c_double
,
\
POINTER
(
c_double
),
POINTER
(
c_double
)
]
output_ra_list
=
list
()
output_dec_list
=
list
()
for
i
in
range
(
input_nstars
):
input_ra
=
c_double
(
input_ra_list
[
i
])
input_dec
=
c_double
(
input_dec_list
[
i
])
input_pmra
=
c_double
(
input_pmra_list
[
i
])
input_pmdec
=
c_double
(
input_pmdec_list
[
i
])
# input_rv = c_double(input_rv_list[i] * 3600.) # Convert from km/s to km/h
input_rv
=
c_double
(
input_rv_list
[
i
])
input_parallax
=
c_double
(
input_parallax_list
[
i
])
p3
=
d3
(
input_x
,
input_y
,
input_z
)
v3
=
d3
(
input_vx
,
input_vy
,
input_vz
)
input_year_c
=
c_int
(
input_year
)
input_month_c
=
c_int
(
input_month
)
input_day_c
=
c_int
(
input_day
)
input_hour_c
=
c_int
(
input_hour
)
input_minute_c
=
c_int
(
input_minute
)
input_second_c
=
c_double
(
input_second
)
DAT
=
c_double
(
37.0
)
output_ra
=
c_double
(
0.0
)
output_dec
=
c_double
(
0.0
)
rs
=
shao
.
onOrbitObs
(
input_ra
,
input_dec
,
input_parallax
,
input_pmra
,
input_pmdec
,
input_rv
,
\
input_year_c
,
input_month_c
,
input_day_c
,
input_hour_c
,
input_minute_c
,
input_second_c
,
\
DAT
,
byref
(
p3
),
byref
(
v3
),
\
input_year_c
,
input_month_c
,
input_day_c
,
input_hour_c
,
input_minute_c
,
input_second_c
,
\
byref
(
output_ra
),
byref
(
output_dec
))
if
rs
!=
0
:
raise
RuntimeError
(
"Calculate error!"
)
output_ra_list
.
append
(
output_ra
.
value
)
output_dec_list
.
append
(
output_dec
.
value
)
return
np
.
array
(
output_ra_list
),
np
.
array
(
output_dec_list
)
ObservationSim/Astrometry/__init__.py
deleted
100644 → 0
View file @
4afd1181
ObservationSim/Astrometry/lib/__init__.py
deleted
100644 → 0
View file @
4afd1181
ObservationSim/Astrometry/lib/libshao.so
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/Config/ChipOutput.py
deleted
100755 → 0
View file @
4afd1181
import
os
import
logging
import
ObservationSim.Config._util
as
_util
from
ObservationSim.Config.Header
import
generatePrimaryHeader
class
ChipOutput
(
object
):
def
__init__
(
self
,
config
,
chip
,
filt
,
pointing
,
logger_filename
=
None
):
self
.
config
=
config
self
.
chip
=
chip
self
.
filt
=
filt
self
.
pointing_type
=
pointing
.
pointing_type
self
.
chip_label
=
str
(
chip
.
chipID
).
rjust
(
2
,
'0'
)
# Get primary header based on chip and pointing
self
.
h_prim
=
generatePrimaryHeader
(
xlen
=
chip
.
npix_x
,
ylen
=
chip
.
npix_y
,
pointing_id
=
pointing
.
obs_id
,
pointing_type_code
=
pointing
.
pointing_type_code
,
ra
=
pointing
.
ra
,
dec
=
pointing
.
dec
,
pixel_scale
=
chip
.
pix_scale
,
time_pt
=
pointing
.
timestamp
,
exptime
=
pointing
.
exp_time
,
im_type
=
pointing
.
pointing_type
,
sat_pos
=
[
pointing
.
sat_x
,
pointing
.
sat_y
,
pointing
.
sat_z
],
sat_vel
=
[
pointing
.
sat_vx
,
pointing
.
sat_vy
,
pointing
.
sat_vz
],
project_cycle
=
self
.
config
[
"project_cycle"
],
run_counter
=
self
.
config
[
"run_counter"
],
chip_name
=
self
.
chip_label
)
obs_id
=
_util
.
get_obs_id
(
img_type
=
self
.
pointing_type
,
project_cycle
=
config
[
"project_cycle"
],
run_counter
=
config
[
"run_counter"
],
pointing_id
=
pointing
.
obs_id
,
pointing_type_code
=
pointing
.
pointing_type_code
)
self
.
subdir
=
pointing
.
output_dir
self
.
cat_name
=
self
.
h_prim
[
'FILENAME'
]
+
'.cat'
if
logger_filename
is
None
:
logger_filename
=
self
.
h_prim
[
'FILENAME'
]
+
'.log'
self
.
logger
=
logging
.
getLogger
()
fh
=
logging
.
FileHandler
(
os
.
path
.
join
(
self
.
subdir
,
logger_filename
),
mode
=
'w+'
,
encoding
=
'utf-8'
)
fh
.
setLevel
(
logging
.
DEBUG
)
self
.
logger
.
setLevel
(
logging
.
DEBUG
)
logging
.
getLogger
(
'numba'
).
setLevel
(
logging
.
WARNING
)
formatter
=
logging
.
Formatter
(
'%(asctime)s - %(msecs)d - %(levelname)-8s - [%(filename)s:%(lineno)d] - %(message)s'
)
fh
.
setFormatter
(
formatter
)
self
.
logger
.
addHandler
(
fh
)
hdr1
=
"# obj_ID ID_chip filter xImage yImage ra dec ra_orig dec_orig z mag obj_type "
hdr2
=
"pm_ra pm_dec RV parallax"
fmt1
=
"%20s %4d %5s %10.3f %10.3f %15.8f %15.8f %15.8f %15.8f %7.4f %8.4f %15s "
fmt2
=
"%15.8f %15.8f %15.8f %15.8f"
self
.
hdr
=
hdr1
+
hdr2
self
.
fmt
=
fmt1
+
fmt2
self
.
logger
.
info
(
"pointing_type = %s
\n
"
%
(
self
.
pointing_type
))
def
Log_info
(
self
,
message
):
print
(
message
)
self
.
logger
.
info
(
message
)
def
Log_error
(
self
,
message
):
print
(
message
)
self
.
logger
.
error
(
message
)
def
update_output_header
(
self
,
additional_column_names
=
""
):
self
.
hdr
+=
additional_column_names
def
create_output_file
(
self
):
if
self
.
pointing_type
==
'SCI'
:
self
.
cat
=
open
(
os
.
path
.
join
(
self
.
subdir
,
self
.
cat_name
),
"w"
)
self
.
logger
.
info
(
"Creating catalog file %s ...
\n
"
%
(
os
.
path
.
join
(
self
.
subdir
,
self
.
cat_name
)))
if
not
self
.
hdr
.
endswith
(
"
\n
"
):
self
.
hdr
+=
"
\n
"
self
.
cat
.
write
(
self
.
hdr
)
def
cat_add_obj
(
self
,
obj
,
pos_img
,
pos_shear
):
ximg
=
obj
.
real_pos
.
x
+
1.0
yimg
=
obj
.
real_pos
.
y
+
1.0
line
=
self
.
fmt
%
(
obj
.
id
,
int
(
self
.
chip_label
),
self
.
filt
.
filter_type
,
ximg
,
yimg
,
obj
.
ra
,
obj
.
dec
,
obj
.
ra_orig
,
obj
.
dec_orig
,
obj
.
z
,
obj
.
getMagFilter
(
self
.
filt
),
obj
.
type
,
obj
.
pmra
,
obj
.
pmdec
,
obj
.
rv
,
obj
.
parallax
)
line
+=
obj
.
additional_output_str
if
not
line
.
endswith
(
"
\n
"
):
line
+=
"
\n
"
self
.
cat
.
write
(
line
)
ObservationSim/Config/Header/ImageHeader.py
deleted
100644 → 0
View file @
4afd1181
This diff is collapsed.
Click to expand it.
ObservationSim/Config/Header/ImageHeader_1.py
deleted
100644 → 0
View file @
4afd1181
"""
generate image header
"""
import
numpy
as
np
from
astropy.io
import
fits
import
astropy.wcs
as
pywcs
from
scipy
import
math
import
random
import
os
import
sys
def
chara2digit
(
char
):
""" Function to judge and convert characters to digitals
Parameters
----------
"""
try
:
float
(
char
)
# for int, long and float
except
ValueError
:
pass
return
char
else
:
data
=
float
(
char
)
return
data
def
read_header_parameter
(
filename
=
'global_header.param'
):
""" Function to read the header parameters
Parameters
----------
"""
name
=
[]
value
=
[]
description
=
[]
for
line
in
open
(
filename
):
line
=
line
.
strip
(
"
\n
"
)
arr
=
line
.
split
(
'|'
)
# csvReader = csv.reader(csvDataFile)
# for arr in csvReader:
name
.
append
(
arr
[
0
])
value
.
append
(
chara2digit
(
arr
[
1
]))
description
.
append
(
arr
[
2
])
# print(value)
return
name
,
value
,
description
def
rotate_CD_matrix
(
cd
,
pa_aper
):
"""Rotate CD matrix
Parameters
----------
cd: (2,2) array
CD matrix
pa_aper: float
Position angle, in degrees E from N, of y axis of the detector
Returns
-------
cd_rot: (2,2) array
Rotated CD matrix
Comments
--------
`astropy.wcs.WCS.rotateCD` doesn't work for non-square pixels in that it
doesn't preserve the pixel scale! The bug seems to come from the fact
that `rotateCD` assumes a transposed version of its own CD matrix.
"""
rad
=
np
.
deg2rad
(
-
pa_aper
)
mat
=
np
.
zeros
((
2
,
2
))
mat
[
0
,:]
=
np
.
array
([
np
.
cos
(
rad
),
-
np
.
sin
(
rad
)])
mat
[
1
,:]
=
np
.
array
([
np
.
sin
(
rad
),
np
.
cos
(
rad
)])
cd_rot
=
np
.
dot
(
mat
,
cd
)
return
cd_rot
def
Header_extention
(
xlen
=
9232
,
ylen
=
9216
,
gain
=
1.0
,
readout
=
5.0
,
dark
=
0.02
,
saturation
=
90000
,
row_num
=
1
,
col_num
=
1
):
""" Creat an image frame for CCST with multiple extensions
Parameters
----------
"""
flag_ltm_x
=
[
0
,
1
,
-
1
,
1
,
-
1
]
flag_ltm_y
=
[
0
,
1
,
1
,
-
1
,
-
1
]
flag_ltv_x
=
[
0
,
0
,
1
,
0
,
1
]
flag_ltv_y
=
[
0
,
0
,
0
,
1
,
1
]
detector_size_x
=
int
(
xlen
)
detector_size_y
=
int
(
ylen
)
data_x
=
str
(
int
(
detector_size_x
))
data_y
=
str
(
int
(
detector_size_y
))
data_sec
=
'[1:'
+
data_x
+
',1:'
+
data_y
+
']'
name
=
[]
value
=
[]
description
=
[]
for
k
in
range
(
1
,
2
):
# f = open("extension"+str(k)+"_image.param","w")
j
=
row_num
i
=
col_num
ccdnum
=
str
((
j
-
1
)
*
5
+
i
)
name
=
[
'EXTNAME'
,
'BSCALE'
,
'BZERO'
,
'OBSID'
,
'CCDNAME'
,
'AMPNAME'
,
'GAIN'
,
'RDNOISE'
,
'DARK'
,
'SATURATE'
,
'RSPEED'
,
'CHIPTEMP'
,
'CCDCHIP'
,
'DATASEC'
,
'CCDSUM'
,
'NSUM'
,
'LTM1_1'
,
'LTM2_2'
,
'LTV1'
,
'LTV2'
,
'ATM1_1'
,
'ATM2_2'
,
'ATV1'
,
'ATV2'
,
'DTV1'
,
'DTV2'
,
'DTM1_1'
,
'DTM2_2'
]
value
=
[
'IM'
+
str
(
k
),
1.0
,
0.0
,
'CSST.20200101T000000'
,
'ccd'
+
ccdnum
.
rjust
(
2
,
'0'
),
'ccd'
+
ccdnum
.
rjust
(
2
,
'0'
)
+
':'
+
str
(
k
),
gain
,
readout
,
dark
,
saturation
,
10.0
,
-
100.0
,
'ccd'
+
ccdnum
.
rjust
(
2
,
'0'
),
data_sec
,
'1 1'
,
'1 1'
,
flag_ltm_x
[
k
],
flag_ltm_y
[
k
],
flag_ltv_x
[
k
]
*
(
detector_size_x
-
20
*
2
+
1
),
flag_ltv_y
[
k
]
*
(
detector_size_y
+
1
),
flag_ltm_x
[
k
],
flag_ltm_y
[
k
],
flag_ltv_x
[
k
]
*
(
detector_size_x
-
20
*
2
+
1
),
flag_ltv_y
[
k
]
*
(
detector_size_y
+
1
),
0
,
0
,
1
,
1
]
description
=
[
'Extension name'
,
' '
,
' '
,
'Observation ID'
,
'CCD name'
,
'Amplifier name'
,
'Gain (e-/ADU)'
,
'Readout noise (e-/pixel)'
,
'Dark noise (e-/pixel/s)'
,
'Saturation (e-)'
,
'Read speed'
,
'Chip temperature'
,
'CCD chip ID'
,
'Data section'
,
'CCD pixel summing'
,
'CCD pixel summing'
,
'CCD to image transformation'
,
'CCD to image transformation'
,
'CCD to image transformation'
,
'CCD to image transformation'
,
'CCD to amplifier transformation'
,
'CCD to amplifier transformation'
,
'CCD to amplifier transformation'
,
'CCD to amplifier transformation'
,
'CCD to detector transformatio'
,
'CCD to detector transformatio'
,
'CCD to detector transformatio'
,
'CCD to detector transformatio'
]
return
name
,
value
,
description
##9232 9216 898 534 1309 60 -40 -23.4333
def
WCS_def
(
xlen
=
9232
,
ylen
=
9216
,
gapx
=
898.0
,
gapy1
=
534
,
gapy2
=
1309
,
ra
=
60
,
dec
=
-
40
,
pa
=
-
23.433
,
psize
=
0.074
,
row_num
=
1
,
col_num
=
1
):
""" Creat a wcs frame for CCST with multiple extensions
Parameters
----------
"""
flag_x
=
[
0
,
1
,
-
1
,
1
,
-
1
]
flag_y
=
[
0
,
1
,
1
,
-
1
,
-
1
]
flag_ext_x
=
[
0
,
-
1
,
1
,
-
1
,
1
]
flag_ext_y
=
[
0
,
-
1
,
-
1
,
1
,
1
]
x_num
=
5
y_num
=
6
detector_num
=
x_num
*
y_num
detector_size_x
=
xlen
detector_size_y
=
ylen
gap_x
=
gapx
gap_y
=
[
gapy1
,
gapy2
]
ra_ref
=
ra
dec_ref
=
dec
pa_aper
=
pa
pixel_size
=
psize
gap_y1_num
=
3
gap_y2_num
=
2
x_center
=
(
detector_size_x
*
x_num
+
gap_x
*
(
x_num
-
1
))
/
2
y_center
=
(
detector_size_y
*
y_num
+
gap_y
[
0
]
*
gap_y1_num
+
gap_y
[
1
]
*
gap_y2_num
)
/
2
gap_y_map
=
np
.
array
([[
0
,
0
,
0
,
0
,
0
],[
gap_y
[
0
],
gap_y
[
1
],
gap_y
[
1
],
gap_y
[
1
],
gap_y
[
1
]],[
gap_y
[
1
],
gap_y
[
0
],
gap_y
[
0
],
gap_y
[
0
],
gap_y
[
0
]],[
gap_y
[
0
],
gap_y
[
0
],
gap_y
[
0
],
gap_y
[
0
],
gap_y
[
0
]],[
gap_y
[
0
],
gap_y
[
0
],
gap_y
[
0
],
gap_y
[
0
],
gap_y
[
1
]],[
gap_y
[
1
],
gap_y
[
1
],
gap_y
[
1
],
gap_y
[
1
],
gap_y
[
0
]]])
frame_array
=
np
.
empty
((
5
,
6
),
dtype
=
np
.
float64
)
# print(x_center,y_center)
j
=
row_num
i
=
col_num
ccdnum
=
str
((
j
-
1
)
*
5
+
i
)
x_ref
,
y_ref
=
(
detector_size_x
+
gap_x
)
*
i
-
gap_x
-
detector_size_x
/
2
,
detector_size_y
*
j
+
sum
(
gap_y_map
[
0
:
j
,
i
-
1
])
-
detector_size_y
/
2
# print(i,j,x_ref,y_ref,ra_ref,dec_ref)
name
=
[]
value
=
[]
description
=
[]
for
k
in
range
(
1
,
2
):
cd
=
np
.
array
([[
pixel_size
,
0
],
[
0
,
pixel_size
]])
/
3600.
*
flag_x
[
k
]
cd_rot
=
rotate_CD_matrix
(
cd
,
pa_aper
)
# f = open("CCD"+ccdnum.rjust(2,'0')+"_extension"+str(k)+"_wcs.param","w")
name
=
[
'EQUINOX'
,
'WCSDIM'
,
'CTYPE1'
,
'CTYPE2'
,
'CRVAL1'
,
'CRVAL2'
,
'CRPIX1'
,
'CRPIX2'
,
'CD1_1'
,
'CD1_2'
,
'CD2_1'
,
'CD2_2'
]
value
=
[
2000.0
,
2.0
,
'RA---TAN'
,
'DEC--TAN'
,
ra_ref
,
dec_ref
,
flag_ext_x
[
k
]
*
((
x_ref
+
flag_ext_x
[
k
]
*
detector_size_x
/
2
)
-
x_center
),
flag_ext_y
[
k
]
*
((
y_ref
+
flag_ext_y
[
k
]
*
detector_size_y
/
2
)
-
y_center
),
cd_rot
[
0
,
0
],
cd_rot
[
0
,
1
],
cd_rot
[
1
,
0
],
cd_rot
[
1
,
1
]]
description
=
[
'Equinox of WCS'
,
'WCS Dimensionality'
,
'Coordinate type'
,
'Coordinate typ'
,
'Coordinate reference value'
,
'Coordinate reference value'
,
'Coordinate reference pixel'
,
'Coordinate reference pixel'
,
'Coordinate matrix'
,
'Coordinate matrix'
,
'Coordinate matrix'
,
'Coordinate matrix'
]
return
name
,
value
,
description
def
generatePrimaryHeader
(
xlen
=
9232
,
ylen
=
9216
,
pointNum
=
'1'
,
ra
=
60
,
dec
=
-
40
,
psize
=
0.074
,
row_num
=
1
,
col_num
=
1
):
# array_size1, array_size2, flux, sigma = int(argv[1]), int(argv[2]), 1000.0, 5.0
filerParm_fn
=
os
.
path
.
split
(
os
.
path
.
realpath
(
__file__
))[
0
]
+
'/filter.lst'
f
=
open
(
filerParm_fn
)
s
=
f
.
readline
()
s
=
s
.
strip
(
"
\n
"
)
filter
=
s
.
split
(
' '
)
k
=
(
row_num
-
1
)
*
5
+
col_num
ccdnum
=
str
(
k
)
g_header_fn
=
os
.
path
.
split
(
os
.
path
.
realpath
(
__file__
))[
0
]
+
'/global_header.param'
name
,
value
,
description
=
read_header_parameter
(
g_header_fn
)
h_prim
=
fits
.
Header
()
date
=
'200930'
time_obs
=
'120000'
for
i
in
range
(
len
(
name
)):
if
(
name
[
i
]
==
'FILTER'
):
value
[
i
]
=
filter
[
k
-
1
]
if
(
name
[
i
]
==
'FILENAME'
):
value
[
i
]
=
'CSST_'
+
date
+
'_'
+
time_obs
+
'_'
+
pointNum
.
rjust
(
6
,
'0'
)
+
'_'
+
ccdnum
.
rjust
(
2
,
'0'
)
+
'_raw'
if
(
name
[
i
]
==
'DETSIZE'
):
value
[
i
]
=
'[1:'
+
str
(
int
(
xlen
))
+
',1:'
+
str
(
int
(
ylen
))
+
']'
if
(
name
[
i
]
==
'PIXSCAL1'
):
value
[
i
]
=
str
(
psize
)
if
(
name
[
i
]
==
'PIXSCAL2'
):
value
[
i
]
=
str
(
psize
)
h_prim
[
name
[
i
]]
=
(
value
[
i
],
description
[
i
])
h_prim
.
add_comment
(
'=================================================================='
,
after
=
'FILETYPE'
)
h_prim
.
add_comment
(
'Target information'
)
h_prim
.
add_comment
(
'=================================================================='
)
h_prim
.
add_comment
(
'=================================================================='
,
after
=
'EQUINOX'
)
h_prim
.
add_comment
(
'Exposure information'
)
h_prim
.
add_comment
(
'=================================================================='
)
h_prim
.
add_comment
(
'=================================================================='
,
after
=
'MJDEND'
)
h_prim
.
add_comment
(
'Telescope information'
)
h_prim
.
add_comment
(
'=================================================================='
)
h_prim
.
add_comment
(
'=================================================================='
,
after
=
'REFFRAME'
)
h_prim
.
add_comment
(
'Detector information'
)
h_prim
.
add_comment
(
'=================================================================='
)
h_prim
.
add_comment
(
'=================================================================='
,
after
=
'FILTER'
)
h_prim
.
add_comment
(
'Other information'
)
h_prim
.
add_comment
(
'=================================================================='
)
return
h_prim
def
generateExtensionHeader
(
xlen
=
9232
,
ylen
=
9216
,
ra
=
60
,
dec
=
-
40
,
pa
=
-
23.433
,
gain
=
1.0
,
readout
=
5.0
,
dark
=
0.02
,
saturation
=
90000
,
psize
=
0.074
,
row_num
=
1
,
col_num
=
1
):
h_ext
=
fits
.
Header
()
for
i
in
range
(
1
,
2
):
# NAXIS1:Number of pixels per row; NAXIS2:Number of rows
h_ext
[
'NAXIS1'
]
=
xlen
h_ext
[
'NAXIS2'
]
=
ylen
name
,
value
,
description
=
Header_extention
(
xlen
=
xlen
,
ylen
=
ylen
,
gain
=
gain
,
readout
=
readout
,
dark
=
dark
,
saturation
=
saturation
,
row_num
=
row_num
,
col_num
=
col_num
)
for
j
in
range
(
len
(
name
)):
h_ext
[
name
[
j
]]
=
(
value
[
j
],
description
[
j
])
name
,
value
,
description
=
WCS_def
(
xlen
=
xlen
,
ylen
=
ylen
,
gapx
=
898.0
,
gapy1
=
534
,
gapy2
=
1309
,
ra
=
ra
,
dec
=
dec
,
pa
=
pa
,
psize
=
psize
,
row_num
=
row_num
,
col_num
=
col_num
)
for
j
in
range
(
len
(
name
)):
h_ext
[
name
[
j
]]
=
(
value
[
j
],
description
[
j
])
h_ext
.
add_comment
(
'=================================================================='
,
after
=
'OBSID'
)
h_ext
.
add_comment
(
'Readout information'
)
h_ext
.
add_comment
(
'=================================================================='
)
h_ext
.
add_comment
(
'=================================================================='
,
after
=
'CHIPTEMP'
)
h_ext
.
add_comment
(
'Chip information'
)
h_ext
.
add_comment
(
'=================================================================='
)
h_ext
.
add_comment
(
'=================================================================='
,
after
=
'DTM2_2'
)
h_ext
.
add_comment
(
'WCS information'
)
h_ext
.
add_comment
(
'=================================================================='
)
return
h_ext
def
main
(
argv
):
xlen
=
int
(
argv
[
1
])
ylen
=
int
(
argv
[
2
])
pointingNum
=
argv
[
3
]
ra
=
float
(
argv
[
4
])
dec
=
float
(
argv
[
5
])
pSize
=
float
(
argv
[
6
])
ccd_row_num
=
int
(
argv
[
7
])
ccd_col_num
=
int
(
argv
[
8
])
pa_aper
=
float
(
argv
[
9
])
gain
=
float
(
argv
[
10
])
readout
=
float
(
argv
[
11
])
dark
=
float
(
argv
[
12
])
fw
=
float
(
argv
[
13
])
h_prim
=
generatePrimaryHeader
(
xlen
=
xlen
,
ylen
=
ylen
,
ra
=
ra
,
dec
=
dec
,
psize
=
pSize
,
row_num
=
ccd_row_num
,
col_num
=
ccd_col_num
,
pointNum
=
pointingNum
)
h_ext
=
generateExtensionHeader
(
xlen
=
xlen
,
ylen
=
ylen
,
ra
=
ra
,
dec
=
dec
,
pa
=
pa_aper
,
gain
=
gain
,
readout
=
readout
,
dark
=
dark
,
saturation
=
fw
,
psize
=
pSize
,
row_num
=
ccd_row_num
,
col_num
=
ccd_col_num
)
hdu1
=
fits
.
PrimaryHDU
(
header
=
h_prim
)
hdu2
=
fits
.
ImageHDU
(
np
.
zeros
([
ylen
,
xlen
]),
header
=
h_ext
)
hdul
=
fits
.
HDUList
([
hdu1
,
hdu2
])
hdul
.
writeto
(
h_prim
[
'FILENAME'
]
+
'.fits'
,
output_verify
=
'ignore'
)
# if __name__ == "__main__":
# main(sys.argv)
ObservationSim/Config/Header/Readme.pdf
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/Config/Header/__init__.py
deleted
100755 → 0
View file @
4afd1181
from
.ImageHeader
import
generatePrimaryHeader
from
.ImageHeader
import
generateExtensionHeader
\ No newline at end of file
ObservationSim/Config/Header/csst_msc_l0_ms.fits
deleted
100644 → 0
View file @
4afd1181
This diff is collapsed.
Click to expand it.
ObservationSim/Config/Header/extension_header.header
deleted
100644 → 0
View file @
4afd1181
XTENSION= 'IMAGE ' / extension type BITPIX = 16 / bits per data value NAXIS = 2 / number of data axes NAXIS1 = 9216 / length of first array axis NAXIS2 = 9232 / length of second array axis PCOUNT = 0 GCOUNT = 1 EXTNAME = 'SCI ' EXTVER = 1 BSCALE = 1 BZERO = 32768 BUNIT = 'ADU ' / physical unit of array values COMMENT ========================================================================COMMENT Detector information COMMENT ========================================================================CAMERA = 'MS' / camera of main survey DETSN = '12345678' / detector serial number DETNAME = 'CCD' / detector type DETTEMP1= 173.0 / detector temperature at EXPSTART(in Kelvin) DETTEMP2= 173.0 / detector temperature at EXPEND(in Kelvin) DETTEMP3= 173.0 / detector temperature at READT1(in Kelvin) DETSIZE = '9560x9264' / detector size DATASECT= '9216x9232' / data section PIXSCAL1= 0.074 / pixel scale for axis 1 PIXSCAL2= 0.074 / pixel scale for axis 2 PIXSIZE1= 10 / pixel size for axis 1 (in um) PIXSIZE2= 10 / pixel size for axis 2 (in um) COMMENT ========================================================================COMMENT CCD chip information COMMENT ========================================================================CHIPID = '08' / chip ID CHIPLAB = 'y-1' / chip label FILTER = 'y' / filter name NCHAN = 16 / number of readout channels PSCAN1 = 27 / horizontal prescan width, per readout channel PSCAN2 = 8 / vertical prescan width, per readout channel OSCAN1 = 16 / horizontal overscan width,per readout channel OSCAN2 = 16 / vertical overscan width,per readout channel COMMENT ========================================================================COMMENT WORLD COORDINATE SYSTEM AND RELATED PARAMETERS COMMENT ========================================================================WCSAXES = 2 / number of World Coordinate System axes CRPIX1 = -10017.0 / x-coordinate of reference pixel CRPIX2 = 24876.0 / y-coordinate of reference pixel CRVAL1 = 62.228226 / first axis value at reference pixel CRVAL2 = -42.316932 / second axis value at reference pixel CTYPE1 = 'RA---TAN' / the coordinate type for the first axis CTYPE2 = 'DEC--TAN' / the coordinate type for the second axis CD1_1 = 1.88602083707394E-05 / partial of first axis coordinate w.r.t.x CD1_2 = 8.17455836176000E-06 / partial of first axis coordinate w.r.t.y CD2_1 = -8.1745583617600E-06 / partial of second axis coordinate w.r.t.x CD2_2 = 1.88602083707394E-05 / partial of second axis coordinate w.r.t.y OTHERS = '' / COMMENT ========================================================================COMMENT Readout information COMMENT ========================================================================GAINLVL = '01' / gain level GAIN01 = 1.1 / gain (channel 01) GAIN02 = 1.1 / gain (channel 02) GAIN03 = 1.1 / gain (channel 03) GAIN04 = 1.1 / gain (channel 04) GAIN05 = 1.1 / gain (channel 05) GAIN06 = 1.1 / gain (channel 06) GAIN07 = 1.1 / gain (channel 07) GAIN08 = 1.1 / gain (channel 08) GAIN09 = 1.1 / gain (channel 09) GAIN10 = 1.1 / gain (channel 10) GAIN11 = 1.1 / gain (channel 11) GAIN12 = 1.1 / gain (channel 12) GAIN13 = 1.1 / gain (channel 13) GAIN14 = 1.1 / gain (channel 14) GAIN15 = 1.1 / gain (channel 15) GAIN16 = 1.1 / gain (channel 16) RON01 = 5.0 / read noise (channel 01) RON02 = 5.0 / read noise (channel 02) RON03 = 5.0 / read noise (channel 03) RON04 = 5.0 / read noise (channel 04) RON05 = 5.0 / read noise (channel 05) RON06 = 5.0 / read noise (channel 06) RON07 = 5.0 / read noise (channel 07) RON08 = 5.0 / read noise (channel 08) RON09 = 5.0 / read noise (channel 09) RON10 = 5.0 / read noise (channel 10) RON11 = 5.0 / read noise (channel 11) RON12 = 5.0 / read noise (channel 12) RON13 = 5.0 / read noise (channel 13) RON14 = 5.0 / read noise (channel 14) RON15 = 5.0 / read noise (channel 15) RON16 = 5.0 / read noise (channel 16) READT0 = '2024-00-00T00:00:00'/ readout start time(UTC) READT1 = '2024-00-00T00:00:00'/ readout end time(UTC) ROSPEED = 10.0 / readout speed (in MHz) EXPTIME = 150.0 / exposure duration DARKTIME= 150.0 / dark current time COMMENT ========================================================================COMMENT Shutter information COMMENT ========================================================================SHTSTAT = T / shutter status SHTOPEN0= 0.0 / shutter open time (begin) SHTOPEN1= 0.0 / shutter open time (end) SHTCLOS0= 0.0 / shutter close time (begin) SHTCLOS1= 0.0 / shutter close time (end) COMMENT ========================================================================COMMENT LED information COMMENT ========================================================================LEDFLAG = 0 / main/backup LED LEDSTAT = '00000000000000' / LED status LEDEXPT = 0.0 / LED flash time (s) LEDTEMP = 173.0 / LED temperature (in K) COMMENT ========================================================================COMMENT Other information COMMENT ========================================================================CHECKSUM= '''abcde''' / HDU checksum updated yyyy-mm-ddTHH:MM:SS DATASUM = '''abcde''' / data unit checksum updated yyyy-mm-ddTHH:MM:SS END
ObservationSim/Config/Header/extension_header.param
deleted
100644 → 0
View file @
4afd1181
EXTNAME|IM1|Extension name
EXTVER|1|The ID number
BSCALE|1|
BZERO|8|
OBSID|CSST.20200101T000000|Observation ID
CCDNAME|CCD02|CCD name
AMPNAME|ccd02:B|Amplifier name
GAIN|1.00|Gain (e/ADU)
RDNOISE|5.00|Readout noise (e)
SATURATE|90000.0|Saturation (ADU)
RSPEED|10.0|Read speed (in MHz)
CHIPTEMP|-100.0|Chip temperature (in K)
CCDCHIP|1|CCD chip ID
CCDLABEL|GI-1|CCD chip label
HOSCAN|2000|Horizontal overscan width, per readout channel
VOSCAN|2000|Virtical overscan height, per readout channel
CCDSUM|1 1|CCD pixel summing
CCDSEC|[1:9216:9232]|CCD section
AMPSEC|[1:9216:9232]|Amplifier section
DATASEC|[1:9216,1: 9232]|Data section
DETSEC|[1:9216,1:9232]|Detector section
BIASSEC|[9216:9217,9232:9234]|Bias section
TRIMSEC|[1:9216,1:9232]|Trim section
WCSDIM|2|WCS dimensionality
EQUINOX|2000|Epoch (year)
CTYPE1|RA---TPV|Coordinate type
CTYPE2|DEC---TPV|Coordinate type
CRVAL1|1.00|Coordinate reference value
CRVAL2|1.00|Coordinate reference value
CRPIX1|1.00|Coordinate reference pixel
CRPIX2|1.00|Coordinate reference pixel
CD1_1|1|Coordinate matrix
CD2_1|0|Coordinate matrix
CD1_2|0|Coordinate matrix
CD2_2|1|Coordinate matrix
CHECKSUM|C65|SHA256 checksum of global headers
\ No newline at end of file
ObservationSim/Config/Header/filter.lst
deleted
100644 → 0
View file @
4afd1181
GV GI y z y GI GU r u NUV i GV GU g NUV NUV g GU GV i NUV u r GU GI y z y GI GV
3 3 3 1 1 1 3 2 2 1 1 1 4 2 3 2 1 1 4 2 4 1 1 2 4 2 2 4 2 2
26 21 16 11 6 1 27 22 17 12 7 2 28 23 18 13 8 3 29 24 19 14 9 4 30 25 20 15 10 5
Prev
1
2
3
4
5
…
11
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment