Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 1 addition & 19 deletions pypulseq/make_adiabatic_pulse.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
from types import SimpleNamespace
from typing import Tuple, Union
from copy import copy
from warnings import warn

import numpy as np
import math

from pypulseq import eps
from pypulseq.calc_duration import calc_duration
from pypulseq.calc_rf_center import calc_rf_center
from pypulseq.make_delay import make_delay
from pypulseq.make_trapezoid import make_trapezoid
from pypulseq.opts import Opts
from pypulseq.supported_labels_rf_use import get_supported_rf_uses
Expand All @@ -31,13 +28,11 @@ def make_adiabatic_pulse(
mu: float = 4.9,
phase_offset: float = 0,
return_gz: bool = False,
return_delay: bool = False,
slice_thickness: float = 0,
system: Union[Opts, None] = None,
use: str = str(),
) -> Union[
SimpleNamespace,
Tuple[SimpleNamespace, SimpleNamespace, SimpleNamespace, SimpleNamespace],
Tuple[SimpleNamespace, SimpleNamespace, SimpleNamespace],
]:
"""
Expand Down Expand Up @@ -109,8 +104,6 @@ def make_adiabatic_pulse(
Power to exponentiate to within AM term. ~20 or greater is typical.
phase_offset : float, default=0
Phase offset.
return_delay : bool, default=False
Boolean flag to indicate if the delay has to be returned.
return_gz : bool, default=False
Boolean flag to indicate if the slice-selective gradient has to be returned.
slice_thickness : float, default=0
Expand All @@ -127,8 +120,6 @@ def make_adiabatic_pulse(
Slice-selective trapezoid event.
gzr : SimpleNamespace, optional
Slice-select rephasing trapezoid event.
delay : SimpleNamespace, optional
Delay event.

Raises
------
Expand Down Expand Up @@ -264,19 +255,10 @@ def make_adiabatic_pulse(
if rf.delay < (gz.rise_time + gz.delay):
rf.delay = gz.rise_time + gz.delay

if rf.ringdown_time > 0:
delay = make_delay(calc_duration(rf) + rf.ringdown_time)
else:
delay = make_delay(calc_duration(rf))

if trace_enabled():
rf.trace = trace()

if return_gz and return_delay:
return rf, gz, gzr, delay
elif return_delay:
return rf, delay
elif return_gz:
if return_gz:
return rf, gz, gzr
else:
return rf
Expand Down
10 changes: 1 addition & 9 deletions pypulseq/make_arbitrary_rf.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ def make_arbitrary_rf(
max_grad: float = 0,
max_slew: float = 0,
phase_offset: float = 0,
return_delay: bool = False,
return_gz: bool = False,
slice_thickness: float = 0,
system: Union[Opts, None] = None,
Expand Down Expand Up @@ -58,8 +57,6 @@ def make_arbitrary_rf(
Maximum slew rate of accompanying slice select trapezoidal event.
phase_offset : float, default=0
Phase offset in Hertz (Hz).a
return_delay : bool, default=False
Boolean flag to indicate if delay has to be returned.
return_gz : bool, default=False
Boolean flag to indicate if slice-selective gradient has to be returned.
slice_thickness : float, default=0
Expand Down Expand Up @@ -160,15 +157,10 @@ def make_arbitrary_rf(
if rf.delay < (gz.rise_time + gz.delay):
rf.delay = gz.rise_time + gz.delay

if rf.ringdown_time > 0 and return_delay:
delay = make_delay(calc_duration(rf) + rf.ringdown_time)

if trace_enabled():
rf.trace = trace()

if return_gz and return_delay:
return rf, gz, delay
elif return_gz:
if return_gz:
return rf, gz
else:
return rf
18 changes: 2 additions & 16 deletions pypulseq/make_block_pulse.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

import numpy as np

from pypulseq.calc_duration import calc_duration
from pypulseq.make_delay import make_delay
from pypulseq.opts import Opts
from pypulseq.supported_labels_rf_use import get_supported_rf_uses
from pypulseq.utils.tracing import trace_enabled, trace
Expand All @@ -19,10 +17,9 @@ def make_block_pulse(
time_bw_product: float = None,
freq_offset: float = 0,
phase_offset: float = 0,
return_delay: bool = False,
system: Union[Opts, None] = None,
use: str = str(),
) -> Union[SimpleNamespace, Tuple[SimpleNamespace, SimpleNamespace]]:
) -> SimpleNamespace:
"""
Create a block (RECT or hard) pulse.

