Galaxy.py 19.6 KB
Newer Older
Fang Yuedong's avatar
Fang Yuedong committed
1
2
3
4
import numpy as np
import galsim
from astropy.table import Table

5
from ObservationSim.MockObject._util import eObs, integrate_sed_bandpass, getNormFactorForSpecWithABMAG
6
7
8
from ObservationSim.MockObject.SpecDisperser import SpecDisperser
from ObservationSim.MockObject.MockObject import MockObject

Fang Yuedong's avatar
Fang Yuedong committed
9
10
# import tracemalloc

Fang Yuedong's avatar
Fang Yuedong committed
11

Fang Yuedong's avatar
Fang Yuedong committed
12
class Galaxy(MockObject):
13
    def __init__(self, param, logger=None):
14
        super().__init__(param, logger=logger)
Fang Yuedong's avatar
Fang Yuedong committed
15

Fang Yuedong's avatar
Fang Yuedong committed
16
17
18
19
        if not hasattr(self, "disk_sersic_idx"):
            self.disk_sersic_idx = 1.
        if not hasattr(self, "bulge_sersic_idx"):
            self.bulge_sersic_idx = 4.
Fang Yuedong's avatar
Fang Yuedong committed
20
21
22
23
24
        if not hasattr(self, "mu"):
            if hasattr(self, "detA"):
                self.mu = 1./self.detA
            else:
                self.mu = 1.
Fang Yuedong's avatar
Fang Yuedong committed
25
26
27
28
29
30

    def unload_SED(self):
        """(Test) free up SED memory
        """
        del self.sed

Fang Yuedong's avatar
Fang Yuedong committed
31
    def getGSObj_multiband(self, tel, psf_list, bandpass_list, filt, nphotons_tot=None, g1=0, g2=0, exptime=150., fd_shear=None):
Fang Yuedong's avatar
Fang Yuedong committed
32
        if len(psf_list) != len(bandpass_list):
Fang Yuedong's avatar
Fang Yuedong committed
33
34
            raise ValueError(
                "!!!The number of PSF profiles and the number of bandpasses must be equal.")
Fang Yuedong's avatar
Fang Yuedong committed
35
36
37
38
39
40
        objs = []
        if nphotons_tot == None:
            nphotons_tot = self.getElectronFluxFilt(filt, tel, exptime)
        # print("nphotons_tot = ", nphotons_tot)

        try:
Fang Yuedong's avatar
Fang Yuedong committed
41
42
            full = integrate_sed_bandpass(
                sed=self.sed, bandpass=filt.bandpass_full)
Fang Yuedong's avatar
Fang Yuedong committed
43
44
        except Exception as e:
            print(e)
45
46
            if self.logger:
                self.logger.error(e)
Fang Yuedong's avatar
Fang Yuedong committed
47
48
49
50
51
52
53
            return -1
        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)
54
55
                if self.logger:
                    self.logger.error(e)
Fang Yuedong's avatar
Fang Yuedong committed
56
                return -1
Fang Yuedong's avatar
Fang Yuedong committed
57

Fang Yuedong's avatar
Fang Yuedong committed
58
59
60
61
62
63
64
            ratio = sub/full
            if not (ratio == -1 or (ratio != ratio)):
                nphotons = ratio * nphotons_tot
            else:
                return -1

            psf = psf_list[i]
Fang Yuedong's avatar
Fang Yuedong committed
65
66
            disk = galsim.Sersic(n=self.disk_sersic_idx,
                                 half_light_radius=self.hlr_disk, flux=1.0)
Fang Yuedong's avatar
Fang Yuedong committed
67
68
            disk_shape = galsim.Shear(g1=self.e1_disk, g2=self.e2_disk)
            disk = disk.shear(disk_shape)
Fang Yuedong's avatar
Fang Yuedong committed
69
70
            bulge = galsim.Sersic(n=self.bulge_sersic_idx,
                                  half_light_radius=self.hlr_bulge, flux=1.0)
Fang Yuedong's avatar
Fang Yuedong committed
71
72
73
            bulge_shape = galsim.Shear(g1=self.e1_bulge, g2=self.e2_bulge)
            bulge = bulge.shear(bulge_shape)

74
75
76
77
78
79
            if self.bfrac == 0:
                gal = disk
            elif self.bfrac == 1:
                gal = bulge
            else:
                gal = self.bfrac * bulge + (1.0 - self.bfrac) * disk
80
81
82
            if fd_shear is not None:
                g1 += fd_shear.g1
                g2 += fd_shear.g2
