Source code for sora.body.utils

import astropy.units as u
import numpy as np

__all__ = ['search_sbdb', 'apparent_magnitude']


[docs]def search_sbdb(name): """Searches JPL Small-Body DataBase to search for object information. As the name implies, it searches only for Small Bodies. Planets and satellites information are not retrieved by this function. Parameters ---------- name : `str` The name of the object for the search. It can be the attributed `spkid` or `designation number`. The name is case insensitive. Returns ------- sbdb : `dict` An ordered dictionary with the object information. Important --------- The query is not an autocomplete search, so ``name='Charikl'`` will not find Chariklo. If more than 1 object is found, the user is asked to select the correct one (e.g: ``name='neowise'``). """ from astroquery.jplsbdb import SBDB from . import values print('Obtaining data for {} from SBDB'.format(name)) sbdb = SBDB.query(name, full_precision=True, solution_epoch=True, validity=True, phys=True, discovery=True) if 'message' in sbdb: if sbdb['message'] == values.not_found_message: raise ValueError(values.not_found_message + " on SBDB") elif sbdb['message'] == values.many_objects_message: sbdb = select_body(sbdb) return sbdb
def select_body(sbdb): """Creates an object selection table. A table to select object is created when the SBDB search returns more than one object. This function is not supposed to be called by the user. Parameters ---------- sbdb : `dict` An ordered dictionary object returned by SBDB search. Returns ------- sbdb : `dict` An ordered dictionary with the data of the selected object. """ from astropy.table import Table print('{} bodies were found.'.format(sbdb['count'])) t = Table() t['num'] = np.arange(sbdb['count']) + 1 t['Designation'] = sbdb['list']['pdes'] t['Name'] = sbdb['list']['name'] while True: t.pprint_all() print('0: Cancel') choice = int(input('Choose the corresponding number of the correct small body: ')) if choice in np.arange(sbdb['count'] + 1): break if choice == 0: raise ValueError('It was not possible to define a Small Body') return search_sbdb(name=sbdb['list']['pdes'][choice - 1])
[docs]def apparent_magnitude(H, G, dist, sundist, phase=0.0): """Calculates the object's apparent magnitude. Parameters ---------- H : `int`, `float` Absolute magnitude. G : `int`, `float` Slope parameter. dist : `int`, `float` Observer-object distance, in AU. sundist : `int`, `float` Sun-object distance, in AU. phase : `int`, `float`, default=0 Phase angle (Sun-Target-Observer), in degrees. Returns ------- ap_mag : `float` Apparent magnitude. """ phi0 = np.exp(-3.33 * (np.tan(0.5 * phase * u.deg) ** 0.63)) phi1 = np.exp(-1.87 * (np.tan(0.5 * phase * u.deg) ** 1.22)) Ha = H - 2.5 * np.log10((1.0 - G) * phi0 + G * phi1) ap_mag = Ha + 5 * np.log10(sundist * dist) return ap_mag.value
# This block is a hard coded search for satellite information. # For the moment it only covers some of what SBDB cannot offer. # It is supposed to be replaced by a search on a trustful # database on future versions. grav = 'Grav et al. (2015). AJ 809(1):3' rettig = 'Rettig et al. (2001). Icarus 154(2):313-320' bauer = 'Bauer et al. (2006). Icarus 184(1):181-197' veverka = 'Veverka et al. (1991). book Uranus 528-560' satellites = { 'io': { 'spkid': 501, 'albedo': [0.63, 0.02, 'Simonelli et al. (1984). Icarus 59:406-425'], 'diameter': [3643.2, 1.0, 'horizons'], 'GM': [5959.916, 0.012, 'JUP230'] }, 'europa': { 'spkid': 502, 'albedo': [0.67, 0.03, 'Buratti et al. (1983). Icarus 55:93-110'], 'diameter': [3121.6, 1.0, 'horizons'], 'GM': [3202.739, 0.009, 'JUP230'] }, 'ganymede': { 'spkid': 503, 'albedo': [0.43, 0.02, 'Morrison et al. (1977). book Planetary Satellites 363-378'], 'diameter': [5262.4, 3.4, 'Anderson et al. (2000). BAAS 33(3):1101'], 'GM': [9887.834, 0.017, 'JUP230'] }, 'callisto': { 'spkid': 504, 'albedo': [0.17, 0.02, 'Morrison et al. (1977). book Planetary Satellites 363-378'], 'diameter': [4820.6, 3.0, 'Morrison et al. (2000). Icarus 153:157-161'], 'GM': [7179.289, 0.013, 'JUP230'] }, 'amalthea': { 'spkid': 505, 'albedo': [0.090, 0.005, 'Simonelli et al. (2000). Icarus 147:353-365'], 'diameter': [166.9, 4.8, 'horizons'], 'GM': [0.138, 0.03, 'JUP230'] }, 'thebe': { 'spkid': 514, 'albedo': [0.047, 0.003, 'Simonelli et al. (2000). Icarus 147:353-365'], 'diameter': [98.6, 4.0, 'Thomas et al. (1998). Icarus 135:360-371'], 'GM': [0.10, 0.0, 'horizons'] }, 'himalia': { 'spkid': 506, 'albedo': [5.7, 0.1, grav], 'H': [8.0, 0.01, rettig], 'G': [0.10, 0.15, ''], 'diameter': [139.6, 1.7, grav], 'GM': [0.28, 0.04, 'Emelyanov (2005). A&A 438(3):L33-L36'], 'rotation': [7.7819, 0.0005, 'Pilcher et al. (2012). Icarus 219(2):741-742'] }, 'elara': { 'spkid': 507, 'albedo': [5.7, 0.8, grav], 'H': [9.45, 0.01, rettig], 'G': [0.10, 0.15, ''], 'diameter': [79.9, 1.7, grav] }, 'pasiphae': { 'spkid': 508, 'albedo': [4.4, 0.6, grav], 'H': [10.21, 0.01, rettig], 'G': [0.10, 0.15, ''], 'diameter': [57.8, 0.8, grav] }, 'sinope': { 'spkid': 509, 'albedo': [4.2, 0.6, grav], 'H': [11.29, 0.01, rettig], 'G': [0.10, 0.15, ''], 'diameter': [35.0, 0.6, grav] }, 'lysithea': { 'spkid': 510, 'albedo': [3.6, 0.6, grav], 'H': [11.09, 0.02, rettig], 'G': [0.10, 0.15, ''], 'diameter': [42.2, 0.7, grav] }, 'carme': { 'spkid': 511, 'albedo': [3.5, 0.6, grav], 'H': [10.91, 0.01, rettig], 'G': [0.10, 0.15, ''], 'diameter': [46.7, 0.9, grav] }, 'ananke': { 'spkid': 512, 'albedo': [3.8, 0.6, grav], 'H': [11.84, 0.03, rettig], 'G': [0.10, 0.15, ''], 'diameter': [29.1, 0.6, grav] }, 'leda': { 'spkid': 513, 'albedo': [3.4, 0.6, grav], 'H': [12.63, 0.03, rettig], 'G': [0.10, 0.15, ''], 'diameter': [21.5, 1.7, grav] }, 'phoebe': { 'spkid': 609, 'albedo': [10.0, 0.5, grav], 'H': [6.59, 0.02, bauer], 'G': [0.02, 0.03, bauer], 'diameter': [202.2, 4.5, grav], 'density': [1.630, 0.045, 'Porco et al. (2005). Science 307(5713):1237-1242'], 'GM': [0.5534, 0.0006, 'Jacobson et al. (2006). AJ 132(6):2520-2526'], 'rotation': [9.27365, 0.00002, 'Gomes-Júnior et al. (2020). MNRAS 492(1):770-781'], 'pole': [['356.6/77.9'], ['0/0'], 'Porco et al. (2005). Science 307(5713):1237-1242'] }, 'albiorix': { 'spkid': 626, 'albedo': [6.2, 2.8, grav], 'H': [11.35, 0.05, bauer], 'G': [0.39, 0.06, bauer], 'diameter': [28.6, 5.4, grav] }, 'siarnaq': { 'spkid': 629, 'albedo': [5.0, 1.7, grav], 'H': [10.90, 0.05, bauer], 'G': [0.45, 0.17, bauer], 'diameter': [39.3, 5.9, grav] }, 'ariel': { 'spkid': 701, 'albedo': [0.39, 0.04, veverka], 'H': [1.3, 0.2, veverka], 'G': [0.10, 0.15, ''], 'diameter': [1157.8, 1.2, 'Thomas et al. (1988). Icarus 73:427-441'], 'GM': [86.4, 5.0, 'Jacobson et al. (2007). BAAS 39:453'] }, 'umbriel': { 'spkid': 702, 'albedo': [0.21, 0.02, veverka], 'H': [2.2, 0.2, veverka], 'G': [0.10, 0.15, ''], 'diameter': [1169.4, 5.6, 'Thomas et al. (1988). Icarus 73:427-441'], 'GM': [81.5, 5.0, 'Jacobson et al. (2007). BAAS 39:453'] }, 'titania': { 'spkid': 703, 'albedo': [0.27, 0.03, veverka], 'H': [1.2, 0.2, veverka], 'G': [0.10, 0.15, ''], 'diameter': [1577.8, 3.6, 'Thomas et al. (1988). Icarus 73:427-441'], 'GM': [228.2, 5.0, 'Jacobson et al. (2007). BAAS 39:453'] }, 'oberon': { 'spkid': 704, 'albedo': [0.23, 0.03, veverka], 'H': [1.4, 0.2, veverka], 'G': [0.10, 0.15, ''], 'diameter': [1522.8, 5.2, 'Thomas et al. (1988). Icarus 73:427-441'], 'GM': [192.4, 7.0, 'Jacobson et al. (2007). BAAS 39:453'] }, 'miranda': { 'spkid': 705, 'albedo': [0.32, 0.03, veverka], 'H': [3.4, 0.0, veverka], 'G': [0.10, 0.15, ''], 'diameter': [471.6, 1.4, 'Thomas et al. (1988). Icarus 73:427-441'], 'GM': [4.4, 0.4, 'Jacobson et al. (2007). BAAS 39:453'] }, 'caliban': { 'spkid': 716, 'albedo': [0.04, 0.0, 'Sheppard et al. (2005). AJ 129(1):518-525'], 'H': [9.16, 0.04, 'Grav et al. (2004). AJ 613:L77–L80'], 'G': [0.10, 0.15, ''], 'diameter': [72, 0.0, 'Sheppard et al. (2005). AJ 129(1):518-525'], 'rotation': [6.9190, 0.0082, 'Farkas-Takács et al. (2017) 154(3):119'] }, 'sycorax': { 'spkid': 717, 'albedo': [0.04, 0.0, 'Sheppard et al. (2005). AJ 129(1):518-525'], 'H': [7.50, 0.04, 'Grav et al. (2004). AJ 613:L77–L80'], 'G': [0.10, 0.15, ''], 'diameter': [150, 0.0, 'Sheppard et al. (2005). AJ 129(1):518-525'], 'rotation': [9.948, 0.019, 'Farkas-Takács et al. (2017) 154(3):119'] }, 'nereid': { 'spkid': 802, 'albedo': [0.155, 0.0, 'Thomas et al. (1991). JGR 96(19):253'], 'H': [4.44, 0.01, 'Grav et al. (2004). AJ 613:L77–L80'], 'G': [0.10, 0.15, ''], 'diameter': [340, 50, 'Thomas et al. (1991). JGR 96(19):253'] } } def search_satdb(name): sat = satellites.get(name.lower()) if sat is None: raise ValueError('specified object was not found') return sat # end of hard coded block.