MockObject.py 20.7 KB
Newer Older
Fang Yuedong's avatar
Fang Yuedong committed
1
2
3
import galsim
import numpy as np
import astropy.constants as cons
Fang Yuedong's avatar
Fang Yuedong committed
4
from astropy import wcs
Fang Yuedong's avatar
Fang Yuedong committed
5
from astropy.table import Table
6

Zhang Xin's avatar
Zhang Xin committed
7
from ObservationSim.MockObject._util import magToFlux, VC_A, convolveGaussXorders, convolveImg
8
9
from ObservationSim.MockObject._util import integrate_sed_bandpass, getNormFactorForSpecWithABMAG, getObservedSED, \
    getABMAG
10
from ObservationSim.MockObject.SpecDisperser import SpecDisperser
Fang Yuedong's avatar
Fang Yuedong committed
11

12

Fang Yuedong's avatar
Fang Yuedong committed
13
class MockObject(object):
14
    def __init__(self, param, logger=None):
Fang Yuedong's avatar
Fang Yuedong committed
15
        self.param = param
Fang Yuedong's avatar
Fang Yuedong committed
16
17
18
        for key in self.param:
            setattr(self, key, self.param[key])
        
Fang Yuedong's avatar
Fang Yuedong committed
19
20
21
22
23
24
        if self.param["star"] == 0:
            self.type = "galaxy"
        elif self.param["star"] == 1:
            self.type = "star"
        elif self.param["star"] == 2:
            self.type = "quasar"
Fang Yuedong's avatar
Fang Yuedong committed
25
26
27
28
        ###mock_stamp_START
        elif self.param["star"] == 3:
            self.type = "stamp"
        ###mock_stamp_END
Zhang Xin's avatar
Zhang Xin committed
29
30
31
32
33
        ###for calibration
        elif self.param["star"] == 4:
            self.type = "calib"
        ###END

34
        self.sed = None
35
        self.fd_shear = None
36
        # Place holder for outputs
37
        self.additional_output_str = ""
38
39
        self.logger = logger

Fang Yuedong's avatar
Fang Yuedong committed
40
41
42
    def getMagFilter(self, filt):
        if filt.filter_type in ["GI", "GV", "GU"]:
            return self.param["mag_use_normal"]
Fang Yuedong's avatar
Fang Yuedong committed
43
        return self.param["mag_%s" % filt.filter_type.lower()]
44

45
    def getFluxFilter(self, filt):
Fang Yuedong's avatar
Fang Yuedong committed
46
        return self.param["flux_%s" % filt.filter_type.lower()]
Fang Yuedong's avatar
Fang Yuedong committed
47
48

    def getNumPhotons(self, flux, tel, exptime=150.):
49
        pupil_area = tel.pupil_area * (100.) ** 2  # m^2 to cm^2
Fang Yuedong's avatar
Fang Yuedong committed
50
51
52
        return flux * pupil_area * exptime

    def getElectronFluxFilt(self, filt, tel, exptime=150.):
53
54
55
56
57
58
        # photonEnergy = filt.getPhotonE()
        # flux = magToFlux(self.getMagFilter(filt))
        # factor = 1.0e4 * flux/photonEnergy * VC_A * (1.0/filt.blue_limit - 1.0/filt.red_limit)
        # return factor * filt.efficiency * tel.pupil_area * exptime
        flux = self.getFluxFilter(filt)
        return flux * tel.pupil_area * exptime
Fang Yuedong's avatar
Fang Yuedong committed
59
60
61
62

    def getPosWorld(self):
        ra = self.param["ra"]
        dec = self.param["dec"]
63
        return galsim.CelestialCoord(ra=ra * galsim.degrees, dec=dec * galsim.degrees)
Fang Yuedong's avatar
Fang Yuedong committed
64

65
    def getPosImg_Offset_WCS(self, img, fdmodel=None, chip=None, verbose=True, chip_wcs=None, img_header=None):
