Skip to main content

Tests PyPI Docs: stable Virtual scanner: try it License: MIT

pulserver

pulserver lets you run your own sequence on a clinical scanner as if it were a product sequence: the operator edits it in the scanner UI, and the images come back to the console. Sequences are exchanged as Pulseq, so any tool that writes a .seq file (pypulseqpp, MATLAB Pulseq, BART's seq...) can provide one; pypulseqpp is the one pulserver uses natively.

You write two Python plugins, one that designs the sequence and one that reconstructs it. pulserver does everything in between: it answers the scanner UI, checks the sequence, converts it into the form the scanner plays, and routes the raw data back to your reconstruction.

pulserver architecture

The scanner side is a vendor interpreter, a small program on the scanner that calls pulserver. pulserver itself never touches the hardware.

How it works

  1. The operator opens your sequence. The scanner asks pulserver which parameters to show (TE, TR, flip angle, matrix...), and pulserver reads them from your sequence plugin.
  2. Every time the operator changes a value, pulserver asks your plugin whether the protocol is feasible and what it achieves (the TE, the TR, the scan time), and sends that back to the scanner. How your plugin answers is up to you: design one TR, or compute the times from the block durations. If the value is impossible, the scanner shows your error message instead.
  3. When the operator presses Scan, pulserver designs the whole sequence, runs the checks (timing, gradient and slew limits, PNS, mechanical resonance, acoustic noise) and converts it into the cache the interpreter plays, shifted to the prescribed field of view.
  4. The scanner plays it and streams the raw data to pulserver.
  5. pulserver fills in everything the sequence knows and the scanner does not: the MRD header (encoding spaces, matrix, field of view), and on every readout its acquisition header, flags, encoding counters from the sequence's labels, and trajectory. Your recon plugin receives these enriched readouts, sorts them into k-space and reconstructs as soon as a slice or volume is complete.
  6. Your plugin returns images; pulserver turns them into DICOM and sends them back to the console.

The sequence plugin

A sequence plugin takes a pypulseqpp sequence function, a function that returns a Sequence, and tells the scanner which of its arguments the operator can edit:

# sequences/gre.py
from pypulseqpp.sequences.sequence.gre2D_sequence import gre2d
from pulserver.design import Evaluation, FloatParam, SequencePlugin, TimeParam, UIParam


class Gre(SequencePlugin):
    app = gre2d
    protocol = {
        # ms on the scanner UI, µs on the wire, s for gre2d
        UIParam.TE: TimeParam("te", range_min=2000, range_max=20000),
        UIParam.FLIP: FloatParam(
            "flip_angle_deg", unit="deg", range_min=1, range_max=90
        ),
    }

    def evaluate(self, system, protocol):
        arguments = protocol.arguments  # SI units, as gre2d takes them
        one_line = arguments | {"ry": 128, "n_acs_y": 0, "n_dummy": 0}  # one TR
        seq = self.app(system, **one_line)
        return Evaluation(protocol.replace({UIParam.TE: seq.definitions["TE"][0]}))
  • protocol maps each scanner UI button (a UIParam key) to the argument of your function it sets, with its unit and range (a *Param value). Arguments you leave out keep the function's defaults.
  • evaluate runs on every edit, so keep it fast. Here it designs one line and reads back the TE; it could equally compute the TR from block durations, or accept the requested TR when it is feasible. To refuse a value, raise; the message goes to the operator.
  • The whole scan is built only when the operator starts it, by calling your function with the final protocol.

pulserver ships a plugin for each of pypulseqpp's 28 built-in sequences (Cartesian, radial, spiral, PROPELLER, EPI, FSE, MPRAGE, bSSFP, ZTE), so --plugin gre2d works without writing anything.

The recon plugin

The reconstruction side follows Gadgetron and ISMRMRD: the data arrive as an MRD stream (a header, then one acquisition per readout), and a recon plugin handles them as they arrive, much like a Gadgetron gadget chain. Any framework can do the maths; this one uses bartorch:

# recon/pics.py
import torch
import bartorch.tools as bt

from bartorch import apps, priors
from pulserver import recon


class Pics(recon.ReconPlugin):
    def recon(self, context, branch, data):
        kspace = torch.from_numpy(data.data.kspace)[:, None]  # (coils, z, y, x)
        maps = bt.ecalib(kspace, maps=1)
        image = apps.pics(kspace, maps, regularizers=priors.Wavelet((-1, -2), 0.005))
        return recon.ReconResult(image.abs().squeeze(0).numpy())


PLUGIN = Pics()
  • The plugin places each readout in k-space as it arrives, by its encoding counters, and recon is called once per slice or volume, when the flag that closes it arrives. By default that is the end of the scan; pass triggers={"imaging": AcquisitionFlag.LAST_IN_SLICE} to reconstruct slice by slice.
  • The flags and counters come from the labels in your sequence (pp.make_label, as in PyPulseq), so a correctly labelled sequence needs no sorting code in the reconstruction.
  • Return a ReconResult; pulserver writes the image header (position, orientation, field of view) from the sequence and the scanner.

The scanner chooses the recon by name, independently of the sequence, so one recon can serve many sequences.

Try it without a scanner

The virtual scanner plays your sequence on a phantom and streams the data to your recon, through exactly the path a real scan takes:

pip install pulserver bartorch
printf '[Limits]\nB0: 3.0\n[Limits End]\n' > system.txt
pulserver proxy --store designs --port 9002 --plugins recon &
pulserver scan --plugins sequences --plugin gre --reconstruction pics \
  --limits system.txt --store designs --recon 127.0.0.1:9002 --output images

Or skip the install and try it in your browser: https://pulserver.github.io/MaRGE/.

On a real scanner

You need the vendor interpreter for your scanner, which calls pulserver design for steps 1 to 3 and streams the raw data to pulserver proxy for steps 4 to 6. Running the services explains how to set both up.

pulserver's checks compute estimates. Passing them does not establish scanner or patient safety: SAR and RF and gradient heating are checked by the scanner's own routines.

Learn more

  • Course: six lessons from a protocol to an image.
  • Documentation, for every option and API detail.

How to cite

If you use pulserver 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}
}

