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]. The pulse sequences can be
exported as a .seq
file to be run on Siemens/GE/Bruker 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 [2].
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
. API docs can be found here.
Currently, PyPulseq
is compatible with Pulseq 1.2.0.
- numpy>=1.16.3
- matplotlib>=3.0.3
- Clone this repository.
- Set as working directory in your IDE.
- Install dependencies.
- Run any of the example scripts on Python 3.6 or above.
- Inspect plots!
?. Get in touch regarding running the
.seq
files on your Siemens/GE/Bruker scanner.
Getting started with pulse sequence design using PyPulseq
is simple:
pip install pypulseq
in your virtual environment (>=Python 3.6).- First, define system limits in
Opts
and then create aSequence
object with it:from pypulseq.opts import Opts from pypulseq.Sequence.sequence import Sequence system = Opts(max_grad=32, grad_unit='mT/m', max_slew=130, slew_unit='mT/m/s') seq = Sequence(system=system)
- Then, design gradient, RF or ADC pulse sequence events:
from pypulseq.make_sinc_pulse import make_sinc_pulse from pypulseq.make_trap_pulse import make_trapezoid from pypulseq.make_adc import make_adc 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, _, _ = 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 = make_trapezoid(channel='x', flat_area=Nx * delta_k, flat_time=6.4e-3, system=system) # ADC readout adc = make_adc(num_samples=Nx, duration=gx.flat_time, delay=gx.rise_time, system=system)
- Add these pulse sequence events to the
Sequence
object from step 2. One or more events can be executed simultaneously, simply pass them all to theadd_block()
method. For example, thegx
andadc
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.
- Ravi, Keerthi Sravan, et al. "Pulseq-Graphical Programming Interface: Open source visual environment for prototyping pulse sequences and integrated magnetic resonance imaging algorithm development." Magnetic resonance imaging 52 (2018): 9-15.
- Layton, Kelvin J., et al. "Pulseq: a rapid and hardware‐independent pulse sequence prototyping framework." Magnetic resonance in medicine 77.4 (2017): 1544-1552.