From 8918310ae27a41e77c89e396ef0c8be07b2bc229 Mon Sep 17 00:00:00 2001 From: Zhang Xin Date: Mon, 20 Nov 2023 11:31:55 +0800 Subject: [PATCH] add flat with shutter Effect --- ObservationSim/Instrument/Chip/Chip.py | 6 ++- ObservationSim/ObservationSim.py | 60 ++++++++++++++++++++------ config/config_C6_dev.yaml | 17 +++++--- 3 files changed, 63 insertions(+), 20 deletions(-) diff --git a/ObservationSim/Instrument/Chip/Chip.py b/ObservationSim/Instrument/Chip/Chip.py index 33914c2..9d5ec13 100755 --- a/ObservationSim/Instrument/Chip/Chip.py +++ b/ObservationSim/Instrument/Chip/Chip.py @@ -268,7 +268,7 @@ class Chip(FocalPlane): noise = self.dark_noise * exptime + self.read_noise**2 return noise - def addEffects(self, config, img, chip_output, filt, ra_cen, dec_cen, img_rot, exptime=150., pointing_ID=0, timestamp_obs=1621915200, pointing_type='SCI', sky_map=None, tel=None, logger=None): + def addEffects(self, config, img, chip_output, filt, ra_cen, dec_cen, img_rot, exptime=150., pointing_ID=0, timestamp_obs=1621915200, pointing_type='SCI', sky_map=None, post_flash_map=None, tel=None, logger=None): # Set random seeds SeedGainNonuni=int(config["random_seeds"]["seed_gainNonUniform"]) SeedBiasNonuni=int(config["random_seeds"]["seed_biasNonUniform"]) @@ -307,6 +307,9 @@ class Chip(FocalPlane): if config["output_setting"]["flat_output"] == False: del flat_img + if post_flash_map is not None: + img = img + post_flash_map + # Apply Shutter-effect for one chip if config["ins_effects"]["shutter_effect"] == True: chip_utils.log_info(msg=" Apply shutter effect", logger=self.logger) @@ -318,7 +321,6 @@ class Chip(FocalPlane): shutt_gsimg.write("%s/ShutterEffect_%s_1.fits" % (chip_output.subdir, self.chipID)) del shutt_gsimg del shuttimg - # # Add Poisson noise to the resulting images # # (NOTE): this can only applied to the slitless image # # since it dose not use photon shooting to draw stamps diff --git a/ObservationSim/ObservationSim.py b/ObservationSim/ObservationSim.py index 876eb41..8d14414 100755 --- a/ObservationSim/ObservationSim.py +++ b/ObservationSim/ObservationSim.py @@ -415,30 +415,63 @@ class Observation(object): chip_output.Log_info("check running:2: 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) )) - def run_one_chip_LEDlight(self, chip, filt, pointing, chip_output, wcs_fp=None, psf_model=None, cat_dir=None, sed_dir=None): + def run_one_chip_calibration(self, chip, filt, pointing, chip_output, skyback_level = 20000, sky_level_filt = 'g', wcs_fp=None, psf_model=None, cat_dir=None, sed_dir=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) + # 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 + pf_map = np.zeros_like(chip.img.array) + if self.config["obs_setting"]["LED_TYPE"] is not None: + if len(self.config["obs_setting"]["LED_TYPE"]) != 0: + print("LED OPEN--------") + led_obj = FlatLED(chip, filt) - led_obj = FlatLED(chip, filt) - - led_flat = led_obj.drawObj_LEDFlat(led_type_list=self.config["obs_setting"]["LED_TYPE"], exp_t_list=self.config["obs_setting"]["LED_TIME"]) - chip.img = chip.img + galsim.ImageF(led_flat) - + led_flat = led_obj.drawObj_LEDFlat(led_type_list=self.config["obs_setting"]["LED_TYPE"], exp_t_list=self.config["obs_setting"]["LED_TIME"]) + pf_map = led_flat # whether to output zero, dark, flat calibration images. - sky_map = np.zeros_like(chip.img.array) + expTime = self.config["obs_setting"]["exp_time"] + skybg_unit = self.filter_param.param[sky_level_filt][5] + norm_scaler = skyback_level/expTime/skybg_unit + + if skyback_level == 0: + self.config["ins_effects"]["shutter_effect"] = False - self.config["ins_effects"]["shutter_effect"] = False + if chip.survey_type == "photometric": + sky_map = np.ones_like(chip.img.array) * skybg_unit * norm_scaler / self.tel.pupil_area + elif chip.survey_type == "spectroscopic": + flat_normal = np.ones_like(chip.img.array) + if self.config["ins_effects"]["flat_fielding"] == True: + chip_output.Log_info("SLS flat preprocess,CHIP %d : Creating and applying Flat-Fielding" % chip.chipID) + msg = str(chip.img.bounds) + chip_output.Log_info(msg) + flat_img = Effects.MakeFlatSmooth( + chip.img.bounds, + int(self.config["random_seeds"]["seed_flat"])) + flat_normal = flat_normal * flat_img.array / np.mean(flat_img.array) + if self.config["ins_effects"]["shutter_effect"] == True: + chip_output.Log_info("SLS flat preprocess,CHIP %d : Apply shutter effect" % chip.chipID) + shuttimg = Effects.ShutterEffectArr(chip.img, t_shutter=1.3, dist_bearing=735, + dt=1E-3) # shutter effect normalized image for this chip + flat_normal = flat_normal * shuttimg + flat_normal = np.array(flat_normal, dtype='float32') + sky_map = calculateSkyMap_split_g( + skyMap=flat_normal, + blueLimit=filt.blue_limit, + redLimit=filt.red_limit, + conf=chip.sls_conf, + pixelSize=chip.pix_scale, + isAlongY=0, + flat_cube=chip.flat_cube) + sky_map = sky_map * norm_scaler chip.img = chip.addEffects( config=self.config, @@ -453,6 +486,7 @@ class Observation(object): timestamp_obs=pointing.timestamp, pointing_type=pointing.pointing_type, sky_map=sky_map, tel=self.tel, + post_flash_map=pf_map, logger=chip_output.logger) datetime_obs = datetime.utcfromtimestamp(pointing.timestamp) @@ -564,11 +598,13 @@ class Observation(object): subdir=sub_img_dir, prefix=prefix) chip_output.Log_info("running pointing#%d, chip#%d, at PID#%d..."%(pointing_ID, chip.chipID, pid)) - if self.config["obs_setting"]["survey_type"] == "LED": - self.run_one_chip_LEDlight(chip=chip, + if self.config["obs_setting"]["survey_type"] == "CALIBRATION": + self.run_one_chip_calibration(chip=chip, filt=filt, chip_output=chip_output, - pointing=pointing) + pointing=pointing, + skyback_level = self.config["obs_setting"]["FLAT_LEVEL"], + sky_level_filt = self.config["obs_setting"]["FLAT_LEVEL_FIL"]) else: self.run_one_chip( chip=chip, diff --git a/config/config_C6_dev.yaml b/config/config_C6_dev.yaml index 412330b..4d7073b 100644 --- a/config/config_C6_dev.yaml +++ b/config/config_C6_dev.yaml @@ -66,11 +66,16 @@ obs_setting: # "Spectroscopic": simulate slitless spectroscopic chips only # "FGS": simulate FGS chips only (31-42) # "All": simulate full focal plane - # "LED": - survey_type: "LED" - - LED_TYPE: ["LED5"] - LED_TIME: [10.] + # "CALIBRATION": falt, bias, dark with or without postflash + survey_type: "CALIBRATION" + #"LED": ['LED1','LED2','LED3','LED4','LED5','LED6','LED7','LED8','LED9','LED10','LED11','LED12','LED13','LED14'] or null + #'LED1': '275', 'LED2': '310', 'LED3': '430', 'LED4': '505', 'LED5': '545', 'LED6': '590', 'LED7': '670', + #'LED8': '760', 'LED9': '940', 'LED10': '940', 'LED11': '1050', 'LED12': '1050','LED13': '340', 'LED14': '365' + LED_TYPE: ['LED5'] + LED_TIME: [1.] + # unit e- ,flat level + FLAT_LEVEL: 20000 + FLAT_LEVEL_FIL: 'g' # Exposure time [seconds] exp_time: 150. @@ -106,7 +111,7 @@ obs_setting: # - give a list of indexes of chips: [ip_1, ip_2...] # - run all chips: null # Note: for all pointings - run_chips: [8] + run_chips: [5] # Whether to enable astrometric modeling enable_astrometric_model: False -- GitLab