Loading ObservationSim/MockObject/MockObject.py +87 −0 Original line number Original line Diff line number Diff line import os import galsim import galsim import numpy as np import numpy as np import astropy.constants as cons import astropy.constants as cons from astropy import wcs from astropy import wcs from astropy.table import Table from astropy.table import Table import astropy.io.fits as fitsio from ObservationSim.MockObject._util import magToFlux, VC_A, convolveGaussXorders, convolveImg from ObservationSim.MockObject._util import magToFlux, VC_A, convolveGaussXorders, convolveImg from ObservationSim.MockObject._util import integrate_sed_bandpass, getNormFactorForSpecWithABMAG, getObservedSED, \ from ObservationSim.MockObject._util import integrate_sed_bandpass, getNormFactorForSpecWithABMAG, getObservedSED, \ Loading Loading @@ -444,3 +446,88 @@ class MockObject(object): sig_obj = np.std(stamp.array) sig_obj = np.std(stamp.array) snr_obj = img_flux / sig_obj snr_obj = img_flux / sig_obj return snr_obj return snr_obj def drawObj_PSF(self, tel, pos_img, psf_model, bandpass_list, filt, chip, nphotons_tot=None, g1=0, g2=0, exptime=150., fd_shear=None, chip_output=None): 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) if self.logger: self.logger.error(e) return 2, None # Set Galsim Parameters if self.getMagFilter(filt) <= 15: folding_threshold = 5.e-4 else: folding_threshold = 5.e-3 gsp = galsim.GSParams(folding_threshold=folding_threshold) # Get real image position of object (deal with chip rotation w.r.t its center) self.real_pos = self.getRealPos(chip.img, global_x=self.posImg.x, global_y=self.posImg.y, img_real_wcs=self.chip_wcs) 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) # 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 # Loop over all sub-bandpasses 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) if self.logger: self.logger.error(e) continue ratio = sub / full if not (ratio == -1 or (ratio != ratio)): nphotons = ratio * nphotons_tot else: continue # Get PSF model psf, pos_shear = psf_model.get_PSF(chip=chip, pos_img=pos_img, bandpass=bandpass, folding_threshold=folding_threshold) star_temp = psf.withFlux(nphotons) if i==0: star = star_temp else: star = star+star_temp pixelScale = 0.074 stamp = star.drawImage(wcs=chip_wcs_local, offset=offset) #stamp = star.drawImage(nx=256, ny=256, scale=pixelScale) if np.sum(np.isnan(stamp.array)) > 0: return None fn = chip_output.subdir + "/psfIDW" os.makedirs(fn, exist_ok=True) fn = fn + "/ccd_{:}".format(chip.chipID)+"_psf_"+str(self.param['id'])+".fits" if fn != None: if os.path.exists(fn): os.remove(fn) hdu = fitsio.PrimaryHDU() hdu.data = stamp.array hdu.header.set('name', self.type) hdu.header.set('pixScale', pixelScale) hdu.header.set('objID', self.param['id']) hdu.writeto(fn) del stamp return None ObservationSim/ObservationSim.py +14 −0 Original line number Original line Diff line number Diff line Loading @@ -304,6 +304,20 @@ class Observation(object): normFilter=norm_filt, normFilter=norm_filt, fd_shear=fd_shear) fd_shear=fd_shear) if isUpdated == 1 and self.config["run_option"]["out_psf"]: obj.drawObj_PSF( tel=self.tel, pos_img=pos_img, psf_model=psf_model, bandpass_list=filt.bandpass_sub_list, filt=filt, chip=chip, g1=obj.g1, g2=obj.g2, exptime=pointing.exp_time, fd_shear=fd_shear, chip_output=chip_output) if isUpdated == 1: if isUpdated == 1: # TODO: add up stats # TODO: add up stats chip_output.cat_add_obj(obj, pos_img, pos_shear) chip_output.cat_add_obj(obj, pos_img, pos_shear) Loading config/config_C6_fits.yaml +7 −4 Original line number Original line Diff line number Diff line Loading @@ -11,7 +11,7 @@ # OK to pass either way or both, as long as they are consistent # OK to pass either way or both, as long as they are consistent work_dir: "/share/simudata/CSSOSDataProductsSims/data/CSSTSimImage_C8/" work_dir: "/share/simudata/CSSOSDataProductsSims/data/CSSTSimImage_C8/" data_dir: "/share/simudata/CSSOSDataProductsSims/data/" data_dir: "/share/simudata/CSSOSDataProductsSims/data/" run_name: "testRun_fits" run_name: "testRun_FGS" project_cycle: 6 project_cycle: 6 run_counter: 1 run_counter: 1 Loading @@ -27,6 +27,9 @@ run_option: # If yes, no imaging simulation will run # If yes, no imaging simulation will run out_cat_only: NO out_cat_only: NO #output PSF out_psf: YES ############################################### ############################################### # Catalog setting # Catalog setting ############################################### ############################################### Loading Loading @@ -54,7 +57,7 @@ catalog_options: galaxy_only: NO galaxy_only: NO # With stamp? # With stamp? stamp_yes: YES stamp_yes: NO # rotate galaxy ellipticity # rotate galaxy ellipticity rotateEll: 0. # [degree] rotateEll: 0. # [degree] Loading Loading @@ -116,7 +119,7 @@ obs_setting: # - give a list of indexes of chips: [ip_1, ip_2...] # - give a list of indexes of chips: [ip_1, ip_2...] # - run all chips: null # - run all chips: null # Note: for all pointings # Note: for all pointings run_chips: [1, 2, 3, 7, 8, 9] run_chips: [39,40,41,42] # Whether to enable astrometric modeling # Whether to enable astrometric modeling enable_astrometric_model: True enable_astrometric_model: True Loading Loading @@ -181,7 +184,7 @@ ins_effects: add_bias: YES # Whether to add bias-level to images add_bias: YES # Whether to add bias-level to images bias_16channel: YES # Whether to add different biases for 16 channels bias_16channel: YES # Whether to add different biases for 16 channels gain_16channel: YES # Whether to make different gains for 16 channels gain_16channel: YES # Whether to make different gains for 16 channels shutter_effect: YES # Whether to add shutter effect shutter_effect: NO # Whether to add shutter effect flat_fielding: YES # Whether to add flat-fielding effect flat_fielding: YES # Whether to add flat-fielding effect prnu_effect: YES # Whether to add PRNU effect prnu_effect: YES # Whether to add PRNU effect non_linear: YES # Whether to add non-linearity non_linear: YES # Whether to add non-linearity Loading Loading
ObservationSim/MockObject/MockObject.py +87 −0 Original line number Original line Diff line number Diff line import os import galsim import galsim import numpy as np import numpy as np import astropy.constants as cons import astropy.constants as cons from astropy import wcs from astropy import wcs from astropy.table import Table from astropy.table import Table import astropy.io.fits as fitsio from ObservationSim.MockObject._util import magToFlux, VC_A, convolveGaussXorders, convolveImg from ObservationSim.MockObject._util import magToFlux, VC_A, convolveGaussXorders, convolveImg from ObservationSim.MockObject._util import integrate_sed_bandpass, getNormFactorForSpecWithABMAG, getObservedSED, \ from ObservationSim.MockObject._util import integrate_sed_bandpass, getNormFactorForSpecWithABMAG, getObservedSED, \ Loading Loading @@ -444,3 +446,88 @@ class MockObject(object): sig_obj = np.std(stamp.array) sig_obj = np.std(stamp.array) snr_obj = img_flux / sig_obj snr_obj = img_flux / sig_obj return snr_obj return snr_obj def drawObj_PSF(self, tel, pos_img, psf_model, bandpass_list, filt, chip, nphotons_tot=None, g1=0, g2=0, exptime=150., fd_shear=None, chip_output=None): 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) if self.logger: self.logger.error(e) return 2, None # Set Galsim Parameters if self.getMagFilter(filt) <= 15: folding_threshold = 5.e-4 else: folding_threshold = 5.e-3 gsp = galsim.GSParams(folding_threshold=folding_threshold) # Get real image position of object (deal with chip rotation w.r.t its center) self.real_pos = self.getRealPos(chip.img, global_x=self.posImg.x, global_y=self.posImg.y, img_real_wcs=self.chip_wcs) 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) # 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 # Loop over all sub-bandpasses 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) if self.logger: self.logger.error(e) continue ratio = sub / full if not (ratio == -1 or (ratio != ratio)): nphotons = ratio * nphotons_tot else: continue # Get PSF model psf, pos_shear = psf_model.get_PSF(chip=chip, pos_img=pos_img, bandpass=bandpass, folding_threshold=folding_threshold) star_temp = psf.withFlux(nphotons) if i==0: star = star_temp else: star = star+star_temp pixelScale = 0.074 stamp = star.drawImage(wcs=chip_wcs_local, offset=offset) #stamp = star.drawImage(nx=256, ny=256, scale=pixelScale) if np.sum(np.isnan(stamp.array)) > 0: return None fn = chip_output.subdir + "/psfIDW" os.makedirs(fn, exist_ok=True) fn = fn + "/ccd_{:}".format(chip.chipID)+"_psf_"+str(self.param['id'])+".fits" if fn != None: if os.path.exists(fn): os.remove(fn) hdu = fitsio.PrimaryHDU() hdu.data = stamp.array hdu.header.set('name', self.type) hdu.header.set('pixScale', pixelScale) hdu.header.set('objID', self.param['id']) hdu.writeto(fn) del stamp return None
ObservationSim/ObservationSim.py +14 −0 Original line number Original line Diff line number Diff line Loading @@ -304,6 +304,20 @@ class Observation(object): normFilter=norm_filt, normFilter=norm_filt, fd_shear=fd_shear) fd_shear=fd_shear) if isUpdated == 1 and self.config["run_option"]["out_psf"]: obj.drawObj_PSF( tel=self.tel, pos_img=pos_img, psf_model=psf_model, bandpass_list=filt.bandpass_sub_list, filt=filt, chip=chip, g1=obj.g1, g2=obj.g2, exptime=pointing.exp_time, fd_shear=fd_shear, chip_output=chip_output) if isUpdated == 1: if isUpdated == 1: # TODO: add up stats # TODO: add up stats chip_output.cat_add_obj(obj, pos_img, pos_shear) chip_output.cat_add_obj(obj, pos_img, pos_shear) Loading
config/config_C6_fits.yaml +7 −4 Original line number Original line Diff line number Diff line Loading @@ -11,7 +11,7 @@ # OK to pass either way or both, as long as they are consistent # OK to pass either way or both, as long as they are consistent work_dir: "/share/simudata/CSSOSDataProductsSims/data/CSSTSimImage_C8/" work_dir: "/share/simudata/CSSOSDataProductsSims/data/CSSTSimImage_C8/" data_dir: "/share/simudata/CSSOSDataProductsSims/data/" data_dir: "/share/simudata/CSSOSDataProductsSims/data/" run_name: "testRun_fits" run_name: "testRun_FGS" project_cycle: 6 project_cycle: 6 run_counter: 1 run_counter: 1 Loading @@ -27,6 +27,9 @@ run_option: # If yes, no imaging simulation will run # If yes, no imaging simulation will run out_cat_only: NO out_cat_only: NO #output PSF out_psf: YES ############################################### ############################################### # Catalog setting # Catalog setting ############################################### ############################################### Loading Loading @@ -54,7 +57,7 @@ catalog_options: galaxy_only: NO galaxy_only: NO # With stamp? # With stamp? stamp_yes: YES stamp_yes: NO # rotate galaxy ellipticity # rotate galaxy ellipticity rotateEll: 0. # [degree] rotateEll: 0. # [degree] Loading Loading @@ -116,7 +119,7 @@ obs_setting: # - give a list of indexes of chips: [ip_1, ip_2...] # - give a list of indexes of chips: [ip_1, ip_2...] # - run all chips: null # - run all chips: null # Note: for all pointings # Note: for all pointings run_chips: [1, 2, 3, 7, 8, 9] run_chips: [39,40,41,42] # Whether to enable astrometric modeling # Whether to enable astrometric modeling enable_astrometric_model: True enable_astrometric_model: True Loading Loading @@ -181,7 +184,7 @@ ins_effects: add_bias: YES # Whether to add bias-level to images add_bias: YES # Whether to add bias-level to images bias_16channel: YES # Whether to add different biases for 16 channels bias_16channel: YES # Whether to add different biases for 16 channels gain_16channel: YES # Whether to make different gains for 16 channels gain_16channel: YES # Whether to make different gains for 16 channels shutter_effect: YES # Whether to add shutter effect shutter_effect: NO # Whether to add shutter effect flat_fielding: YES # Whether to add flat-fielding effect flat_fielding: YES # Whether to add flat-fielding effect prnu_effect: YES # Whether to add PRNU effect prnu_effect: YES # Whether to add PRNU effect non_linear: YES # Whether to add non-linearity non_linear: YES # Whether to add non-linearity Loading