Skip to content
Snippets Groups Projects
Unverified Commit ecb521aa authored by Michiel Cottaar's avatar Michiel Cottaar
Browse files

ENH: add compression to pulseq output

parent f1f72c94
No related branches found
No related tags found
1 merge request!17Compressed pulseq
struct CompressedPulseqShape
num :: Int
samples :: Vector{Float64}
samples :: Vector{Number}
end
......@@ -57,14 +57,47 @@ function uncompress(compressed::CompressedPulseqShape)
return PulseqShape(amplitudes)
end
function compress(shape::PulseqShape)
amplitudes = shape.samples
derivative = amplitudes[2:end] - amplitudes[1:end-1]
current_value = amplitudes[1]
compressed = Number[amplitudes[1]]
nrepeats = -1
for sample in derivative
if sample current_value
nrepeats += 1
if iszero(nrepeats)
push!(compressed, current_value)
end
else
if nrepeats != -1
push!(compressed, nrepeats)
nrepeats = -1
end
current_value = sample
push!(compressed, current_value)
end
end
if nrepeats >= 0
push!(compressed, nrepeats)
end
if length(compressed) >= length(amplitudes)
return CompressedPulseqShape(length(amplitudes), amplitudes)
else
return CompressedPulseqShape(length(amplitudes), compressed)
end
end
function gen_section(comp:: PulseqComponents, ::Val{:shapes})
res = PulseqSection{:shapes}(String[])
for index in sort([keys(comp.shapes)...])
shape = comp.shapes[index]
shape = compress(comp.shapes[index])
append!(res.content, [
"",
"shape_id $index",
"num_samples $(length(shape.samples))"
"num_samples $(shape.num)"
])
for sample in shape.samples
push!(res.content, string(sample))
......
......@@ -128,4 +128,20 @@
end
end
end
@testset "Test Pulseq shape compression" begin
import MRIBuilder.SequenceIO.PulseqIO.Parsers: compress, uncompress
import MRIBuilder.SequenceIO.PulseqIO.Types: PulseqShape
for (amplitudes, result) in [
([0., 0.1, 0.25, 0.5, ones(7)..., 0.75, 0.5, 0.25, 0.], [0., 0.1, 0.15, 0.25, 0.5, 0., 0., 4, -0.25, -0.25, 2]),
(zeros(100), [0., 0., 98]),
(ones(100), [1., 0., 0., 97]),
]
shape = PulseqShape(amplitudes)
res = compress(shape)
@test res.num == length(amplitudes)
@test all(res.samples == result)
@test all(uncompress(res).samples == amplitudes)
end
end
end
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment