From 6078791f13f93c2f009f465c316a8aa88c2eed7e Mon Sep 17 00:00:00 2001 From: yuedong Date: Fri, 17 Dec 2021 16:39:36 +0800 Subject: [PATCH] first commit of user-customizable catalog version --- Catalog/C3Catalog.py | 198 ++++++++++++++++ Catalog/Catalog_example.py | 198 ++++++++++++++++ .../__pycache__/ImageHeader.cpython-37.pyc | Bin 8881 -> 0 bytes .../__pycache__/ImageHeader.cpython-38.pyc | Bin 7752 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 281 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 287 -> 0 bytes .../__pycache__/ChipOutput.cpython-38.pyc | Bin 4518 -> 0 bytes .../Config/__pycache__/Config.cpython-38.pyc | Bin 2924 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 293 -> 0 bytes .../Chip/__pycache__/Chip.cpython-38.pyc | Bin 16168 -> 0 bytes .../Chip/__pycache__/Effects.cpython-38.pyc | Bin 18173 -> 0 bytes .../Chip/__pycache__/__init__.cpython-38.pyc | Bin 211 -> 0 bytes ObservationSim/Instrument/Filter.py | 7 + .../__pycache__/Chip.cpython-37.pyc | Bin 3621 -> 0 bytes .../__pycache__/Chip.cpython-38.pyc | Bin 4624 -> 0 bytes .../__pycache__/Filter.cpython-37.pyc | Bin 1305 -> 0 bytes .../__pycache__/Filter.cpython-38.pyc | Bin 2851 -> 0 bytes .../__pycache__/FilterParam.cpython-37.pyc | Bin 2529 -> 0 bytes .../__pycache__/FilterParam.cpython-38.pyc | Bin 2510 -> 0 bytes .../__pycache__/FocalPlane.cpython-37.pyc | Bin 3756 -> 0 bytes .../__pycache__/FocalPlane.cpython-38.pyc | Bin 3577 -> 0 bytes .../__pycache__/Telescope.cpython-37.pyc | Bin 584 -> 0 bytes .../__pycache__/Telescope.cpython-38.pyc | Bin 1376 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 320 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 336 -> 0 bytes .../__pycache__/_util.cpython-37.pyc | Bin 588 -> 0 bytes .../__pycache__/_util.cpython-38.pyc | Bin 580 -> 0 bytes ObservationSim/MockObject/Catalog.py | 74 +----- ObservationSim/MockObject/CatalogBase.py | 85 +++++++ ObservationSim/MockObject/Galaxy.py | 152 ++++++------ ObservationSim/MockObject/MockObject.py | 5 +- .../__pycache__/SpecDisperser.cpython-38.pyc | Bin 13950 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 285 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 280 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 293 -> 0 bytes .../disperse.cpython-38-x86_64-linux-gnu.so | Bin 241400 -> 241480 bytes .../interp.cpython-38-x86_64-linux-gnu.so | Bin 474016 -> 474088 bytes ObservationSim/MockObject/Star.py | 104 ++++---- ObservationSim/MockObject/__init__.py | 1 + .../__pycache__/Catalog.cpython-38.pyc | Bin 5754 -> 0 bytes .../__pycache__/Galaxy.cpython-37.pyc | Bin 3253 -> 0 bytes .../__pycache__/Galaxy.cpython-38.pyc | Bin 11441 -> 0 bytes .../__pycache__/MockObject.cpython-37.pyc | Bin 3410 -> 0 bytes .../__pycache__/MockObject.cpython-38.pyc | Bin 8863 -> 0 bytes .../__pycache__/Quasar.cpython-37.pyc | Bin 898 -> 0 bytes .../__pycache__/Quasar.cpython-38.pyc | Bin 3137 -> 0 bytes .../SkybackgroundMap.cpython-38.pyc | Bin 3021 -> 0 bytes .../__pycache__/Star.cpython-37.pyc | Bin 891 -> 0 bytes .../__pycache__/Star.cpython-38.pyc | Bin 3857 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 283 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 362 -> 0 bytes .../__pycache__/_util.cpython-37.pyc | Bin 1918 -> 0 bytes .../__pycache__/_util.cpython-38.pyc | Bin 17093 -> 0 bytes ObservationSim/MockObject/_util.py | 18 +- ObservationSim/ObservationSim.py | 115 +++------ .../__pycache__/PSFConfig.cpython-37.pyc | Bin 4297 -> 0 bytes .../__pycache__/PSFConfig.cpython-38.pyc | Bin 4478 -> 0 bytes .../__pycache__/PSFInterp.cpython-38.pyc | Bin 7067 -> 0 bytes .../__pycache__/PSFUtil.cpython-37.pyc | Bin 12951 -> 0 bytes .../__pycache__/PSFUtil.cpython-38.pyc | Bin 12794 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 217 -> 0 bytes .../FieldDistortion.cpython-38.pyc | Bin 2131 -> 0 bytes .../PSF/__pycache__/PSFGauss.cpython-38.pyc | Bin 4246 -> 0 bytes .../PSF/__pycache__/PSFModel.cpython-37.pyc | Bin 7450 -> 0 bytes .../PSF/__pycache__/PSFModel.cpython-38.pyc | Bin 1411 -> 0 bytes .../PSF/__pycache__/__init__.cpython-37.pyc | Bin 189 -> 0 bytes .../PSF/__pycache__/__init__.cpython-38.pyc | Bin 330 -> 0 bytes .../__pycache__/ChipOutput.cpython-37.pyc | Bin 3271 -> 0 bytes .../__pycache__/ChipOutput.cpython-38.pyc | Bin 3324 -> 0 bytes .../__pycache__/Config.cpython-37.pyc | Bin 2487 -> 0 bytes .../__pycache__/Config.cpython-38.pyc | Bin 3141 -> 0 bytes .../__pycache__/ObservationSim.cpython-37.pyc | Bin 7068 -> 0 bytes .../__pycache__/ObservationSim.cpython-38.pyc | Bin 8648 -> 0 bytes .../__pycache__/Pointing.cpython-38.pyc | Bin 1245 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 212 -> 0 bytes .../__pycache__/_util.cpython-37.pyc | Bin 1300 -> 0 bytes .../__pycache__/_util.cpython-38.pyc | Bin 2686 -> 0 bytes ObservationSim/_util.py | 77 ++++++ config/{config_sim.yaml => config_C3.yaml} | 13 +- config/config_example.yaml | 223 ++++++++++++++++++ example.sh | 5 + run.pbs => mpi_example.pbs | 2 +- runExposure.py | 125 ---------- run_C3.pbs | 19 ++ run_sim.py | 65 +++++ 85 files changed, 1060 insertions(+), 426 deletions(-) create mode 100644 Catalog/C3Catalog.py create mode 100644 Catalog/Catalog_example.py delete mode 100644 ObservationSim/Config/Header/__pycache__/ImageHeader.cpython-37.pyc delete mode 100644 ObservationSim/Config/Header/__pycache__/ImageHeader.cpython-38.pyc delete mode 100644 ObservationSim/Config/Header/__pycache__/__init__.cpython-37.pyc delete mode 100644 ObservationSim/Config/Header/__pycache__/__init__.cpython-38.pyc delete mode 100644 ObservationSim/Config/__pycache__/ChipOutput.cpython-38.pyc delete mode 100644 ObservationSim/Config/__pycache__/Config.cpython-38.pyc delete mode 100644 ObservationSim/Config/__pycache__/__init__.cpython-38.pyc delete mode 100644 ObservationSim/Instrument/Chip/__pycache__/Chip.cpython-38.pyc delete mode 100644 ObservationSim/Instrument/Chip/__pycache__/Effects.cpython-38.pyc delete mode 100644 ObservationSim/Instrument/Chip/__pycache__/__init__.cpython-38.pyc delete mode 100755 ObservationSim/Instrument/__pycache__/Chip.cpython-37.pyc delete mode 100644 ObservationSim/Instrument/__pycache__/Chip.cpython-38.pyc delete mode 100755 ObservationSim/Instrument/__pycache__/Filter.cpython-37.pyc delete mode 100644 ObservationSim/Instrument/__pycache__/Filter.cpython-38.pyc delete mode 100755 ObservationSim/Instrument/__pycache__/FilterParam.cpython-37.pyc delete mode 100644 ObservationSim/Instrument/__pycache__/FilterParam.cpython-38.pyc delete mode 100755 ObservationSim/Instrument/__pycache__/FocalPlane.cpython-37.pyc delete mode 100644 ObservationSim/Instrument/__pycache__/FocalPlane.cpython-38.pyc delete mode 100755 ObservationSim/Instrument/__pycache__/Telescope.cpython-37.pyc delete mode 100644 ObservationSim/Instrument/__pycache__/Telescope.cpython-38.pyc delete mode 100755 ObservationSim/Instrument/__pycache__/__init__.cpython-37.pyc delete mode 100644 ObservationSim/Instrument/__pycache__/__init__.cpython-38.pyc delete mode 100755 ObservationSim/Instrument/__pycache__/_util.cpython-37.pyc delete mode 100644 ObservationSim/Instrument/__pycache__/_util.cpython-38.pyc create mode 100644 ObservationSim/MockObject/CatalogBase.py delete mode 100644 ObservationSim/MockObject/SpecDisperser/__pycache__/SpecDisperser.cpython-38.pyc delete mode 100644 ObservationSim/MockObject/SpecDisperser/__pycache__/__init__.cpython-38.pyc delete mode 100644 ObservationSim/MockObject/SpecDisperser/disperse_c/__pycache__/__init__.cpython-37.pyc delete mode 100644 ObservationSim/MockObject/SpecDisperser/disperse_c/__pycache__/__init__.cpython-38.pyc delete mode 100644 ObservationSim/MockObject/__pycache__/Catalog.cpython-38.pyc delete mode 100755 ObservationSim/MockObject/__pycache__/Galaxy.cpython-37.pyc delete mode 100644 ObservationSim/MockObject/__pycache__/Galaxy.cpython-38.pyc delete mode 100755 ObservationSim/MockObject/__pycache__/MockObject.cpython-37.pyc delete mode 100644 ObservationSim/MockObject/__pycache__/MockObject.cpython-38.pyc delete mode 100755 ObservationSim/MockObject/__pycache__/Quasar.cpython-37.pyc delete mode 100644 ObservationSim/MockObject/__pycache__/Quasar.cpython-38.pyc delete mode 100644 ObservationSim/MockObject/__pycache__/SkybackgroundMap.cpython-38.pyc delete mode 100755 ObservationSim/MockObject/__pycache__/Star.cpython-37.pyc delete mode 100644 ObservationSim/MockObject/__pycache__/Star.cpython-38.pyc delete mode 100755 ObservationSim/MockObject/__pycache__/__init__.cpython-37.pyc delete mode 100644 ObservationSim/MockObject/__pycache__/__init__.cpython-38.pyc delete mode 100755 ObservationSim/MockObject/__pycache__/_util.cpython-37.pyc delete mode 100644 ObservationSim/MockObject/__pycache__/_util.cpython-38.pyc delete mode 100644 ObservationSim/PSF/PSFInterp/__pycache__/PSFConfig.cpython-37.pyc delete mode 100644 ObservationSim/PSF/PSFInterp/__pycache__/PSFConfig.cpython-38.pyc delete mode 100644 ObservationSim/PSF/PSFInterp/__pycache__/PSFInterp.cpython-38.pyc delete mode 100644 ObservationSim/PSF/PSFInterp/__pycache__/PSFUtil.cpython-37.pyc delete mode 100644 ObservationSim/PSF/PSFInterp/__pycache__/PSFUtil.cpython-38.pyc delete mode 100644 ObservationSim/PSF/PSFInterp/__pycache__/__init__.cpython-38.pyc delete mode 100644 ObservationSim/PSF/__pycache__/FieldDistortion.cpython-38.pyc delete mode 100644 ObservationSim/PSF/__pycache__/PSFGauss.cpython-38.pyc delete mode 100755 ObservationSim/PSF/__pycache__/PSFModel.cpython-37.pyc delete mode 100644 ObservationSim/PSF/__pycache__/PSFModel.cpython-38.pyc delete mode 100755 ObservationSim/PSF/__pycache__/__init__.cpython-37.pyc delete mode 100644 ObservationSim/PSF/__pycache__/__init__.cpython-38.pyc delete mode 100755 ObservationSim/__pycache__/ChipOutput.cpython-37.pyc delete mode 100644 ObservationSim/__pycache__/ChipOutput.cpython-38.pyc delete mode 100644 ObservationSim/__pycache__/Config.cpython-37.pyc delete mode 100644 ObservationSim/__pycache__/Config.cpython-38.pyc delete mode 100644 ObservationSim/__pycache__/ObservationSim.cpython-37.pyc delete mode 100644 ObservationSim/__pycache__/ObservationSim.cpython-38.pyc delete mode 100644 ObservationSim/__pycache__/Pointing.cpython-38.pyc delete mode 100644 ObservationSim/__pycache__/__init__.cpython-38.pyc delete mode 100755 ObservationSim/__pycache__/_util.cpython-37.pyc delete mode 100644 ObservationSim/__pycache__/_util.cpython-38.pyc rename config/{config_sim.yaml => config_C3.yaml} (95%) create mode 100644 config/config_example.yaml create mode 100755 example.sh rename run.pbs => mpi_example.pbs (82%) delete mode 100755 runExposure.py create mode 100755 run_C3.pbs create mode 100755 run_sim.py diff --git a/Catalog/C3Catalog.py b/Catalog/C3Catalog.py new file mode 100644 index 0000000..f12436c --- /dev/null +++ b/Catalog/C3Catalog.py @@ -0,0 +1,198 @@ +import os +import galsim +import random +import numpy as np +import h5py as h5 +import healpy as hp +import astropy.constants as cons +from astropy.coordinates import spherical_to_cartesian +from astropy.table import Table +from scipy import interpolate + +from ObservationSim.MockObject import CatalogBase, Star, Galaxy, Quasar +from ObservationSim.MockObject._util import seds, sed_assign, extAv, tag_sed, getObservedSED + +NSIDE = 128 + +class C3Catalog(CatalogBase): + def __init__(self, config, **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"] + self.normalize_dir = os.path.join(config["data_dir"], config["SLS_path"]["SLS_norm"]) + + 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')) + + try: + self.chip = kwargs["chip"] + except: + raise ValueError('For Cycle-3 Catalog class, must give a "chip" object to initiate') + + 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"] + self.star_path = os.path.join(self.cat_dir, star_file) + self.star_SED_path = os.path.join(config["data_dir"], star_SED_file) + self._load_SED_lib_star() + if "galaxy_cat" in config["input_path"] and config["input_path"]["galaxy_cat"]: + galaxy_file = config["input_path"]["galaxy_cat"] + self.galaxy_path = os.path.join(self.cat_dir, galaxy_file) + self.galaxy_SED_path = os.path.join(config["data_dir"], config["SED_templates_path"]["galaxy_SED"]) + self._load_SED_lib_gals() + if "rotateEll" in config["shear_setting"]: + self.rotation = float(int(config["shear_setting"]["rotateEll"]/45.)) + else: + self.rotation = 0. + + self._get_healpix_list() + self._load() + + def _get_healpix_list(self): + self.sky_coverage = self.chip.getSkyCoverageEnlarged(self.chip.img.wcs, margin=0.2) + ra_min, ra_max, dec_min, dec_max = self.sky_coverage.xmin, self.sky_coverage.xmax, self.sky_coverage.ymin, self.sky_coverage.ymax + ra = np.deg2rad(np.array([ra_min, ra_max, ra_max, ra_min])) + dec = np.deg2rad(np.array([dec_max, dec_max, dec_min, dec_min])) + vertices = spherical_to_cartesian(1., dec, ra) + self.pix_list = hp.query_polygon(NSIDE, np.array(vertices).T, inclusive=True) + print("HEALPix List: ", self.pix_list) + + def load_norm_filt(self, obj): + if obj.type == "star": + return self.normF_star + elif obj.type == "galaxy" or obj.type == "quasar": + return self.normF_galaxy + else: + return None + + def _load_SED_lib_star(self): + self.tempSED_star = h5.File(self.star_SED_path,'r') + + def _load_SED_lib_gals(self): + self.tempSed_gal, self.tempRed_gal = seds("galaxy.list", seddir=self.galaxy_SED_path) + + def _load_gals(self, gals, pix_id=None): + ngals = len(gals['galaxyID']) + self.rng_sedGal = random.Random() + self.rng_sedGal.seed(pix_id) # Use healpix index as the random seed + self.ud = galsim.UniformDeviate(pix_id) + for igals in range(ngals): + param = self.initialize_param() + param['ra'] = gals['ra_true'][igals] + param['dec'] = gals['dec_true'][igals] + param['z'] = gals['redshift_true'][igals] + param['model_tag'] = 'None' + param['gamma1'] = 0 + param['gamma2'] = 0 + param['kappa'] = 0 + param['delta_ra'] = 0 + param['delta_dec'] = 0 + sersicB = gals['sersic_bulge'][igals] + hlrMajB = gals['size_bulge_true'][igals] + hlrMinB = gals['size_minor_bulge_true'][igals] + sersicD = gals['sersic_disk'][igals] + hlrMajD = gals['size_disk_true'][igals] + hlrMinD = gals['size_minor_disk_true'][igals] + aGal = gals['size_true'][igals] + bGal = gals['size_minor_true'][igals] + param['bfrac'] = gals['bulge_to_total_ratio_i'][igals] + param['theta'] = gals['position_angle_true'][igals] + param['hlr_bulge'] = np.sqrt(hlrMajB * hlrMinB) + param['hlr_disk'] = np.sqrt(hlrMajD * hlrMinD) + param['ell_bulge'] = (hlrMajB - hlrMinB)/(hlrMajB + hlrMinB) + param['ell_disk'] = (hlrMajD - hlrMinD)/(hlrMajD + hlrMinD) + param['ell_tot'] = (aGal - bGal) / (aGal + bGal) + + # Assign each galaxy a template SED + param['sed_type'] = sed_assign(phz=param['z'], btt=param['bfrac'], rng=self.rng_sedGal) + param['redden'] = self.tempRed_gal[param['sed_type']] + param['av'] = self.avGal[int(self.ud()*self.nav)] + if param['sed_type'] <= 5: + param['av'] = 0.0 + param['redden'] = 0 + param['star'] = 0 # Galaxy + if param['sed_type'] >= 29: + 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 + + if param['star'] == 0: + obj = Galaxy(param, self.rotation) + self.objs.append(obj) + if param['star'] == 2: + obj = Quasar(param) + self.objs.append(obj) + + def _load_stars(self, stars, pix_id=None): + nstars = len(stars['sourceID']) + for istars in range(nstars): + param = self.initialize_param() + param['ra'] = stars['RA'][istars] + param['dec'] = stars['Dec'][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] + if param['mag_use_normal'] >= 26.5: + continue + self.ids += 1 + param['id'] = self.ids + param['sed_type'] = stars['sourceID'][istars] + param['model_tag'] = stars['model_tag'][istars] + param['teff'] = stars['teff'][istars] + param['logg'] = stars['grav'][istars] + param['feh'] = stars['feh'][istars] + param['z'] = 0.0 + param['star'] = 1 # Star + obj = Star(param) + self.objs.append(obj) + + def _load(self, **kwargs): + self.nav = 15005 + self.avGal = extAv(self.nav, seed=self.seed_Av) + gals_cat = h5.File(self.galaxy_path, 'r')['galaxies'] + star_cat = h5.File(self.star_path, 'r')['catalog'] + self.objs = [] + self.ids = 0 + for pix in self.pix_list: + gals = gals_cat[str(pix)] + stars = star_cat[str(pix)] + self._load_gals(gals, pix_id=pix) + self._load_stars(stars, pix_id=pix) + print("number of objects in catalog: ", len(self.objs)) + del self.avGal + + + def load_sed(self, obj, **kwargs): + if obj.type == 'star': + _, wave, flux = tag_sed( + h5file=self.tempSED_star, + model_tag=obj.param['model_tag'], + teff=obj.param['teff'], + logg=obj.param['logg'], + feh=obj.param['feh'] + ) + elif obj.type == 'galaxy' or obj.type == 'quasar': + sed_data = getObservedSED( + sedCat=self.tempSed_gal[obj.sed_type], + redshift=obj.z, + av=obj.param["av"], + redden=obj.param["redden"] + ) + wave, flux = sed_data[0], sed_data[1] + else: + raise ValueError("Object type not known") + speci = interpolate.interp1d(wave, flux) + # lamb = np.arange(2500, 10001 + 0.5, 0.5) + lamb = np.arange(2400, 11001 + 0.5, 0.5) + y = speci(lamb) + # erg/s/cm2/A --> photo/s/m2/A + all_sed = y * lamb / (cons.h.value * cons.c.value) * 1e-13 + sed = Table(np.array([lamb, all_sed]).T, names=('WAVELENGTH', 'FLUX')) + return sed diff --git a/Catalog/Catalog_example.py b/Catalog/Catalog_example.py new file mode 100644 index 0000000..c8af865 --- /dev/null +++ b/Catalog/Catalog_example.py @@ -0,0 +1,198 @@ +import os +import numpy as np +import astropy.constants as cons +from astropy.table import Table +from scipy import interpolate + +from ObservationSim.MockObject import CatalogBase, Star, Galaxy, Quasar + +class Catalog_example(CatalogBase): + """An user customizable class for reading in catalog(s) of objects and SEDs. + + NOTE: must inherit the "CatalogBase" abstract class + + ... + + Attributes + ---------- + cat_dir : str + a directory that contains the catalog file(s) + star_path : str + path to the star catalog file + star_SED_path : str + path to the star SED data + objs : list + a list of ObservationSim.MockObject (Star, Galaxy, or Quasar) + NOTE: must have "obj" list when implement your own Catalog + + Methods + ---------- + load_sed(obj, **kwargs): + load the corresponding SED data for one object + load_norm_filt(obj): + load the filter throughput for the input catalog's photometric system. + """ + + def __init__(self, config, **kwargs): + """Constructor method. + + Parameters + ---------- + config : dict + configuration dictionary which is parsed from the input YAML file + **kwargs : dict + other needed input parameters (in key-value pairs), please modify corresponding + initialization call in "ObservationSim.py" as you need. + + Returns + ---------- + None + """ + + super().__init__() + self.cat_dir = os.path.join(config["data_dir"], config["input_path"]["cat_dir"]) + 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"] + self.star_path = os.path.join(self.cat_dir, star_file) + self.star_SED_path = os.path.join(config["data_dir"], star_SED_file) + # NOTE: must call _load() method here to read in all objects + self.objs = [] + self._load() + + def _load(self, **kwargs): + """Read in all objects in from the catalog file(s). + + This is a must implemented method which is used to read in all objects, and + then convert them to ObservationSim.MockObject (Star, Galaxy, or Quasar). + + Currently, + the model of ObservationSim.MockObject.Star class requires: + param["star"] : int + specify the object type: 0: galaxy, 1: star, 2: quasar + param["id"] : int + ID number of the object + param["ra"] : float + Right ascension (in degrees) + param["dec"] : float + Declination (in degrees) + param["mag_use_normal"]: float + the absolute magnitude in a particular filter + NOTE: if that filter is not the corresponding CSST filter, the + load_norm_filt(obj) function must be implemented to load the filter + throughput of that particular photometric system + + the model of ObservationSim.MockObject.Galaxy class requires: + param["star"] : int + specify the object type: 0: galaxy, 1: star, 2: quasar + param["id"] : int + ID number of the object + param["ra"] : float + Right ascension (in degrees) + param["dec"] : float + Declination (in degrees) + param["mag_use_normal"]: float + the absolute magnitude in a particular filter + NOTE: if that filter is not the corresponding CSST filter, the + load_norm_filt(obj) function must be implemented to load the filter + throughput of that particular photometric system + param["theta"] : float + the position angle (in degrees) + param["bfrac"] : float + the bulge fraction + param["hlr_bulge] : float + the half-light-radius of the bulge + param["hlr_disk] : float + the half-light-radius of the disk + param["ell_bulge] : float + the ellipticity of the bulge + param["ell_disk] : float + the ellipticity of the disk + param["ell_tot] : float + the total ellipticity + the model of ObservationSim.MockObject.Galaxy class requires: + Currently a Quasar is modeled as a point source, just like a Star. + + NOTE: To construct an object, according to its type, just call: + Star(param), Galaxy(param), or Quasar(param) + + NOTE: All constructed objects should be appened to "self.objs". + + Parameters + ---------- + **kwargs : dict + other needed input parameters (in key-value pairs), please modify corresponding + initialization call in "ObservationSim.py" as you need. + + Returns + ---------- + None + """ + + stars = Table.read(self.star_path) + nstars = stars['sourceID'].size + for istars in range(nstars): + param = self.initialize_param() + param['id'] = istars + 1 + param['ra'] = stars['RA'][istars] + param['dec'] = stars['Dec'][istars] + param['sed_type'] = stars['sourceID'][istars] + param['model_tag'] = stars['model_tag'][istars] + param['z'] = 0.0 + param['star'] = 1 # Star + param['mag_use_normal'] = stars['app_sdss_g'][istars] + obj = Star(param) + self.objs.append(obj) + + def load_sed(self, obj, **kwargs): + """Load the corresponding SED data for a particular obj. + + Parameters + ---------- + obj : ObservationSim.MockObject + the object to get SED data for + **kwargs : dict + other needed input parameters (in key-value pairs), please modify corresponding + initialization call in "ObservationSim.py" as you need. + + Returns + ---------- + sed : Astropy.Table + the SED Table with two columns (namely, "WAVELENGTH", "FLUX"): + sed["WAVELENGTH"] : wavelength in Angstroms + sed["FLUX"] : fluxes in photons/s/m^2/A + NOTE: the range of wavelengthes must at least cover [2450 - 11000] Angstorms + """ + + if obj.type == 'star': + wave = Table.read(self.star_SED_path, path=f"/SED/wave_{obj.model_tag}") + flux = Table.read(self.star_SED_path, path=f"/SED/{obj.sed_type}") + wave, flux = wave['col0'].data, flux['col0'].data + else: + raise ValueError("Object type not known") + speci = interpolate.interp1d(wave, flux) + lamb = np.arange(2400, 11001 + 0.5, 0.5) + y = speci(lamb) + # erg/s/cm^2/A --> photons/s/m^2/A + all_sed = y * lamb / (cons.h.value * cons.c.value) * 1e-13 + sed = Table(np.array([lamb, all_sed]).T, names=('WAVELENGTH', 'FLUX')) + return sed + + def load_norm_filt(self, obj): + """Load the corresponding thourghput for the input magnitude "param["mag_use_normal"]". + + NOTE: if the input magnitude is already in CSST magnitude, simply return None + + Parameters + ---------- + obj : ObservationSim.MockObject + the object to get thourghput data for + + Returns + ---------- + norm_filt : Astropy.Table + the throughput Table with two columns (namely, "WAVELENGTH", "SENSITIVITY"): + norm_filt["WAVELENGTH"] : wavelengthes in Angstroms + norm_filt["SENSITIVITY"] : efficiencies + """ + return None \ No newline at end of file diff --git a/ObservationSim/Config/Header/__pycache__/ImageHeader.cpython-37.pyc b/ObservationSim/Config/Header/__pycache__/ImageHeader.cpython-37.pyc deleted file mode 100644 index 8d4dfb7928373cd54f48c9ac5298e1b4ad691f77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8881 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 diff --git a/ObservationSim/Config/Header/__pycache__/ImageHeader.cpython-38.pyc b/ObservationSim/Config/Header/__pycache__/ImageHeader.cpython-38.pyc deleted file mode 100644 index 5fa40c48881f6052fa33c5dcaef8bd21e388b296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7752 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 diff --git a/ObservationSim/Instrument/Chip/__pycache__/Effects.cpython-38.pyc b/ObservationSim/Instrument/Chip/__pycache__/Effects.cpython-38.pyc deleted file mode 100644 index 5e2fc0e5926b1ffd19e65dd2b8aebc6b4f963435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18173 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 XGN60CLBuURo7<7wpDTLzd5`=b1}(Jl diff --git a/ObservationSim/Instrument/Chip/__pycache__/__init__.cpython-38.pyc b/ObservationSim/Instrument/Chip/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 08322b16d722afbc1f14d8449b5c2b3cb2df92ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmYjLF$%&!5Zpuy5dvc48*JPUhzQ!)Xc28}j?-I{gWO%Xy9hqX&iACXvbM8wW97ii zFv~K#hb$WcWBnM*3H!4P|42D3nPJ4DKqVCzI6?v{&0*SmB|N?-ZGTnjdh5IGJNQ1^ zPd);TjaW-BLv$WXX9zFS7Pp3!vjqli#Mvnlo+^@oaFyqK+?@jXtBl&&TpQfj5Pf5a bo4PY7gtj^gF{^LwU~ZghDq3`pyqWL?Km#{O diff --git a/ObservationSim/Instrument/Filter.py b/ObservationSim/Instrument/Filter.py index 082d6a6..5268ddc 100755 --- a/ObservationSim/Instrument/Filter.py +++ b/ObservationSim/Instrument/Filter.py @@ -14,6 +14,13 @@ class Filter(object): self._getParam(filter_param, filter_type) if self.filter_dir is not None: self.bandpass_full, self.bandpass_sub_list = self._get_bandpasses(self.filter_dir) + self.survey_type = self._getSurveyType() + + def _getSurveyType(self): + if self.filter_type in ["GI", "GV", "GU"]: + return "spectroscopic" + else: + return "photometric" def _getParam(self, filter_param, filter_type, filter_id=None): self.effective_wavelength = filter_param.param[filter_type][0] diff --git a/ObservationSim/Instrument/__pycache__/Chip.cpython-37.pyc b/ObservationSim/Instrument/__pycache__/Chip.cpython-37.pyc deleted file mode 100755 index 183388db7049dbd6fa8f3abd15c9cc2ffa283b6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3621 zcmaJ@&5s*N6|d?qw|nf#Bx5oY!b%-Bpfy67$!hsfv?Q~cNkW#DGce&p2Gr`fYMh>F zw@r0>7#q)piL^+F+a5X099Ken;KB{@A8@Y|h{MV^I06@buiADdfu*f_^{cPv_o{yN z>fNu`1BUONymz3r|#D@V0BleNlbkw>@!9EQuO=E21uzU$C|>J}*|pW%N|Vb*sB$Fq8*10`b-W&I?VIuNlsoZ%`>%dz=VJKZ?Rl9ii`B@Cily5898{-W{8 zqrZ+ny4U@6`su$v{>Sg{&4&JduX#zk`EVeW_M-@kizreq)+vufg@jL{N`hFV?IbI- z*TLpK-qH20ENGt}CTRg3)qPV(iO@?kSd0d+cQ);Vq^I3y{b44Wwsvxv?yF_e>2>mM_PA~q&i7&vmNmN0Q5(U@TzO~0D9OIVSny>?Q!qHkf zbn;!)!68#WD!8bf@?TPa{m@fFR8Ab=W#EDE488h*X3v!mA}F7Eb9T(N8gDdYP~@r4yMFPp5Sf z#3{@m3#L~H+a=9{AH?ZUK2WN!v}>GfdWx(w!|nQvvS~c(4~zE71qMfH0!GolsTC4y z3$ad!Onnn2zXieUE4I(qK`_r=VLtbn^O+^E##ao{Ub#md@|ix`m<8K38ejqkca}@; z6vPs19bx0Zy3S7diG?17t~DlX(*_qO_BtaL0AW^xq2&sLC$3p(H`todFl#&1KJhTy zrWOBpR>f#?G0%ezXvazfzyn(SYHziuocR;aSc_HoXWz&w$#VxxbjJVOj?>OCjSFeW zC`DK1;9`gXC(~D0xV^noGO<77Ej>QrfLUfe+=9N{Sj8AYB)WrEwdDRCAVfmyppR6R*QUR3tfyHR zEH78N@V&4br-)YJeTsnj4*usrc1T6b+ynI`oN%*h$f$_Ox{{Ha=-7m09heuP8>8a_ z9+^I_zvjXmtB^V$k-4QW z=6;e3dnmcNSbV%XH~E74Pce?~FZUL)o+8ZR_T51PcZ5>`9pti6NWVre|iEohj z7Kytg?vdDnKnyhz>^)%Z^`Je;%uc;_l=|wcyZK;d$q%tEr+CW{v;sc9{y(;6KDR?V zLLb$1s@o{}Hz9DQ_5osxsrfo<;9bP4wn_2lfcC=d(!5{2Bk=Z^1k!2E+-2D%cjBFMj=6}{?t~&e($@oD@ZUHm6*FF;@d-EnAzQ1`W~cHplV0A1Yk5DLb($U0ek?>e>?1B4bU~>kEy60QDvJ- zeFs>5Kpizoku$smQKW+?LP#B^glkdsvtgW;BPP!@`GBI>Szh2BLJvv2Pl8O-^;x3Z zk!gyYdy!DggO`b0#0EO&oRSU%-8X`3!CK7;eBTQ^MWanuQA{h(!Oe!f!AM)#z>K|A XS|U=Z{dY^l?^0@J?nDjY+_(M%#hydC diff --git a/ObservationSim/Instrument/__pycache__/Chip.cpython-38.pyc b/ObservationSim/Instrument/__pycache__/Chip.cpython-38.pyc deleted file mode 100644 index cae0f4b8b7eccbcc562c8e138024b1c4d41d460f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4624 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 diff --git a/ObservationSim/Instrument/__pycache__/Filter.cpython-37.pyc b/ObservationSim/Instrument/__pycache__/Filter.cpython-37.pyc deleted file mode 100755 index beccb3c2b88e83b44bac98da550f1f0b719d3a84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1305 zcmZuw&2G~`5Z?8FoRk(+0aY(teQ90*Aw&xZ2?eCU#g~=i-MDW3$J%ajm0SBD?U6^} z752(0Z-6*4vyM|LvC+=X%ue>3nQ#1NXU8Y7%HK!qr%A{!G=^n?@)~x10)i7xGZOYE z4GnFZp~VeuW_Ip`4ke&lnVY+zOUZk}ZSLFa=Xi z;%y;h(t$mGmu8KSpCcLNF-8sxGV3!r0!5IJasnApZrqU2!qR>aIRWRNkJGQUkoB}{1uu(a z85PO&MAYX^Sxt}U^DkPkI?bn_77%z5HECJQ!TeCvjcjvKG}FGcqpDLLV`-5#j3Ho+ z(1beFr&qh1nBji*pb-Yd=|*r+R`d+oZ~#;vU?b?(2A^)saBphc+}>N-wzjsdZF_4w z+IDm^-I+xGB_gl2Kzi56$l3-GxXRXjQu|`L6mgSY2zD7=h)fhoa~kgc<4t*Us{BRP z3YMjL+NhBfyjMdX;?g)3Mck=J^?An@QGA}rvMqRENgR7QMuGk6sX|sXHF5{F5eQUj z^b=!`4!^6tp``=mF;;{N&uvQ)qk+bq(QBN3m?A@Bt#ThkK>HjXf+`=M>_3aA5LM%2 zgkC+~Al~1`_!2HWw~&v(06<`JADBGc3@??>z#o_zQMuxK)ug#lRuZK}U$D*si&bNQ zn4fpEGOfh{IEDPjG37Ism%PnTpD^~Vjk5kmVp_VN@;PdUDDDg2 zf=lGzgsOzEM=lW^I#ZeSdM5lv6Iw bV0!ew{|BbLmwmRckhB`f0z~*t=*0L7hZZKs diff --git a/ObservationSim/Instrument/__pycache__/Filter.cpython-38.pyc b/ObservationSim/Instrument/__pycache__/Filter.cpython-38.pyc deleted file mode 100644 index 3a3a9a6609e559f8145ea9a1a0883548e44037d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2851 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 f^Hqe6PI~XAvzjdP2Z5YX!bTsonr9R7t diff --git a/ObservationSim/Instrument/__pycache__/FilterParam.cpython-38.pyc b/ObservationSim/Instrument/__pycache__/FilterParam.cpython-38.pyc deleted file mode 100644 index 881c1cf95e5e6c1a90ac9b8e38cc20e4e57f83e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2510 zcma(TTZ|M%aC&z3y?elkz{$hmL~s#qd8ojN?(hx?-k}GCY(j>)t=YLbc4wEF+0(tu z5)8z*iH{gX{kX$uBr!?=4ZcAzQ9(mY{AoiZA!tZ2k*JBHCRX>%ZdShRN%vIOtGlYY zs(WiXoe;3CJ>02{Bn9Cjo3u9xCkl3F0S+JlDG7Q1Px2z4hw{<}0YnJx7a*jE_l5Ei zAOk{1x{MM+UxAJ7Erb&VyE7jLUC0v1j3wv%UtqGZzO>7!y2koOpstJX~Q{+@9gFnP^1-sVeRr_elCOA(~K& zsF!P{;VM&36AYux%%vqP1#o-JyY zQLpJxv5c%^meoQ9bk){Ny5{KFH3I`%vi*aOZjWfLS+NGpa(1KTxOT0qqoy`9d#ZIB zQ&rP4T~&=R>)46{Ns$&TU& z><;NN2BUvK_T%dGwAlNMB5TGQim{ZnLs!4O zZ?Ky4rHWZ409FLz-ES$z*JrVfJrRiSd@}%kdq*+U=r>*W(=$0^diMOB$ipw>jF%5! z>ssXV?0xP?py$z-0;z}IZi>IF7+un~j)h0g=ZrJs>)!kIpVK*i&r25vi*D)-fMv%6 zV9twy__bpJF!G^dY`OUQE2rfPIpfl~?(hHH^Ht6_SwKD9b^-NpZ(RB~Fz{S+KSLh` zJV#F`#`YD*z8LxBhn(^Fs-36`?c!2L(H!p8AJHw$8=Fpi7D&~aUY&;Gd@b*D#dpGi zFLTCWd+6Dpy-%BVp*Z8&JANuqNSoXE?xbQ|+cW%;`~2~o@nq?zzYbkJnDaeI7=ITR-o1|Zwwxbl^kAh+10K6Xn%h8z}^VlgRlgNjx+6W~zN(@SDN=!;d zDXHhh4O_8q!@iN1i%iI7iEKx4$cNdv+syI)5N9Nov}x?l3><_BF|m`heg5qCScfEz zPWev(;L2D5yC(KzDOpuu)w|gyAi&n-mEa%(o-iylB$s&7m^d!%BaN^rG$Nkpk*Pu> z>V~}NJ~Aea3uEDNp%L@KYlR)fMjYw!sdx_{Pr{SDco)|GE}@YO;1I$oH!>Xc5?;tl zdMS{emKtdj!l{-_w`5wnLnDS(!dr>PR-+@Un&SlP_@c}%Dq2+L+dS(JYyZJafX^h#*M;VCsB$b$3^Ze%IPIG(`?%Y4+PCnL@@(~sdo6N9$ z#AF03A2tWkI{exGk723A9B^HN&?F-{8!fEk)hrtACrUCxQlf-6<3#K!{&kWFNsw9M z=+yNn5xgCG+N3jLUmtr0h&H<=?M~+P2)lAE46>@?<3KG}pjKjVN>z8)w31J;*}I8n zsy&ZE>|SmgcpkGrvS)+C5krBNcv! Zan?4Kdr`x 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 diff --git a/ObservationSim/Instrument/__pycache__/FocalPlane.cpython-38.pyc b/ObservationSim/Instrument/__pycache__/FocalPlane.cpython-38.pyc deleted file mode 100644 index 7997be3e03e48f50d9ffaf6c74af880e7f256906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3577 zcma)9UvC^q5ucuaJ3G5xJC2i6?l?5$a#B|Ec`pG0icTnr4Iv1YC=NPgfkxx$-u2kK zGn?*Nv%4Bchy;n3NIW2(6N#65L3{?D5FcS)?*)Gagb2Ut@vheii0jqV{JOfQs$5lF z)&AMaif>@-{AE4*^SWVtNt5MaV{#Xdx&gus&IZO_^=5nK1B08~dSP%&SkJ9Jo3mY` zZJ%PN(T#~N4-1pKc+?L;gt5oCv1js2+~W2Nwr6pNyDtpLsBsT(hu67}x62#6iFb{! z^A+C0PLHqhHE`-$+vU>#K^8}YM}sI8-LmoMAj`9%$Ym18Wcz$L0Q79*QTLf)6c%Sk zrd;bAg%KL5TUhkgGgg?~#M&UoU-z8t7{9!6Vi(3Cdu0_ix8E~fGls9u=1w(#x><3! zd%ntRgwyXro(FkKSC#u=>ZR&z?S;OQr8HW3aLQdnVU`{A*;X z4b;%c0cvXG0B^FpQ2wpvF?@&*LoZCH^nD_f+NW1Q_EvUBBF<%|;%t<}r!IJ9?M%=d zOiMoHK+f1&S zz#qc0^w|WF2_S?@0=gLtOP2Jd(1Ok(`BCBWNU1lHCc;!RtwlRTc*#Jf1aK-J(n$h=Irv4j=B7pf;=CD z;pFOUlXo~nu2vLP2AOJhC2eY(Wjz*YNKu}g!)cqzt60_^s>la4rOf#ZkJ5$2a@p+4 zvMGxI#H4&a2vaWVLbCyolOgP?@tmPp8oxEKkwI2>W_|iGKmGTcH*eakwBXM#Ol<_B zh!lFb^OiAXlhn=AjXbNgRyKQY$)@E!?^s3qwN;c}1zdD!9J#QC&F*a2Cl zaCQ6GqJn+mfSM<6ZoRS#>(F`48b)Dn7$+V$Xe>*d`a2x|{42lus*%?Yy~2S8>!o?p z#H?O0P=CWH%<9c;tgHYx3a_Xae$gnJ+I=0C$>WcuiHbR{pt0e6Q57KOyrAgd*a<3bVWOj(siIeXys_i3`5A;|e z?<`nU>}9kWa1q}j+#6)kd3q3MdE9(_Z!_2tF*2+djIt!nNiT3V%F!VPK{QF!1=-24 zAIdD(vis2hWh%Ir_R%h~eKPOD-epaXvs{-g60ZN$3p=S0DCk3j`ac#wN+x0usAMM4 zjDj(W97&8+2O<_CAB%h}Q+3fROTO-%cge*!-C39H-OhAPjjMM0t5}hE>Z~ZT3A*H0 z4-<+Uo0M#dw<)92LPStu+)O6@Bn5KFc-3x|Hg#3`A<|ra9i%kVQEA1QDlHjtl%ymr z-OANv{ZXb8%7LA-wT;H0@+2B;XPM+>jf=h%LY1rcdc7nSPteK~lP@qeDO4J=>{l1W;&BuJA=@j%><6}PEbCI>!x96*) zX$XLXgfeYKX+iTlg$U)bvgs#Kuf7IitWe8Y)9q#*%?UrZ#olKdY~8$2FczQ2ba$8! z>dcFR@pnu(%TW+MFivnMdu8gQZ5H-xl#UbJ%@!O-b8tsHZ> zCrCs%If%1kA*o(a?x#T{MYPz{*G~C$?{2#xKLIYyQBv0O?DI?xxV#09yiG*MzeA`> zg8SJxCFq3E)Q#QcuudY0#S qmVaH+THDcnES+>b98D`PyHx?y>;Fw?>3voi`8~P;>8lLg$o>N!#&FC4 diff --git a/ObservationSim/Instrument/__pycache__/Telescope.cpython-37.pyc b/ObservationSim/Instrument/__pycache__/Telescope.cpython-37.pyc deleted file mode 100755 index 369f398d22bbecf3ad259e6a3ef0de54c9378ccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 584 zcmYjOy-ve05I#EzN()^8A&_{1ECewlr~nDEv_oO(VujdLX%olT2~trvcnn^ESMr3! z#Kg|TIc=aP-FH8}@9u10^m<)Dd85bd8||kHTJh28qnbkm4xHpLCfC3z_g;Z}g1&fT zkCPEZ{ufrjAa&S^hfW{W>>&tbau`$YH*B)v1-5f5a$(X^i9t%S(228-eTiyL5I9)? zg9Ub&b@V=3dH^m{kty!7fGO+(_jeF6>v6!1g24odPWm?FSyG5f=vC_D{L77qeC?)K zDwU-w8+TQ$vYaJaBoVc~5&44+RHBpO9drjPe}?g$5!%G_TJTa%9uhf;uY{RZrHU^{ zquU0U$%=S*kA+W3m6dXY;f*wvt_vZn`0u_)YHmZuGMQD3xu-TE0+0<7k}i4P{x58c zA~J}4$B}p)#%!0dqU3e%{4K^F>m*;E=uK?Yth@&9pLP4R#yKHrV(b~nx=?c+VA5`s a_fwHp&Cwd&J%DySYHln}uJ%g_R diff --git a/ObservationSim/Instrument/__pycache__/Telescope.cpython-38.pyc b/ObservationSim/Instrument/__pycache__/Telescope.cpython-38.pyc deleted file mode 100644 index dae2816701485d0eebfc28213839a1e2a6ac0086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1376 zcmZWo&2A($5VqYv(>-Ja3b0EMNX-S&(u%o9D_D_TR$KNFr%Pmh?H1Oa`xs3>3QzmVuy8}8nIHJzEqX6Mcb)Gfe1GPb(}{q?e`!g9SA1_p#GMcPhe#S1TBu9L5>4C zBOehNeh3n*!N5kp?*?)e4(uAwMv_4G(c%=qa6Ive)S^~SnSV`xe*2EWMjjiC>{-)! z*6HQ6>pNX>VU+Oi^Hb%xDob5x)fDUH^iIzMA6iwFKI()Kwf~^)+_SPg>dh;~JKqa}yv7>em1fela=#)MHd9i=zeB)T)rEf+GN(^(X zdkKoen$t_RVGe43NuQEm_cl=9D|Ssb;rYG{HjyTqcwn&eXfqimR{`wc8p4{mXaEiz zkV`tmE(Se7{V_Rz1Q?TRLdg&#t1jMVFO-m(ZZfx0*e_x<{uhq#;lOzfX}G2Rqcb&+>Z=LAKxxM~2{i$9F{+W3-%&$(x5@|4$BncJp?| z4t)V0c4QvCc=-RwqfgEji#$e3H_&9x{gm^%m3@W!9_Q!1sJ1(1h5_-G=JWfZ@x__3 z1{e$Nc!h-h1HR=} A;{X5v diff --git a/ObservationSim/Instrument/__pycache__/__init__.cpython-37.pyc b/ObservationSim/Instrument/__pycache__/__init__.cpython-37.pyc deleted file mode 100755 index 274d5de542491de8323c9f2b94a2b8c2677f187b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmXw!&q@O^5Qmf9?6y{W^da`rynu*UDR`-cZ7;cm*o`%qKTDDo`ZC^qrCvSx1cE1L zwm3t+`F=2jdA5y;%0Zm1!d}^pRUX&a^40X~ zri%EcSRxprLezjy5+~@0-!dUaR@jP9bcm*cT z>B3q5{Qc7DbbeVb7X<6!>sEc>`<=u8DlpvRjTt@ZsU<)Jq1g*dfeJc#X$vSsF*&m( zl%kxxvJ9AD=ygk)*$>4r4Lx7&wbilngT_#AjZHeBU0-acf&z?-t?!iGS>J!t->+~G9p-n#>j24v@ZEdy?%qUM{n u-Sg+ysKdKT#=F)4e{?a05j0Mc(m0c(ycll`6tzMB^3^^kYV1UgbLG%gV&FIM z9~k=+D#3*K0c2odLSpRHiRU0hC7$Kae)fCc`}};gx0fKW=GS33coxet4^B89P z06-vtE5z`y5=LMpRiFbFU?c(-ija-Oh>gWqOx`0l5qOEx=qF^N7b)%|!JTxamg?sI zm!s9!PYVS%&)X2mf$`!Agt#3E;inR^B??VT9 bcOZhZK6e8lkrO~yZ<8Xd`>w?98zez~4YKu_O%yPC=7 z=IYZ|`F45+Vt*roRS=rPbo-Dz+M-+N0(-p0`{;sf36SFROL|%gDzvb2L(PgdrSV2n z<|(7HS_@5Iv$d#&mcC5WPny7A-Ui0lZ?^()Vm_E`hQ zoHsTrjS|_4X}M_yH(F+{QpK6!qOfob=0rAMEKV1d%8r*#*fsN&(E&cu;I&l($coli z^_^zZ-T2dvM}2$Z(8?f*;uy!+20R&eL)|JUCA#T|aW*tP58j{Ka0h)=Z*(V(;YSzW UQ--&-xF4>~g(m~7WPo9i-*bJMqW}N^ diff --git a/ObservationSim/MockObject/Catalog.py b/ObservationSim/MockObject/Catalog.py index d99f9ce..a86d36f 100644 --- a/ObservationSim/MockObject/Catalog.py +++ b/ObservationSim/MockObject/Catalog.py @@ -33,14 +33,14 @@ class Catalog(object): # star_file = 'stars_ccd' + chip.getChipLabel(chip.chipID) + '_p_RA'+str(self.pRa) + '_DE' + str(self.pDec) + '.hdf5' # galaxy_file = 'galaxies_ccd' + chip.getChipLabel(chip.chipID) + '_p_RA'+str(self.pRa) + '_DE' + str(self.pDec) + '.hdf5' - if "star_cat" in config["input_path"]: + 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"] self.star_path = os.path.join(self.cat_dir, star_file) self.star_SED_path = os.path.join(config["data_dir"], star_SED_file) self._load_SED_lib_star() - if "galaxy_cat" in config["input_path"]: + if "galaxy_cat" in config["input_path"] and config["input_path"]["galaxy_cat"]: galaxy_file = config["input_path"]["galaxy_cat"] self.galaxy_path = os.path.join(self.cat_dir, galaxy_file) self.galaxy_SED_path = os.path.join(config["data_dir"], config["SED_templates_path"]["galaxy_SED"]) @@ -86,7 +86,6 @@ class Catalog(object): self.rng_sedGal = random.Random() self.rng_sedGal.seed(pix_id) # Use healpix index as the random seed self.ud = galsim.UniformDeviate(pix_id) - # print(ngals) for igals in range(ngals): param = {} param['ra'] = gals['ra_true'][igals] @@ -143,7 +142,6 @@ class Catalog(object): def _load_stars(self, stars, pix_id=None): nstars = len(stars['sourceID']) - # print(nstars) for istars in range(nstars): param = {} param['ra'] = stars['RA'][istars] @@ -168,10 +166,6 @@ class Catalog(object): def _load(self): self.nav = 15005 self.avGal = extAv(self.nav, seed=self.seed_Av) - # gals = Table.read(self.galaxy_path) - # stars = Table.read(self.star_path) - # self.ngals = gals['galaxyID'].size - # self.nstars = stars['sourceID'].size gals_cat = h5.File(self.galaxy_path, 'r')['galaxies'] star_cat = h5.File(self.star_path, 'r')['catalog'] self.objs = [] @@ -182,66 +176,4 @@ class Catalog(object): self._load_gals(gals, pix_id=pix) self._load_stars(stars, pix_id=pix) print("number of objects in catalog: ", len(self.objs)) - del self.avGal - # for igals in range(self.ngals): - # param = {} - # param['id'] = igals + 1 - # param['ra'] = gals['ra_true'][igals] - # param['dec'] = gals['dec_true'][igals] - # param['z'] = gals['redshift_true'][igals] - # param['model_tag'] = 'None' - # param['gamma1'] = 0 - # param['gamma2'] = 0 - # param['kappa'] = 0 - # param['delta_ra'] = 0 - # param['delta_dec'] = 0 - # sersicB = gals['sersic_bulge'][igals] - # hlrMajB = gals['size_bulge_true'][igals] - # hlrMinB = gals['size_minor_bulge_true'][igals] - # sersicD = gals['sersic_disk'][igals] - # hlrMajD = gals['size_disk_true'][igals] - # hlrMinD = gals['size_minor_disk_true'][igals] - # aGal = gals['size_true'][igals] - # bGal = gals['size_minor_true'][igals] - # param['bfrac'] = gals['bulge_to_total_ratio_i'][igals] - # param['theta'] = gals['position_angle_true'][igals] - # param['hlr_bulge'] = np.sqrt(hlrMajB * hlrMinB) - # param['hlr_disk'] = np.sqrt(hlrMajD * hlrMinD) - # param['ell_bulge'] = (hlrMajB - hlrMinB)/(hlrMajB + hlrMinB) - # param['ell_disk'] = (hlrMajD - hlrMinD)/(hlrMajD + hlrMinD) - # param['ell_tot'] = (aGal - bGal) / (aGal + bGal) - - # # Assign each galaxy a template SED - # param['sed_type'] = sed_assign(phz=param['z'], btt=param['bfrac'], rng=self.rng_sedGal) - # param['redden'] = self.tempRed_gal[param['sed_type']] - # param['av'] = avGal[int(self.ud()*nav)] - # if param['sed_type'] <= 5: - # param['av'] = 0.0 - # param['redden'] = 0 - # param['star'] = 0 # Galaxy - # if param['sed_type'] >= 29: - # param['av'] = 0.6 * param['av'] / 3.0 # for quasar, av=[0, 0.2], 3.0=av.max-av.im - # param['star'] = 2 # Quasar - # param['mag_use_normal'] = gals['mag_true_g_lsst'][igals] - # if param['star'] == 0: - # obj = Galaxy(param, self.rotation) - # self.objs.append(obj) - # if param['star'] == 2: - # obj = Quasar(param) - # self.objs.append(obj) - - # for istars in range(self.nstars): - # param = {} - # param['id'] = self.ngals + istars + 1 - # param['ra'] = stars['RA'][istars] - # param['dec'] = stars['Dec'][istars] - # param['sed_type'] = stars['sourceID'][istars] - # param['model_tag'] = stars['model_tag'][istars] - # param['z'] = 0.0 - # param['star'] = 1 # Star - # param['mag_use_normal'] = stars['app_sdss_g'][istars] - # obj = Star(param) - # self.objs.append(obj) - # del gals - # del stars - # del avGal \ No newline at end of file + del self.avGal \ No newline at end of file diff --git a/ObservationSim/MockObject/CatalogBase.py b/ObservationSim/MockObject/CatalogBase.py new file mode 100644 index 0000000..bcb287e --- /dev/null +++ b/ObservationSim/MockObject/CatalogBase.py @@ -0,0 +1,85 @@ +import numpy as np +import galsim +import copy + +from astropy.table import Table +from abc import abstractmethod, ABCMeta +from ObservationSim.MockObject._util import integrate_sed_bandpass, getNormFactorForSpecWithABMAG, getABMAG + + +class CatalogBase(metaclass=ABCMeta): + def __init__(self): + pass + + @abstractmethod + def load_sed(self, obj, **kward): + pass + + @abstractmethod + def _load(self, **kward): + pass + + @abstractmethod + def load_norm_filt(self, obj): + return None + + @staticmethod + def initialize_param(): + param = { + "star":-1, + "id":-1, + "ra":0, + "dec":0, + "z":0, + "sed_type":-1, + "model_tag":"unknown", + "mag_use_normal":100, + "theta":0, + "kappa":0, + "gamma1":0, + "gamma2":0, + "bfrac":0, + "hlr_bulge":0, + "hlr_disk":0, + "ell_bulge":0, + "ell_disk":0, + "ell_tot":0, + "teff":0, + "logg":0, + "feh":0 + } + return param + + @staticmethod + def convert_sed(mag, sed, target_filt, norm_filt=None): + bandpass = target_filt.bandpass_full + + if norm_filt is not None: + norm_thr_rang_ids = norm_filt['SENSITIVITY'] > 0.001 + else: + norm_filt = Table( + np.array(np.array([bandpass.wave_list*10.0, bandpass.func(bandpass.wave_list)])).T, names=(['WAVELENGTH', 'SENSITIVITY']) + ) + norm_thr_rang_ids = norm_filt['SENSITIVITY'] > 0.001 + + sedNormFactor = getNormFactorForSpecWithABMAG(ABMag=mag, + spectrum=sed, + norm_thr=norm_filt, + sWave=np.floor(norm_filt[norm_thr_rang_ids][0][0]), + eWave=np.ceil(norm_filt[norm_thr_rang_ids][-1][0])) + sed_photon = copy.copy(sed) + sed_photon = np.array([sed_photon['WAVELENGTH'], sed_photon['FLUX']*sedNormFactor]).T + sed_photon = galsim.LookupTable(x=np.array(sed_photon[:, 0]), f=np.array(sed_photon[:, 1]), interpolant='nearest') + # Get magnitude + sed_photon = galsim.SED(sed_photon, wave_type='A', flux_type='1', fast=False) + interFlux = integrate_sed_bandpass(sed=sed_photon, bandpass=bandpass) + mag_csst = getABMAG( + interFlux=interFlux, + bandpass=bandpass + ) + if target_filt.survey_type == "photometric": + return sed_photon, mag_csst + elif target_filt.survey_type == "spectroscopic": + del sed_photon + return sed, mag_csst + \ No newline at end of file diff --git a/ObservationSim/MockObject/Galaxy.py b/ObservationSim/MockObject/Galaxy.py index fdaa80f..8462114 100755 --- a/ObservationSim/MockObject/Galaxy.py +++ b/ObservationSim/MockObject/Galaxy.py @@ -28,65 +28,65 @@ class Galaxy(MockObject): if rotation is not None: self.rotateEllipticity(rotation) - def load_SED(self, survey_type, sed_path=None, cosids=None, objtypes=None, sed_templates=None, normFilter=None, target_filt=None): - if survey_type == "photometric": - norm_thr_rang_ids = normFilter['SENSITIVITY'] > 0.001 - if sed_templates is None: - # Read SED data directly - itype = objtypes[cosids==self.sed_type][0] - sed_file = os.path.join(sed_path, itype + "_ID%s.sed"%(self.sed_type)) - if not os.path.exists(sed_file): - raise ValueError("!!! No SED found.") - sed_data = Table.read(sed_file, format="ascii") - wave, flux = sed_data["observedLambda"].data, sed_data["observedFlux"].data - else: - # Load SED from templates - sed_data = sed_templates[self.sed_type] - # redshift, intrinsic extinction - sed_data = getObservedSED( - sedCat=sed_data, - redshift=self.z, - av=self.param['av'], - redden=self.param['redden']) - wave, flux = sed_data[0], sed_data[1] - flux_photon = flux * (wave / (cons.h.value * cons.c.value)) * 1e-13 - sed_photon = Table(np.array([wave, flux_photon]).T, names=('WAVELENGTH', 'FLUX')) - # Get scaling factor for SED - sedNormFactor = getNormFactorForSpecWithABMAG(ABMag=self.param['mag_use_normal'], - spectrum=sed_photon, - norm_thr=normFilter, - sWave=np.floor(normFilter[norm_thr_rang_ids][0][0]), - eWave=np.ceil(normFilter[norm_thr_rang_ids][-1][0])) - sed_photon = np.array([sed_photon['WAVELENGTH'], sed_photon['FLUX']*sedNormFactor]).T - # Convert to galsim.SED object - spec = galsim.LookupTable(x=np.array(sed_photon[:, 0]), f=np.array(sed_photon[:, 1]), interpolant='nearest') - self.sed = galsim.SED(spec, wave_type='A', flux_type='1', fast=False) - # Get magnitude - interFlux = integrate_sed_bandpass(sed=self.sed, bandpass=target_filt.bandpass_full) - self.param['mag_%s'%target_filt.filter_type] = getABMAG( - interFlux=interFlux, - bandpass=target_filt.bandpass_full) - # print('mag_use_normal = ', self.param['mag_use_normal']) - # print('mag_%s = '%target_filt.filter_type, self.param['mag_%s'%target_filt.filter_type]) - # print('redshift = %.3f'%(self.z)) - # print('sed_type = %d, av = %.2f, redden = %d'%(self.sed_type, self.param['av'], self.param['redden'])) - - elif survey_type == "spectroscopic": - if sed_templates is None: - self.sedPhotons(sed_path=sed_path, cosids=cosids, objtypes=objtypes) - else: - sed_data = sed_templates[self.sed_type] - sed_data = getObservedSED( - sedCat=sed_data, - redshift=self.z, - av=self.param['av'], - redden=self.param['redden']) - speci = interpolate.interp1d(sed_data[0], sed_data[1]) - lamb = np.arange(2500, 10001 + 0.5, 0.5) - y = speci(lamb) - # erg/s/cm2/A --> photo/s/m2/A - all_sed = y * lamb / (cons.h.value * cons.c.value) * 1e-13 - self.sed = Table(np.array([lamb, all_sed]).T, names=('WAVELENGTH', 'FLUX')) + # def load_SED(self, survey_type, sed_path=None, cosids=None, objtypes=None, sed_templates=None, normFilter=None, target_filt=None): + # if survey_type == "photometric": + # norm_thr_rang_ids = normFilter['SENSITIVITY'] > 0.001 + # if sed_templates is None: + # # Read SED data directly + # itype = objtypes[cosids==self.sed_type][0] + # sed_file = os.path.join(sed_path, itype + "_ID%s.sed"%(self.sed_type)) + # if not os.path.exists(sed_file): + # raise ValueError("!!! No SED found.") + # sed_data = Table.read(sed_file, format="ascii") + # wave, flux = sed_data["observedLambda"].data, sed_data["observedFlux"].data + # else: + # # Load SED from templates + # sed_data = sed_templates[self.sed_type] + # # redshift, intrinsic extinction + # sed_data = getObservedSED( + # sedCat=sed_data, + # redshift=self.z, + # av=self.param['av'], + # redden=self.param['redden']) + # wave, flux = sed_data[0], sed_data[1] + # flux_photon = flux * (wave / (cons.h.value * cons.c.value)) * 1e-13 + # sed_photon = Table(np.array([wave, flux_photon]).T, names=('WAVELENGTH', 'FLUX')) + # # Get scaling factor for SED + # sedNormFactor = getNormFactorForSpecWithABMAG(ABMag=self.param['mag_use_normal'], + # spectrum=sed_photon, + # norm_thr=normFilter, + # sWave=np.floor(normFilter[norm_thr_rang_ids][0][0]), + # eWave=np.ceil(normFilter[norm_thr_rang_ids][-1][0])) + # sed_photon = np.array([sed_photon['WAVELENGTH'], sed_photon['FLUX']*sedNormFactor]).T + # # Convert to galsim.SED object + # spec = galsim.LookupTable(x=np.array(sed_photon[:, 0]), f=np.array(sed_photon[:, 1]), interpolant='nearest') + # self.sed = galsim.SED(spec, wave_type='A', flux_type='1', fast=False) + # # Get magnitude + # interFlux = integrate_sed_bandpass(sed=self.sed, bandpass=target_filt.bandpass_full) + # self.param['mag_%s'%target_filt.filter_type] = getABMAG( + # interFlux=interFlux, + # bandpass=target_filt.bandpass_full) + # # print('mag_use_normal = ', self.param['mag_use_normal']) + # # print('mag_%s = '%target_filt.filter_type, self.param['mag_%s'%target_filt.filter_type]) + # # print('redshift = %.3f'%(self.z)) + # # print('sed_type = %d, av = %.2f, redden = %d'%(self.sed_type, self.param['av'], self.param['redden'])) + + # elif survey_type == "spectroscopic": + # if sed_templates is None: + # self.sedPhotons(sed_path=sed_path, cosids=cosids, objtypes=objtypes) + # else: + # sed_data = sed_templates[self.sed_type] + # sed_data = getObservedSED( + # sedCat=sed_data, + # redshift=self.z, + # av=self.param['av'], + # redden=self.param['redden']) + # speci = interpolate.interp1d(sed_data[0], sed_data[1]) + # lamb = np.arange(2500, 10001 + 0.5, 0.5) + # y = speci(lamb) + # # erg/s/cm2/A --> photo/s/m2/A + # all_sed = y * lamb / (cons.h.value * cons.c.value) * 1e-13 + # self.sed = Table(np.array([lamb, all_sed]).T, names=('WAVELENGTH', 'FLUX')) def unload_SED(self): @@ -94,23 +94,23 @@ class Galaxy(MockObject): """ del self.sed - def sedPhotons(self, sed_path, cosids, objtypes): - - itype = objtypes[cosids == self.sed_type][0] - sed_file = os.path.join(sed_path, itype + "_ID%s.sed" % (self.sed_type)) - if not os.path.exists(sed_file): - raise ValueError("!!! No SED found.") - sed = Table.read(sed_file, format="ascii") - spec_data = {} - f_orig = sed["observedFlux"].data - w_orig = sed["observedLambda"].data - - speci = interpolate.interp1d(w_orig, f_orig) - lamb = np.arange(2500, 10001 + 0.5, 0.5) - y = speci(lamb) - # erg/s/cm2/A --> photo/s/m2/A - all_sed = y * lamb / (cons.h.value * cons.c.value) * 1e-13 - self.sed = Table(np.array([lamb, all_sed]).T, names=('WAVELENGTH', 'FLUX')) + # def sedPhotons(self, sed_path, cosids, objtypes): + + # itype = objtypes[cosids == self.sed_type][0] + # sed_file = os.path.join(sed_path, itype + "_ID%s.sed" % (self.sed_type)) + # if not os.path.exists(sed_file): + # raise ValueError("!!! No SED found.") + # sed = Table.read(sed_file, format="ascii") + # spec_data = {} + # f_orig = sed["observedFlux"].data + # w_orig = sed["observedLambda"].data + + # speci = interpolate.interp1d(w_orig, f_orig) + # lamb = np.arange(2500, 10001 + 0.5, 0.5) + # y = speci(lamb) + # # erg/s/cm2/A --> photo/s/m2/A + # all_sed = y * lamb / (cons.h.value * cons.c.value) * 1e-13 + # self.sed = Table(np.array([lamb, all_sed]).T, names=('WAVELENGTH', 'FLUX')) def getGSObj_multiband(self, tel, psf_list, bandpass_list, filt, nphotons_tot=None, g1=0, g2=0, exptime=150.): if len(psf_list) != len(bandpass_list): diff --git a/ObservationSim/MockObject/MockObject.py b/ObservationSim/MockObject/MockObject.py index d9fa2b4..a0ebdc4 100755 --- a/ObservationSim/MockObject/MockObject.py +++ b/ObservationSim/MockObject/MockObject.py @@ -3,7 +3,7 @@ import numpy as np import astropy.constants as cons from astropy.table import Table -from ObservationSim.MockObject._util import magToFlux, vc_A, convolveGaussXorders +from ObservationSim.MockObject._util import magToFlux, VC_A, convolveGaussXorders from ObservationSim.MockObject._util import integrate_sed_bandpass, getNormFactorForSpecWithABMAG, getObservedSED, getABMAG from ObservationSim.MockObject.SpecDisperser import SpecDisperser @@ -24,6 +24,7 @@ class MockObject(object): self.sed_type = self.param["sed_type"] self.model_tag = self.param["model_tag"] self.mag_use_normal = self.param["mag_use_normal"] + self.sed = None def getMagFilter(self, filt): if filt.filter_type in ["GI", "GV", "GU"]: @@ -39,7 +40,7 @@ class MockObject(object): def getElectronFluxFilt(self, filt, tel, exptime=150.): photonEnergy = filt.getPhotonE() flux = magToFlux(self.getMagFilter(filt)) - factor = 1.0e4 * flux/photonEnergy * vc_A * (1.0/filt.blue_limit - 1.0/filt.red_limit) + factor = 1.0e4 * flux/photonEnergy * VC_A * (1.0/filt.blue_limit - 1.0/filt.red_limit) return factor * filt.efficiency * tel.pupil_area * exptime def getPosWorld(self): diff --git a/ObservationSim/MockObject/SpecDisperser/__pycache__/SpecDisperser.cpython-38.pyc b/ObservationSim/MockObject/SpecDisperser/__pycache__/SpecDisperser.cpython-38.pyc deleted file mode 100644 index 4b3396d630ade0fecffa135e8888c359181ca56f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13950 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 U*WsM|8|(FHhT9q<*3>=y1_c;SB>(^b diff --git a/ObservationSim/MockObject/SpecDisperser/disperse_c/__pycache__/__init__.cpython-37.pyc b/ObservationSim/MockObject/SpecDisperser/disperse_c/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index ec4022c1b4dda433c8525033f33c0941d6be771d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 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 delta 27927 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 diff --git a/ObservationSim/MockObject/Star.py b/ObservationSim/MockObject/Star.py index b150913..31cba08 100755 --- a/ObservationSim/MockObject/Star.py +++ b/ObservationSim/MockObject/Star.py @@ -17,60 +17,60 @@ class Star(MockObject): """ del self.sed - def load_SED(self, survey_type, normFilter=None, target_filt=None, sed_lib=None, sed_path=None): - if survey_type == "photometric": - norm_thr_rang_ids = normFilter['SENSITIVITY'] > 0.001 - # spec_lambda = Table.read(sed_path, path=f"/SED/wave_{self.model_tag}") - # spec_flux = Table.read(sed_path, path=f"/SED/{self.sed_type}") - # wave, flux = spec_lambda['col0'].data, spec_flux['col0'].data - _, wave, flux = tag_sed( - h5file=sed_lib, - model_tag=self.param['model_tag'], - teff=self.param['teff'], - logg=self.param['logg'], - feh=self.param['feh']) - flux_photon = flux * (wave / (cons.h.value * cons.c.value)) * 1e-13 - sed_photon = Table(np.array([wave, flux_photon]).T, names=('WAVELENGTH', 'FLUX')) - # Get scaling factor for SED - sedNormFactor = getNormFactorForSpecWithABMAG(ABMag=self.param['mag_use_normal'], - spectrum=sed_photon, - norm_thr=normFilter, - sWave=np.floor(normFilter[norm_thr_rang_ids][0][0]), - eWave=np.ceil(normFilter[norm_thr_rang_ids][-1][0])) - sed_photon = np.array([sed_photon['WAVELENGTH'], sed_photon['FLUX']*sedNormFactor]).T - # Convert to galsim.SED object - spec = galsim.LookupTable(x=np.array(sed_photon[:, 0]), f=np.array(sed_photon[:, 1]), interpolant='nearest') - self.sed = galsim.SED(spec, wave_type='A', flux_type='1', fast=False) - # Get magnitude - interFlux = integrate_sed_bandpass(sed=self.sed, bandpass=target_filt.bandpass_full) - self.param['mag_%s'%target_filt.filter_type] = getABMAG( - interFlux=interFlux, - bandpass=target_filt.bandpass_full) - # print('mag_use_normal = ', self.param['mag_use_normal']) - # print('mag_%s = '%target_filt.filter_type, self.param['mag_%s'%target_filt.filter_type]) + # def load_SED(self, survey_type, normFilter=None, target_filt=None, sed_lib=None, sed_path=None): + # if survey_type == "photometric": + # norm_thr_rang_ids = normFilter['SENSITIVITY'] > 0.001 + # # spec_lambda = Table.read(sed_path, path=f"/SED/wave_{self.model_tag}") + # # spec_flux = Table.read(sed_path, path=f"/SED/{self.sed_type}") + # # wave, flux = spec_lambda['col0'].data, spec_flux['col0'].data + # _, wave, flux = tag_sed( + # h5file=sed_lib, + # model_tag=self.param['model_tag'], + # teff=self.param['teff'], + # logg=self.param['logg'], + # feh=self.param['feh']) + # flux_photon = flux * (wave / (cons.h.value * cons.c.value)) * 1e-13 + # sed_photon = Table(np.array([wave, flux_photon]).T, names=('WAVELENGTH', 'FLUX')) + # # Get scaling factor for SED + # sedNormFactor = getNormFactorForSpecWithABMAG(ABMag=self.param['mag_use_normal'], + # spectrum=sed_photon, + # norm_thr=normFilter, + # sWave=np.floor(normFilter[norm_thr_rang_ids][0][0]), + # eWave=np.ceil(normFilter[norm_thr_rang_ids][-1][0])) + # sed_photon = np.array([sed_photon['WAVELENGTH'], sed_photon['FLUX']*sedNormFactor]).T + # # Convert to galsim.SED object + # spec = galsim.LookupTable(x=np.array(sed_photon[:, 0]), f=np.array(sed_photon[:, 1]), interpolant='nearest') + # self.sed = galsim.SED(spec, wave_type='A', flux_type='1', fast=False) + # # Get magnitude + # interFlux = integrate_sed_bandpass(sed=self.sed, bandpass=target_filt.bandpass_full) + # self.param['mag_%s'%target_filt.filter_type] = getABMAG( + # interFlux=interFlux, + # bandpass=target_filt.bandpass_full) + # # print('mag_use_normal = ', self.param['mag_use_normal']) + # # print('mag_%s = '%target_filt.filter_type, self.param['mag_%s'%target_filt.filter_type]) - elif survey_type == "spectroscopic": - # self.sedPhotons(sed_path=sed_path) - self.sedPhotons(sed_lib=sed_lib) + # elif survey_type == "spectroscopic": + # # self.sedPhotons(sed_path=sed_path) + # self.sedPhotons(sed_lib=sed_lib) - def sedPhotons(self, sed_path=None, sed_lib=None): - # spec_lambda = Table.read(sed_path, path=f"/SED/wave_{self.model_tag}") - # spec_flux = Table.read(sed_path, path=f"/SED/{self.sed_type}") - _, w_orig, f_orig = tag_sed( - h5file=sed_lib, - model_tag=self.param['model_tag'], - teff=self.param['teff'], - logg=self.param['logg'], - feh=self.param['feh']) - # spec_data = {} - # f_orig = spec_flux["col0"].data - # w_orig = spec_lambda["col0"].data - speci = interpolate.interp1d(w_orig, f_orig) - lamb = np.arange(2500, 10001 + 0.5, 0.5) - y = speci(lamb) - # erg/s/cm2/A --> photo/s/m2/A - all_sed = y * lamb / (cons.h.value * cons.c.value) * 1e-13 - self.sed = Table(np.array([lamb, all_sed]).T, names=('WAVELENGTH', 'FLUX')) + # def sedPhotons(self, sed_path=None, sed_lib=None): + # # spec_lambda = Table.read(sed_path, path=f"/SED/wave_{self.model_tag}") + # # spec_flux = Table.read(sed_path, path=f"/SED/{self.sed_type}") + # _, w_orig, f_orig = tag_sed( + # h5file=sed_lib, + # model_tag=self.param['model_tag'], + # teff=self.param['teff'], + # logg=self.param['logg'], + # feh=self.param['feh']) + # # spec_data = {} + # # f_orig = spec_flux["col0"].data + # # w_orig = spec_lambda["col0"].data + # speci = interpolate.interp1d(w_orig, f_orig) + # lamb = np.arange(2500, 10001 + 0.5, 0.5) + # y = speci(lamb) + # # erg/s/cm2/A --> photo/s/m2/A + # all_sed = y * lamb / (cons.h.value * cons.c.value) * 1e-13 + # self.sed = Table(np.array([lamb, all_sed]).T, names=('WAVELENGTH', 'FLUX')) def getGSObj(self, psf, g1=0, g2=0, flux=None, filt=None, tel=None, exptime=150.): if flux == None: diff --git a/ObservationSim/MockObject/__init__.py b/ObservationSim/MockObject/__init__.py index 7ef59a1..4868239 100755 --- a/ObservationSim/MockObject/__init__.py +++ b/ObservationSim/MockObject/__init__.py @@ -1,5 +1,6 @@ from .MockObject import MockObject from .Galaxy import Galaxy +from .CatalogBase import CatalogBase from .Quasar import Quasar from .Star import Star from .Catalog import Catalog diff --git a/ObservationSim/MockObject/__pycache__/Catalog.cpython-38.pyc b/ObservationSim/MockObject/__pycache__/Catalog.cpython-38.pyc deleted file mode 100644 index 2aec03940114bfd44f9bbf11f84bca836deb02e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5754 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 L7~NEPz%u>|gIkwZ diff --git a/ObservationSim/MockObject/__pycache__/Galaxy.cpython-37.pyc b/ObservationSim/MockObject/__pycache__/Galaxy.cpython-37.pyc deleted file mode 100755 index a7a55ed33245023046f50479936affc0e79ded97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3253 zcmai1&5t8T6|equcl%>JA3NFIKyU;?7*K{;0g=!`Mww)zm53MCiI7^6T5VU^(=+Yv zNp*X6W@w*wrASCC@h8~F{0|)X12`a#b>$E(2NbS|1HV`8^@JsYw(8ZZS5>d7UcL9L z=XcxffZ_YCeGoM}jQy1wFFza15lV3%gfniWY{o)nFm7@yH9}L@R%oHmPVJc!ItKfI zafiFl7RE*0Pkgx${ws>mNrjo={BT0khZk6wU+Ke zx>uQ;o%!-_62{dh5}_dbAH&phq{W0Hd22 z9YBT_Jf8G7Z?nqVW3RDAt7{S*iz^Xvh} zJxJ10l8ux*#2qH%+6lWfcaO*|>T?QmL+zS!pQNu5p<7bklcYQ$P0BmYvx_{v5dAIr zI(1p+#pGre^4lb{Csnqlm zeFt5V%n7HWiq~mplFf^CVs)OJ(%NBwYKLqEN-VGj~ zQ`|N7;{ibY%3pTSB58MJ8VqZDDBBhGxxzz=6&*Z0{&Hu9v;orH$~fIUVvBCoUGA+I z_s`7V8#3U*!prsm16_yV5%jC>9riX}=KJtSw7dx=5zXtQ_vk`MnQ+m=o6?(!@+9ZI zB+^s7<-^gh-jVlkfwfZ+f&ii%txx`hng%gls$`)J6O1& zuu;rMLs&cX38){_YZ$s%W;h?ohotQlNDIhFby`T~Eoe8)w%4fU0>yTWE?S=9nk{ev z=pO2QNLs)-*W5F%x7R^|sLRkv~SYX__}f`ab1iSv(WS#eyh;Pt8-}TT%4s zJWlH#os7ss=+O8ke@)zD5Y=8MKx0brqMIZ14f#zPM30dqD5Db=^fv;J&~~undBK}n x4igdXDkq!IkoEi=eC@wZG%u61HYh2$(Oq-;ne*<~8~z0WctN>NOM5`e{5LUR8pr?u diff --git a/ObservationSim/MockObject/__pycache__/Galaxy.cpython-38.pyc b/ObservationSim/MockObject/__pycache__/Galaxy.cpython-38.pyc deleted file mode 100644 index a663442ad59b1faa9182ac376dddb0907d44c9b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11441 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 diff --git a/ObservationSim/MockObject/__pycache__/Quasar.cpython-37.pyc b/ObservationSim/MockObject/__pycache__/Quasar.cpython-37.pyc deleted file mode 100755 index 91b82a6f9172601338d05093b0621898b6aaf7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmYjQy>8S%5T5nl?Hw10ghWG+aFYW{ghE6}A|$v79W-uM&h6SbS=*OgJ0y{>N~AQv zGu)N%6g5I3pjHlw2mMQF0l@T#Pr^js(E`Jv+dtqvR*}{f-{(rhRg}V z1k54B&@sNQCqfy@SXN{eV`%cUkcsgpv5Ip9+huGlW33tc3V&V?-fN-s;G`D3EYc({ z(!ooi52|u9*c^@CwSws^AMEa7;89#^%SciT|IASlcjlVyhPT=p>OV{qS}(UGgTJb zXxh$XWr8%8*sh^FajkV07lwY!st?w0=w?|QmGVf0J=MXY#+~TIIO${LC+fDfc!@3I zRzjMNIG$8lE+Y3(m&Q-BB9_W_x)8T)co!kyy?K?Vb`-jg0th9y@#~R3IbB^2@LyOM zv@=``ayV2rBMj`ii#QjInI2<#$!lr#K4XV^xf7Hy2|cW*$dbjZnFPti#}UmShw$^Ezl>_`3n-X*xLXA diff --git a/ObservationSim/MockObject/__pycache__/Quasar.cpython-38.pyc b/ObservationSim/MockObject/__pycache__/Quasar.cpython-38.pyc deleted file mode 100644 index e3f189462efdcd7f72c2e6525c890b62a279f505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3137 zcma)8OK%*<5$>MX&dxr_C0BgtWm1WN>_xN;CkPBhk4U6KL|Q8#Ejfz-btE;QO z>W^wQkHGh@zdj4Tm?z{PI5_)RFt`mxzJ!VqMkCTGTH2v{Y;+9WnjK5GcI9#-Jxsd?AMOo!H-nMA8|+0KI+ZZVxEQ8UknxtKmT=e?Fz_X3 z{$7xnw4kzfJj`2C^QAU~Z!tI!>$}DETpx`Nom0pmJ&1%eJ6`(ku6N_|8u(!H$ zel-eYAiBmG<=8i;MZ!Umj65eNG^eK&eF}24-7=IdM?)@@>-%96X1)(3OY*3v>|r2+ z_!U)U-|t4SZQp-I{{8VroMaowlCbrS{WRtqy&&n2N1UZee?x|`-%T0!1&??j`NrLy zo!yPX8$lMP$xaw=eCPa)!tiUuv8aNHSft(rJ(`=cW`?!9E^uexGIYvN?n03Xh~(h2 z1LOBp{4sZ!u}YYEU`^cIX5_#X&vGj_b219OmdG+WH71^> zTe){i^ZInU`cnmL0~?qO6N8A zR#_#wt-{K+V@u0}1t48tC53EW%d1&+P#e^to*UGg(@f_lD5 z3hkhGX|O!yLzMj1U{()&rnNO-c0sEbG`7rEj?GB}WLEM9TV?0j1$Ob+%89?4od^3? z^U~k~y9D+wWEb-VJ-U2sXv^P$(WNDFgCu`|vs;6+GsK`cFF3`oV9sSY9W%Gs`msq# z^78-nZ}!f~8hH1OkKt4oVMpui3i|>3;i)-k=8JjrIh~x#&*jY~dE4{a?@Lp^H}j>l ze#f2ZyK}XzD#QIWgZR%x*j1IC&Gydr?)KyD-Cy^=ef7`3J=}YAOCZ`DmHq8|SLHQ8 zkfX->`ubWsT?15D>!qWFT~l@-yI}~}TJ9fjh-qaI8=_{ zjPV2j$^oT!LB<7&+z)%1ScMhEd93gn^`9MX@BjJgji14-_MY5%y!l|WeSh~C%G!GH z(Z{f+odhwLsvZY@eth% zgzH^~N|h2G2rjdhspwNhduI?e$rQb#==Ck&l|KV9KN}CZD)(SpMc3*9sDPy=>`J*a zv;{(0!!qt)T!&ST9JKeURJFpgRCd#0*af{V!t^l6_Lb93Wyqv*)4c(%Bg4M{T=YSj z{ORSFw{?e*zu#(IDTK5wMk_0q9S?LYOlQobnxM%A$u}u#wsIHm`|QI$7M-CmNOJNC zyoMm}8b?=tw2PNyttU8N8x1uc#5_*L*jt-^?H1Jm01cko+q?Bf$!yhM0=r0>=22ss zG{56&4Eh?TK;ZA){$38ncN_+bw(ur&0Ba#bilv;K5I|ceF9BLwm=W5Pmh&>~%WC&O_~PBKemCB{IlW)s+=AO{%dj5@q5}&6s4PMhZAJ(v zX@WNz<4bG#DO^FW>mm{WCUV@CuA) zfu~b}A~AMcS~a~JuC1x9MeQ(wk46B?G2Fgn6vGqh9ugV=q9PrRuOSp=K?3+ye$y4V zVTv$uUTron!^dxdYc}K}(4!H=_D5M5Y5dWsrGZXEk2d0r&1df5jlu^vG4LgB!=>}! L-s<#+duaR*F6m4K diff --git a/ObservationSim/MockObject/__pycache__/SkybackgroundMap.cpython-38.pyc b/ObservationSim/MockObject/__pycache__/SkybackgroundMap.cpython-38.pyc deleted file mode 100644 index f1c7e805f9c62cd7bfabda603c47a82abf5b13dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3021 zcmc&$&2JmW6`vjMlFQ{cMN5`!$4*id6`Go|(zHpdCU*Uiq?P3)k{y?DK`c2ddMPfK zo?WG4Fne=)DGd13vvdidTT!6*9{LC5Jl7lo9eYhvxW6})9LGU@Y?s{My!n3b&Aj*9 z+m(vP@Lc;#)BoE%V_#C`*{6ugWxR<32qvr%i&%$QBy-4C$AX*__K0`5DRUhgr89D( zd?#=E@}olJcHHO26+1;y5UwZ+Pn1M?V2KLmRkw?xCh8BZjwj|sLo^|kguTg@TSpdD zShjR!a}xBgg~=q4Ng&bS$~g7Y;H{M-3}72*akl*4D1cB3$7vuZ@d*7#^&c>H^!clR z`*na=WbEsei7)-Ao$O3|et%~mG8{m35#+WRz+anc=yJAp31R*~+d(t&x}F>7mUOFPMZAC{BRI)ALL zwWqDAp6kcaWH$|r!capX;b|vKgDBB?v%w8rOoH^*%(i@wl2;;;cG&W(@Z5Spo+B*w zM!Ug!7=^G^24W^TNORj``7&)>oP>M9Xp>BE!{o{+9uI!kDJGLqn06;Iw!_$){-ooO ze=g06Rnz)D`8(~+9O0Hve zL`-yv2A-H}?P%*07#$6|iLTDZ&HB1~&()`JWrFqOTd?S4@zs;XS9LCp_6VkjOy0(j zuY2uioVJMok~Eg>`*9SsxBc;8x*G^MppAp<_G1xrWiSf-BxqmV+}vv4>Vb7W@zXFK zZ-!C(CN9IR-VipmH=iXDc=^^3AYHk@<3Nad$wsQo4zvo zDu%*{uBvGsazRy(Q?_mB>ZE4K%g~i89FQOf^Sz z6_8FtHTJ89bnbw3nxM2fLozLtM9im9x+v$NS538`jiD(}*t{W~g<(Tgh7FL;X;9i} zkj?@jNC&kw_TcX`FMt}?Qjp%TAZ+t1nv_`17PBR!M6`pt%TH4xWTZrIL*k2q$r=GA zK$8z;i=+hte6cV|S4Yy9#`2u}5y{I0KPGsM;3otZ2`JOZHo*#k$*Zd*y-x5`f;R|$ zM(}fjHwh?yW?AHn`~}IsBv>Q(6~WsCls4o$1eXb}5d4~ezJ261g6jk~2;L=lkKi{1 zza>~FxJj@HYkebUl2F* z-`@GVn7{1G0t!i2U(%0nyZQdFD_`x5oQmqTOgRHD{tL$SE?OOfRPN zC3>9mlYWT)JSJ!!Cnm-uZTgIP#!zFUyB5V_cNDx$7a_R-C?hZ_;1TW|$-+S>Kk*WL Ji_e}X{{c@w^6mft diff --git a/ObservationSim/MockObject/__pycache__/Star.cpython-37.pyc b/ObservationSim/MockObject/__pycache__/Star.cpython-37.pyc deleted file mode 100755 index 09bcdb35790e13dcf608c19011e8a8f799c3b58b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 zcmYjQ&2H2%5FY1my~}Qegv5z6B9|_3M5t7hwgQRmVd0XCmBvm;>m*w{TiPmnYNcL) zXV^U=@en+Rk8nUe(K9E;*)7GN&b|?VpLTPzJTx{@^dnRp zIFV351O&LlT}dLc3*6)W1#n-$xf`K(3}JAEbs!|B_qIw7_x2A&QeUA5Mv2uoD_9x& zAsPZA!Xa`lAtjt}=YmEqr##@D3le#k;6dbL>8|m{b*vI+b=LmfmFT-@)Nl@S(vSr~ zkbo!1D0GakrxT$JWh^iAnlW^FTFBJ+lUT(CLhUk^$XIK}zQUh3!}nS!Jv^NXUX@uI zm)Y=@(1&$38E%co?^?xlUJUp4G4VLA^Qs)<_O{=lg}FXCRklkXMYoX2*`N*F08tkF z=oc!0@B5nxZ7l#h5_@V3MQ@;LJPwDBy5GPY8ovpe&cdB}H92rBTipHZ%xFXBZsRS; zjMilCHKd^nXVz`H$bvV@o_%`!OVGqTZG`Emf5} z=-SC;ZGtS8*s7ts@l@+PE)D&d*B@-$(5-@d#Zy)jXTk)ak3{UPt}_Bc&RPo z)orzoal| zDO~b68Y!C}26obATnNTYkFlcSQ)%r!V@K0iE+g$^)C0^ngVpd8AthtCh(e;e7*`gU ovTwnPwu+Lz+j>G**}*D%_gcs8>HnId&zBfB?89ga^a*wT0%PLVc>n+a diff --git a/ObservationSim/MockObject/__pycache__/Star.cpython-38.pyc b/ObservationSim/MockObject/__pycache__/Star.cpython-38.pyc deleted file mode 100644 index 512a0c3e954127c7ac3736af3e1e13775937b48a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3857 zcmZu!OK%(36~1>K9DbbD-I{}?0Xt{}+pf99OVmFptqqdTQitP|7CL_*}A~g@@ z&ZS}r!z>~f>7oL%=ns&(2%uemLeTaX6kXj_fi8k9yKRHE-?>A^vfCl%%zd7F?sVb%X#o3X!B=lo-#a~*H?TabVSJYxOg%llmSjlQA3X5Z3ZJ1+IhoYokT z6Ic2bw9UYZ+_>7W#E`YU?Qj+$|^-_-3=)QVgEmfl~ER^zq)8fUjy z-~^RNEU1L7BeUNQc#n16uOSiJ>T+do`#VwiHAlB=tBd1Ah9lw2(96QW+wqfN>SvjH zeiX{BRK%P9K&E0d6}@RVxIdP=H-2{a#x2#r^gBCQDE7mkw{cTB=od3(>5qsNPO8(M zo8xR63arF{dp8~Iy|Xh32NJz19WAD5gu@3U-T9}q=wx@$2pMUwZ+ymvJm7)x$myG; zrAG`}YzC#E{D}AMpr!B4`=wwts0DS5m4mgQ5v-u)e8w!+uRs%RW%Z;l2FAJLsBJFZ ztciwXN9=^>{FIY!d+dyFbq!@_Gu%Zvo;Oa$((^E6WnnZ__S6@Ce8yG9^9B+0=Xq!B zpZC_|M6T0R1|6>Nrg6AF^pnxSEDX|Qw4RM)Z;%F|C&DQ7vvB?GUT=H7P^&M;Y0?|V z>yK5oPGY|@JrFApu!c9&SKxNY`SNB&c$YK1je)Q|2=D7k}S7!HsOKwEQH3_UVKZ7Zy76{WBUVh zUYEd&;qTsS-~BA>yyS}9^Uh7Bd8B?FU`%t z>SAoQ7=wqlkIi`n7NQ!!Slxp-|fDzrK;22RKowH7!Opnx3Sf`y?y)M?d|tR-<L%tYA7ig452m5245Qh@qG=5gmuH5!NSvG{@*$=x8kjb*Q2ZEkhb5By|8J)9+W5UON90%6?cHOt@zcZ%P?YNadulHp>+ z;BDUiret3+e!$yCQ;%5xZkJqRfqzSG1M-aJL+P5dq``)gGGL_$9ln4O1f~upbMXb- z1h$41b8gLTX`Gklch;{;(%5r4ndCwo{Ds_ zr<#}ZiiU<-0XzupIwh5EZR`KVlXwAgj{gjd9HGI!{LP=P>jqSUMcopTPcjO{Pie_-vh{HH7|Zeuf9KDz|M%qI+6sqqGPj4OPRF0g&! zxEdM0q8;qZo$CXNtmQ-Iq{z|cB+kG&wucbT*$K;SG6_s$Nq%CSGBOPr?-WMDh?Vo) zffC zp)6%iv!OCZui|}8{F3%s6jI8RVWi68!>Js{h?)%HhKL_0z`m#QC{<6ldMJ#3f!!IU zb_V}%7!Jk5GQTg^3@CXnpEWed?ph(Q15(Mqk2t7##P>{bNg}x(@lW}P;o`Pd)@x9f z0iPyym~;EEElos#m0J@#Fpy^4`z-ms1&`iy#Xe{ADrbkQvYc0skWlWk_u22Q!0aK3 z&8weOAE2KY514d{GmrR9_Ny=EwcN~+R_Ar>EV$P-?*@3kw&4BO1@HC~yh~KrKFu9z z&%Mm%EBOkF1LJd+eUqcTXD(Vcl6*5+?39%g7shYpEks@u#&2PyChK_%#&6}7lLlJ2 z$w!YczLHn4Vl`hyG+JASx36Bky1g5Al3BbHicUK0yxZICOhpQVhFJ&2aYsHey~JZo z#LM$bd)yg5aJ`!z4hGn8n?-B64?W!huI3FJbQx3hlbXG5(MRH79 z+Qza4$T#8KmUeIgb?RLLpgVx{Ro#2eaEvy0jS|Kv0BWFz&*-A^fBC{}c)AAOl12_q zFeE&jh}p-3#fVGwJC!7!r(DlN)iaBzUGqG$Trs0-Z1D_T?H&kBy3Jlwu$#GP;6@jFns$16xMUo)g5QLzpsRm;lM&fB{ g&RswoQWy8mwL&#-0##T>7jv|A$R1a;Rcgk60p>-}jsO4v diff --git a/ObservationSim/MockObject/__pycache__/__init__.cpython-37.pyc b/ObservationSim/MockObject/__pycache__/__init__.cpython-37.pyc deleted file mode 100755 index 6444bf499819d696f87598e3ab7e1953726e7e70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283 zcmYL@&uRiO5Qp<;U5e;~?8RJqEJbX=lZvFh>?K4u%4)KaBrEQV^c{Nd(|GNvPf+mG znFZ;DeEEJbVP-ZS4++%Q??ipT`;FmV3}gy7J_0IIQA->t2}Ng?I$F}+xn+)(toO`v z$4d@Akfg|eD10sGb-3``<7#s-+XN|}YpX9E+Pc+I2e3>g9hOBFaBAR)3^4$Fl8~b# zZcFhVO^BjvP34>YPB(k;YT_~ZlX#Kxt%r)W6RQn0o^`5yBO(5;Ae5?`Iw>_db=QX{ Q=d0G5XIwSnh!Mr}2cSko2><{9 diff --git a/ObservationSim/MockObject/__pycache__/__init__.cpython-38.pyc b/ObservationSim/MockObject/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 556670e94d9879c41d266edc520fa4d6e51685b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362 zcmYk2%}T^D5P*|5?Uuy_@h#Sac>xh&1--0`boY`=nKrT3=BFg7*hli_%XrzVCttyn zNkMc%zWHVXVUojYwL~Fq-p}A8O(RG|7Lf-f;6}I9b*gF%7nK!KfD?36mV3IZov<(9JEO}^(Z8u_Rdu@aRdq2;$Kp~MK1y*F MU+3b-p5Wj012pql0{{R3 diff --git a/ObservationSim/MockObject/__pycache__/_util.cpython-37.pyc b/ObservationSim/MockObject/__pycache__/_util.cpython-37.pyc deleted file mode 100755 index d14ec0d5fc96276488f7f6e25c92500cbe51155c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1918 zcmaJCO>f*pbY^U?Kax$h5YeJu=1_@lRb|y&kfI9mQBVb?iJAh^st|cSW5{AtCW*cH5+U&1l|x^WK~1_c8Ol)@}y~ z#-G0}Za;Ss`bBSE3#)iN01PuC;dAHF0(u=aSZd?;{lmbIv-*G*F%4;w?(>|kuF+wb*mVWs7sUu-%%uvg$}`hKR)bzT!Ih1!N-i`El6mEPOwB{EUp6u$xQGVH=0W%HZ(RgF*Gr>WoRp>5}jCM)F6os z#*!FJq-C&G*%BS$#!gTIwQHQFHKp9fJH`jQl_TvVd;=Zh&+avT)sjg1Z-O-qk4O^$ zhZv4E<;+yB4303snIjAqgJxFFGQ5YyuQHG`=TXyUSW_q77_J2D=VV*XT|~`%eiT4H=a!paVmcLeS4$2~{A=v#et2yk!-9n_`o_Vi2DjFAJ7@D5)?~Vojl`Hi2#@+Xp z=_CSh6I|7%k|l_`s53@)!u@GRp?OgTT@zAO{PcnTktSbWR!N#DZ;P8T2dqdoGd9jF9y4PhhKxM0BC7~I3VS~RjERSQ-!(0 z&?ysGRi(&a(6@~SVeGVb3K!g0Hs2VOZva(p0zmTto;7ohc-TzK!vW0Krc?7eI3OK> zo^=UdKsGGz#UlFj9G)XraeyunaS3d8edU-dBy?|Aq$q{{4=H;;+FmtqsN9|H%`D9K kOs_Sk&Nyn?z46w&J}g+B@pp9U%Q*nrpIKsKn8a)U1sGEO;{X5v diff --git a/ObservationSim/MockObject/__pycache__/_util.cpython-38.pyc b/ObservationSim/MockObject/__pycache__/_util.cpython-38.pyc deleted file mode 100644 index d1e72047f5abebeb3fa7f57bcda249428a676637..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17093 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 z 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 diff --git a/ObservationSim/MockObject/_util.py b/ObservationSim/MockObject/_util.py index f957e7b..ffb978b 100755 --- a/ObservationSim/MockObject/_util.py +++ b/ObservationSim/MockObject/_util.py @@ -1,14 +1,13 @@ import numpy as np import os -from datetime import datetime -from scipy.interpolate import InterpolatedUnivariateSpline, UnivariateSpline, interp1d +from scipy.interpolate import InterpolatedUnivariateSpline, interp1d from scipy import interpolate from astropy.table import Table import galsim -vc_A = 2.99792458e+18 # speed of light: A/s -vc_m = 2.99792458e+8 # speed of light: m/s -h_Plank = 6.626196e-27 # Plank constant: erg s +VC_A = 2.99792458e+18 # speed of light: A/s +VC_M = 2.99792458e+8 # speed of light: m/s +H_PLANK = 6.626196e-27 # Plank constant: erg s def magToFlux(mag): """ @@ -132,13 +131,13 @@ def tflux(filt, sed, redshift=0.0, av=0.0, redden=0): sedxx = (sw.copy(), sf.copy()) - sw = vc_A/sw - sf = sf*(vc_A/sw**2) # convert flux unit to erg/s/cm^s/Hz + sw = VC_A/sw + sf = sf*(VC_A/sw**2) # convert flux unit to erg/s/cm^s/Hz sw, sf = sw[::-1], sf[::-1] sfun = interp1d(sw, sf, kind='linear') fwave, fresp = filt[:,0], filt[:,1] - fwave = vc_A/fwave + fwave = VC_A/fwave fwave, fresp = fwave[::-1], fresp[::-1] tflux = sfun(fwave) @@ -337,8 +336,7 @@ def reddening(sw, sf, av=0.0, model=0): flux = sf*10**(-0.4*A_lambda) else: - print("!!! Please select a proper reddening model") - sys.exit(0) + raise ValueError("!!! Please select a proper reddening model") return flux diff --git a/ObservationSim/ObservationSim.py b/ObservationSim/ObservationSim.py index 563feae..ece5dd7 100755 --- a/ObservationSim/ObservationSim.py +++ b/ObservationSim/ObservationSim.py @@ -4,7 +4,7 @@ import os from ObservationSim.Config import ConfigDir, ChipOutput from ObservationSim.Config.Header import generatePrimaryHeader, generateExtensionHeader from ObservationSim.Instrument import Telescope, Filter, FilterParam, FocalPlane, Chip -from ObservationSim.MockObject import Catalog, MockObject, Star, Galaxy, Quasar, calculateSkyMap_split_g +from ObservationSim.MockObject import calculateSkyMap_split_g from ObservationSim.PSF import PSFGauss, FieldDistortion, PSFInterp from ObservationSim._util import getShearFiled, makeSubDir_PointingList @@ -17,7 +17,7 @@ import logging import psutil class Observation(object): - def __init__(self, config, work_dir=None, data_dir=None): + def __init__(self, config, Catalog, work_dir=None, data_dir=None): self.path_dict = ConfigDir(config=config, work_dir=work_dir, data_dir=data_dir) # self.config = ReadConfig(self.path_dict["config_file"]) self.config = config @@ -26,6 +26,7 @@ class Observation(object): self.filter_param = FilterParam(filter_dir=self.path_dict["filter_dir"]) # Currently the default values are hard coded in self.chip_list = [] self.filter_list = [] + self.Catalog = Catalog # if we want to apply field distortion? if self.config["ins_effects"]["field_dist"] == True: @@ -85,7 +86,7 @@ class Observation(object): if pointing_type == 'MS': # Load catalogues and templates - self.cat = Catalog(config=self.config, chip=chip, cat_dir=cat_dir, sed_dir=sed_dir) + self.cat = self.Catalog(config=self.config, chip=chip, cat_dir=cat_dir, sed_dir=sed_dir) self.nobj = len(self.cat.objs) # Loop over objects @@ -93,42 +94,29 @@ class Observation(object): bright_obj = 0 dim_obj = 0 for j in range(self.nobj): - # if j >= 20: + # if j >= 100: # break obj = self.cat.objs[j] + if obj.type == 'star' and self.config["galaxy_only"]: + continue + elif obj.type == 'galaxy' and self.config["star_only"]: + continue + elif obj.type == 'quasar' and self.config["star_only"]: + continue - # Load SED - if obj.type == 'star': - normF = chip.normF_star - if self.config["galaxy_only"]: - continue - try: - obj.load_SED( - survey_type=chip.survey_type, - normFilter=normF, - target_filt=filt, - sed_lib=self.cat.tempSED_star) - except Exception as e: - print(e) - continue - elif obj.type == 'galaxy': # or obj.type == quasar - normF = chip.normF_galaxy - if self.config["star_only"]: - continue - obj.load_SED( - survey_type=chip.survey_type, - sed_templates=self.cat.tempSed_gal, - normFilter=normF, - target_filt=filt) - elif obj.type == 'quasar': - normF = chip.normF_galaxy - if self.config["star_only"]: - continue - obj.load_SED( - survey_type=chip.survey_type, - sed_templates=self.cat.tempSed_gal, - normFilter=normF, - target_filt=filt) + # load SED + try: + sed_data = self.cat.load_sed(obj) + norm_filt = self.cat.load_norm_filt(obj) + obj.sed, obj.param["mag_%s"%filt.filter_type] = self.cat.convert_sed( + mag=obj.param["mag_use_normal"], + sed=sed_data, + target_filt=filt, + norm_filt=norm_filt, + ) + except Exception as e: + print(e) + continue # Exclude very bright/dim objects (for now) if filt.is_too_bright(mag=obj.getMagFilter(filt)): @@ -156,6 +144,10 @@ class Observation(object): except: print("failed to load external shear.") pass + elif self.config["shear_setting"]["shear_type"] == "catalog": + pass + else: + raise ValueError("Unknown shear input") pos_img, offset, local_wcs = obj.getPosImg_Offset_WCS(img=chip.img, fdmodel=self.fd_model, chip=chip, verbose=False) if pos_img.x == -1 or pos_img.y == -1: @@ -191,7 +183,9 @@ class Observation(object): g1=g1, g2=g2, exptime=exptime, - normFilter=normF) + # normFilter=normF, + normFilter=norm_filt, + ) if isUpdated: # TODO: add up stats chip_output.cat_add_obj(obj, pos_img, pos_shear, g1, g2) @@ -274,53 +268,6 @@ class Observation(object): print("check running:2: pointing-{:} chip-{:} pid-{:} memory-{:6.2}GB".format(pointing_ID, chip.chipID, os.getpid(), (psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024 / 1024) ), flush=True) - - def runExposure(self, ra_cen=None, dec_cen=None, timestamp_obs=1621915200, pointing_ID=0, pointing_type='MS', img_rot=None, exptime=150., shear_cat_file=None, chips=None): - - if (ra_cen == None) or (dec_cen == None): - ra_cen = self.config["obs_setting"]["ra_center"] - dec_cen = self.config["obs_setting"]["dec_center"] - if img_rot == None: - img_rot = self.config["obs_setting"]["image_rot"] - - sub_img_dir, prefix = makeSubDir_PointingList(path_dict=self.path_dict, config=self.config, pointing_ID=pointing_ID) - - # Loop over chips - for i in range(len(self.chip_list)): - chip = self.chip_list[i] - filt = self.filter_list[i] - - # Only run a particular set of chips - if chips is not None: - if chip.chipID not in chips: - continue - - # Prepare output files - chip_output = ChipOutput( - config=self.config, - focal_plane=self.focal_plane, - chip=chip, - filt=filt, - exptime=exptime, - pointing_type=pointing_type, - pointing_ID=pointing_ID, - subdir=sub_img_dir, - prefix=prefix) - - self.runOneChip( - chip=chip, - filt=filt, - chip_output=chip_output, - pointing_ID = pointing_ID, - ra_cen=ra_cen, - dec_cen=dec_cen, - img_rot=img_rot, - exptime=exptime, - timestamp_obs=timestamp_obs, - pointing_type=pointing_type, - cat_dir=self.path_dict["cat_dir"]) - print("finished running chip#%d..."%(chip.chipID), flush=True) - def runExposure_MPI_PointingList(self, ra_cen=None, dec_cen=None, pRange=None, timestamp_obs=np.array([1621915200]), pointing_type=np.array(['MS']), img_rot=None, exptime=150., shear_cat_file=None, chips=None, use_mpi=False): if use_mpi: comm = MPI.COMM_WORLD diff --git a/ObservationSim/PSF/PSFInterp/__pycache__/PSFConfig.cpython-37.pyc b/ObservationSim/PSF/PSFInterp/__pycache__/PSFConfig.cpython-37.pyc deleted file mode 100644 index cc0e9bfe56d95a888f852ac6dde70ffc950929b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4297 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 PFaJKp;KV;wMCktk&VJ0T diff --git a/ObservationSim/PSF/PSFInterp/__pycache__/PSFInterp.cpython-38.pyc b/ObservationSim/PSF/PSFInterp/__pycache__/PSFInterp.cpython-38.pyc deleted file mode 100644 index 324cb82e4d50e76b23b6a794ffb6f267f8534f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7067 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 W&x2p8^vBAF2IxHHpj1<;vHIUVG$6nL diff --git a/ObservationSim/PSF/PSFInterp/__pycache__/PSFUtil.cpython-37.pyc b/ObservationSim/PSF/PSFInterp/__pycache__/PSFUtil.cpython-37.pyc deleted file mode 100644 index b4bcdf22aeeba74c04062d529edd97f0259f77da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12951 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 diff --git a/ObservationSim/PSF/PSFInterp/__pycache__/__init__.cpython-38.pyc b/ObservationSim/PSF/PSFInterp/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 8fac220f537665f2e6018313955a178434ff72fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmWIL<>g`k0*#`ni3&jaF%Y8wCLqrNh>Hb)L<&O+V-7^?l3%2sk)NBYpO%=HURj!& zlAo8ZU!0j6pPZkP8ef!}lbTqZs_z^e91@(FtM8vwoLW?tSdy8a2jT+l0AYwd`tk9Z cd6^~g@p=W7w>WHa^HWN5Qtd#_`3%Gi0JwlT2LJ#7 diff --git a/ObservationSim/PSF/__pycache__/FieldDistortion.cpython-38.pyc b/ObservationSim/PSF/__pycache__/FieldDistortion.cpython-38.pyc deleted file mode 100644 index 574f7adb3acb80c5dfcddcb139e383443c9a990a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2131 zcmbVNOK;mo5Z>iWlq%ban>u!zqC6Bxc(Kv~MS&nF(pqp}z?I!7K?|Y)OKDd!Wr}2W zDcdrrlYI^P7m{Oc{WU%8wWs`rUfLN_4@(USv@7grAM@JzW`-};)@lSs^S905_X;6@ z;O6EqVDki~{2T})j7G#O|EZ@vB}`-bHDNl}uXN8~v`t*&9dMFX7wOHR!{!N0`2Ywf z9%aPSm|bX~p3V$rUK7w!WfrSkQ_n24)zrp*$RpMaWtNC6OyX7-HO+`Lm~sFl z2fe4Z_=UlLL?(K!!M-XUXB1Z2mGAX0ja)Wyv#t&-V%A(b<=~ z4|mhBdm3@qP*%B8Mw0Sa8Br22Rq3&U(>0YLdDIht6Y=WPQ$G!|6M--(+Ivd`!uhAy z7{*y64Mc!ZYn&uQ-slB!e>~zWiTmiL-v#Tw;1LfbZ-Bec8%G_<#aVzs25%e3?fu5w z*E06I=~&smAI4$k`xaP|w}2387r#2))?sRw+pA(TktOKRQ-p5;9T`A^<#d1(z1ZVc3;DrqA9aM)LNIK@Y7!maoah-Y3LCg%s9aq%KO@XT?!8N;Rk ztt20yu8mOcC2A9e)`1XukFL{O^Z_;K%$UMp0t^N~V8N^a4CVxa&a54ho4IwRu?j#1 z6TmT;{f|=%Eg&aaaI3-B8X?Y8o;leGcUV!}oH-D^5Yx};CBg|}XB3xL8Qg`#pwH(V zwVE>>$B^Yi4xq_L^E13cJRVJXzIE;+cK4m6GvM9K5j+)K@;D3QK6P>FNS zo%0|DR}+U{WFi0sP#aE9B*Wb$$tn1SRWR8PA}F-o3_F{=^yd9pPe`YIt5=?d&aYoh*zSEPn}~k4fDc{|M%qC^WU2i3x8Zq z+<^oZ9|3vy7Ywn6+jS(^j=bu{0p?WZC~|Qdbzp5T zs@AO(^}R5u>{;l=))MDx6|X_Z@TcD`&OQNNi9V9`by_d#c#Ce)%THIUcuC6DS}m8h zTnpQ740-PRs^u@u)g)D&8aHf299{rCpIf)cgDcR>3a{>u%8 diff --git a/ObservationSim/PSF/__pycache__/PSFGauss.cpython-38.pyc b/ObservationSim/PSF/__pycache__/PSFGauss.cpython-38.pyc deleted file mode 100644 index 526253816d6c36de939653768ad8c5a8825cc110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4246 zcmb_fO>7)V6|U<489Uy@F>(HY77ObgDQj=CXoXBRc1V;EP`pu`1u+nf+EYE_p6%%# zSM?<0p+`bWqz#80ID&)}--tjf#C4BIz?lP}J|GYh!54nS4I#w$s%K{HWLM(A*!{YG zUsb*O-uGU=bL2>s;dk|?^TBUt8T%7e4*o1u*72x25P}IFvwHdFb*}41-Nf67t*%|S zITNO^VyElW9h7OjTX*%_t9#d(u!ZxG2`6+OnDvU_o2=&ULo?f`@xqIeER?S-WgNAAbaaee|7!AY1YHmk8IfL~IS4Hj3UX&Cb3VQE_(+*-4bqh~dqaZ2F zo@&+X!ct+}l5?1*=gOBzfsMY~!BZwrp!ToLm2Q%)^a2^EER`$UX*XPH1xb6iABr?- zuRw33iTh~CFb)G1u3XvNytDH5mI~#)AdAvuGwQD3&gjw0FZXr}uhEE-C~Gt-SV93~ zjB$@UDbA*CSC62=b=D$);9hE3W5vcAsd;(99bEA!i5EETYKinhNX?%eqf9o zVWY>$o!s6t7TCzmUD(+f{;FE3^i1&~ssq|a@q)FR8=SR!ovVW!D?Z-IBz0ent z%4D?Fr{3u>KW+IFs~#Frh2mSVS~moKS5c9xz6?avS199VR(*(WK=ZTh@Z)vd4zs>Y zNC6GI7sUN=GN;_Pf92{m^frx&dGMyPi)Ry$Mxo%^E=I;WIQ<^5xWLXZw3#^<=5aOy zZ_VMS$94N2Umz4(83P7|A`du?*qYkiqcx=ww~W$Wx9!D&{3js#^V;B z<5hl?59eRp?M9P)eDWjw(mpjFGZb=D@OKS4m$ME~neh(1o9z797{Tj1@P8sD)a=~u zSR*^LJHRCo6xtl&<&LPF#7&Ic%lNew1yOkb4V8I)|Ymlmu&n6%h>331s_$)Geik60p9+ zX#7v%tO$!Pe0$LPI9M#{#yjoQrAzgI; za-I}cgbeQA=mu@TERZtTEx~6gB3o01y`rl6AihX8!NX3L#vq57y<{bV=&hk%z zLJxp-I^o$5zE8jXwL_pK<2iW966!w?he0apL>WDvL zFfKm@)0QQ{$dtq_U??sTC%+lHK|uG z65yL@w|D8wv?d|RLD=!x@RccDQo^DS4^E$w`(#?V9v$NUdlLB;ZBp;_5|u7btF&=> z1>z>213Pa2?t``8|M)k?dd)3qfZ~iKH!JL6C{tC~5(y8YI5nBUmI7Z)V~+e1jeb*i z!H4B5RMiZyPHlFSh;UG5S9()=KiY~J1R@o1WdzKTkjhjtK)PBO$Djwr-Xvruz#_5{wIJ9`Ekfp65D zf)8|7SX7!}Ld@D26nyu?+HT?EmKCy0*o;h3xV=<0A`lxTlZCexB%&86RUB)jv51m( zBiojt+D4@?!~oCk^9<*j?Vx1m7a4%6H=JUYeGc)+1tkW$`hF8Cu<}sg~)YsWHyMTXkA1WMDZ7+G`(SrgM7$FFW;j)30dSBi~_Ye!a7d$XVDw; zb$t=}6UYl0lmJC7A~NURNwh(0g>w4b%U!%ZtWQzBighYas(BT;SG7fU_JReVA5?G$ z0T^fWdopcBap(sb7^aNBAe46K!?cl3I+0?Rsc4pJ=AfA7!8u>-B5R$jI^D;M%OBFBBeA-B zAc#X7eUc;~O`LSqZ=XNsw=ZB;Af2!?gBr6Y#2p5lPQTvOBSZD91uReHjw<%TYj;uY;4G{P;Z4k zq!N5$G#W*<(dee4A5(d@(b(w+aoHnJ(##qO;u(2^#5*Kte+Txg>4}(0l0(sYIv4hM z)$``7i`A1=TlawdbfWYIMih3^@Ak&o(J|GGdb`Wz7kdh*hLQr4BpxaZ@TjSFl~(al XtKvhUJisLi3ge|c7KPKo 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 diff --git a/ObservationSim/PSF/__pycache__/PSFModel.cpython-38.pyc b/ObservationSim/PSF/__pycache__/PSFModel.cpython-38.pyc deleted file mode 100644 index c7adf737f573d401e0b954effab184402bfb5686..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1411 zcmZuxPjA~c6elUkl4ZMpjbuQJfxr%hfucszTTm<+3bdzYLEIgttq^FDRussRLdt<% z$iRU0y6@2JHeiR|cO0+}!Rro1Z#(a__vEC_uu*uAe2-5*zW4YZzZncd0^`}cJK}qn zkUvqlK0rqffXopvNhHllw3%r{TbV@;%q(~3UgXiuUMKR~y&wwOxf^w#6X{6z4Uw)2 ze{`arq!TjoJ^(5?98nu&MXhwTBNNnI9}WlyK<0B`ir}dclR=9{;cQQK-jK+ZKHzn2 za5Q=LqLeCs57zB?|F|8$?OVo&p&RQWE%|9{xf`j&+U7XVy1aI;pb4dXhVcASL2x|($zxAvPj1!o5u+_5o?tzVbu8PWb$(S_0%YR zF6yi-CfR%pjv}?rKB`tWh~uot>NxJAOAHucuWx^}xY|w7jjM4379LO=#m}&)$tjie z9$9x9N3tR0d`Q-QP2RG`ZQLPgyv7@nZE``^K@&8r=?n>2biu-bJ@g{<%)}%3!Y}@s^HmNq>5Li$uL_S(gG(U{DLb#|>N^hfB$o;kdelR!e|gXob23{+-Z?QAt_IR{$WF z54l|JeLD4{AOAi6Uno_!RJnPDE*-0Sp$l{eE2vNsBi-Za&O@H=f>&}AgT`v$55#!- z08CT7)*t@(;;VEg`1O7yf7@?0gnWDO0qfyXA_td?zxGGWQf1vKL_7*CD=N#X49fRR z*Vc!iYEkUkPAYP!Nb5~bl+f1KLS~{c)-x!NZfGB{tpi1_16V}?)ctd@Fvc>u1X@L& z*gY1~vf0csokVT|k!q|x>!>`p>`X`4cP-whHqrR9SRXea2Llky9blvvvOe9SeYQpK zvn_u}U*7_oO&?quAC8#Drqo#6BM*C{fGdt;8^-axl#3kK{Wv~bhg`kg4{oP@p3@=F^B^LOhASM5Elyoi4=wu#vF!RhA0L`h7_h?22JLdj6h*c z##J5QgntZxj#_1*h01ZYU8#0tHdwqXBaPvz&q$VyGv9NJ5btPXm>7$E|NdE8872 z&jOPSxD%wGd{emE)9v&@EN+vr{*SNqSPJj~r^~aMqhES8B@DrFhqO8GFbr zh&$_!NIj!SYufSL@N56j!{spkAOGm94kBSbizQ oqi})WKNp)nG!{n-b+}S4x~kNCSZ}9iA(_$JbNp4oQb!cWFIr1eXaE2J diff --git a/ObservationSim/__pycache__/ChipOutput.cpython-37.pyc b/ObservationSim/__pycache__/ChipOutput.cpython-37.pyc deleted file mode 100755 index 7a0ebcf2761553dc61ad0ccc8bace2364705e729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3271 zcmai0-ESMm5x*}UKSjxsEXhujTpFu2(@3%uJ5C%o5lzxI9g9*)362jf4rlI?KAK;- zJKECW_+CB3F6njrS+vcoP1sZEm&YzMyCxg?3Uw z3H}ZeYq8=eu@0)n2B;RNK=s%JHR3dAD$anKvC7nQ3b-^lO>&ty#q?EWnv1pP*;w!8 zUZ{}g<7}LZm0mtJdWDX*qO8)aIrPlo)W)ANm!)K1k(tvxOHT_dGo54EX)(^n1u2=2 z=i;K|7Q!=_S!B7Vw9`fKi_e!p=U=EQtccU*8zSqwPMZ%y?u#7b?HM2Cob_Nm*z9;= z@Z*18zI+)On{79Yu6|grTJ@^ahK;O_*T*#LxIS>Z+&W1r-?gB|iY#}LSyrj&M(!K%}=S7R981I zqw$%fI~f1@=1#|oF3oz9{{K&NLVZ$N7WvMo?e?8<-yL#c(BXtZrxR&!(EXa9TzbW9 zi!?tThu(mT^q|KMi7^ukiuBBUqR{0bIniDB0q+Zw)YYpZOLfwfPb}wzCu1%$Si%{) z18!$vVaW;oA@haa8HBnPxUuyr!wY&7h4++laC z%7aJYXuMTvwGJh50&lRj{{RCYyP-E4w$P+wC$Y0RJ`owm@rGXLI2x1&AAu;U`Np49 zb81E{sw?WUW~j+eeML1|I;HECo;E3>j{=c)DudBi6~F-;Tj?RZnEo9?T(&fZAVUiQ z+0$8C@(4(bGgwx(a)5<`mS?mKT{WbfLU69;5`;C27xZ=Ji!M0R7$R%?q62eXR`P6|Ji$ueIZxB z&VEmI_noPBycTO!1MUDUvJf-6`#Az8jiex zTi(#(8(U-VnDap9OAZFU5!2n=m8`X02>u9y=`j2L_F20(x6_o6B?VE$c z`d%$sg~yJ9iO(&HIZ_>P_&u|YTjhEqTC7y6R@X&$vS_(_WM^9C!=q;Tu+}9<`Nzwj zcB6&B4JW>IQmfA&^S+(N#LDgZL3ECy5{O0$!iU@c$`^xCVkHxT2(jX) z9TjWGVIr017UqpsrF=KBsiOSrE0MZk*P8pURN@(hQR>yGcnT0;R%z%&YrD;&44GGA zo!M+1)N0k){0qBLu1Ovgj5%j^hOXwYws$ZS-~U^*Kxklvd@$y?NH~O@hE>b0S|!SE zUt4D%6Nw72uS+gMcx0Pct#z~)ouO5wKU%?LFo3meqXB_!mX8i^?>D2f)tX(uTR$Qv zXx*#dEH^jqH;(Mot>*sGL9~94yN|59WDVH)-pGGM^(}ui!4o+0t;EQsGZKVFjv~R4 zk$?vk{+;j=jfFwJDs)_#zeqPM5qpU^!s!IIk^Lw>B^wgTg*n8|o#R=3V&`1O93Mg8 zvy$PTr*UUNY!g`C;7^2sH)0@BJR$EvD6*3=gL~etHfcg|9Yg`f7S#euPF;{(0Z5!d z57h}SQ)@x;=Yh~GQc9zvf-{5_ah>miTnsXeWyuK}u&_oUHB zAWeO#SziV)V zf&`hA+B+ljEFF2&BFd7?tDu>(q|VZcGNqhq`T5y+?sYDtH)h@j=Qe`S^-C*4Jx(q) z^WgX;HSmqk^1Tx`Om+`NuhibHP>aI@>ef<>E zlZ*#AxovuvWoD^1*@7 zBIh`R5u5ahFF4M(6Stp8{P!``-yl*Ya+3&U3#SN$1?3HL>j9-taQd~3l}XFqMoAMU a3<4yP?Nc+QA{kYg>&g0GlAeE~DE|eZF;n3H diff --git a/ObservationSim/__pycache__/ChipOutput.cpython-38.pyc b/ObservationSim/__pycache__/ChipOutput.cpython-38.pyc deleted file mode 100644 index 283aa63fcd34841cb43c2406210e8f7cd9f58007..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3324 zcmai0TW=f372X?{S5cCsNWSE^3b7to3Ip3W9 zxw)Kz-_q|gzx{qeQNAbP zWoAW|oz2IEcuwjU<6=B7xl`d1*3YxtGdlG$_~jSxfG)mNRd^P+&o@QZcbyI&h1?f8 z#ydxRlylaCwP3yLg~31m^Xk>B$XM^VVRY?$qh>W~P6s}-y50cGtb@kT?Q!cc>3r9M z87s0dXmtl5?Pkl0F7V23`=-S=B&~q4dKIg;Ve!h&jW$HkT=dmi0^u`BH!%P6^^L9-T|OE~#{WOf3H51dMdZ8VjyrHB19!xQL6;K- z-A<&vVec+KynM`5j+qUS<_D9|8*-5z_SqgWX5vbbKJud|^ms_ob5Lz51Ho+{SgD{4ntv#CwwGy%n+%kz8CV+f-nL; z=)(SZ)b)CP8gc4ph-8USzWEf?eu2mwks^^55IcigB%2!8qGA)>unp`49(3bRivK<) z{?IHBM`3y5`fd=8{qm#nke9pesCPK!Y&`0ftL^rlGvZI3u8%7`9s7^VI}ZcyKXF5E zJZgKxGI=7&v-QcL$T*HS@1 z9Wr+Oqr`m=O(yS1RRALhex;8@Wcs&&1u1C^=?Do4+}BxJ@C8KSy9UKkkb7OTaeNsq%1onc}lz-TbBGgY=y0UtFhDUjO@=smuKgs?p^SOBmO=1 zzSMufEcT()e#FkR3zA!7KaskhvWv1WVci`2nbiH9eGJK5RoEpdud_0{EV&BXV4q0t z3cHFq024{)31HZ#QgiL(__D%2lcS&i&(SZ~FXZmm*)OT@ottT~R#SenFw3*&=0U6iT)u4D=~k_|(`eVD6`#Az8jZbxTi(dxm&z0GfDcN#Feu_h>WMp;B9%Jh z;SgYC8?~+0-DtJu`j3xRT|8b>4oY^q{$O{nv0aZ=5x(PK>T`=ykxU01X~1mb)>fk# zovK!AR?o$7vguZB-_EqR_V!y_d-Wa#%3ojob2C~9+;Hm4K(z+^2_M*LEUeyc>_%rO zS%G+DAbi9vGB_LuuGg{6n~i&W^;UG0#1>s7N^jq(T>_RxrR_2Ex*liNo$0`HM^?=Z zxpfihk~QvH;~#S)%G7WgxoAmFdQ*+d{%XI`+<73+t89L^Sg5!xJN7MFRa%r#EOL|pj!Xc&vk2>imvAf$3Q?isOZiLiUV__H03|>z!F!%W zsz)TC3v+}6I|oPop`CLXb9}_U&q{{>F3np7u}$E4lRp&(UW%ba@`QWSzoF)C&{EmibcqwK>bqa@p+U{X_R4Ve-5pPHZSoB8WdYVAythH)UZZQuNvmh1RQ}ZTM$t@i~xEQGQ^dk016$ z8u;g+au9kj@{Od_FW?x(9Rh#YdwcUN z#vEDS$Uu?r`kUePdP1|L`lK(Vsi+|Ia2%0yoZ*;F2gDZ~=bNcJNHo5Mss0rrcZqBh zp$g{&q2%!C*wg|lr4agOGgc-oN1G*0m~aYUM9L>tN<%WYGS`#+za$&~MpOO^gOp&% diff --git a/ObservationSim/__pycache__/Config.cpython-37.pyc b/ObservationSim/__pycache__/Config.cpython-37.pyc deleted file mode 100644 index 926b5309c212df628860deb69dec52b024174e62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2487 zcmah~J#QRE7@nE^UVp?mjuVR%8$*;FihPiQBC?Q$L!>k&iX#E5pws4N?!58c?s{e} zj;*tVKa=Ny69)6Bll`!%<_&olG!%uGz+ z`flO<4x1t5cLb-G1I8K*wE`0-oDN7@-)TyD$QgHD(3EkPdoM`paGwWocRAf8t>_qP z$VL}?;N`>cV64MXk0~KJIdI05lWivNY4VgFF*`fjeMMi<$Lzp8@Hjp4#_kd0;DPno z*KCP^MK6=F!<|)9gkxG;I4=?I+K9JmXC`;Zl22lY~uqkxAsUIY(4t%z(z zJW&zbil5FZ0H3RvvK7-471Orjud@okO$Ec}eM#k9^M7Y-?W}zg20pNGULs>+BNt9F zpR@R_Gdyqc#WTEM@g>CY_7^u!X#4nYxYBT#!li&ch_&PRGG|% zohMm$dsLaJZdvs5ey5iY#C`zQNQ!nkTaI)!(%|je9^r5sS|!)jzNfmGew_foCU`0z z_FuaJ)NY>XtZjlO&4g&!rDm%#FLYk?)6Z8RDV;gRbvV42544b~oyL$3mTeb562oec zX#xIe-Pjmug@%>NxK*aNjHjwWu1%0VQ5J_C+q2U#?o(LQ_~Lo4v@*WhQ_!U4OJu1D zcT2gA%_I`mL|6;33!T7OWJ6(S=UXB#LiA*mOjMh9bLpZsP-}#`ETmWHG7H%po1=4d9>&?s zVmc3T^uW)Nm!P5xlCoC_^O?~81OPVGerkLW9Mz%(1PLwevm|5-a@=aAkdU;cRD zj@j58g3Pw5T-#aZfVKnqP2+VyuzKu)=pB?J2-QCb#wb*O9ONKWN_KwJ zKKC#OiGK(l?r)Nv<*^5%V<2Gc@x%Z0c%AJ+_AfijJInvx^)sSj8-ORGW88Rx{qG-& zj3;@KWJ%5Gk+iQpLB1tf!4oO;NEV6S5|AOKP*quQpkRVu`KD^E#BuZh#UYS-cj73T z5C;an*Ysn_?NpIm_%T=-~flh%0??PZdr-KM7ZQ2FN8AA0I(;4 zj6z1x(Dd11}INM^+ zIM1?yRYN^3;94<$gu3ZU3J3|!=@O6&@3{BE9q4E=gI$o|d2mEIoF-^D8F)r`O_o35gHyp)hK(;m ztl3j%0Xs#F7j}M|Wlsn2Pc?X|iNii`G zAl%(+UjV*8`20EFMSF5EzHrWa$$GEw#Zxax;PSq<-*keQ34EfFPzi7nSugYcmQM6u zCH{lyccMsUyOSJ^&e7QR=aca`0`6s-omgF`(u@D|B a(rPGN9hQ7F5Fa7^6>jXH3>IGt-~9&|- diff --git a/ObservationSim/__pycache__/Config.cpython-38.pyc b/ObservationSim/__pycache__/Config.cpython-38.pyc deleted file mode 100644 index 6088fea448ee536eb8272290efe5ab5d9cf18d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3141 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 diff --git a/ObservationSim/__pycache__/ObservationSim.cpython-38.pyc b/ObservationSim/__pycache__/ObservationSim.cpython-38.pyc deleted file mode 100644 index 4c27078d55d9396bd26e6cd82fa92d62f2c05050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8648 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 diff --git a/ObservationSim/__pycache__/Pointing.cpython-38.pyc b/ObservationSim/__pycache__/Pointing.cpython-38.pyc deleted file mode 100644 index 49945ad93f669fe1b8b86ad00e905644ced0c89d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1245 zcma)4&2HO95Z+yq5=~2ttT1AfxOJ4sPMrXz6BK9@78{AlO{#51Y$X=AP&Ro@SiBD8jlI}_ny4)qcfbT^ zPWdJ@U{ln)1m)&6qb_V@xNr+xu`y@71zQ5S$K=NbZ$oQwdr7!=AqC-gCWLqJ_o0Q} z&-q=ryXc}<@Aq)O51qv}X1Fhi&akAEfPZaqZY&p981thgK_6Ru44ozAol5di^2H|K z5se9j2hf>QkMJJ)wxJ^^?EK2Q1o^DuZ-f8d=A+FQO+2;Z5$O5)lqFnoOSHrm_J+)B z{2^G2NAM7H^zjC}qRsbU3$yg*w7Top{4wlerhZj*4<2`kXuf4vRKA10xD9(A5uQgr zBfOv9gSEd=`CmgH_HKMv^x}1On_bMbTS+~Xdg9K6@=pXEkp0d|zwvkbR5_;*ilZzY zM-$X+5tdL!30!^}L;;C$lMtES&^Jlnh6ifT4sK!UBS$!QlI#grW>C zp9B~n)Rbu@pzCCCjHXvI6Vp*y45Fl1b1vH_X9dWg!ZONIG#`w{6J^6M`LN3G=UJ4N zQ95~cIDCHi{MjMG0mf8Ru5c2`%0uAn+W|L@UVan(jdQxf`6a8ahK2?`*egTB3k~lO z_V*Rb3T36!B%djk=DfDPyJYBHXBFS|(LMOh;j?j2O}nYA9zpC{`Y- z4c*tG43k{Zk~iOL!|bf!bpbKn726xBT7Iev{f)?{x+xm|ISG=q4DwKhMVZO}I~4zY z;o#NvlOAC2?H377L=0c($1F|}Y--a6Z7`FX%%wJK7%p|t;!w2Ur~Ni`(9zN5%`I%>F% z$~-_Q4|@9^u(1hy9(YVH;F~iNU%73%RtjeuobTDi3CV)gl1GU*gdB-7cz=#E+<8*Y a7Gz9Wl^9$2?loQ-Ct596FxSM=HHJTh7dBo1 diff --git a/ObservationSim/__pycache__/_util.cpython-37.pyc b/ObservationSim/__pycache__/_util.cpython-37.pyc deleted file mode 100755 index 85a261115d1398f4d2166edce8a1bd9d73bf7493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1300 zcmZ8h&5j#I5bo~z^{f*qXyYX)2d~g77zsP%h!9$lAc&BbgZYt0NUK?Q+n(4nV|Di| zu{Cqa<_h8wvfOw9ZoCDjzH(ZLBd47By6u%LdZw$Yzv`;$sj8mO@7zfU#-INT&wua< z`P(jThX>&lQ#}FUgwrKSspBkV;B4s?Ug}Z8BkpnkHBEgU@bEQB15U?e5Z}O#oDHan zd8UQV3o)Sq_{bl3)%56lM!{|@^FSO6>lhFA{!4Oj>)1ctZ{ z`vX`6ENTe%7EJ!d{RR;lzX_VKiKcdcr~C@q0NQ_fxUX&EskQBtA3z^1*soL`@_2v8 z&OX)$9AEN^HXUR$IlHk*+jx&pl(cEw+VjR4ak$-d8hKexRz_0cB>XXb8I>s77K@tNm5muXT|lg0C5 z_AHlg>1Y!d3!wd78x5$uhm%YD9nxmRL{dC2xpo$st8h6bY21Nzup#=;nhkK&&}Ka;5!X zW@jyvAPf1rOxPdyFLQxApiJ>}Hj%&r{4O=h|C_I=LGdvD(3?|Qw6 zVEq1He@gz*CFI`*xjq~q@8GSDFmb|ZMn=>^He!G*b8=_o(1z!ZT<&o9D>Cx<7WcUS z6&?A!%L5+bE8soe;Ss(Z7s84ms6D3rdi;1CJ4T=vB?;&2hz9Q%Jf^5i| z95YTiLREwKbWz(wv{WQ!HspRBt3`>h$C%GJI1 zQYj{?luPU&QSrR2D^c0q+E`Iyq zATQJbXi0@*9n8yI988m9wyXs&i`fAjG@g`PjHSp#Qi+4Z;qcKg%?}0-6t+4;t3Bw7-KEfEKI?cTSl6CwJFaVePKHwZ9IgM!r*g2(Ab2f4P61 zyAG#Dw^O_desIFRp>l_Z*Cks0P;GIXdG+${?r!|+^eJvnEYsOs#dnpu8$V65S`7MKX;idd zt4UFwYNt|CyGxNs?d4^m=Gx)O64#}yrS|i*sFl!uC2(c9-pbR7EL+4$3#Fq^jMew0 zEM-5^OexK3r5&*pBS+*VCZ1rLo3A{@REd!*a?C-IVOQKzb(e3Z{%^2O-gHcJibCy*XLY%Tm2+kF%3 zRWD;Ah*+00dJ|Q|r#qOx!{mMNCni0whB=#wp{*wxA5G*;+;Bq!`H~_WHy?M&M%2>H z-F)2Q{vEPuqs;?+JIX|#@$e@E5ypI*T+ofnI~%W1$~kt=y){L=7O)!`yQ{aM;Tzh< zU;D=a-+~oX1GH}PHRD@T?BqGtF&M*&8wXkQN)uNV^6nX>1h8iy-+s)DM3Y6fK6q0H z5&zMV?p1SK#BtlVbkv|~xe$G(Lqw)h2`-%{o++8E?me{i+cwbWH@#8Gg_@WAE_#ea z)+iwd(nLTcF4B?`W<-(K(k_@-RcXeW zSI=ecXdq5*M4E)D74@(Q7>j~Zzj~x zxc&okDw}L(9|T=4WH*qZU1Y8Ac2R2>YE49cj@%9LY*YCz-hzW43MDT4fX7TDZ0&(+;F9h2byrlGmB|m8t)giIG_oyI^5A+Kq1f4@Ug9 AZ2$lO diff --git a/ObservationSim/_util.py b/ObservationSim/_util.py index 79bda93..2e69c3c 100755 --- a/ObservationSim/_util.py +++ b/ObservationSim/_util.py @@ -15,6 +15,83 @@ def parse_args(): parser.add_argument('-w', '--work_dir', help='The path for output.') return parser.parse_args() +def generate_pointings(config, pointing_filename=None, data_dir=None): + pRA = [] + pDEC = [] + if pointing_filename and data_dir: + pointing_file = os.path.join(data_dir, pointing_filename) + f = open(pointing_file, 'r') + for _ in range(1): + header = f.readline() + iline = 0 + for line in f: + line = line.strip() + columns = line.split() + pRA.append(float(columns[0])) + pDEC.append(float(columns[1])) + f.close() + else: + pRA.append(config["obs_setting"]["ra_center"]) + pDEC.append(config["obs_setting"]["dec_center"]) + pRA = np.array(pRA) + pDEC = np.array(pDEC) + + # Create calibration pointings + # NOTE: temporary implementation + ncal = config['obs_setting']['np_cal'] + pointing_type = ['MS']*len(pRA) + pRA = np.append([pRA[0]]*ncal, pRA) + pDEC = np.append([pDEC[0]]*ncal, pDEC) + pointing_type = ['CAL']*ncal + pointing_type + + # Calculate starting time(s) + # NOTE: temporary implementation + t0 = datetime(2021, 5, 25, 12, 0, 0) + t = datetime.timestamp(t0) + timestamp_obs = [] + delta_t = 10 # Time elapsed between exposures (minutes) + for i in range(len(pointing_type)): + timestamp_obs.append(t) + if pointing_type[i] == 'CAL': + t += 3 * delta_t * 60 # 3 calibration exposures for each pointing + elif pointing_type[i] == 'MS': + t += delta_t * 60 + timestamp_obs = np.array(timestamp_obs) + pointing_type = np.array(pointing_type) + + if config['obs_setting']['run_pointings'] is None: + pRange = list(range(len(pRA))) + else: + ncal = config['obs_setting']['np_cal'] + plist = config['obs_setting']['run_pointings'] + pRange = list(range(ncal)) + [x + ncal for x in plist] + return pRA, pDEC, timestamp_obs, pointing_type, pRange + +def make_run_dirs(work_dir, run_name, nPointings, pRange=None): + if not os.path.exists(work_dir): + try: + os.makedirs(work_dir, exist_ok=True) + except OSError: + pass + imgDir = os.path.join(work_dir, run_name) + if not os.path.exists(imgDir): + try: + os.makedirs(imgDir, exist_ok=True) + except OSError: + pass + prefix = "MSC_" + for pointing_ID in range(nPointings): + if pRange is not None: + if pointing_ID not in pRange: + continue + fname=prefix + str(pointing_ID).rjust(7, '0') + subImgDir = os.path.join(imgDir, fname) + if not os.path.exists(subImgDir): + try: + os.makedirs(subImgDir, exist_ok=True) + except OSError: + pass + def imgName(tt=0): ut = datetime.utcnow() eye, emo, eda, eho, emi, ese = str(ut.year), str(ut.month), str(ut.day), str(ut.hour), str(ut.minute), str(ut.second) diff --git a/config/config_sim.yaml b/config/config_C3.yaml similarity index 95% rename from config/config_sim.yaml rename to config/config_C3.yaml index 595c111..f4bd7fe 100644 --- a/config/config_sim.yaml +++ b/config/config_C3.yaml @@ -12,7 +12,7 @@ # work_dir: "/public/home/fangyuedong/sim_code_release/CSST/test/" work_dir: "/public/home/fangyuedong/20211203/CSST/workplace/" data_dir: "/data/simudata/CSSOSDataProductsSims/data/" -run_name: "TEST" +run_name: "C3_20211216" # (Optional) a file of point list # if you just want to run default pointing: @@ -24,7 +24,10 @@ pointing_file: "pointing10_20210202.dat" # Whether to use MPI run_option: use_mpi: YES - n_cores: 40 + # NOTE: "n_threads" paramters is currently not used in the backend + # simulation codes. It should be implemented later in the web frontend + # in order to config the number of threads to request from NAOC cluster + n_threads: 40 # Output catalog only? # If yes, no imaging simulation will run @@ -65,19 +68,19 @@ obs_setting: # Number of calibration pointings # Note: only valid when a pointing list is specified - np_cal: 0 + np_cal: 3 # Run specific pointing(s): # - give a list of indexes of pointings: [ip_1, ip_2...] # - run all pointings: null # Note: only valid when a pointing list is specified - run_pointings: [5, 6] + run_pointings: [1, 2, 3, 4, 5] # Run specific chip(s): # - give a list of indexes of chips: [ip_1, ip_2...] # - run all chips: null # Note: for all pointings - run_chips: [1, 25] + run_chips: [1, 26, 29, 6, 7, 22, 23, 19, 20] ############################################### # Input path setting diff --git a/config/config_example.yaml b/config/config_example.yaml new file mode 100644 index 0000000..723a9d1 --- /dev/null +++ b/config/config_example.yaml @@ -0,0 +1,223 @@ +--- +############################################### +# +# Configuration file for CSST simulation +# CSST-Sim Group, 2021/10/07, version 0.3 +# +############################################### + +# Base diretories and naming setup +# Can add some of the command-line arguments here as well; +# OK to pass either way or both, as long as they are consistent +# work_dir: "/public/home/fangyuedong/sim_code_release/CSST/test/" +work_dir: "/public/home/fangyuedong/20211203/CSST/workplace/" +data_dir: "/data/simudata/CSSOSDataProductsSims/data/" +run_name: "example_20211217" + +# (Optional) a file of point list +# if you just want to run default pointing: +# - pointing_dir: null +# - pointing_file: null +pointing_dir: null +pointing_file: null + +# Whether to use MPI +run_option: + use_mpi: YES + # NOTE: "n_threads" paramters is currently not used in the backend + # simulation codes. It should be implemented later in the web frontend + # in order to config the number of threads to request from NAOC cluster + n_threads: 40 + +# Output catalog only? +# If yes, no imaging simulation will run +out_cat_only: NO + +# Only simulate stars? +star_only: NO + +# Only simulate galaxies? +galaxy_only: NO + +############################################### +# Observation setting +############################################### +obs_setting: + + # Options for survey types: + # "Photometric": simulate photometric chips only + # "Spectroscopic": simulate slitless spectroscopic chips only + # "All": simulate full focal plane + survey_type: "All" + + # Exposure time [seconds] + exp_time: 150. + + # Observation starting date & time + # (Subject to change) + date_obs: "210525" # [yymmdd] + time_obs: "120000" # [hhmmss] + + # Default Pointing [degrees] + # Note: NOT valid when a pointing list file is specified + ra_center: 60.9624 + dec_center: -41.5032 + + # Image rotation [degree] + image_rot: -113.4333 + + # Number of calibration pointings + np_cal: 2 + + # Run specific pointing(s): + # - give a list of indexes of pointings: [ip_1, ip_2...] + # - run all pointings: null + # Note: only valid when a pointing list is specified + run_pointings: null + + # Run specific chip(s): + # - give a list of indexes of chips: [ip_1, ip_2...] + # - run all chips: null + # Note: for all pointings + run_chips: [18] + +############################################### +# Input path setting +############################################### + +# Default path settings for WIDE survey simulation +input_path: + cat_dir: "catalog_points_7degree2/point_RA60.9624_DE-41.5032/" + star_cat: "stars_ccd13_p_RA60.9624_DE-41.5032.hdf5" + galaxy_cat: null + +SED_templates_path: + star_SED: "SED_MMW_Gaia_Cluster_D20_SS.hdf5" + galaxy_SED: null + +# TODO: should the following path settings be made hidden from user? +Efficiency_curve_path: + filter_eff: "Filters/" + ccd_eff: "Filter_CCD_Mirror/ccd/" + mirror_eff: "Filter_CCD_Mirror/mirror_ccdnote.txt" + +CR_data_path: "CRdata/" +sky_data_path: "skybackground/sky_emiss_hubble_50_50_A.dat" + +SLS_path: + SLS_conf: "CONF" + SLS_norm: "normalize_filter" + + +############################################### +# PSF setting +############################################### +psf_setting: + + # Which PSF model to use: + # "Gauss": simple gaussian profile + # "Interp": Interpolated PSF from sampled ray-tracing data + psf_model: "Interp" + + # PSF size [arcseconds] + # radius of 80% energy encircled + # NOTE: only valid for "Gauss" PSF + psf_rcont: 0.15 + + # path to PSF data + # NOTE: only valid for "Interp" PSF + psf_dir: "csstPSFdata/CSSOS_psf_20210108/CSST_psf_ciomp_2p5um_cycle3_ccr90" + + # path to field-distortion model + # Note: only valid when ins_effects: field_dist is "ON" + fd_path: "FieldDistModelv2.0.pickle" + + # sigma_spin: 0.0 # psf spin? + +############################################### +# Shear setting +############################################### + +shear_setting: + # Options to generate mock shear field: + # "constant": all galaxies are assigned a constant reduced shear + # "catalog": from catalog (not available yet) + # "extra": from seprate file + shear_type: "constant" + + # For constant shear filed + reduced_g1: 0.026 + reduced_g2: 0.015 + + # Representation of the shear vector? + reShear: "E" + + # rotate galaxy ellipticity + rotateEll: 0. # [degree] + + # Extra shear catalog + # (currently not used) + # shear_cat: "mockShear.cat" + +############################################### +# Instrumental effects setting +############################################### +ins_effects: + # switches + field_dist: ON # Whether to add field distortions + add_back: ON # Whether to add sky background + add_dark: ON # Whether to add dark noise + add_readout: ON # Whether to add read-out (Gaussian) noise + add_bias: ON # Whether to add bias-level to images + shutter_effect: ON # Whether to add shutter effect + flat_fielding: ON # Whether to add flat-fielding effect + prnu_effect: ON # Whether to add PRNU effect + non_linear: OFF # Whether to add non-linearity + cosmic_ray: ON # Whether to add cosmic-ray + cray_differ: ON # Whether to generate different cosmic ray maps CAL and MS output + cte_trail: ON # Whether to simulate CTE trails + saturbloom: ON # Whether to simulate Saturation & Blooming + add_badcolumns: ON # Whether to add bad columns + add_hotpixels: ON # Whether to add hot pixels + add_deadpixels: ON # Whether to add dead(dark) pixels + bright_fatter: ON # Whether to simulate Brighter-Fatter (also diffusion) effect + + # values + dark_exptime: 300 # Exposure time for dark current frames [seconds] + flat_exptime: 150 # Exposure time for flat-fielding frames [seconds] + readout_time: 40 # The read-out time for each channel [seconds] + df_strength: 2.3 # Sillicon sensor diffusion strength + bias_level: 500 # bias level [e-/pixel] + gain: 1.1 # Gain + full_well: 90000 # Full well depth [e-] + NBias: 1 # Number of bias frames to be exported for each exposure + NDark: 1 # Number of dark frames to be exported for each exposure + NFlat: 1 # Number of flat frames to be exported for each exposure + +############################################### +# Output options +############################################### +output_setting: + readout16: OFF # Whether to export as 16 channels (subimages) with pre- and over-scan + shutter_output: OFF # Whether to export shutter effect 16-bit image + bias_output: ON # Whether to export bias frames + dark_output: ON # Whether to export the combined dark current files + flat_output: ON # Whether to export the combined flat-fielding files + prnu_output: OFF # Whether to export the PRNU (pixel-to-pixel flat-fielding) files + +############################################### +# Random seeds +############################################### +random_seeds: + seed_Av: 121212 # Seed for generating random intrinsic extinction + seed_poisson: 20210601 # Seed for Poisson noise + seed_CR: 20210317 # Seed for generating random cosmic ray maps + seed_flat: 20210101 # Seed for generating random flat fields + seed_prnu: 20210102 # Seed for photo-response non-uniformity + seed_gainNonUniform: 20210202 # Seed for gain nonuniformity + seed_biasNonUniform: 20210203 # Seed for bias nonuniformity + seed_rnNonUniform: 20210204 # Seed for readout-noise nonuniformity + seed_badcolumns: 20240309 # Seed for bad columns + seed_defective: 20210304 # Seed for defective (bad) pixels + seed_readout: 20210601 # Seed for read-out gaussian noise +... \ No newline at end of file diff --git a/example.sh b/example.sh new file mode 100755 index 0000000..c37eecc --- /dev/null +++ b/example.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +date + +python /public/home/fangyuedong/20211203/CSST/run_example.py config_example.yaml -c /public/home/fangyuedong/20211203/CSST/config diff --git a/run.pbs b/mpi_example.pbs similarity index 82% rename from run.pbs rename to mpi_example.pbs index 497e0c6..23730fb 100755 --- a/run.pbs +++ b/mpi_example.pbs @@ -16,4 +16,4 @@ NP=40 date echo $NP -mpirun -np $NP python /public/home/fangyuedong/20211203/CSST/runExposure.py config_sim.yaml -c /public/home/fangyuedong/20211203/CSST/config +mpirun -np $NP python /public/home/fangyuedong/20211203/CSST/run_sim.py config_example.yaml -c /public/home/fangyuedong/20211203/CSST/config diff --git a/runExposure.py b/runExposure.py deleted file mode 100755 index c77e1cd..0000000 --- a/runExposure.py +++ /dev/null @@ -1,125 +0,0 @@ -from ObservationSim.ObservationSim import Observation -from ObservationSim._util import parse_args -from datetime import datetime -import os -import numpy as np -import galsim -import yaml - -import gc -gc.enable() - -def Pointing(config, pointing_filename=None, data_dir=None): - pRA = [] - pDEC = [] - if pointing_filename and data_dir: - pointing_file = os.path.join(data_dir, pointing_filename) - f = open(pointing_file, 'r') - for _ in range(1): - header = f.readline() - iline = 0 - for line in f: - line = line.strip() - columns = line.split() - pRA.append(float(columns[0])) - pDEC.append(float(columns[1])) - f.close() - else: - pRa.append(config["obs_setting"]["ra_center"]) - pDec.append(config["obs_setting"]["dec_center"]) - pRA = np.array(pRA) - pDEC = np.array(pDEC) - - # Create calibration pointings - # NOTE: temporary implementation - ncal = config['obs_setting']['np_cal'] - pointing_type = ['MS']*len(pRA) - pRA = np.append([pRA[0]]*ncal, pRA) - pDEC = np.append([pDEC[0]]*ncal, pDEC) - pointing_type = ['CAL']*ncal + pointing_type - - # Calculate starting time(s) - # NOTE: temporary implementation - t0 = datetime(2021, 5, 25, 12, 0, 0) - t = datetime.timestamp(t0) - timestamp_obs = [] - delta_t = 10 # Time elapsed between exposures (minutes) - for i in range(len(pointing_type)): - timestamp_obs.append(t) - if pointing_type[i] == 'CAL': - t += 3 * delta_t * 60 # 3 calibration exposures for each pointing - elif pointing_type[i] == 'MS': - t += delta_t * 60 - timestamp_obs = np.array(timestamp_obs) - pointing_type = np.array(pointing_type) - return pRA, pDEC, timestamp_obs, pointing_type - -def MakeDirectories(work_dir, run_name, nPointings, pRange=None): - if not os.path.exists(work_dir): - try: - os.makedirs(work_dir, exist_ok=True) - except OSError: - pass - imgDir = os.path.join(work_dir, run_name) - if not os.path.exists(imgDir): - try: - os.makedirs(imgDir, exist_ok=True) - except OSError: - pass - prefix = "MSC_" - for pointing_ID in range(nPointings): - if pRange is not None: - if pointing_ID not in pRange: - continue - fname=prefix + str(pointing_ID).rjust(7, '0') - subImgDir = os.path.join(imgDir, fname) - if not os.path.exists(subImgDir): - try: - os.makedirs(subImgDir, exist_ok=True) - except OSError: - pass - -def runSim(): - """ - Main simulation call. - """ - args = parse_args() - if args.config_dir is None: - args.config_dir = '' - args.config_dir = os.path.abspath(args.config_dir) - args.config_file = os.path.join(args.config_dir, args.config_file) - with open(args.config_file, "r") as stream: - try: - config = yaml.safe_load(stream) - for key, value in config.items(): - print (key + " : " + str(value)) - except yaml.YAMLError as exc: - print(exc) - config["obs_setting"]["image_rot"] = float(config["obs_setting"]["image_rot"])*galsim.degrees - - if args.data_dir is not None: - config['data_dir'] = args.data_dir - if args.work_dir is not None: - config['work_dir'] = args.work_dir - - pRA, pDEC, timestamp_obs, pointing_type = Pointing(config=config, pointing_filename=config['pointing_file'], data_dir=config['pointing_dir']) - - MakeDirectories(work_dir=config['work_dir'], run_name=config['run_name'], nPointings=len(pRA), pRange=config['obs_setting']['run_pointings']) - - obs = Observation(config=config, work_dir=config['work_dir'], data_dir=config['data_dir']) - if config["pointing_file"] is None: - obs.runExposure(chips=config["obs_setting"]["run_chips"]) - else: - obs.runExposure_MPI_PointingList( - ra_cen=pRA, - dec_cen=pDEC, - pRange=config["obs_setting"]["run_pointings"], - timestamp_obs=timestamp_obs, - pointing_type=pointing_type, - exptime=config["obs_setting"]["exp_time"], - use_mpi=config["run_option"]["use_mpi"], - chips=config["obs_setting"]["run_chips"] - ) - -if __name__=='__main__': - runSim() diff --git a/run_C3.pbs b/run_C3.pbs new file mode 100755 index 0000000..d421f6a --- /dev/null +++ b/run_C3.pbs @@ -0,0 +1,19 @@ +#!/bin/bash + +#PBS -N SIMS +##PBS -l walltime=70:00:00 + +##mpdallexit +##mpdboot -n 10 -f ./mpd.hosts + +##PBS -j oe +#PBS -l nodes=comput108:ppn=80 +#####PBS -q longq +#PBS -q batch +#PBS -u fangyuedong + +NP=80 +date +echo $NP + +mpirun -np $NP python /public/home/fangyuedong/20211203/CSST/run_sim.py config_C3.yaml -c /public/home/fangyuedong/20211203/CSST/config diff --git a/run_sim.py b/run_sim.py new file mode 100755 index 0000000..796e735 --- /dev/null +++ b/run_sim.py @@ -0,0 +1,65 @@ +from ObservationSim.ObservationSim import Observation +from ObservationSim._util import parse_args, generate_pointings, make_run_dirs +from Catalog.Catalog_example import Catalog_example +import os +import galsim +import yaml + +import gc +gc.enable() + +def runSim(Catalog): + """ + Main method for simulation call. + """ + args = parse_args() + if args.config_dir is None: + args.config_dir = '' + args.config_dir = os.path.abspath(args.config_dir) + args.config_file = os.path.join(args.config_dir, args.config_file) + with open(args.config_file, "r") as stream: + try: + config = yaml.safe_load(stream) + for key, value in config.items(): + print (key + " : " + str(value)) + except yaml.YAMLError as exc: + print(exc) + config["obs_setting"]["image_rot"] = float(config["obs_setting"]["image_rot"])*galsim.degrees + + # Overwrite the data and working directories + # if they are specified by the command line inputs + if args.data_dir is not None: + config['data_dir'] = args.data_dir + if args.work_dir is not None: + config['work_dir'] = args.work_dir + + # Generate lists of RA, DEC, time_stamps, pointing_type (MS or CAL), and pRange + # (selections of pointings to run) based on the input pointing list (or default + # pointing RA, DEC) and "config["obs_setting"]["run_pointings"]". + # "config['obs_setting']['np_cal']"" is the number of CAL pointings which will be + # appended to the front of all above lists. + # NOTE: the implementation of gerenating time_stamps is temporary. + pRA, pDEC, timestamp_obs, pointing_type, pRange = generate_pointings(config=config, pointing_filename=config['pointing_file'], data_dir=config['pointing_dir']) + + # Make the main output directories + make_run_dirs(work_dir=config['work_dir'], run_name=config['run_name'], nPointings=len(pRA), pRange=pRange) + + # Initialize the simulation + obs = Observation(config=config, Catalog=Catalog, work_dir=config['work_dir'], data_dir=config['data_dir']) + + # Run simulation + obs.runExposure_MPI_PointingList( + ra_cen=pRA, + dec_cen=pDEC, + pRange=pRange, + timestamp_obs=timestamp_obs, + pointing_type=pointing_type, + exptime=config["obs_setting"]["exp_time"], + use_mpi=config["run_option"]["use_mpi"], + chips=config["obs_setting"]["run_chips"]) + +if __name__=='__main__': + runSim(Catalog=Catalog_example) + # To run cycle-3 simulation + # from Catalog.C3Catalog import C3Catalog + # runSim(Catalog=C3Catalog) -- GitLab