Skip to main content

Merged Interplanetary Data from L1

Python client for the MIDL solar wind dataset.

Install

pip install csem-midl

To update an existing installation:

pip install --upgrade csem-midl

Quickstart

import midl

data = midl.load("2005-01-01 00:00", "2005-01-01 01:00", 32)
print(data)
<xarray.Dataset> Size: 4kB
Dimensions:  (time: 61)
Coordinates:
  * time     (time) datetime64[ns] 488B 2005-01-01 ... 2005-01-01T01:00:00
Data variables:
    Bx       (time) float64 488B -6.05 -3.94 -3.7 -3.75 ... -2.01 -1.78 -2.08
    By       (time) float64 488B 3.84 3.5 3.12 2.94 3.2 ... 4.97 5.3 5.29 5.2
    Bz       (time) float64 488B -0.93 -4.06 -4.83 -4.92 ... 1.25 2.04 2.05 2.11
    Ux       (time) float64 488B -422.3 -429.9 -433.6 ... -437.4 -441.8 -441.8
    Uy       (time) float64 488B -13.38 -12.91 -9.05 ... -28.15 -27.06 -26.68
    Uz       (time) float64 488B 26.93 47.59 54.86 54.99 ... 0.46 1.42 0.92
    rho      (time) float64 488B 5.169 5.439 5.481 5.359 ... 6.131 6.363 6.323
    T        (time) float64 488B 1.33e+05 1.321e+05 ... 1.159e+05 1.159e+05
Attributes:
    source:             MIDL
    url:                https://csem.engin.umich.edu/MIDL/
    target:             32Re
    midl_propagation:   {'method': 'ballistic', 'target_re': 32.0}
# 14Re and 32Re Ballistically-propagated data are available for direct download
midl.load("2024-05-10 00:00", "2024-05-11 01:00", 14, method="ballistic")
midl.load("2024-05-10 00:00", "2024-05-11 01:00", 32, method="ballistic") 

# [-70,70]Re MHD-propagated data are available for direct download
midl.load("2024-05-10 00:00", "2024-05-11 01:00", 30, method="mhd")

# Any value can be ballistically propagated client-side
midl.load("2024-05-10 00:00", "2024-05-11 01:00", 20.25, method="ballistic") 

# Data at L1 can be downloaded directly as well 
midl.load("2024-05-10 00:00", "2024-05-11 01:00", "L1")

Client-side MHD propagation is not supported.

Coordinate systems

MIDL data is native GSM. Pass coords="GSE" or coords="SM" (case-insensitive, default "GSM") to receive the vector variables (Bx, By, Bz, Ux, Uy, Uz) rotated into that frame, minute by minute:

midl.load("2024-05-10 00:00", "2024-05-11 01:00", 32, coords="GSE")
midl.load("2024-05-10 00:00", "2024-05-11 01:00", "L1", coords="SM")

Scalars (rho, T) and source columns are untouched, and the L1 X variable always remains the reference satellite X_GSM position regardless of coords. The rotation conventions and the published per-minute angle tables they use are documented at https://csem.engin.umich.edu/MIDL/format.html.

Earth orbital motion

Following the community convention (CDAWeb, OMNI, and the instrument teams' own L2 products), the underlying MIDL data have Earth's orbital motion around the Sun removed: the axes are GSE/GSM but the frame origin does not co-move with Earth, so Vy_GSE averages ~0 instead of the ~+29.78 km/s aberration a true Earth-rest frame would show. Since v1.1.1 load() restores it by default, returning velocities in Earth's rest frame — the physically correct upstream input for Earth-centered magnetosphere models such as SWMF. Pass orbital_motion=False for convention-frame (CDAWeb/OMNI-comparable) velocities:

midl.load("2024-05-10", "2024-05-11", "L1", coords="GSE", orbital_motion=False)

The correction is seasonally exact (two-body solution, tangential 29.29–30.29 km/s across the year, added along +Y_GSE) and is expressed in whatever coords frame you request — in GSM it lands in both Uy and Uz through the per-minute rotation angles. Ux is left as-is (the convention is only known to remove the tangential component, so Earth's ±0.50 km/s radial speed is not re-added); B, rho, and T are frame-origin-independent. The choice is recorded in ds.attrs["orbital_motion"], and to_dat headers state it as Earth orbital motion included or Earth orbital motion EXCLUDED.

Saving to file:

midl.to_csv(data, "storm.csv")
midl.to_dat(data, "storm.dat")

Data is cached locally after the first download.

Using with spacepy

MIDL Datasets convert to a spacepy SpaceData in a few lines:

import midl
from spacepy.datamodel import SpaceData, dmarray

ds = midl.load("2005-01-01 00:00", "2005-01-01 01:00", 32)

sd = SpaceData(attrs=dict(ds.attrs))
sd["Epoch"] = dmarray(ds["time"].values, attrs={"units": "UTC"})
for name, da in ds.data_vars.items():
    sd[name] = dmarray(da.values, attrs=dict(da.attrs))

Tutorials

  • Merging MIDL with IMP-8 — merge MIDL L1 with external satellite data to fill gaps in the 1998–2004 ACE-only era

See also

  • MIDL-Pipeline — the code that produces the MIDL dataset
  • MSWIM2D — 2-D MHD solar wind model (1–75 AU) driven by MIDL L1 data; Python client mswim2d

Metadata

Release files for csem-midl 1.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for csem-midl 1.1.2
File Size Uploaded
csem_midl-1.1.2.tar.gz 7.7 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for csem-midl 1.1.2
File Interpreter ABI Platform
csem_midl-1.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 7.8 MB

Release files / csem_midl-1.1.2.tar.gz

Download URL csem_midl-1.1.2.tar.gz
Size 7.7 MB
Tags Source
SHA-256 checksum
How to use checksums
59cefaab9b2fcb4fc25ad788c4404a6dfb31bc4ee753db755ad2901322f47797
BLAKE2b-256 checksum
How to use checksums
1111c3426c5f89e02d3c280e9da0957a7c2c3e22946f2ee961e1424fc780abe5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 1, 2026.

Transparency log

Release files / csem_midl-1.1.2-py3-none-any.whl

Download URL csem_midl-1.1.2-py3-none-any.whl
Size 29.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8ce4dca2bb42801bdb404294f964b95931062dda503c25d76c68776d3b00e990
BLAKE2b-256 checksum
How to use checksums
8bc34009c7ee93594327a63468a45c10849f43279a4b739531ca625860e9b650
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 1, 2026.

Transparency log

Release history Release notifications | RSS feed

1.1.4

2 release files

1.1.3

2 release files

This release

1.1.2 This release

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page