""" This module contains functions to query and parse JPL Horizons on-line solar system data (see https://ssd-api.jpl.nasa.gov/doc/horizons.html). """ import re import requests import numpy as np def query_data(input_file: str) -> str: """ Send request to the Horizons API with settings for the desired ephemeris results saved in an input file. """ with open(input_file, 'r') as f: file = f.read() url = "https://ssd.jpl.nasa.gov/api/horizons_file.api" r = requests.post(url, data={'format': 'json'}, files={'input': file}) return r.json()['result'] def parse_output(output: str) -> np.ndarray: """ Parse output of API calls for positions and velocities """ output = list(filter(bool, output.split("\n"))) vector_list = [line.split(",") for line in output if line[1:4] == "XYZ"] vector_list = [list(map(float, re.findall(r"[-+]?\d*\.?\d+(?:[Ee][-+]?\d+)?", i[0]))) for i in vector_list] r = np.zeros((len(vector_list), 3), dtype=float) v = np.zeros((len(vector_list), 3), dtype=float) for i, vector in enumerate(vector_list): r[i][0] = float(vector[0]) r[i][1] = float(vector[1]) r[i][2] = float(vector[2]) v[i][0] = float(vector[3]) v[i][1] = float(vector[4]) v[i][2] = float(vector[5]) return r, v