pulserver builds on Pulseq (Layton et al., 2017) and the ISMRM raw data format (Inati et al., 2017); please cite those too.

License

MIT, see LICENSE.

Metadata

Release files for pulserver 0.4.1

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

Source distribution (sdist)

Source distribution for pulserver 0.4.1
File Size Uploaded
pulserver-0.4.1.tar.gz 1.1 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for pulserver 0.4.1
File
pulserver-0.4.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.26+ x86-64, Linux glibc 2.28+ x86-64 Details
pulserver-0.4.1-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
pulserver-0.4.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.26+ x86-64, Linux glibc 2.28+ x86-64 Details
pulserver-0.4.1-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
pulserver-0.4.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64, Linux glibc 2.26+ x86-64 Details
pulserver-0.4.1-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
pulserver-0.4.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.26+ x86-64 Details
pulserver-0.4.1-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
pulserver-0.4.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64, Linux glibc 2.26+ x86-64 Details
pulserver-0.4.1-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 11.0 MB

Release files / pulserver-0.4.1.tar.gz

Download URL pulserver-0.4.1.tar.gz
Size 1.1 MB
Tags Source
SHA-256 checksum
How to use checksums
3db68c5ed0617e26f239b421a83c93500f03c1fa80d9d9b2d4018c13e64a8805
BLAKE2b-256 checksum
How to use checksums
c1afead030f7f2e6c457ad72030c5b7ea87733b32cc333b7cfc2d073f2ea88b8
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 / pulserver-0.4.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL pulserver-0.4.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 1.3 MB
Tags CPython 3.14 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
b7b330c09f55cd67262b2977c45f287d317a0ee7d3ee0626507c89d5c089078a
BLAKE2b-256 checksum
How to use checksums
0b4615df1b8d651128c66c3597ad2007ba5f6c1600b6cb0a0908164118e812f5
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 / pulserver-0.4.1-cp314-cp314-macosx_11_0_arm64.whl