Fang Yuedong's avatar
Fang Yuedong committed
66
67
        self.posImg = img.wcs.toImage(self.getPosWorld())
        self.localWCS = img.wcs.local(self.posImg)
68
        # Apply field distortion model
Fang Yuedong's avatar
Fang Yuedong committed
69
70
71
72
        if (fdmodel is not None) and (chip is not None):
            if verbose:
                print("\n")
                print("Before field distortion:\n")
73
                print("x = %.2f, y = %.2f\n" % (self.posImg.x, self.posImg.y), flush=True)
Fang Yuedong's avatar
Fang Yuedong committed
74
            self.posImg, self.fd_shear = fdmodel.get_distorted(chip=chip, pos_img=self.posImg)
Fang Yuedong's avatar
Fang Yuedong committed
75
76
            if verbose:
                print("After field distortion:\n")
77
                print("x = %.2f, y = %.2f\n" % (self.posImg.x, self.posImg.y), flush=True)
78
        
Fang Yuedong's avatar
Fang Yuedong committed
79
80
81
82
83
84
        x, y = self.posImg.x + 0.5, self.posImg.y + 0.5
        self.x_nominal = int(np.floor(x + 0.5))
        self.y_nominal = int(np.floor(y + 0.5))
        dx = x - self.x_nominal
        dy = y - self.y_nominal
        self.offset = galsim.PositionD(dx, dy)
85
        
86
        # Deal with chip rotation
87
        if chip_wcs is not None:
88
            self.chip_wcs = chip_wcs
89
        elif img_header is not None:
90
            self.chip_wcs = galsim.FitsWCS(header=img_header)
xin's avatar
xin committed
91
        else:
92
            self.chip_wcs = None
xin's avatar
xin committed
93

94
        return self.posImg, self.offset, self.localWCS, self.chip_wcs, self.fd_shear
xin's avatar
xin committed
95

96
    def getRealPos(self, img, global_x=0., global_y=0., img_real_wcs=None):
xin's avatar
xin committed
97
98
99
100
101
        img_global_pos = galsim.PositionD(global_x, global_y)
        cel_pos = img.wcs.toWorld(img_global_pos)
        realPos = img_real_wcs.toImage(cel_pos)
        return realPos

102
    def drawObj_multiband(self, tel, pos_img, psf_model, bandpass_list, filt, chip, nphotons_tot=None, g1=0, g2=0,
Fang Yuedong's avatar
Fang Yuedong committed
103
                          exptime=150., fd_shear=None):
Fang Yuedong's avatar
Fang Yuedong committed
104
105
106
107
108
109
110
111
        if nphotons_tot == None:
            nphotons_tot = self.getElectronFluxFilt(filt, tel, exptime)
        # print("nphotons_tot = ", nphotons_tot)

        try:
            full = integrate_sed_bandpass(sed=self.sed, bandpass=filt.bandpass_full)
        except Exception as e:
            print(e)
112
113
            if self.logger:
                self.logger.error(e)
Fang Yuedong's avatar
Fang Yuedong committed
114
            return 2, None
Fang Yuedong's avatar
Fang Yuedong committed
115

116
        # Set Galsim Parameters
Fang Yuedong's avatar
Fang Yuedong committed
117
118
119
120
121
        if self.getMagFilter(filt) <= 15:
            folding_threshold = 5.e-4
        else:
            folding_threshold = 5.e-3
        gsp = galsim.GSParams(folding_threshold=folding_threshold)
122
123
        
        # Get real image position of object (deal with chip rotation w.r.t its center)
124
        self.real_pos = self.getRealPos(chip.img, global_x=self.posImg.x, global_y=self.posImg.y,
125
                                        img_real_wcs=self.chip_wcs)
xin's avatar
xin committed
126
        x, y = self.real_pos.x + 0.5, self.real_pos.y + 0.5