Expand All @@ -47,8 +44,6 @@ def make_block_pulse(
Frequency offset in Hertz (Hz).
phase_offset : float, default=0
Phase offset Hertz (Hz).
return_delay : bool, default=False
Boolean flag to indicate if the delay event has to be returned.
system : Opts, default=Opts()
System limits.
use : str, default=str()
Expand All @@ -58,8 +53,6 @@ def make_block_pulse(
-------
rf : SimpleNamespace
Radio-frequency block pulse event.
delay : SimpleNamespace, optional
Delay event.

Raises
------
Expand Down Expand Up @@ -126,14 +119,7 @@ def make_block_pulse(
if rf.dead_time > rf.delay:
rf.delay = rf.dead_time

if rf.ringdown_time > 0 and return_delay:
warn(f'Specified RF delay {rf.delay*1e6:.2f} us is less than the dead time {rf.dead_time*1e6:.0f} us. Delay was increased to the dead time.', stacklevel=2)
delay = make_delay(calc_duration(rf) + rf.ringdown_time)

if trace_enabled():
rf.trace = trace()

if return_delay:
return rf, delay
else:
return rf
return rf
15 changes: 1 addition & 14 deletions pypulseq/make_gauss_pulse.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@

import numpy as np

from pypulseq.calc_duration import calc_duration
from pypulseq.make_delay import make_delay
from pypulseq.make_trapezoid import make_trapezoid
from pypulseq.opts import Opts
from pypulseq.supported_labels_rf_use import get_supported_rf_uses
Expand All @@ -27,15 +25,13 @@ def make_gauss_pulse(
max_slew: float = 0,
phase_offset: float = 0,
return_gz: bool = False,
return_delay: bool = False,
slice_thickness: float = 0,
system: Union[Opts, None] = None,
time_bw_product: float = 4,
use: str = str(),
) -> Union[
SimpleNamespace,
Tuple[SimpleNamespace, SimpleNamespace, SimpleNamespace],
Tuple[SimpleNamespace, SimpleNamespace, SimpleNamespace, SimpleNamespace],
]:
"""
Create a [optionally slice selective] Gauss pulse.
Expand Down Expand Up @@ -65,8 +61,6 @@ def make_gauss_pulse(
Maximum slew rate of accompanying slice select trapezoidal event.
phase_offset : float, default=0
Phase offset in Hertz (Hz).
return_delay : bool, default=False
Boolean flag to indicate if the delay event has to be returned.
return_gz : bool, default=False
Boolean flag to indicate if the slice-selective gradient has to be returned.
slice_thickness : float, default=0
Expand All @@ -87,8 +81,6 @@ def make_gauss_pulse(
Accompanying slice select trapezoidal gradient event.
gzr : SimpleNamespace, optional
Accompanying slice select rephasing trapezoidal gradient event.
delay : SimpleNamespace, optional
Delay event.

Raises
------
Expand Down Expand Up @@ -169,19 +161,14 @@ def make_gauss_pulse(
if rf.delay < (gz.rise_time + gz.delay):
rf.delay = gz.rise_time + gz.delay

if rf.ringdown_time > 0 and return_delay:
delay = make_delay(calc_duration(rf) + rf.ringdown_time)

# Following 2 lines of code are workarounds for numpy returning 3.14... for np.angle(-0.00...)
negative_zero_indices = np.where(rf.signal == -0.0)
rf.signal[negative_zero_indices] = 0

if trace_enabled():
rf.trace = trace()

if return_gz and return_delay:
return rf, gz, gzr, delay
elif return_gz:
if return_gz:
return rf, gz, gzr
else:
return rf
Expand Down
2 changes: 1 addition & 1 deletion pypulseq/make_sigpy_pulse.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ def sigpy_n_seq(
rfp.trace = trace()

if return_gz:
return rfp, gz, gzr, pulse
return rfp, gz, gzr
else:
return rfp

Expand Down
12 changes: 1 addition & 11 deletions pypulseq/make_sinc_pulse.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import numpy as np

from pypulseq import make_delay, calc_duration
from pypulseq.make_trapezoid import make_trapezoid
from pypulseq.opts import Opts
from pypulseq.supported_labels_rf_use import get_supported_rf_uses
Expand All @@ -24,7 +23,6 @@ def make_sinc_pulse(
max_grad: float = 0,
max_slew: float = 0,
phase_offset: float = 0,
return_delay: bool = False,
return_gz: bool = False,
slice_thickness: float = 0,
system: Union[Opts, None] = None,
Expand All @@ -33,7 +31,6 @@ def make_sinc_pulse(
) -> Union[
SimpleNamespace,
Tuple[SimpleNamespace, SimpleNamespace, SimpleNamespace],
Tuple[SimpleNamespace, SimpleNamespace, SimpleNamespace, SimpleNamespace],
]:
"""
Creates a radio-frequency sinc pulse event and optionally accompanying slice select and slice select rephasing
Expand All @@ -60,8 +57,6 @@ def make_sinc_pulse(
Maximum slew rate of accompanying slice select trapezoidal event.
phase_offset : float, default=0
Phase offset in Hertz (Hz).
return_delay : bool, default=False
Boolean flag to indicate if the delay event has to be returned.
return_gz : bool, default=False
Boolean flag to indicate if slice-selective gradient has to be returned.
slice_thickness : float, default=0
Expand Down Expand Up @@ -166,19 +161,14 @@ def make_sinc_pulse(
if rf.delay < (gz.rise_time + gz.delay):
rf.delay = gz.rise_time + gz.delay

if rf.ringdown_time > 0 and return_delay:
delay = make_delay(calc_duration(rf) + rf.ringdown_time)

# Following 2 lines of code are workarounds for numpy returning 3.14... for np.angle(-0.00...)
negative_zero_indices = np.where(rf.signal == -0.0)
rf.signal[negative_zero_indices] = 0

if trace_enabled():
rf.trace = trace()

if return_gz and return_delay:
return rf, gz, gzr, delay
elif return_gz:
if return_gz:
return rf, gz, gzr
else:
return rf
15 changes: 0 additions & 15 deletions pypulseq/tests/test_make_adiabatic_pulse.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,21 +66,6 @@ def test_option_requirements():
assert gz.type == 'trap'
assert gzr.type == 'trap'

# Assert delay is returned if requested
_, delay = make_adiabatic_pulse(
pulse_type="hypsec",
return_gz=False,
return_delay=True)
assert delay.type == 'delay'

_, _, _, delay = make_adiabatic_pulse(
pulse_type="hypsec",
return_gz=True,
slice_thickness=1,
return_delay=True)
assert delay.type == 'delay'


# My intention was to test that the rephase gradient area is appropriate,
# but this doesn't pass and I'm highly suspicious of the calculation in
# the code
Expand Down
Loading