Commit 4c04ca70 authored by Fang Yuedong's avatar Fang Yuedong
Browse files

add orbit position inputs, add astrometric modeling

parent 64c00169
Loading
Loading
Loading
Loading
+47 −10
Original line number Diff line number Diff line
@@ -8,14 +8,16 @@ import astropy.constants as cons
from astropy.coordinates import spherical_to_cartesian
from astropy.table import Table
from scipy import interpolate
from datetime import datetime

from ObservationSim.MockObject import CatalogBase, Star, Galaxy, Quasar
from ObservationSim.MockObject._util import seds, sed_assign, extAv, tag_sed, getObservedSED
from ObservationSim.Astrometry.Astrometry_util import on_orbit_obs_position

NSIDE = 128

class C3Catalog(CatalogBase):
    def __init__(self, config, chip, **kwargs):
    def __init__(self, config, chip, pointing, **kwargs):
        super().__init__()
        self.cat_dir = os.path.join(config["data_dir"], config["input_path"]["cat_dir"])
        self.seed_Av = config["random_seeds"]["seed_Av"]
@@ -24,7 +26,9 @@ class C3Catalog(CatalogBase):
        self.normF_star = Table.read(os.path.join(self.normalize_dir, 'SLOAN_SDSS.g.fits'))
        self.normF_galaxy = Table.read(os.path.join(self.normalize_dir, 'lsst_throuput_g.fits'))
        
        self.config = config
        self.chip = chip
        self.pointing = pointing

        if "star_cat" in config["input_path"] and config["input_path"]["star_cat"]:
            star_file = config["input_path"]["star_cat"]
@@ -77,6 +81,11 @@ class C3Catalog(CatalogBase):
            param = self.initialize_param()
            param['ra'] = gals['ra_true'][igals]
            param['dec'] = gals['dec_true'][igals]
            if not self.chip.isContainObj(ra_obj=param['ra'], dec_obj=param['dec'], margin=200):
                continue
            param['mag_use_normal'] = gals['mag_true_g_lsst'][igals]
            if param['mag_use_normal'] >= 26.5:
                continue
            param['z'] = gals['redshift_true'][igals]
            param['model_tag'] = 'None'
            param['gamma1'] = 0
@@ -84,10 +93,10 @@ class C3Catalog(CatalogBase):
            param['kappa'] = 0
            param['delta_ra'] = 0
            param['delta_dec'] = 0
            sersicB = gals['sersic_bulge'][igals]
            # sersicB = gals['sersic_bulge'][igals]
            hlrMajB = gals['size_bulge_true'][igals]
            hlrMinB = gals['size_minor_bulge_true'][igals]
            sersicD = gals['sersic_disk'][igals]
            # sersicD = gals['sersic_disk'][igals]
            hlrMajD = gals['size_disk_true'][igals]
            hlrMinD = gals['size_minor_disk_true'][igals]
            aGal = gals['size_true'][igals]
@@ -112,11 +121,6 @@ class C3Catalog(CatalogBase):
                param['av'] = 0.6 * param['av'] / 3.0 # for quasar, av=[0, 0.2], 3.0=av.max-av.im
                param['star'] = 2 # Quasar

            if not self.chip.isContainObj(ra_obj=param['ra'], dec_obj=param['dec'], margin=200):
                continue
            param['mag_use_normal'] = gals['mag_true_g_lsst'][igals]
            if param['mag_use_normal'] >= 26.5:
                continue
            self.ids += 1
            param['id'] = self.ids
            
@@ -129,10 +133,43 @@ class C3Catalog(CatalogBase):

    def _load_stars(self, stars, pix_id=None):
        nstars = len(stars['sourceID'])
        # Apply astrometric modeling
        ra_arr = stars["RA"][:]
        dec_arr = stars["Dec"][:]
        if "astrometric_lib" in self.config["obs_setting"] and self.config["obs_setting"]["enable_astrometric_model"]:
            ra_list = ra_arr.tolist()
            dec_list = dec_arr.tolist()
            pmra_list = np.zeros(nstars).tolist()
            pmdec_list = np.zeros(nstars).tolist()
            rv_list = np.zeros(nstars).tolist()
            parallax_list = [1e-9] * nstars
            lib_path = os.path.join(self.config["data_dir"], self.config["obs_setting"]["astrometric_lib"])
            dt = datetime.fromtimestamp(self.pointing.timestamp)
            date_str = dt.date().isoformat()
            time_str = dt.time().isoformat()
            ra_arr, dec_arr = on_orbit_obs_position(
                input_ra_list=ra_list,
                input_dec_list=dec_list,
                input_pmra_list=pmra_list,
                input_pmdec_list=pmdec_list,
                input_rv_list=rv_list,
                input_parallax_list=parallax_list,
                input_nstars=nstars,
                input_x=self.pointing.sat_x,
                input_y=self.pointing.sat_y,
                input_z=self.pointing.sat_z,
                input_vx=self.pointing.sat_vx,
                input_vy=self.pointing.sat_vy,
                input_vz=self.pointing.sat_vz,
                input_epoch="J2015.5",
                input_date_str=date_str,
                input_time_str=time_str,
                lib_path=lib_path
            )
        for istars in range(nstars):
            param = self.initialize_param()
            param['ra'] = stars['RA'][istars]
            param['dec'] = stars['Dec'][istars]
            param['ra'] = ra_arr[istars]
            param['dec'] = dec_arr[istars]
            if not self.chip.isContainObj(ra_obj=param['ra'], dec_obj=param['dec'], margin=200):
                continue
            param['mag_use_normal'] = stars['app_sdss_g'][istars]