Fang Yuedong's avatar
Fang Yuedong committed
83
84
            gal_shear = galsim.Shear(g1=g1, g2=g2)
            gal = gal.shear(gal_shear)
Fang Yuedong's avatar
Fang Yuedong committed
85
86
            # Magnification
            gal = gal.magnify(self.mu)
Fang Yuedong's avatar
Fang Yuedong committed
87
            gal = galsim.Convolve(psf, gal)
Fang Yuedong's avatar
Fang Yuedong committed
88
89
            gal = gal.withFlux(nphotons)

Fang Yuedong's avatar
Fang Yuedong committed
90
91
92
93
            objs.append(gal)
        final = galsim.Sum(objs)
        return final

Fang Yuedong's avatar
Fang Yuedong committed
94
    def drawObj_multiband(self, tel, pos_img, psf_model, bandpass_list, filt, chip, nphotons_tot=None, g1=0, g2=0, exptime=150., fd_shear=None):
Fang Yuedong's avatar
Fang Yuedong committed
95
96
97
98
99
        if nphotons_tot == None:
            nphotons_tot = self.getElectronFluxFilt(filt, tel, exptime)
        # print("nphotons_tot = ", nphotons_tot)

        try:
Fang Yuedong's avatar
Fang Yuedong committed
100
101
            full = integrate_sed_bandpass(
                sed=self.sed, bandpass=filt.bandpass_full)
Fang Yuedong's avatar
Fang Yuedong committed
102
103
        except Exception as e:
            print(e)
104
105
            if self.logger:
                self.logger.error(e)
Fang Yuedong's avatar
Fang Yuedong committed
106
            return 2, None
Fang Yuedong's avatar
Fang Yuedong committed
107

Fang Yuedong's avatar
Fang Yuedong committed
108
        # # [C6 TEST]
Fang Yuedong's avatar
Fang Yuedong committed
109
        # print('hlr_disk = %.4f, hlr_bulge = %.4f'%(self.hlr_disk, self.hlr_bulge))
Fang Yuedong's avatar
Fang Yuedong committed
110
111
        # tracemalloc.start()

Fang Yuedong's avatar
Fang Yuedong committed
112
        big_galaxy = False
Fang Yuedong's avatar
Fang Yuedong committed
113
        if self.hlr_disk > 3.0 or self.hlr_bulge > 3.0:  # Very big galaxy
Fang Yuedong's avatar
Fang Yuedong committed
114
115
            big_galaxy = True

116
        # Set Galsim Parameters
Fang Yuedong's avatar
Fang Yuedong committed
117
118
119
120
121
122
        if self.getMagFilter(filt) <= 15 and (not big_galaxy):
            folding_threshold = 5.e-4
        else:
            folding_threshold = 5.e-3
        gsp = galsim.GSParams(folding_threshold=folding_threshold)

xin's avatar
xin committed
123
        self.real_pos = self.getRealPos(chip.img, global_x=self.posImg.x, global_y=self.posImg.y,
124
                                        img_real_wcs=self.chip_wcs)
xin's avatar
xin committed
125
126
127
128
129
130
131

        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)
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
        # Model the galaxy as disk + bulge
Fang Yuedong's avatar
Fang Yuedong committed
137
138
        disk = galsim.Sersic(
            n=self.disk_sersic_idx, half_light_radius=self.hlr_disk, flux=1.0, gsparams=gsp)
139
140
        disk_shape = galsim.Shear(g1=self.e1_disk, g2=self.e2_disk)
        disk = disk.shear(disk_shape)
Fang Yuedong's avatar
Fang Yuedong committed
141
142
        bulge = galsim.Sersic(
            n=self.bulge_sersic_idx, half_light_radius=self.hlr_bulge, flux=1.0, gsparams=gsp)
143
144
        bulge_shape = galsim.Shear(g1=self.e1_bulge, g2=self.e2_bulge)
        bulge = bulge.shear(bulge_shape)
Fang Yuedong's avatar
Fang Yuedong committed
145

146
        # Get shear and deal with shear induced by field distortion
147
148
149
150
        if fd_shear:
            g1 += fd_shear.g1
            g2 += fd_shear.g2
        gal_shear = galsim.Shear(g1=g1, g2=g2)
151

152
        # Loop over all sub-bandpasses
Fang Yuedong's avatar
Fang Yuedong committed
153
154
155
156
157
158
        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)
159
160
                if self.logger:
                    self.logger.error(e)