xin's avatar
xin committed
127
128
129
130
131
        x_nominal = int(np.floor(x + 0.5))
        y_nominal = int(np.floor(y + 0.5))
        dx = x - x_nominal
        dy = y - y_nominal
        offset = galsim.PositionD(dx, dy)
132
133
134
        # Get real local wcs of object (deal with chip rotation w.r.t its center)
        chip_wcs_local = self.chip_wcs.local(self.real_pos)
        is_updated = 0
xin's avatar
xin committed
135

136
        # Loop over all sub-bandpasses
Fang Yuedong's avatar
Fang Yuedong committed
137
138
139
140
141
142
        for i in range(len(bandpass_list)):
            bandpass = bandpass_list[i]
            try:
                sub = integrate_sed_bandpass(sed=self.sed, bandpass=bandpass)
            except Exception as e:
                print(e)
143
144
                if self.logger:
                    self.logger.error(e)
Fang Yuedong's avatar
Fang Yuedong committed
145
                continue
146
            ratio = sub / full
Fang Yuedong's avatar
Fang Yuedong committed
147
148
149
150
            if not (ratio == -1 or (ratio != ratio)):
                nphotons = ratio * nphotons_tot
            else:
                continue
151
152

            # nphotons_sum += nphotons
Fang Yuedong's avatar
Fang Yuedong committed
153
            # print("nphotons_sub-band_%d = %.2f"%(i, nphotons))
154
155
            
            # Get PSF model
156
157
            psf, pos_shear = psf_model.get_PSF(chip=chip, pos_img=pos_img, bandpass=bandpass,
                                               folding_threshold=folding_threshold)
158
159
160
161
            # star = galsim.DeltaFunction(gsparams=gsp)
            # star = star.withFlux(nphotons)
            # star = galsim.Convolve(psf, star)
            star = psf.withFlux(nphotons)
Fang Yuedong's avatar
Fang Yuedong committed
162

163
164
165
166
167
168
169
170
171
172
173
            stamp = star.drawImage(wcs=chip_wcs_local, offset=offset)
            if np.sum(np.isnan(stamp.array)) > 0:
                continue
            stamp.setCenter(x_nominal, y_nominal)
            bounds = stamp.bounds & galsim.BoundsI(0, chip.npix_x - 1, 0, chip.npix_y - 1)
            if bounds.area() > 0:
                chip.img.setOrigin(0, 0)
                chip.img[bounds] += stamp[bounds]
                is_updated = 1
                chip.img.setOrigin(chip.bound.xmin, chip.bound.ymin)
                del stamp
Fang Yuedong's avatar
Fang Yuedong committed
174
        
175
176
        if is_updated == 0:
            # Return code 0: object has missed this detector
Fang Yuedong's avatar
Fang Yuedong committed
177
            print("obj %s missed"%(self.id))
178
179
            if self.logger:
                self.logger.info("obj %s missed"%(self.id))
Fang Yuedong's avatar
Fang Yuedong committed
180
181
            return 0, pos_shear
        return 1, pos_shear # Return code 1: draw sucesss
Fang Yuedong's avatar
Fang Yuedong committed
182

183
    def addSLStoChipImage(self, sdp=None, chip=None, xOrderSigPlus=None, local_wcs=None):
Xin Zhang's avatar
Xin Zhang committed
184
185
186
        spec_orders = sdp.compute_spec_orders()
        for k, v in spec_orders.items():
            img_s = v[0]
Fang Yuedong's avatar
Fang Yuedong committed
187
188
189
190
191
192
193
194
195
            #########################################################
            # DEBUG
            #########################################################
            # print("before convolveGaussXorders, img_s:", img_s)
            nan_ids = np.isnan(img_s)
            if img_s[nan_ids].shape[0] > 0:
                # img_s[nan_ids] = 0
                print("DEBUG: before convolveGaussXorders specImg nan num is", img_s[nan_ids].shape[0])
            #########################################################
