Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion KomaMRIFiles/Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "KomaMRIFiles"
uuid = "fcf631a6-1c7e-4e88-9e64-b8888386d9dc"
authors = ["Carlos Castillo Passi <cncastillo@uc.cl>"]
version = "0.9.4"
version = "0.9.5"

[deps]
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
Expand Down
56 changes: 28 additions & 28 deletions KomaMRIFiles/src/Sequence/Pulseq.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,22 @@ read_version Read the [VERSION] section of a sequence file.
identifier of an open MR sequence file and return it
"""
function read_version(io)
major = @scanf(readline(io), "major %i", Int)[end]
minor = @scanf(readline(io), "minor %i", Int)[end]
revision = @scanf(readline(io), "revision %i", Int)[end]

version_combined = 1_000_000*major+1_000*minor+revision

@assert major == 1 "Unsupported version_major $major"
if version_combined < 1002000
@error "Unsupported version $major.$minor.$revision, only file format revision 1.2.0 and above are supported"
elseif version_combined < 1003001
@warn "Loading older Pulseq format file (version $major.$minor.$revision) some code may not function as expected"
pulseq_version = VersionNumber(
@scanf(readline(io), "major %i", Int)[end],
@scanf(readline(io), "minor %i", Int)[end],
@scanf(readline(io), "revision %i", Int)[end],
)

@assert pulseq_version.major == 1 "Unsupported version_major $(pulseq_version.major)"
if pulseq_version < v"1.2.0"
@error "Unsupported Pulseq $(pulseq_version), only file format revision 1.2.0 and above are supported"
elseif pulseq_version < v"1.3.1"
@warn "Loading older Pulseq $(pulseq_version); some code may not function as expected"
elseif pulseq_version >= v"1.5.0"
@warn "Pulseq $(pulseq_version) not yet supported by this KomaMRIFiles release. Track progress at https://github.com/JuliaHealth/KomaMRI.jl/pull/614"
end

major, minor, revision, version_combined
pulseq_version
end

"""
Expand Down Expand Up @@ -76,12 +78,12 @@ read_blocks Read the [BLOCKS] section of a sequence file.
library=read_blocks(fid) Read blocks from file identifier of an
open MR sequence file and return the event table.
"""
function read_blocks(io, blockDurationRaster, version_combined)
function read_blocks(io, blockDurationRaster, pulseq_version)
eventTable = Dict{Int64, Vector{Int64}}()
blockDurations = Dict{Int64, Float64}()
delayIDs_tmp = Dict{Int64, Float64}()
while true
if version_combined <= 1002001
if pulseq_version <= v"1.2.1"
NumberBlockEvents = 7
else
NumberBlockEvents = 8
Expand All @@ -92,13 +94,13 @@ function read_blocks(io, blockDurationRaster, version_combined)
blockEvents = parse.(Int64, split(read_event))

if blockEvents[1] != 0
if version_combined <= 1002001
if pulseq_version <= v"1.2.1"
eventTable[blockEvents[1]] = Int64[0; blockEvents[3:end]...; 0]
else
eventTable[blockEvents[1]] = Int64[0; blockEvents[3:end]...]
end

if version_combined >= 1004000
if pulseq_version >= v"1.4.0"
blockDurations[blockEvents[1]] = blockEvents[2]*blockDurationRaster
else
delayIDs_tmp[blockEvents[1]] = blockEvents[2]
Expand Down Expand Up @@ -375,9 +377,7 @@ julia> plot_seq(seq)
"""
function read_seq(filename)
@info "Loading sequence $(basename(filename)) ..."
version_combined = 0
version_major = 0
version_minor = 0
pulseq_version = v"0.0.0"
gradLibrary = Dict()
def = Dict()
signature = ""
Expand All @@ -403,21 +403,21 @@ function read_seq(filename)
elseif section == "[DEFINITIONS]"
def = read_definitions(io)
elseif section == "[VERSION]"
version_major, version_minor, _, version_combined = read_version(io)
pulseq_version = read_version(io)
elseif section == "[BLOCKS]"
if version_combined == 0
if pulseq_version == v"0.0.0"
@error "Pulseq file MUST include [VERSION] section prior to [BLOCKS] section"
end
blockEvents, blockDurations, delayInd_tmp = read_blocks(io, def["BlockDurationRaster"], version_combined)
blockEvents, blockDurations, delayInd_tmp = read_blocks(io, def["BlockDurationRaster"], pulseq_version)
elseif section == "[RF]"
if version_combined >= 1004000
if pulseq_version >= v"1.4.0"
rfLibrary = read_events(io, [1/γ 1 1 1 1e-6 1 1]) # this is 1.4.x format
else
rfLibrary = read_events(io, [1/γ 1 1 1e-6 1 1]) # this is 1.3.x and below
# we will have to scan through the library later after all the shapes have been loaded
end
elseif section == "[GRADIENTS]"
if version_combined >= 1004000
if pulseq_version >= v"1.4.0"
gradLibrary = read_events(io, [1/γ 1 1 1e-6]; type='g', eventLibrary=gradLibrary) # this is 1.4.x format
else
gradLibrary = read_events(io, [1/γ 1 1e-6]; type='g', eventLibrary=gradLibrary) # this is 1.3.x and below
Expand All @@ -427,12 +427,12 @@ function read_seq(filename)
elseif section == "[ADC]"
adcLibrary = read_events(io, [1 1e-9 1e-6 1 1])
elseif section == "[DELAYS]"
if version_combined >= 1004000
if pulseq_version >= v"1.4.0"
@error "Pulseq file revision 1.4.0 and above MUST NOT contain [DELAYS] section"
end
tmp_delayLibrary = read_events(io, 1e-6);
elseif section == "[SHAPES]"
shapeLibrary = read_shapes(io, (version_major==1 && version_minor<4))
shapeLibrary = read_shapes(io, (pulseq_version.major == 1 && pulseq_version.minor < 4))
elseif section == "[EXTENSIONS]"
extensionLibrary = read_extension_blocks(io)
elseif section == "[SIGNATURE]"
Expand Down Expand Up @@ -465,7 +465,7 @@ function read_seq(filename)
end
end
# fix blocks, gradients and RF objects imported from older versions
if version_combined < 1004000
if pulseq_version < v"1.4.0"
# scan through the RF objects
for i = 0:length(rfLibrary)-1
rfLibrary[i]["data"] = [rfLibrary[i]["data"][1:3]' 0.0 rfLibrary[i]["data"][4:end]']
Expand Down Expand Up @@ -531,7 +531,7 @@ function read_seq(filename)
seq.DEF = merge(obj["definitions"], seq.DEF)
# Koma specific details for reconstrucion
seq.DEF["FileName"] = basename(filename)
seq.DEF["PulseqVersion"] = version_combined
seq.DEF["PulseqVersion"] = pulseq_version
seq.DEF["signature"] = signature
# Guessing recon dimensions
seq.DEF["Nx"] = get(seq.DEF, "Nx", maximum(adc.N for adc = seq.ADC))
Expand Down
8 changes: 4 additions & 4 deletions KomaMRIFiles/test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,22 @@ using TestItems, TestItemRunner, KomaMRIBase
pth = @__DIR__
seq = @suppress read_seq(pth*"/test_files/epi.seq") #Pulseq v1.4.0, RF arbitrary
@test seq.DEF["FileName"] == "epi.seq"
@test seq.DEF["PulseqVersion"] 1004000
@test seq.DEF["PulseqVersion"] == v"1.4.0"
@test seq.DEF["signature"] == "67ebeffe6afdf0c393834101c14f3990"

