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
Hide whitespace changes
Inline
Side-by-side
ObservationSim/MockObject/data/led/model_310nm.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/MockObject/data/led/model_340nm.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/MockObject/data/led/model_365nm.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/MockObject/data/led/model_430nm.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/MockObject/data/led/model_505nm.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/MockObject/data/led/model_545nm.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/MockObject/data/led/model_590nm.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/MockObject/data/led/model_670nm.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/MockObject/data/led/model_760nm.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/MockObject/data/led/model_940nm.fits
deleted
100644 → 0
View file @
4afd1181
File deleted
ObservationSim/ObservationSim.py
deleted
100755 → 0
View file @
4afd1181
import
os
import
numpy
as
np
import
mpi4py.MPI
as
MPI
import
galsim
import
psutil
import
gc
from
datetime
import
datetime
import
traceback
from
ObservationSim.Config
import
ChipOutput
from
ObservationSim.Instrument
import
Telescope
,
Filter
,
FilterParam
,
FocalPlane
,
Chip
from
ObservationSim.Instrument.Chip
import
Effects
from
ObservationSim.Instrument.Chip
import
ChipUtils
as
chip_utils
from
ObservationSim.Astrometry.Astrometry_util
import
on_orbit_obs_position
from
ObservationSim.sim_steps
import
SimSteps
,
SIM_STEP_TYPES
class
Observation
(
object
):
def
__init__
(
self
,
config
,
Catalog
,
work_dir
=
None
,
data_dir
=
None
):
self
.
config
=
config
self
.
tel
=
Telescope
()
self
.
filter_param
=
FilterParam
()
self
.
Catalog
=
Catalog
def
prepare_chip_for_exposure
(
self
,
chip
,
ra_cen
,
dec_cen
,
pointing
,
wcs_fp
=
None
):
# Get WCS for the focal plane
if
wcs_fp
==
None
:
wcs_fp
=
self
.
focal_plane
.
getTanWCS
(
ra_cen
,
dec_cen
,
pointing
.
img_pa
,
chip
.
pix_scale
)
# Create chip Image
chip
.
img
=
galsim
.
ImageF
(
chip
.
npix_x
,
chip
.
npix_y
)
chip
.
img
.
setOrigin
(
chip
.
bound
.
xmin
,
chip
.
bound
.
ymin
)
chip
.
img
.
wcs
=
wcs_fp
# Get random generators for this chip
chip
.
rng_poisson
,
chip
.
poisson_noise
=
chip_utils
.
get_poisson
(
seed
=
int
(
self
.
config
[
"random_seeds"
][
"seed_poisson"
])
+
pointing
.
id
*
30
+
chip
.
chipID
,
sky_level
=
0.
)
# Get flat, shutter, and PRNU images
chip
.
flat_img
,
_
=
chip_utils
.
get_flat
(
img
=
chip
.
img
,
seed
=
int
(
self
.
config
[
"random_seeds"
][
"seed_flat"
]))
if
chip
.
chipID
>
30
:
chip
.
shutter_img
=
np
.
ones_like
(
chip
.
img
.
array
)
else
:
chip
.
shutter_img
=
Effects
.
ShutterEffectArr
(
chip
.
img
,
t_shutter
=
1.3
,
dist_bearing
=
735
,
dt
=
1E-3
)
chip
.
prnu_img
=
Effects
.
PRNU_Img
(
xsize
=
chip
.
npix_x
,
ysize
=
chip
.
npix_y
,
sigma
=
0.01
,
seed
=
int
(
self
.
config
[
"random_seeds"
][
"seed_prnu"
]
+
chip
.
chipID
))
return
chip
def
run_one_chip
(
self
,
chip
,
filt
,
pointing
,
chip_output
,
wcs_fp
=
None
,
psf_model
=
None
,
cat_dir
=
None
,
sed_dir
=
None
):
chip_output
.
Log_info
(
':::::::::::::::::::Current Pointing Information::::::::::::::::::'
)
chip_output
.
Log_info
(
"RA: %f, DEC; %f"
%
(
pointing
.
ra
,
pointing
.
dec
))
chip_output
.
Log_info
(
"Time: %s"
%
datetime
.
utcfromtimestamp
(
pointing
.
timestamp
).
isoformat
())
chip_output
.
Log_info
(
"Exposure time: %f"
%
pointing
.
exp_time
)
chip_output
.
Log_info
(
"Satellite Position (x, y, z): (%f, %f, %f)"
%
(
pointing
.
sat_x
,
pointing
.
sat_y
,
pointing
.
sat_z
))
chip_output
.
Log_info
(
"Satellite Velocity (x, y, z): (%f, %f, %f)"
%
(
pointing
.
sat_vx
,
pointing
.
sat_vy
,
pointing
.
sat_vz
))
chip_output
.
Log_info
(
"Position Angle: %f"
%
pointing
.
img_pa
.
deg
)
chip_output
.
Log_info
(
'Chip : %d'
%
chip
.
chipID
)
chip_output
.
Log_info
(
':::::::::::::::::::::::::::END:::::::::::::::::::::::::::::::::::'
)
# Apply astrometric simulation for pointing
if
self
.
config
[
"obs_setting"
][
"enable_astrometric_model"
]:
dt
=
datetime
.
utcfromtimestamp
(
pointing
.
timestamp
)
date_str
=
dt
.
date
().
isoformat
()
time_str
=
dt
.
time
().
isoformat
()
ra_cen
,
dec_cen
=
on_orbit_obs_position
(
input_ra_list
=
[
pointing
.
ra
],
input_dec_list
=
[
pointing
.
dec
],
input_pmra_list
=
[
0.
],
input_pmdec_list
=
[
0.
],
input_rv_list
=
[
0.
],
input_parallax_list
=
[
1e-9
],
input_nstars
=
1
,
input_x
=
pointing
.
sat_x
,
input_y
=
pointing
.
sat_y
,
input_z
=
pointing
.
sat_z
,
input_vx
=
pointing
.
sat_vx
,
input_vy
=
pointing
.
sat_vy
,
input_vz
=
pointing
.
sat_vz
,
input_epoch
=
"J2000"
,
input_date_str
=
date_str
,
input_time_str
=
time_str
)
ra_cen
,
dec_cen
=
ra_cen
[
0
],
dec_cen
[
0
]
else
:
ra_cen
=
pointing
.
ra
dec_cen
=
pointing
.
dec
# Prepare necessary chip properties for simulation
chip
=
self
.
prepare_chip_for_exposure
(
chip
,
ra_cen
,
dec_cen
,
pointing
)
# Initialize SimSteps
sim_steps
=
SimSteps
(
overall_config
=
self
.
config
,
chip_output
=
chip_output
,
all_filters
=
self
.
all_filters
)
for
step
in
pointing
.
obs_param
[
"call_sequence"
]:
if
self
.
config
[
"run_option"
][
"out_cat_only"
]:
if
step
!=
"scie_obs"
:
continue
chip_output
.
Log_info
(
"Starting simulation step: %s, calling function: %s"
%
(
step
,
SIM_STEP_TYPES
[
step
]))
obs_param
=
pointing
.
obs_param
[
"call_sequence"
][
step
]
step_name
=
SIM_STEP_TYPES
[
step
]
try
:
step_func
=
getattr
(
sim_steps
,
step_name
)
chip
,
filt
,
tel
,
pointing
=
step_func
(
chip
=
chip
,
filt
=
filt
,
tel
=
self
.
tel
,
pointing
=
pointing
,
catalog
=
self
.
Catalog
,
obs_param
=
obs_param
)
chip_output
.
Log_info
(
"Finished simulation step: %s"
%
(
step
))
except
Exception
as
e
:
traceback
.
print_exc
()
chip_output
.
Log_error
(
e
)
chip_output
.
Log_error
(
"Failed simulation on step: %s"
%
(
step
))
break
chip_output
.
Log_info
(
"check running:1: pointing-%d chip-%d pid-%d memory-%6.2fGB"
%
(
pointing
.
id
,
chip
.
chipID
,
os
.
getpid
(),
(
psutil
.
Process
(
os
.
getpid
()).
memory_info
().
rss
/
1024
/
1024
/
1024
)
))
del
chip
.
img
def
runExposure_MPI_PointingList
(
self
,
pointing_list
,
chips
=
None
):
comm
=
MPI
.
COMM_WORLD
ind_thread
=
comm
.
Get_rank
()
num_thread
=
comm
.
Get_size
()
process_counter
=
0
for
ipoint
in
range
(
len
(
pointing_list
)):
# Construct chips & filters:
pointing
=
pointing_list
[
ipoint
]
# pointing_ID = pointing.id
pointing_ID
=
pointing
.
obs_id
pointing
.
make_output_pointing_dir
(
overall_config
=
self
.
config
,
copy_obs_config
=
True
)
self
.
focal_plane
=
FocalPlane
(
chip_list
=
pointing
.
obs_param
[
"run_chips"
])
# Make Chip & Filter lists
self
.
chip_list
=
[]
self
.
filter_list
=
[]
self
.
all_filters
=
[]
for
i
in
range
(
self
.
focal_plane
.
nchips
):
chipID
=
i
+
1
chip
=
Chip
(
chipID
=
chipID
,
config
=
self
.
config
)
filter_id
,
filter_type
=
chip
.
getChipFilter
()
filt
=
Filter
(
filter_id
=
filter_id
,
filter_type
=
filter_type
,
filter_param
=
self
.
filter_param
)
if
not
self
.
focal_plane
.
isIgnored
(
chipID
=
chipID
):
self
.
chip_list
.
append
(
chip
)
self
.
filter_list
.
append
(
filt
)
self
.
all_filters
.
append
(
filt
)
if
chips
is
None
:
# Run all chips defined in configuration of this pointing
run_chips
=
self
.
chip_list
run_filts
=
self
.
filter_list
nchips_per_fp
=
len
(
self
.
chip_list
)
else
:
# Only run a particular set of chips
run_chips
=
[]
run_filts
=
[]
for
ichip
in
range
(
len
(
self
.
chip_list
)):
chip
=
self
.
chip_list
[
ichip
]
filt
=
self
.
filter_list
[
ichip
]
if
chip
.
chipID
in
chips
:
run_chips
.
append
(
chip
)
run_filts
.
append
(
filt
)
nchips_per_fp
=
len
(
chips
)
for
ichip
in
range
(
nchips_per_fp
):
i_process
=
process_counter
+
ichip
if
i_process
%
num_thread
!=
ind_thread
:
continue
pid
=
os
.
getpid
()
chip
=
run_chips
[
ichip
]
filt
=
run_filts
[
ichip
]
chip_output
=
ChipOutput
(
config
=
self
.
config
,
chip
=
chip
,
filt
=
filt
,
pointing
=
pointing
)
chip_output
.
Log_info
(
"running pointing#%d, chip#%d, at PID#%d..."
%
(
int
(
pointing_ID
),
chip
.
chipID
,
pid
))
self
.
run_one_chip
(
chip
=
chip
,
filt
=
filt
,
chip_output
=
chip_output
,
pointing
=
pointing
)
chip_output
.
Log_info
(
"finished running chip#%d..."
%
(
chip
.
chipID
))
for
handler
in
chip_output
.
logger
.
handlers
[:]:
chip_output
.
logger
.
removeHandler
(
handler
)
gc
.
collect
()
process_counter
+=
nchips_per_fp
ObservationSim/PSF/FieldDistortion.py
deleted
100644 → 0
View file @
4afd1181
import
galsim
import
numpy
as
np
import
cmath
class
FieldDistortion
(
object
):
def
__init__
(
self
,
chip
,
fdModel
=
None
,
fdModel_path
=
None
,
img_rot
=
0.
):
if
fdModel
is
None
:
if
hasattr
(
chip
,
'fdModel'
):
self
.
fdModel
=
chip
.
fdModel
elif
fdModel_path
is
not
None
:
import
pickle
with
open
(
fdModel_path
,
"rb"
)
as
f
:
self
.
fdModel
=
pickle
.
load
(
f
)
else
:
raise
ValueError
(
"Error: no field distortion model has been specified!"
)
else
:
self
.
fdModel
=
fdModel
self
.
img_rot
=
img_rot
self
.
ifdModel
=
self
.
fdModel
[
"wave1"
]
self
.
ixfdModel
=
self
.
ifdModel
[
"xImagePos"
]
self
.
iyfdModel
=
self
.
ifdModel
[
"yImagePos"
]
# first-order derivatives of the global field distortion model
self
.
ifx_dx
=
self
.
ixfdModel
.
partial_derivative
(
1
,
0
)
self
.
ifx_dy
=
self
.
ixfdModel
.
partial_derivative
(
0
,
1
)
self
.
ify_dx
=
self
.
iyfdModel
.
partial_derivative
(
1
,
0
)
self
.
ify_dy
=
self
.
iyfdModel
.
partial_derivative
(
0
,
1
)
if
"residual"
in
self
.
fdModel
[
"wave1"
]:
self
.
irsModel
=
self
.
fdModel
[
"wave1"
][
"residual"
][
"ccd"
+
chip
.
getChipLabel
(
chipID
=
chip
.
chipID
)]
self
.
ixrsModel
=
self
.
irsModel
[
"xResidual"
]
self
.
iyrsModel
=
self
.
irsModel
[
"yResidual"
]
# first-order derivatives of the residual field distortion model
self
.
irx_dx
=
self
.
ixrsModel
.
partial_derivative
(
1
,
0
)
self
.
irx_dy
=
self
.
ixrsModel
.
partial_derivative
(
0
,
1
)
self
.
iry_dx
=
self
.
iyrsModel
.
partial_derivative
(
1
,
0
)
self
.
iry_dy
=
self
.
iyrsModel
.
partial_derivative
(
0
,
1
)
else
:
self
.
irsModel
=
None
def
isContainObj_FD
(
self
,
chip
,
pos_img
):
xLowI
,
xUpI
,
yLowI
,
yUpI
=
self
.
ifdModel
[
"interpLimit"
]
x
,
y
=
pos_img
.
x
,
pos_img
.
y
if
(
xLowI
-
x
)
*
(
xUpI
-
x
)
>
0
or
(
yLowI
-
y
)
*
(
yUpI
-
y
)
>
0
:
return
False
return
True
def
get_distorted
(
self
,
chip
,
pos_img
,
bandpass
=
None
,
img_rot
=
None
):
""" Get the distored position for an undistorted image position
Parameters:
chip: A 'Chip' object representing the
chip we want to extract PSF from.
pos_img: A 'galsim.Position' object representing
the image position.
bandpass: A 'galsim.Bandpass' object representing
the wavelength range.
Returns:
pos_distorted: A 'galsim.Position' object representing
the distored position.
"""
if
not
self
.
isContainObj_FD
(
chip
=
chip
,
pos_img
=
pos_img
):
return
galsim
.
PositionD
(
-
1
,
-
1
),
None
if
not
img_rot
:
img_rot
=
np
.
radians
(
self
.
img_rot
)
else
:
img_rot
=
np
.
radians
(
img_rot
)
x
,
y
=
pos_img
.
x
,
pos_img
.
y
x
=
self
.
ixfdModel
(
x
,
y
)[
0
][
0
]
y
=
self
.
iyfdModel
(
x
,
y
)[
0
][
0
]
if
self
.
irsModel
:
# x1LowI, x1UpI, y1LowI, y1UpI = self.irsModel["interpLimit"]
# if (x1LowI-x)*(x1UpI-x) <=0 and (y1LowI-y)*(y1UpI-y)<=0:
# dx = self.ixrsModel(x, y)[0][0]
# dy = self.iyrsModel(x, y)[0][0]
# x += dx
# y += dy
# # field distortion induced ellipticity
# ix_dx = self.ifx_dx(x, y) + self.irx_dx(x, y)
# ix_dy = self.ifx_dy(x, y) + self.irx_dy(x, y)
# iy_dx = self.ify_dx(x, y) + self.iry_dx(x, y)
# iy_dy = self.ify_dy(x, y) + self.iry_dy(x, y)
# else:
# return galsim.PositionD(-1, -1), None
dx
=
self
.
ixrsModel
(
x
,
y
)[
0
][
0
]
dy
=
self
.
iyrsModel
(
x
,
y
)[
0
][
0
]
x
+=
dx
y
+=
dy
# field distortion induced ellipticity
ix_dx
=
self
.
ifx_dx
(
x
,
y
)
+
self
.
irx_dx
(
x
,
y
)
ix_dy
=
self
.
ifx_dy
(
x
,
y
)
+
self
.
irx_dy
(
x
,
y
)
iy_dx
=
self
.
ify_dx
(
x
,
y
)
+
self
.
iry_dx
(
x
,
y
)
iy_dy
=
self
.
ify_dy
(
x
,
y
)
+
self
.
iry_dy
(
x
,
y
)
else
:
ix_dx
=
self
.
ifx_dx
(
x
,
y
)
ix_dy
=
self
.
ifx_dy
(
x
,
y
)
iy_dx
=
self
.
ify_dx
(
x
,
y
)
iy_dy
=
self
.
ify_dy
(
x
,
y
)
g1k_fd
=
0.0
+
(
iy_dy
-
ix_dx
)
/
(
iy_dy
+
ix_dx
)
g2k_fd
=
0.0
-
(
iy_dx
+
ix_dy
)
/
(
iy_dy
+
ix_dx
)
# [TODO] [TESTING] Rotate the shear:
g_abs
=
np
.
sqrt
(
g1k_fd
**
2
+
g2k_fd
**
2
)
phi
=
cmath
.
phase
(
complex
(
g1k_fd
,
g2k_fd
))
# g_abs = 0.7
g1k_fd
=
g_abs
*
np
.
cos
(
phi
+
2
*
img_rot
)
g2k_fd
=
g_abs
*
np
.
sin
(
phi
+
2
*
img_rot
)
fd_shear
=
galsim
.
Shear
(
g1
=
g1k_fd
,
g2
=
g2k_fd
)
return
galsim
.
PositionD
(
x
,
y
),
fd_shear
ObservationSim/PSF/PSFGauss.py
deleted
100644 → 0
View file @
4afd1181
import
galsim
import
sep
import
numpy
as
np
from
scipy.interpolate
import
interp1d
from
ObservationSim.PSF.PSFModel
import
PSFModel
class
PSFGauss
(
PSFModel
):
def
__init__
(
self
,
chip
,
fwhm
=
0.187
,
sigSpin
=
0.
,
psfRa
=
None
):
self
.
pix_size
=
chip
.
pix_scale
self
.
chip
=
chip
if
psfRa
is
None
:
self
.
fwhm
=
fwhm
self
.
sigGauss
=
0.15
else
:
self
.
fwhm
=
self
.
fwhmGauss
(
r
=
psfRa
)
self
.
sigGauss
=
psfRa
# 80% light radius
self
.
sigSpin
=
sigSpin
self
.
psf
=
galsim
.
Gaussian
(
flux
=
1.0
,
fwhm
=
fwhm
)
def
perfGauss
(
self
,
r
,
sig
):
"""
pseudo-error function, i.e. Cumulative distribution function of Gaussian distribution
Parameter:
r: radius
sig: sigma of the Gaussian distribution
Return:
the value of the pseudo CDF
"""
gaussFun
=
lambda
sigma
,
r
:
1.0
/
(
np
.
sqrt
(
2.0
*
np
.
pi
)
*
sigma
)
*
np
.
exp
(
-
r
**
2
/
(
2.0
*
sigma
**
2
))
nxx
=
1000
rArr
=
np
.
linspace
(
0.0
,
r
,
nxx
)
gauss
=
gaussFun
(
sig
,
rArr
)
erf
=
2.0
*
np
.
trapz
(
gauss
,
rArr
)
return
erf
def
fracGauss
(
self
,
sig
,
r
=
0.15
,
pscale
=
None
):
"""
For a given Gaussian PSF with sigma=sig,
derive the flux ratio ar the given radius r
Parameters:
sig: sigma of the Gauss PSF Function in arcsec
r: radius in arcsec
pscale: pixel scale
Return: the flux ratio
"""
if
pscale
==
None
:
pscale
=
self
.
pix_size
gaussx
=
galsim
.
Gaussian
(
flux
=
1.0
,
sigma
=
sig
)
gaussImg
=
gaussx
.
drawImage
(
scale
=
pscale
,
method
=
'no_pixel'
)
gaussImg
=
gaussImg
.
array
size
=
np
.
size
(
gaussImg
,
axis
=
0
)
cxy
=
0.5
*
(
size
-
1
)
flux
,
ferr
,
flag
=
sep
.
sum_circle
(
gaussImg
,[
cxy
],[
cxy
],[
r
/
pscale
],
subpix
=
0
)
return
flux
def
fwhmGauss
(
self
,
r
=
0.15
,
fr
=
0.8
,
pscale
=
None
):
"""
Given a total flux ratio 'fr' within a fixed radius 'r',
estimate the fwhm of the Gaussian function
return the fwhm in arcsec
"""
if
pscale
==
None
:
pscale
=
self
.
pix_size
err
=
1.0e-3
nxx
=
100
sig
=
np
.
linspace
(
0.5
*
pscale
,
1.0
,
nxx
)
frA
=
np
.
zeros
(
nxx
)
for
i
in
range
(
nxx
):
frA
[
i
]
=
self
.
fracGauss
(
sig
[
i
],
r
=
r
,
pscale
=
pscale
)
index
=
[
i
for
i
in
range
(
nxx
-
1
)
if
(
fr
-
frA
[
i
])
*
(
fr
-
frA
[
i
+
1
])
<=
0.0
][
0
]
while
abs
(
frA
[
index
]
-
fr
)
>
1.0e-3
:
sig
=
np
.
linspace
(
sig
[
index
],
sig
[
index
+
1
],
nxx
)
for
i
in
range
(
nxx
):
frA
[
i
]
=
self
.
fracGauss
(
sig
[
i
],
r
=
r
,
pscale
=
pscale
)
index
=
[
i
for
i
in
range
(
nxx
-
1
)
if
(
fr
-
frA
[
i
])
*
(
fr
-
frA
[
i
+
1
])
<=
0.0
][
0
]
fwhm
=
2.35482
*
sig
[
index
]
return
fwhm
def
get_PSF
(
self
,
pos_img
,
chip
=
None
,
bandpass
=
None
,
folding_threshold
=
5.e-3
):
dx
=
pos_img
.
x
-
self
.
chip
.
cen_pix_x
dy
=
pos_img
.
y
-
self
.
chip
.
cen_pix_y
return
self
.
PSFspin
(
dx
,
dy
)
def
PSFspin
(
self
,
x
,
y
):
"""
The PSF profile at a given image position relative to the axis center
Parameters:
theta : spin angles in a given exposure in unit of [arcsecond]
dx, dy: relative position to the axis center in unit of [pixels]
Return:
Spinned PSF: g1, g2 and axis ratio 'a/b'
"""
a2Rad
=
np
.
pi
/
(
60.0
*
60.0
*
180.0
)
ff
=
self
.
sigGauss
*
0.107
*
(
1000.0
/
10.0
)
# in unit of [pixels]
rc
=
np
.
sqrt
(
x
*
x
+
y
*
y
)
cpix
=
rc
*
(
self
.
sigSpin
*
a2Rad
)
beta
=
(
np
.
arctan2
(
y
,
x
)
+
np
.
pi
/
2
)
ell
=
cpix
**
2
/
(
2.0
*
ff
**
2
+
cpix
**
2
)
#ell *= 10.0
qr
=
np
.
sqrt
((
1.0
+
ell
)
/
(
1.0
-
ell
))
#psfShape = galsim.Shear(e=ell, beta=beta)
#g1, g2 = psfShape.g1, psfShape.g2
#qr = np.sqrt((1.0+ell)/(1.0-ell))
#return ell, beta, qr
PSFshear
=
galsim
.
Shear
(
e
=
ell
,
beta
=
beta
*
galsim
.
radians
)
return
self
.
psf
.
shear
(
PSFshear
),
PSFshear
\ No newline at end of file
ObservationSim/PSF/PSFInterp.py
deleted
100644 → 0
View file @
4afd1181
'''
PSF interpolation for CSST-Sim
NOTE: [iccd, iwave, ipsf] are counted from 1 to n, but [tccd, twave, tpsf] are counted from 0 to n-1
'''
import
sys
import
time
import
copy
import
numpy
as
np
import
scipy.spatial
as
spatial
import
galsim
import
h5py
from
ObservationSim.PSF.PSFModel
import
PSFModel
NPSF
=
900
#***# 30*30
PixSizeInMicrons
=
5.
#***# in microns
###find neighbors-KDtree###
def
findNeighbors
(
tx
,
ty
,
px
,
py
,
dr
=
0.1
,
dn
=
1
,
OnlyDistance
=
True
):
"""
find nearest neighbors by 2D-KDTree
Parameters:
tx, ty (float, float): a given position
px, py (numpy.array, numpy.array): position data for tree
dr (float-optional): distance
dn (int-optional): nearest-N
OnlyDistance (bool-optional): only use distance to find neighbors. Default: True
Returns:
dataq (numpy.array): index
"""
datax
=
px
datay
=
py
tree
=
spatial
.
KDTree
(
list
(
zip
(
datax
.
ravel
(),
datay
.
ravel
())))
dataq
=
[]
rr
=
dr
if
OnlyDistance
==
True
:
dataq
=
tree
.
query_ball_point
([
tx
,
ty
],
rr
)
if
OnlyDistance
==
False
:
while
len
(
dataq
)
<
dn
:
dataq
=
tree
.
query_ball_point
([
tx
,
ty
],
rr
)
rr
+=
dr
dd
=
np
.
hypot
(
datax
[
dataq
]
-
tx
,
datay
[
dataq
]
-
ty
)
ddSortindx
=
np
.
argsort
(
dd
)
dataq
=
np
.
array
(
dataq
)[
ddSortindx
[
0
:
dn
]]
return
dataq
###find neighbors-hoclist###
def
hocBuild
(
partx
,
party
,
nhocx
,
nhocy
,
dhocx
,
dhocy
):
if
np
.
max
(
partx
)
>
nhocx
*
dhocx
:
print
(
'ERROR'
)
sys
.
exit
()
if
np
.
max
(
party
)
>
nhocy
*
dhocy
:
print
(
'ERROR'
)
sys
.
exit
()
npart
=
partx
.
size
hoclist
=
np
.
zeros
(
npart
,
dtype
=
np
.
int32
)
-
1
hoc
=
np
.
zeros
([
nhocy
,
nhocx
],
dtype
=
np
.
int32
)
-
1
for
ipart
in
range
(
npart
):
ix
=
int
(
partx
[
ipart
]
/
dhocx
)
iy
=
int
(
party
[
ipart
]
/
dhocy
)
hoclist
[
ipart
]
=
hoc
[
iy
,
ix
]
hoc
[
iy
,
ix
]
=
ipart
return
hoc
,
hoclist
def
hocFind
(
px
,
py
,
dhocx
,
dhocy
,
hoc
,
hoclist
):
ix
=
int
(
px
/
dhocx
)
iy
=
int
(
py
/
dhocy
)
neigh
=
[]
it
=
hoc
[
iy
,
ix
]
while
it
!=
-
1
:
neigh
.
append
(
it
)
it
=
hoclist
[
it
]
return
neigh
def
findNeighbors_hoclist
(
px
,
py
,
tx
=
None
,
ty
=
None
,
dn
=
4
,
hoc
=
None
,
hoclist
=
None
):
nhocy
=
nhocx
=
20
pxMin
=
np
.
min
(
px
)
pxMax
=
np
.
max
(
px
)
pyMin
=
np
.
min
(
py
)
pyMax
=
np
.
max
(
py
)
dhocx
=
(
pxMax
-
pxMin
)
/
(
nhocx
-
1
)
dhocy
=
(
pyMax
-
pyMin
)
/
(
nhocy
-
1
)
partx
=
px
-
pxMin
+
dhocx
/
2
party
=
py
-
pyMin
+
dhocy
/
2
if
hoc
is
None
:
hoc
,
hoclist
=
hocBuild
(
partx
,
party
,
nhocx
,
nhocy
,
dhocx
,
dhocy
)
return
hoc
,
hoclist
if
hoc
is
not
None
:
tx
=
tx
-
pxMin
+
dhocx
/
2
ty
=
ty
-
pyMin
+
dhocy
/
2
itx
=
int
(
tx
/
dhocx
)
ity
=
int
(
ty
/
dhocy
)
ps
=
[
-
1
,
0
,
1
]
neigh
=
[]
for
ii
in
range
(
3
):
for
jj
in
range
(
3
):
ix
=
itx
+
ps
[
ii
]
iy
=
ity
+
ps
[
jj
]
if
ix
<
0
:
continue
if
iy
<
0
:
continue
if
ix
>
nhocx
-
1
:
continue
if
iy
>
nhocy
-
1
:
continue
#neightt = myUtil.hocFind(ppx, ppy, dhocx, dhocy, hoc, hoclist)
it
=
hoc
[
iy
,
ix
]
while
it
!=
-
1
:
neigh
.
append
(
it
)
it
=
hoclist
[
it
]
#neigh.append(neightt)
#ll = [i for k in neigh for i in k]
if
dn
!=
-
1
:
ptx
=
np
.
array
(
partx
[
neigh
])
pty
=
np
.
array
(
party
[
neigh
])
dd
=
np
.
hypot
(
ptx
-
tx
,
pty
-
ty
)
idx
=
np
.
argsort
(
dd
)
neigh
=
np
.
array
(
neigh
)[
idx
[
0
:
dn
]]
return
neigh
###PSF-IDW###
def
psfMaker_IDW
(
px
,
py
,
PSFMat
,
cen_col
,
cen_row
,
IDWindex
=
2
,
OnlyNeighbors
=
True
,
hoc
=
None
,
hoclist
=
None
,
PSFCentroidWgt
=
False
):
"""
psf interpolation by IDW
Parameters:
px, py (float, float): position of the target
PSFMat (numpy.array): image
cen_col, cen_row (numpy.array, numpy.array): potions of the psf centers
IDWindex (int-optional): the power index of IDW
OnlyNeighbors (bool-optional): only neighbors are used for psf interpolation
Returns:
psfMaker (numpy.array)
"""
minimum_psf_weight
=
1e-8
ref_col
=
px
ref_row
=
py
ngy
,
ngx
=
PSFMat
[
0
,
:,
:].
shape
npsf
=
PSFMat
[:,
:,
:].
shape
[
0
]
psfWeight
=
np
.
zeros
([
npsf
])
if
OnlyNeighbors
==
True
:
if
hoc
is
None
:
neigh
=
findNeighbors
(
px
,
py
,
cen_col
,
cen_row
,
dr
=
5.
,
dn
=
4
,
OnlyDistance
=
False
)
if
hoc
is
not
None
:
neigh
=
findNeighbors_hoclist
(
cen_col
,
cen_row
,
tx
=
px
,
ty
=
py
,
dn
=
4
,
hoc
=
hoc
,
hoclist
=
hoclist
)
neighFlag
=
np
.
zeros
(
npsf
)
neighFlag
[
neigh
]
=
1
for
ipsf
in
range
(
npsf
):
if
OnlyNeighbors
==
True
:
if
neighFlag
[
ipsf
]
!=
1
:
continue
dist
=
np
.
sqrt
((
ref_col
-
cen_col
[
ipsf
])
**
2
+
(
ref_row
-
cen_row
[
ipsf
])
**
2
)
if
IDWindex
==
1
:
psfWeight
[
ipsf
]
=
dist
if
IDWindex
==
2
:
psfWeight
[
ipsf
]
=
dist
**
2
if
IDWindex
==
3
:
psfWeight
[
ipsf
]
=
dist
**
3
if
IDWindex
==
4
:
psfWeight
[
ipsf
]
=
dist
**
4
psfWeight
[
ipsf
]
=
max
(
psfWeight
[
ipsf
],
minimum_psf_weight
)
psfWeight
[
ipsf
]
=
1.
/
psfWeight
[
ipsf
]
psfWeight
/=
np
.
sum
(
psfWeight
)
psfMaker
=
np
.
zeros
([
ngy
,
ngx
],
dtype
=
np
.
float32
)
for
ipsf
in
range
(
npsf
):
if
OnlyNeighbors
==
True
:
if
neighFlag
[
ipsf
]
!=
1
:
continue
iPSFMat
=
PSFMat
[
ipsf
,
:,
:].
copy
()
ipsfWeight
=
psfWeight
[
ipsf
]
psfMaker
+=
iPSFMat
*
ipsfWeight
psfMaker
/=
np
.
nansum
(
psfMaker
)
return
psfMaker
###define PSFInterp###
class
PSFInterp
(
PSFModel
):
def
__init__
(
self
,
chip
,
npsf
=
NPSF
,
PSF_data
=
None
,
PSF_data_file
=
None
,
PSF_data_prefix
=
""
,
sigSpin
=
0
,
psfRa
=
0.15
,
HocBuild
=
False
,
LOG_DEBUG
=
False
):
self
.
LOG_DEBUG
=
LOG_DEBUG
if
self
.
LOG_DEBUG
:
print
(
'==================================================='
)
print
(
'DEBUG: psf module for csstSim '
\
+
time
.
strftime
(
"(%Y-%m-%d %H:%M:%S)"
,
time
.
localtime
()),
flush
=
True
)
print
(
'==================================================='
)
self
.
sigSpin
=
sigSpin
self
.
sigGauss
=
psfRa
self
.
iccd
=
int
(
chip
.
getChipLabel
(
chipID
=
chip
.
chipID
))
# self.iccd = chip.chip_name
if
PSF_data_file
==
None
:
print
(
'Error - PSF_data_file is None'
)
sys
.
exit
()
self
.
nwave
=
self
.
_getPSFwave
(
self
.
iccd
,
PSF_data_file
,
PSF_data_prefix
)
self
.
npsf
=
npsf
self
.
PSF_data
=
self
.
_loadPSF
(
self
.
iccd
,
PSF_data_file
,
PSF_data_prefix
)
if
self
.
LOG_DEBUG
:
print
(
'nwave-{:} on ccd-{:}::'
.
format
(
self
.
nwave
,
self
.
iccd
),
flush
=
True
)
print
(
'self.PSF_data ... ok'
,
flush
=
True
)
print
(
'Preparing self.[psfMat,cen_col,cen_row] for psfMaker ... '
,
end
=
''
,
flush
=
True
)
ngy
,
ngx
=
self
.
PSF_data
[
0
][
0
][
'psfMat'
].
shape
self
.
psfMat
=
np
.
zeros
([
self
.
nwave
,
self
.
npsf
,
ngy
,
ngx
],
dtype
=
np
.
float32
)
self
.
cen_col
=
np
.
zeros
([
self
.
nwave
,
self
.
npsf
],
dtype
=
np
.
float32
)
self
.
cen_row
=
np
.
zeros
([
self
.
nwave
,
self
.
npsf
],
dtype
=
np
.
float32
)
self
.
hoc
=
[]
self
.
hoclist
=
[]
for
twave
in
range
(
self
.
nwave
):
for
tpsf
in
range
(
self
.
npsf
):
self
.
psfMat
[
twave
,
tpsf
,
:,
:]
=
self
.
PSF_data
[
twave
][
tpsf
][
'psfMat'
]
self
.
PSF_data
[
twave
][
tpsf
][
'psfMat'
]
=
0
###free psfMat
self
.
pixsize
=
self
.
PSF_data
[
twave
][
tpsf
][
'pixsize'
]
*
1e-3
##mm
self
.
cen_col
[
twave
,
tpsf
]
=
self
.
PSF_data
[
twave
][
tpsf
][
'image_x'
]
+
self
.
PSF_data
[
twave
][
tpsf
][
'centroid_x'
]
self
.
cen_row
[
twave
,
tpsf
]
=
self
.
PSF_data
[
twave
][
tpsf
][
'image_y'
]
+
self
.
PSF_data
[
twave
][
tpsf
][
'centroid_y'
]
if
HocBuild
:
#hoclist on twave for neighborsFinding
hoc
,
hoclist
=
findNeighbors_hoclist
(
self
.
cen_col
[
twave
],
self
.
cen_row
[
twave
])
self
.
hoc
.
append
(
hoc
)
self
.
hoclist
.
append
(
hoclist
)
if
self
.
LOG_DEBUG
:
print
(
'ok'
,
flush
=
True
)
def
_getPSFwave
(
self
,
iccd
,
PSF_data_file
,
PSF_data_prefix
):
# fq = h5py.File(PSF_data_file+'/' +PSF_data_prefix +'psfCube_ccd{:}.h5'.format(iccd), 'r')
fq
=
h5py
.
File
(
PSF_data_file
+
'/'
+
PSF_data_prefix
+
'psfCube_{:}.h5'
.
format
(
iccd
),
'r'
)
nwave
=
len
(
fq
.
keys
())
fq
.
close
()
return
nwave
def
_loadPSF
(
self
,
iccd
,
PSF_data_file
,
PSF_data_prefix
):
psfSet
=
[]
# fq = h5py.File(PSF_data_file+'/' +PSF_data_prefix +'psfCube_ccd{:}.h5'.format(iccd), 'r')
fq
=
h5py
.
File
(
PSF_data_file
+
'/'
+
PSF_data_prefix
+
'psfCube_{:}.h5'
.
format
(
iccd
),
'r'
)
for
ii
in
range
(
self
.
nwave
):
iwave
=
ii
+
1
psfWave
=
[]
fq_iwave
=
fq
[
'w_{:}'
.
format
(
iwave
)]
for
jj
in
range
(
self
.
npsf
):
ipsf
=
jj
+
1
psfInfo
=
{}
psfInfo
[
'wavelength'
]
=
fq_iwave
[
'wavelength'
][()]
fq_iwave_ipsf
=
fq_iwave
[
'psf_{:}'
.
format
(
ipsf
)]
psfInfo
[
'pixsize'
]
=
PixSizeInMicrons
psfInfo
[
'field_x'
]
=
fq_iwave_ipsf
[
'field_x'
][()]
psfInfo
[
'field_y'
]
=
fq_iwave_ipsf
[
'field_y'
][()]
psfInfo
[
'image_x'
]
=
fq_iwave_ipsf
[
'image_x'
][()]
psfInfo
[
'image_y'
]
=
fq_iwave_ipsf
[
'image_y'
][()]
psfInfo
[
'centroid_x'
]
=
fq_iwave_ipsf
[
'cx'
][()]
psfInfo
[
'centroid_y'
]
=
fq_iwave_ipsf
[
'cy'
][()]
psfInfo
[
'psfMat'
]
=
fq_iwave_ipsf
[
'psfMat'
][()]
psfWave
.
append
(
psfInfo
)
psfSet
.
append
(
psfWave
)
fq
.
close
()
if
self
.
LOG_DEBUG
:
print
(
'psfSet has been loaded:'
,
flush
=
True
)
print
(
'psfSet[iwave][ipsf][keys]:'
,
psfSet
[
0
][
0
].
keys
(),
flush
=
True
)
return
psfSet
def
_findWave
(
self
,
bandpass
):
if
isinstance
(
bandpass
,
int
):
twave
=
bandpass
return
twave
for
twave
in
range
(
self
.
nwave
):
bandwave
=
self
.
PSF_data
[
twave
][
0
][
'wavelength'
]
if
bandpass
.
blue_limit
<
bandwave
and
bandwave
<
bandpass
.
red_limit
:
return
twave
return
-
1
def
get_PSF
(
self
,
chip
,
pos_img
,
bandpass
,
galsimGSObject
=
True
,
findNeighMode
=
'treeFind'
,
folding_threshold
=
5.e-3
,
pointing_pa
=
0.0
):
"""
Get the PSF at a given image position
Parameters:
chip: A 'Chip' object representing the chip we want to extract PSF from.
pos_img: A 'galsim.Position' object representing the image position.
bandpass: A 'galsim.Bandpass' object representing the wavelength range.
pixSize: The pixels size of psf matrix
findNeighMode: 'treeFind' or 'hoclistFind'
Returns:
PSF: A 'galsim.GSObject'.
"""
pixSize
=
np
.
rad2deg
(
self
.
pixsize
*
1e-3
/
28
)
*
3600
#set psf pixsize
# assert self.iccd == int(chip.getChipLabel(chipID=chip.chipID)), 'ERROR: self.iccd != chip.chipID'
twave
=
self
.
_findWave
(
bandpass
)
if
twave
==
-
1
:
print
(
"!!!PSF bandpass does not match."
)
exit
()
PSFMat
=
self
.
psfMat
[
twave
]
cen_col
=
self
.
cen_col
[
twave
]
cen_row
=
self
.
cen_row
[
twave
]
px
=
(
pos_img
.
x
-
chip
.
cen_pix_x
)
*
0.01
py
=
(
pos_img
.
y
-
chip
.
cen_pix_y
)
*
0.01
if
findNeighMode
==
'treeFind'
:
imPSF
=
psfMaker_IDW
(
px
,
py
,
PSFMat
,
cen_col
,
cen_row
,
IDWindex
=
2
,
OnlyNeighbors
=
True
,
PSFCentroidWgt
=
True
)
if
findNeighMode
==
'hoclistFind'
:
assert
(
self
.
hoc
!=
0
),
'hoclist should be built correctly!'
imPSF
=
psfMaker_IDW
(
px
,
py
,
PSFMat
,
cen_col
,
cen_row
,
IDWindex
=
2
,
OnlyNeighbors
=
True
,
hoc
=
self
.
hoc
[
twave
],
hoclist
=
self
.
hoclist
[
twave
],
PSFCentroidWgt
=
True
)
'''
############TEST: START
TestGaussian = False
if TestGaussian:
gsx = galsim.Gaussian(sigma=0.04)
#pointing_pa = -23.433333
imPSF= gsx.shear(g1=0.8, g2=0.).rotate(0.*galsim.degrees).drawImage(nx = 256, ny=256, scale=pixSize).array
############TEST: END
'''
if
galsimGSObject
:
imPSFt
=
np
.
zeros
([
257
,
257
])
imPSFt
[
0
:
256
,
0
:
256
]
=
imPSF
# imPSFt[120:130, 0:256] = 1.
img
=
galsim
.
ImageF
(
imPSFt
,
scale
=
pixSize
)
gsp
=
galsim
.
GSParams
(
folding_threshold
=
folding_threshold
)
############TEST: START
# Use sheared PSF to test the PSF orientation
# self.psf = galsim.InterpolatedImage(img, gsparams=gsp).shear(g1=0.8, g2=0.)
############TEST: END
self
.
psf
=
galsim
.
InterpolatedImage
(
img
,
gsparams
=
gsp
)
wcs
=
chip
.
img
.
wcs
.
local
(
pos_img
)
scale
=
galsim
.
PixelScale
(
0.074
)
self
.
psf
=
wcs
.
toWorld
(
scale
.
toImage
(
self
.
psf
),
image_pos
=
(
pos_img
))
# return self.PSFspin(x=px/0.01, y=py/0.01)
return
self
.
psf
,
galsim
.
Shear
(
e
=
0.
,
beta
=
(
np
.
pi
/
2
)
*
galsim
.
radians
)
return
imPSF
'''
def PSFspin(self, x, y):
"""
The PSF profile at a given image position relative to the axis center
Parameters:
theta : spin angles in a given exposure in unit of [arcsecond]
dx, dy: relative position to the axis center in unit of [pixels]
Return:
Spinned PSF: g1, g2 and axis ratio 'a/b'
"""
a2Rad = np.pi/(60.0*60.0*180.0)
ff = self.sigGauss * 0.107 * (1000.0/10.0) # in unit of [pixels]
rc = np.sqrt(x*x + y*y)
cpix = rc*(self.sigSpin*a2Rad)
beta = (np.arctan2(y,x) + np.pi/2)
ell = cpix**2/(2.0*ff**2+cpix**2)
qr = np.sqrt((1.0+ell)/(1.0-ell))
PSFshear = galsim.Shear(e=ell, beta=beta*galsim.radians)
return self.psf.shear(PSFshear), PSFshear
'''
ObservationSim/PSF/PSFInterpSLS.py
deleted
100644 → 0
View file @
4afd1181
'''
PSF interpolation for CSST-Sim
NOTE: [iccd, iwave, ipsf] are counted from 1 to n, but [tccd, twave, tpsf] are counted from 0 to n-1
'''
import
sys
import
time
import
copy
import
numpy
as
np
import
scipy.spatial
as
spatial
import
galsim
import
h5py
from
ObservationSim.PSF.PSFModel
import
PSFModel
from
ObservationSim.Instrument.Chip
import
ChipUtils
as
chip_utils
import
os
from
astropy.io
import
fits
from
astropy.modeling.models
import
Gaussian2D
from
scipy
import
signal
LOG_DEBUG
=
False
#***#
NPSF
=
900
#***# 30*30
PixSizeInMicrons
=
5.
#***# in microns
###find neighbors-KDtree###
# def findNeighbors(tx, ty, px, py, dr=0.1, dn=1, OnlyDistance=True):
# """
# find nearest neighbors by 2D-KDTree
#
# Parameters:
# tx, ty (float, float): a given position
# px, py (numpy.array, numpy.array): position data for tree
# dr (float-optional): distance
# dn (int-optional): nearest-N
# OnlyDistance (bool-optional): only use distance to find neighbors. Default: True
#
# Returns:
# dataq (numpy.array): index
# """
# datax = px
# datay = py
# tree = spatial.KDTree(list(zip(datax.ravel(), datay.ravel())))
#
# dataq=[]
# rr = dr
# if OnlyDistance == True:
# dataq = tree.query_ball_point([tx, ty], rr)
# if OnlyDistance == False:
# while len(dataq) < dn:
# dataq = tree.query_ball_point([tx, ty], rr)
# rr += dr
# dd = np.hypot(datax[dataq]-tx, datay[dataq]-ty)
# ddSortindx = np.argsort(dd)
# dataq = np.array(dataq)[ddSortindx[0:dn]]
# return dataq
#
# ###find neighbors-hoclist###
# def hocBuild(partx, party, nhocx, nhocy, dhocx, dhocy):
# if np.max(partx) > nhocx*dhocx:
# print('ERROR')
# sys.exit()
# if np.max(party) > nhocy*dhocy:
# print('ERROR')
# sys.exit()
#
# npart = partx.size
# hoclist= np.zeros(npart, dtype=np.int32)-1
# hoc = np.zeros([nhocy, nhocx], dtype=np.int32)-1
# for ipart in range(npart):
# ix = int(partx[ipart]/dhocx)
# iy = int(party[ipart]/dhocy)
# hoclist[ipart] = hoc[iy, ix]
# hoc[iy, ix] = ipart
# return hoc, hoclist
#
# def hocFind(px, py, dhocx, dhocy, hoc, hoclist):
# ix = int(px/dhocx)
# iy = int(py/dhocy)
#
# neigh=[]
# it = hoc[iy, ix]
# while it != -1:
# neigh.append(it)
# it = hoclist[it]
# return neigh
#
# def findNeighbors_hoclist(px, py, tx=None,ty=None, dn=4, hoc=None, hoclist=None):
# nhocy = nhocx = 20
#
# pxMin = np.min(px)
# pxMax = np.max(px)
# pyMin = np.min(py)
# pyMax = np.max(py)
#
# dhocx = (pxMax - pxMin)/(nhocx-1)
# dhocy = (pyMax - pyMin)/(nhocy-1)
# partx = px - pxMin +dhocx/2
# party = py - pyMin +dhocy/2
#
# if hoc is None:
# hoc, hoclist = hocBuild(partx, party, nhocx, nhocy, dhocx, dhocy)
# return hoc, hoclist
#
# if hoc is not None:
# tx = tx - pxMin +dhocx/2
# ty = ty - pyMin +dhocy/2
# itx = int(tx/dhocx)
# ity = int(ty/dhocy)
#
# ps = [-1, 0, 1]
# neigh=[]
# for ii in range(3):
# for jj in range(3):
# ix = itx + ps[ii]
# iy = ity + ps[jj]
# if ix < 0:
# continue
# if iy < 0:
# continue
# if ix > nhocx-1:
# continue
# if iy > nhocy-1:
# continue
#
# #neightt = myUtil.hocFind(ppx, ppy, dhocx, dhocy, hoc, hoclist)
# it = hoc[iy, ix]
# while it != -1:
# neigh.append(it)
# it = hoclist[it]
# #neigh.append(neightt)
# #ll = [i for k in neigh for i in k]
# if dn != -1:
# ptx = np.array(partx[neigh])
# pty = np.array(party[neigh])
# dd = np.hypot(ptx-tx, pty-ty)
# idx = np.argsort(dd)
# neigh= np.array(neigh)[idx[0:dn]]
# return neigh
#
#
# ###PSF-IDW###
# def psfMaker_IDW(px, py, PSFMat, cen_col, cen_row, IDWindex=2, OnlyNeighbors=True, hoc=None, hoclist=None, PSFCentroidWgt=False):
# """
# psf interpolation by IDW
#
# Parameters:
# px, py (float, float): position of the target
# PSFMat (numpy.array): image
# cen_col, cen_row (numpy.array, numpy.array): potions of the psf centers
# IDWindex (int-optional): the power index of IDW
# OnlyNeighbors (bool-optional): only neighbors are used for psf interpolation
#
# Returns:
# psfMaker (numpy.array)
# """
#
# minimum_psf_weight = 1e-8
# ref_col = px
# ref_row = py
#
# ngy, ngx = PSFMat[0, :, :].shape
# npsf = PSFMat[:, :, :].shape[0]
# psfWeight = np.zeros([npsf])
#
# if OnlyNeighbors == True:
# if hoc is None:
# neigh = findNeighbors(px, py, cen_col, cen_row, dr=5., dn=4, OnlyDistance=False)
# if hoc is not None:
# neigh = findNeighbors_hoclist(cen_col, cen_row, tx=px,ty=py, dn=4, hoc=hoc, hoclist=hoclist)
#
# neighFlag = np.zeros(npsf)
# neighFlag[neigh] = 1
#
# for ipsf in range(npsf):
# if OnlyNeighbors == True:
# if neighFlag[ipsf] != 1:
# continue
#
# dist = np.sqrt((ref_col - cen_col[ipsf])**2 + (ref_row - cen_row[ipsf])**2)
# if IDWindex == 1:
# psfWeight[ipsf] = dist
# if IDWindex == 2:
# psfWeight[ipsf] = dist**2
# if IDWindex == 3:
# psfWeight[ipsf] = dist**3
# if IDWindex == 4:
# psfWeight[ipsf] = dist**4
# psfWeight[ipsf] = max(psfWeight[ipsf], minimum_psf_weight)
# psfWeight[ipsf] = 1./psfWeight[ipsf]
# psfWeight /= np.sum(psfWeight)
#
# psfMaker = np.zeros([ngy, ngx], dtype=np.float32)
# for ipsf in range(npsf):
# if OnlyNeighbors == True:
# if neighFlag[ipsf] != 1:
# continue
#
# iPSFMat = PSFMat[ipsf, :, :].copy()
# ipsfWeight = psfWeight[ipsf]
#
# psfMaker += iPSFMat * ipsfWeight
# psfMaker /= np.nansum(psfMaker)
#
# return psfMaker
###define PSFInterp###
class
PSFInterpSLS
(
PSFModel
):
def
__init__
(
self
,
chip
,
filt
,
PSF_data_prefix
=
""
,
sigSpin
=
0
,
psfRa
=
0.15
,
pix_size
=
0.005
):
if
LOG_DEBUG
:
print
(
'==================================================='
)
print
(
'DEBUG: psf module for csstSim '
\
+
time
.
strftime
(
"(%Y-%m-%d %H:%M:%S)"
,
time
.
localtime
()),
flush
=
True
)
print
(
'==================================================='
)
self
.
sigSpin
=
sigSpin
self
.
sigGauss
=
psfRa
self
.
grating_ids
=
chip_utils
.
getChipSLSGratingID
(
chip
.
chipID
)
_
,
self
.
grating_type
=
chip
.
getChipFilter
(
chipID
=
chip
.
chipID
)
self
.
data_folder
=
PSF_data_prefix
self
.
getPSFDataFromFile
(
filt
)
self
.
pixsize
=
pix_size
# um
def
getPSFDataFromFile
(
self
,
filt
):
gratingInwavelist
=
{
'GU'
:
0
,
'GV'
:
1
,
'GI'
:
2
}
grating_orders
=
[
'0'
,
'1'
]
waveListFn
=
self
.
data_folder
+
'/wavelist.dat'
wavelists
=
np
.
loadtxt
(
waveListFn
)
self
.
waveList
=
wavelists
[:,
gratingInwavelist
[
self
.
grating_type
]]
bandranges
=
np
.
zeros
([
4
,
2
])
midBand
=
(
self
.
waveList
[
0
:
3
]
+
self
.
waveList
[
1
:
4
])
/
2.
*
10000.
bandranges
[
0
,
0
]
=
filt
.
blue_limit
bandranges
[
1
:
4
,
0
]
=
midBand
bandranges
[
0
:
3
,
1
]
=
midBand
bandranges
[
3
,
1
]
=
filt
.
red_limit
self
.
bandranges
=
bandranges
self
.
grating1_data
=
{}
g_folder
=
self
.
data_folder
+
'/'
+
self
.
grating_ids
[
0
]
+
'/'
for
g_order
in
grating_orders
:
g_folder_order
=
g_folder
+
'PSF_Order_'
+
g_order
+
'/'
grating_order_data
=
{}
for
bandi
in
[
1
,
2
,
3
,
4
]:
subBand_data
=
{}
subBand_data
[
'bandrange'
]
=
bandranges
[
bandi
-
1
]
final_folder
=
g_folder_order
+
str
(
bandi
)
+
'/'
print
(
final_folder
)
pca_fs
=
os
.
listdir
(
final_folder
)
for
fname
in
pca_fs
:
if
(
'_PCs.fits'
in
fname
)
and
(
fname
[
0
]
!=
'.'
):
fname_
=
final_folder
+
fname
hdu
=
fits
.
open
(
fname_
)
subBand_data
[
'band_data'
]
=
hdu
grating_order_data
[
'band'
+
str
(
bandi
)]
=
subBand_data
self
.
grating1_data
[
'order'
+
g_order
]
=
grating_order_data
self
.
grating2_data
=
{}
g_folder
=
self
.
data_folder
+
'/'
+
self
.
grating_ids
[
1
]
+
'/'
for
g_order
in
grating_orders
:
g_folder_order
=
g_folder
+
'PSF_Order_'
+
g_order
+
'/'
grating_order_data
=
{}
for
bandi
in
[
1
,
2
,
3
,
4
]:
subBand_data
=
{}
subBand_data
[
'bandrange'
]
=
bandranges
[
bandi
-
1
]
final_folder
=
g_folder_order
+
str
(
bandi
)
+
'/'
print
(
final_folder
)
pca_fs
=
os
.
listdir
(
final_folder
)
for
fname
in
pca_fs
:
if
(
'_PCs.fits'
in
fname
)
and
(
fname
[
0
]
!=
'.'
):
fname_
=
final_folder
+
fname
hdu
=
fits
.
open
(
fname_
)
subBand_data
[
'band_data'
]
=
hdu
grating_order_data
[
'band'
+
str
(
bandi
)]
=
subBand_data
self
.
grating2_data
[
'order'
+
g_order
]
=
grating_order_data
#
#
#
# def _getPSFwave(self, iccd, PSF_data_file, PSF_data_prefix):
# # fq = h5py.File(PSF_data_file+'/' +PSF_data_prefix +'psfCube_ccd{:}.h5'.format(iccd), 'r')
# fq = h5py.File(PSF_data_file+'/' +PSF_data_prefix +'psfCube_{:}.h5'.format(iccd), 'r')
# nwave = len(fq.keys())
# fq.close()
# return nwave
#
#
# def _loadPSF(self, iccd, PSF_data_file, PSF_data_prefix):
# psfSet = []
# # fq = h5py.File(PSF_data_file+'/' +PSF_data_prefix +'psfCube_ccd{:}.h5'.format(iccd), 'r')
# fq = h5py.File(PSF_data_file+'/' +PSF_data_prefix +'psfCube_{:}.h5'.format(iccd), 'r')
# for ii in range(self.nwave):
# iwave = ii+1
# psfWave = []
#
# fq_iwave = fq['w_{:}'.format(iwave)]
# for jj in range(self.npsf):
# ipsf = jj+1
# psfInfo = {}
# psfInfo['wavelength']= fq_iwave['wavelength'][()]
#
# fq_iwave_ipsf = fq_iwave['psf_{:}'.format(ipsf)]
# psfInfo['pixsize'] = PixSizeInMicrons
# psfInfo['field_x'] = fq_iwave_ipsf['field_x'][()]
# psfInfo['field_y'] = fq_iwave_ipsf['field_y'][()]
# psfInfo['image_x'] = fq_iwave_ipsf['image_x'][()]
# psfInfo['image_y'] = fq_iwave_ipsf['image_y'][()]
# psfInfo['centroid_x']= fq_iwave_ipsf['cx'][()]
# psfInfo['centroid_y']= fq_iwave_ipsf['cy'][()]
# psfInfo['psfMat'] = fq_iwave_ipsf['psfMat'][()]
#
# psfWave.append(psfInfo)
# psfSet.append(psfWave)
# fq.close()
#
# if LOG_DEBUG:
# print('psfSet has been loaded:', flush=True)
# print('psfSet[iwave][ipsf][keys]:', psfSet[0][0].keys(), flush=True)
# return psfSet
#
#
# def _findWave(self, bandpass):
# if isinstance(bandpass,int):
# twave = bandpass
# return twave
#
# for twave in range(self.nwave):
# bandwave = self.PSF_data[twave][0]['wavelength']
# if bandpass.blue_limit < bandwave and bandwave < bandpass.red_limit:
# return twave
# return -1
#
#
def
convolveWithGauss
(
self
,
img
=
None
,
sigma
=
1
):
offset
=
int
(
np
.
ceil
(
sigma
*
3
))
g_size
=
2
*
offset
+
1
m_cen
=
int
(
g_size
/
2
)
print
(
'-----'
,
g_size
)
g_PSF_
=
Gaussian2D
(
1
,
m_cen
,
m_cen
,
sigma
,
sigma
)
yp
,
xp
=
np
.
mgrid
[
0
:
g_size
,
0
:
g_size
]
g_PSF
=
g_PSF_
(
xp
,
yp
)
psf
=
g_PSF
/
g_PSF
.
sum
()
convImg
=
signal
.
fftconvolve
(
img
,
psf
,
mode
=
'full'
,
axes
=
None
)
convImg
=
convImg
/
np
.
sum
(
convImg
)
return
convImg
def
get_PSF
(
self
,
chip
,
pos_img_local
=
[
1000
,
1000
],
bandNo
=
1
,
galsimGSObject
=
True
,
folding_threshold
=
5.e-3
,
g_order
=
'A'
,
grating_split_pos
=
3685
):
"""
Get the PSF at a given image position
Parameters:
chip: A 'Chip' object representing the chip we want to extract PSF from.
pos_img: A 'galsim.Position' object representing the image position.
bandpass: A 'galsim.Bandpass' object representing the wavelength range.
pixSize: The pixels size of psf matrix
findNeighMode: 'treeFind' or 'hoclistFind'
Returns:
PSF: A 'galsim.GSObject'.
"""
order_IDs
=
{
'A'
:
'1'
,
'B'
:
'0'
,
'C'
:
'0'
,
'D'
:
'0'
,
'E'
:
'0'
}
contam_order_sigma
=
{
'C'
:
0.28032344707964174
,
'D'
:
0.39900182912061344
,
'E'
:
1.1988309797685412
}
#arcsec
x_start
=
chip
.
x_cen
/
chip
.
pix_size
-
chip
.
npix_x
/
2.
y_start
=
chip
.
y_cen
/
chip
.
pix_size
-
chip
.
npix_y
/
2.
# print(pos_img.x - x_start)
pos_img_x
=
pos_img_local
[
0
]
+
x_start
pos_img_y
=
pos_img_local
[
1
]
+
y_start
pos_img
=
galsim
.
PositionD
(
pos_img_x
,
pos_img_y
)
if
pos_img_local
[
0
]
<
grating_split_pos
:
psf_data
=
self
.
grating1_data
else
:
psf_data
=
self
.
grating2_data
grating_order
=
order_IDs
[
g_order
]
# if grating_order in ['-2','-1','2']:
# grating_order = '1'
# if grating_order in ['0', '1']:
psf_order
=
psf_data
[
'order'
+
grating_order
]
psf_order_b
=
psf_order
[
'band'
+
str
(
bandNo
)]
psf_b_dat
=
psf_order_b
[
'band_data'
]
pos_p
=
psf_b_dat
[
1
].
data
pc_coeff
=
psf_b_dat
[
2
].
data
pcs
=
psf_b_dat
[
0
].
data
# print(max(pos_p[:,0]), min(pos_p[:,0]),max(pos_p[:,1]), min(pos_p[:,1]))
# print(chip.x_cen, chip.y_cen)
# print(pos_p)
px
=
pos_img
.
x
*
chip
.
pix_size
py
=
pos_img
.
y
*
chip
.
pix_size
dist2
=
(
pos_p
[:,
1
]
-
px
)
*
(
pos_p
[:,
1
]
-
px
)
+
(
pos_p
[:,
0
]
-
py
)
*
(
pos_p
[:,
0
]
-
py
)
temp_sort_dist
=
np
.
zeros
([
dist2
.
shape
[
0
],
2
])
temp_sort_dist
[:,
0
]
=
np
.
arange
(
0
,
dist2
.
shape
[
0
],
1
)
temp_sort_dist
[:,
1
]
=
dist2
# print(temp_sort_dist)
dits2_sortlist
=
sorted
(
temp_sort_dist
,
key
=
lambda
x
:
x
[
1
])
# print(dits2_sortlist)
nearest4p
=
np
.
zeros
([
4
,
2
])
pc_coeff_4p
=
np
.
zeros
([
pc_coeff
.
data
.
shape
[
0
],
4
])
for
i
in
np
.
arange
(
4
):
smaller_ids
=
int
(
dits2_sortlist
[
i
][
0
])
nearest4p
[
i
,
0
]
=
pos_p
[
smaller_ids
,
1
]
nearest4p
[
i
,
1
]
=
pos_p
[
smaller_ids
,
0
]
pc_coeff_4p
[:,
i
]
=
pc_coeff
[:,
smaller_ids
]
idw_dist
=
1
/
(
np
.
sqrt
((
px
-
nearest4p
[:,
0
])
*
(
px
-
nearest4p
[:,
0
])
+
(
py
-
nearest4p
[:,
1
])
*
(
py
-
nearest4p
[:,
1
])))
coeff_int
=
np
.
zeros
(
pc_coeff
.
data
.
shape
[
0
])
for
i
in
np
.
arange
(
4
):
coeff_int
=
coeff_int
+
pc_coeff_4p
[:,
i
]
*
idw_dist
[
i
]
coeff_int
=
coeff_int
/
np
.
sum
(
coeff_int
)
npc
=
10
m_size
=
int
(
pcs
.
shape
[
0
]
**
0.5
)
PSF_int
=
np
.
dot
(
pcs
[:,
0
:
npc
],
coeff_int
[
0
:
npc
]).
reshape
(
m_size
,
m_size
)
# PSF_int = PSF_int/np.sum(PSF_int)
PSF_int_trans
=
np
.
flipud
(
np
.
fliplr
(
PSF_int
))
PSF_int_trans
=
np
.
fliplr
(
PSF_int_trans
.
T
)
# PSF_int_trans = np.abs(PSF_int_trans)
# ids_szero = PSF_int_trans<0
# PSF_int_trans[ids_szero] = 0
# print(PSF_int_trans[ids_szero].shape[0],PSF_int_trans.shape)
PSF_int_trans
=
PSF_int_trans
/
np
.
sum
(
PSF_int_trans
)
# from astropy.io import fits
# fits.writeto(str(bandNo) + '_' + g_order+ '_psf_o.fits', PSF_int_trans)
# if g_order in ['C','D','E']:
# g_simgma = contam_order_sigma[g_order]/pixel_size_arc
# PSF_int_trans = self.convolveWithGauss(PSF_int_trans,g_simgma)
# n_m_size = int(m_size/2)
#
# n_PSF_int = np.zeros([n_m_size, n_m_size])
#
# for i in np.arange(n_m_size):
# for j in np.arange(n_m_size):
# n_PSF_int[i,j] = np.sum(PSF_int[2*i:2*i+2, 2*j:2*j+2])
#
# n_PSF_int = n_PSF_int/np.sum(n_PSF_int)
# chip.img = galsim.ImageF(chip.npix_x, chip.npix_y)
# chip.img.wcs = galsim.wcs.AffineTransform
if
galsimGSObject
:
# imPSFt = np.zeros([257,257])
# imPSFt[0:256, 0:256] = imPSF
# # imPSFt[120:130, 0:256] = 1.
pixel_size_arc
=
np
.
rad2deg
(
self
.
pixsize
*
1e-3
/
28
)
*
3600
img
=
galsim
.
ImageF
(
PSF_int_trans
,
scale
=
pixel_size_arc
)
gsp
=
galsim
.
GSParams
(
folding_threshold
=
folding_threshold
)
############TEST: START
# Use sheared PSF to test the PSF orientation
# self.psf = galsim.InterpolatedImage(img, gsparams=gsp).shear(g1=0.8, g2=0.)
############TEST: END
self
.
psf
=
galsim
.
InterpolatedImage
(
img
,
gsparams
=
gsp
)
# if g_order in ['C','D','E']:
# add_psf = galsim.Gaussian(sigma=contam_order_sigma[g_order], flux=1.0)
# self.psf = galsim.Convolve(self.psf, add_psf)
wcs
=
chip
.
img
.
wcs
.
local
(
pos_img
)
scale
=
galsim
.
PixelScale
(
0.074
)
self
.
psf
=
wcs
.
toWorld
(
scale
.
toImage
(
self
.
psf
),
image_pos
=
(
pos_img
))
# return self.PSFspin(x=px/0.01, y=py/0.01)
return
self
.
psf
,
galsim
.
Shear
(
e
=
0.
,
beta
=
(
np
.
pi
/
2
)
*
galsim
.
radians
)
return
PSF_int_trans
,
PSF_int
# pixSize = np.rad2deg(self.pixsize*1e-3/28)*3600 #set psf pixsize
#
# # assert self.iccd == int(chip.getChipLabel(chipID=chip.chipID)), 'ERROR: self.iccd != chip.chipID'
# twave = self._findWave(bandpass)
# if twave == -1:
# print("!!!PSF bandpass does not match.")
# exit()
# PSFMat = self.psfMat[twave]
# cen_col= self.cen_col[twave]
# cen_row= self.cen_row[twave]
#
# px = (pos_img.x - chip.cen_pix_x)*0.01
# py = (pos_img.y - chip.cen_pix_y)*0.01
# if findNeighMode == 'treeFind':
# imPSF = psfMaker_IDW(px, py, PSFMat, cen_col, cen_row, IDWindex=2, OnlyNeighbors=True, PSFCentroidWgt=True)
# if findNeighMode == 'hoclistFind':
# assert(self.hoc != 0), 'hoclist should be built correctly!'
# imPSF = psfMaker_IDW(px, py, PSFMat, cen_col, cen_row, IDWindex=2, OnlyNeighbors=True, hoc=self.hoc[twave], hoclist=self.hoclist[twave], PSFCentroidWgt=True)
#
# ############TEST: START
# TestGaussian = False
# if TestGaussian:
# gsx = galsim.Gaussian(sigma=0.04)
# #pointing_pa = -23.433333
# imPSF= gsx.shear(g1=0.8, g2=0.).rotate(0.*galsim.degrees).drawImage(nx = 256, ny=256, scale=pixSize).array
# ############TEST: END
#
# if galsimGSObject:
# imPSFt = np.zeros([257,257])
# imPSFt[0:256, 0:256] = imPSF
# # imPSFt[120:130, 0:256] = 1.
#
# img = galsim.ImageF(imPSFt, scale=pixSize)
# gsp = galsim.GSParams(folding_threshold=folding_threshold)
# ############TEST: START
# # Use sheared PSF to test the PSF orientation
# # self.psf = galsim.InterpolatedImage(img, gsparams=gsp).shear(g1=0.8, g2=0.)
# ############TEST: END
# self.psf = galsim.InterpolatedImage(img, gsparams=gsp)
# wcs = chip.img.wcs.local(pos_img)
# scale = galsim.PixelScale(0.074)
# self.psf = wcs.toWorld(scale.toImage(self.psf), image_pos=(pos_img))
#
# # return self.PSFspin(x=px/0.01, y=py/0.01)
# return self.psf, galsim.Shear(e=0., beta=(np.pi/2)*galsim.radians)
# return imPSF
#
# def PSFspin(self, x, y):
# """
# The PSF profile at a given image position relative to the axis center
#
# Parameters:
# theta : spin angles in a given exposure in unit of [arcsecond]
# dx, dy: relative position to the axis center in unit of [pixels]
#
# Return:
# Spinned PSF: g1, g2 and axis ratio 'a/b'
# """
# a2Rad = np.pi/(60.0*60.0*180.0)
#
# ff = self.sigGauss * 0.107 * (1000.0/10.0) # in unit of [pixels]
# rc = np.sqrt(x*x + y*y)
# cpix = rc*(self.sigSpin*a2Rad)
#
# beta = (np.arctan2(y,x) + np.pi/2)
# ell = cpix**2/(2.0*ff**2+cpix**2)
# qr = np.sqrt((1.0+ell)/(1.0-ell))
# PSFshear = galsim.Shear(e=ell, beta=beta*galsim.radians)
# return self.psf.shear(PSFshear), PSFshear
from
ObservationSim.Instrument
import
Filter
,
FilterParam
,
Chip
import
yaml
if
__name__
==
'__main__'
:
configfn
=
'/Users/zhangxin/Work/SlitlessSim/CSST_SIM/CSST_new_sim/csst-simulation/config/config_C6_dev.yaml'
with
open
(
configfn
,
"r"
)
as
stream
:
try
:
config
=
yaml
.
safe_load
(
stream
)
for
key
,
value
in
config
.
items
():
print
(
key
+
" : "
+
str
(
value
))
except
yaml
.
YAMLError
as
exc
:
print
(
exc
)
chip
=
Chip
(
chipID
=
1
,
config
=
config
)
filter_id
,
filter_type
=
chip
.
getChipFilter
()
filt
=
Filter
(
filter_id
=
filter_id
,
filter_type
=
filter_type
,
filter_param
=
FilterParam
())
psf_i
=
PSFInterpSLS
(
chip
,
filt
,
PSF_data_prefix
=
"/Volumes/EAGET/CSST_PSF_data/SLS_PSF_PCA_fp/"
)
pos_img
=
galsim
.
PositionD
(
x
=
25155
,
y
=-
22060
)
psf_im
=
psf_i
.
get_PSF
(
chip
,
pos_img
=
pos_img
,
g_order
=
'1'
)
ObservationSim/PSF/PSFModel.py
deleted
100755 → 0
View file @
4afd1181
import
galsim
import
sep
import
numpy
as
np
from
scipy.interpolate
import
interp1d
import
pylab
as
pl
import
os
,
sys
class
PSFModel
(
object
):
def
__init__
(
self
,
sigSpin
=
0.
,
psfRa
=
0.15
):
# TODO: what are the nesseary fields in PSFModel class?
pass
def
PSFspin
(
self
,
psf
,
sigSpin
,
sigGauss
,
dx
,
dy
):
"""
The PSF profile at a given image position relative to the axis center
Parameters:
theta : spin angles in a given exposure in unit of [arcsecond]
dx, dy: relative position to the axis center in unit of [pixels]
Return:
Spinned PSF: g1, g2 and axis ratio 'a/b'
"""
a2Rad
=
np
.
pi
/
(
60.0
*
60.0
*
180.0
)
ff
=
sigGauss
*
0.107
*
(
1000.0
/
10.0
)
# in unit of [pixels]
rc
=
np
.
sqrt
(
dx
*
dx
+
dy
*
dy
)
cpix
=
rc
*
(
sigSpin
*
a2Rad
)
beta
=
(
np
.
arctan2
(
dy
,
dx
)
+
np
.
pi
/
2
)
ell
=
cpix
**
2
/
(
2.0
*
ff
**
2
+
cpix
**
2
)
#ell *= 10.0
qr
=
np
.
sqrt
((
1.0
+
ell
)
/
(
1.0
-
ell
))
#psfShape = galsim.Shear(e=ell, beta=beta)
#g1, g2 = psfShape.g1, psfShape.g2
#qr = np.sqrt((1.0+ell)/(1.0-ell))
#return ell, beta, qr
PSFshear
=
galsim
.
Shear
(
e
=
ell
,
beta
=
beta
*
galsim
.
radians
)
return
psf
.
shear
(
PSFshear
),
PSFshear
\ No newline at end of file
ObservationSim/PSF/__init__.py
deleted
100755 → 0
View file @
4afd1181
from
.PSFModel
import
PSFModel
from
.PSFGauss
import
PSFGauss
# from .PSFInterp.PSFInterp import PSFInterp
from
.PSFInterp
import
PSFInterp
from
.PSFInterpSLS
import
PSFInterpSLS
from
.FieldDistortion
import
FieldDistortion
\ No newline at end of file
ObservationSim/Straylight/SkybackgroundMap.py
deleted
100644 → 0
View file @
4afd1181
from
ObservationSim.MockObject.SpecDisperser
import
SpecDisperser
from
ObservationSim.MockObject.SpecDisperser
import
rotate90
import
galsim
import
numpy
as
np
from
astropy.table
import
Table
from
scipy
import
interpolate
import
galsim
import
astropy.constants
as
cons
import
os
import
time
try
:
import
importlib.resources
as
pkg_resources
except
ImportError
:
# Try backported to PY<37 'importlib_resources'
import
importlib_resources
as
pkg_resources
###calculate sky map by sky SED
def
calculateSkyMap_split_g
(
skyMap
=
None
,
blueLimit
=
4200
,
redLimit
=
6500
,
skyfn
=
'sky_emiss_hubble_50_50_A.dat'
,
conf
=
[
''
],
pixelSize
=
0.074
,
isAlongY
=
0
,
split_pos
=
3685
,
flat_cube
=
None
,
zoldial_spec
=
None
):
# skyMap = np.ones([yLen, xLen], dtype='float32')
#
# if isAlongY == 1:
# skyMap = np.ones([xLen, yLen], dtype='float32')
# for i in range(len(conf)):
# conf[i] = os.path.join(SLSSIM_PATH, conf[i])
conf1
=
conf
[
0
]
conf2
=
conf
[
0
]
if
np
.
size
(
conf
)
==
2
:
conf2
=
conf
[
1
]
skyImg
=
galsim
.
Image
(
skyMap
,
xmin
=
0
,
ymin
=
0
)
tbstart
=
blueLimit
tbend
=
redLimit
fimg
=
np
.
zeros_like
(
skyMap
)
fImg
=
galsim
.
Image
(
fimg
)
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.data.sky'
).
joinpath
(
skyfn
)
as
data_path
:
skySpec
=
np
.
loadtxt
(
data_path
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.data.sky'
,
skyfn
)
as
data_path
:
skySpec
=
np
.
loadtxt
(
data_path
)
# skySpec = np.loadtxt(skyfn)
spec
=
Table
(
np
.
array
([
skySpec
[:,
0
],
skySpec
[:,
1
]]).
T
,
names
=
(
'WAVELENGTH'
,
'FLUX'
))
if
zoldial_spec
is
not
None
:
deltL
=
0.5
lamb
=
np
.
arange
(
2000
,
11000
,
deltL
)
speci
=
interpolate
.
interp1d
(
zoldial_spec
[
'WAVELENGTH'
],
zoldial_spec
[
'FLUX'
])
y
=
speci
(
lamb
)
# erg/s/cm2/A --> photo/s/m2/A
s_flux
=
y
*
lamb
/
(
cons
.
h
.
value
*
cons
.
c
.
value
)
*
1e-13
spec
=
Table
(
np
.
array
([
lamb
,
s_flux
]).
T
,
names
=
(
'WAVELENGTH'
,
'FLUX'
))
if
isAlongY
==
0
:
directParm
=
0
if
isAlongY
==
1
:
directParm
=
1
if
split_pos
>=
skyImg
.
array
.
shape
[
directParm
]:
skyImg1
=
galsim
.
Image
(
skyImg
.
array
)
origin1
=
[
0
,
0
]
# sdp = specDisperser.specDisperser(orig_img=skyImg1, xcenter=skyImg1.center.x, ycenter=skyImg1.center.y,
# full_img=fimg, tar_spec=spec, band_start=tbstart, band_end=tbend,
# origin=origin1,
# conf=conf1)
# sdp.compute_spec_orders()
y_len
=
skyMap
.
shape
[
0
]
x_len
=
skyMap
.
shape
[
1
]
delt_x
=
100
delt_y
=
100
sub_y_start_arr
=
np
.
arange
(
0
,
y_len
,
delt_y
)
sub_y_end_arr
=
sub_y_start_arr
+
delt_y
sub_y_end_arr
[
-
1
]
=
min
(
sub_y_end_arr
[
-
1
],
y_len
)
sub_x_start_arr
=
np
.
arange
(
0
,
x_len
,
delt_x
)
sub_x_end_arr
=
sub_x_start_arr
+
delt_x
sub_x_end_arr
[
-
1
]
=
min
(
sub_x_end_arr
[
-
1
],
x_len
)
for
i
,
k1
in
enumerate
(
sub_y_start_arr
):
sub_y_s
=
k1
sub_y_e
=
sub_y_end_arr
[
i
]
sub_y_center
=
(
sub_y_s
+
sub_y_e
)
/
2.
for
j
,
k2
in
enumerate
(
sub_x_start_arr
):
sub_x_s
=
k2
sub_x_e
=
sub_x_end_arr
[
j
]
skyImg_sub
=
galsim
.
Image
(
skyImg
.
array
[
sub_y_s
:
sub_y_e
,
sub_x_s
:
sub_x_e
])
origin_sub
=
[
sub_y_s
,
sub_x_s
]
sub_x_center
=
(
sub_x_s
+
sub_x_e
)
/
2.
sdp
=
SpecDisperser
(
orig_img
=
skyImg_sub
,
xcenter
=
sub_x_center
,
ycenter
=
sub_y_center
,
origin
=
origin_sub
,
tar_spec
=
spec
,
band_start
=
tbstart
,
band_end
=
tbend
,
conf
=
conf2
,
flat_cube
=
flat_cube
,
ignoreBeam
=
[
'D'
,
'E'
])
spec_orders
=
sdp
.
compute_spec_orders
()
for
k
,
v
in
spec_orders
.
items
():
img_s
=
v
[
0
]
origin_order_x
=
v
[
1
]
origin_order_y
=
v
[
2
]
ssImg
=
galsim
.
ImageF
(
img_s
)
ssImg
.
setOrigin
(
origin_order_x
,
origin_order_y
)
bounds
=
ssImg
.
bounds
&
fImg
.
bounds
if
bounds
.
area
()
==
0
:
continue
fImg
[
bounds
]
=
fImg
[
bounds
]
+
ssImg
[
bounds
]
# sdp = SpecDisperser(orig_img=skyImg1, xcenter=skyImg1.center.x, ycenter=skyImg1.center.y, origin=origin1,
# tar_spec=spec,
# band_start=tbstart, band_end=tbend,
# conf=conf2,
# flat_cube=flat_cube, ignoreBeam=['D','E'])
#
# spec_orders = sdp.compute_spec_orders()
#
# for k, v in spec_orders.items():
# img_s = v[0]
# origin_order_x = v[1]
# origin_order_y = v[2]
# ssImg = galsim.ImageF(img_s)
# ssImg.setOrigin(origin_order_x, origin_order_y)
# bounds = ssImg.bounds & fImg.bounds
# if bounds.area() == 0:
# continue
# fImg[bounds] = fImg[bounds] + ssImg[bounds]
else
:
# skyImg1 = galsim.Image(skyImg.array[:, 0:split_pos])
# origin1 = [0, 0]
# skyImg2 = galsim.Image(skyImg.array[:, split_pos:])
# origin2 = [0, split_pos]
# sdp = specDisperser.specDisperser(orig_img=skyImg1, xcenter=skyImg1.center.x, ycenter=skyImg1.center.y,
# full_img=fimg, tar_spec=spec, band_start=tbstart, band_end=tbend,
# origin=origin1,
# conf=conf1)
# sdp.compute_spec_orders()
y_len
=
skyMap
.
shape
[
0
]
x_len
=
skyMap
.
shape
[
1
]
delt_x
=
500
delt_y
=
y_len
sub_y_start_arr
=
np
.
arange
(
0
,
y_len
,
delt_y
)
sub_y_end_arr
=
sub_y_start_arr
+
delt_y
sub_y_end_arr
[
-
1
]
=
min
(
sub_y_end_arr
[
-
1
],
y_len
)
delt_x
=
split_pos
-
0
sub_x_start_arr
=
np
.
arange
(
0
,
split_pos
,
delt_x
)
sub_x_end_arr
=
sub_x_start_arr
+
delt_x
sub_x_end_arr
[
-
1
]
=
min
(
sub_x_end_arr
[
-
1
],
split_pos
)
for
i
,
k1
in
enumerate
(
sub_y_start_arr
):
sub_y_s
=
k1
sub_y_e
=
sub_y_end_arr
[
i
]
sub_y_center
=
(
sub_y_s
+
sub_y_e
)
/
2.
for
j
,
k2
in
enumerate
(
sub_x_start_arr
):
sub_x_s
=
k2
sub_x_e
=
sub_x_end_arr
[
j
]
# print(i,j,sub_y_s, sub_y_e,sub_x_s,sub_x_e)
T1
=
time
.
time
()
skyImg_sub
=
galsim
.
Image
(
skyImg
.
array
[
sub_y_s
:
sub_y_e
,
sub_x_s
:
sub_x_e
])
origin_sub
=
[
sub_y_s
,
sub_x_s
]
sub_x_center
=
(
sub_x_s
+
sub_x_e
)
/
2.
sdp
=
SpecDisperser
(
orig_img
=
skyImg_sub
,
xcenter
=
sub_x_center
,
ycenter
=
sub_y_center
,
origin
=
origin_sub
,
tar_spec
=
spec
,
band_start
=
tbstart
,
band_end
=
tbend
,
conf
=
conf1
,
flat_cube
=
flat_cube
)
spec_orders
=
sdp
.
compute_spec_orders
()
for
k
,
v
in
spec_orders
.
items
():
img_s
=
v
[
0
]
origin_order_x
=
v
[
1
]
origin_order_y
=
v
[
2
]
ssImg
=
galsim
.
ImageF
(
img_s
)
ssImg
.
setOrigin
(
origin_order_x
,
origin_order_y
)
bounds
=
ssImg
.
bounds
&
fImg
.
bounds
if
bounds
.
area
()
==
0
:
continue
fImg
[
bounds
]
=
fImg
[
bounds
]
+
ssImg
[
bounds
]
T2
=
time
.
time
()
print
(
'time: %s ms'
%
((
T2
-
T1
)
*
1000
))
delt_x
=
x_len
-
split_pos
sub_x_start_arr
=
np
.
arange
(
split_pos
,
x_len
,
delt_x
)
sub_x_end_arr
=
sub_x_start_arr
+
delt_x
sub_x_end_arr
[
-
1
]
=
min
(
sub_x_end_arr
[
-
1
],
x_len
)
for
i
,
k1
in
enumerate
(
sub_y_start_arr
):
sub_y_s
=
k1
sub_y_e
=
sub_y_end_arr
[
i
]
sub_y_center
=
(
sub_y_s
+
sub_y_e
)
/
2.
for
j
,
k2
in
enumerate
(
sub_x_start_arr
):
sub_x_s
=
k2
sub_x_e
=
sub_x_end_arr
[
j
]
# print(i,j,sub_y_s, sub_y_e,sub_x_s,sub_x_e)
T1
=
time
.
time
()
skyImg_sub
=
galsim
.
Image
(
skyImg
.
array
[
sub_y_s
:
sub_y_e
,
sub_x_s
:
sub_x_e
])
origin_sub
=
[
sub_y_s
,
sub_x_s
]
sub_x_center
=
(
sub_x_s
+
sub_x_e
)
/
2.
sdp
=
SpecDisperser
(
orig_img
=
skyImg_sub
,
xcenter
=
sub_x_center
,
ycenter
=
sub_y_center
,
origin
=
origin_sub
,
tar_spec
=
spec
,
band_start
=
tbstart
,
band_end
=
tbend
,
conf
=
conf2
,
flat_cube
=
flat_cube
)
spec_orders
=
sdp
.
compute_spec_orders
()
for
k
,
v
in
spec_orders
.
items
():
img_s
=
v
[
0
]
origin_order_x
=
v
[
1
]
origin_order_y
=
v
[
2
]
ssImg
=
galsim
.
ImageF
(
img_s
)
ssImg
.
setOrigin
(
origin_order_x
,
origin_order_y
)
bounds
=
ssImg
.
bounds
&
fImg
.
bounds
if
bounds
.
area
()
==
0
:
continue
fImg
[
bounds
]
=
fImg
[
bounds
]
+
ssImg
[
bounds
]
T2
=
time
.
time
()
print
(
'time: %s ms'
%
((
T2
-
T1
)
*
1000
))
if
isAlongY
==
1
:
fimg
,
tmx
,
tmy
=
rotate90
(
array_orig
=
fImg
.
array
,
xc
=
0
,
yc
=
0
,
isClockwise
=
0
)
else
:
fimg
=
fImg
.
array
fimg
=
fimg
*
pixelSize
*
pixelSize
return
fimg
def
calculateSkyMap
(
xLen
=
9232
,
yLen
=
9126
,
blueLimit
=
4200
,
redLimit
=
6500
,
skyfn
=
'sky_emiss_hubble_50_50_A.dat'
,
conf
=
''
,
pixelSize
=
0.074
,
isAlongY
=
0
):
skyMap
=
np
.
ones
([
yLen
,
xLen
],
dtype
=
'float32'
)
if
isAlongY
==
1
:
skyMap
=
np
.
ones
([
xLen
,
yLen
],
dtype
=
'float32'
)
skyImg
=
galsim
.
Image
(
skyMap
)
tbstart
=
blueLimit
tbend
=
redLimit
fimg
=
np
.
zeros_like
(
skyMap
)
fImg
=
galsim
.
Image
(
fimg
)
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.data.sky'
).
joinpath
(
skyfn
)
as
data_path
:
skySpec
=
np
.
loadtxt
(
data_path
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.data.sky'
,
skyfn
)
as
data_path
:
skySpec
=
np
.
loadtxt
(
data_path
)
# skySpec = np.loadtxt(skyfn)
spec
=
Table
(
np
.
array
([
skySpec
[:,
0
],
skySpec
[:,
1
]]).
T
,
names
=
(
'WAVELENGTH'
,
'FLUX'
))
sdp
=
SpecDisperser
(
orig_img
=
skyImg
,
xcenter
=
skyImg
.
center
.
x
,
ycenter
=
skyImg
.
center
.
y
,
origin
=
[
1
,
1
],
tar_spec
=
spec
,
band_start
=
tbstart
,
band_end
=
tbend
,
conf
=
conf
)
spec_orders
=
sdp
.
compute_spec_orders
()
for
k
,
v
in
spec_orders
.
items
():
img_s
=
v
[
0
]
origin_order_x
=
v
[
1
]
origin_order_y
=
v
[
2
]
ssImg
=
galsim
.
ImageF
(
img_s
)
ssImg
.
setOrigin
(
origin_order_x
,
origin_order_y
)
bounds
=
ssImg
.
bounds
&
fImg
.
bounds
fImg
[
bounds
]
=
fImg
[
bounds
]
+
ssImg
[
bounds
]
if
isAlongY
==
1
:
fimg
,
tmx
,
tmy
=
rotate90
(
array_orig
=
fImg
.
array
,
xc
=
0
,
yc
=
0
,
isClockwise
=
0
)
else
:
fimg
=
fImg
.
array
fimg
=
fimg
*
pixelSize
*
pixelSize
return
fimg
ObservationSim/Straylight/Straylight.py
deleted
100644 → 0
View file @
4afd1181
import
ctypes
import
numpy
as
np
import
astropy.constants
as
cons
from
scipy
import
interpolate
import
math
from
astropy.table
import
Table
import
astropy.coordinates
as
coord
from
astropy
import
units
as
u
import
sys
try
:
import
importlib.resources
as
pkg_resources
except
ImportError
:
# Try backported to PY<37 'importlib_resources'
import
importlib_resources
as
pkg_resources
filterPivotWave
=
{
'nuv'
:
2875.5
,
'u'
:
3629.6
,
'g'
:
4808.4
,
'r'
:
6178.2
,
'i'
:
7609.0
,
'z'
:
9012.9
,
'y'
:
9627.9
}
filterIndex
=
{
'nuv'
:
0
,
'u'
:
1
,
'g'
:
2
,
'r'
:
3
,
'i'
:
4
,
'z'
:
5
,
'y'
:
6
}
filterCCD
=
{
'nuv'
:
'UV0'
,
'u'
:
'UV0'
,
'g'
:
'Astro_MB'
,
'r'
:
'Astro_MB'
,
'i'
:
'Basic_NIR'
,
'z'
:
'Basic_NIR'
,
'y'
:
'Basic_NIR'
}
bandRange
=
{
'nuv'
:[
2504.0
,
3230.0
],
'u'
:[
3190.0
,
4039.0
],
'g'
:[
3989.0
,
5498.0
],
'r'
:[
5438.0
,
6956.0
],
'i'
:[
6886.0
,
8469.0
],
'z'
:[
8379.0
,
10855.0
],
'y'
:[
9217.0
,
10900.0
],
'GU'
:[
2550
,
4000
],
'GV'
:[
4000
,
6200
],
'GI'
:[
6200
,
10000
]}
# Instrument_dir = '/Users/zhangxin/Work/SlitlessSim/CSST_SIM/CSST_C6/straylight/straylight/Instrument/'
SpecOrder
=
[
'-2'
,
'-1'
,
'0'
,
'1'
,
'2'
]
filterMirrorEff
=
{
'nuv'
:
0.54
,
'u'
:
0.68
,
'g'
:
0.8
,
'r'
:
0.8
,
'i'
:
0.8
,
'z'
:
0.8
,
'y'
:
0.8
}
def
transRaDec2D
(
ra
,
dec
):
x1
=
np
.
cos
(
dec
/
57.2957795
)
*
np
.
cos
(
ra
/
57.2957795
);
y1
=
np
.
cos
(
dec
/
57.2957795
)
*
np
.
sin
(
ra
/
57.2957795
);
z1
=
np
.
sin
(
dec
/
57.2957795
);
return
np
.
array
([
x1
,
y1
,
z1
])
def
getAngle132
(
x1
=
0
,
y1
=
0
,
z1
=
0
,
x2
=
0
,
y2
=
0
,
z2
=
0
,
x3
=
0
,
y3
=
0
,
z3
=
0
):
cosValue
=
0
;
angle
=
0
;
x11
=
x1
-
x3
;
y11
=
y1
-
y3
;
z11
=
z1
-
z3
;
x22
=
x2
-
x3
;
y22
=
y2
-
y3
;
z22
=
z2
-
z3
;
tt
=
np
.
sqrt
((
x11
*
x11
+
y11
*
y11
+
z11
*
z11
)
*
(
x22
*
x22
+
y22
*
y22
+
z22
*
z22
));
if
(
tt
==
0
):
return
0
;
cosValue
=
(
x11
*
x22
+
y11
*
y22
+
z11
*
z22
)
/
tt
;
if
(
cosValue
>
1
):
cosValue
=
1
;
if
(
cosValue
<
-
1
):
cosValue
=
-
1
;
angle
=
math
.
acos
(
cosValue
);
return
angle
*
360
/
(
2
*
math
.
pi
);
def
calculateAnglePwithEarth
(
sat
=
np
.
array
([
0
,
0
,
0
]),
pointing
=
np
.
array
([
0
,
0
,
0
]),
sun
=
np
.
array
([
0
,
0
,
0
])):
modSat
=
np
.
sqrt
(
sat
[
0
]
*
sat
[
0
]
+
sat
[
1
]
*
sat
[
1
]
+
sat
[
2
]
*
sat
[
2
])
modPoint
=
np
.
sqrt
(
pointing
[
0
]
*
pointing
[
0
]
+
pointing
[
1
]
*
pointing
[
1
]
+
pointing
[
2
]
*
pointing
[
2
])
withLocalZenithAngle
=
(
pointing
[
0
]
*
sat
[
0
]
+
pointing
[
1
]
*
sat
[
1
]
+
pointing
[
2
]
*
sat
[
2
])
/
(
modPoint
*
modSat
)
innerM_sat_sun
=
sat
[
0
]
*
sun
[
0
]
+
sat
[
1
]
*
sun
[
1
]
+
sat
[
2
]
*
sun
[
2
]
cosAngle
=
innerM_sat_sun
/
(
modSat
*
cons
.
au
.
value
/
1000
)
isInSunSide
=
1
if
(
cosAngle
<
-
0.3385737
):
#cos109.79
isInSunSide
=
-
1
;
elif
cosAngle
>=
-
0.3385737
and
cosAngle
<=
0.3385737
:
isInSunSide
=
0
;
return
math
.
acos
(
withLocalZenithAngle
)
*
180
/
math
.
pi
,
isInSunSide
# /**
# * *eCoor = ra, *eCoor+1 = dec
# */
def
Cartesian2Equatorial
(
carCoor
=
np
.
array
([
0
,
0
,
0
])):
eCoor
=
np
.
zeros
(
2
)
if
(
carCoor
[
0
]
>
0
and
carCoor
[
1
]
>=
0
):
eCoor
[
0
]
=
math
.
atan
(
carCoor
[
1
]
/
carCoor
[
0
])
*
360
/
(
2
*
math
.
pi
)
elif
(
carCoor
[
0
]
<
0
):
eCoor
[
0
]
=
(
math
.
atan
(
carCoor
[
1
]
/
carCoor
[
0
])
+
math
.
pi
)
*
360
/
(
2
*
math
.
pi
)
elif
(
carCoor
[
0
]
>
0
and
carCoor
[
1
]
<
0
):
eCoor
[
0
]
=
(
math
.
atan
(
carCoor
[
1
]
/
carCoor
[
0
])
+
2
*
math
.
pi
)
*
360
/
(
2
*
math
.
pi
)
elif
(
carCoor
[
0
]
==
0
and
carCoor
[
1
]
<
0
):
eCoor
[
0
]
=
270
elif
(
carCoor
[
0
]
==
0
and
carCoor
[
1
]
>
0
):
eCoor
[
0
]
=
90
eCoor
[
1
]
=
math
.
atan
(
carCoor
[
2
]
/
np
.
sqrt
(
carCoor
[
0
]
*
carCoor
[
0
]
+
carCoor
[
1
]
*
carCoor
[
1
]))
*
360
/
(
2
*
math
.
pi
)
return
eCoor
class
Straylight
(
object
):
def
__init__
(
self
,
jtime
=
2460843.
,
sat_pos
=
np
.
array
([
0
,
0
,
0
]),
pointing_radec
=
np
.
array
([
0
,
0
]),
sun_pos
=
np
.
array
([
0
,
0
,
0
])):
self
.
jtime
=
jtime
self
.
sat
=
sat_pos
self
.
sun_pos
=
sun_pos
self
.
equator
=
coord
.
SkyCoord
(
pointing_radec
[
0
]
*
u
.
degree
,
pointing_radec
[
1
]
*
u
.
degree
,
frame
=
'icrs'
)
self
.
ecliptic
=
self
.
equator
.
transform_to
(
'barycentrictrueecliptic'
)
self
.
pointing
=
transRaDec2D
(
pointing_radec
[
0
],
pointing_radec
[
1
])
platForm
=
sys
.
platform
if
platForm
==
'darwin'
:
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.lib'
).
joinpath
(
'libstraylight.dylib'
)
as
dllFn
:
self
.
slcdll
=
ctypes
.
CDLL
(
dllFn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.lib'
,
'libstraylight.dylib'
)
as
dllFn
:
self
.
slcdll
=
ctypes
.
CDLL
(
dllFn
)
elif
platForm
==
'linux'
:
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.lib'
).
joinpath
(
'libstraylight.so'
)
as
dllFn
:
self
.
slcdll
=
ctypes
.
CDLL
(
dllFn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.lib'
,
'libstraylight.so'
)
as
dllFn
:
self
.
slcdll
=
ctypes
.
CDLL
(
dllFn
)
# self.slcdll=ctypes.CDLL('./libstraylight.dylib')
self
.
slcdll
.
Calculate
.
argtypes
=
[
ctypes
.
c_double
,
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
c_char_p
]
self
.
slcdll
.
PointSource
.
argtypes
=
[
ctypes
.
c_double
,
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
c_char_p
]
self
.
slcdll
.
EarthShine
.
argtypes
=
[
ctypes
.
c_double
,
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
)]
self
.
slcdll
.
Zodiacal
.
argtypes
=
[
ctypes
.
c_double
,
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
)]
self
.
slcdll
.
ComposeY
.
argtypes
=
[
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
),
ctypes
.
POINTER
(
ctypes
.
c_double
)]
self
.
slcdll
.
Init
.
argtypes
=
[
ctypes
.
c_char_p
,
ctypes
.
c_char_p
,
ctypes
.
c_char_p
,
ctypes
.
c_char_p
]
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.lib'
).
joinpath
(
'DE405'
)
as
tFn
:
self
.
deFn
=
tFn
.
as_uri
()[
7
:]
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.lib'
,
'DE405'
)
as
tFn
:
self
.
deFn
=
tFn
.
as_uri
()[
7
:]
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.lib'
).
joinpath
(
'PST'
)
as
tFn
:
self
.
PSTFn
=
tFn
.
as_uri
()[
7
:]
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.lib'
,
'PST'
)
as
tFn
:
self
.
PSTFn
=
tFn
.
as_uri
()[
7
:]
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.lib'
).
joinpath
(
'R'
)
as
tFn
:
self
.
RFn
=
tFn
.
as_uri
()[
7
:]
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.lib'
,
'R'
)
as
tFn
:
self
.
RFn
=
tFn
.
as_uri
()[
7
:]
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.lib'
).
joinpath
(
'Zodiacal'
)
as
tFn
:
self
.
ZolFn
=
tFn
.
as_uri
()[
7
:]
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.lib'
,
'Zodiacal'
)
as
tFn
:
self
.
ZolFn
=
tFn
.
as_uri
()[
7
:]
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.lib'
).
joinpath
(
'BrightGaia_with_csst_mag'
)
as
tFn
:
self
.
brightStarTabFn
=
tFn
.
as_uri
()[
7
:]
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.lib'
,
'BrightGaia_with_csst_mag'
)
as
tFn
:
self
.
brightStarTabFn
=
tFn
.
as_uri
()[
7
:]
print
(
self
.
deFn
)
self
.
slcdll
.
Init
(
str
.
encode
(
self
.
deFn
),
str
.
encode
(
self
.
PSTFn
),
str
.
encode
(
self
.
RFn
),
str
.
encode
(
self
.
ZolFn
))
def
getFilterAndCCD_Q
(
self
,
filter
=
'i'
):
try
:
with
pkg_resources
.
files
(
'ObservationSim.Instrument.data.ccd'
).
joinpath
(
filterCCD
[
filter
]
+
'.txt'
)
as
ccd_fn
:
q_ccd_f
=
np
.
loadtxt
(
ccd_fn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Instrument.data.ccd'
,
filterCCD
[
filter
]
+
'.txt'
)
as
ccd_fn
:
q_ccd_f
=
np
.
loadtxt
(
ccd_fn
)
try
:
with
pkg_resources
.
files
(
'ObservationSim.Instrument.data.filters'
).
joinpath
(
filter
+
'.txt'
)
as
filter_fn
:
q_fil_f
=
np
.
loadtxt
(
filter_fn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Instrument.data.filters'
,
filter
+
'.txt'
)
as
filter_fn
:
q_fil_f
=
np
.
loadtxt
(
filter_fn
)
band_s
=
2000
band_e
=
11000
q_ccd_f
[:,
0
]
=
q_ccd_f
[:,
0
]
*
10
q_ccd
=
np
.
zeros
([
q_ccd_f
.
shape
[
0
]
+
2
,
q_ccd_f
.
shape
[
1
]])
q_ccd
[
1
:
-
1
,:]
=
q_ccd_f
q_ccd
[
0
]
=
[
band_s
,
0
]
q_ccd
[
-
1
]
=
[
band_e
,
0
]
q_fil
=
np
.
zeros
([
q_fil_f
.
shape
[
0
]
+
2
,
q_fil_f
.
shape
[
1
]])
q_fil
[
1
:
-
1
,:]
=
q_fil_f
q_fil
[
0
]
=
[
band_s
,
0
]
q_fil
[
-
1
]
=
[
band_e
,
0
]
q_fil_i
=
interpolate
.
interp1d
(
q_fil
[:,
0
],
q_fil
[:,
1
])
q_ccd_i
=
interpolate
.
interp1d
(
q_ccd
[:,
0
],
q_ccd
[:,
1
])
bands
=
np
.
arange
(
bandRange
[
filter
][
0
],
bandRange
[
filter
][
1
],
0.5
)
q_ccd_fil
=
q_fil_i
(
bands
)
*
q_ccd_i
(
bands
)
return
np
.
trapz
(
q_ccd_fil
,
bands
)
/
(
bandRange
[
filter
][
1
]
-
bandRange
[
filter
][
0
])
def
calculateEarthShineFilter
(
self
,
filter
=
'i'
,
pixel_size_phy
=
10
):
sat
=
(
ctypes
.
c_double
*
3
)()
sat
[:]
=
self
.
sat
ob
=
(
ctypes
.
c_double
*
3
)()
ob
[:]
=
self
.
pointing
py1
=
(
ctypes
.
c_double
*
3
)()
py2
=
(
ctypes
.
c_double
*
3
)()
self
.
slcdll
.
ComposeY
(
ob
,
py1
,
py2
)
earth_e1
=
(
ctypes
.
c_double
*
7
)()
self
.
slcdll
.
EarthShine
(
self
.
jtime
,
sat
,
ob
,
py1
,
earth_e1
)
earth_e2
=
(
ctypes
.
c_double
*
7
)()
self
.
slcdll
.
EarthShine
(
self
.
jtime
,
sat
,
ob
,
py2
,
earth_e2
)
band_earth_e1
=
earth_e1
[:][
filterIndex
[
filter
]]
band_earth_e2
=
earth_e2
[:][
filterIndex
[
filter
]]
q
=
self
.
getFilterAndCCD_Q
(
filter
=
filter
)
p_lambda
=
filterPivotWave
[
filter
]
c
=
cons
.
c
.
value
h
=
cons
.
h
.
value
pix_earth_e1
=
band_earth_e1
/
(
h
*
c
/
(
p_lambda
*
1e-10
))
*
pixel_size_phy
*
1e-6
*
pixel_size_phy
*
1e-6
*
q
pix_earth_e2
=
band_earth_e2
/
(
h
*
c
/
(
p_lambda
*
1e-10
))
*
pixel_size_phy
*
1e-6
*
pixel_size_phy
*
1e-6
*
q
if
pix_earth_e1
<
pix_earth_e2
:
return
pix_earth_e1
,
py1
[:]
else
:
return
pix_earth_e2
,
py2
[:]
"""
calculate zodiacal call c++ program, seems to have some problem
"""
def
calculateZodiacalFilter1
(
self
,
filter
=
'i'
,
pixel_size_phy
=
10
):
sat
=
(
ctypes
.
c_double
*
3
)()
sat
[:]
=
self
.
sat
ob
=
(
ctypes
.
c_double
*
3
)()
ob
[:]
=
self
.
pointing
zodical_e
=
(
ctypes
.
c_double
*
7
)()
self
.
slcdll
.
Zodiacal
(
self
.
jtime
,
ob
,
zodical_e
)
ob1
=
(
ctypes
.
c_double
*
2
)()
ob1
[:]
=
np
.
array
([
self
.
ecliptic
.
lon
.
value
,
self
.
ecliptic
.
lat
.
value
])
zodical_e1
=
(
ctypes
.
c_double
*
7
)()
self
.
slcdll
.
Zodiacal1
(
ob1
,
zodical_e1
)
band_zodical_e
=
zodical_e
[:][
filterIndex
[
filter
]]
q
=
self
.
getFilterAndCCD_Q
(
filter
=
filter
)
p_lambda
=
filterPivotWave
[
filter
]
c
=
cons
.
c
.
value
h
=
cons
.
h
.
value
pix_zodical_e
=
band_zodical_e
/
(
h
*
c
/
(
p_lambda
*
1e-10
))
*
pixel_size_phy
*
1e-6
*
pixel_size_phy
*
1e-6
*
q
return
pix_zodical_e
,
band_zodical_e
"""
calculate zodiacal use python
"""
def
calculateZodiacalFilter2
(
self
,
filter
=
'i'
,
aper
=
2
,
pixelsize
=
0.074
,
sun_pos
=
np
.
array
([
0
,
0
,
0
])):
spec
,
v_mag
=
self
.
calculateZodicalSpec
(
longitude
=
self
.
ecliptic
.
lon
.
value
,
latitude
=
self
.
ecliptic
.
lat
.
value
,
sun_pos
=
sun_pos
)
# spec = self.calculateZodicalSpec(longitude = lon, latitude = lat)
try
:
with
pkg_resources
.
files
(
'ObservationSim.Instrument.data.throughputs'
).
joinpath
(
filter
+
'_throughput.txt'
)
as
throughputFn
:
throughput
=
np
.
loadtxt
(
throughputFn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Instrument.data.throughputs'
,
filter
+
'_throughput.txt'
)
as
throughputFn
:
throughput
=
np
.
loadtxt
(
throughputFn
)
deltL
=
0.5
lamb
=
np
.
arange
(
bandRange
[
filter
][
0
],
bandRange
[
filter
][
1
],
deltL
)
speci
=
interpolate
.
interp1d
(
spec
[
'WAVELENGTH'
],
spec
[
'FLUX'
])
y
=
speci
(
lamb
)
# erg/s/cm2/A --> photo/s/m2/A
flux
=
y
*
lamb
/
(
cons
.
h
.
value
*
cons
.
c
.
value
)
*
1e-13
throughput_i
=
interpolate
.
interp1d
(
throughput
[:,
0
],
throughput
[:,
1
])
throughput_
=
throughput_i
(
lamb
)
sky_pix
=
np
.
trapz
(
flux
*
throughput_
,
lamb
)
*
math
.
pi
*
aper
*
aper
/
4
*
pixelsize
*
pixelsize
# sky_pix_e = np.trapz(y, lamb) * math.pi * aper*aper/4 * pixelsize * pixelsize/(10*10*1e-6*1e-6)*1e-7*1e4
return
sky_pix
,
v_mag
#, sky_pix_e
def
calculateStarLightFilter
(
self
,
filter
=
'i'
,
pointYaxis
=
np
.
array
([
1
,
1
,
1
]),
pixel_size_phy
=
10
):
sat
=
(
ctypes
.
c_double
*
3
)()
sat
[:]
=
self
.
sat
ob
=
(
ctypes
.
c_double
*
3
)()
ob
[:]
=
self
.
pointing
py
=
(
ctypes
.
c_double
*
3
)()
py
[:]
=
pointYaxis
q
=
self
.
getFilterAndCCD_Q
(
filter
=
filter
)
p_lambda
=
filterPivotWave
[
filter
]
c
=
cons
.
c
.
value
h
=
cons
.
h
.
value
star_e1
=
(
ctypes
.
c_double
*
7
)()
self
.
slcdll
.
PointSource
(
self
.
jtime
,
sat
,
ob
,
py
,
star_e1
,
str
.
encode
(
self
.
brightStarTabFn
))
band_star_e1
=
star_e1
[:][
filterIndex
[
filter
]]
pix_star_e1
=
band_star_e1
/
(
h
*
c
/
(
p_lambda
*
1e-10
))
*
pixel_size_phy
*
1e-6
*
pixel_size_phy
*
1e-6
*
q
return
pix_star_e1
def
calculateEarthshineGrating
(
self
,
grating
=
'GU'
,
pixel_size_phy
=
10
,
normFilter
=
'g'
,
aper
=
2
,
pixelsize
=
0.074
):
sat
=
(
ctypes
.
c_double
*
3
)()
sat
[:]
=
self
.
sat
ob
=
(
ctypes
.
c_double
*
3
)()
ob
[:]
=
self
.
pointing
py1
=
(
ctypes
.
c_double
*
3
)()
py2
=
(
ctypes
.
c_double
*
3
)()
self
.
slcdll
.
ComposeY
(
ob
,
py1
,
py2
)
earth_e1
=
(
ctypes
.
c_double
*
7
)()
self
.
slcdll
.
EarthShine
(
self
.
jtime
,
sat
,
ob
,
py1
,
earth_e1
)
earth_e2
=
(
ctypes
.
c_double
*
7
)()
self
.
slcdll
.
EarthShine
(
self
.
jtime
,
sat
,
ob
,
py2
,
earth_e2
)
# zodical_e = (ctypes.c_double*7)()
# self.slcdll.Zodiacal(self.jtime,ob,zodical_e)
band_earth_e1
=
earth_e1
[:][
filterIndex
[
normFilter
]]
band_earth_e2
=
earth_e2
[:][
filterIndex
[
normFilter
]]
band_earth_e
=
band_earth_e2
py
=
py2
[:]
if
band_earth_e1
<
band_earth_e2
:
band_earth_e
=
band_earth_e1
py
=
py1
[:]
# band_earth_e = np.min([band_earth_e1, band_earth_e2])
# band_earth_e1 = 0
# band_earth_e2 = 0
# band_zodical_e = zodical_e[:][filterIndex[normFilter]]
q
=
self
.
getFilterAndCCD_Q
(
filter
=
normFilter
)
p_lambda
=
filterPivotWave
[
normFilter
]
c
=
cons
.
c
.
value
h
=
cons
.
h
.
value
pix_earth_e
=
band_earth_e
/
(
h
*
c
/
(
p_lambda
*
1e-10
))
*
pixel_size_phy
*
1e-6
*
pixel_size_phy
*
1e-6
*
q
# pix_earth_e2 = band_earth_e2/(h*c/(p_lambda*1e-10))*pixel_size_phy*1e-6*pixel_size_phy*1e-6*q
# pix_zodical_e = band_zodical_e/(h*c/(p_lambda*1e-10))*pixel_size_phy*1e-6*pixel_size_phy*1e-6*q
# pix_earth_e = np.min([pix_earth_e1, pix_earth_e2])
earthshine_v
,
earthshine_spec
=
self
.
calculatEarthshineByHSTSpec
(
filter
=
normFilter
,
aper
=
aper
,
pixelsize
=
pixelsize
)
lamb_earth
=
earthshine_spec
[
'WAVELENGTH'
]
flux_earth
=
earthshine_spec
[
'FLUX'
]
*
pix_earth_e
/
earthshine_v
# print(pix_earth_e,earthshine_v)
earth_v_grating
=
0
for
s_order
in
SpecOrder
:
try
:
with
pkg_resources
.
files
(
'ObservationSim.Instrument.data.sls_conf'
).
joinpath
(
grating
+
'.Throughput.'
+
s_order
+
'st.fits'
)
as
thpFn
:
thp_
=
Table
.
read
(
thpFn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Instrument.data.sls_conf'
,
grating
+
'.Throughput.'
+
s_order
+
'st.fits'
)
as
thpFn
:
thp_
=
Table
.
read
(
thpFn
)
thpFn_i
=
interpolate
.
interp1d
(
thp_
[
'WAVELENGTH'
],
thp_
[
'SENSITIVITY'
])
thp
=
thpFn_i
(
lamb_earth
)
beamsEarth
=
np
.
trapz
(
flux_earth
*
thp
,
lamb_earth
)
*
math
.
pi
*
aper
*
aper
/
4
*
pixelsize
*
pixelsize
earth_v_grating
=
earth_v_grating
+
beamsEarth
# print(beamsEarth)
# print(earthshine_v, pix_earth_e, earth_v_grating)
return
earth_v_grating
,
py
def
calculateStarLightGrating
(
self
,
grating
=
'GU'
,
pointYaxis
=
np
.
array
([
1
,
1
,
1
]),
pixel_size_phy
=
10
):
sat
=
(
ctypes
.
c_double
*
3
)()
sat
[:]
=
self
.
sat
ob
=
(
ctypes
.
c_double
*
3
)()
ob
[:]
=
self
.
pointing
py
=
(
ctypes
.
c_double
*
3
)()
py
[:]
=
pointYaxis
# q=self.getFilterAndCCD_Q(filter=filter)
# p_lambda = filterPivotWave[filter]
c
=
cons
.
c
.
value
h
=
cons
.
h
.
value
star_e1
=
(
ctypes
.
c_double
*
7
)()
self
.
slcdll
.
PointSource
(
self
.
jtime
,
sat
,
ob
,
py
,
star_e1
,
str
.
encode
(
self
.
brightStarTabFn
))
filterPivotWaveList
=
np
.
zeros
(
7
)
bandRangeList
=
np
.
zeros
(
7
)
filterMirrorEffList
=
np
.
zeros
(
7
)
filterNameList
=
list
(
filterPivotWave
.
keys
())
for
i
in
np
.
arange
(
7
):
filterPivotWaveList
[
i
]
=
filterPivotWave
[
filterNameList
[
i
]]
filterMirrorEffList
[
i
]
=
filterMirrorEff
[
filterNameList
[
i
]]
brange
=
bandRange
[
filterNameList
[
i
]]
bandRangeList
[
i
]
=
brange
[
1
]
-
brange
[
0
]
filterFlux_lamb
=
star_e1
[:]
/
bandRangeList
/
filterMirrorEffList
/
(
h
*
c
/
(
filterPivotWaveList
*
1e-10
))
filterFlux_lambi
=
interpolate
.
interp1d
(
filterPivotWaveList
,
filterFlux_lamb
,
fill_value
=
"extrapolate"
)
lamb_g
=
np
.
arange
(
bandRange
[
grating
][
0
],
bandRange
[
grating
][
1
],
1
)
flux_g
=
filterFlux_lambi
(
lamb_g
)
# flux_total_g = np.trapz(flux_g,lamb_g)
starLight_grating
=
0
for
s_order
in
SpecOrder
:
try
:
with
pkg_resources
.
files
(
'ObservationSim.Instrument.data.sls_conf'
).
joinpath
(
grating
+
'.Throughput.'
+
s_order
+
'st.fits'
)
as
thpFn
:
thp_
=
Table
.
read
(
thpFn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Instrument.data.sls_conf'
,
grating
+
'.Throughput.'
+
s_order
+
'st.fits'
)
as
thpFn
:
thp_
=
Table
.
read
(
thpFn
)
thpFn_i
=
interpolate
.
interp1d
(
thp_
[
'WAVELENGTH'
],
thp_
[
'SENSITIVITY'
])
thp
=
thpFn_i
(
lamb_g
)
beamsZol
=
np
.
trapz
(
flux_g
*
thp
,
lamb_g
)
*
pixel_size_phy
*
1e-6
*
pixel_size_phy
*
1e-6
starLight_grating
=
starLight_grating
+
beamsZol
# print(beamsZol)
# band_star_e1 = star_e1[:][filterIndex[filter]]
# pix_star_e1 = band_star_e1/(h*c/(p_lambda*1e-10))*pixel_size_phy*1e-6*pixel_size_phy*1e-6*q
return
starLight_grating
def
calculatEarthshineByHSTSpec
(
self
,
filter
=
'g'
,
aper
=
2
,
pixelsize
=
0.074
,
s
=
2000
,
e
=
11000
):
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.data.sky'
).
joinpath
(
'earthShine.dat'
)
as
specFn
:
spec
=
np
.
loadtxt
(
specFn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.data.sky'
,
'earthShine.dat'
)
as
specFn
:
spec
=
np
.
loadtxt
(
specFn
)
try
:
with
pkg_resources
.
files
(
'ObservationSim.Instrument.data.throughputs'
).
joinpath
(
filter
+
'_throughput.txt'
)
as
throughputFn
:
throughput
=
np
.
loadtxt
(
throughputFn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Instrument.data.throughputs'
,
filter
+
'_throughput.txt'
)
as
throughputFn
:
throughput
=
np
.
loadtxt
(
throughputFn
)
deltL
=
0.5
lamb
=
np
.
arange
(
bandRange
[
filter
][
0
],
bandRange
[
filter
][
1
],
deltL
)
speci
=
interpolate
.
interp1d
(
spec
[:,
0
],
spec
[:,
1
])
y
=
speci
(
lamb
)
# erg/s/cm2/A --> photo/s/m2/A
flux
=
y
*
lamb
/
(
cons
.
h
.
value
*
cons
.
c
.
value
)
*
1e-13
throughput_i
=
interpolate
.
interp1d
(
throughput
[:,
0
],
throughput
[:,
1
])
throughput_
=
throughput_i
(
lamb
)
sky_pix
=
np
.
trapz
(
flux
*
throughput_
,
lamb
)
*
math
.
pi
*
aper
*
aper
/
4
*
pixelsize
*
pixelsize
lamb
=
np
.
arange
(
s
,
e
,
deltL
)
speci
=
interpolate
.
interp1d
(
spec
[:,
0
],
spec
[:,
1
])
y
=
speci
(
lamb
)
# erg/s/cm2/A --> photo/s/m2/A
flux
=
y
*
lamb
/
(
cons
.
h
.
value
*
cons
.
c
.
value
)
*
1e-13
return
sky_pix
,
Table
(
np
.
array
([
lamb
,
flux
]).
T
,
names
=
(
'WAVELENGTH'
,
'FLUX'
))
def
calculateZodicalSpec
(
self
,
longitude
=
50
,
latitude
=
60
,
sun_pos
=
np
.
array
([
0
,
0
,
0
])):
from
scipy.interpolate
import
interp2d
from
scipy.interpolate
import
griddata
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.data'
).
joinpath
(
'Zodiacal_map1.dat'
)
as
z_map_fn
:
ZL
=
np
.
loadtxt
(
z_map_fn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.data'
,
'Zodiacal_map1.dat'
)
as
z_map_fn
:
ZL
=
np
.
loadtxt
(
z_map_fn
)
# zl_sh = ZL.shape
# x = np.arange(0,zl_sh[1],1)
# y = np.arange(0,zl_sh[0],1)
x
=
ZL
[
0
,
1
:]
y
=
ZL
[
1
:,
0
]
X
,
Y
=
np
.
meshgrid
(
x
,
y
)
# f_sur = interp2d(X,Y,ZL,kind='linear')
sun_radec
=
Cartesian2Equatorial
(
sun_pos
)
sun_eclip
=
coord
.
SkyCoord
(
sun_radec
[
0
]
*
u
.
degree
,
sun_radec
[
1
]
*
u
.
degree
,
frame
=
'icrs'
)
sun_equtor
=
sun_eclip
.
transform_to
(
'barycentrictrueecliptic'
)
longitude
=
longitude
-
(
sun_equtor
.
lon
*
u
.
degree
).
value
longitude
=
np
.
abs
(
longitude
)
# print((sun_equtor.lon*u.degree).value)
if
(
longitude
>
180
):
longitude
=
360
-
longitude
latitude
=
np
.
abs
(
latitude
)
lo
=
longitude
la
=
latitude
zl
=
griddata
((
X
.
flatten
(),
Y
.
flatten
()),
ZL
[
1
:,
1
:].
flatten
(),(
la
,
lo
),
method
=
'cubic'
).
min
()
zl
=
zl
*
(
math
.
pi
*
math
.
pi
)
/
(
180
*
180
)
/
(
3600
*
3600
)
*
1e-4
*
1e7
*
1e-8
*
1e-4
# print(zl , '\n')
try
:
with
pkg_resources
.
files
(
'ObservationSim.Straylight.data.sky'
).
joinpath
(
'zodiacal.dat'
)
as
zodical_fn
:
spec
=
np
.
loadtxt
(
zodical_fn
)
except
AttributeError
:
with
pkg_resources
.
path
(
'ObservationSim.Straylight.data.sky'
,
'zodiacal.dat'
)
as
zodical_fn
:
spec
=
np
.
loadtxt
(
zodical_fn
)
speci
=
interpolate
.
interp1d
(
spec
[:,
0
],
spec
[:,
1
])
flux5000
=
speci
(
5000
)
f_ration
=
zl
/
flux5000
v_mag
=
np
.
log10
(
f_ration
)
*
(
-
2.5
)
+
22.1
# print("factor:", v_mag, lo, la)
return
Table
(
np
.
array
([
spec
[:,
0
],
spec
[:,
1
]
*
f_ration
]).
T
,
names
=
(
'WAVELENGTH'
,
'FLUX'
)),
v_mag
def
calculateStrayLightFilter
(
self
,
filter
=
'i'
,
pixel_size_phy
=
10
,
pixel_scale
=
0.074
):
e1
,
py
=
self
.
calculateEarthShineFilter
(
filter
=
filter
,
pixel_size_phy
=
pixel_size_phy
)
e2
,
_
=
self
.
calculateZodiacalFilter2
(
filter
=
filter
,
sun_pos
=
self
.
sun_pos
,
pixelsize
=
pixel_scale
)
e3
=
self
.
calculateStarLightFilter
(
filter
=
filter
,
pointYaxis
=
py
,
pixel_size_phy
=
pixel_size_phy
)
return
e1
+
e2
+
e3
def
calculateStrayLightGrating
(
self
,
grating
=
'GI'
,
pixel_size_phy
=
10
,
normFilter_es
=
'g'
):
e1
,
py
=
self
.
calculateEarthshineGrating
(
grating
=
grating
,
pixel_size_phy
=
pixel_size_phy
,
normFilter
=
normFilter_es
)
e2
=
self
.
calculateStarLightGrating
(
grating
=
grating
,
pointYaxis
=
py
)
spec
,
_
=
self
.
calculateZodicalSpec
(
longitude
=
self
.
ecliptic
.
lon
.
value
,
latitude
=
self
.
ecliptic
.
lat
.
value
,
sun_pos
=
self
.
sun_pos
)
return
e1
+
e2
,
spec
def
testZodiacal
(
lon
=
285.04312526255366
,
lat
=
30.
):
c_eclip
=
coord
.
SkyCoord
(
lon
*
u
.
degree
,
lat
*
u
.
degree
,
frame
=
'barycentrictrueecliptic'
)
c_equtor
=
c_eclip
.
transform_to
(
'icrs'
)
sl
=
Straylight
(
jtime
=
2459767.00354975
,
sat
=
np
.
array
([]),
radec
=
np
.
array
([(
c_equtor
.
ra
*
u
.
degree
).
value
,
(
c_equtor
.
dec
*
u
.
degree
).
value
]))
e_zol
,
v_mag
=
sl
.
calculateZodiacalFilter2
(
filter
=
'i'
,
sun_pos
=
np
.
array
([
-
3.70939436e+07
,
1.35334903e+08
,
5.86673104e+07
]))
print
(
e_zol
)
# ju=2.4608437604166665e+06
# sat = (ctypes.c_double*3)()
# sat[:] = np.array([5873.752, -1642.066, 2896.744])
# ob = (ctypes.c_double*3)()
# ob[:]=np.array([0.445256,0.76061,-0.47246])
# sl = StrayLight(jtime = ju, sat = np.array([5873.752, -1642.066, 2896.744]), pointing = np.array([-0.445256,-0.76061,0.47246]))
# fn = '/Users/zhangxin/Work/SurveyPlan/point/csst_survey_sim_20211028/E17.5_b17.5_beta_11.6_opt_transtime_1_CMG_1_dp_2_0.25_da_10_Texp_1.5_DEC60_500_0.1_800_1000_+5deg.dat'
#
# surveylist = np.loadtxt(fn)
# sky_pix = np.zeros([surveylist.shape[0],7])
#
#
# i = 693438
# c_eclip = coord.SkyCoord(surveylist[:,2]*u.degree, surveylist[:,1]*u.degree,frame='barycentrictrueecliptic')
# c_equtor = c_eclip.transform_to('icrs')
#
#
# # pointing = transRaDec2D((c_equtor[i].ra*u.degree).value, (c_equtor[i].dec*u.degree).value)
# # # print(ju, pointing, surveylist[i,3:9])
# # ju = surveylist[i,0]
# # sl = StrayLight(jtime = ju, sat = surveylist[i,3:6], pointing = pointing)
# # sl.caculateStrayLightGrating(grating = 'GI', pixel_size_phy = 10, normFilter = 'g')
#
# for i in np.arange(surveylist.shape[0]):
# print(i)
# if i > 300:
# break
# # if i != 300:
# # continue
# # if i != 693438:
# # continue
# ju = surveylist[i,0]
# pointing = transRaDec2D((c_equtor[i].ra*u.degree).value, (c_equtor[i].dec*u.degree).value)
# # print(ju, pointing, surveylist[i,3:9])
# sl = StrayLight(jtime = ju, sat = surveylist[i,3:6], radec = np.array([(c_equtor[i].ra*u.degree).value, (c_equtor[i].dec*u.degree).value]))
# # strayl_i,s_zoldical ,s_earth, s_earth1 = sl.caculateStrayLightFilter(filter = 'i')
# # print(i,strayl_i,s_zoldical,s_earth, s_earth1)
# p_cart= transRaDec2D((c_equtor[i].ra*u.degree).value, (c_equtor[i].dec*u.degree).value)
# sky_pix[i,6] = getAngle132(x1 = surveylist[i,6], y1 = surveylist[i,7], z1 = surveylist[i,8], x2 = p_cart[0], y2 = p_cart[1], z2 = p_cart[2], x3 = 0, y3 = 0, z3 = 0)
#
# earthZenithAngle,isInSunSide = calculateAnglePwithEarth(sat = surveylist[i,3:6], pointing = pointing, sun = surveylist[i,6:9])
# sky_pix[i,4] = earthZenithAngle
# sky_pix[i,5] = isInSunSide
#
# e1_,py = sl.caculateEarthShineFilter(filter = 'i')
# # e2, e2_ = sl.calculateZodiacalFilter1(filter = 'i')
# e3, v_mag = sl.calculateZodiacalFilter2(filter = 'i', sun_pos=surveylist[i,6:9])
# # e4 = sl.caculateStarLightFilter(filter = 'i',pointYaxis = py)
# # e4 = 0
#
# e1,py = sl.caculateEarthshineGrating(grating = 'GI', pixel_size_phy = 10, normFilter = 'g')
#
# # e2 = sl.caculateStarLightGrating(grating = 'GV', pointYaxis = py)
# e2 = sl.caculateStarLightGrating(grating = 'GI', pointYaxis = py)
# e4 = sl.caculateStarLightFilter(filter = 'i',pointYaxis = py)
#
# e5=sl.caculateStrayLightFilter(filter = 'i', pixel_size_phy = 10, pixel_scale = 0.074, sun_pos = surveylist[i,6:9])
# e6,_=sl.caculateStrayLightGrating(grating = 'GI', normFilter_es = 'g', sun_pos = surveylist[i,6:9])
#
# sky_pix[i,0] = e1
# sky_pix[i,1] = e2
# sky_pix[i,2] = e3
# sky_pix[i,3] = e4
# print(e1+e2,e1_+e3+e4,e5,e6)
#
# # print(e1,e2,e3,e4)
ObservationSim/Straylight/__init__.py
deleted
100755 → 0
View file @
4afd1181
from
.Straylight
import
Straylight
from
.SkybackgroundMap
import
*
Prev
1
…
5
6
7
8
9
10
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