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
Wu Jin
CSST simulation
Commits
c3247cab
Commit
c3247cab
authored
Nov 29, 2021
by
Fang Yuedong
Browse files
delete deprecated
parent
883b7a77
Changes
1
Hide whitespace changes
Inline
Side-by-side
ObservationSim/Instrument/Chip_deprecated.py
deleted
100755 → 0
View file @
883b7a77
from
.FocalPlane
import
FocalPlane
import
galsim
import
os
import
numpy
as
np
from
astropy.table
import
Table
class
Chip
(
FocalPlane
):
def
__init__
(
self
,
chipID
,
ccdEffCurve_dir
,
config
=
None
,
treering_func
=
None
):
# Get focal plane (instance of paraent class) info
# TODO: use chipID to config individual chip?
super
().
__init__
()
if
config
is
not
None
:
self
.
npix_x
=
config
[
"npix_x"
]
self
.
npix_y
=
config
[
"npix_y"
]
self
.
read_noise
=
config
[
"read_noise"
]
self
.
dark_noise
=
config
[
"dark_noise"
]
self
.
pix_scale
=
config
[
"pix_scale"
]
self
.
gain
=
config
[
"gain"
]
else
:
# Default setting
self
.
npix_x
=
9232
self
.
npix_y
=
9216
self
.
read_noise
=
5.0
# e/pix
self
.
dark_noise
=
0.02
# e/pix/s
self
.
pix_scale
=
0.074
# pixel scale
self
.
gain
=
1.0
# A chip ID must be assigned
self
.
chipID
=
int
(
chipID
)
# Get corresponding filter info
self
.
filter_id
,
self
.
filter_type
=
self
.
getChipFilter
()
# Get boundary (in pix)
self
.
bound
=
self
.
getChipLim
()
self
.
ccdEffCurve_dir
=
ccdEffCurve_dir
self
.
effCurve
=
self
.
_getChipEffCurve
(
self
.
filter_type
)
# Define the sensor
# self.sensor = galsim.Sensor()
self
.
sensor
=
galsim
.
SiliconSensor
(
strength
=
10.
,
treering_func
=
treering_func
)
def
_getChipEffCurve
(
self
,
filter_type
):
if
filter_type
in
[
'nuv'
,
'u'
]:
filename
=
'UV0.txt'
if
filter_type
in
[
'g'
,
'r'
]:
filename
=
'Astro_MB.txt'
if
filter_type
in
[
'i'
,
'z'
,
'y'
]:
filename
=
'Basic_NIR.txt'
path
=
os
.
path
.
join
(
self
.
ccdEffCurve_dir
,
filename
)
table
=
Table
.
read
(
path
,
format
=
'ascii'
)
throughput
=
galsim
.
LookupTable
(
x
=
table
[
'col1'
],
f
=
table
[
'col2'
],
interpolant
=
'linear'
)
bandpass
=
galsim
.
Bandpass
(
throughput
,
wave_type
=
'nm'
)
return
bandpass
def
getChipFilter
(
self
,
chipID
=
None
,
filter_layout
=
None
):
"""Return the filter index and type for a given chip #(chipID)
"""
filter_type_list
=
[
"nuv"
,
"u"
,
"g"
,
"r"
,
"i"
,
"z"
,
"y"
]
# TODO: maybe a more elegent way other than hard coded?
# e.g. use something like a nested dict:
if
filter_layout
is
not
None
:
return
filter_layout
[
chipID
][
0
],
filter_layout
[
chipID
][
1
]
if
chipID
==
None
:
chipID
=
self
.
chipID
# updated configurations
if
chipID
>
30
or
chipID
<
1
:
raise
ValueError
(
"!!! Chip ID: [1,30]"
)
if
chipID
in
[
10
,
11
,
20
,
21
]:
filter_type
=
'y'
if
chipID
in
[
15
,
16
]:
filter_type
=
"z"
if
chipID
in
[
9
,
22
]:
filter_type
=
"i"
if
chipID
in
[
12
,
19
]:
filter_type
=
"u"
if
chipID
in
[
7
,
24
]:
filter_type
=
"r"
if
chipID
in
[
14
,
13
,
18
,
17
]:
filter_type
=
"nuv"
if
chipID
in
[
8
,
23
]:
filter_type
=
"g"
if
chipID
in
[
6
,
5
,
25
,
26
]:
filter_type
=
"GI"
if
chipID
in
[
27
,
30
,
1
,
4
]:
filter_type
=
"GV"
if
chipID
in
[
28
,
29
,
2
,
3
]:
filter_type
=
"GU"
filter_id
=
filter_type_list
.
index
(
filter_type
)
return
filter_id
,
filter_type
def
getChipLim
(
self
,
chipID
=
None
):
"""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.
Parameters:
chipID: int
the index of the chip
Returns:
A galsim BoundsD object
"""
if
chipID
==
None
:
chipID
=
self
.
chipID
gx
=
self
.
npix_gap_x
gy1
,
gy2
=
self
.
npix_gap_y
# xlim of a given ccd chip
xrem
=
(
chipID
-
1
)
%
self
.
nchip_x
-
self
.
nchip_x
//
2
xcen
=
(
self
.
npix_x
+
gx
)
*
xrem
nx0
=
xcen
-
self
.
npix_x
//
2
+
1
nx1
=
xcen
+
self
.
npix_x
//
2
# ylim of a given ccd chip
yrem
=
2
*
((
chipID
-
1
)
//
self
.
nchip_x
)
-
(
self
.
nchip_y
-
1
)
ycen
=
(
self
.
npix_y
//
2
+
gy1
//
2
)
*
yrem
if
chipID
<=
6
:
ycen
=
(
self
.
npix_y
//
2
+
gy1
//
2
)
*
yrem
-
(
gy2
-
gy1
)
if
chipID
>=
25
:
ycen
=
(
self
.
npix_y
//
2
+
gy1
//
2
)
*
yrem
+
(
gy2
-
gy1
)
ny0
=
ycen
-
self
.
npix_y
//
2
+
1
ny1
=
ycen
+
self
.
npix_y
//
2
return
galsim
.
BoundsD
(
nx0
-
1
,
nx1
-
1
,
ny0
-
1
,
ny1
-
1
)
def
getSkyCoverage
(
self
,
wcs
):
return
super
().
getSkyCoverage
(
wcs
,
self
.
bound
.
xmin
,
self
.
bound
.
xmax
,
self
.
bound
.
ymin
,
self
.
bound
.
ymax
)
def
getSkyCoverageEnlarged
(
self
,
wcs
,
margin
=
0.5
):
"""The enlarged sky coverage of the chip
"""
margin
/=
60.0
bound
=
self
.
getSkyCoverage
(
wcs
)
return
galsim
.
BoundsD
(
bound
.
xmin
-
margin
,
bound
.
xmax
+
margin
,
bound
.
ymin
-
margin
,
bound
.
ymax
+
margin
)
def
isContainObj
(
self
,
ra_obj
,
dec_obj
,
sky_coverage
):
if
(
ra_obj
-
sky_coverage
.
xmin
)
*
(
ra_obj
-
sky_coverage
.
xmax
)
>
0.0
or
(
dec_obj
-
sky_coverage
.
ymin
)
*
(
dec_obj
-
sky_coverage
.
ymax
)
>
0.0
:
return
False
return
True
def
getChipNoise
(
self
,
exptime
=
150.0
):
# TODO: put it here or make it a separate class?
noise
=
self
.
dark_noise
*
exptime
+
self
.
read_noise
**
2
return
noise
def
addNoise
(
self
,
img
,
exptime
=
150.0
,
sky_noise
=
0.
,
seed
=
31415
):
rng
=
galsim
.
BaseDeviate
(
seed
)
dark_noise
=
galsim
.
DeviateNoise
(
galsim
.
PoissonDeviate
(
rng
,
self
.
dark_noise
*
exptime
))
img
.
addNoise
(
dark_noise
)
ccd_noise
=
galsim
.
CCDNoise
(
rng
,
sky_level
=
sky_noise
,
gain
=
self
.
gain
,
read_noise
=
self
.
read_noise
)
img
.
addNoise
(
ccd_noise
)
return
img
\ No newline at end of file
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