EEFxTMS_2F (Equatorial electric field)

Abstract: Access to the equatorial electric field (level 2 product).

%load_ext watermark
%watermark -i -v -p viresclient,pandas,xarray,matplotlib
Python implementation: CPython
Python version       : 3.9.7
IPython version      : 8.0.1

viresclient: 0.10.3
pandas     : 1.4.1
xarray     : 0.21.1
matplotlib : 3.5.1
from viresclient import SwarmRequest
import datetime as dt
import numpy as np
import matplotlib.pyplot as plt

request = SwarmRequest()

EEFxTMS_2F product information

Dayside equatorial electric field, sampled at every dayside equator crossing +- 20mins

Documentation:

Check what “EEF” data variables are available

request.available_collections("EEF", details=False)
{'EEF': ['SW_OPER_EEFATMS_2F', 'SW_OPER_EEFBTMS_2F', 'SW_OPER_EEFCTMS_2F']}
request.available_measurements("EEF")
['EEF', 'EEJ', 'RelErr', 'Flags']

Fetch all the EEF and EEJ values from Bravo during 2016

request.set_collection("SW_OPER_EEFBTMS_2F")
request.set_products(measurements=["EEF", "EEJ", "Flags"])
data = request.get_between(
    dt.datetime(2016,1,1),
    dt.datetime(2017,1,1)
)
# The first three and last three source (daily) files
data.sources[:3], data.sources[-3:]
(['SW_OPER_EEFBTMS_2F_20160101T000000_20160101T235959_0204',
  'SW_OPER_EEFBTMS_2F_20160102T000000_20160102T235959_0204',
  'SW_OPER_EEFBTMS_2F_20160103T000000_20160103T235959_0204'],
 ['SW_OPER_EEFBTMS_2F_20161229T000000_20161229T235959_0204',
  'SW_OPER_EEFBTMS_2F_20161230T000000_20161230T235959_0204',
  'SW_OPER_EEFBTMS_2F_20161231T000000_20161231T235959_0204'])
