<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://sunpy.org/</id>
  <title>Blog - Posts by Laura Hayes</title>
  <updated>2026-04-29T11:06:38.586876+00:00</updated>
  <link href="https://sunpy.org/"/>
  <link href="https://sunpy.org/blog/author/laura-hayes/atom.xml" rel="self"/>
  <generator uri="https://ablog.readthedocs.io/" version="0.11.13">ABlog</generator>
  <entry>
    <id>https://sunpy.org/posts/2026/artemis_2_eclipse/</id>
    <title>Artemis II Solar Eclipse</title>
    <updated>2026-04-09T00:00:00+00:00</updated>
    <author>
      <name>Alasdair Wilson</name>
    </author>
    <content type="html">&lt;section id="artemis-ii-solar-eclipse"&gt;

&lt;p&gt;The Artemis II mission recently completed its landmark voyage around the Moon, marking the first departure of humans from Earth orbit in over fifty years.
Soon after Artemis II set the record of human distance from Earth, the astronauts took stunning photos of the the solar eclipse they observed on April 6 (EDT) / April 7 (UTC).
We highly recommend watching the recording of the eclipse &lt;a href="https://youtu.be/dS9qqzSF3mI?si=NFfli3b7f0tYoVDP&amp;t=1683"&gt;on YouTube&lt;/a&gt;; the reactions and descriptions of the astronauts are worth it.&lt;/p&gt;
&lt;figure class="align-default" id="id1"&gt;
&lt;img alt="Artemis 2 Solar Eclipse with Capsule" src="https://sunpy.org/_images/art2_eclipse_ship.jpg" style="width: 100%;" /&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;span class="caption-text"&gt;Image credit NASA&lt;/span&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;On the SunPy blog, we rarely miss &lt;a class="reference internal" href="../../../posts/2024/2024-04-03-eclipse/#2024-04-03-eclipse"&gt;&lt;span class="std std-ref"&gt;the opportunity to talk&lt;/span&gt;&lt;/a&gt; about &lt;a class="reference external" href="https://github.com/sunpy/solar-eclipse/"&gt;a solar eclipse&lt;/a&gt;.
So when we saw the eclipse photos taken by the astronauts, we immediately wanted to use SunPy to compare them to other images of the solar corona.
Here is one of the amazing photos that has been shared:&lt;/p&gt;
&lt;figure class="align-default" id="id2"&gt;
&lt;img alt="Artemis 2 Solar Eclipse, showing the moon lit by Earthshine, multiple planets and a star field." src="https://sunpy.org/_images/art002e009301~large.jpg" style="width: 100%;" /&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;span class="caption-text"&gt;Image credit NASA&lt;/span&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This photo is particularly well suited to comparison with other solar observations because the limb of the Moon is clearly visible, and there are stars and planets in the image we can use as references.
Understanding the coordinate system of the photo will allow us to overlay images taken by solar observatories.&lt;/p&gt;
&lt;p&gt;The following images in this post, and the code to generate them, are from these two examples in the SunPy gallery:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/gallery/showcase/artemis-ii-trajectory.html" title="sunpy 4.13.0"&gt;Artemis II trajectory&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/gallery/showcase/artemis-ii-eclipse.html" title="sunpy 4.13.0"&gt;Artemis-II Solar Eclipse&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="visualize-the-path-of-artemis-ii"&gt;
&lt;h2&gt;Visualize the path of Artemis II&lt;/h2&gt;
&lt;p&gt;We can use &lt;a class="reference external" href="https://ssd.jpl.nasa.gov/horizons/"&gt;JPL Horizons&lt;/a&gt; to obtain the trajectory of Artemis II and to confirm the time range of the solar eclipse.
The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy&lt;/span&gt;&lt;/code&gt;/&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;astropy&lt;/span&gt;&lt;/code&gt; coordinates framework enables visualizing the trajectory in any desired coordinate frame, and &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/gallery/showcase/artemis-ii-trajectory.html" title="sunpy 4.13.0"&gt;our example&lt;/a&gt; shows it in the frame co-rotating with the Moon’s orbit around the Earth.&lt;/p&gt;
&lt;figure class="align-default" id="id3"&gt;
&lt;img alt="Artemis 2 trajectory showing when the solar eclipse occurred." src="https://sunpy.org/_images/trajectory.svg" style="width: 100%;" /&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;span class="caption-text"&gt;Visualization of the Artemis II trajectory with the eclipse highlighted.&lt;/span&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Also in our example, we confirm that the total eclipse started around 00:34 UTC and ended around 01:29 UTC.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="determine-the-coordinate-system-of-the-photo"&gt;
&lt;h2&gt;Determine the coordinate system of the photo&lt;/h2&gt;
&lt;p&gt;To be able to compare this image with other observations of the Sun, we need to identify where the camera was pointed and how it was oriented.
To do this we perform the following steps:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Extract the time information from the metadata stored in the image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the time information to look up the exact position of Artemis II.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fit the edge of the Moon to identify the center of the Moon, and the size of the Moon in the image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the three planets visible in the lower right of the image to determine the rotation angle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the planets to fit the distortion of the lens.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The following is an abridged version of the code in &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/gallery/showcase/artemis-ii-eclipse.html" title="sunpy 4.13.0"&gt;our example&lt;/a&gt;.&lt;/p&gt;
&lt;section id="find-the-position-of-artemis-ii"&gt;
&lt;h3&gt;Find the position of Artemis II&lt;/h3&gt;
&lt;p&gt;The first step is to know the time the image is taken; we can extract this from the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Exif"&gt;EXIF metadata&lt;/a&gt;.
As with the trajectory above, we use &lt;a class="reference external" href="https://ssd.jpl.nasa.gov/horizons/"&gt;JPL Horizons&lt;/a&gt; to obtain the position of Artemis II at a specific time.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sunpy.coordinates&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_horizons_coord&lt;/span&gt;

