NASA-Planetary-Science / sbpy

A Python package for small bodies research
https://sbpy.org/
Other
68 stars 34 forks source link

Orbit.from_horizons is incompatible with new Horizons query interface (?) #323

Closed kaya4me2 closed 2 years ago

kaya4me2 commented 2 years ago

High-level problem description Horizons query interface has changed, and various kwargs like majorbody deprecated. Some basic sbpy functionality now fails.

Readthedocs Class on this need updating: https://sbpy.readthedocs.io/en/latest/api/sbpy.data.Orbit.html#sbpy.data.Orbit

What did you do? (working in Jupiter notebook)

import sbpy import matplotlib.pyplot as plt import astropy.units as u from astropy.time import Time from astropy.table import QTable, Table, Column from astroquery.jplhorizons import Horizons from sbpy.data import Ephem, Orbit

pyoorb - A Python Wrapper for OpenOrb

import pyoorb as oo

%matplotlib inline

oo.pyoorb.oorb_init()

from sbpy.data import Orbit from astropy.time import Time

epoch = Time('2018-05-14', scale='tdb')
eph = Orbit.from_horizons('Ceres', epochs=epoch)

What did you expect?

Successful query for Ceres

What did really happen?

SSLError Traceback (most recent call last) /anaconda3/envs/sbpy/lib/python3.7/site-packages/urllib3/connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw) 709 headers=headers, --> 710 chunked=chunked, 711 )

/anaconda3/envs/sbpy/lib/python3.7/site-packages/urllib3/connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw) 385 try: --> 386 self._validate_conn(conn) 387 except (SocketTimeout, BaseSSLError) as e:

/anaconda3/envs/sbpy/lib/python3.7/site-packages/urllib3/connectionpool.py in _validate_conn(self, conn) 1039 if not getattr(conn, "sock", None): # AppEngine might not have .sock -> 1040 conn.connect() 1041

/anaconda3/envs/sbpy/lib/python3.7/site-packages/urllib3/connection.py in connect(self) 425 ssl_context=context, --> 426 tls_in_tls=tls_in_tls, 427 )

/anaconda3/envs/sbpy/lib/python3.7/site-packages/urllib3/util/ssl_.py in ssl_wrap_socket(sock, keyfile, certfile, cert_reqs, ca_certs, server_hostname, ssl_version, ciphers, ssl_context, ca_cert_dir, key_password, ca_cert_data, tls_in_tls) 449 ssl_sock = _ssl_wrap_socket_impl( --> 450 sock, context, tls_in_tls, server_hostname=server_hostname 451 )

/anaconda3/envs/sbpy/lib/python3.7/site-packages/urllib3/util/ssl_.py in _ssl_wrap_socket_impl(sock, ssl_context, tls_in_tls, server_hostname) 492 if server_hostname: --> 493 return ssl_context.wrap_socket(sock, server_hostname=server_hostname) 494 else:

/anaconda3/envs/sbpy/lib/python3.7/ssl.py in wrap_socket(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session) 422 context=self, --> 423 session=session 424 )

/anaconda3/envs/sbpy/lib/python3.7/ssl.py in _create(cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session) 869 raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets") --> 870 self.do_handshake() 871 except (OSError, ValueError):

/anaconda3/envs/sbpy/lib/python3.7/ssl.py in do_handshake(self, block) 1138 self.settimeout(None) -> 1139 self._sslobj.do_handshake() 1140 finally:

SSLError: [SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1091)

During handling of the above exception, another exception occurred:

MaxRetryError Traceback (most recent call last) /anaconda3/envs/sbpy/lib/python3.7/site-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies) 449 retries=self.max_retries, --> 450 timeout=timeout 451 )

/anaconda3/envs/sbpy/lib/python3.7/site-packages/urllib3/connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw) 785 retries = retries.increment( --> 786 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2] 787 )

/anaconda3/envs/sbpy/lib/python3.7/site-packages/urllib3/util/retry.py in increment(self, method, url, response, error, _pool, _stacktrace) 591 if new_retry.is_exhausted(): --> 592 raise MaxRetryError(_pool, url, error or ResponseError(cause)) 593