Fang Yuedong's avatar
Fang Yuedong committed
161
162
163
164
165
166
                continue
            ratio = sub/full
            if not (ratio == -1 or (ratio != ratio)):
                nphotons = ratio * nphotons_tot
            else:
                continue
Fang Yuedong's avatar
Fang Yuedong committed
167

168
            # nphotons_sum += nphotons
Fang Yuedong's avatar
Fang Yuedong committed
169
            # # [C6 TEST]
Fang Yuedong's avatar
Fang Yuedong committed
170
171
            # print("nphotons_sub-band_%d = %.2f"%(i, nphotons))

172
            # Get PSF model
Fang Yuedong's avatar
Fang Yuedong committed
173
174
175
            psf, pos_shear = psf_model.get_PSF(
                chip=chip, pos_img=pos_img, bandpass=bandpass, folding_threshold=folding_threshold)

176
177
178
179
180
181
            if self.bfrac == 0:
                gal_temp = disk
            elif self.bfrac == 1:
                gal_temp = bulge
            else:
                gal_temp = self.bfrac * bulge + (1.0 - self.bfrac) * disk
182
            gal_temp = gal_temp.shear(gal_shear)
Fang Yuedong's avatar
Fang Yuedong committed
183
184
185
            # Magnification
            gal_temp = gal_temp.magnify(self.mu)
            if not big_galaxy:  # Not apply PSF for very big galaxy
186
                gal_temp = galsim.Convolve(psf, gal_temp)
Fang Yuedong's avatar
Fang Yuedong committed
187
188
189

            gal_temp = gal_temp.withFlux(nphotons)

190
191
192
193
            if i == 0:
                gal = gal_temp
            else:
                gal = gal + gal_temp
Fang Yuedong's avatar
Fang Yuedong committed
194

Fang Yuedong's avatar
Fang Yuedong committed
195
            # (TEST) Random knots
196
197
198
            # knots = galsim.RandomKnots(npoints=100, profile=disk)
            # kfrac = np.random.random()*(1.0 - self.bfrac)
            # gal = self.bfrac * bulge + (1.0 - self.bfrac - kfrac) * disk + kfrac * knots
Fang Yuedong's avatar
Fang Yuedong committed
199

200
201
202
203
204
        # stamp = gal.drawImage(wcs=chip_wcs_local, method='phot', offset=offset, save_photons=True)
        stamp = gal.drawImage(wcs=chip_wcs_local, offset=offset)
        if np.sum(np.isnan(stamp.array)) > 0:
            # ERROR happens
            return 2, pos_shear
xin's avatar
xin committed
205
        stamp.setCenter(x_nominal, y_nominal)
Fang Yuedong's avatar
Fang Yuedong committed
206
207
        bounds = stamp.bounds & galsim.BoundsI(
            0, chip.npix_x - 1, 0, chip.npix_y - 1)
Fang Yuedong's avatar
Fang Yuedong committed
208
209
        if bounds.area() > 0:
            chip.img.setOrigin(0, 0)
210
211
            chip.img[bounds] += stamp[bounds]
            is_updated = 1
Fang Yuedong's avatar
Fang Yuedong committed
212
            chip.img.setOrigin(chip.bound.xmin, chip.bound.ymin)
213
            del stamp
Fang Yuedong's avatar
Fang Yuedong committed
214

215
        if is_updated == 0:
Fang Yuedong's avatar
Fang Yuedong committed
216
            # Return code 0: object photons missed this detector
Fang Yuedong's avatar
Fang Yuedong committed
217
            print("obj %s missed" % (self.id))
218
            if self.logger:
Fang Yuedong's avatar
Fang Yuedong committed
219
                self.logger.info("obj %s missed" % (self.id))
Fang Yuedong's avatar
Fang Yuedong committed
220
            return 0, pos_shear
Fang Yuedong's avatar
Fang Yuedong committed
221

Fang Yuedong's avatar
Fang Yuedong committed
222
223
224
        # # [C6 TEST]
        # print("nphotons_sum = ", nphotons_sum)
        return 1, pos_shear
Fang Yuedong's avatar
Fang Yuedong committed
225
226

    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
227
228
229
230
                         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,
Fang Yuedong's avatar
Fang Yuedong committed
231
232
233
234
                                                          norm_thr=normFilter,
                                                          sWave=np.floor(
                                                              normFilter[norm_thr_rang_ids][0][0]),
                                                          eWave=np.ceil(normFilter[norm_thr_rang_ids][-1][0]))