&lt;span class="n"&gt;artemis2_coord&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_horizons_coord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Artemis II&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2026-04-07 01:06:19&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="locate-the-moon"&gt;
&lt;h3&gt;Locate the Moon&lt;/h3&gt;
&lt;p&gt;The next step is to use a known location in the image as a reference point.
The easiest one for us to use is the center of the Moon, which we find by doing edge detection and Hough filtering, using &lt;a class="reference external" href="https://scikit-image.org/"&gt;scikit-image&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;skimage.feature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;canny&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;peak_local_max&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;skimage.transform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hough_circle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hough_circle_peaks&lt;/span&gt;

&lt;span class="n"&gt;edges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;canny&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eclipse_image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eclipse_image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;
&lt;span class="n"&gt;radii&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;hough_res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hough_circle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;radii&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;accums&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hough_circle_peaks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hough_res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;radii&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_num_peaks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;figure class="align-default" id="id4"&gt;
&lt;img alt="A cropped image of the moon showing edge detection and Hough filtering in three panes." src="https://sunpy.org/_images/figure_2.svg" style="width: 100%;" /&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;span class="caption-text"&gt;A cropped view of the Moon, showing the results of the canny edge detection algorithm and the Hough filter.&lt;/span&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/section&gt;
&lt;section id="calculate-the-image-scale"&gt;
&lt;h3&gt;Calculate the image scale&lt;/h3&gt;
&lt;p&gt;Based on the determined center of the Moon and its radius in the image we can construct an initial coordinate system for the image.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;astropy.coordinates&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SkyCoord&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;astropy.units&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;u&lt;/span&gt;

