Skip to main content

Tests PyPI Docs License: MIT

blochsim

blochsim simulates the signal of an MR sequence, and its derivatives, in PyTorch. You describe your sequence once, as a signal model, and blochsim plays it over thousands of voxels at once, on the CPU or on an NVIDIA GPU.

Everything else is written once against that signal model: the derivative with respect to tissue that a parameter fit needs, the derivative with respect to the sequence that a protocol design needs, dictionary matching, model-based reconstruction, and reading the same sequence back from a Pulseq file or from the stream a scanner sends. Change the signal model and all of them follow.

blochsim ships signal models for 26 sequences (spin echo, FSE, SPGR, bSSFP, MPRAGE, MP2RAGE, MR fingerprinting, Look-Locker, CEST, ASL...), so for most work you write nothing at all.

How it works

  1. You construct a simulator with the sequence parameters: the flip angles, the TR, the echo spacing.
  2. You call simulate with the tissue: T1, T2, and any other property you care about (B1, off-resonance, diffusion, a second exchanging pool...). A scalar is one voxel, an array is a map, and every voxel runs at once. Naming a property is what turns its physics on; what you leave out costs nothing.
  3. blochsim turns the sequence into a stream of events (pulses, delays, readouts) once, and plays it through an extended phase graph (EPG) state machine, compiled for the CPU and the GPU. Calling again with new numbers reuses the stream.
  4. jacobian gives you the derivative with respect to tissue properties, which is what a fit descends. The flip angles are ordinary PyTorch tensors, so loss.backward() gives you the derivative with respect to the sequence, which is what a design optimizes.

Shipped sequences

import torch

from blochsim.simulators import FSESimulator

fse = FSESimulator(ESP=5.0, TR=3000.0)  # ms
flip = torch.full((48,), 180.0)  # degrees, one per echo

signal = fse.simulate(flip=flip, T1=1000.0, T2=torch.tensor([80.0, 110.0, 2000.0]))
signal, dT2 = fse.jacobian("T2", flip=flip, T1=1000.0, T2=80.0)
  • signal has one row per voxel and one column per echo.
  • Times are in milliseconds and angles in degrees, as on a scanner console.
  • Every shipped simulator also has a function form for one-off calls, such as blochsim.fse_sim(...).

Custom signal models

A signal model is two things:

  • handlers: which operator plays each kind of event. A sequence has excitations, readouts and waits, and may have refocusing, inversion, saturation, preparation and other pulses, one handler for each Pulseq RF use. Each is a class attribute; one you do not set keeps its default (a wait is Delay: free precession, no RF and no ADC).
  • layout: the events of one repetition, in order, written with those handlers. It is the sequence's default description: the constructor builds it from the parameters you pass. from_pulseq and from_description read the description from a .seq file or a scanner's stream instead, and skip the layout.

Here is saturation recovery, which saturates, waits, and reads what came back:

import torch

from blochsim import Delay, Excitation, SPGRReadout, Spoil
from blochsim import Simulator


def Saturate(flip_rad=torch.pi / 2, phase_rad=0.0):
    """A 90-degree pulse, then a spoiler."""
    return Excitation(flip_rad, phase_rad) @ Spoil()


class SaturationRecovery(Simulator):
    saturation = Saturate  # plays a saturation pulse
    excitation = Excitation  # plays an excitation pulse
    delay = Delay  # plays a wait
    readout = SPGRReadout  # plays a readout, then spoils
    states = 1

    def layout(self, *, TS, flip):
        angle = torch.deg2rad(torch.as_tensor(flip))
        parts = []
        for wait in torch.as_tensor(TS) * 1e-3:  # ms to s
            parts += [self.operators.saturation(), self.operators.delay(wait)]
            parts += [self.operators.excitation(angle), self.operators.readout()]
        return parts


recovery = SaturationRecovery(TS=[100.0, 400.0, 1600.0], flip=10.0)
signal = recovery.simulate(T1=830.0, T2=80.0)
  • layout uses only self.operators, the handlers you set. You never write timestamps; each operator holds the timeline for as long as it lasts.
  • The handlers play the events whichever way the description came, so a sequence read with from_pulseq or from_description still uses them. A Pulseq file or a scanner stream carries pulses, ADC windows and timing but no gradients, so the handlers are where the dephasing lives: the readout decides whether the states are spoiled, wound on or rewound.
  • @ composes two operators into one, so a pulse and its spoiler read as the single thing you would name.

Derivatives, devices, extra physics and the estimators all work on your class without another line.

Estimation, design and reconstruction

  • Parameter maps: dictionary matching, lookup tables and PERK, all built from a simulator (blochsim.estimators).
  • Model-based reconstruction: the signal model as a factor of the forward operator, linear (blochsim.Subspace) or nonlinear (blochsim.ModelOperator). bartorch supplies the encoding and the Gauss-Newton solvers, and fits the same model voxel by voxel with apps.mobafit.
  • Sequence design: flip angles, timings or RF pulse samples optimized by gradient descent through the simulation, within the scanner's limits (blochsim.optim.SequenceDesign).
  • Sequences you did not write: Simulator.from_pulseq reads a .seq file, and Simulator.from_description reads the sequence description pulserver streams from a running scanner.

Installation

Install the PyTorch build for your machine first, then blochsim:

pip install blochsim
pip install "blochsim[cu12]"  # the GPU kernels, beside a CUDA 12 build of torch

The User guide covers CUDA versions, macOS and building from source.

Learn more

  • Course: five lessons, from a shipped simulator to your own signal model and your own operator.
  • Applications: parameter mapping, sequence design, model-based reconstruction and synthetic data, each a complete worked example.
  • Documentation, for the physics and every API detail.

