Data Corrections
For the calculation of independent RV's, we used the three main HMI data products: Dopplergrams, Intensitygrams, Magnetograms. These data products must be corrected for inherent issues such as relative velocityn between the spacecraft and Sun, limb-darkening, and foreshortening.
Velocity Corrections
Dopplergrams are maps of solar surface velocity that must be corrected for the relative spacecraft velocity, and the velocity due to solar rotation.
Spacecraft Velocity Correction:
v_{sc, ij} = - \frac{\delta w_{ij} v_{sc, w_{ij}} + \delta n_{ij} v_{sc, n{ij}} + \delta r_{ij} v_{sc, r_{ij}}}{d_{ij}}
where d_{ij} = \sqrt{\delta w_{ij} ^ 2 + \delta n_{ij} ^ 2 + \delta r_{ij} ^ 2 }.
def spacecraft_vel(deltaw, deltan, deltar, dij, vmap):
"""
function to calculate pixel-wise spacecraft velocities for Sunpy map
Parameters
----------
deltaw: relative westward position of pixel
deltan: relative northward position of pixel
deltar: relative radial position of pixel
dij: distance between pixel ij and spacecraft
vmap: Sunpy map object (Dopplergram)
Returns
-------
vsc: array of spacecraft velocities
"""
# velocity of spacecraft relative to sun
vscw = vmap.meta['obs_vw']
vscn = vmap.meta['obs_vn']
vscr = vmap.meta['obs_vr']
# pixel-wise magnitude of spacecraft velocity
vsc = - (deltaw * vscw + deltan * vscn + deltar * vscr) / dij
return vsc
Solar Rotational Velocity:
We calculate the solar differential rotation profile based on Snodgrass & Ulrich (1990).
\omega(\theta) = \alpha_1 + \alpha_2 sin^2{\theta} + \alpha_3 sin^4{\theta}
\theta is latitude and the \alpha values are 14.713, -2.396, -1.787 respectively.
def solar_rot_vel(wij, nij, rij, deltaw, deltan, deltar, dij, vmap, a_parameters=[14.713, -2.396, -1.787]):
"""
function to calculate pixel-wise velocities due to solar rotation
Parameters
----------
wij: array of westward values for image
nij: array of northward values for image
rij: array of radius values for image
deltaw: relative westward position of pixel
deltan: relative northward position of pixel
deltar: relative radial position of pixel
dij: distance between pixel ij and spacecraft
vmap: Sunpy map object (Dopplergram)
a_parameters: array of solar differential rotation parameters from Snodgrass & Ulrich (1990).
Returns
-------
vrot: array of solar rotation velocities
"""
# apply to cartesian coordinates
x1 = wij
y1 = nij * np.cos(np.deg2rad(vmap.meta['crlt_obs'])) + rij * np.sin(np.deg2rad(vmap.meta['crlt_obs']))
z1 = - nij * np.sin(np.deg2rad(vmap.meta['crlt_obs'])) + rij * np.cos(np.deg2rad(vmap.meta['crlt_obs']))
hx = x1 * np.cos(np.deg2rad(vmap.meta['crln_obs'])) + z1 * np.sin(np.deg2rad(vmap.meta['crln_obs']))
hy = y1
hz = -x1 * np.sin(np.deg2rad(vmap.meta['crln_obs'])) + z1 * np.cos(np.deg2rad(vmap.meta['crln_obs']))
# apply parameters to determine vrot for given image pixel
w = (a_parameters[0] + a_parameters[1] * ((np.sin(hy)) ** 2) + a_parameters[2] * (
(np.sin(hy)) ** 4)) * 1. / 86400. * np.pi / 180.
# get projection of solar rotation
vx_rot = w * hz * vmap.meta['rsun_ref']
vy_rot = 0.
vz_rot = -w * hx * vmap.meta['rsun_ref']
v1 = np.cos(np.deg2rad(vmap.meta['crln_obs'])) * vx_rot - np.sin(np.deg2rad(vmap.meta['crln_obs'])) * vz_rot
v2 = vy_rot
v3 = np.sin(np.deg2rad(vmap.meta['crln_obs'])) * vx_rot + np.cos(np.deg2rad(vmap.meta['crln_obs'])) * vz_rot
# project into correct direction
vrotw = v1
vrotn = v2 * np.cos(np.deg2rad(vmap.meta['crlt_obs'])) - v3 * np.sin(np.deg2rad(vmap.meta['crlt_obs']))
vrotr = v2 * np.sin(np.deg2rad(vmap.meta['crlt_obs'])) + v3 * np.cos(np.deg2rad(vmap.meta['crlt_obs']))
# get full rotational velocity
vrot = (deltaw * vrotw + deltan * vrotn + deltar * vrotr) / dij
return vrot
Intensity Corrections
Intensitygrams are continuum filtergrams that need to be corrected for limb-darkening. We account for limb-darkening and flatten the continuum using the limb-darkening polynomial calculated in Allen's Astrophysical Quantities (1993).
L_{ij} = 1 - u_2 - v_2 + u_2 cos \theta + v_2 cos^2 \theta
The functions for limb-darkening corrections can be found here.
Magnetic Field Corrections
Magnetograms (line-of-sight longitudinal magnetic field maps) are used to determine magnetic observables that show strong correlation with RV variation and velocity components. Due to foreshortening, the observed magnetic field (magnetogram data) is less than the true radial field by a factor of \mu = cos(\theta).
We correct for this as seen here:
B_{r, ij} = B{obs, ij} / \mu_{ij}.
Additionally, we set all magnetic pixels with magnitude lower than the noise level (8G) to 0.