+2 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ class Catalog_example(CatalogBase):
        load the filter throughput for the input catalog's photometric system.
    """

    def __init__(self, config, chip, **kwargs):
    def __init__(self, config, chip, pointing, **kwargs):
        """Constructor method.
        
        Parameters
@@ -54,6 +54,7 @@ class Catalog_example(CatalogBase):
        super().__init__()
        self.cat_dir = os.path.join(config["data_dir"], config["input_path"]["cat_dir"])
        self.chip = chip
        self.pointing = pointing
        if "star_cat" in config["input_path"] and config["input_path"]["star_cat"]:
            star_file = config["input_path"]["star_cat"]
            star_SED_file = config["SED_templates_path"]["star_SED"]
+124 −0
Original line number Diff line number Diff line
from ctypes import *
import numpy as np

def checkInputList(input_list, n):
    if not isinstance(input_list, list):
        raise TypeError("Input type is not list!", input_list)
    for i in input_list:
        if type(i) != type(1.1):
            if type(i) != type(1):
                raise TypeError("Input list's element is not float or int!", input_list)
    if len(input_list) != n:
        raise RuntimeError("Length of input list is not equal to stars' number!", input_list)
            
def on_orbit_obs_position(input_ra_list, input_dec_list, input_pmra_list, input_pmdec_list, input_rv_list, input_parallax_list, input_nstars, input_x, input_y, input_z, input_vx, input_vy, input_vz, input_epoch, input_date_str, input_time_str, lib_path):
    #Check input parameters
    if not isinstance(input_nstars, int):
        raise TypeError("Parameter 7 is not int!", input_nstars)
    
    checkInputList(input_ra_list, input_nstars)
    checkInputList(input_dec_list, input_nstars)
    checkInputList(input_pmra_list, input_nstars)
    checkInputList(input_pmdec_list, input_nstars)
    checkInputList(input_rv_list, input_nstars)
    checkInputList(input_parallax_list, input_nstars)
    
    if not isinstance(input_x, float):
        raise TypeError("Parameter 8 is not double!", input_x)
    if not isinstance(input_y, float):
        raise TypeError("Parameter 9 is not double!", input_y)
    if not isinstance(input_z, float):
        raise TypeError("Parameter 10 is not double!", input_z)
    if not isinstance(input_vx, float):
        raise TypeError("Parameter 11 is not double!", input_vx)
    if not isinstance(input_vy, float):
        raise TypeError("Parameter 12 is not double!", input_vy)
    if not isinstance(input_vz, float):
        raise TypeError("Parameter 13 is not double!", input_vz)
    #Convert km -> m
    input_x = input_x*1000.0 
    input_y = input_y*1000.0 
    input_z = input_z*1000.0
    input_vx = input_vx*1000.0
    input_vy = input_vy*1000.0
    input_vz  = input_vz*1000.0
    
    if not isinstance(input_date_str, str):
        raise TypeError("Parameter 15 is not string!", input_date_str)
    else:
        input_date_str = input_date_str.strip()
        if not (input_date_str[4]=="-" and input_date_str[7]=="-"):
            raise TypeError("Parameter 15 format error (1)!", input_date_str)
        else:
            tmp = input_date_str.split("-")
            if len(tmp) != 3:
                raise TypeError("Parameter 15 format error (2)!", input_date_str)
            input_year = int(tmp[0])
            input_month = int(tmp[1])
            input_day = int(tmp[2])
            if not (input_year>=1900 and input_year<=2100):
                raise TypeError("Parameter 15 year range error [1900 ~ 2100]!", input_year)
            if not (input_month>=1 and input_month<=12):
                raise TypeError("Parameter 15 month range error [1 ~ 12]!", input_month)
            if not (input_day>=1 and input_day<=31):
                raise TypeError("Parameter 15 day range error [1 ~ 31]!", input_day)
    
    if not isinstance(input_time_str, str):
        raise TypeError("Parameter 16 is not string!", input_time_str)
    else:
        input_time_str = input_time_str.strip()
        if not (input_time_str[2]==":" and input_time_str[5]==":"):
            raise TypeError("Parameter 16 format error (1)!", input_time_str)
        else:
            tmp = input_time_str.split(":")
            if len(tmp) != 3:
                raise TypeError("Parameter 16 format error (2)!", input_time_str)
            input_hour = int(tmp[0])
            input_minute = int(tmp[1])
            input_second = float(tmp[2])
            if not (input_hour>=0 and input_hour<=23):
                raise TypeError("Parameter 16 hour range error [0 ~ 23]!", input_hour)
            if not (input_minute>=0 and input_minute<=59):
                raise TypeError("Parameter 16 minute range error [0 ~ 59]!", input_minute)
            if not (input_second>=0 and input_second<60.0):
                raise TypeError("Parameter 16 second range error [0 ~ 60)!", input_second)
    #Inital dynamic lib
    shao = cdll.LoadLibrary(lib_path)
    shao.onOrbitObs.restype = c_int
    
    d3 = c_double * 3
    shao.onOrbitObs.argtypes = [c_double, c_double, c_double, c_double, c_double, c_double, \
                                c_int, c_int, c_int, c_int, c_int, c_double, \
                                c_double, POINTER(d3), POINTER(d3), \
                                c_int, c_int, c_int, c_int, c_int, c_double, \
                                POINTER(c_double), POINTER(c_double) ]
    output_ra_list = list()
    output_dec_list = list()
    for i in range(input_nstars):
        input_ra = c_double(input_ra_list[i])
        input_dec = c_double(input_dec_list[i])
        input_pmra = c_double(input_pmra_list[i])
        input_pmdec = c_double(input_pmdec_list[i])
        input_rv = c_double(input_rv_list[i])
        input_parallax = c_double(input_parallax_list[i])
        p3 = d3(input_x, input_y, input_z)
        v3 = d3(input_vx, input_vy, input_vz)
        input_year_c = c_int(input_year)
        input_month_c = c_int(input_month)
        input_day_c = c_int(input_day) 
        input_hour_c = c_int(input_hour)
        input_minute_c = c_int(input_minute)
        input_second_c  = c_double(input_second)
        DAT = c_double(37.0)
        output_ra = c_double(0.0)
        output_dec = c_double(0.0)
        rs = shao.onOrbitObs(input_ra, input_dec, input_pmra, input_pmdec, input_rv, input_parallax, \
                             input_year_c, input_month_c, input_day_c, input_hour_c, input_minute_c, input_second_c, \
                             DAT, byref(p3), byref(v3), \
                             input_year_c, input_month_c, input_day_c, input_hour_c, input_minute_c, input_second_c, \
                             byref(output_ra), byref(output_dec))
        if rs != 0:
            raise RuntimeError("Calculate error!")
        output_ra_list.append(output_ra.value)
        output_dec_list.append(output_dec.value)
    return np.array(output_ra_list), np.array(output_dec_list)
