Make ACE SWEPAM behave like OMNI Data

NASA OMNI data (also available from pysatNASA) is the place to go for solar wind (SW) parameters. However, this data set is not available in real time. Fortunately, we can use the OMNI processing to normalize the ACE SWEPAM SW proton density and ion temperature. This is performed using the pysatSpaceWeather.instruments.methods.ace.ace_swepam_hourly_omni_norm() function. The example below uses historic ACE SWEPAM data so that we can compare the results to OMNI.

import datetime as dt
import matplotlib as mpl
import matplotlib.pyplot as plt

import pysat
import pysatSpaceWeather as py_sw
from pysatNASA.instruments import omni_hro

ace = pysat.Instrument(inst_module=py_sw.instruments.ace_swepam,
                       tag='historic', update_files=True)
omni = pysat.Instrument(inst_module=omni_hro, tag='1min', update_files=True)

# Add the OMNI conversion routine to the ACE instrument
ace.custom_attach(py_sw.instruments.methods.ace.ace_swepam_hourly_omni_norm)

# Pick a day with a geomagnetic storm
stime = dt.datetime(2014, 3, 26)

# If needed, download the data
if stime not in ace.files.files.index:
    ace.download(start=stime)

if stime not in omni.files.files.index:
    omni.download(start=stime)

# Load the data
ace.load(date=stime)
omni.load(date=stime)

print(ace.variables)

This should yield Index(['jd', 'sec', 'status', 'sw_proton_dens', 'sw_bulk_speed', 'sw_ion_temp', 'sw_proton_dens_norm', 'sw_ion_temp_norm'], dtype='object'). The variables with the 'norm' suffix were added by the conversion function. Now, let’s plot the two data sets together.

fig = plt.figure()
fig.suptitle("L1 ACE and L2 OMNI HRO data for {:}".format(stime.date()))
ax_dens = fig.add_subplot(211)
ax_temp = fig.add_subplot(212)

ax_dens.plot(ace.index, ace['sw_proton_dens_norm'], 'k-', label='ACE')
ax_dens.plot(omni.index, omni['proton_density'], 'b-', label='OMNI')
ax_temp.plot(ace.index, ace['sw_ion_temp_norm'], 'k-', label='ACE')
ax_temp.plot(omni.index, omni['T'], 'b-', label='OMNI')
ax_temp.set_yscale('log')
ax_dens.xaxis.set_major_formatter(mpl.dates.DateFormatter(''))
ax_temp.xaxis.set_major_formatter(mpl.dates.DateFormatter('%H:%M'))
ax_dens.set_xlim(stime, stime + dt.timedelta(days=1))
ax_temp.set_xlim(stime, stime + dt.timedelta(days=1))
ax_temp.set_xlabel('Universal Time (HH:MM)')
ax_dens.set_ylabel(r'SW N$_p$ ({:s})'.format(omni.meta['proton_density',
                                                       'units']))
ax_temp.set_ylabel(r'SW T$_i$ ({:s})'.format(omni.meta['T', 'units']))
ax_dens.legend(loc=1, fontsize='medium', ncol=2)

# If not running in interactive mode
plt.show()

This figure shows that the temperature adjustment agrees relatively well, but that the proton density has a large offset. This descrepency can be attributed to the data source. The pysatSpaceWeather.instruments.ace_swepam module uses L1 data, while OMNI uses L2 data that has undergone additional processing. For this time period most of the temperature data is of high quality in the L2 data, but all the proton density data is flagged for removal. The ACE L2 data is accessible through CDAWeb or the ACE database.

../_images/ex_ace_omni.png