Fang Yuedong's avatar
Fang Yuedong committed
235
236
237
238
            if sedNormFactor == 0:
                return 2, None
        else:
            sedNormFactor = 1.
Fang Yuedong's avatar
Fang Yuedong committed
239
240
241
        normalSED = Table(np.array([self.sed['WAVELENGTH'], self.sed['FLUX'] * sedNormFactor]).T,
                          names=('WAVELENGTH', 'FLUX'))

xin's avatar
xin committed
242
        self.real_pos = self.getRealPos(chip.img, global_x=self.posImg.x, global_y=self.posImg.y,
243
                                        img_real_wcs=self.chip_wcs)
xin's avatar
xin committed
244
245
246
247
248
249
250
251

        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)

252
        chip_wcs_local = self.chip_wcs.local(self.real_pos)
xin's avatar
xin committed
253

Fang Yuedong's avatar
Fang Yuedong committed
254
        big_galaxy = False
Fang Yuedong's avatar
Fang Yuedong committed
255
        if self.hlr_disk > 3.0 or self.hlr_bulge > 3.0:  # Very big galaxy
Fang Yuedong's avatar
Fang Yuedong committed
256
257
258
259
260
261
262
263
            big_galaxy = True

        if self.getMagFilter(filt) <= 15 and (not big_galaxy):
            folding_threshold = 5.e-4
        else:
            folding_threshold = 5.e-3
        gsp = galsim.GSParams(folding_threshold=folding_threshold)
        # nphotons_sum = 0
264
265
266

        flat_cube = chip.flat_cube

Fang Yuedong's avatar
Fang Yuedong committed
267
268
        xOrderSigPlus = {'A': 1.3909419820029296, 'B': 1.4760376591236062,
                         'C': 4.035447379743442, 'D': 5.5684364343742825, 'E': 16.260021029735388}
xin's avatar
xin committed
269
        grating_split_pos_chip = 0 + grating_split_pos
Zhang Xin's avatar
Zhang Xin committed
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285

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

        # print(hasattr(psf_model, 'bandranges'))

        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
286
        for i in range(len(bandpass_list)):
Zhang Xin's avatar
Zhang Xin committed
287
288
            # bandpass = bandpass_list[i]
            brange = branges[i]
Fang Yuedong's avatar
Fang Yuedong committed
289

Zhang Xin's avatar
Zhang Xin committed
290
            # 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
291
292
            disk = galsim.Sersic(
                n=self.disk_sersic_idx, half_light_radius=self.hlr_disk, flux=1.0, gsparams=gsp)
Fang Yuedong's avatar
Fang Yuedong committed
293
294
            disk_shape = galsim.Shear(g1=self.e1_disk, g2=self.e2_disk)
            disk = disk.shear(disk_shape)
Fang Yuedong's avatar
Fang Yuedong committed
295
296
            bulge = galsim.Sersic(
                n=self.bulge_sersic_idx, half_light_radius=self.hlr_bulge, flux=1.0, gsparams=gsp)
Fang Yuedong's avatar
Fang Yuedong committed
297
298
            bulge_shape = galsim.Shear(g1=self.e1_bulge, g2=self.e2_bulge)
            bulge = bulge.shear(bulge_shape)
Fang Yuedong's avatar
Fang Yuedong committed
299

300
301
302
303
304
305
            if self.bfrac == 0:
                gal = disk
            elif self.bfrac == 1:
                gal = bulge
            else:
                gal = self.bfrac * bulge + (1.0 - self.bfrac) * disk
Fang Yuedong's avatar
Fang Yuedong committed
306
307

            # (TEST) Random knots
308
309
310
            # knots = galsim.RandomKnots(npoints=100, profile=disk)
            # kfrac = np.random.random()*(1.0 - self.bfrac)
            # gal = self.bfrac * bulge + (1.0 - self.bfrac - kfrac) * disk + kfrac * knots
Fang Yuedong's avatar
Fang Yuedong committed
311

312
313
314
            if fd_shear:
                g1 += fd_shear.g1
                g2 += fd_shear.g2
Fang Yuedong's avatar
Fang Yuedong committed
315
316
            gal_shear = galsim.Shear(g1=g1, g2=g2)
            gal = gal.shear(gal_shear)
Fang Yuedong's avatar
Fang Yuedong committed
317
318
            gal = gal.magnify(self.mu)
            gal = gal.withFlux(tel.pupil_area * exptime)