+0 −0

Empty file added.

+4 −7
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@ import galsim
import os
from astropy.time import Time as asTime

def ConfigDir(config, work_dir=None, data_dir=None):
def config_dir(config, work_dir=None, data_dir=None):
    path_dict = {}
    # Working directory
    if work_dir == None:
@@ -19,7 +19,6 @@ def ConfigDir(config, work_dir=None, data_dir=None):
        path_dict["data_dir"] = data_dir
    # Data sub-catalogs
    # Object catalog direcotry
    # path_dict["cat_dir"] = os.path.join(path_dict["data_dir"], "catalog_points_7degree2/", cat_dir)
    path_dict["cat_dir"] = os.path.join(path_dict["data_dir"], config["input_path"]["cat_dir"])
    # PSF data directory
    path_dict["psf_dir"] = os.path.join(path_dict["data_dir"], config["psf_setting"]["psf_dir"])
@@ -27,8 +26,6 @@ def ConfigDir(config, work_dir=None, data_dir=None):
    # SED catalog directory
    # TODO: SED_dir is deprecated
    path_dict["SED_dir"] = os.path.join(path_dict["data_dir"], "imageSims/Catalog/SEDObject")
    # path_dict["template_dir"] = path_dict["data_dir"] + "Templates/"
    # path_dict["template_dir"] = os.path.join(path_dict["data_dir"], config["SED_templates_path"]["galaxy_SED"])
    # Directories/files for instrument parameters, e.g. efficiency curves.
    path_dict["filter_dir"] = os.path.join(path_dict["data_dir"], config["Efficiency_curve_path"]["filter_eff"])
    path_dict["ccd_dir"] = os.path.join(path_dict["data_dir"], config["Efficiency_curve_path"]["ccd_eff"])
@@ -44,7 +41,7 @@ def ConfigDir(config, work_dir=None, data_dir=None):

    return path_dict

def ReadConfig(config_filename):
def read_config(config_filename):
    """Read in a configuration file and return the corresponding dict(s).

    Parameters:
@@ -73,10 +70,10 @@ def ReadConfig(config_filename):
        else:
            print("!! Something is wrong with parameter '%s'."%row[0])
            return
    config = ParseConfig(config)
    config = parse_config(config)
    return config

def ParseConfig(config):
def parse_config(config):
    """Parse the config values to the right type

    Parameters:
Loading