MaxRetryError: HTTPSConnectionPool(host='ssd.jpl.nasa.gov', port=443): Max retries exceeded with url: /api/horizons.api?format=text&EPHEM_TYPE=ELEMENTS&MAKE_EPHEM=YES&OUT_UNITS=AU-D&COMMAND=%22Ceres%3B%22&CENTER=%27500%4010%27&CSV_FORMAT=YES&ELEM_LABELS=YES&OBJ_DATA=YES&REF_SYSTEM=ICRF&REF_PLANE=ECLIPTIC&TP_TYPE=ABSOLUTE&TLIST=2458252.5 (Caused by SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1091)')))

During handling of the above exception, another exception occurred:

SSLError Traceback (most recent call last) /var/folders/bg/mn56s0j97kb5t5d_2fv9d8m40000gn/T/ipykernel_35529/1721905493.py in 3 4 epoch = Time('2018-05-14', scale='tdb') ----> 5 eph = Orbit.from_horizons('Ceres', epochs=epoch)

/anaconda3/envs/sbpy/lib/python3.7/site-packages/sbpy/bib/core.py in wrapper(*args, kwargs) 169 def wrapper(*args, *kwargs): 170 # only cite after successful call --> 171 result = f(args, kwargs) 172 register(f, citations) 173 return result

/anaconda3/envs/sbpy/lib/python3.7/site-packages/sbpy/bib/core.py in wrapper(*args, kwargs) 169 def wrapper(*args, *kwargs): 170 # only cite after successful call --> 171 result = f(args, kwargs) 172 register(f, citations) 173 return result

/anaconda3/envs/sbpy/lib/python3.7/site-packages/sbpy/data/orbit.py in from_horizons(cls, targetids, id_type, epochs, center, kwargs) 159 location=center, epochs=epochs) 160 try: --> 161 elem = obj.elements(kwargs) 162 except ValueError as e: 163 raise QueryError(

/anaconda3/envs/sbpy/lib/python3.7/site-packages/astroquery/utils/class_or_instance.py in f(*args, kwds) 23 def f(*args, *kwds): 24 if obj is not None: ---> 25 return self.fn(obj, args, kwds) 26 else: 27 return self.fn(cls, *args, **kwds)

/anaconda3/envs/sbpy/lib/python3.7/site-packages/astroquery/utils/process_asyncs.py in newmethod(self, *args, *kwargs) 24 verbose = kwargs.pop('verbose', False) 25 ---> 26 response = getattr(self, async_method_name)(args, **kwargs) 27 if kwargs.get('get_query_payload') or kwargs.get('field_help'): 28 return response

/anaconda3/envs/sbpy/lib/python3.7/site-packages/astroquery/jplhorizons/core.py in elements_async(self, get_query_payload, refsystem, refplane, tp_type, closest_apparition, no_fragments, get_raw_response, cache) 802 # query and parse 803 response = self._request('GET', URL, params=request_payload, --> 804 timeout=self.TIMEOUT, cache=cache) 805 self.uri = response.url 806

/anaconda3/envs/sbpy/lib/python3.7/site-packages/astroquery/query.py in _request(self, method, url, params, data, headers, files, save, savedir, timeout, cache, stream, auth, continuation, verify, allow_redirects, json, return_response_on_save) 321 allow_redirects=allow_redirects, 322 verify=verify, --> 323 json=json) 324 to_cache(response, query.request_file(self.cache_location)) 325 self._last_query = query

/anaconda3/envs/sbpy/lib/python3.7/site-packages/astroquery/query.py in request(self, session, cache_location, stream, auth, verify, allow_redirects, json) 74 stream=stream, auth=auth, verify=verify, 75 allow_redirects=allow_redirects, ---> 76 json=json) 77 78 def hash(self):

/anaconda3/envs/sbpy/lib/python3.7/site-packages/requests/sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json) 527 } 528 send_kwargs.update(settings) --> 529 resp = self.send(prep, **send_kwargs) 530 531 return resp

/anaconda3/envs/sbpy/lib/python3.7/site-packages/requests/sessions.py in send(self, request, kwargs) 643 644 # Send the request --> 645 r = adapter.send(request, kwargs) 646 647 # Total elapsed time of the request (approximately)

