Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a context manager for imposing a solar-radius value #7328

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions sunpy/coordinates/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from . import sun
from ._transformations import _make_sunpy_graph, propagate_with_solar_surface, transform_with_sun_center
from .ephemeris import *
from .frameattributes import impose_solar_radius
from .frames import *
from .metaframes import *
from .wcs_utils import *
Expand Down
36 changes: 34 additions & 2 deletions sunpy/coordinates/frameattributes.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import datetime
from contextlib import contextmanager

import astropy.units as u
from astropy.coordinates import BaseCoordinateFrame, CoordinateAttribute, SkyCoord, TimeAttribute
from astropy.coordinates import BaseCoordinateFrame, CoordinateAttribute, QuantityAttribute, SkyCoord, TimeAttribute
from astropy.time import Time

from sunpy.sun.constants import radius
from sunpy.time import parse_time

__all__ = ['TimeFrameAttributeSunPy', 'ObserverCoordinateAttribute']
__all__ = ['TimeFrameAttributeSunPy', 'ObserverCoordinateAttribute',
'SolarRadiusAttribute', 'impose_solar_radius']


class TimeFrameAttributeSunPy(TimeAttribute):
Expand Down Expand Up @@ -155,3 +158,32 @@
return observer

return super().__get__(instance, frame_cls=frame_cls)


_imposed_solar_radius = None


@contextmanager
@u.quantity_input
def impose_solar_radius(rsun: u.km = radius.to(u.km)):
try:

Check warning on line 169 in sunpy/coordinates/frameattributes.py

View check run for this annotation

Codecov / codecov/patch

sunpy/coordinates/frameattributes.py#L169

Added line #L169 was not covered by tests
global _imposed_solar_radius
old_imposed_solar_radius = _imposed_solar_radius
_imposed_solar_radius = rsun
yield

Check warning on line 173 in sunpy/coordinates/frameattributes.py

View check run for this annotation

Codecov / codecov/patch

sunpy/coordinates/frameattributes.py#L171-L173

Added lines #L171 - L173 were not covered by tests
finally:
_imposed_solar_radius = old_imposed_solar_radius

Check warning on line 175 in sunpy/coordinates/frameattributes.py

View check run for this annotation

Codecov / codecov/patch

sunpy/coordinates/frameattributes.py#L175

Added line #L175 was not covered by tests


class SolarRadiusAttribute(QuantityAttribute):
"""
"""
def __init__(self, *args, **kwargs):
new_kwargs = {'default': radius, 'unit': u.km}
new_kwargs.update(kwargs)
super().__init__(*args, **new_kwargs)

def __get__(self, instance, frame_cls=None):
if _imposed_solar_radius is not None:
return _imposed_solar_radius

Check warning on line 188 in sunpy/coordinates/frameattributes.py

View check run for this annotation

Codecov / codecov/patch

sunpy/coordinates/frameattributes.py#L188

Added line #L188 was not covered by tests
return super().__get__(instance, frame_cls=frame_cls)
7 changes: 3 additions & 4 deletions sunpy/coordinates/frames.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,10 @@
from astropy.utils.data import download_file

from sunpy import log
from sunpy.sun.constants import radius as _RSUN
from sunpy.time.time import _variables_for_parse_time_docstring
from sunpy.util.decorators import add_common_docstring
from sunpy.util.exceptions import warn_user
from .frameattributes import ObserverCoordinateAttribute, TimeFrameAttributeSunPy
from .frameattributes import ObserverCoordinateAttribute, TimeFrameAttributeSunPy, SolarRadiusAttribute

_J2000 = Time('J2000.0', scale='tt')

Expand Down Expand Up @@ -218,7 +217,7 @@ class BaseHeliographic(SunPyBaseCoordinateFrame):
RepresentationMapping('d_distance', 'd_radius', u.km/u.s)],
}

rsun = QuantityAttribute(default=_RSUN, unit=u.km)
rsun = SolarRadiusAttribute()

def make_3d(self):
"""
Expand Down Expand Up @@ -531,7 +530,7 @@ class Helioprojective(SunPyBaseCoordinateFrame):
RepresentationMapping('lat', 'Ty', u.arcsec)],
}

rsun = QuantityAttribute(default=_RSUN, unit=u.km)
rsun = SolarRadiusAttribute()
observer = ObserverCoordinateAttribute(HeliographicStonyhurst)

@property
Expand Down