Registering and aligning level 1 data#

This example demonstrates how to convert AIA images to a common pointing, rescale them to a common plate scale, and remove the roll angle. This process is often referred to as “aia_prep” and the resulting data are typically referred to as level 1.5 data. In this example, we will demonstrate how to do this with aiapy. This corresponds to the aia_prep.pro procedure as described in the SDO Analysis Guide.

import matplotlib.pyplot as plt
import sunpy.map

import aiapy.data.sample as sample_data
from aiapy.calibrate import register, update_pointing

Performing multi-wavelength analysis on level 1 data can be problematic as each of the AIA channels have slightly different spatial scales and roll angles. Furthermore, the estimates of the pointing keywords (CDELT1, CDELT2, CRPIX1, CRPIX2, CROTA2) may have been improved due to limb fitting procedures after the level 1 file has been created. The Joint Science Operations Center (JSOC) stores AIA image data and metadata separately; when users download AIA data, these two data types are combined to produce a FITS file. While metadata are continuously updated at the JSOC, previously downloaded FITS files will not contain the most recent information.

Thus, before performing any multi-wavelength analyses, level 1 data should be updated to the most recent and accurate pointing and interpolated to a common grid in which the y-axis of the image is aligned with solar North.

First, let’s read a level 1 94 Å AIA image from the aiapy sample data into a Map object.

The first step in this process is to update the metadata of the map to the most recent pointing using the aiapy.calibrate.update_pointing function. This function queries the JSOC for the most recent pointing information, updates the metadata, and returns a sunpy.map.Map with updated metadata.

aia_map_updated_pointing = update_pointing(aia_map)

If we take a look at the plate scale and rotation matrix of the map, we find that the scale is slightly off from the expected value of \(0.6''\) per pixel and that the rotation matrix has off-diagonal entries.

SpatialPair(axis1=<Quantity 0.600109 arcsec / pix>, axis2=<Quantity 0.600109 arcsec / pix>)
[[ 0.99999712  0.0024018 ]
 [-0.0024018   0.99999712]]

We can use the aiapy.calibrate.register function to scale the image to the \(0.6''\) per pixel and derotate the image such that the y-axis is aligned with solar North.

If we look again at the plate scale and rotation matrix, we should find that the plate scale in each direction is \(0.6''\) per pixel and that the rotation matrix is diagonalized. The image in aia_map_registered is now a level 1.5 data product.

SpatialPair(axis1=<Quantity 0.6 arcsec / pix>, axis2=<Quantity 0.6 arcsec / pix>)
[[ 1.00000000e+00 -2.84766725e-20]
 [-4.62157541e-19  1.00000000e+00]]

Finally, we can plot the exposure-normalized map. Note that small negative pixel values are possible because CCD images were taken with a pedestal set at ~100 DN. This pedestal is then subtracted when the JSOC pipeline performs dark (+ pedestal) subtraction and flat fielding to generate level 1 files.

AIA $94 \; \mathrm{\mathring{A}}$ 2019-01-01 00:00:11

Total running time of the script: (0 minutes 6.495 seconds)

Gallery generated by Sphinx-Gallery