diff --git a/src/containers/building_blocks.jl b/src/containers/building_blocks.jl index 4b59f4ba210678174b60e8ae0deb693e19e20472..7c3635ddfb6fbb6cecf50e613d02ff979fec244a 100644 --- a/src/containers/building_blocks.jl +++ b/src/containers/building_blocks.jl @@ -242,7 +242,7 @@ end function gradient_strength(bb::BaseBuildingBlock, time::Number) for (key, block) in waveform_sequence(bb) - if start_time(bb, key) <= time <= end_time(bb, key) + if (start_time(bb, key) <= time <= end_time(bb, key)) || (time ≈ end_time(bb, key)) return gradient_strength(block, time - start_time(bb, key)) end end diff --git a/src/containers/linearise.jl b/src/containers/linearise.jl index 530a987fb8cd55dbe967cb5b56699b16fa80b2a4..826c4de92c27a779f1ad35f714323cd12409e710 100644 --- a/src/containers/linearise.jl +++ b/src/containers/linearise.jl @@ -32,18 +32,32 @@ end function SequencePart(sequence::BaseSequence{N}, time1::Number, time2::Number) where {N} + if -1e-9 < time1 < 0. + time1 = 0. + end + if time2 > duration(sequence) && time2 ≈ duration(sequence) + time2 = duration(sequence) + end if !(0 <= time1 <= time2 <= duration(sequence)) error("Sequence timings are out of bound") end + tmean = (time1 + time2) / 2 for key in 1:N - if (end_time(sequence, key) > time1) + if (end_time(sequence, key) > tmean) return SequencePart(sequence[key], time1 - start_time(sequence, key), time2 - start_time(sequence, key)) end end end function SequencePart(bb::BaseBuildingBlock, time1::Number, time2::Number) + if -1e-9 < time1 < 0. + time1 = 0. + end + if time2 > duration(bb) && time2 ≈ duration(bb) + time2 = duration(bb) + end if !(0 <= time1 <= time2 <= duration(bb)) + @show bb time1 time2 duration(bb) error("Sequence timings are out of bound") end @@ -80,12 +94,10 @@ The split times will include any time when: Continuous gradient waveforms or RF pulses might be split up further to ensure the linear approximations meet the required `precision` (see [`split_timestep`](@ref)). """ -function split_times(sequence::BaseSequence; precision=0.01) +function split_times(sequence::BaseSequence{N}; precision=0.01) where {N} splits = Float64[] - start_time = 0. - for block in sequence - append!(splits, start_time .+ split_times(block; precision=precision)) - start_time += duration(block) + for key in 1:N + append!(splits, start_time(sequence, key) .+ split_times(sequence[key]; precision=precision)) end return sort(unique(splits)) end