![PyPulseq](logo.png)
Pulse sequence design is a significant component of MRI research. However, multi-vendor studies require researchers to be acquainted with each hardware platform's programming environment.
PyPulseq enables vendor-neutral pulse sequence design in Python [1,2]. The pulse sequences can be
exported as a .seq
file to be run on Siemens, GE, Bruker and now also Philips hardware by leveraging their respective Pulseq interpreters. This tool is targeted at MRI pulse sequence designers, researchers, students and other interested
users. It is a translation of the Pulseq framework originally written in Matlab [3].
π Currently, PyPulseq is compatible with Pulseq >= 1.4.0. π
It is strongly recommended to first read the Pulseq specification before proceeding. The specification document defines the concepts required for pulse sequence design using PyPulseq.
If you use PyPulseq in your work, please cite the publications listed under References.
PyPulseq is available on the python Package Index PyPi and can be installed using the command
pip install pypulseq
The latest features and minor bug fixes might not be included in the latest release version. If you want to use the bleeding edge version of PyPulseq, you can install it directly from the development branch of this repository using the command
pip install git+https://github.com/imr-framework/pypulseq@dev
π PyPulseq is not yet available on conda, but this is planned for the future π
pip install pypulseq
The PyPulseq repository contains several example sequences in the seq_examples folder. Every example script or example notebook creates a pulse sequence, plots the pulse timing diagram and finally saves the sequence as a .seq
file to disk.
Getting started with pulse sequence design using PyPulseq
is simple:
First, define system limits in Opts
and then create a Sequence
object with it:
import pypulseq as pp
system = pp.Opts(max_grad=32, grad_unit='mT/m', max_slew=130, slew_unit='mT/m/ms')
seq = pp.Sequence(system=system)
Then, design gradient, RF or ADC pulse sequence events:
Nx, Ny = 256, 256 # matrix size
fov = 220e-3 # field of view
delta_k = fov / Nx
# RF sinc pulse with a 90 degree flip angle
rf90 = pp.make_sinc_pulse(flip_angle=90, duration=2e-3, system=system, slice_thickness=5e-3, apodization=0.5,
time_bw_product=4)
# Frequency encode, trapezoidal event
gx = pp.make_trapezoid(channel='x', flat_area=Nx * delta_k, flat_time=6.4e-3, system=system)
# ADC readout
adc = pp.make_adc(num_samples=Nx, duration=gx.flat_time, delay=gx.rise_time, system=system)
Add these pulse sequence events to the Sequence
object. One or more events can be executed simultaneously, simply pass them all to the add_block()
method. For example, the gx
and adc
pulse sequence events need to be executed simultaneously:
seq.add_block(rf90)
seq.add_block(gx, adc)
Visualize plots:
seq.plot()
Generate a .seq
file to be executed on a real MR scanner:
seq.write('demo.seq')
PyPulseq
adheres to a code of conduct adapted from the Contributor Covenant code of conduct.
Contributing guidelines can be found here.