Zhang Xin's avatar
Zhang Xin committed
319
            # gal = galsim.Convolve(psf, gal)
Fang Yuedong's avatar
Fang Yuedong committed
320

Zhang Xin's avatar
Zhang Xin committed
321
322
323
324
            # if not big_galaxy: # Not apply PSF for very big galaxy
            #     gal = galsim.Convolve(psf, gal)
            #     # if fd_shear is not None:
            #     #     gal = gal.shear(fd_shear)
Fang Yuedong's avatar
Fang Yuedong committed
325

Fang Yuedong's avatar
Fang Yuedong committed
326
327
            starImg = gal.drawImage(
                wcs=chip_wcs_local, offset=offset, method='real_space')
Fang Yuedong's avatar
Fang Yuedong committed
328

xin's avatar
xin committed
329
330
            origin_star = [y_nominal - (starImg.center.y - starImg.ymin),
                           x_nominal - (starImg.center.x - starImg.xmin)]
Fang Yuedong's avatar
Fang Yuedong committed
331
            starImg.setOrigin(0, 0)
Xin Zhang's avatar
Xin Zhang committed
332
            gal_origin = [origin_star[0], origin_star[1]]
Fang Yuedong's avatar
Fang Yuedong committed
333
334
            gal_end = [origin_star[0] + starImg.array.shape[0] -
                       1, origin_star[1] + starImg.array.shape[1] - 1]
Xin Zhang's avatar
Xin Zhang committed
335
336
337

            if gal_origin[1] < grating_split_pos_chip < gal_end[1]:
                subSlitPos = int(grating_split_pos_chip - gal_origin[1] + 1)
Fang Yuedong's avatar
Fang Yuedong committed
338
                # part img disperse
Xin Zhang's avatar
Xin Zhang committed
339
340
341

                subImg_p1 = starImg.array[:, 0:subSlitPos]
                star_p1 = galsim.Image(subImg_p1)
Fang Yuedong's avatar
Fang Yuedong committed
342
                star_p1.setOrigin(0, 0)
Xin Zhang's avatar
Xin Zhang committed
343
                origin_p1 = origin_star
Fang Yuedong's avatar
Fang Yuedong committed
344
                xcenter_p1 = min(x_nominal, grating_split_pos_chip-1) - 0
xin's avatar
xin committed
345
                ycenter_p1 = y_nominal-0
Xin Zhang's avatar
Xin Zhang committed
346
347

                sdp_p1 = SpecDisperser(orig_img=star_p1, xcenter=xcenter_p1,
Fang Yuedong's avatar
Fang Yuedong committed
348
349
350
351
352
353
                                       ycenter=ycenter_p1, origin=origin_p1,
                                       tar_spec=normalSED,
                                       band_start=brange[0], band_end=brange[1],
                                       conf=chip.sls_conf[0],
                                       isAlongY=0,
                                       flat_cube=flat_cube)
Xin Zhang's avatar
Xin Zhang committed
354

Zhang Xin's avatar
Zhang Xin committed
355
356
357
358
                # 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,
Fang Yuedong's avatar
Fang Yuedong committed
359
                                                          local_wcs=chip_wcs_local, pos_img=pos_img)
Xin Zhang's avatar
Xin Zhang committed
360

Fang Yuedong's avatar
Fang Yuedong committed
361
362
                subImg_p2 = starImg.array[:,
                                          subSlitPos+1:starImg.array.shape[1]]
Xin Zhang's avatar
Xin Zhang committed
363
                star_p2 = galsim.Image(subImg_p2)
Fang Yuedong's avatar
Fang Yuedong committed
364
                star_p2.setOrigin(0, 0)
Xin Zhang's avatar
Xin Zhang committed
365
                origin_p2 = [origin_star[0], grating_split_pos_chip]
xin's avatar
xin committed
366
367
                xcenter_p2 = max(x_nominal, grating_split_pos_chip - 1) - 0
                ycenter_p2 = y_nominal - 0
Xin Zhang's avatar
Xin Zhang committed
368
369
370
371

                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
372
                                       band_start=brange[0], band_end=brange[1],
Xin Zhang's avatar
Xin Zhang committed
373
                                       conf=chip.sls_conf[1],
374
375
                                       isAlongY=0,
                                       flat_cube=flat_cube)
Xin Zhang's avatar
Xin Zhang committed
376

Zhang Xin's avatar
Zhang Xin committed
377
378
379
380
                # 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,
Fang Yuedong's avatar
Fang Yuedong committed
381
                                                          local_wcs=chip_wcs_local, pos_img=pos_img)