&lt;span class="n"&gt;moon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkyCoord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;moon&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;observer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;artemis_ii&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;R_moon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.2725076&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;  &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;R_earth&lt;/span&gt;  &lt;span class="c1"&gt;# IAU mean radius&lt;/span&gt;
&lt;span class="n"&gt;dist_moon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkyCoord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;artemis_ii&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;separation_3d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;moon_angular_width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arcsin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;R_moon&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;dist_moon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arcsec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;im_radius&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rad&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pix&lt;/span&gt;
&lt;span class="n"&gt;plate_scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;moon_angular_width&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;im_radius&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We can now construct a sunpy &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt; using this information and overplot the anticipated location of the planets:&lt;/p&gt;
&lt;figure class="align-default" id="id5"&gt;
&lt;img alt="Initial coordinate system fit, showing the lunar center, limb and expected locations of Mercury, Mars and Saturn, which are offset from their positions in the picture." src="https://sunpy.org/_images/figure_4.svg" style="width: 100%;" /&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;span class="caption-text"&gt;Initial coordinate system fit to image, notice that the locations of the highlighted planets are incorrect.&lt;/span&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/section&gt;
&lt;section id="determine-the-camera-orientation"&gt;
&lt;h3&gt;Determine the camera orientation&lt;/h3&gt;
&lt;p&gt;It’s clear from the previous image that we still need to correct for the camera orientation.
Having the camera at a specific orientation is tricky even when using a tripod on the Earth’s surface, and we imagine is even trickier when flying through space!
Fortunately, the planets serve as excellent reference points.&lt;/p&gt;
&lt;p&gt;We determine the camera orientation by using a peak finding algorithm to locate the planets in the image and comparing these positions to the planets coordinates extracted from JPL Horizons.
Doing this gives a &lt;span class="math notranslate nohighlight"&gt;\(-21.2^\circ\)&lt;/span&gt; roll angle which we can add to our &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt; metadata.&lt;/p&gt;
&lt;figure class="align-default" id="id6"&gt;
&lt;img alt="Image showing the expected positions of the planets and the detected (peaks) positions of the planets." src="https://sunpy.org/_images/figure_5.svg" style="width: 100%;" /&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;span class="caption-text"&gt;Image showing the expected positions of the planets and the detected (peaks) positions of the planets, from which the roll angle is calculated.&lt;/span&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/section&gt;
&lt;section id="account-for-lens-distortion"&gt;
&lt;h3&gt;Account for lens distortion&lt;/h3&gt;
&lt;p&gt;The final correction to apply to our fitted coordinate system is the distortion of the camera lens (a Nikkor AF 135mm f/2D DC).
This makes objects distant from the center of the image appear even more distant than they should.
We can quantify exactly how much the image has been distorted by comparing the expected versus actual positions of Mars and Mercury (not Saturn as it is too close to the center of the image).
We add this distortion to our coordinate system and our planets now appear in the correct place.&lt;/p&gt;
&lt;figure class="align-default" id="id7"&gt;
&lt;img alt="Coordinate system fit with additional correction for lens distortion, the expected positions of the planets now match the image." src="https://sunpy.org/_images/figure_7.svg" style="width: 100%;" /&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;span class="caption-text"&gt;Coordinate system fit with additional correction for lens distortion.&lt;/span&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="overplotting-coronagraph-images"&gt;
&lt;h2&gt;Overplotting Coronagraph Images&lt;/h2&gt;
&lt;p&gt;Now that we have established the coordinate system for the eclipse photo, we can compare this observation of the corona to other data.
To do this we are going to use the coronagraph (the LASCO instrument) on the &lt;a class="reference external" href="https://soho.nascom.nasa.gov/"&gt;Solar and Heliospheric Observatory (SOHO)&lt;/a&gt; which is located around the Sun-Earth L1 point.
We reproject (or re-grid) these images to the fitted coordinate system of the Artemis II image to compensate for differences in satellite location and point of view, and then crop them to the limb of the moon.&lt;/p&gt;
&lt;figure class="align-default" id="id8"&gt;
&lt;img alt="The Artemis II solar eclipse photo with the positions of Mercury, Mars and Saturn highlighted, and coronagraph images from SOHO's LASCO instrument plotted over the disc of the moon." src="https://sunpy.org/_images/figure_9.svg" style="width: 100%;" /&gt;
&lt;figcaption&gt;
&lt;p&gt;&lt;span class="caption-text"&gt;The Artemis II solar eclipse photo with the positions of Mercury, Mars and Saturn highlighted, and coronagraph images from SOHO’s LASCO instrument plotted over the disc of the Moon.&lt;/span&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The coronal structure visible in the LASCO image is not visible in the Artemis II eclipse photo, but the former has undergone significant image processing, and the latter is mostly straight out of the camera.
A more scientific comparison may be possible when additional imagery from Artemis II is released in the future.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="closing-thoughts"&gt;
&lt;h2&gt;Closing thoughts&lt;/h2&gt;
&lt;p&gt;We think this post is a striking demonstration of what &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy&lt;/span&gt;&lt;/code&gt; makes possible.
By combining image metadata, spacecraft ephemerides, and coordinate-aware reprojection, we can place the astronauts’ eclipse photo and SOHO/LASCO coronagraph data into the same physical frame and compare views of the same corona from two very different vantage points.
As a reminder, you can find the full code behind this post in these two examples in the SunPy gallery: &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/gallery/showcase/artemis-ii-trajectory.html" title="sunpy 4.13.0"&gt;Artemis II trajectory&lt;/a&gt; and &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/gallery/showcase/artemis-ii-eclipse.html" title="sunpy 4.13.0"&gt;Artemis-II Solar Eclipse&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are lucky enough to observe the total solar eclipse which will be visible from parts of Europe on August 12, 2026, remember you can try this type of analysis with your own photos by following our &lt;a class="reference internal" href="../../../posts/2024/2024-04-03-eclipse/#2024-04-03-eclipse"&gt;&lt;span class="std std-ref"&gt;previous blog post&lt;/span&gt;&lt;/a&gt;!&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2026/artemis_2_eclipse/"/>
    <summary>The Artemis II mission recently completed its landmark voyage around the Moon, marking the first departure of humans from Earth orbit in over fifty years.
