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.3

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.3
File Size Uploaded
csem_midl-1.1.3.tar.gz 7.7 MB Details

Built distribution (wheel)

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

Total release size: 7.8 MB

Release files / csem_midl-1.1.3.tar.gz

Download URL csem_midl-1.1.3.tar.gz
Size 7.7 MB
Tags Source
SHA-256 checksum
How to use checksums
fb97745206e00d468110811b653a955312afc361062348a9820d5361aeabb375
BLAKE2b-256 checksum
How to use checksums
c0721178836c54d00222fc97b8aef853a357677dd91808880e8bfe48be4c9483
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 Oct 5, 2026.

Transparency log

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

Download URL csem_midl-1.1.3-py3-none-any.whl
Size 29.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
61608550a5b20282ba16ec873d5a9e993bcf6bed9aae5e2b54bb53b8385a6964
BLAKE2b-256 checksum
How to use checksums
b773b5d82e7a610d748cdf2eb609af916cd574dcc1aa063760a687462b5daf20
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 Oct 5, 2026.

Transparency log

Release history Release notifications | RSS feed

1.1.4

2 release files

This release

1.1.3 This release

2 release files

1.1.2

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