seq = @suppress read_seq(pth*"/test_files/spiral.seq") #Pulseq v1.4.0, RF arbitrary
@test seq.DEF["FileName"] == "spiral.seq"
@test seq.DEF["PulseqVersion"] 1004000
@test seq.DEF["PulseqVersion"] == v"1.4.0"
@test seq.DEF["signature"] == "efc5eb7dbaa82aba627a31ff689c8649"

seq = @suppress read_seq(pth*"/test_files/epi_JEMRIS.seq") #Pulseq v1.2.1
@test seq.DEF["FileName"] == "epi_JEMRIS.seq"
@test seq.DEF["PulseqVersion"] 1002001
@test seq.DEF["PulseqVersion"] == v"1.2.1"
@test seq.DEF["signature"] == "f291a24409c3e8de01ddb93e124d9ff2"

seq = @suppress read_seq(pth*"/test_files/radial_JEMRIS.seq") #Pulseq v1.2.1
@test seq.DEF["FileName"] == "radial_JEMRIS.seq"
@test seq.DEF["PulseqVersion"] 1002001
@test seq.DEF["PulseqVersion"] == v"1.2.1"
@test seq.DEF["signature"] == "e827cfff4436b65a6341a4fa0f6deb07"

# Test Pulseq compression-decompression
Expand Down
Loading