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

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.14
File Size Uploaded
blochsim-0.0.14.tar.gz 20.7 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for blochsim 0.0.14
File
blochsim-0.0.14-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
blochsim-0.0.14-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
blochsim-0.0.14-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details
blochsim-0.0.14-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.14-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.14-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
blochsim-0.0.14-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.14.tar.gz

Download URL blochsim-0.0.14.tar.gz
Size 20.7 MB
Tags Source
SHA-256 checksum
How to use checksums
5713dabe236ae85efc480fcb0c7c7e67ea672679077ff3278c620939ff09ab46
BLAKE2b-256 checksum
How to use checksums
658620f2f76a400af19ec8c93dd9fb2503cfcbb876734bffb4b6fe511f1e2d32
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 14, 2026.

Transparency log

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

Download URL blochsim-0.0.14-cp310-abi3-win_amd64.whl
Size 913.1 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
b981fb1a2f322c9bb663b990cb6d83a66c43bd43ccb4625c4d93c84d5bf929d5
BLAKE2b-256 checksum
How to use checksums
1bfb588d1fecd3324d30302b3d50a55526c7b21cd4808657d99cdfe3c117f00b
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 14, 2026.

Transparency log

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

Download URL blochsim-0.0.14-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
2198cdf4fa685dd308c2e6642ca9ad1f03535eaa3ed96ed0204bee10be196e1c
BLAKE2b-256 checksum
How to use checksums
b17824b72eba9bee0c4c047d5b43fdf0c2e23512100782712078c7b04f94ad2d
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 14, 2026.

Transparency log

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

Download URL blochsim-0.0.14-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
c526a502f215b36e5ecc9f4015766201726b33a00fc3d23a1c996df02bb2e8b6
BLAKE2b-256 checksum
How to use checksums
32bc273bbcf2bc81f96f8b6c2c2031782a695037b3456f1af239f1c980399143
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 14, 2026.

Transparency log

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

Download URL blochsim-0.0.14-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
f1ae7ec5745a98ede452f61292d2135e428986d9b15cf805780a8665e19ba83a
BLAKE2b-256 checksum
How to use checksums
8a5c0d8823a6888ed1f255787ec8947e7c6906c659930fc9b8761cbfdb171a95
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 14, 2026.

Transparency log

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

Download URL blochsim-0.0.14-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
224549c9aac0635918fe8583126ccc17c5818aa4dd78b2a5a3d7459bba77c072
BLAKE2b-256 checksum
How to use checksums
a95106e0220a1def6f328e4bb69f0f8cda06a4258705f18e1599efda1aa52155
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 14, 2026.

Transparency log

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

Download URL blochsim-0.0.14-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
75de8f01daf4872f4727d8b65a1f6fd8a8297ac161ac26ff0081b65cf8d886bf
BLAKE2b-256 checksum
How to use checksums
6548f4aa32ef45c4c9047832d12cb509985fc6733ec63f0dfe198b1336339d7c
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 14, 2026.

Transparency log

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

Download URL blochsim-0.0.14-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
ac803f470689cc2d27daaa3ed271323f8ef01eac6a115cd3f05e162fb407d8f2
BLAKE2b-256 checksum
How to use checksums
45d0bb1f3706e3665e381dd78fb2cf68c2a048251257d50da0579380244c4838
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 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.0.14 This release

8 release files

0.0.13

8 release files

0.0.12

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