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
- You construct a simulator with the sequence parameters: the flip angles, the TR, the echo spacing.
- You call
simulatewith 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. - 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.
jacobiangives you the derivative with respect to tissue properties, which is what a fit descends. The flip angles are ordinary PyTorch tensors, soloss.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)
signalhas 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 and
saturation pulses. 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_pulseqandfrom_descriptionread the description from a.seqfile 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.model 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)
layoutuses onlyself.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_pulseqorfrom_descriptionstill 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, nonlinear least
squares and PERK, all built from a simulator (
blochsim.estimators). - Model-based reconstruction: the signal model as a factor of the forward
operator, linear (a subspace) or nonlinear (
blochsim.recon). - Sequence design: flip angles, timings or RF pulse samples optimized by
gradient descent through the simulation, within the scanner's limits
(
blochsim.SequenceDesign). - Sequences you did not write:
Simulator.from_pulseqreads a.seqfile, andSimulator.from_descriptionreads 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.11
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| blochsim-0.0.11.tar.gz | 20.7 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| blochsim-0.0.11-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| blochsim-0.0.11-cp310-abi3-musllinux_1_2_x86_64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ x86-64 | Details |
| blochsim-0.0.11-cp310-abi3-musllinux_1_2_aarch64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ ARM64 | Details |
| blochsim-0.0.11-cp310-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| blochsim-0.0.11-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.11-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| blochsim-0.0.11-cp310-abi3-macosx_10_9_x86_64.whl | CPython 3.10 | abi3 | macOS 10.9+ x86-64 | Details |
Total release size: 32.6 MB
Release files / blochsim-0.0.11.tar.gz
| Download URL | blochsim-0.0.11.tar.gz |
|---|---|
| Size | 20.7 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
52a99ab81ee46296e266c2b307ee8cf42215b1e2697b3678f7f37965f5e53089
|
|
BLAKE2b-256 checksum How to use checksums |
04ed41478956bfcf41b791ca9e15392bf32640bf0ca3b1f99165bfb4c6152c42
|
| 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 logRelease files / blochsim-0.0.11-cp310-abi3-win_amd64.whl
| Download URL | blochsim-0.0.11-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 927.1 kB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
28f0e79460173074cc488a72e44e759e8db2ce60c1b1fcc71641b96c0f53fd1f
|
|
BLAKE2b-256 checksum How to use checksums |
d65576d4a7eead411722fec1ebf9a4f276dcb0fe2bb8fa7d8c793364bc2994f8
|
| 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 logRelease files / blochsim-0.0.11-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | blochsim-0.0.11-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 |
76089fc0fcda782a0e1b95548b1b87d6a9d0259a83095280356efa1d25f4d341
|
|
BLAKE2b-256 checksum How to use checksums |
784f8bfff094e34e8831db00ca588adef31a4b9a5a1bc8897b0be0c400fa74bf
|
| 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 logRelease files / blochsim-0.0.11-cp310-abi3-musllinux_1_2_aarch64.whl
| Download URL | blochsim-0.0.11-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 |
0d18db0dfce3c0a0a037c5d05ac9865b15f3dc222e56c0a8c889c90ebd4213db
|
|
BLAKE2b-256 checksum How to use checksums |
9eb2661fd1f1921813040893ddf4619942f39bc661c91def2fc6df228e6bfe54
|
| 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 logRelease files / blochsim-0.0.11-cp310-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | blochsim-0.0.11-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 |
185792f435037151d2a9ee4359c222343d4b80ab17293f4c2384d11022cdf9ef
|
|
BLAKE2b-256 checksum How to use checksums |
735638cbb865d34f294c8e832846576c0a7d8d29fa4fb822812d10d00825f6ee
|
| 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 logRelease files / blochsim-0.0.11-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
| Download URL | blochsim-0.0.11-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 |
e1f36d3d41bf709be03b43b787de806290c91814d5772a5fa449b7df9c8f2cfb
|
|
BLAKE2b-256 checksum How to use checksums |
539ada345b9ab479d7b6467f0e7e3ba26344a5bce49713a553a95389a68547e0
|
| 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 logRelease files / blochsim-0.0.11-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | blochsim-0.0.11-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 |
bb7cf7a1030934603ce6e93bccf0771f9536e200fb62768f0edb1098e7d3bccd
|
|
BLAKE2b-256 checksum How to use checksums |
00f91d6f3687005fc1d899735d8f79bef6818ebe9eefe6cc5a359e9f0332c7d6
|
| 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 logRelease files / blochsim-0.0.11-cp310-abi3-macosx_10_9_x86_64.whl
| Download URL | blochsim-0.0.11-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 |
f62cab2a22beaa6df64dae4e57cfe5cb04792edd30964ee32d607d0767504bea
|
|
BLAKE2b-256 checksum How to use checksums |
99afa8090144bf5054d56b6e3b0411976948e8266cf663004bd23ac4bea4a79d
|
| 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