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