Xin Zhang's avatar
Xin Zhang committed
196
197
198
            img_s, orig_off = convolveGaussXorders(img_s, xOrderSigPlus[k])
            origin_order_x = v[1] - orig_off
            origin_order_y = v[2] - orig_off
Fang Yuedong's avatar
Fang Yuedong committed
199
200
201
202
203
204
205
206
207
208

            #########################################################
            # DEBUG
            #########################################################
            # print("DEBUG: orig_off is", orig_off)
            nan_ids = np.isnan(img_s)
            if img_s[nan_ids].shape[0] > 0:
                img_s[nan_ids] = 0
                print("DEBUG: specImg nan num is", img_s[nan_ids].shape[0])
            #########################################################
Xin Zhang's avatar
Xin Zhang committed
209
210
211
212
213
214
215
216
            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)
xin's avatar
xin committed
217
            stamp.wcs = local_wcs
Xin Zhang's avatar
Xin Zhang committed
218
219
            stamp.setOrigin(origin_order_x, origin_order_y)

220
            bounds = stamp.bounds & galsim.BoundsI(0, chip.npix_x - 1, 0, chip.npix_y - 1)
Xin Zhang's avatar
Xin Zhang committed
221
222
            if bounds.area() == 0:
                continue
xin's avatar
xin committed
223
            chip.img.setOrigin(0, 0)
Xin Zhang's avatar
Xin Zhang committed
224
225
226
            stamp[bounds] = chip.img[bounds]
            chip.sensor.accumulate(photons, stamp)
            chip.img[bounds] = stamp[bounds]
xin's avatar
xin committed
227
            chip.img.setOrigin(chip.bound.xmin, chip.bound.ymin)
Xin Zhang's avatar
Xin Zhang committed
228
229
230
            del stamp
        del spec_orders

Zhang Xin's avatar
Zhang Xin committed
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
    def addSLStoChipImageWithPSF(self, sdp=None, chip=None, pos_img_local = [1,1], psf_model=None, bandNo = 1, grating_split_pos=3685, local_wcs=None, pos_img=None):
        spec_orders = sdp.compute_spec_orders()
        for k, v in spec_orders.items():
            img_s = v[0]
            # print(bandNo,k)
            try:
                psf, pos_shear = psf_model.get_PSF(chip, pos_img_local = pos_img_local, bandNo = bandNo, galsimGSObject=True, g_order = k, grating_split_pos=grating_split_pos)
            except:
                psf, pos_shear = psf_model.get_PSF(chip=chip, pos_img=pos_img)

            psf_img = psf.drawImage(nx=100, ny=100, wcs = local_wcs)

            psf_img_m = psf_img.array

            #########################################################
            # DEBUG
            #########################################################
            # ids_p = psf_img_m < 0
            # psf_img_m[ids_p] = 0

            # from astropy.io import fits
            # fits.writeto(str(bandNo) + '_' + str(k) + '_psf.fits', psf_img_m)

            # print("DEBUG: orig_off is", orig_off)
            nan_ids = np.isnan(img_s)
            if img_s[nan_ids].shape[0] > 0:
                img_s[nan_ids] = 0
                print("DEBUG: specImg nan num is", img_s[nan_ids].shape[0])
            #########################################################
            img_s, orig_off = convolveImg(img_s, psf_img_m)
            origin_order_x = v[1] - orig_off[0]
            origin_order_y = v[2] - orig_off[1]


            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 = local_wcs
            # stamp.setOrigin(origin_order_x, origin_order_y)

            specImg.wcs = local_wcs
            specImg.setOrigin(origin_order_x, origin_order_y)

            bounds = specImg.bounds & galsim.BoundsI(0, chip.npix_x - 1, 0, chip.npix_y - 1)
            if bounds.area() == 0:
                continue
            chip.img.setOrigin(0, 0)
            chip.img[bounds] = chip.img[bounds] + specImg[bounds]
            # stamp[bounds] = chip.img[bounds]
            # # chip.sensor.accumulate(photons, stamp)
            # chip.img[bounds] = stamp[bounds]
            chip.img.setOrigin(chip.bound.xmin, chip.bound.ymin)
            # del stamp
        del spec_orders
        return pos_shear

