What’s New in SunPy 0.8?

Overview

SunPy 0.8 is a major release that adds significant new functionality since the 0.7.x series of releases.

On this page, you can read about some of the big changes in this release:

In addition to these major changes, SunPy 0.8 includes a large number of smaller improvements and bug fixes, which are described in the Full Changelog.

By the numbers:

  • 1442 commits have been added since 0.7
  • 163 issues have been closed since 0.7
  • 200 pull requests have been merged since 0.7
  • 35 distinct people have contributed code
  • 17 new contributors

Supported versions of Python

SunPy is tested against Python 2.7, 3.5 and 3.6. SunPy no longer supports Python 3.4.

New data downloading interface

The new package Fido is the primary interface to search for and download observational data. Fido is a unified interface for searching and fetching solar physics data irrespective of the underlying client or webservice through which the data is obtained, e.g. VSO, JSOC, etc. It therefore supplies a single, easy and consistent way to obtain most forms of solar physics data. It unifies data search and download from multiple sources such as the VSO and non-VSO sources:

>>> from sunpy.net import Fido, attrs as a

>>> attrs_time = a.Time('2005/01/01 00:10', '2005/01/01 00:15')
>>> result = Fido.search(attrs_time, a.Instrument('eit'))
>>> result
<sunpy.net.fido_factory.UnifiedResponse object at 0x7f581489bb70>
Results from 1 Provider:

1 Results from the VSOClient:
    Start Time [1]       End Time [1]    Source Instrument   Type   Wavelength [2]
                                                                      Angstrom
    str19               str19         str4     str3      str8      float64
------------------- ------------------- ------ ---------- -------- --------------
2005-01-01 00:12:10 2005-01-01 00:12:22   SOHO        EIT FULLDISK 195.0 .. 195.0

>>> attrs_time = a.Time('2016/10/22 00:00', '2016/10/25 23:59')
>>> result = Fido.search(attrs_time, a.Instrument('lyra'))
>>> result
<sunpy.net.fido_factory.UnifiedResponse object at 0x11dfd8048>
Results from 1 Provider:

4 Results from the LYRAClient:
     Start Time           End Time      Source Instrument Wavelength
       str19               str19         str6     str4       str3
------------------- ------------------- ------ ---------- ----------
2016-10-22 00:00:00 2016-10-25 23:59:00 Proba2       lyra        nan
2016-10-22 00:00:00 2016-10-25 23:59:00 Proba2       lyra        nan
2016-10-22 00:00:00 2016-10-25 23:59:00 Proba2       lyra        nan
2016-10-22 00:00:00 2016-10-25 23:59:00 Proba2       lyra        nan

Data is downloaded using:

>>> files = Fido.fetch(result)

which returns a set of filepaths to the data.

New coordinate package

The SunPy coordinates package describes locations in physical space, and coordinate frames. It provides a way to transform coordinates from one frame like helioprojective to another such as heliographic.

Coordinates can be defined very simply:

>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord
>>> from sunpy.coordinates import frames
>>> a = SkyCoord(200*u.arcsec, 300*u.arcsec, frame=frames.Helioprojective)
>>> a
<SkyCoord (Helioprojective: obstime=None, rsun=695508.0 km, observer=earth): (Tx, Ty) in arcsec
    ( 200.,  300.)>
>>> b = SkyCoord(-20*u.degree, -56*u.degree, frame=frames.HeliographicStonyhurst)
>>> b
<SkyCoord (HeliographicStonyhurst: obstime=None): (lon, lat, radius) in (deg, deg, km)
    (-20., -56.,  695508.)>

The coordinate a is in the helioprojective coordinate system, and the coordinate b is in the heliographic Stonyhurst system.

Maps can also be used to define coordinate frames:

>>> import sunpy.map
>>> import sunpy.data.sample
>>> aia_map = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE)
>>> c = SkyCoord(-45*u.arcsec, 600*u.arcsec, frame=aia_map.coordinate_frame)
>>> c
<SkyCoord (Helioprojective: obstime=2011-06-07 06:33:02.770000, rsun=696000000.0 m, observer=<HeliographicStonyhurst Coordinate (obstime=2011-06-07 06:33:02.770000): (lon, lat, radius) in (deg, deg, m)
    ( 0.,  0.048591,   1.51846026e+11)>): (Tx, Ty) in arcsec
    (-45.,  600.)>

The coordinate c is now defined with respect to the coordinate frame derived from the map. The observer attribute:

>>> c.observer
<HeliographicStonyhurst Coordinate (obstime=2011-06-07 06:33:02.770000): (lon, lat, radius) in (deg, deg, m)
    ( 0.,  0.048591,   1.51846026e+11)>

