<?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 Stuart Mumford</title>
  <updated>2026-04-16T16:25:22.319554+00:00</updated>
  <link href="https://sunpy.org/"/>
  <link href="https://sunpy.org/blog/author/stuart-mumford/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>Albert Y. Shih</name>
    </author>
    <content type="html">&lt;section id="artemis-ii-solar-eclipse"&gt;

&lt;p&gt;The Artemis II mission launched on the 1st April 2026; this launch date allowed the crew to observe a solar eclipse on the 6th April(EDT) / 7th April (UTC) after transiting the far side of the moon.&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;We on the SunPy blog &lt;a class="reference internal" href="../../../posts/2024/2024-04-03-eclipse/#2024-04-03-eclipse"&gt;&lt;span class="std std-ref"&gt;rarely miss the opportunity&lt;/span&gt;&lt;/a&gt; to talk &lt;a class="reference external" href="https://github.com/sunpy/solar-eclipse/"&gt;about a solar eclipse&lt;/a&gt;.
So when we saw the stunning photos taken by the astronauts on Artemis II, we wanted to use SunPy to compare them to other photos of the solar corona.
I do 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;p&gt;Amongst the many amazing photos downlinked during the mission was this image of the solar eclipse:&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 image is particularly good for comparing to other solar data because the limb of the moon is clearly visible, and there are stars and planets in the image we can use as references.
These features will allow us to determine exactly where and at what angle the camera was pointing.
At the end of the post you will be able to see how we can overlay on this photo images taken by solar observing satellites.&lt;/p&gt;
&lt;section id="fitting-coordinate-information"&gt;
&lt;h2&gt;Fitting Coordinate Information&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 rotated.
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 lookup 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 location of 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 identify 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;All the code for this example is in &lt;span class="xref std std-ref"&gt;The sunpy Gallery&lt;/span&gt;.&lt;/p&gt;
&lt;section id="finding-the-position-of-artemis-ii"&gt;
&lt;h3&gt;Finding 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;.
Once we have this we query &lt;a class="reference external" href="https://ssd.jpl.nasa.gov/horizons/"&gt;JPL Horizons&lt;/a&gt; for the position of Artemis II.&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_naif_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-1024&amp;quot;&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="n"&gt;artemis2_naif_id&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;p&gt;We can also use the positions returned by JPL Horizons and the coordinates packages in sunpy and astropy to visualize what part of the Artemis II trajectory was in eclipse.
To see the details of how this was done see &lt;a class="reference external" href="https://sunpy--8574.org.readthedocs.build/en/8574/generated/gallery/showcase/artemis-ii-trajectory.html"&gt;this example in the SunPy gallery&lt;/a&gt;.&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/artemis2-corot-traj.png" 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;/section&gt;
&lt;section id="moon-limb-fitting"&gt;
&lt;h3&gt;Moon Limb Fitting&lt;/h3&gt;
&lt;p&gt;The next step is to find a known location in the image, 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="calculating-image-scale"&gt;
&lt;h3&gt;Calculating Image Scale&lt;/h3&gt;
&lt;p&gt;Based on the determined center of the moon is and its radius in the image we can construct a 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;Using this information we can build a sunpy map (see the gallery example for details).
Plotting this alongside the locations of the planets results in:&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="fitting-roll-angle"&gt;
&lt;h3&gt;Fitting Roll Angle&lt;/h3&gt;
&lt;p&gt;It’s clear from the previous image that the image is rotated around the center of the moon.
We can solve for this rotation 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 results in a &lt;span class="math notranslate nohighlight"&gt;\(-21.2^\circ\)&lt;/span&gt; roll angle which we can add to our Maps 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="fitting-lens-distortion"&gt;
&lt;h3&gt;Fitting 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 centre of the image appear even more distant than they should.
We can quantify exactly how much the image has been distorted through comparing the expected vs 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 to 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 fit a coordinate system to the eclipse photo we can compare this observation of the corona to other data.
To do this we are going to use the coronagraph 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;We hope you have found this post interesting.
The full code for this post can be found in &lt;span class="xref std std-ref"&gt;The sunpy Gallery&lt;/span&gt;.
Remember, that if you are lucky enough to observe the total solar eclipse which will be visible from parts of Europe in August 2026 and you take a photo, 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 launched on the 1st April 2026; this launch date allowed the crew to observe a solar eclipse on the 6th April(EDT) / 7th April (UTC) after transiting the far side of the moon.</summary>
    <category term="eclipse" label="eclipse"/>
    <published>2026-04-09T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2024/2024-04-03-eclipse/</id>
    <title>Process Your Solar Eclipse Photos with SunPy!</title>
    <updated>2024-04-03T00:00:00+00:00</updated>
    <author>
      <name>Stuart Mumford</name>
    </author>
    <content type="html">&lt;div class="admonition note"&gt;
&lt;p&gt;This blog post was written in a &lt;a class="reference external" href="https://github.com/sunpy/sunpy.org/blob/main/posts/2024/2024-04-03-eclipse.ipynb"&gt;Jupyter notebook&lt;/a&gt;.
Click here for an interactive version:
&lt;span class="raw-html"&gt;&lt;a href="https://mybinder.org/v2/gh/sunpy/sunpy.org/main?filepath=posts/2024/2024-04-03-eclipse.ipynb"&gt;&lt;img alt="Binder badge" src="https://mybinder.org/badge.svg" style="vertical-align:text-bottom"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;section id="Process-Your-Solar-Eclipse-Photos-with-SunPy!"&gt;

&lt;p&gt;On April 8th, 2024, &lt;a class="reference external" href="https://science.nasa.gov/eclipses/"&gt;a total solar eclipse will pass over North America&lt;/a&gt;. A total solar eclipse happens when the Moon passes between the Sun and Earth, completely blocking the face of the Sun. Only during totality, when the bright disk is completely obscured, is it possible to see with the naked eye the solar corona, the outermost layer of the Sun’s atmosphere. The total solar eclipse will give millions across North America the chance to see and photograph
the solar corona.&lt;/p&gt;
&lt;p&gt;In this blog post, we will show how you can use SunPy to process your photos of the eclipse. To do this, we will use an image from the 2017 solar eclipse that also passed over North America, the so-called “Great American Eclipse”. We will walk through processing this image with SunPy as well as other Python libraries, so that you can generate a coordinate system for your image. As we will show, this allows you to combine your eclipse images with solar observations such as those from NASA’s
&lt;em&gt;Solar Dynamics Observatory&lt;/em&gt;.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[1]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 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;pathlib&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;Path&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="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;exifread&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;matplotlib.image&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;matplotlib.pyplot&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;plt&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;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sunpy.coordinates&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;sunpy.coordinates.sun&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.constants&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;R_earth&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;CartesianRepresentation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EarthLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SkyCoord&lt;/span&gt;