Soon after Artemis II set the record of human distance from Earth, the astronauts took stunning photos of the the solar eclipse they observed on April 6 (EDT) / April 7 (UTC).
We highly recommend watching the recording of the eclipse &lt;a href="https://youtu.be/dS9qqzSF3mI?si=NFfli3b7f0tYoVDP&amp;t=1683"&gt;on YouTube&lt;/a&gt;; the reactions and descriptions of the astronauts are worth it.</summary>
    <category term="eclipse" label="eclipse"/>
    <published>2026-04-09T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2024/2024-06-19-groupaward/</id>
    <title>SunPy Development Team wins a NASA Group Achievement Award!</title>
    <updated>2024-06-19T00:00:00+00:00</updated>
    <author>
      <name>Laura Hayes</name>
    </author>
    <content type="html">&lt;section id="sunpy-development-team-wins-a-nasa-group-achievement-award"&gt;

&lt;p&gt;We are delighted to announce that the SunPy development team has been awarded with a NASA Group Achievement Award!&lt;/p&gt;
&lt;p&gt;The award was given to our team for “developing and continually improving free and reliable open-source software that supports NASA missions and the analysis of NASA’s vast archives of solar physics data”.&lt;/p&gt;
&lt;p&gt;This award is a collective achievement, and we share it with everyone who has contributed to SunPy!
We look forward to continuing our mission of supporting solar physics research and making impactful contributions to the scientific community.&lt;/p&gt;
&lt;p&gt;&lt;img alt="SunPy Award" src="https://sunpy.org/_images/sunpy_award.jpg" /&gt;&lt;/p&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2024/2024-06-19-groupaward/"/>
    <summary>We are delighted to announce that the SunPy development team has been awarded with a NASA Group Achievement Award!</summary>
    <published>2024-06-19T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2020/2020-08-17_affiliated_packages/</id>
    <title>The What, Why, and How of SunPy Affiliated Packages</title>
    <updated>2020-08-18T00:00:00+00:00</updated>
    <author>
      <name>Laura Hayes</name>
    </author>
    <content type="html">&lt;section id="the-what-why-and-how-of-sunpy-affiliated-packages"&gt;

