Source code for EXOSIMS.TargetList.KnownRVPlanetsTargetList

# -*- coding: utf-8 -*-
import numpy as np
import astropy.units as u
from astropy.coordinates import SkyCoord
from EXOSIMS.Prototypes.TargetList import TargetList
import warnings


[docs] class KnownRVPlanetsTargetList(TargetList): """Target list based on population of known RV planets from IPAC. Intended for use with the KnownRVPlanets family of modules. Args: **specs: :ref:`sec:inputspec` .. warning: fillPhotometry and getKnownPlanets are dissallowed inputs and will be set to False if present in the input specification. """ def __init__(self, **specs): # define mapping between attributes we need and the IPAC data # table loaded in the Planet Population module self.atts_mapping = { "Name": "pl_hostname", "Spec": "st_spstr", "parx": "st_plx", "Umag": "st_uj", "Bmag": "st_bj", "Vmag": "st_vj", "Rmag": "st_rc", "Imag": "st_ic", "Jmag": "st_j", "Hmag": "st_h", "Kmag": "st_k", "dist": "st_dist", "BV": "st_bmvj", "L": "st_lum", # log10(solLum) "pmra": "st_pmra", # mas/year "pmdec": "st_pmdec", # mas/year "rv": "st_radv", } # Enforce required planet population (KnownRVPlanets) assert ( specs["modules"]["PlanetPopulation"] == "KnownRVPlanets" ), "KnownRVPlanetsTargetList must use KnownRVPlanets population" # Override any bad input attributes attributes_that_must_be_false = ["getKnownPlanets"] for att in attributes_that_must_be_false: if (att in specs) and (specs[att] is True): warnings.warn( ( f"KnownRVPlanetsTargetList does not allow {att} " "input to be True. Setting to False." ) ) specs[att] = False TargetList.__init__(self, **specs)
[docs] def set_catalog_attributes(self): """Hepler method that sets possible and required catalog attributes. Sets attributes: catalog_atts (list): Attributes to try to copy from star catalog. Missing ones will be ignored and removed from this list. required_catalog_atts(list): Attributes that cannot be missing or nan. """ # list of possible Star Catalog attributes self.catalog_atts = [ "Name", "Spec", "parx", "Umag", "Bmag", "Vmag", "Rmag", "Imag", "Jmag", "Hmag", "Kmag", "dist", "BV", "MV", "BC", "L", "coords", "pmra", "pmdec", "rv", "Binary_Cut", "hasKnownPlanet", ] # required catalog attributes self.required_catalog_atts = [ "Name", "Vmag", "BV", "MV", "BC", "L", "coords", "dist", ]
[docs] def populate_target_list(self, **specs): """This function is responsible for populating values from the star catalog into the target list attributes and enforcing attribute requirements. Args: **specs: :ref:`sec:inputspec` """ PPop = self.PlanetPopulation OS = self.OpticalSystem tmp = PPop.allplanetdata[:] # filter out targets with planets outside of WA range dist = tmp["st_dist"].filled() * u.pc mask = ( ~tmp["st_dist"].mask & (np.arctan(PPop.sma * (1 + PPop.eccen) / dist) > OS.IWA) & (np.arctan(PPop.sma * (1 - PPop.eccen) / dist) < OS.OWA) ) tmp = tmp[mask] # filter out redundant targets tmp = tmp[np.unique(tmp["pl_hostname"].data, return_index=True)[1]] # filter missing Vmag and BV, for integration time calculation tmp = tmp[~tmp["st_vj"].mask] tmp = tmp[~tmp["st_bmvj"].mask] self.nStars = len(tmp) assert self.nStars, "Target list is empty: nStars = %r" % self.nStars for att in self.atts_mapping: ma = tmp[self.atts_mapping[att]] if isinstance(ma.fill_value, np.float64): setattr(self, att, ma.filled(np.nan)) else: if (att == "Name") or (att == "Spec"): setattr(self, att, ma.data.astype(str)) else: setattr(self, att, ma.data) # astropy units self.parx = self.parx * u.mas self.dist = self.dist * u.pc self.pmra = self.pmra * u.mas / u.yr self.pmdec = self.pmdec * u.mas / u.yr self.rv = self.rv * u.km / u.s self.BC = -2.5 * self.L - 26.832 - self.Vmag self.L = 10.0**self.L self.MV = self.Vmag - 5 * (np.log10(self.dist.to("pc").value) - 1) self.coords = SkyCoord( ra=tmp["ra"] * u.deg, dec=tmp["dec"] * u.deg, distance=self.dist ) self.Binary_Cut = np.zeros(self.nStars, dtype=bool) self.hasKnownPlanet = np.ones(self.nStars, dtype=bool) # generate unique hash for the imported starcatalog self.StarCatalogHex = self.genStarCatalogHex()
[docs] def filter_target_list(self, filters): """Filtering is done as part of populating the table, so this method is overloaded to do nothing. """ pass