/anaconda3/envs/sbpy/lib/python3.7/site-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies) 515 if isinstance(e.reason, _SSLError): 516 # This branch is for urllib3 v1.22 and later. --> 517 raise SSLError(e, request=request) 518 519 raise ConnectionError(e, request=request)

SSLError: HTTPSConnectionPool(host='ssd.jpl.nasa.gov', port=443): Max retries exceeded with url: /api/horizons.api?format=text&EPHEM_TYPE=ELEMENTS&MAKE_EPHEM=YES&OUT_UNITS=AU-D&COMMAND=%22Ceres%3B%22&CENTER=%27500%4010%27&CSV_FORMAT=YES&ELEM_LABELS=YES&OBJ_DATA=YES&REF_SYSTEM=ICRF&REF_PLANE=ECLIPTIC&TP_TYPE=ABSOLUTE&TLIST=2458252.5 (Caused by SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1091)')))

In [22]:

What is the actual result of the code snippet?

Throws error

Provide information on your environment:

operating system and version: MacoSX 10.14.6

from importlib_metadata import version print(version('numpy')) print(version('sbpy')) print(version('astroquery'))

1.21.5 0.2.3.dev223+g9eb0523 0.4.6.dev7540

jianyangli commented 2 years ago

I can't reproduce the error that you encountered. The below code works well on my system.

from sbpy.data import Orbit
from astropy.time import Time
epoch = Time('2018-05-14', scale='tdb')
eph = Orbit.from_horizons('Ceres', epochs=epoch)

My system info: MacOSX 10.15.7 sbpy == 0.2.3.dev223+g9eb0523 astroquery == 0.4.7.dev7714

From what you posted, it looks like a low-level network connection problem, rather than an sbpy or astroquery problem. Could you check again? Thanks.

jianyangli commented 2 years ago

Hello @kaya4me2 , I tested Orbit.from_horizons with a clean set up of sbpy in an virtual environment on my computer, and everything worked fine. Could you please try the below code snippet, assuming you've already had virtualenv installed, and let me know how it works? Let me know if you need help setting up your virtual environment.

In your terminal, type:

virtualenv .env/test_sbpy_orbit
source .env/test_sbpy_orbit/bin/activate
pip install git+https://github.com/NASA-Planetary-Science/sbpy.git
python3

Then in python, type:

from sbpy.data import Orbit
from astropy.time import Time
epoch = Time('2018-05-14', scale='tdb')
eph = Orbit.from_horizons('Ceres', epochs=epoch)
print(eph)
kaya4me2 commented 2 years ago

followed instructions created a virtual environment, pip installed from git

(test_sbpy_orbit) (testbug) bash-3.2$ python Python 3.7.12 | packaged by conda-forge | (default, Oct 26 2021, 05:59:23) [Clang 11.1.0 ] on darwin Type "help", "copyright", "credits" or "license" for more information.

from sbpy.data import Orbit from astropy.time import Time epoch = Time('2018-05-14', scale='tdb') eph = Orbit.from_horizons('Ceres', epochs=epoch)

Fails with similar problem to the jupyter notebook....

Traceback (most recent call last): File "", line 1, in File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/sbpy/bib/core.py", line 171, in wrapper result = f(*args, kwargs) File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/sbpy/bib/core.py", line 171, in wrapper result = f(args, kwargs) File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/sbpy/data/orbit.py", line 161, in from_horizons elem = obj.elements(kwargs) File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/astroquery/utils/class_or_instance.py", line 25, in f return self.fn(obj, args, kwds) File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/astroquery/utils/process_asyncs.py", line 26, in newmethod response = getattr(self, async_method_name)(*args, kwargs) File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/astroquery/jplhorizons/core.py", line 804, in elements_async timeout=self.TIMEOUT, cache=cache) File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/astroquery/query.py", line 323, in _request json=json) File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/astroquery/query.py", line 76, in request json=json) File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/requests/sessions.py", line 529, in request resp = self.send(prep, send_kwargs) File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/requests/sessions.py", line 645, in send r = adapter.send(request, **kwargs) File "/Users/cew/.env/test_sbpy_orbit/lib/python3.7/site-packages/requests/adapters.py", line 517, in send raise SSLError(e, request=request) requests.exceptions.SSLError: HTTPSConnectionPool(host='ssd.jpl.nasa.gov', port=443): Max retries exceeded with url: /api/horizons.api?format=text&EPHEM_TYPE=ELEMENTS&MAKE_EPHEM=YES&OUT_UNITS=AU-D&COMMAND=%22Ceres%3B%22&CENTER=%27500%4010%27&CSV_FORMAT=YES&ELEM_LABELS=YES&OBJ_DATA=YES&REF_SYSTEM=ICRF&REF_PLANE=ECLIPTIC&TP_TYPE=ABSOLUTE&TLIST=2458252.5 (Caused by SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1091)')))