df = data.as_dataframe()
df.head()
Latitude Longitude EEJ Spacecraft Flags EEF
Timestamp
2016-01-01 00:52:23.367156224 7.290433 113.754512 [-74.57382146246935, -59.68097319571396, -45.1... B 0 -0.444208
2016-01-01 02:27:06.243671808 7.577520 89.980167 [-45.59157503892487, -40.731539994601945, -35.... B 0 -0.229135
2016-01-01 04:02:03.629109504 6.948012 66.182831 [-20.43764232681452, -17.612771036713497, -14.... B 0 -0.168648
2016-01-01 05:36:43.555203072 7.422034 42.413424 [-1.0670899767171982, -0.5372306288060009, -0.... B 0 -0.185324
2016-01-01 07:10:49.341007616 10.052089 18.699167 [0.35033186716203196, 1.2002997481508415, 2.04... B 0 -0.072291
ax = df.plot(y="EEF", figsize=(20,10))
ax.set_ylim((-2, 2));
ax.set_ylabel("EEF [mV/m]");
../_images/03f__Demo-EEFxTMS_2F_11_0.png

Take a look at the time jumps between entries… Nominally the product should produce one measurement “every dayside equator crossing ±20 minutes”

times = df.index
delta_t_minutes = [t.seconds/60 for t in np.diff(times.to_pydatetime())]
print("Range of time gaps (in minutes) between successive measurements:")
np.unique(np.sort(delta_t_minutes))
Range of time gaps (in minutes) between successive measurements:
array([  46.3       ,   46.4       ,   91.48333333,   91.5       ,
         91.51666667,   91.53333333,   91.55      ,   91.56666667,
         91.58333333,   91.6       ,   91.61666667,   91.63333333,
         91.65      ,   91.66666667,   91.68333333,   91.7       ,
         91.71666667,   91.73333333,   91.75      ,   91.76666667,
         91.78333333,   91.8       ,   91.81666667,   91.83333333,
         91.85      ,   91.86666667,   91.88333333,   91.9       ,
         91.91666667,   91.93333333,   91.95      ,   91.96666667,
         91.98333333,   92.        ,   92.01666667,   92.03333333,
         92.05      ,   92.06666667,   92.08333333,   92.1       ,
         92.11666667,   92.13333333,   92.15      ,   92.16666667,
         92.18333333,   92.2       ,   92.21666667,   92.23333333,
         92.25      ,   92.26666667,   92.28333333,   92.3       ,
         92.31666667,   92.33333333,   92.35      ,   92.36666667,
         92.38333333,   92.4       ,   92.41666667,   92.43333333,
         92.45      ,   92.46666667,   92.48333333,   92.5       ,
         92.51666667,   92.53333333,   92.55      ,   92.56666667,
         92.58333333,   92.6       ,   92.61666667,   92.63333333,
         92.65      ,   92.66666667,   92.68333333,   92.7       ,
         92.71666667,   92.73333333,   92.75      ,   92.76666667,
         92.78333333,   92.8       ,   92.81666667,   92.83333333,
         92.85      ,   92.86666667,   92.9       ,   92.91666667,
         92.95      ,   92.96666667,   92.98333333,   93.        ,
         93.01666667,   93.03333333,   93.05      ,   93.06666667,
         93.08333333,   93.1       ,   93.11666667,   93.15      ,
         93.18333333,   93.2       ,   93.21666667,   93.23333333,
         93.25      ,   93.26666667,   93.28333333,   93.3       ,
         93.33333333,   93.35      ,   93.36666667,   93.38333333,
         93.4       ,   93.41666667,   93.43333333,   93.45      ,
         93.46666667,   93.48333333,   93.5       ,   93.51666667,
         93.53333333,   93.55      ,   93.56666667,   93.58333333,
         93.6       ,   93.61666667,   93.63333333,   93.65      ,
         93.66666667,   93.68333333,   93.7       ,   93.71666667,
         93.73333333,   93.75      ,   93.76666667,   93.78333333,
         93.8       ,   93.81666667,   93.83333333,   93.85      ,
         93.86666667,   93.88333333,   93.9       ,   93.91666667,
         93.93333333,   93.95      ,   93.96666667,   93.98333333,
         94.        ,   94.01666667,   94.03333333,   94.05      ,
         94.06666667,   94.08333333,   94.1       ,   94.11666667,
         94.13333333,   94.15      ,   94.16666667,   94.18333333,
         94.2       ,   94.21666667,   94.23333333,   94.25      ,
         94.26666667,   94.28333333,   94.3       ,   94.31666667,
         94.33333333,   94.35      ,   94.36666667,   94.38333333,
         94.4       ,   94.41666667,   94.43333333,   94.45      ,
         94.46666667,   94.48333333,   94.5       ,   94.51666667,
         94.53333333,   94.55      ,   94.56666667,   94.58333333,
         94.6       ,   94.61666667,   94.63333333,   94.65      ,
         94.66666667,   94.68333333,   94.7       ,   94.71666667,
         94.73333333,   94.75      ,   94.76666667,   94.78333333,
         94.8       ,   94.81666667,   94.83333333,   94.85      ,
         94.86666667,   94.88333333,   94.9       ,   94.91666667,
         94.93333333,   94.95      ,   94.96666667,   94.98333333,
         95.        ,   95.01666667,   95.03333333,   95.05      ,
         95.06666667,   95.08333333,   95.1       ,   95.11666667,
         95.13333333,   95.15      ,   95.16666667,   95.18333333,
         95.2       ,   95.21666667,   95.23333333,   95.25      ,
         95.26666667,   95.28333333,   95.3       ,   95.31666667,
         95.33333333,   95.35      ,   95.36666667,   95.38333333,
         95.4       ,   95.41666667,   95.43333333,   95.45      ,
         95.46666667,   95.48333333,   95.5       ,   95.51666667,
         95.53333333,   95.55      ,   95.56666667,   95.58333333,
         95.6       ,   95.61666667,   95.63333333,   95.65      ,
         95.66666667,   95.68333333,   95.7       ,   95.71666667,
         95.73333333,   95.75      ,   95.76666667,   95.78333333,
         95.8       ,   95.81666667,   95.83333333,   95.85      ,
         95.86666667,   95.88333333,   95.9       ,   95.91666667,
         95.93333333,   95.95      ,   95.96666667,   95.98333333,
         96.        ,   96.05      ,   96.08333333,   96.1       ,
         96.11666667,   96.13333333,   96.15      ,   96.16666667,
         96.18333333,   96.2       ,   96.21666667,   96.23333333,
         96.25      ,   96.26666667,   96.28333333,   96.3       ,
         96.31666667,   96.35      ,   96.38333333,   96.4       ,
         96.41666667,   96.48333333,   96.5       ,   96.51666667,
         96.55      ,   96.56666667,   96.58333333,   96.6       ,
         96.61666667,   96.63333333,   96.65      ,   96.66666667,
         96.68333333,   96.7       ,   96.71666667,   96.73333333,
         96.75      ,   96.76666667,   96.8       ,   96.81666667,
         96.83333333,   96.85      ,   96.86666667,   96.88333333,
         96.9       ,   96.91666667,   96.93333333,   96.95      ,
         96.96666667,   96.98333333,   97.        ,   97.01666667,
         97.06666667,   97.08333333,   97.1       ,   97.11666667,
         97.13333333,   97.15      ,   97.16666667,   97.2       ,
         97.21666667,   97.23333333,   97.25      ,   97.26666667,
         97.28333333,   97.3       ,   97.31666667,   97.33333333,
         97.35      ,   97.36666667,   97.38333333,   97.41666667,
         97.46666667,   97.48333333,   97.5       ,   97.51666667,
         97.53333333,   97.55      ,   97.56666667,   97.58333333,
         97.6       ,   97.61666667,   97.63333333,   97.65      ,
         97.66666667,   97.7       ,   97.73333333,   97.76666667,
         97.78333333,   97.8       ,   97.81666667,   97.83333333,
         97.85      ,   97.86666667,   97.88333333,   97.9       ,
         97.91666667,   97.93333333,   97.96666667,   97.98333333,
         98.        ,   98.01666667,   98.03333333,   98.05      ,
         98.06666667,   98.08333333,   98.1       ,   98.11666667,
        145.23333333,  187.48333333,  187.51666667,  187.56666667,
        187.61666667,  187.68333333,  187.76666667,  187.83333333,
        188.11666667,  188.46666667,  188.83333333,  189.46666667,
        189.48333333,  189.55      ,  189.58333333,  189.61666667,
        189.68333333,  189.93333333,  190.3       ,  190.68333333,
        190.76666667,  191.18333333,  191.2       ,  191.21666667,
        191.26666667,  191.28333333,  191.33333333,  191.36666667,
        191.38333333,  191.45      ,  191.48333333,  191.58333333,
       1421.48333333])

Access the EEJ estimate via xarray instead of pandas

Since the EEJ estimate has both time and latitude dimensions, it is not suited to pandas. Here we load the data as a xarray.Dataset which better handles n-dimensional data.

ds = data.as_xarray()
ds
<xarray.Dataset>
Dimensions:     (Timestamp: 5508, EEJ_QDLat: 81)
Coordinates:
  * Timestamp   (Timestamp) datetime64[ns] 2016-01-01T00:52:23.367156224 ... ...
  * EEJ_QDLat   (EEJ_QDLat) float64 -20.0 -19.5 -19.0 -18.5 ... 19.0 19.5 20.0
Data variables:
    Spacecraft  (Timestamp) object 'B' 'B' 'B' 'B' 'B' ... 'B' 'B' 'B' 'B' 'B'
    Latitude    (Timestamp) float64 7.29 7.578 6.948 ... -7.722 -4.006 -0.7652
    Longitude   (Timestamp) float64 113.8 89.98 66.18 ... -105.3 -129.1 -153.0
    EEJ         (Timestamp, EEJ_QDLat) float64 -74.57 -59.68 ... -7.399 -9.459
    Flags       (Timestamp) uint16 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
    EEF         (Timestamp) float64 -0.4442 -0.2291 -0.1686 ... 0.4555 0.5333
Attributes:
    Sources:         ['SW_OPER_EEFBTMS_2F_20160101T000000_20160101T235959_020...
    MagneticModels:  []
    RangeFilters:    []

Let’s select a subset (one month) and visualise it:

_ds = ds.sel({"Timestamp": "2016-01"})

fig, ax1 = plt.subplots(nrows=1, figsize=(15,3), sharex=True)
_ds.plot.scatter(x="Timestamp", y="EEJ_QDLat", hue="EEJ", vmax=10, s=1, ax=ax1)
<matplotlib.collections.PathCollection at 0x7f5e701d6250>
../_images/03f__Demo-EEFxTMS_2F_17_1.png