&lt;span class="c1"&gt;# We have defined a few helper functions in this `eclipse_helpers.py` file.&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;eclipse_helpers&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;SOLAR_ECLIPSE_IMAGE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get_camera_metadata&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;matplotlib.patches&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;Circle&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;scipy&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;ndimage&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.color&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;rgb2gray&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;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="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sunpy.map.header_helper&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;make_fitswcs_header&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.net&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;Fido&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.net&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;attrs&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;a&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.time&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;parse_time&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;section id="Read-in-Your-Eclipse-Photo"&gt;
&lt;h2&gt;Read in Your Eclipse Photo&lt;/h2&gt;
&lt;p&gt;The first step is to read in our image. As mentioned above, we will be using an image taken during the 2017 eclipse taken with a consumer-grade camera. When reading in our image data, we’ll invert the y-axis and convert it to a grayscale image.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[2]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;im_rgb&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;flipud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matplotlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SOLAR_ECLIPSE_IMAGE&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rgb2gray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im_rgb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area stderr docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
/Users/nabil/micromamba/envs/sunpy-dev/lib/python3.13/site-packages/skimage/color/colorconv.py:984: RuntimeWarning: divide by zero encountered in matmul
  return rgb @ coeffs
/Users/nabil/micromamba/envs/sunpy-dev/lib/python3.13/site-packages/skimage/color/colorconv.py:984: RuntimeWarning: overflow encountered in matmul
  return rgb @ coeffs
