From 8fcd0756dd9c90fc1aa8956dcebe0ca4ed47e020 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar <michiel.cottaar@ndcn.ox.ac.uk> Date: Fri, 12 Apr 2024 16:05:48 +0100 Subject: [PATCH] Get GenericPulse as subset of larger pulse --- src/components/pulses/generic_pulses.jl | 29 +++++++++++++++++++++++++ test/test_sequences.jl | 4 ++++ 2 files changed, 33 insertions(+) diff --git a/src/components/pulses/generic_pulses.jl b/src/components/pulses/generic_pulses.jl index 4ff71c3..5c760e4 100644 --- a/src/components/pulses/generic_pulses.jl +++ b/src/components/pulses/generic_pulses.jl @@ -41,6 +41,35 @@ function GenericPulse(time::AbstractVector{<:Number}, amplitude::AbstractVector{ return GenericPulse(time, amplitude, (time .- time[1]) .* (frequency * 360) .+ phase, effective_time) end +""" + GenericPulse(pulse, t1, t2) + +Creates a new [`GenericPulse`](@ref) by slicing another pulse between `t1` and `t2` +""" +function GenericPulse(pulse::GenericPulse, t1::Number, t2::Number) + if t1 < pulse.time[1] || t2 > pulse.time[end] + error("Cannot extrapolate GenericPulse") + end + use = t1 .<= pulse.time .<= t2 + tnew = pulse.time[use] + anew = pulse.amplitude[use] + pnew = pulse.phase[use] + @show tnew[end], anew[end] + if !(t1 ≈ tnew[1]) + pushfirst!(tnew, t1) + pushfirst!(anew, amplitude(pulse, t1)) + pushfirst!(pnew, phase(pulse, t1)) + elseif !(t2 ≈ tnew[end]) + push!(tnew, t2) + push!(anew, amplitude(pulse, t2)) + push!(pnew, phase(pulse, t2)) + end + @show tnew[end], anew[end] + return GenericPulse(tnew .- t1, anew, pnew, pulse.effective_time - t1) +end + +GenericPulse(pulse::RFPulseComponent, t1::Number, t2::Number) = GenericPulse(make_generic(pulse), t1, t2) + duration(fp::GenericPulse) = maximum(fp.time) amplitude(fp::GenericPulse) = maximum(abs.(fp.amplitude)) effective_time(pulse::GenericPulse) = pulse.time[findmax(abs.(pulse.amplitude))] diff --git a/test/test_sequences.jl b/test/test_sequences.jl index 4d94395..6f741aa 100644 --- a/test/test_sequences.jl +++ b/test/test_sequences.jl @@ -114,6 +114,10 @@ @test flip_angle(pulse) ≈ 90. @test iszero(phase(pulse)) @test isnothing(get_pulse(seq, 10.)) + gp = GenericPulse(pulse, 0., 1.) + @test gp.amplitude[1] ≈ 0. atol=1e-8 + @test gp.amplitude[end] ≈ amplitude(pulse, 1.) rtol=1e-2 + @test all(iszero.(gp.phase)) (pulse, t_pulse) = get_pulse(seq, 35.) @test 1.1 < t_pulse < 1.2 -- GitLab