Commit 1908e835 authored by Xin Zhang's avatar Xin Zhang
Browse files

sls sim double direct dispersion

parent 0d59783b
......@@ -257,7 +257,7 @@ class Galaxy(MockObject):
return True, pos_shear
def drawObj_slitless(self, tel, pos_img, psf_model, bandpass_list, filt, chip, nphotons_tot=None, g1=0, g2=0,
exptime=150., normFilter=None):
exptime=150., normFilter=None, grating_split_pos=3685):
norm_thr_rang_ids = normFilter['SENSITIVITY'] > 0.001
sedNormFactor = getNormFactorForSpecWithABMAG(ABMag=self.param['mag_use_normal'], spectrum=self.sed,
......@@ -280,6 +280,7 @@ class Galaxy(MockObject):
gsp = galsim.GSParams(folding_threshold=folding_threshold)
# nphotons_sum = 0
xOrderSigPlus = {'A':1.3909419820029296,'B':1.4760376591236062,'C':4.035447379743442,'D':5.5684364343742825,'E':16.260021029735388}
grating_split_pos_chip = chip.bound.xmin + grating_split_pos
for i in range(len(bandpass_list)):
bandpass = bandpass_list[i]
......@@ -302,47 +303,65 @@ class Galaxy(MockObject):
origin_star = [self.y_nominal - (starImg.center.y - starImg.ymin),
self.x_nominal - (starImg.center.x - starImg.xmin)]
# print(self.y_nominal, starImg.center.y, starImg.ymin)
gal_origin = [origin_star[0], origin_star[1]]
gal_end = [origin_star[0] + starImg.array.shape[0] - 1, origin_star[1] + starImg.array.shape[1] - 1]
if gal_origin[1] < grating_split_pos_chip < gal_end[1]:
subSlitPos = int(grating_split_pos_chip - gal_origin[1] + 1)
## part img disperse
sdp = SpecDisperser(orig_img=starImg, xcenter=self.x_nominal-chip.bound.xmin,
ycenter=self.y_nominal-chip.bound.ymin, origin=origin_star,
subImg_p1 = starImg.array[:, 0:subSlitPos]
star_p1 = galsim.Image(subImg_p1)
origin_p1 = origin_star
xcenter_p1 = min(self.x_nominal,grating_split_pos_chip-1) - chip.bound.xmin
ycenter_p1 = self.y_nominal-chip.bound.ymin
sdp_p1 = SpecDisperser(orig_img=star_p1, xcenter=xcenter_p1,
ycenter=ycenter_p1, origin=origin_p1,
tar_spec=normalSED,
band_start=bandpass.blue_limit * 10, band_end=bandpass.red_limit * 10,
conf=chip.sls_conf[1],
conf=chip.sls_conf[0],
isAlongY=0)
spec_orders = sdp.compute_spec_orders()
for k, v in spec_orders.items():
img_s = v[0]
img_s,orig_off = convolveGaussXorders(img_s,xOrderSigPlus[k])
origin_order_x = v[1]-orig_off
origin_order_y = v[2]-orig_off
specImg = galsim.ImageF(img_s)
photons = galsim.PhotonArray.makeFromImage(specImg)
photons.x += origin_order_x
photons.y += origin_order_y
xlen_imf = int(specImg.xmax - specImg.xmin + 1)
ylen_imf = int(specImg.ymax - specImg.ymin + 1)
stamp = galsim.ImageF(xlen_imf, ylen_imf)
stamp.wcs = self.localWCS
stamp.setOrigin(origin_order_x, origin_order_y)
bounds = stamp.bounds & chip.img.bounds
if bounds.area() == 0:
continue
stamp[bounds] = chip.img[bounds]
self.addSLStoChipImage(sdp=sdp_p1, chip=chip, xOrderSigPlus = xOrderSigPlus)
if not big_galaxy:
chip.sensor.accumulate(photons, stamp)
else:
sensor = galsim.Sensor()
sensor.accumulate(photons, stamp)
subImg_p2 = starImg.array[:, subSlitPos+1:starImg.array.shape[1]]
star_p2 = galsim.Image(subImg_p2)
origin_p2 = [origin_star[0], grating_split_pos_chip]
xcenter_p2 = max(self.x_nominal, grating_split_pos_chip - 1) - chip.bound.xmin
ycenter_p2 = self.y_nominal - chip.bound.ymin
# chip.sensor.accumulate(photons, stamp)
chip.img[bounds] = stamp[bounds]
del stamp
sdp_p2 = SpecDisperser(orig_img=star_p2, xcenter=xcenter_p2,
ycenter=ycenter_p2, origin=origin_p2,
tar_spec=normalSED,
band_start=bandpass.blue_limit * 10, band_end=bandpass.red_limit * 10,
conf=chip.sls_conf[1],
isAlongY=0)
self.addSLStoChipImage(sdp=sdp_p2, chip=chip, xOrderSigPlus = xOrderSigPlus)
del sdp_p1
del sdp_p2
elif grating_split_pos_chip<=gal_origin[1]:
sdp = SpecDisperser(orig_img=starImg, xcenter=self.x_nominal - chip.bound.xmin,
ycenter=self.y_nominal - chip.bound.ymin, origin=origin_star,
tar_spec=normalSED,
band_start=bandpass.blue_limit * 10, band_end=bandpass.red_limit * 10,
conf=chip.sls_conf[1],
isAlongY=0)
self.addSLStoChipImage(sdp=sdp, chip=chip, xOrderSigPlus = xOrderSigPlus)
del sdp
del spec_orders
elif grating_split_pos_chip>=gal_end[1]:
sdp = SpecDisperser(orig_img=starImg, xcenter=self.x_nominal - chip.bound.xmin,
ycenter=self.y_nominal - chip.bound.ymin, origin=origin_star,
tar_spec=normalSED,
band_start=bandpass.blue_limit * 10, band_end=bandpass.red_limit * 10,
conf=chip.sls_conf[0],
isAlongY=0)
self.addSLStoChipImage(sdp=sdp, chip=chip, xOrderSigPlus = xOrderSigPlus)
del sdp
# print(self.y_nominal, starImg.center.y, starImg.ymin)
del psf
return True, pos_shear
......
......@@ -168,8 +168,36 @@ class MockObject(object):
del stamp
return True, pos_shear
def addSLStoChipImage(self, sdp = None, chip = None, xOrderSigPlus = None):
spec_orders = sdp.compute_spec_orders()
for k, v in spec_orders.items():
img_s = v[0]
img_s, orig_off = convolveGaussXorders(img_s, xOrderSigPlus[k])
origin_order_x = v[1] - orig_off
origin_order_y = v[2] - orig_off
specImg = galsim.ImageF(img_s)
photons = galsim.PhotonArray.makeFromImage(specImg)
photons.x += origin_order_x
photons.y += origin_order_y
xlen_imf = int(specImg.xmax - specImg.xmin + 1)
ylen_imf = int(specImg.ymax - specImg.ymin + 1)
stamp = galsim.ImageF(xlen_imf, ylen_imf)
stamp.wcs = self.localWCS
stamp.setOrigin(origin_order_x, origin_order_y)
bounds = stamp.bounds & chip.img.bounds
if bounds.area() == 0:
continue
stamp[bounds] = chip.img[bounds]
chip.sensor.accumulate(photons, stamp)
chip.img[bounds] = stamp[bounds]
del stamp
del spec_orders
def drawObj_slitless(self, tel, pos_img, psf_model, bandpass_list, filt, chip, nphotons_tot=None, g1=0, g2=0,
exptime=150., normFilter=None):
exptime=150., normFilter=None, grating_split_pos=3685):
norm_thr_rang_ids = normFilter['SENSITIVITY'] > 0.001
sedNormFactor = getNormFactorForSpecWithABMAG(ABMag=self.param['mag_use_normal'], spectrum=self.sed,
......@@ -192,6 +220,7 @@ class MockObject(object):
xOrderSigPlus = {'A':1.3909419820029296,'B':1.4760376591236062,'C':4.035447379743442,'D':5.5684364343742825,'E':16.260021029735388}
grating_split_pos_chip = chip.bound.xmin + grating_split_pos
for i in range(len(bandpass_list)):
bandpass = bandpass_list[i]
psf, pos_shear = psf_model.get_PSF(chip=chip, pos_img=pos_img, bandpass=bandpass, folding_threshold=folding_threshold)
......@@ -203,39 +232,63 @@ class MockObject(object):
origin_star = [self.y_nominal - (starImg.center.y - starImg.ymin),
self.x_nominal - (starImg.center.x - starImg.xmin)]
sdp = SpecDisperser(orig_img=starImg, xcenter=self.x_nominal-chip.bound.xmin,
ycenter=self.y_nominal-chip.bound.ymin, origin=origin_star,
gal_origin = [origin_star[0], origin_star[1]]
gal_end = [origin_star[0] + starImg.array.shape[0] - 1, origin_star[1] + starImg.array.shape[1] - 1]
if gal_origin[1] < grating_split_pos_chip < gal_end[1]:
subSlitPos = int(grating_split_pos_chip - gal_origin[1] + 1)
## part img disperse
subImg_p1 = starImg.array[:, 0:subSlitPos]
star_p1 = galsim.Image(subImg_p1)
origin_p1 = origin_star
xcenter_p1 = min(self.x_nominal,grating_split_pos_chip-1) - chip.bound.xmin
ycenter_p1 = self.y_nominal-chip.bound.ymin
sdp_p1 = SpecDisperser(orig_img=star_p1, xcenter=xcenter_p1,
ycenter=ycenter_p1, origin=origin_p1,
tar_spec=normalSED,
band_start=bandpass.blue_limit * 10, band_end=bandpass.red_limit * 10,
conf=chip.sls_conf[1],
conf=chip.sls_conf[0],
isAlongY=0)
spec_orders = sdp.compute_spec_orders()
for k, v in spec_orders.items():
img_s = v[0]
img_s,orig_off = convolveGaussXorders(img_s,xOrderSigPlus[k])
origin_order_x = v[1]-orig_off
origin_order_y = v[2]-orig_off
specImg = galsim.ImageF(img_s)
photons = galsim.PhotonArray.makeFromImage(specImg)
photons.x += origin_order_x
photons.y += origin_order_y
self.addSLStoChipImage(sdp=sdp_p1, chip=chip, xOrderSigPlus = xOrderSigPlus)
xlen_imf = int(specImg.xmax - specImg.xmin + 1)
ylen_imf = int(specImg.ymax - specImg.ymin + 1)
stamp = galsim.ImageF(xlen_imf, ylen_imf)
stamp.wcs = self.localWCS
stamp.setOrigin(origin_order_x, origin_order_y)
subImg_p2 = starImg.array[:, subSlitPos+1:starImg.array.shape[1]]
star_p2 = galsim.Image(subImg_p2)
origin_p2 = [origin_star[0], grating_split_pos_chip]
xcenter_p2 = max(self.x_nominal, grating_split_pos_chip - 1) - chip.bound.xmin
ycenter_p2 = self.y_nominal - chip.bound.ymin
bounds = stamp.bounds & chip.img.bounds
if bounds.area() == 0:
continue
stamp[bounds] = chip.img[bounds]
chip.sensor.accumulate(photons, stamp)
chip.img[bounds] = stamp[bounds]
del stamp
sdp_p2 = SpecDisperser(orig_img=star_p2, xcenter=xcenter_p2,
ycenter=ycenter_p2, origin=origin_p2,
tar_spec=normalSED,
band_start=bandpass.blue_limit * 10, band_end=bandpass.red_limit * 10,
conf=chip.sls_conf[1],
isAlongY=0)
self.addSLStoChipImage(sdp=sdp_p2, chip=chip,xOrderSigPlus = xOrderSigPlus)
del sdp_p1
del sdp_p2
elif grating_split_pos_chip<=gal_origin[1]:
sdp = SpecDisperser(orig_img=starImg, xcenter=self.x_nominal - chip.bound.xmin,
ycenter=self.y_nominal - chip.bound.ymin, origin=origin_star,
tar_spec=normalSED,
band_start=bandpass.blue_limit * 10, band_end=bandpass.red_limit * 10,
conf=chip.sls_conf[1],
isAlongY=0)
self.addSLStoChipImage(sdp=sdp, chip=chip, xOrderSigPlus = xOrderSigPlus)
del sdp
elif grating_split_pos_chip>=gal_end[1]:
sdp = SpecDisperser(orig_img=starImg, xcenter=self.x_nominal - chip.bound.xmin,
ycenter=self.y_nominal - chip.bound.ymin, origin=origin_star,
tar_spec=normalSED,
band_start=bandpass.blue_limit * 10, band_end=bandpass.red_limit * 10,
conf=chip.sls_conf[0],
isAlongY=0)
self.addSLStoChipImage(sdp=sdp, chip=chip, xOrderSigPlus = xOrderSigPlus)
del sdp
del spec_orders
del psf
return True, pos_shear
......
......@@ -15,7 +15,7 @@ import os
###calculate sky map by sky SED
def calculateSkyMap_split_g(xLen=9232, yLen=9126, blueLimit=4200, redLimit=6500, skyfn='param/skybackground/sky_emiss_hubble_50_50_A.dat', conf=[''], pixelSize=0.074, isAlongY=0,
split_pos=100000):
split_pos=3685):
skyMap = np.ones([yLen, xLen], dtype='float32')
# for i in range(len(conf)):
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment