From 0fd4dfc42f092567895d1294bb1031ef2430718a Mon Sep 17 00:00:00 2001 From: Michiel Cottaar <MichielCottaar@protonmail.com> Date: Tue, 21 May 2024 13:56:59 +0100 Subject: [PATCH] Fix block duration setting for v1.3.1 --- src/sequence_io/pulseq.jl | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/sequence_io/pulseq.jl b/src/sequence_io/pulseq.jl index 2f8ddc7..95034fa 100644 --- a/src/sequence_io/pulseq.jl +++ b/src/sequence_io/pulseq.jl @@ -14,13 +14,13 @@ function Sequence(pulseq::PulseqSequence; scanner=nothing, B0=nothing) use_B0 = isnothing(B0) ? get(pulseq.definitions, :B0, 3.) : B0 scanner = Scanner(B0=use_B0) end - blocks = BuildingBlock.(pulseq.blocks; pulseq.definitions...) + blocks = BuildingBlock.(pulseq.blocks; pulseq.definitions..., version=pulseq.version) return Sequence(blocks; name=Symbol(get(pulseq.definitions, :Name, "from_pulseq")), scanner=scanner) end -function BuildingBlock(pulseq::PulseqBlock; BlockDurationRaster, RadiofrequencyRasterTime, GradientRasterTime, kwargs...) - duration = pulseq.duration * BlockDurationRaster * 1e3 +function BuildingBlock(pulseq::PulseqBlock; version, BlockDurationRaster, RadiofrequencyRasterTime, GradientRasterTime, kwargs...) + stated_duration = pulseq.duration * BlockDurationRaster * 1e3 events = [] if !isnothing(pulseq.rf) @@ -52,7 +52,20 @@ function BuildingBlock(pulseq::PulseqBlock; BlockDurationRaster, RadiofrequencyR end grads = [pulseq.gx, pulseq.gy, pulseq.gz] - times = sort(unique(vcat([0., duration], _control_times.(grads, GradientRasterTime)...))) + min_duration = max( + maximum(e[1] + duration(e[2]) for e in events; init=0.), + maximum(vcat(_control_times.(grads, GradientRasterTime)...); init=0.) + ) + + if min_duration > stated_duration + if version == v"1.3.1" + stated_duration = min_duration + else + error("Minimum duration to play all RF/gradient/ADC events exceeds stated duration.") + end + end + + times = sort(unique(vcat([0., stated_duration], _control_times.(grads, GradientRasterTime)...))) waveform = [(t, _get_amplitude.(grads, t, GradientRasterTime)) for t in times] return BuildingBlock(waveform, events) -- GitLab