Fang Yuedong's avatar
Fang Yuedong committed
292
    def drawObj_slitless(self, tel, pos_img, psf_model, bandpass_list, filt, chip, nphotons_tot=None, g1=0, g2=0,
Fang Yuedong's avatar
Fang Yuedong committed
293
294
295
296
297
298
299
300
301
302
303
                         exptime=150., normFilter=None, grating_split_pos=3685, fd_shear=None):
        if normFilter is not None:
            norm_thr_rang_ids = normFilter['SENSITIVITY'] > 0.001
            sedNormFactor = getNormFactorForSpecWithABMAG(ABMag=self.param['mag_use_normal'], spectrum=self.sed,
                                                          norm_thr=normFilter,
                                                          sWave=np.floor(normFilter[norm_thr_rang_ids][0][0]),
                                                          eWave=np.ceil(normFilter[norm_thr_rang_ids][-1][0]))
            if sedNormFactor == 0:
                return 2, None
        else:
            sedNormFactor = 1.
Fang Yuedong's avatar
Fang Yuedong committed
304
305
306
307
308
309
310
311
312
313

        if self.getMagFilter(filt) <= 15:
            folding_threshold = 5.e-4
        else:
            folding_threshold = 5.e-3
        gsp = galsim.GSParams(folding_threshold=folding_threshold)

        normalSED = Table(np.array([self.sed['WAVELENGTH'], self.sed['FLUX'] * sedNormFactor]).T,
                          names=('WAVELENGTH', 'FLUX'))

314
        self.real_pos = self.getRealPos(chip.img, global_x=self.posImg.x, global_y=self.posImg.y,
315
                                        img_real_wcs=self.chip_wcs)
xin's avatar
xin committed
316
317
318
319
320
321
322
323

        x, y = self.real_pos.x + 0.5, self.real_pos.y + 0.5
        x_nominal = int(np.floor(x + 0.5))
        y_nominal = int(np.floor(y + 0.5))
        dx = x - x_nominal
        dy = y - y_nominal
        offset = galsim.PositionD(dx, dy)

324
        chip_wcs_local = self.chip_wcs.local(self.real_pos)
xin's avatar
xin committed
325

326
        flat_cube = chip.flat_cube
Zhang Xin's avatar
Zhang Xin committed
327

328
329
        xOrderSigPlus = {'A': 1.3909419820029296, 'B': 1.4760376591236062, 'C': 4.035447379743442,
                         'D': 5.5684364343742825, 'E': 16.260021029735388}
xin's avatar
xin committed
330
        grating_split_pos_chip = 0 + grating_split_pos
Zhang Xin's avatar
Zhang Xin committed
331
332
333
334
335
336
337
338
339
340
341
342
343
344

        branges = np.zeros([len(bandpass_list),2])

        if hasattr(psf_model,'bandranges'):
            if psf_model.bandranges is None:
                return 2, None
            if len(psf_model.bandranges) != len(bandpass_list):
                return 2, None
            branges = psf_model.bandranges
        else:
            for i in range(len(bandpass_list)):
                branges[i, 0] = bandpass_list[i].blue_limit * 10
                branges[i, 1] = bandpass_list[i].red_limit * 10

Fang Yuedong's avatar
Fang Yuedong committed
345
        for i in range(len(bandpass_list)):
Zhang Xin's avatar
Zhang Xin committed
346
347
348
349
350
            # bandpass = bandpass_list[i]
            brange = branges[i]

            # psf, pos_shear = psf_model.get_PSF(chip=chip, pos_img=pos_img, bandpass=bandpass,
            #                                    folding_threshold=folding_threshold)