On Wed, Apr 27, 2022 at 4:33 PM Jian-Yang Li @.***> wrote:

Hello @kaya4me2 https://github.com/kaya4me2 , I tested Orbit.from_horizons with a clean set up of sbpy in an virtual environment on my computer, and everything worked fine. Could you please try the below code snippet, assuming you've already had virtualenv installed, and let me know how it works? Let me know if you need help setting up your virtual environment.

In your terminal, type:

virtualenv .env/test_sbpy_orbit source .env/test_sbpy_orbit/bin/activate pip install git+https://github.com/NASA-Planetary-Science/sbpy.git python3 https://github.com/NASA-Planetary-Science/sbpy.gitpython3

Then in python, type:

from sbpy.data import Orbit from astropy.time import Time epoch = Time('2018-05-14', scale='tdb') eph = Orbit.from_horizons('Ceres', epochs=epoch) print(eph)

— Reply to this email directly, view it on GitHub https://github.com/NASA-Planetary-Science/sbpy/issues/323#issuecomment-1111504953, or unsubscribe https://github.com/notifications/unsubscribe-auth/AQ5PTLY4SY6PYH4GYRCYJ33VHGXDFANCNFSM5QT42IOQ . You are receiving this because you were mentioned.Message ID: @.***>

-- Chick Woodward, Professor Fellow American Astronomical Society Fellow African Scientists Institute MN Institute for Astrophysics 116 Church Street, SE University of Minnesota, Minneapolis, MN 55455 Ph: 612-624-0254 / Fax: 612-624-0254

The information transmitted in this e-mail is intended only for the person or entity to which it is addressed and may contain confidential and/or privileged material. If you are not the intended recipient, you are hereby notified that any review, retransmission, dissemination, distribution, or copying of this message is strictly prohibited. If you have received this communication in error, please destroy and delete this message from any computer and contact us immediately by return e-mail.

jianyangli commented 2 years ago

Hmmm, I don't know what's going on here. Looks like it's the failure in the low-level request package, which I'm not familiar with. I tried to search online and find some reports on similar error messages, but couldn't reproduce any in my system.

@mkelley when you have time, can you take a look and suggest how to proceed with a diagnosis? Thanks.

kaya4me2 commented 2 years ago

yep ... will be speaking with mike k on a telecon this week and will bring the issue up ... tx

On Wed, Apr 27, 2022 at 6:33 PM Jian-Yang Li @.***> wrote:

Hmmm, I don't know what's going on here. Looks like it's the failure in the low-level request package, which I'm not familiar with. I tried to search online and find some reports on similar error messages, but couldn't reproduce any in my system.

@mkelley https://github.com/mkelley when you have time, can you take a look and suggest how to proceed with a diagnosis? Thanks.

— Reply to this email directly, view it on GitHub https://github.com/NASA-Planetary-Science/sbpy/issues/323#issuecomment-1111576784, or unsubscribe https://github.com/notifications/unsubscribe-auth/AQ5PTL2VDSNSV5IM2L4IK3TVHHFFBANCNFSM5QT42IOQ . You are receiving this because you were mentioned.Message ID: @.***>

-- Chick Woodward, Professor Fellow American Astronomical Society Fellow African Scientists Institute MN Institute for Astrophysics 116 Church Street, SE University of Minnesota, Minneapolis, MN 55455 Ph: 612-624-0254 / Fax: 612-624-0254

The information transmitted in this e-mail is intended only for the person or entity to which it is addressed and may contain confidential and/or privileged material. If you are not the intended recipient, you are hereby notified that any review, retransmission, dissemination, distribution, or copying of this message is strictly prohibited. If you have received this communication in error, please destroy and delete this message from any computer and contact us immediately by return e-mail.

