Loading csst_mci_sim/csst_mci_sim.py +117 −117 Original line number Diff line number Diff line Loading @@ -2234,124 +2234,124 @@ class MCIsimulator(): ################################################################################ ################################################################################# ######################################################################## def earthshine(self, theta): """ For given theta angle, return the earth-shine spectrum. # def earthshine(self, theta): # """ # For given theta angle, return the earth-shine spectrum. :param theta: angle (in degree) from the target to earth limb. :return: the scaled solar spectrum template_wave: unit in A template_flux: unit in erg/s/cm^2/A/arcsec^2 # :param theta: angle (in degree) from the target to earth limb. # :return: the scaled solar spectrum # template_wave: unit in A # template_flux: unit in erg/s/cm^2/A/arcsec^2 """ # """ # read solar template solar_template = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/solar_spec.dat', sep='\s+', header=None, comment='#') template_wave = solar_template[0].values template_flux = solar_template[1].values # read earth shine surface brightness earthshine_curve = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/earthshine.dat', header=None, comment='#') angle = earthshine_curve[0].values surface_brightness = earthshine_curve[1].values # read V-band throughtput cat_filter_V = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/filter_Bessell_V.dat', sep='\s+', header=None, comment='#') filter_wave = cat_filter_V[0].values filter_response = cat_filter_V[1].values # interplate to the target wavelength in V-band ind_filter = (template_wave >= np.min(filter_wave)) & (template_wave <= np.max(filter_wave)) filter_wave_interp = template_wave[ind_filter] filter_response_interp = np.interp(filter_wave_interp, filter_wave, filter_response) filter_constant = simps(filter_response_interp * filter_wave_interp, filter_wave_interp) template_constant = simps(filter_response_interp * template_wave[ind_filter] * template_flux[ind_filter], template_wave[ind_filter]) dwave = filter_wave_interp[1:] - filter_wave_interp[:-1] wave_eff = np.nansum(dwave * filter_wave_interp[1:] * filter_response_interp[1:]) / \ np.nansum(dwave * filter_response_interp[1:]) # get the normalized value at theta. u0 = np.interp(theta, angle, surface_brightness) # mag/arcsec^2 u0 = 10**((u0 + 48.6)/(-2.5)) # target flux in erg/s/cm^2/Hz unit u0 = u0 * 3e18 / wave_eff**2 # erg/s/cm^2/A/arcsec^2 factor = u0 * filter_constant / template_constant norm_flux = template_flux * factor # erg/s/cm^2/A/arcsec^2 self.earthshine_wave=template_wave # A self.earthshine_flux=norm_flux # # read solar template # solar_template = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/solar_spec.dat', sep='\s+', # header=None, comment='#') # template_wave = solar_template[0].values # template_flux = solar_template[1].values # # read earth shine surface brightness # earthshine_curve = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/earthshine.dat', # header=None, comment='#') # angle = earthshine_curve[0].values # surface_brightness = earthshine_curve[1].values # # read V-band throughtput # cat_filter_V = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/filter_Bessell_V.dat', sep='\s+', # header=None, comment='#') # filter_wave = cat_filter_V[0].values # filter_response = cat_filter_V[1].values # # interplate to the target wavelength in V-band # ind_filter = (template_wave >= np.min(filter_wave)) & (template_wave <= np.max(filter_wave)) # filter_wave_interp = template_wave[ind_filter] # filter_response_interp = np.interp(filter_wave_interp, filter_wave, filter_response) # filter_constant = simps(filter_response_interp * filter_wave_interp, filter_wave_interp) # template_constant = simps(filter_response_interp * template_wave[ind_filter] * template_flux[ind_filter], # template_wave[ind_filter]) # dwave = filter_wave_interp[1:] - filter_wave_interp[:-1] # wave_eff = np.nansum(dwave * filter_wave_interp[1:] * filter_response_interp[1:]) / \ # np.nansum(dwave * filter_response_interp[1:]) # # get the normalized value at theta. # u0 = np.interp(theta, angle, surface_brightness) # mag/arcsec^2 # u0 = 10**((u0 + 48.6)/(-2.5)) # target flux in erg/s/cm^2/Hz unit # u0 = u0 * 3e18 / wave_eff**2 # erg/s/cm^2/A/arcsec^2 # factor = u0 * filter_constant / template_constant # norm_flux = template_flux * factor # erg/s/cm^2/A/arcsec^2 # self.earthshine_wave=template_wave # A # self.earthshine_flux=norm_flux return # return ######################################################################################################################################################################################################################################################## # ######################################################################################################################################################################################################################################################## def zodiacal(self, ra, dec, time): """ For given RA, DEC and TIME, return the interpolated zodical spectrum in Leinert-1998. # def zodiacal(self, ra, dec, time): # """ # For given RA, DEC and TIME, return the interpolated zodical spectrum in Leinert-1998. :param ra: RA in unit of degree, ICRS frame :param dec: DEC in unit of degree, ICRS frame :param time: the specified string that in ISO format i.e., yyyy-mm-dd. :return: wave_A: wavelength of the zodical spectrum spec_mjy: flux of the zodical spectrum, in unit of MJy/sr spec_erg: flux of the zodical spectrum, in unit of erg/s/cm^2/A/sr # :param ra: RA in unit of degree, ICRS frame # :param dec: DEC in unit of degree, ICRS frame # :param time: the specified string that in ISO format i.e., yyyy-mm-dd. # :return: # wave_A: wavelength of the zodical spectrum # spec_mjy: flux of the zodical spectrum, in unit of MJy/sr # spec_erg: flux of the zodical spectrum, in unit of erg/s/cm^2/A/sr """ # """ # get solar position dt = datetime.fromisoformat(time) ###jd = julian.to_jd(dt, fmt='jd') # # get solar position # dt = datetime.fromisoformat(time) # ###jd = julian.to_jd(dt, fmt='jd') jd = time2jd(dt) t = Time(jd, format='jd', scale='utc') # jd = time2jd(dt) # t = Time(jd, format='jd', scale='utc') astro_sun = get_sun(t) ra_sun, dec_sun = astro_sun.gcrs.ra.deg, astro_sun.gcrs.dec.deg # astro_sun = get_sun(t) # ra_sun, dec_sun = astro_sun.gcrs.ra.deg, astro_sun.gcrs.dec.deg radec_sun = SkyCoord(ra=ra_sun*u.degree, dec=dec_sun*u.degree, frame='gcrs') lb_sun = radec_sun.transform_to('geocentrictrueecliptic') # radec_sun = SkyCoord(ra=ra_sun*u.degree, dec=dec_sun*u.degree, frame='gcrs') # lb_sun = radec_sun.transform_to('geocentrictrueecliptic') # get offsets between the target and sun. radec_obj = SkyCoord(ra=ra*u.degree, dec=dec*u.degree, frame='icrs') lb_obj = radec_obj.transform_to('geocentrictrueecliptic') # # get offsets between the target and sun. # radec_obj = SkyCoord(ra=ra*u.degree, dec=dec*u.degree, frame='icrs') # lb_obj = radec_obj.transform_to('geocentrictrueecliptic') beta = abs(lb_obj.lat.degree) lamda = abs(lb_obj.lon.degree - lb_sun.lon.degree) # beta = abs(lb_obj.lat.degree) # lamda = abs(lb_obj.lon.degree - lb_sun.lon.degree) # interpolated zodical surface brightness at 0.5 um zodi = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/zodi_map.dat', sep='\s+', header=None, comment='#') beta_angle = np.array([0, 5, 10, 15, 20, 25, 30, 45, 60, 75]) lamda_angle = np.array([0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180]) xx, yy = np.meshgrid(beta_angle, lamda_angle) f = interpolate.interp2d(xx, yy, zodi, kind='linear') zodi_obj = f(beta, lamda) # 10^�? W m�? sr�? um�? # # interpolated zodical surface brightness at 0.5 um # zodi = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/zodi_map.dat', sep='\s+', header=None, comment='#') # beta_angle = np.array([0, 5, 10, 15, 20, 25, 30, 45, 60, 75]) # lamda_angle = np.array([0, 5, 10, 15, 20, 25, 30, 35, 40, 45, # 60, 75, 90, 105, 120, 135, 150, 165, 180]) # xx, yy = np.meshgrid(beta_angle, lamda_angle) # f = interpolate.interp2d(xx, yy, zodi, kind='linear') # zodi_obj = f(beta, lamda) # 10^�? W m�? sr�? um�? # read the zodical spectrum in the ecliptic cat_spec = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/solar_spec.dat', sep='\s+', header=None, comment='#') wave = cat_spec[0].values # A spec0 = cat_spec[1].values # 10^-8 W m^�? sr^�? μm^�? zodi_norm = 252 # 10^-8 W m^�? sr^�? μm^�? # # read the zodical spectrum in the ecliptic # cat_spec = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/solar_spec.dat', sep='\s+', header=None, comment='#') # wave = cat_spec[0].values # A # spec0 = cat_spec[1].values # 10^-8 W m^�? sr^�? μm^�? # zodi_norm = 252 # 10^-8 W m^�? sr^�? μm^�? spec = spec0 * (zodi_obj / zodi_norm) * 1e-8 # W m^�? sr^�? μm^�? # spec = spec0 * (zodi_obj / zodi_norm) * 1e-8 # W m^�? sr^�? μm^�? # convert to the commonly used unit of MJy/sr, erg/s/cm^2/A/sr wave_A = wave # A #spec_mjy = spec * 0.1 * wave_A**2 / 3e18 * 1e23 * 1e-6 # MJy/sr spec_erg = spec * 0.1 # erg/s/cm^2/A/sr spec_erg2 = spec_erg / 4.25452e10 # erg/s/cm^2/A/arcsec^2 # # convert to the commonly used unit of MJy/sr, erg/s/cm^2/A/sr # wave_A = wave # A # #spec_mjy = spec * 0.1 * wave_A**2 / 3e18 * 1e23 * 1e-6 # MJy/sr # spec_erg = spec * 0.1 # erg/s/cm^2/A/sr # spec_erg2 = spec_erg / 4.25452e10 # erg/s/cm^2/A/arcsec^2 self.zodiacal_wave=wave_A # in A # self.zodiacal_wave=wave_A # in A self.zodiacal_flux=spec_erg2 # self.zodiacal_flux=spec_erg2 return wave_A, spec_erg2 # return wave_A, spec_erg2 ################################################################################### ########################################################################## Loading Loading
csst_mci_sim/csst_mci_sim.py +117 −117 Original line number Diff line number Diff line Loading @@ -2234,124 +2234,124 @@ class MCIsimulator(): ################################################################################ ################################################################################# ######################################################################## def earthshine(self, theta): """ For given theta angle, return the earth-shine spectrum. # def earthshine(self, theta): # """ # For given theta angle, return the earth-shine spectrum. :param theta: angle (in degree) from the target to earth limb. :return: the scaled solar spectrum template_wave: unit in A template_flux: unit in erg/s/cm^2/A/arcsec^2 # :param theta: angle (in degree) from the target to earth limb. # :return: the scaled solar spectrum # template_wave: unit in A # template_flux: unit in erg/s/cm^2/A/arcsec^2 """ # """ # read solar template solar_template = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/solar_spec.dat', sep='\s+', header=None, comment='#') template_wave = solar_template[0].values template_flux = solar_template[1].values # read earth shine surface brightness earthshine_curve = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/earthshine.dat', header=None, comment='#') angle = earthshine_curve[0].values surface_brightness = earthshine_curve[1].values # read V-band throughtput cat_filter_V = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/filter_Bessell_V.dat', sep='\s+', header=None, comment='#') filter_wave = cat_filter_V[0].values filter_response = cat_filter_V[1].values # interplate to the target wavelength in V-band ind_filter = (template_wave >= np.min(filter_wave)) & (template_wave <= np.max(filter_wave)) filter_wave_interp = template_wave[ind_filter] filter_response_interp = np.interp(filter_wave_interp, filter_wave, filter_response) filter_constant = simps(filter_response_interp * filter_wave_interp, filter_wave_interp) template_constant = simps(filter_response_interp * template_wave[ind_filter] * template_flux[ind_filter], template_wave[ind_filter]) dwave = filter_wave_interp[1:] - filter_wave_interp[:-1] wave_eff = np.nansum(dwave * filter_wave_interp[1:] * filter_response_interp[1:]) / \ np.nansum(dwave * filter_response_interp[1:]) # get the normalized value at theta. u0 = np.interp(theta, angle, surface_brightness) # mag/arcsec^2 u0 = 10**((u0 + 48.6)/(-2.5)) # target flux in erg/s/cm^2/Hz unit u0 = u0 * 3e18 / wave_eff**2 # erg/s/cm^2/A/arcsec^2 factor = u0 * filter_constant / template_constant norm_flux = template_flux * factor # erg/s/cm^2/A/arcsec^2 self.earthshine_wave=template_wave # A self.earthshine_flux=norm_flux # # read solar template # solar_template = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/solar_spec.dat', sep='\s+', # header=None, comment='#') # template_wave = solar_template[0].values # template_flux = solar_template[1].values # # read earth shine surface brightness # earthshine_curve = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/earthshine.dat', # header=None, comment='#') # angle = earthshine_curve[0].values # surface_brightness = earthshine_curve[1].values # # read V-band throughtput # cat_filter_V = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/filter_Bessell_V.dat', sep='\s+', # header=None, comment='#') # filter_wave = cat_filter_V[0].values # filter_response = cat_filter_V[1].values # # interplate to the target wavelength in V-band # ind_filter = (template_wave >= np.min(filter_wave)) & (template_wave <= np.max(filter_wave)) # filter_wave_interp = template_wave[ind_filter] # filter_response_interp = np.interp(filter_wave_interp, filter_wave, filter_response) # filter_constant = simps(filter_response_interp * filter_wave_interp, filter_wave_interp) # template_constant = simps(filter_response_interp * template_wave[ind_filter] * template_flux[ind_filter], # template_wave[ind_filter]) # dwave = filter_wave_interp[1:] - filter_wave_interp[:-1] # wave_eff = np.nansum(dwave * filter_wave_interp[1:] * filter_response_interp[1:]) / \ # np.nansum(dwave * filter_response_interp[1:]) # # get the normalized value at theta. # u0 = np.interp(theta, angle, surface_brightness) # mag/arcsec^2 # u0 = 10**((u0 + 48.6)/(-2.5)) # target flux in erg/s/cm^2/Hz unit # u0 = u0 * 3e18 / wave_eff**2 # erg/s/cm^2/A/arcsec^2 # factor = u0 * filter_constant / template_constant # norm_flux = template_flux * factor # erg/s/cm^2/A/arcsec^2 # self.earthshine_wave=template_wave # A # self.earthshine_flux=norm_flux return # return ######################################################################################################################################################################################################################################################## # ######################################################################################################################################################################################################################################################## def zodiacal(self, ra, dec, time): """ For given RA, DEC and TIME, return the interpolated zodical spectrum in Leinert-1998. # def zodiacal(self, ra, dec, time): # """ # For given RA, DEC and TIME, return the interpolated zodical spectrum in Leinert-1998. :param ra: RA in unit of degree, ICRS frame :param dec: DEC in unit of degree, ICRS frame :param time: the specified string that in ISO format i.e., yyyy-mm-dd. :return: wave_A: wavelength of the zodical spectrum spec_mjy: flux of the zodical spectrum, in unit of MJy/sr spec_erg: flux of the zodical spectrum, in unit of erg/s/cm^2/A/sr # :param ra: RA in unit of degree, ICRS frame # :param dec: DEC in unit of degree, ICRS frame # :param time: the specified string that in ISO format i.e., yyyy-mm-dd. # :return: # wave_A: wavelength of the zodical spectrum # spec_mjy: flux of the zodical spectrum, in unit of MJy/sr # spec_erg: flux of the zodical spectrum, in unit of erg/s/cm^2/A/sr """ # """ # get solar position dt = datetime.fromisoformat(time) ###jd = julian.to_jd(dt, fmt='jd') # # get solar position # dt = datetime.fromisoformat(time) # ###jd = julian.to_jd(dt, fmt='jd') jd = time2jd(dt) t = Time(jd, format='jd', scale='utc') # jd = time2jd(dt) # t = Time(jd, format='jd', scale='utc') astro_sun = get_sun(t) ra_sun, dec_sun = astro_sun.gcrs.ra.deg, astro_sun.gcrs.dec.deg # astro_sun = get_sun(t) # ra_sun, dec_sun = astro_sun.gcrs.ra.deg, astro_sun.gcrs.dec.deg radec_sun = SkyCoord(ra=ra_sun*u.degree, dec=dec_sun*u.degree, frame='gcrs') lb_sun = radec_sun.transform_to('geocentrictrueecliptic') # radec_sun = SkyCoord(ra=ra_sun*u.degree, dec=dec_sun*u.degree, frame='gcrs') # lb_sun = radec_sun.transform_to('geocentrictrueecliptic') # get offsets between the target and sun. radec_obj = SkyCoord(ra=ra*u.degree, dec=dec*u.degree, frame='icrs') lb_obj = radec_obj.transform_to('geocentrictrueecliptic') # # get offsets between the target and sun. # radec_obj = SkyCoord(ra=ra*u.degree, dec=dec*u.degree, frame='icrs') # lb_obj = radec_obj.transform_to('geocentrictrueecliptic') beta = abs(lb_obj.lat.degree) lamda = abs(lb_obj.lon.degree - lb_sun.lon.degree) # beta = abs(lb_obj.lat.degree) # lamda = abs(lb_obj.lon.degree - lb_sun.lon.degree) # interpolated zodical surface brightness at 0.5 um zodi = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/zodi_map.dat', sep='\s+', header=None, comment='#') beta_angle = np.array([0, 5, 10, 15, 20, 25, 30, 45, 60, 75]) lamda_angle = np.array([0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180]) xx, yy = np.meshgrid(beta_angle, lamda_angle) f = interpolate.interp2d(xx, yy, zodi, kind='linear') zodi_obj = f(beta, lamda) # 10^�? W m�? sr�? um�? # # interpolated zodical surface brightness at 0.5 um # zodi = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/zodi_map.dat', sep='\s+', header=None, comment='#') # beta_angle = np.array([0, 5, 10, 15, 20, 25, 30, 45, 60, 75]) # lamda_angle = np.array([0, 5, 10, 15, 20, 25, 30, 35, 40, 45, # 60, 75, 90, 105, 120, 135, 150, 165, 180]) # xx, yy = np.meshgrid(beta_angle, lamda_angle) # f = interpolate.interp2d(xx, yy, zodi, kind='linear') # zodi_obj = f(beta, lamda) # 10^�? W m�? sr�? um�? # read the zodical spectrum in the ecliptic cat_spec = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/solar_spec.dat', sep='\s+', header=None, comment='#') wave = cat_spec[0].values # A spec0 = cat_spec[1].values # 10^-8 W m^�? sr^�? μm^�? zodi_norm = 252 # 10^-8 W m^�? sr^�? μm^�? # # read the zodical spectrum in the ecliptic # cat_spec = pd.read_csv(self.information['dir_path']+'MCI_inputData/refs/solar_spec.dat', sep='\s+', header=None, comment='#') # wave = cat_spec[0].values # A # spec0 = cat_spec[1].values # 10^-8 W m^�? sr^�? μm^�? # zodi_norm = 252 # 10^-8 W m^�? sr^�? μm^�? spec = spec0 * (zodi_obj / zodi_norm) * 1e-8 # W m^�? sr^�? μm^�? # spec = spec0 * (zodi_obj / zodi_norm) * 1e-8 # W m^�? sr^�? μm^�? # convert to the commonly used unit of MJy/sr, erg/s/cm^2/A/sr wave_A = wave # A #spec_mjy = spec * 0.1 * wave_A**2 / 3e18 * 1e23 * 1e-6 # MJy/sr spec_erg = spec * 0.1 # erg/s/cm^2/A/sr spec_erg2 = spec_erg / 4.25452e10 # erg/s/cm^2/A/arcsec^2 # # convert to the commonly used unit of MJy/sr, erg/s/cm^2/A/sr # wave_A = wave # A # #spec_mjy = spec * 0.1 * wave_A**2 / 3e18 * 1e23 * 1e-6 # MJy/sr # spec_erg = spec * 0.1 # erg/s/cm^2/A/sr # spec_erg2 = spec_erg / 4.25452e10 # erg/s/cm^2/A/arcsec^2 self.zodiacal_wave=wave_A # in A # self.zodiacal_wave=wave_A # in A self.zodiacal_flux=spec_erg2 # self.zodiacal_flux=spec_erg2 return wave_A, spec_erg2 # return wave_A, spec_erg2 ################################################################################### ########################################################################## Loading