/Users/nabil/micromamba/envs/sunpy-dev/lib/python3.13/site-packages/skimage/color/colorconv.py:984: RuntimeWarning: invalid value encountered in matmul
  return rgb @ coeffs
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[3]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lower&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gray&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;img alt="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_6_0.png" src="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_6_0.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to be able to align our image with solar images from NASA, we will also need some additional metadata from our image. The two most important things we need to know are:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;the GPS coordinates of where the photo was taken and&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the time the image was taken&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We can pull this metadata from the file and then use an additional function we wrote to process this metadata into a Python dictionary.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[4]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SOLAR_ECLIPSE_IMAGE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rb&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exifread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[5]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_camera_metadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As it turns out, the time on the camera used to take this eclipse photo was wrong, we have to manually correct it.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[6]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;time&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;parse_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2017-08-21 17:27:13&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="Find-the-Moon"&gt;
&lt;h2&gt;Find the Moon&lt;/h2&gt;
&lt;p&gt;Now that we’ve loaded our image and accompanying metadata, the next step is to locate the edge of the Moon in our image. This allows us to find the center of the Moon, which is needed when aligning our data, as well as allowing us to determine the scale of the Moon in the image. In order to do this we are going to use several different image manipulation techniques.&lt;/p&gt;
&lt;p&gt;We start with applying a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Gaussian_filter"&gt;Gaussian blur&lt;/a&gt; to help segment the lunar disk from the corona and mask all parts of the image above a given threshold.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[7]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;blur_im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ndimage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gaussian_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blur_im&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;blur_im&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;img alt="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_14_0.png" src="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_14_0.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We then label those masked regions and select only the parts of the image that correspond to the bright, diffuse corona.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[8]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;label_im&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nb_labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ndimage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;slice_y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slice_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ndimage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_objects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label_im&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;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;roi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blur_im&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;slice_y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slice_x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The next step is to detect the inner edge of the bright corona. To do this, we apply a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Sobel_operator"&gt;Sobel filter&lt;/a&gt; in both the x and y directions, and then calculate a single image from the two directions.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[9]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ndimage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sobel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;roi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&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;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;constant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ndimage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sobel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;roi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;constant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sob&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;hypot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finally, we use scikit-image to apply the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Hough_transform"&gt;Hough Transform&lt;/a&gt; to identify circles in the image. We then use this to extract the size in pixels of the lunar disk and its center.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[10]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;hough_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="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floor&lt;/span&gt;&lt;span class="p"&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;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sob&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&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;ceil&lt;/span&gt;&lt;span class="p"&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;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sob&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&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="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;sob&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sob&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;hough_radii&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Select the most prominent circle&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;radii&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;hough_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;/div&gt;
&lt;p&gt;As shown below, we now have a list of pixel coordinates corresponding to the solar limb in our image. The first frame is the cropped original image. The middle frame is the Sobel filtered image used to apply the Hough transform. The right frame is the fitted circle on the original image.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[11]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ncols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrows&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;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;9.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;slice_y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slice_x&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Original&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sob&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sob&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Sobel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;circ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt;&lt;span class="p"&gt;(&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;radius&lt;/span&gt;&lt;span class="o"&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;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;none&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edgecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;red&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&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;linestyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dashed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hough fit&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;slice_y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slice_x&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;circ&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Original with fit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;img alt="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_22_0.png" src="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_22_0.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lastly, let’s add units to our circle that we fit the lunar limb.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[12]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;im_cx&lt;/span&gt; &lt;span class="o"&gt;=&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;slice_x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&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;im_cy&lt;/span&gt; &lt;span class="o"&gt;=&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;slice_y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&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;im_radius&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;radii&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&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;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="Make-a-SunPy-Map"&gt;
&lt;h2&gt;Make a SunPy &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;At this point, we have our image data, it’s metadata and we’ve located the Moon. Now we are ready to load our eclipse photograph into a SunPy &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt;! A &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt; allows us to carry around both the data and metadata of our image together and, importantly, makes it easy to combine solar observations from multiple observatories.&lt;/p&gt;
&lt;p&gt;First, we define the observer location (i.e., where on Earth did we take our picture?) and the orientation of the Sun in the sky. For the observer location, we can use the GPS coordinates from our image metadata.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[13]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EarthLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;lon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gps&amp;quot;&lt;/span&gt;&lt;span class="p"&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;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_itrs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Second, we determine the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Angular_diameter"&gt;angular size&lt;/a&gt; of the Moon using its radius and its distance from the observer.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[14]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&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;sunpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coordinates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_body_heliographic_stonyhurst&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;camera_metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;time&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;observer&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;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;observer&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_obs&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="s2"&gt;&amp;quot;arcsec&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moon_obs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area stderr docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
2025-06-23 09:08:55 - sunpy - INFO: Apparent body location accounts for 1.23 seconds of light travel time
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
INFO: Apparent body location accounts for 1.23 seconds of light travel time [sunpy.coordinates.ephemeris]
975.9073137731282 arcsec
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Combining this angular radius with the radius of the lunar disk in pixels gives us the angular size of the pixels in the image. In the parlance of astronomical imaging, this is often referred to as the &lt;em&gt;plate scale&lt;/em&gt;.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[15]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&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_obs&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;im_radius&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plate_scale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
4.356729079344322 arcsec / pix
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We also use the observer location to calculate the orientation of the Sun as seen from that location on Earth. This gives us a rotation angle between our image coordinate system and the solar north pole. If your camera is not perfectly horizontal then you may need to fudge this value slightly.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[16]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;solar_rotation_angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sunpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coordinates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sun&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;solar_rotation_angle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
-54d19m44.13467961s
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finally we have all the information we need to build a sunpy &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt; for our eclipse image.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[17]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sunpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coordinates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Helioprojective&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;observer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obstime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;moon_hpc&lt;/span&gt; &lt;span class="o"&gt;=&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;transform_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make_fitswcs_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;moon_hpc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reference_pixel&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;Quantity&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;im_cx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;im_cy&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="n"&gt;scale&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;Quantity&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;plate_scale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plate_scale&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="n"&gt;rotation_angle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;solar_rotation_angle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;exposure&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;exposure_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;instrument&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;camera_model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;observatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;author&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[18]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;eclipse_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sunpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[19]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;img alt="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_38_0.png" src="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_38_0.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="Find-a-Star"&gt;
&lt;h2&gt;Find a Star&lt;/h2&gt;
&lt;p&gt;Though we already have all of the metadata we need to make a SunPy &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt;, we can further improve the accuracy by locating a known star in the image and using that to determine the rotation angle. In the case of the 2017 eclipse the very bright star (magnitude 1.4) &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Regulus"&gt;Regulus&lt;/a&gt; was close to the Sun and in the field of view of our photograph. For the 2024 eclipse, no such bright star will be visible, which may make this method of aligning your image
challenging. The best candidate looks to be &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Alpha_Piscium"&gt;Alpha Piscium&lt;/a&gt; which is a binary system with a combined magnitude of 3.82, significantly dimmer than Regulus. You can see the stars close to the Sun by using &lt;a class="reference external" href="https://stellarium-web.org/skysource/Sun?fov=1.1092&amp;amp;date=2024-04-08T18:30:47Z&amp;amp;lat=28.86&amp;amp;lng=-100.53&amp;amp;elev=0"&gt;Stellarium&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As Regulus is a well known star, we can create a coordinate object for it, including its distance.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[20]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;regulus&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;ra&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;10h08m22.311s&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;11d58m01.95s&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;79.3&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;lightyear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;icrs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regulus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
&amp;lt;SkyCoord (ICRS): (ra, dec, distance) in (deg, deg, lyr)
    (152.0929625, 11.96720833, 79.3)&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We can then plot the expected location of Regulus on our eclipse image. We set the scaling such that it make Regulus more visible and zoom in on the relevant part of the field of view. You can see that the expected location and the actual location are quite different.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[21]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clip_interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&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;percent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot_coord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;regulus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;o&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markeredgewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markeredgecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markerfacecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;None&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&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;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Regulus&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;img alt="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_43_0.png" src="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_43_0.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Given this offset, we want to fix our image metadata such that the actual and expected locations of Regulus are line up. We can calculate the expected distance from the center of the Sun to Regulus in pixels.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[22]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;regulus_pixel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CartesianRepresentation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wcs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;world_to_pixel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regulus&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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;sun_pixel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CartesianRepresentation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wcs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;world_to_pixel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SkyCoord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&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;arcsec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&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;arcsec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;regulus_r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regulus_pixel&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sun_pixel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regulus_r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
1084.0811009031981 pix
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We then use this to find Regulus in our image, by filtering out all pixels which are closer to the Sun than this.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[23]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pix_x&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="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dimensions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&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="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sun_pixel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;
&lt;span class="n"&gt;pix_y&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="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dimensions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&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="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sun_pixel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yy&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;meshgrid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pix_x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pix_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;r&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;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;yy&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;filter_r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;regulus_r&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regulus_r&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;masked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;masked&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;filter_r&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;masked&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Having masked out most of the Sun and its corona, we now find the highest peak remaining, which should be Regulus.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[24]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;regulus_y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regulus_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;peak_local_max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;masked&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_distance&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;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;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;actual_regulus_pixel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CartesianRepresentation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regulus_x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regulus_y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We can now compare the identified pixel coordinates of Regulus to the expected coordinates assuming the camera was exactly horizontal.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[25]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;actual_regulus_pixel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regulus_pixel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
(372., 247., 0.) pix
(339.45349652, 307.65804366, 0.) pix
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finally, we calculate the angular offset between our expected location and our identified location and then add this difference to correct our solar rotation angle.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[26]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;vec_expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;regulus_pixel&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sun_pixel&lt;/span&gt;
&lt;span class="n"&gt;vec_actual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;actual_regulus_pixel&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sun_pixel&lt;/span&gt;
&lt;span class="n"&gt;fudge_angle&lt;/span&gt; &lt;span class="o"&gt;=&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;arccos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vec_expected&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vec_actual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vec_expected&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;vec_actual&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fudge_angle&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;deg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
-3.5738144694153595 deg
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We then use this correction factor to build a new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt; for our image with updated metadata.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[27]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make_fitswcs_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;moon_hpc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reference_pixel&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;Quantity&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;im_cx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;im_cy&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="n"&gt;scale&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;Quantity&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;plate_scale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plate_scale&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="n"&gt;rotation_angle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;solar_rotation_angle&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fudge_angle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;exposure&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;exposure_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;instrument&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;camera_metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;camera_model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[28]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;eclipse_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sunpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Plotting our image again, we now find that the identified location of Regulus and our image line up much better.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[29]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clip_interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&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;percent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot_coord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;regulus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;o&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markeredgewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markeredgecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markerfacecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;None&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&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;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Regulus&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;img alt="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_58_0.png" src="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_58_0.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="Combine-your-Image-with-NASA-Data"&gt;
&lt;h2&gt;Combine your Image with NASA Data&lt;/h2&gt;
&lt;p&gt;As mentioned above, one of the main advantages of having data in a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt; is that it is then easy to combine observations from multiple different sources. Let’s overlay an AIA image from the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solar_Dynamics_Observatory"&gt;SDO&lt;/a&gt; satellite. We’ll choose an image that shows extreme ultraviolet emission from the corona, revealing plasma that is around one million degrees. Fortunately, all SDO data is publicly available and SunPy provides a convenient interface for
searching for and downloading this data.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[30]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;aia_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Fido&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2017-08-21 17:27:00&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2017-08-21 17:45:00&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Instrument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;AIA&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wavelength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;171&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;Angstrom&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aia_result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
Results from 1 Provider:

1 Results from the VSOClient:
Source: https://sdac.virtualsolar.org/cgi/search
Data retrieval status: https://docs.virtualsolar.org/wiki/VSOHealthReport
Total estimated size: 67.789 Mbyte

       Start Time               End Time        Source Instrument   Wavelength   Provider  Physobs  Wavetype Extent Width Extent Length Extent Type   Size
                                                                     Angstrom                                                                        Mibyte
----------------------- ----------------------- ------ ---------- -------------- -------- --------- -------- ------------ ------------- ----------- --------
2017-08-21 17:27:09.000 2017-08-21 17:27:10.000    SDO        AIA 171.0 .. 171.0     JSOC intensity   NARROW         4096          4096    FULLDISK 64.64844


&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[31]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;aia_result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[31]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="output_area rendered_html docutils container"&gt;
&lt;i&gt;QueryResponseRow index=0&lt;/i&gt;
&lt;table id="table5781630928"&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Start Time&lt;/th&gt;&lt;th&gt;End Time&lt;/th&gt;&lt;th&gt;Source&lt;/th&gt;&lt;th&gt;Instrument&lt;/th&gt;&lt;th&gt;Wavelength&lt;/th&gt;&lt;th&gt;Provider&lt;/th&gt;&lt;th&gt;Physobs&lt;/th&gt;&lt;th&gt;Wavetype&lt;/th&gt;&lt;th&gt;Extent Width&lt;/th&gt;&lt;th&gt;Extent Length&lt;/th&gt;&lt;th&gt;Extent Type&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th&gt;fileid&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Angstrom&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Mibyte&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Time&lt;/th&gt;&lt;th&gt;Time&lt;/th&gt;&lt;th&gt;str3&lt;/th&gt;&lt;th&gt;str3&lt;/th&gt;&lt;th&gt;float64[2]&lt;/th&gt;&lt;th&gt;str4&lt;/th&gt;&lt;th&gt;str9&lt;/th&gt;&lt;th&gt;str6&lt;/th&gt;&lt;th&gt;str4&lt;/th&gt;&lt;th&gt;str4&lt;/th&gt;&lt;th&gt;str8&lt;/th&gt;&lt;th&gt;float64&lt;/th&gt;&lt;th&gt;str24&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tr&gt;&lt;td&gt;2017-08-21 17:27:09.000&lt;/td&gt;&lt;td&gt;2017-08-21 17:27:10.000&lt;/td&gt;&lt;td&gt;SDO&lt;/td&gt;&lt;td&gt;AIA&lt;/td&gt;&lt;td&gt;171.0 .. 171.0&lt;/td&gt;&lt;td&gt;JSOC&lt;/td&gt;&lt;td&gt;intensity&lt;/td&gt;&lt;td&gt;NARROW&lt;/td&gt;&lt;td&gt;4096&lt;/td&gt;&lt;td&gt;4096&lt;/td&gt;&lt;td&gt;FULLDISK&lt;/td&gt;&lt;td&gt;64.64844&lt;/td&gt;&lt;td&gt;aia__lev1:171:1282411667&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[32]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Fido&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aia_result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;NSO&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;script type="application/vnd.jupyter.widget-view+json"&gt;{"model_id": "e1bb25088ab040349b6cd148fdea0e89", "version_major": 2, "version_minor": 0}&lt;/script&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[33]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[33]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
&amp;lt;parfive.results.Results object at 0x158950690&amp;gt;
[&amp;#39;/Users/nabil/sunpy/data/aia.lev1.171A_2017_08_21T17_27_09.35Z.image_lev1.fits&amp;#39;]
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Having downloaded this data we create a SunPy &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt; and then plot it on top of our eclipse image. Note that despite not being in the same coordinate system, our AIA &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt; is automatically transformed to the coordinate system of our image before plotting.&lt;/p&gt;
&lt;div class="nbinput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[34]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;aia_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sunpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[35]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-ipython3 notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;eclipse_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;aia_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;autoalign&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;aia_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area stderr docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
2025-06-23 09:09:07 - sunpy - INFO: Using mesh-based autoalignment
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
INFO: Using mesh-based autoalignment [sunpy.map.mapbase]
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt empty docutils container"&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;img alt="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_66_2.png" src="https://sunpy.org/_images/posts_2024_2024-04-03-eclipse_66_2.png" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="Conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this blog post, we demonstrated how to read your eclipse images into a SunPy &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Map&lt;/span&gt;&lt;/code&gt; and how to combine your own photographs with data from NASA observations of the Sun. Though this post used data from the 2017 eclipse, you should be able to use the same techniques to process your 2024 eclipse observations. Happy eclipse viewing!&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2024/2024-04-03-eclipse/"/>
    <summary>On 8 April 2024, a total solar eclipse will pass over Mexico, the United States, and Canada, allowing millions of people to see the highly-structured solar corona with their own eyes. Along the path of totality, many will be taking their own pictures of the eclipse. In this post we demonstrate how you can use SunPy to process your own eclipse photos!</summary>
    <category term="eclipse" label="eclipse"/>
    <category term="outreach" label="outreach"/>
    <category term="tutorials" label="tutorials"/>
    <published>2024-04-03T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2021/2021-10-08_nasa_osftl_grant/</id>
    <title>SunPy Awarded NASA Grant</title>
    <updated>2021-11-03T00:00:00+00:00</updated>
    <author>
      <name>Stuart Mumford</name>
    </author>
    <content type="html">&lt;section id="sunpy-awarded-nasa-grant"&gt;

&lt;p&gt;&lt;strong&gt;As part of the NASA “Open Source Tools, Frameworks, and Libraries” program, the SunPy proposal “Strengthening the Foundations of the SunPy Ecosystem” has been funded for the next three years.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This proposal was submitted in January 2021, and sought funding for both the core &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/sunpy.html#module-sunpy" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; package and wider goals of the project.
After &lt;a class="reference external" href="https://github.com/sunpy/sunpy-project/issues/9"&gt;early community input was collected&lt;/a&gt;, Albert Shih led the proposal itself, with NASA GSFC as the primary institution.
&lt;a class="reference external" href="https://docs.google.com/document/d/1_gf1HM7iIUVqgHAdDUFQfCUHzHkrEFUTJZP8O3PEoqw"&gt;The proposed effort&lt;/a&gt; focuses on three main areas:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Improving the technical infrastructure.&lt;/p&gt;
&lt;p&gt;This focuses on the tools that the wider project needs to scale up as we adopt more coordinated and affiliated packages.
To support multiple active projects with a common development workflow, more tooling and infrastructure is needed, both for maintainers of existing packages and developers new to writing affiliated packages.
As part of this work templates for setting up new packages will be improved, documentation will be written, and new automation and monitoring bots will be developed to ease the burden on the SunPy maintainers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Augmenting science-enabling functionality.&lt;/p&gt;
&lt;p&gt;This section aims to improve the tools provided by the core package to better support future challenges in solar physics data.
The two main components of this are supporting multi-point observations with improvements to the &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/coordinates/index.html#module-sunpy.coordinates" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.coordinates&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; package, and improving the support for very large datasets in &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/sunpy.html#module-sunpy" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and sponsored packages by leveraging the scaling and parallelism tools available from &lt;a class="reference external" href="https://dask.org"&gt;Dask&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Providing training and outreach&lt;/p&gt;
&lt;p&gt;This section will improve example galleries across both &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/sunpy.html#module-sunpy" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; core and affiliated packages, develop training materials for solar physics graduate students, and perform outreach activities with instrument teams and package developers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="what-will-the-money-pay-for"&gt;
&lt;h2&gt;What will the money pay for?&lt;/h2&gt;
&lt;p&gt;The money awarded to this proposal will pay for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Albert Shih will manage the project and augment parts of &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/coordinates/index.html#module-sunpy.coordinates" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.coordinates&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stuart Mumford will work on infrastructure for all sponsored and affiliated packages as discussed in &lt;a class="reference external" href="https://github.com/sunpy/sunpy-project/issues/2"&gt;sunpy/sunpy-project#2&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Will Barnes will work on the training/outreach and large-dataset-support components of the project.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="finally"&gt;
&lt;h2&gt;Finally&lt;/h2&gt;
&lt;p&gt;This is a major milestone for SunPy - it is the first significant amount of funding dedicated to directly working on the long term sustainability of the project.
This funding will help to significantly grow SunPy, both the core package and the ecosystem of associated packages.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2021/2021-10-08_nasa_osftl_grant/"/>
    <summary>As part of the NASA “Open Source Tools, Frameworks, and Libraries” program, the SunPy proposal “Strengthening the Foundations of the SunPy Ecosystem” has been funded for the next three years.</summary>
    <category term="sunpy" label="sunpy"/>
    <published>2021-11-03T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2021/2021-10-29_sunpy_31_ndcube_20/</id>
    <title>October Release Announcements</title>
    <updated>2021-10-29T00:00:00+00:00</updated>
    <author>
      <name>Stuart Mumford</name>
    </author>
    <content type="html">&lt;section id="october-release-announcements"&gt;

&lt;p&gt;Today we have a quadruple release announcement for you!
It’s been a very busy week in SunPy land getting both the core and ndcube releases over the line; I hope you enjoy them!&lt;/p&gt;
&lt;section id="sunpy-3-1"&gt;
&lt;h2&gt;sunpy 3.1&lt;/h2&gt;
&lt;p&gt;The next scheduled release of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy&lt;/span&gt;&lt;/code&gt; core package actually comes &lt;em&gt;a week&lt;/em&gt; early according to our &lt;a class="reference external" href="https://github.com/sunpy/sunpy/wiki/Release-Calendar"&gt;release calendar&lt;/a&gt;, but we couldn’t resist bringing you this end of month release party.&lt;/p&gt;
&lt;p&gt;The 3.1 release contains many new features and improvements, having merged 145 pull requests from 16 people including 8 new contributors.&lt;/p&gt;
&lt;p&gt;Some of the highlights from the &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/whatsnew/3.1.html#whatsnew-3-1" title="(in sunpy v4.13.0)"&gt;&lt;span&gt;What’s New in SunPy 3.1?&lt;/span&gt;&lt;/a&gt; page are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Increased in-situ data support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A new limb drawing function&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A new WISPR map source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Propagating solar-surface coordinates in time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Convenient reprojection of maps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JSOC keyword filtering with Fido&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arithmetic operations with maps&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My personal favourites being the new &lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;limb&lt;/span&gt; &lt;span class="pre"&gt;drawing&lt;/span&gt; &lt;span class="pre"&gt;function&lt;/span&gt;&lt;/code&gt;
and the &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/api/sunpy.map.GenericMap.html#sunpy.map.GenericMap.reproject_to" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;reproject_to&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method on all maps.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="ndcube-2-0"&gt;
&lt;h2&gt;ndcube 2.0&lt;/h2&gt;
&lt;p&gt;Even more excitingly, for me personally, is the long awaited 2.0 release of ndcube.&lt;/p&gt;
&lt;p&gt;ndcube is the sunpy sponsored package for working with multi-dimensional data with an associated WCS object.
For an introduction to ndcube and motivation for the 2.0 rework see &lt;a class="reference external" href="https://docs.sunpy.org/projects/ndcube/en/stable/introduction.html#ndcube-introduction" title="(in ndcube v2.4.0)"&gt;&lt;span&gt;An introduction to ndcube&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We started working on ndcube 2.0 back in 2019 when we had Yash Sharma do the initial work of porting the code base to use the &lt;a class="reference external" href="https://zenodo.org/record/1188875"&gt;APE 14&lt;/a&gt; APIs as his &lt;a class="reference external" href="https://yashrsharma44.medium.com/google-summer-of-code-2019-final-report-openastronomy-ndcube-65068b8571d8"&gt;Google Summer of Code project&lt;/a&gt;.
Little did any of us think that it would take over two years from that point to hit the final release.&lt;/p&gt;
&lt;p&gt;The road to ndcube 2.0 has been long and arduous; all involved have put in a lot of work and what we have made is something that I am personally very proud of.
ndcube 2.0 would not have happened without Dan Ryan, who as the co-maintainer for ndcube has spent many hours on video calls with me designing APIs, and many more hours besides working out problems you would only encounter in one in a million WCS objects!
I would also be remiss if I didn’t specifically thank the DKIST data center who have, by paying for my time, funded a lot of the development work on ndcube 2.0, even when the scope increased beyond their direct requirements.&lt;/p&gt;
&lt;p&gt;I hope that many packages will start using ndcube 2.0 as the base for their code.
There are already many who have helped to shape the release such as the &lt;a class="reference external" href="https://github.com/DKISTDC/dkist"&gt;DKIST User Tools&lt;/a&gt;, &lt;a class="reference external" href="https://github.com/astropy/specutils"&gt;specutils&lt;/a&gt; and &lt;a class="reference external" href="https://github.com/sunpy/sunraster"&gt;sunraster&lt;/a&gt; as well as others I know are in the works.&lt;/p&gt;
&lt;p&gt;For all the gory details of the changes in ndcube 2.0 see &lt;a class="reference external" href="https://docs.sunpy.org/projects/ndcube/en/stable/whatsnew/changelog.html#id11"&gt;the changelog&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pfsspy-1-0"&gt;
&lt;h2&gt;pfsspy 1.0&lt;/h2&gt;
&lt;p&gt;The SunPy-affiliated potential field source surface extrapolation package &lt;a class="reference external" href="https://pfsspy.readthedocs.io/"&gt;pfsspy&lt;/a&gt; maintained by &lt;a class="reference external" href="https://github.com/dstansby/"&gt;David Stansby&lt;/a&gt; has had a 1.0 release, which includes promises of API stability.
You can read about all the changes in &lt;a class="reference external" href="https://pfsspy.readthedocs.io/en/stable/changes.html"&gt;the changelog&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="aiapy-0-6"&gt;
&lt;h2&gt;aiapy 0.6&lt;/h2&gt;
&lt;p&gt;The SunPy-affiliated aiapy package, which provides tools for working with SDO/AIA data and is maintained by the AIA instrument team, has a new 0.6 release which includes support for sunpy core 3.1.
In addition to a number of bug fixes, v0.6 also includes the ability to calculate uncertainties on AIA images via the &lt;a class="reference external" href="https://aiapy.readthedocs.io/en/stable/api/aiapy.calibrate.estimate_error.html#aiapy.calibrate.estimate_error" title="(in aiapy v0.12.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;estimate_error&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function.
A complete list of changes is available &lt;a class="reference external" href="https://aiapy.readthedocs.io/en/stable/whatsnew/changelog.html"&gt;in the changelog&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2021/2021-10-29_sunpy_31_ndcube_20/"/>
    <summary>Today we have a quadruple release announcement for you!
It’s been a very busy week in SunPy land getting both the core and ndcube releases over the line; I hope you enjoy them!</summary>
    <category term="sunpy" label="sunpy"/>
    <published>2021-10-29T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2020/2020-06-12-20_released/</id>
    <title>SunPy 2.0 Released</title>
    <updated>2020-06-12T00:00:00+00:00</updated>
    <author>
      <name>Stuart Mumford</name>
    </author>
    <content type="html">&lt;section id="sunpy-2-0-released"&gt;

&lt;p&gt;The SunPy project is happy to announce the release of SunPy 2.0!
SunPy is an open-source Python library for Solar Physics data analysis and visualization.&lt;/p&gt;
&lt;p&gt;This release is our second long(er) term support release, that we will be supporting with bug fixes until 3.0 in roughly a year’s time.
With this release, the 1.0 and 1.1 releases will no longer receive bug fixes and we encourage everyone to upgrade to 2.0.&lt;/p&gt;
&lt;p&gt;The major highlights of this release are:&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/api/sunpy.net.Fido.html#sunpy.net.Fido" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;Fido&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now supports tab completion of search attributes.
This allows you to do &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;a.Instrument.AIA&lt;/span&gt;&lt;/code&gt;, and print &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;a.Instrument&lt;/span&gt;&lt;/code&gt; to see the list of known supported instruments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;aiaprep&lt;/span&gt;&lt;/code&gt; has been deprecated in favor of the functionality in the &lt;a class="reference external" href="https://aiapy.readthedocs.io/en/stable/"&gt;aiapy&lt;/a&gt; package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Various fixes and clarifications to pixel indexing in the &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/map.html#module-sunpy.map" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.map&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; subpackage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standardization of specifying rectangles in coordinate space in the &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/api/sunpy.map.GenericMap.html#sunpy.map.GenericMap.submap" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;submap()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;draw_rectangle()&lt;/span&gt;&lt;/code&gt; methods of &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/api/sunpy.map.GenericMap.html#sunpy.map.GenericMap" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;GenericMap&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HTML quicklook previews of &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/api/sunpy.map.GenericMap.html#sunpy.map.GenericMap" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;GenericMap&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/api/sunpy.map.MapSequence.html#sunpy.map.MapSequence" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;MapSequence&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; instances are available with the new &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/api/sunpy.map.GenericMap.html#sunpy.map.GenericMap.quicklook" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;quicklook()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/generated/api/sunpy.map.MapSequence.html#sunpy.map.MapSequence.quicklook" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;quicklook()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; methods, respectively.
This is also the default display in &lt;a class="reference external" href="https://jupyter.org/"&gt;Jupyter&lt;/a&gt; notebooks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration of differential rotation into the &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/coordinates/index.html#module-sunpy.coordinates" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.coordinates&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; framework.
This enables, amongst other things, the warping of images with the &lt;a class="reference external" href="https://reproject.readthedocs.io/"&gt;reproject&lt;/a&gt; package and the plotting of rotated grid lines with &lt;a class="reference external" href="https://docs.astropy.org/en/stable/visualization/wcsaxes/index.html#wcsaxes" title="(in Astropy v7.2)"&gt;&lt;span class="xref std std-ref"&gt;WCSAxes&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/whatsnew/2.0.html"&gt;What’s New in SunPy 2.0&lt;/a&gt; for more details and the &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/whatsnew/changelog.html"&gt;Full Changelog&lt;/a&gt; for the full list of over 100 changes in 2.0.&lt;/p&gt;
&lt;p&gt;This release of SunPy contains 1044 commits in 290 merged pull requests closing 144 issues from 33 people, 16 of which are first-time contributors to SunPy.&lt;/p&gt;
&lt;p&gt;The people who have contributed to the code for this release are:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Abhijeet Manhas  *
Abijith B  *
Albert Y. Shih
Amogh J  *
Arfon Smith  *
Arib Alam  *
David Pérez-Suárez
David Stansby
Deepankar Sharma
Jack Ireland
Jai Ram Rideout
James Paul Mason
Kris Akira Stern  *
Laura Hayes
Lazar Zivadinovic  *
Mark Cheung  *
Monica Bobra
Nabil Freij
Ole Streicher
Pankaj Mishra  *
Raahul Singh
Rajiv Ranjan Singh
Rutuja Surve  *
Sarthak Jain
Sashank Mishra  *
Steven Christe
Stuart Mumford
Swapnil Kannojia  *
Utkarsh Parkhi  *
Will Barnes
abijith-bahuleyan  *
honey  *
mridulpandey  *&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Where a * indicates their first contribution to SunPy.&lt;/p&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2020/2020-06-12-20_released/"/>
    <summary>The SunPy project is happy to announce the release of SunPy 2.0!
SunPy is an open-source Python library for Solar Physics data analysis and visualization.</summary>
    <category term="sunpy" label="sunpy"/>
    <published>2020-06-12T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2020/2020-01-10-11_released/</id>
    <title>SunPy 1.1 Released</title>
    <updated>2020-01-10T00:00:00+00:00</updated>
    <author>
      <name>Stuart Mumford</name>
    </author>
    <content type="html">&lt;section id="sunpy-1-1-released"&gt;

&lt;p&gt;The SunPy project is happy to announce the release of SunPy 1.1!
SunPy is an open-source Python library for Solar Physics data analysis and visualization.&lt;/p&gt;
&lt;p&gt;This release is our first major release post-1.0 and part of our new &lt;a class="reference external" href="https://github.com/sunpy/sunpy-SEP/blob/master/SEP-0009.md"&gt;release pattern&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The major highlights of this release are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/coordinates/index.html#module-sunpy.coordinates" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;coordinates&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; subpackage now supports four additional coordinate frames (HCI, HEE, GSE, and GEI).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A new subpackage &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/data.html#module-sunpy.data.data_manager" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.data.data_manager&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; has been added to support versioned data for functions and methods.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support in &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/map.html#module-sunpy.map" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.map&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/net.html#module-sunpy.net" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.net&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; for the SUVI instrument on GOES satellites.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initial support for WISPR data from Parker Solar Probe in &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/map.html#module-sunpy.map" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.map&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The import times for &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/sunpy.html#module-sunpy" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and some subpackages are significantly shorter, with no loss of functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/whatsnew/1.1.html"&gt;What’s New in SunPy 1.1&lt;/a&gt; for more details and the &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/whatsnew/changelog.html"&gt;Full Changelog&lt;/a&gt; for the full list of over 100 changes in 1.1.&lt;/p&gt;
&lt;p&gt;If you use conda, you can update to this release by running:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ conda install -c conda-forge sunpy
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;or, if you use pip, by running:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install -U sunpy
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you haven’t already installed SunPy we recommend you follow our &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/tutorial/installation.html"&gt;Installation Guide&lt;/a&gt;.&lt;/p&gt;
&lt;section id="by-the-numbers"&gt;
&lt;h2&gt;By the numbers&lt;/h2&gt;
&lt;p&gt;This release of SunPy contains 1137 commits in 242 merged pull requests closing 106 issues from 24 people, 10 of which are first time contributors to SunPy.&lt;/p&gt;
&lt;p&gt;The people who have contributed to the code for this release are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Albert Y. Shih&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arthur Eigenbrot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Brigitta Sipocz&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;David Pérez-Suárez&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;David Stansby&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dominik Stańczak  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Guntbert Reiter  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Himanshu Pathak  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jack Ireland&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Juanjo Bazán  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Laura Hayes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Michael S Kirk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nabil Freij&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quinn Arbolante  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Raahul Singh  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rajiv Ranjan Singh  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Steven Christe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stuart Mumford&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tom Augspurger  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vishnunarayan K I.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Will Barnes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yash Sharma&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;neerajkulk  *&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where a * indicates their first contribution to SunPy.&lt;/p&gt;
&lt;p&gt;Happy Pythoning,&lt;/p&gt;
&lt;p&gt;Stuart&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2020/2020-01-10-11_released/"/>
    <summary>The SunPy project is happy to announce the release of SunPy 1.1!
SunPy is an open-source Python library for Solar Physics data analysis and visualization.</summary>
    <category term="sunpy" label="sunpy"/>
    <published>2020-01-10T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2019/2019-07-01-SunPy-Releasing/</id>
    <title>SunPy Release Schedule and Version Numbering</title>
    <updated>2019-06-27T00:00:00+00:00</updated>
    <author>
      <name>Stuart Mumford</name>
    </author>
    <content type="html">&lt;section id="sunpy-release-schedule-and-version-numbering"&gt;

&lt;p&gt;In this blog post I want to outline how, and more over why, we are going to
number the SunPy releases and when we are going to release them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;; we are going to move to a 6 month release cadence, with a Long Term
Support (one year of support) release in May and a Short Term Support (6 months
of support) in November. We will increment the major version number for each LTS
release.&lt;/p&gt;
&lt;section id="background"&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;As part of the 1.0 release planning the SunPy developers and the board spent a
long time discussing how we want to version SunPy and what we want to use our
versioning a release schedule to achieve. We went through two major iterations
of this plan, the first can be found in the abandoned PR to the SunPy
Enhancement Proposal repository &lt;a class="reference external" href="https://github.com/sunpy/sunpy-SEP/pull/30"&gt;#30&lt;/a&gt;,
and the second one which was accepted in
&lt;a class="reference external" href="https://github.com/sunpy/sunpy-SEP/pull/40"&gt;#40&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="objectives"&gt;
&lt;h2&gt;Objectives&lt;/h2&gt;
&lt;p&gt;In moving SunPy out of the 0.y series of releases we knew that our users would
be expecting us to make breaking changes less, and for them to be able to rely
on SunPy for longer.&lt;/p&gt;
&lt;p&gt;We wanted to balance the desire for people to be able to start using SunPy for a
project and be able to see that project through without having to constantly
adjust to many changes in new releases. On the other hand, we wanted to also
allow the development of SunPy to continue without having to delay people
contributing improvements to SunPy because of a strict versioning scheme.&lt;/p&gt;
&lt;p&gt;We also have to consider that, currently, SunPy core is developed entirely by
volunteers, and supporting old versions of the library is a time consuming and
sometimes thankless job.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="releases"&gt;
&lt;h2&gt;Releases&lt;/h2&gt;
&lt;p&gt;The solution we landed on is to provide a Long Term Support release that we will
support for one year (i.e. until the following LTS release). This gives people
who want stability a release schedule where they get bug fixes for a year. While
also allowing SunPy to do releases on a six month cycle to get new features out
for people to use.&lt;/p&gt;
&lt;p&gt;To make it clear which releases are Long Term Support releases, we will
increment the major version (the first number) for each LTS release. This means
SunPy 1.0 is a LTS release which we will be supporting until the release of 2.0
in May 2020.&lt;/p&gt;
&lt;p&gt;The all the non-LTS releases between the LTS releases will increment the minor
version number, as there is only one release planned between LTS releases the
normal release number will be 1.0, 1.1, 2.0, 2.1 etc.&lt;/p&gt;
&lt;img alt="https://sunpy.org/_images/sunpy-release-schedule.jpg" src="https://sunpy.org/_images/sunpy-release-schedule.jpg" /&gt;
&lt;/section&gt;
&lt;section id="deprecations"&gt;
&lt;h2&gt;Deprecations&lt;/h2&gt;
&lt;p&gt;We still expect, and have plans for, changes to many parts of SunPy. We believe
these changes will enable even more people to find SunPy useful in their work.&lt;/p&gt;
&lt;p&gt;To enable people to prepare for changes and to not be in for big surprises when
updating SunPy we will endeavour to emit a deprecation warning for any
breaking changes for &lt;em&gt;one LTS release&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The upshot of this is that, if now after 1.0, we want to change something in a
backwards incompatible way we would continue to provide both the old and new
ways until after the 2.0 release. The 2.0 release would emit a deprecation
warning, to give people who go from LTS to LTS a year to update their code
before the next LTS.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope this blog post gives you some insight into how we made this decision and
why, if you have any comments please don’t hesitate to get in touch using any of
the usual ways.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2019/2019-07-01-SunPy-Releasing/"/>
    <summary>In this blog post I want to outline how, and more over why, we are going to
number the SunPy releases and when we are going to release them.</summary>
    <category term="sunpy" label="sunpy"/>
    <published>2019-06-27T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2019/2019-06-01-10_released/</id>
    <title>SunPy 1.0 Released</title>
    <updated>2019-06-01T00:00:00+00:00</updated>
    <author>
      <name>Stuart Mumford</name>
    </author>
    <content type="html">&lt;section id="sunpy-1-0-released"&gt;

&lt;p&gt;The SunPy project is happy to announce the release of SunPy 1.0.0!&lt;/p&gt;
&lt;p&gt;This release has been in development for 14 months, and is a large change from the 0.x series of SunPy releases with a lot of old functionality removed and some exciting new features.&lt;/p&gt;
&lt;p&gt;The major highlights of this release are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A complete transition of the whole code base to use &lt;a class="reference external" href="https://docs.astropy.org/en/stable/api/astropy.time.Time.html#astropy.time.Time" title="(in Astropy v7.2)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;astropy.time.Time&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which was implemented by Vishnunarayan K I as part of Google Summer of Code 2018.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A rewrite of how all the clients in &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/reference/net.html#module-sunpy.net" title="(in sunpy v4.13.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.net&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; download files from the internet. This means vastly improved progress bars, skipping downloads if files are present, and better visibility and retrying of download errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A rewrite of the differential rotation and image warping code to correctly account for observer location using the Astropy coordinate functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removal of many deprecated functions and submodules; we have used the 1.0 release as a chance to clean out SunPy reducing the number of lines of Python code in the project by almost 3,000!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The first release of SunPy to be Python 3 only, requiring Python 3.6+.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/whatsnew/1.0.html"&gt;What’s New in SunPy 1.0&lt;/a&gt; for more details and the &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/whatsnew/changelog.html"&gt;Full Changelog&lt;/a&gt; for the full list of over 150 changes in SunPy 1.0.&lt;/p&gt;
&lt;p&gt;This release includes many breaking changes and may require your code to be updated to support it.
We hope you see the value in having the extra features these changes have enabled and a code base that is easier to maintain.
We will be continuing to release bug fixes to the 0.9.z series until the end of 2019.
We hope this gives you enough time to update your code and start enjoying all the improvements in SunPy 1.0.&lt;/p&gt;
&lt;p&gt;If you use conda, you can update to this release by running:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ conda install -c conda-forge sunpy
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;or, if you use pip, by running:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install -U sunpy
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you haven’t already installed SunPy we recommend you follow our &lt;a class="reference external" href="https://docs.sunpy.org/en/stable/tutorial/installation.html"&gt;Installation Guide&lt;/a&gt;.&lt;/p&gt;
&lt;section id="by-the-numbers"&gt;
&lt;h2&gt;By the numbers&lt;/h2&gt;
&lt;p&gt;This release of SunPy contains 1913 commits in 332 merged pull requests closing 582 issues from 46 people, 25 of which are first time contributors to SunPy.&lt;/p&gt;
&lt;p&gt;The people who have contributed to the code for this release are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Abhigyan Bose  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Airmansmith97  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Albert Y. Shih&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Andre Chicrala  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Andrew Hill  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Andrew Inglis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Andrew Leonard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arthur Eigenbrot  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bernhard M. Wiedemann  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Brandon Stone  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Brigitta Sipocz&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Daniel D’Avella&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Daniel Ryan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;David Pérez-Suárez&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;David Stansby&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deepankar Sharma  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Emmanuel Arias  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Harsh Mathur  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jack Ireland&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jacob  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jai Ram Rideout  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Larry Manley&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Laura Hayes  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manas Mangaonkar  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Matthew Mendero  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Md Akramul Haque  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Michael S Kirk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mickaël Schoentgen  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monica Bobra  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nabil Freij&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Naman9639  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prateek Chanda&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Punyaslok Pattnaik&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reid Gomillion  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sarthak Jain  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shane Maloney&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shresth Verma&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sourav Ghosh  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Steven Christe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stuart Mumford&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vishnunarayan K I.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Will Barnes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yash Jain&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yash Krishan  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yash Sharma  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;jamescalixto  *&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where a * indicates their first contribution to SunPy.&lt;/p&gt;
&lt;p&gt;On a personal note, I am very excited to see SunPy reach this milestone; watching the community around this project grow since I got involved has been incredible.
The sunpy library is almost unrecognisable from where it was when I got involved shortly after the 0.2 release, which is the result of countless hours of work by over 100 people.
I want to thank everyone who has contributed to SunPy in any way that helped us get to the point where we felt the library deserved the 1.0 label.
I especially want to thank Nabil Freij who has done so much behind the scenes work to keep things moving forward, and done such a good job helping new contributors get pull requests into SunPy.&lt;/p&gt;
&lt;p&gt;I am very excited to see where SunPy goes next.&lt;/p&gt;
&lt;p&gt;Happy Pythoning,&lt;/p&gt;
&lt;p&gt;Stuart&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2019/2019-06-01-10_released/"/>
    <summary>The SunPy project is happy to announce the release of SunPy 1.0.0!</summary>
    <category term="sunpy" label="sunpy"/>
    <published>2019-06-01T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2018/2018-04-24_09_release/</id>
    <title>SunPy 0.9 Released</title>
    <updated>2018-04-24T00:00:00+00:00</updated>
    <author>
      <name>Stuart Mumford</name>
    </author>
    <content type="html">&lt;section id="sunpy-0-9-released"&gt;

&lt;p&gt;The SunPy project is very happy to announce the release of SunPy 0.9, the latest
release of the SunPy core package.&lt;/p&gt;
&lt;p&gt;SunPy 0.9 brings improved support for downloading data from the JSOC and
bugfixes compared to the 0.8.x series of releases. The 0.9.x series will be the
last series of SunPy releases to support Python 2. This is because Python 2
will not be maintained after 2019. The 0.9.x
series will receive bugfixs only up until the and of life of Python 2 (around 18
months). No new functionality will be added to the 0.9.x series, which will also
be the last version to include &lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.spectra&lt;/span&gt;&lt;/code&gt;, &lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.lightcurve&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.wcs&lt;/span&gt;&lt;/code&gt;, all of which were deprecated in 0.8.&lt;/p&gt;
&lt;p&gt;SunPy 1.0 and higher will support Python 3 only. All new
functionality will be available only in SunPy 1.0 and higher.&lt;/p&gt;
&lt;p&gt;SunPy v0.9.0 contains 807 commits in 147 merged pull requests closing 310
issues from 31 people, 19 of which are first time contributors to SunPy.&lt;/p&gt;
&lt;p&gt;The people who have contributed to the code for this release are&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Nabil Freij&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stuart Mumford&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nitin Choudhary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;David Stansby  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prateek Chanda&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jack Ireland&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Daniel Ryan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Himanshu  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yash Jain  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;James Paul Mason  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Michael Charlton&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vishnunarayan K I.  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Swapnil Sharma  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Albert Y. Shih&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;David Pérez-Suárez&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shresth Verma  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sanjeev Dubey  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Brigitta Sipocz&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Andrew Leonard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nick Murphy  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shane Maloney&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Carlos Molina  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yash Kothari  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dang Trung Kien  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gulshan Mittal  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rajasekhar Reddy Mekala  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S Shashank  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tannmay Yadav  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Will Barnes  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yudhik Agrawal  *&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;codetriage-readme-bot  *&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where a * indicates their first contribution to SunPy.&lt;/p&gt;
&lt;p&gt;In addition to the contributions to the core SunPy library, we would like to
thank Kolja Glogowski for his help with the JSOC project, and welcome his
package ‘drms’ as a SunPy affiliated package, which is now powering our JSOC
client.  Finally, we would like to thank David Pérez-Suárez and Brigitta Sipocz,
who are leading the GSOC process for OpenAstronomy, which is of massive benefit
to the SunPy community.&lt;/p&gt;
&lt;p&gt;SunPy 0.9 can be installed from pip or conda using the following commands&lt;/p&gt;
&lt;p&gt;using conda:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ conda config channels --append conda-forge
$ conda install sunpy
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;or using pip:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install sunpy
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and updated using conda:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ conda update sunpy
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;or pip:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install -U sunpy
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2018/2018-04-24_09_release/"/>
    <summary>The SunPy project is very happy to announce the release of SunPy 0.9, the latest
release of the SunPy core package.</summary>
    <category term="sunpy" label="sunpy"/>
    <published>2018-04-24T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://sunpy.org/posts/2018/2018-02-25-ndcube/</id>
    <title>NDCube 1.0 Released</title>
    <updated>2018-02-25T00:00:00+00:00</updated>
    <author>
      <name>Stuart Mumford</name>
    </author>
    <content type="html">&lt;section id="ndcube-1-0-released"&gt;

&lt;p&gt;The SunPy project is very happy to announce the release of a new package “ndcube”.&lt;/p&gt;
&lt;p&gt;ndcube is a package built for handling, inspecting and visualizing a wide
variety of data, of any number of dimensions, along with coordinate information
described by FITS-WCS. The &lt;a class="reference external" href="https://docs.sunpy.org/projects/ndcube/en/stable/api/ndcube.NDCube.html#ndcube.NDCube" title="(in ndcube v2.4.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;NDCube&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; object is based on the astropy
&lt;a class="reference external" href="https://docs.astropy.org/en/stable/api/astropy.nddata.NDData.html#astropy.nddata.NDData" title="(in Astropy v7.2)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;NDData&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; class, and adds functionality for slicing both the data
and the WCS simultaneously, plotting with matplotlib and support for extra
coordinate information along any of the axes not described by WCS.&lt;/p&gt;
&lt;p&gt;In addition to this the ndcube package provides the &lt;a class="reference external" href="https://docs.sunpy.org/projects/ndcube/en/stable/api/ndcube.NDCubeSequence.html#ndcube.NDCubeSequence" title="(in ndcube v2.4.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;NDCubeSequence&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
class for representing sequences of &lt;a class="reference external" href="https://docs.sunpy.org/projects/ndcube/en/stable/api/ndcube.NDCube.html#ndcube.NDCube" title="(in ndcube v2.4.0)"&gt;&lt;code class="xref py py-obj docutils literal notranslate"&gt;&lt;span class="pre"&gt;NDCube&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; objects where the
coordinate information may or may not align, and accessing these sequences in a
way consistent with a singular cube.&lt;/p&gt;
&lt;p&gt;The ndcube development has been lead by Daniel Ryan with contributions from the
following people:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Daniel Ryan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ankit Baruah&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stuart Mumford&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mateo Inchaurrandieta&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nabil Freij&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drew Leonard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shelbe Timothy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A lot of the design and development of ndcube was done as part of Ankit’s Google
Summer of Code project in the summer of 2017.&lt;/p&gt;
&lt;p&gt;For more information about ndcube see the &lt;a class="reference external" href="https://docs.sunpy.org/projects/ndcube/en/stable/"&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;ndcube can be installed from pip or conda using the following commands:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ conda install -c conda-forge ndcube

$ pip install ndcube
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2018/2018-02-25-ndcube/"/>
    <summary>The SunPy project is very happy to announce the release of a new package “ndcube”.</summary>
    <category term="ndcube" label="ndcube"/>
    <category term="sunpy" label="sunpy"/>
    <published>2018-02-25T00:00:00+00:00</published>
  </entry>
</feed>