mkelley commented 2 years ago

I suspect this is a broader issue with SSL certificates, but let's try some more diagnostics. Bypass sbpy and go straight to astroquery:

from astroquery.jplhorizons import Horizons
q = Horizons(1, id_type='smallbody')
q.elements()

Did that fail? If so, bypass astroquery and try going straight to requests. This is the URL that my astroquery is accessing:

import requests
response = requests.get('https://ssd.jpl.nasa.gov/api/horizons.api?format=text&EPHEM_TYPE=ELEMENTS&MAKE_EPHEM=YES&OUT_UNITS=AU-D&COMMAND=%221%3B%22&CENTER=%27500%4010%27&CSV_FORMAT=YES&ELEM_LABELS=YES&OBJ_DATA=YES&REF_SYSTEM=ICRF&REF_PLANE=ECLIPTIC&TP_TYPE=ABSOLUTE&TLIST=2459698.128229722')
print(response.content)

Did that work? If so, what is the content of q.uri from the astroquery block above?

Did requests fail? What about wget on the command line?

wget 'https://ssd.jpl.nasa.gov/api/horizons.api?format=text&EPHEM_TYPE=ELEMENTS&MAKE_EPHEM=YES&OUT_UNITS=AU-D&COMMAND=%221%3B%22&CENTER=%27500%4010%27&CSV_FORMAT=YES&ELEM_LABELS=YES&OBJ_DATA=YES&REF_SYSTEM=ICRF&REF_PLANE=ECLIPTIC&TP_TYPE=ABSOLUTE&TLIST=2459698.128229722' -O orbit.txt
kaya4me2 commented 2 years ago

from astroquery.jplhorizons import Horizons q = Horizons(1, id_type='smallbody') q.elements()

fails with same error .... as does attempting to run Horizons code snippets describe at

https://astroquery.readthedocs.io/en/latest/jplhorizons/jplhorizons.html

obj = Horizons(id='Ceres', location='568', epochs={'start':'2010-01-01', 'stop':'2010-03-01','step':'10d'}) eph = obj.ephemerides()

Results in a SLSError:

SSLError: HTTPSConnectionPool(host='ssd.jpl.nasa.gov', port=443): Max retries exceeded with url: /api/horizons.api?format=text&EPHEM_TYPE=OBSERVER&QUANTITIES=%271%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20%2C21%2C22%2C23%2C24%2C25%2C26%2C27%2C28%2C29%2C30%2C31%2C32%2C33%2C34%2C35%2C36%2C37%2C38%2C39%2C40%2C41%2C42%2C43%27&COMMAND=%22Ceres%22&SOLAR_ELONG=%220%2C180%22&LHA_CUTOFF=0&CSV_FORMAT=YES&CAL_FORMAT=BOTH&ANG_FORMAT=DEG&APPARENT=AIRLESS&REF_SYSTEM=ICRF&EXTRA_PREC=NO&CENTER=%27568%27&START_TIME=%222010-01-01%22&STOP_TIME=%222010-03-01%22&STEP_SIZE=%2210d%22&SKIP_DAYLT=NO (Caused by SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1131)')))

Discussing issue with SSD-API@JPL directly returned an acknowledgment that the error arrises from a JPL proxy server firewall issue. The following statement is from that exchange :

This issue (related to SSL Secure Renegotiation) appears to be related to an old “appliance” in the JPL perimeter firewall. We have reported the issue to appropriate personnel and hope for a fix in the near future. In the meantime, there may be a workaround (I’ve not verified or tested) available in this GitHub issue.

Attempting the GitHub patch suggestion is a bit complex, and we've not had success implementing it (a bit beyond our skill set with out more explicit instructions pf examples).

python packages: numpy == 1.22.3 sbpy == 0.2.3.dev223+g9eb0523 astroquery == 0.4.6.dev7540 requests == 2.27.1

jak574 commented 2 years ago

https://github.com/skyfielders/python-skyfield/issues/740#issuecomment-1113996790

Fixed now by JPL I believe (at least it works for Skyfield).

mkelley commented 2 years ago

Great, glad to hear this is fixed!