Download URL pulserver-0.4.1-cp314-cp314-macosx_11_0_arm64.whl
Size 711.5 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
164548576decd3e8250315ec6af4f4763c4a6bdf6d1daecde8e592d9b9dcd67d
BLAKE2b-256 checksum
How to use checksums
d5289ad45b9231ac559b9c47d32179e203c180b1c10ddd52309948dd548a4584
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 / pulserver-0.4.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL pulserver-0.4.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 1.3 MB
Tags CPython 3.13 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
6f329793092f8929ea8112b0fd38a50394ecdedfa41c2d2429cfad84cc5b0ae8
BLAKE2b-256 checksum
How to use checksums
e9aefdc7dea01093c4f197c08a12d252663f287c867d995c9f8e91402964d48c
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 / pulserver-0.4.1-cp313-cp313-macosx_11_0_arm64.whl

Download URL pulserver-0.4.1-cp313-cp313-macosx_11_0_arm64.whl
Size 710.7 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
22c025ee5b6a287c97e1874838fed2853fe498aabec87bae8ec3f05b18722e1d
BLAKE2b-256 checksum
How to use checksums
aa58de8847721a1d7ecd7708d214ea35819389ffb2a6a06cea102df145e0c9c2
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 / pulserver-0.4.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL pulserver-0.4.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 1.3 MB
Tags CPython 3.12 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
44ea4254ba204ce2c585fa2ef877bf96abf23a8f55d7918da26c48ddba9f75f9
BLAKE2b-256 checksum
How to use checksums
f753a72ba3552f2553843e24daf00d0d4ab95b6f16cc596bc52facb9b7bfce3f
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 / pulserver-0.4.1-cp312-cp312-macosx_11_0_arm64.whl

Download URL pulserver-0.4.1-cp312-cp312-macosx_11_0_arm64.whl
Size 710.7 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
0270099d374abe9247cb2243b2c63f84f0cea3c73285e062f3a432a64011a8a1
BLAKE2b-256 checksum
How to use checksums
d54ee34eadf5329f6021724cc62f9db218b7510c5ad30893aae9273140e01d76
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 / pulserver-0.4.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL pulserver-0.4.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 1.3 MB
Tags CPython 3.11 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
33b6efb01f8f06ac73ab59d0adeae7eecb30e9f75f43f6a78c417a9895916f40
BLAKE2b-256 checksum
How to use checksums
321df29108c47dc19d846663da66685f2ba0e609dd3b291dd5b057d4ac6d6f5a
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 / pulserver-0.4.1-cp311-cp311-macosx_11_0_arm64.whl

Download URL pulserver-0.4.1-cp311-cp311-macosx_11_0_arm64.whl
Size 708.6 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b61d8a63b446d6d5817e639aa4bd58caefa59056d679b74fd96b899bfc5e82ce
BLAKE2b-256 checksum
How to use checksums
d554795e698d14b682d55a4992be13824fc17ba054d7bc604b17ea0b8335b693
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 / pulserver-0.4.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL pulserver-0.4.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 1.3 MB
Tags CPython 3.10 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
fd9e01a51f1b32a7e79b294f41136dfaf65b3565e5510eb812ccefe593841003
BLAKE2b-256 checksum
How to use checksums
1c97fbb9dda9b2f357aca8d16f39c130233051dcd2b54f36ca2706f61a2468d6
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 / pulserver-0.4.1-cp310-cp310-macosx_11_0_arm64.whl

Download URL pulserver-0.4.1-cp310-cp310-macosx_11_0_arm64.whl
Size 707.4 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1829963f29a1b8b1b89467284f6745910b4ee6cc86fd26c26d3675d94261d56a
BLAKE2b-256 checksum
How to use checksums
e5e659567b32267420958c79a3315a9f079c4952088ee1d455d9613f43bad0d5
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.4.1 This release

11 release files

0.4.0

11 release files

0.3.0

11 release files

0.2.2

11 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.4

11 release files

0.0.2

11 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