Fang Yuedong's avatar
Fang Yuedong committed
351
352
            star = galsim.DeltaFunction(gsparams=gsp)
            star = star.withFlux(tel.pupil_area * exptime)
Zhang Xin's avatar
Zhang Xin committed
353
354
            psf_tmp = galsim.Gaussian(sigma=0.002)
            star = galsim.Convolve(psf_tmp, star)
Fang Yuedong's avatar
Fang Yuedong committed
355
            
Zhang Xin's avatar
Zhang Xin committed
356
            starImg = star.drawImage(nx=60, ny=60, wcs=chip_wcs_local, offset=offset)
Fang Yuedong's avatar
Fang Yuedong committed
357

xin's avatar
xin committed
358
359
            origin_star = [y_nominal - (starImg.center.y - starImg.ymin),
                           x_nominal - (starImg.center.x - starImg.xmin)]
Fang Yuedong's avatar
Fang Yuedong committed
360
            starImg.setOrigin(0,0)
Xin Zhang's avatar
Xin Zhang committed
361
362
363
364
365
366
367
368
369
            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
Fang Yuedong's avatar
Fang Yuedong committed
370
                star_p1.setOrigin(0,0)
371
372
                xcenter_p1 = min(x_nominal, grating_split_pos_chip - 1) - 0
                ycenter_p1 = y_nominal - 0
Xin Zhang's avatar
Xin Zhang committed
373
374

                sdp_p1 = SpecDisperser(orig_img=star_p1, xcenter=xcenter_p1,
375
376
                                       ycenter=ycenter_p1, origin=origin_p1,
                                       tar_spec=normalSED,
Zhang Xin's avatar
Zhang Xin committed
377
                                       band_start=brange[0], band_end=brange[1],
378
379
380
                                       conf=chip.sls_conf[0],
                                       isAlongY=0,
                                       flat_cube=flat_cube)
Xin Zhang's avatar
Xin Zhang committed
381

Zhang Xin's avatar
Zhang Xin committed
382
383
384
385
                # self.addSLStoChipImage(sdp=sdp_p1, chip=chip, xOrderSigPlus=xOrderSigPlus, local_wcs=chip_wcs_local)
                pos_shear=self.addSLStoChipImageWithPSF(sdp=sdp_p1, chip=chip, pos_img_local = [xcenter_p1,ycenter_p1],
                                              psf_model=psf_model, bandNo = i+1, grating_split_pos=grating_split_pos,
                                              local_wcs=chip_wcs_local, pos_img = pos_img)
Xin Zhang's avatar
Xin Zhang committed
386

387
                subImg_p2 = starImg.array[:, subSlitPos + 1:starImg.array.shape[1]]
Xin Zhang's avatar
Xin Zhang committed
388
                star_p2 = galsim.Image(subImg_p2)
Fang Yuedong's avatar
Fang Yuedong committed
389
                star_p2.setOrigin(0, 0)
Xin Zhang's avatar
Xin Zhang committed
390
                origin_p2 = [origin_star[0], grating_split_pos_chip]
xin's avatar
xin committed
391
392
                xcenter_p2 = max(x_nominal, grating_split_pos_chip - 1) - 0
                ycenter_p2 = y_nominal - 0
Xin Zhang's avatar
Xin Zhang committed
393
394
395
396

                sdp_p2 = SpecDisperser(orig_img=star_p2, xcenter=xcenter_p2,
                                       ycenter=ycenter_p2, origin=origin_p2,
                                       tar_spec=normalSED,
Zhang Xin's avatar
Zhang Xin committed
397
                                       band_start=brange[0], band_end=brange[1],
Xin Zhang's avatar
Xin Zhang committed
398
                                       conf=chip.sls_conf[1],
399
400
                                       isAlongY=0,
                                       flat_cube=flat_cube)
Xin Zhang's avatar
Xin Zhang committed
401

