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

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.2.2
File Size Uploaded
pulserver-0.2.2.tar.gz 1.1 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for pulserver 0.2.2
File
pulserver-0.2.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64, Linux glibc 2.26+ x86-64 Details
pulserver-0.2.2-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
pulserver-0.2.2-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.2.2-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
pulserver-0.2.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.26+ x86-64, Linux glibc 2.28+ x86-64 Details
pulserver-0.2.2-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
pulserver-0.2.2-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.2.2-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
pulserver-0.2.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.26+ x86-64, Linux glibc 2.28+ x86-64 Details
pulserver-0.2.2-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 10.8 MB

Release files / pulserver-0.2.2.tar.gz

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

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

Download URL pulserver-0.2.2-cp314-cp314-macosx_11_0_arm64.whl
Size 701.7 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ad82ee7e91c420b3aa78522e9cd7d674d19a7e39f79cf752ed07ea2f19e02437
BLAKE2b-256 checksum
How to use checksums
8d9891b18ede984de2aeb0f8c74f23cd8645aa825ef8a2d174ed3eb84886aca6
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 / pulserver-0.2.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL pulserver-0.2.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 1.2 MB
Tags CPython 3.13 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
4d203ad3a7a9e95bf99ea6dd2c77f2decc2c7e72e389288fe28069bbfdab6a1b
BLAKE2b-256 checksum
How to use checksums
980cf375086bc38ab0c2cc5258b5b233cec0ac94fb55b1d2b50d89fed9d4cbf1
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 / pulserver-0.2.2-cp313-cp313-macosx_11_0_arm64.whl

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

Download URL pulserver-0.2.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 1.2 MB
Tags CPython 3.12 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
19473aa34a0370c28cba75bbfa754f00398dc2f997218b3a6b89f8896e292e96
BLAKE2b-256 checksum
How to use checksums
0b3a5f26f0681bffbafc1bd4a152b1a8ebed7c66b0df5a5800af2cd395f6fb19
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 / pulserver-0.2.2-cp312-cp312-macosx_11_0_arm64.whl

Download URL pulserver-0.2.2-cp312-cp312-macosx_11_0_arm64.whl
Size 700.9 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7b83124867d5199e48eaa702110f60a0daebd9f8a348f8a1f26f98f6d19343aa
BLAKE2b-256 checksum
How to use checksums
8e8e8f221686d2f857a542ba0077d63805610f602c9ab15926066c3c4dd39d3c
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 / pulserver-0.2.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL pulserver-0.2.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 1.2 MB
Tags CPython 3.11 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
2c683a5b5ba63d825e1f8ef96ad659df61ed773553e3ed66cf072d0b33d50205
BLAKE2b-256 checksum
How to use checksums
e403fe9ca08772998e8d5b986ddd918fd6b007922aa9e1756b8c679da3270830
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 / pulserver-0.2.2-cp311-cp311-macosx_11_0_arm64.whl

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

Download URL pulserver-0.2.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 1.2 MB
Tags CPython 3.10 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
97119b96b3757e441280bff62796ae5365328afdfc99d8cf1a8ee5b922608874
BLAKE2b-256 checksum
How to use checksums
e9928340f1e499a2d778555441478ea4b1858bf258c5657c4cecded6b25fa117
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 / pulserver-0.2.2-cp310-cp310-macosx_11_0_arm64.whl

Download URL pulserver-0.2.2-cp310-cp310-macosx_11_0_arm64.whl
Size 697.6 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
be7c11a137170751c324f753f3e78bc6a7695d14269929a493e799965a3ef59d
BLAKE2b-256 checksum
How to use checksums
569b2fd2970ffb5298f17e44b38500cb51f94fb19fcaee00b8920c374d199efa
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.4.1

11 release files

0.4.0

11 release files

0.3.0

11 release files

This release

0.2.2 This release

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