Xin Zhang's avatar
Xin Zhang committed
382
383
384

                del sdp_p1
                del sdp_p2
Fang Yuedong's avatar
Fang Yuedong committed
385
            elif grating_split_pos_chip <= gal_origin[1]:
xin's avatar
xin committed
386
387
                sdp = SpecDisperser(orig_img=starImg, xcenter=x_nominal - 0,
                                    ycenter=y_nominal - 0, origin=origin_star,
Xin Zhang's avatar
Xin Zhang committed
388
                                    tar_spec=normalSED,
Zhang Xin's avatar
Zhang Xin committed
389
                                    band_start=brange[0], band_end=brange[1],
Xin Zhang's avatar
Xin Zhang committed
390
                                    conf=chip.sls_conf[1],
391
392
                                    isAlongY=0,
                                    flat_cube=flat_cube)
Zhang Xin's avatar
Zhang Xin committed
393
394
395
396
                # 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,
Fang Yuedong's avatar
Fang Yuedong committed
397
                                                          local_wcs=chip_wcs_local, pos_img=pos_img)
Xin Zhang's avatar
Xin Zhang committed
398
                del sdp
Fang Yuedong's avatar
Fang Yuedong committed
399
            elif grating_split_pos_chip >= gal_end[1]:
xin's avatar
xin committed
400
401
                sdp = SpecDisperser(orig_img=starImg, xcenter=x_nominal - 0,
                                    ycenter=y_nominal - 0, origin=origin_star,
Xin Zhang's avatar
Xin Zhang committed
402
                                    tar_spec=normalSED,
Zhang Xin's avatar
Zhang Xin committed
403
                                    band_start=brange[0], band_end=brange[1],
Xin Zhang's avatar
Xin Zhang committed
404
                                    conf=chip.sls_conf[0],
405
406
                                    isAlongY=0,
                                    flat_cube=flat_cube)
Zhang Xin's avatar
Zhang Xin committed
407
408
409
410
                # 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,
Fang Yuedong's avatar
Fang Yuedong committed
411
                                                          local_wcs=chip_wcs_local, pos_img=pos_img)
Xin Zhang's avatar
Xin Zhang committed
412
                del sdp
Fang Yuedong's avatar
Fang Yuedong committed
413

Xin Zhang's avatar
Xin Zhang committed
414
            # print(self.y_nominal, starImg.center.y, starImg.ymin)
Zhang Xin's avatar
Zhang Xin committed
415
            # del psf
Fang Yuedong's avatar
Fang Yuedong committed
416
        return 1, pos_shear
Fang Yuedong's avatar
Fang Yuedong committed
417
418
419
420

    def getGSObj(self, psf, g1=0, g2=0, flux=None, filt=None, tel=None, exptime=150.):
        if flux == None:
            flux = self.getElectronFluxFilt(filt, tel, exptime)
Fang Yuedong's avatar
Fang Yuedong committed
421
422
        disk = galsim.Sersic(n=self.disk_sersic_idx,
                             half_light_radius=self.hlr_disk, flux=1.0)
Fang Yuedong's avatar
Fang Yuedong committed
423
424
425
        disk_shape = galsim.Shear(g1=self.e1_disk, g2=self.e2_disk)
        disk = disk.shear(disk_shape)

Fang Yuedong's avatar
Fang Yuedong committed
426
427
        bulge = galsim.Sersic(n=self.bulge_sersic_idx,
                              half_light_radius=self.hlr_bulge, flux=1.0)
Fang Yuedong's avatar
Fang Yuedong committed
428
429
430
431
432
433
434
435
436
437
438
        bulge_shape = galsim.Shear(g1=self.e1_bulge, g2=self.e2_bulge)
        bulge = bulge.shear(bulge_shape)

        gal = self.bfrac * bulge + (1.0 - self.bfrac) * disk
        gal = gal.withFlux(flux)
        gal_shear = galsim.Shear(g1=g1, g2=g2)
        gal = gal.shear(gal_shear)
        final = galsim.Convolve(psf, gal)
        return final

    def getObservedEll(self, g1=0, g2=0):
Fang Yuedong's avatar
Fang Yuedong committed
439
440
        e1_obs, e2_obs, e_obs, theta = eObs(
            self.e1_total, self.e2_total, g1, g2)
Zhang Xin's avatar
Zhang Xin committed
441
        return self.e1_total, self.e2_total, g1, g2, e1_obs, e2_obs