Zhang Xin's avatar
Zhang Xin committed
402
403
404
405
                # self.addSLStoChipImage(sdp=sdp_p2, chip=chip, xOrderSigPlus=xOrderSigPlus, local_wcs=chip_wcs_local)
                pos_shear=self.addSLStoChipImageWithPSF(sdp=sdp_p2, chip=chip, pos_img_local=[xcenter_p2, ycenter_p2],
                                              psf_model=psf_model, bandNo=i + 1, grating_split_pos=grating_split_pos,
                                              local_wcs=chip_wcs_local, pos_img = pos_img)
Xin Zhang's avatar
Xin Zhang committed
406
407
408

                del sdp_p1
                del sdp_p2
409
            elif grating_split_pos_chip <= gal_origin[1]:
xin's avatar
xin committed
410
411
                sdp = SpecDisperser(orig_img=starImg, xcenter=x_nominal - 0,
                                    ycenter=y_nominal - 0, origin=origin_star,
Xin Zhang's avatar
Xin Zhang committed
412
                                    tar_spec=normalSED,
Zhang Xin's avatar
Zhang Xin committed
413
                                    band_start=brange[0], band_end=brange[1],
Xin Zhang's avatar
Xin Zhang committed
414
                                    conf=chip.sls_conf[1],
415
416
                                    isAlongY=0,
                                    flat_cube=flat_cube)
Zhang Xin's avatar
Zhang Xin committed
417
418
419
420
                # self.addSLStoChipImage(sdp=sdp, chip=chip, xOrderSigPlus=xOrderSigPlus, local_wcs=chip_wcs_local)
                pos_shear=self.addSLStoChipImageWithPSF(sdp=sdp, chip=chip, pos_img_local=[x_nominal, y_nominal],
                                              psf_model=psf_model, bandNo=i + 1, grating_split_pos=grating_split_pos,
                                              local_wcs=chip_wcs_local, pos_img = pos_img)
Xin Zhang's avatar
Xin Zhang committed
421
                del sdp
422
            elif grating_split_pos_chip >= gal_end[1]:
xin's avatar
xin committed
423
424
                sdp = SpecDisperser(orig_img=starImg, xcenter=x_nominal - 0,
                                    ycenter=y_nominal - 0, origin=origin_star,
Xin Zhang's avatar
Xin Zhang committed
425
                                    tar_spec=normalSED,
Zhang Xin's avatar
Zhang Xin committed
426
                                    band_start=brange[0], band_end=brange[1],
Xin Zhang's avatar
Xin Zhang committed
427
                                    conf=chip.sls_conf[0],
428
429
                                    isAlongY=0,
                                    flat_cube=flat_cube)
Zhang Xin's avatar
Zhang Xin committed
430
431
432
433
                # self.addSLStoChipImage(sdp=sdp, chip=chip, xOrderSigPlus=xOrderSigPlus, local_wcs=chip_wcs_local)
                pos_shear=self.addSLStoChipImageWithPSF(sdp=sdp, chip=chip, pos_img_local=[x_nominal, y_nominal],
                                              psf_model=psf_model, bandNo=i + 1, grating_split_pos=grating_split_pos,
                                              local_wcs=chip_wcs_local, pos_img = pos_img)
Xin Zhang's avatar
Xin Zhang committed
434
                del sdp
Zhang Xin's avatar
Zhang Xin committed
435
            # del psf
Fang Yuedong's avatar
Fang Yuedong committed
436
        return 1, pos_shear
Fang Yuedong's avatar
Fang Yuedong committed
437
438
439
440
441
442
443
444
445
446

    def SNRestimate(self, img_obj, flux, noise_level=0.0, seed=31415):
        img_flux = img_obj.added_flux
        stamp = img_obj.copy() * 0.0
        rng = galsim.BaseDeviate(seed)
        gaussianNoise = galsim.GaussianNoise(rng, sigma=noise_level)
        stamp.addNoise(gaussianNoise)
        sig_obj = np.std(stamp.array)
        snr_obj = img_flux / sig_obj
        return snr_obj