&lt;section id="what-are-sunpy-affiliated-packages"&gt;
&lt;h2&gt;What are SunPy affiliated packages?&lt;/h2&gt;
&lt;p&gt;SunPy affiliated packages are well-maintained, open-source software packages that build upon or extend the functionality of the SunPy core library.
The main idea behind affiliated packages is to provide additional tools and functionality to the solar physics community that is considered outside the scope of the SunPy core library, but builds upon it.
Affiliated packages are aimed to integrate well with the SunPy ecosystem and together with the core library offer a diverse software ecosystem for which to perform solar data analysis.
Affiliated packages are reviewed and registered with the SunPy project.&lt;/p&gt;
&lt;p&gt;There are two types of affiliated packages - &lt;em&gt;sponsored&lt;/em&gt; and &lt;em&gt;non-sponsored&lt;/em&gt;.
A sponsored affiliated package is an affiliated package that is maintained and overseen by the SunPy project, examples of these include &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/"&gt;sunpy core&lt;/a&gt; and &lt;a class="reference external" href="https://docs.sunpy.org/projects/ndcube/en/stable/"&gt;ndcube&lt;/a&gt;.
Non-sponsored affiliated packages on the other hand remain under the control and maintenance of the original developers, but must meet a set of standards.
Examples of non-sponsored affiliated packages would be instrument-specific affiliated packages such as &lt;a class="reference external" href="https://pypi.org/project/aiapy/"&gt;AIApy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this blog post we want to outline our new streamline process for becoming an affiliated package and we want to encourage package developers, particularly instrument teams interested in developing a Python package, to submit their package for review for SunPy affiliate status!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="why-would-a-package-want-to-become-an-affiliated-package"&gt;
&lt;h2&gt;Why would a package want to become an affiliated package?&lt;/h2&gt;
&lt;p&gt;SunPy supports the development of affiliated packages through our community development efforts and by providing our package template.
The SunPy project will also ensure that affiliated packages are publicized to encourage community development.
For example, affiliated packages are listed on the SunPy website, and SunPy adverstises them at conferences and workshops.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="call-to-instrument-mission-teams"&gt;
&lt;h2&gt;Call to instrument/mission teams!&lt;/h2&gt;
&lt;p&gt;We invite instrument and mission teams that are interested in developing a Python package to become a SunPy affiliated package.
Integrating mission/instrument-specific software within the SunPy ecosystem will be of great benefit to the solar community and will allow for a simplified and unified process for users to perform solar data analysis.
For example, a package may consist of instrument-specific calibration routines which would be outside the scope of SunPy core package, but could build upon the functionality provided by core such as the data containers and file readers.
Developing a mission/instrument specific package as a SunPy affiliated package will allow the code to live and integrate within the SunPy ecosystem.&lt;/p&gt;
&lt;p&gt;Furthermore, for mission/instrument teams that would like to begin developing specific Python software, the SunPy project offers support through our package template and community resources for the package to be ‘incubated’ until it is at the level of affiliate status.
We would really like to encourage instrument/mission teams to reach out!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="package-template"&gt;
&lt;h2&gt;Package template&lt;/h2&gt;
&lt;aside class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: INFO/1 (&lt;span class="docutils literal"&gt;/home/docs/checkouts/readthedocs.org/user_builds/sunpyorg/checkouts/491/posts/2020/2020-08-17_affiliated_packages.rst&lt;/span&gt;, line 7); &lt;em&gt;&lt;a href="#id1"&gt;backlink&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Duplicate implicit target name: “package template”.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;The SunPy project is currently developing a &lt;a class="reference external" href="https://github.com/sunpy/package-template"&gt;package template&lt;/a&gt; that is designed to help developers create new Python packages within the SunPy ecosystem.
The template is still in development, and we are working towards creating more documentation to make it accessible for developers to use.
The idea is that this template will provide a simplified way to standardized packaging, testing, and documentation using the same framework as the SunPy core package.
The SunPy package template will make it easier for package developers to meet the standards required by SunPy to become an affiliated package!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="how-does-a-package-become-an-affiliated-package"&gt;
&lt;h2&gt;How does a package become an affiliated package?&lt;/h2&gt;
&lt;p&gt;To become a SunPy affiliated package, a set of criteria need to be met to ensure that affiliated packages provide useful functionality to the community at a standard of quality similar to the core SunPy package.
We now have a new review process for becoming an affiliated package, aimed at being open, approachable and streamlined!&lt;/p&gt;
&lt;p&gt;The reviews are performed as an open process through GitHub issues on the &lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;https://github.com/sunpy/sunpy.org&lt;/span&gt;&lt;/code&gt; repository.
To submit a package for review to become an affiliated package, an issue should be opened on this repository.
We now have an &lt;a class="reference external" href="https://github.com/sunpy/sunpy.org/issues/new?assignees=Cadair&amp;amp;labels=Affiliated+Package+Review&amp;amp;template=new_affiliated_package.md"&gt;issue template&lt;/a&gt; for submitting a package for review to make it easier to provide all the required information and to start a dialogue about the process.&lt;/p&gt;
&lt;p&gt;Once an issue is open, the Affiliate Package Liaison will check that the package meets the baseline requirements of an affiliated package.
These include checking to see that it is compatible with the SunPy &lt;a class="reference external" href="https://sunpy.org/coc"&gt;Code of Conduct&lt;/a&gt;,  has an appropriate licence, provides a Python interface, is on PyPI, and is useful to the solar physics community.
Following this, a reviewer independent to the package is assigned and a review is undertaken based on the criteria listed below.&lt;/p&gt;
&lt;p&gt;The review criteria that are assessed are listed as follows with the associated gradings:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Functionality&lt;/strong&gt;  Does the package provide functionality that is useful and relevant to the solar physics community?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration&lt;/strong&gt;  - Does that package integrate well within the SunPy ecosystem? for example does it make use of all appropriate features in the core library, including the applicable data structures and dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;  - Does the package have satisfactory documentation that is up to the standard of the core sunpy library including a user guide and examples?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt; - Does the package use a testing suite to verify the code functionality within its codebase? Does it provide integration tests?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Duplication&lt;/strong&gt; - Does the package duplicate functionality within sunpy core or any of the other affiliated packages or other relevant packages?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community&lt;/strong&gt;  - Is the package openly developed with active input and engagement from users within the community? Does the package have a code of conduct and does this reflect the same values as the SunPy project?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Development Status&lt;/strong&gt; - Is the package well maintained? Are contribution responded to by developers? Is the package still under development with large API changes?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These criteria are reviewed on a ‘traffic light’ system and ranked ‘green’, ‘orange’, or ‘red’ based on the submitted package.
For full details of how each of criteria are ranked please check out the &lt;a class="reference external" href="https://sunpy.org/affiliated#affiliated-package-review"&gt;Review Criteria&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For a submitted package to be accepted to affiliate package status, the package must be ‘green’ in &lt;strong&gt;Functionality&lt;/strong&gt;, and one other category.
It must also not list any ‘red’ scores.&lt;/p&gt;
&lt;p&gt;If the package in its current state does not pass the criteria, it can be listed as &lt;em&gt;Provisional&lt;/em&gt; once it does not list ‘red’ in the &lt;strong&gt;Functionality&lt;/strong&gt;, &lt;strong&gt;Duplication&lt;/strong&gt; or &lt;strong&gt;Community&lt;/strong&gt; criteria.
The idea is that the package can be listed as Provisional as it is working towards addressing the criteria for which it did not pass the review in.&lt;/p&gt;
&lt;p&gt;We would really like to encourage packages interested in becoming an affiliated SunPy package to please submit an issue and open up a review dialogue.
We will have an Affiliated Package Liaison that will help you through each step of this process :).
Even if you are unsure about whether you want to submit a package, please feel free to open an issue and informally discuss your package.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="reach-out"&gt;
&lt;h2&gt;Reach out!&lt;/h2&gt;
&lt;p&gt;If you are a developer of a package that you think fits nicely into the SunPy ecosystem and will of benefit to the solar physics community and want to chat to us about it please reach out!
This can be of course regardless of how far along the package is - from concept to maturity!
Join us our live chat &lt;a class="reference external" href="https://app.element.io/#/room/#sunpy:openastronomy.org"&gt;Matrix room&lt;/a&gt; or join in on the SunPy weekly community meetings which occur each Wednesday (see &lt;a class="reference external" href="https://calendar.google.com/calendar?cid=ZzljOWVha2c5OGI1Y2JvZ2Q3bTV0YTZoOHNAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ"&gt;our calendar&lt;/a&gt; for the time in your timezone) and are hosted on &lt;a class="reference external" href="https://sunpy.org/meeting"&gt;jitsi&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2020/2020-08-17_affiliated_packages/"/>
    <summary>SunPy affiliated packages are well-maintained, open-source software packages that build upon or extend the functionality of the SunPy core library.
The main idea behind affiliated packages is to provide additional tools and functionality to the solar physics community that is considered outside the scope of the SunPy core library, but builds upon it.
Affiliated packages are aimed to integrate well with the SunPy ecosystem and together with the core library offer a diverse software ecosystem for which to perform solar data analysis.
Affiliated packages are reviewed and registered with the SunPy project.</summary>
    <category term="sunpy" label="sunpy"/>
    <published>2020-08-18T00:00:00+00:00</published>
  </entry>
</feed>
