Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_GeocentricSolarEcliptic_against_data():
gcrs = GCRS(ra="02h31m49.09s", dec="+89d15m50.8s", distance=200 * u.km)
gse = gcrs.transform_to(GeocentricSolarEcliptic(obstime=J2000))
lon = 233.11691362602866
lat = 48.64606410986667
assert_quantity_allclose(gse.lat.value, lat, atol=1e-7)
assert_quantity_allclose(gse.lon.value, lon, atol=1e-7)
def test_default_time_for_new_state():
_d = 1.0 * u.AU # Unused distance
_ = 0.5 * u.one # Unused dimensionless value
_a = 1.0 * u.deg # Unused angle
_body = Sun # Unused body
expected_epoch = J2000
ss = Orbit.from_classical(_body, _d, _, _a, _a, _a, _a)
assert ss.epoch == expected_epoch
def test_planetary_icrs_frame_is_just_translation(body, frame):
with solar_system_ephemeris.set("builtin"):
epoch = J2000
vector = CartesianRepresentation(x=100 * u.km, y=100 * u.km, z=100 * u.km)
vector_result = (
frame(vector, obstime=epoch)
.transform_to(ICRS)
.represent_as(CartesianRepresentation)
)
expected_result = get_body_barycentric(body.name, epoch) + vector
assert_quantity_allclose(vector_result.xyz, expected_result.xyz)
@pytest.mark.parametrize("obstime", [J2000, J2000_TDB])
def test_orbit_creation_using_frame_obj(attractor, frame, obstime):
vel = [0, 2, 0] * u.km / u.s
cartdiff = CartesianDifferential(*vel)
pos = [30_000, 0, 0] * u.km
cartrep = CartesianRepresentation(*pos, differentials=cartdiff)
coord = frame(cartrep, obstime=obstime)
o = Orbit.from_coords(attractor, coord)
inertial_frame_at_body_centre = get_frame(
attractor, Planes.EARTH_EQUATOR, obstime=coord.obstime
)
coord_transformed_to_irf = coord.transform_to(inertial_frame_at_body_centre)
def body_centered_to_icrs(r, v, source_body, epoch=J2000, rotate_meridian=False):
"""Converts position and velocity body-centered frame to ICRS.
Parameters
----------
r : ~astropy.units.Quantity
Position vector in a body-centered reference frame.
v : ~astropy.units.Quantity
Velocity vector in a body-centered reference frame.
source_body : Body
Source body.
epoch : ~astropy.time.Time, optional
Epoch, default to J2000.
rotate_meridian : bool, optional
Whether to apply the rotation of the meridian too, default to False.
Returns
def icrs_to_body_centered(r, v, target_body, epoch=J2000, rotate_meridian=False):
"""Converts position and velocity in ICRS to body-centered frame.
Parameters
----------
r : ~astropy.units.Quantity
Position vector in ICRS.
v : ~astropy.units.Quantity
Velocity vector in ICRS.
target_body : Body
Target body.
epoch : ~astropy.time.Time, optional
Epoch, default to J2000.
rotate_meridian : bool, optional
Whether to apply the rotation of the meridian too, default to False.
Returns
def from_vectors(cls, attractor, r, v, epoch=J2000, plane=Planes.EARTH_EQUATOR):
"""Return `Orbit` from position and velocity vectors.
Parameters
----------
attractor : Body
Main attractor.
r : ~astropy.units.Quantity
Position vector wrt attractor center.
v : ~astropy.units.Quantity
Velocity vector.
epoch : ~astropy.time.Time, optional
Epoch, default to J2000.
plane : ~poliastro.frames.Planes
Fundamental plane of the frame.
"""
def get_frame(attractor, plane, obstime=J2000):
"""Returns an appropriate reference frame from an attractor and a plane.
Available planes are Earth equator (parallel to GCRS) and Earth ecliptic.
The fundamental direction of both is the equinox of epoch (J2000).
An obstime is needed to properly locate the attractor.
Parameters
----------
attractor : ~poliastro.bodies.Body
Body that serves as the center of the frame.
plane : ~poliastro.frames.Planes
Fundamental plane of the frame.
obstime : ~astropy.time.Time
Time of the frame.
"""
Decimal hour between 0 and 24
Returns
-------
RAAN: ~astropy.units.Quantity
Right ascension of the ascending node angle in GCRS
Note
----
Calculations of the sun mean longitude and equation of time
follow "Fundamentals of Astrodynamics and Applications"
Fourth edition by Vallado, David A.
"""
T_UT1 = ((epoch.ut1 - constants.J2000).value / 36525.0) * u.deg
T_TDB = ((epoch.tdb - constants.J2000).value / 36525.0) * u.deg
# Apparent sun position
sun_position = coordinates.get_sun(epoch)
# Calculate the sun apparent local time
salt = sun_position.ra + 12 * u.hourangle
# Use the equation of time to calculate the mean sun local time (fictional sun without anomalies)
# sun mean anomaly
M_sun = 357.5291092 * u.deg + 35999.05034 * T_TDB
# sun mean longitude
l_sun = 280.460 * u.deg + 36000.771 * T_UT1
l_ecliptic_part2 = 1.914666471 * u.deg * np.sin(
M_sun