defines the location from which the coordinate was observed.

Transformation between solar physics coordinate systems

Transformation between solar physics coordinate frames is simple:

>>> c.transform_to(frames.HeliographicStonyhurst)
<SkyCoord (HeliographicStonyhurst: obstime=2011-06-07 06:33:02.770000): (lon, lat, radius) in (deg, deg, km)
    (-3.51257477,  39.27459767,  696000.00000088)>

Transformation to astropy coordinate systems

Solar physics coordinates can also be transformed into astrophysical coordinates. For example, to convert to the International Celestial Reference System (ICRS):

>>> c.transform_to('icrs')
<SkyCoord (ICRS): (ra, dec, distance) in (deg, deg, km)
    ( 224.85859731,  10.52568476,  998439.00599877)>

Specification of observer at any major solar system body

Major solar system bodies can be used to specify observer locations in SkyCoord:

>>> d = SkyCoord(-45*u.arcsec, 600*u.arcsec, observer='Mars', obstime='2011-06-07 06:33:02', frame=frames.Helioprojective)
>>> d
<SkyCoord (Helioprojective: obstime=2011-06-07 06:33:02, rsun=695508.0 km, observer=<HeliographicStonyhurst Coordinate (obstime=2011-06-07 06:33:02): (lon, lat, radius) in (deg, deg, AU)
    ( 135.78519602,  4.47598707,  1.43448427)>): (Tx, Ty) in arcsec
    (-45.,  600.)>

New timeseries data object

The TimeSeries object is used to represent columns of time-ordered scalar values, and is source-aware, just like the Map object. This object supersedes the LightCurve object, which is now deprecated in 0.8.

The TimeSeries object can be instantiated by passing in a file:

>>> import sunpy.timeseries
>>> import sunpy.data.sample
>>> goes = sunpy.timeseries.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES)

TimeSeries objects can have more than one column:

>>> goes.columns
['xrsa', 'xrsb']

and have convenient plotting methods.

import sunpy.timeseries
import sunpy.data.sample
goes = sunpy.timeseries.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES)
goes.peek()

(Source code, png, hires.png, pdf)

../_images/0-8-1.png

TimeSeries objects have a ‘meta’ property that stores the metadata of the timeseries:

>>> goes.meta
|-------------------------------------------------------------------------------------------------|
|TimeRange                  | Columns         | Meta                                              |
|-------------------------------------------------------------------------------------------------|
|2011-06-06 23:59:59.961999 | xrsa            | simple: True                                      |
|            to             | xrsb            | bitpix: 8                                         |
|2011-06-07 23:59:57.631999 |                 | naxis: 0                                          |
|                           |                 | extend: True                                      |
|                           |                 | date: 26/06/2012                                  |
|                           |                 | numext: 3                                         |
|                           |                 | telescop: GOES 15                                 |
|                           |                 | instrume: X-ray Detector                          |
|                           |                 | object: Sun                                       |
|                           |                 | origin: SDAC/GSFC                                 |
|                           |                 | ...                                               |
|-------------------------------------------------------------------------------------------------|

and the data can be accessed as a pandas dataframe using:

>>> goes.data
                                    xrsa          xrsb
2011-06-06 23:59:59.961999  1.000000e-09  1.887100e-07
2011-06-07 00:00:02.008999  1.000000e-09  1.834600e-07
2011-06-07 00:00:04.058999  1.000000e-09  1.860900e-07
...
2011-06-07 23:59:55.584999  1.000000e-09  1.624800e-07
2011-06-07 23:59:57.631999  1.000000e-09  1.598500e-07

Data sources that do not provide FITS files need to have a source keyword to help with the identification and interpretation of the data:

>>> eve = sunpy.timeseries.TimeSeries(sunpy.data.sample.EVE_TIMESERIES, source='EVE')

Differential rotation of maps

Maps can now be transformed using solar differential rates.

import astropy.units as u
import sunpy.map
import sunpy.data.sample
from sunpy.physics.differential_rotation import diffrot_map
aia_map = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE)
dr_map = diffrot_map(aia_map, dt=-4*u.day)

(Source code)

Renamed/removed functionality

Several sub-packages have been moved or removed, and these are described in the following sections.

sunpy.lightcurve

The package sunpy.lightcurve has been deprecated in favor of timeseries, and will be removed in a future version of SunPy.

sunpy.physics.transforms

The modules in sunpy.physics.transforms have been moved to physics.

sunpy.net

HelioviewerClient has been removed from the sunpy.net namespace. It should now be imported with from sunpy.net.helioviewer import HelioviewerClient.

Full change log

To see a detailed list of all changes in version v0.8, including changes in API, please see the Full Changelog.