How to cite

If you use blochsim in your work, please cite:

@inproceedings{cencini2025pulserver,
  title     = {Pulserver: an open-source Pulseq-based client-server framework for vendor agnostic, interactive {MR} sequence design},
  author    = {Cencini, Matteo and Wang, Kang and Huang, Sherry and Schulte, Rolf F. and Sprenger, Tim
               and Noll, Douglas C. and Tosetti, Michela and Nielsen, Jon-Fredrik},
  booktitle = {Proceedings of the International Society for Magnetic Resonance in Medicine},
  pages     = {1275},
  year      = {2025}
}

blochsim's state machine is the extended phase graph formalism (Weigel, 2015); please cite it too.

License

MIT, see LICENSE.

Metadata

Release files for blochsim 0.0.12

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

Source distribution (sdist)

Source distribution for blochsim 0.0.12
File Size Uploaded
blochsim-0.0.12.tar.gz 20.7 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for blochsim 0.0.12
File
blochsim-0.0.12-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
blochsim-0.0.12-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
blochsim-0.0.12-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details
blochsim-0.0.12-cp310-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 abi3 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
blochsim-0.0.12-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl CPython 3.10 abi3 Linux glibc 2.27+ ARM64, Linux glibc 2.28+ ARM64 Details
blochsim-0.0.12-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
blochsim-0.0.12-cp310-abi3-macosx_10_9_x86_64.whl CPython 3.10 abi3 macOS 10.9+ x86-64 Details

Total release size: 32.5 MB

Release files / blochsim-0.0.12.tar.gz

Download URL blochsim-0.0.12.tar.gz
Size 20.7 MB
Tags Source
SHA-256 checksum
How to use checksums
dafcc88db8b0f5faf471e33063b3ac7febd4959949d7533d8228f98922ac506a
BLAKE2b-256 checksum
How to use checksums
7b166fb7797ac92d664bcbc6d79e3cf666ff26e193eab65ae3aa6720995f604e
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 12, 2026.

Transparency log

Release files / blochsim-0.0.12-cp310-abi3-win_amd64.whl

Download URL blochsim-0.0.12-cp310-abi3-win_amd64.whl
Size 914.8 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
fd498b1c2c7e7866b3c44cb39e84f087d475bb947afa8e346b87e83e056a5e1a
BLAKE2b-256 checksum
How to use checksums
3ecd80f18c84dec707a6f1236ccd30e56e44e852df0694130e79ec6ec6725ce3
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 12, 2026.

Transparency log

Release files / blochsim-0.0.12-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL blochsim-0.0.12-cp310-abi3-musllinux_1_2_x86_64.whl
Size 2.7 MB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
397fbe90e556cf93cbb2fbe11a368d79bd304477ac3d4c60b0e9a0043943c0cc
BLAKE2b-256 checksum
How to use checksums
780d3b59fcc94e8685914969fe9480a9403fb30d7120832561bd432dd97d93f0
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 12, 2026.

Transparency log

Release files / blochsim-0.0.12-cp310-abi3-musllinux_1_2_aarch64.whl

Download URL blochsim-0.0.12-cp310-abi3-musllinux_1_2_aarch64.whl
Size 2.5 MB
Tags CPython 3.10 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
cb8d0d1c04b23484b4bd5c60798363d389da51e2b2fa4713c4f88bdd374afa1d
BLAKE2b-256 checksum
How to use checksums
91d74ead480cd5aeb69196f771f671d263e4908f5315e1d9ae5bfc66d8a054ec
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 12, 2026.

Transparency log

Release files / blochsim-0.0.12-cp310-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL blochsim-0.0.12-cp310-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.9 MB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
5d7f4ae34c2ab569a63f027ff41e09fe73420c34e533835a0104712f9e8b56f3
BLAKE2b-256 checksum
How to use checksums
dda7d7e037104052cbc80d79999e8dd55b6cef923d82bca2cd20762c69bf6683
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 12, 2026.

Transparency log

Release files / blochsim-0.0.12-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL blochsim-0.0.12-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Size 1.5 MB
Tags CPython 3.10 Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
1a64ab4e20b08554fe9e93898f0ec901c7326e90d0b9e2943803a0c6a454378d
BLAKE2b-256 checksum
How to use checksums
7cc80a1503239dc4ca207db29dd762908afba458f3db705bfbe448f62e025c70
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 12, 2026.

Transparency log

Release files / blochsim-0.0.12-cp310-abi3-macosx_11_0_arm64.whl

Download URL blochsim-0.0.12-cp310-abi3-macosx_11_0_arm64.whl
Size 1.1 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
aba19316795effd56af5e10314d82605ab6752fef6b3a20b0f1052073eddcc7e
BLAKE2b-256 checksum
How to use checksums
b9b77ce6ef88ab548af3a100eb47d30d3554dedb7a7ebc76b7bc5e2ed8060f16
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 12, 2026.

Transparency log

Release files / blochsim-0.0.12-cp310-abi3-macosx_10_9_x86_64.whl

Download URL blochsim-0.0.12-cp310-abi3-macosx_10_9_x86_64.whl
Size 1.2 MB
Tags CPython 3.10 abi3 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
878cb82e5d349653aad46a8c37844c3ad36e5f0097e5dab0a8134e2648ef2ac3
BLAKE2b-256 checksum
How to use checksums
24835d3890e8e04f9fb63fa53a82f3fda74ee6027ab2002af9654fd111c463ad
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 12, 2026.

Transparency log

Release history Release notifications | RSS feed

0.0.14

8 release files

0.0.13

8 release files

This release

0.0.12 This release

8 release files

0.0.11

8 release files

0.0.9

8 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