diff --git a/src/sequence_io/pulseq_io/components.jl b/src/sequence_io/pulseq_io/components.jl index fd189e2d95ee60e73fb621d3a4bdd2655c3a32e5..252a443517fd96f53c246a2a40515792dc417cb4 100644 --- a/src/sequence_io/pulseq_io/components.jl +++ b/src/sequence_io/pulseq_io/components.jl @@ -15,13 +15,11 @@ struct PulseqComponents pulses:: Dict{Int, PulseqRFPulse} grads:: Dict{Int, AnyPulseqGradient} adc:: Dict{Int, PulseqADC} - extensions:: Dict{Int, Any} - PulseqComponents(shapes, pulses, grads, adc, extensions) = new( + PulseqComponents(shapes, pulses, grads, adc) = new( _convert_to_dict(shapes, PulseqShape), _convert_to_dict(pulses, PulseqRFPulse), _convert_to_dict(grads, AnyPulseqGradient), _convert_to_dict(adc, PulseqADC), - _convert_to_dict(extensions, Any), ) end @@ -30,21 +28,11 @@ _convert_to_dict(d::Dict{Int, T}, ::Type{T}) where {T} = d _convert_to_dict(vec::Vector, ::Type{T}) where {T} = Dict{Int, T}(i => v for (i, v) in enumerate(vec)) -""" - PulseqComponents(sequence::PulseqSequence) - -Indentifies and lists all the unique components in the sequence. -""" -function PulseqComponents(sequence::PulseqSequence) - -end - PulseqComponents() = PulseqComponents( PulseqShape[], PulseqRFPulse[], AnyPulseqGradient[], PulseqADC[], - PulseqExtension[], ) """ diff --git a/src/sequence_io/pulseq_io/extensions.jl b/src/sequence_io/pulseq_io/extensions.jl index 2984c877da57c2f48f6c287826f36f109087b48a..d8c50ce3aadce61578a8878ef60e98e5a52bb6a8 100644 --- a/src/sequence_io/pulseq_io/extensions.jl +++ b/src/sequence_io/pulseq_io/extensions.jl @@ -38,7 +38,7 @@ Get the name under which the given `obj` should be stored in a Pulseq extension. To write an object to a Pulseq file extension, one needs to define both this function and [`add_extension_definition`](@ref). """ -get_extension_name(ext::PulseqExtension{N}) where {N} = N +get_extension_name(::PulseqExtension{N}) where {N} = N """ add_extension_definition!(content::Vector{String}, obj) diff --git a/src/sequence_io/pulseq_io/parse_sections.jl b/src/sequence_io/pulseq_io/parse_sections.jl index 1c3f86b56d12d4ec2f9f51b0efda94dd6ea63915..2130db831dcb17b2afc2b2fe83637d7b01740566 100644 --- a/src/sequence_io/pulseq_io/parse_sections.jl +++ b/src/sequence_io/pulseq_io/parse_sections.jl @@ -33,9 +33,11 @@ function gen_all_sections(seq:: PulseqSequence) sections = Dict{Symbol, PulseqSection}() sections[:version] = gen_section(seq, Val(:version)) sections[:definitions] = gen_section(seq, Val(:definitions)) + (section, extension_mapping) = gen_section(seq, Val(:extensions)) + sections[:extensions] = section comp = PulseqComponents() - sections[:blocks] = gen_section(seq, comp, Val(:blocks)) + sections[:blocks] = gen_section(seq, comp, Val(:blocks), extension_mapping) for symbol in [:rf, :gradients, :trap, :adc, :shapes] sections[symbol] = gen_section(comp, Val(symbol)) end diff --git a/src/sequence_io/pulseq_io/parsers/blocks.jl b/src/sequence_io/pulseq_io/parsers/blocks.jl index f22f893a633c0e293a823adefa5a60b60505e3dc..172847ba0aa06f591d997070cd5d729f2e7d07c4 100644 --- a/src/sequence_io/pulseq_io/parsers/blocks.jl +++ b/src/sequence_io/pulseq_io/parsers/blocks.jl @@ -25,7 +25,7 @@ function parse_section(section::PulseqSection{:blocks}; version, rf=Dict(), grad return res end -function gen_section(seq::PulseqSequence, comp:: PulseqComponents, ::Val{:blocks}) +function gen_section(seq::PulseqSequence, comp:: PulseqComponents, ::Val{:blocks}, extension_mapping::Dict{Vector, Int}) res = PulseqSection{:blocks}(String[]) for (i, block) in enumerate(seq.blocks) @@ -39,9 +39,10 @@ function gen_section(seq::PulseqSequence, comp:: PulseqComponents, ::Val{:blocks ] push!(values, add_components!(comp, search_vec, part)) end - push!(values, 0) if length(block.ext) > 0 - error("Cannot write extensions yet.") + push!(values, extension_mapping[block.ext]) + else + push!(values, 0) end push!(res.content, join(string.(values), " ")) end diff --git a/src/sequence_io/pulseq_io/parsers/extensions.jl b/src/sequence_io/pulseq_io/parsers/extensions.jl index fac6d32595def5f32e8b0e38b8f3f14624666b40..9d39c8ce142a9bcd668f7fa6c8a0edf82d3593fa 100644 --- a/src/sequence_io/pulseq_io/parsers/extensions.jl +++ b/src/sequence_io/pulseq_io/parsers/extensions.jl @@ -34,10 +34,12 @@ function parse_section(section::PulseqSection{:extensions}; kwargs...) return Dict(key => get_extension_list(key) for key in keys(linked_list)) end -function gen_section(comp:: PulseqComponents, ::Val{:extensions}) +function gen_section(seq:: PulseqSequence, ::Val{:extensions}) definitions = Dict{Symbol, PulseqExtensionDefinition}() extensions_ref_id = Dict{Any, Int}() - for ext_vec in comp.extensions + + all_ext_vec = [block.ext for block in seq.blocks if length(block.ext) > 0] + for ext_vec in all_ext_vec for ext in ext_vec name = get_extension_name(ext) if !(name in keys(definitions)) @@ -58,17 +60,17 @@ function gen_section(comp:: PulseqComponents, ::Val{:extensions}) end next_id = add_extension_vec!(ext_vec[2:end]) ext = ext_vec[1] - type_id = findfirst(get_extension_name(ext), definitions_order) + type_id = findfirst(isequal(get_extension_name(ext)), definitions_order) ref_id = extensions_ref_id[ext] all_ids = (type_id, ref_id, next_id) if all_ids in labels - extension_vec_id[ext_vec] = findfirst(lables, all_ids) + extension_vec_id[ext_vec] = findfirst(isequal(all_ids), labels) else push!(labels, all_ids) - extension_vec_id[ext_vec] = length(lables) + extension_vec_id[ext_vec] = length(labels) end end - add_extension_definition!.(values(comp.extensions)) + add_extension_vec!.(all_ext_vec) content = String[] for (id0, (id1, id2, id3)) in enumerate(labels) @@ -83,5 +85,5 @@ function gen_section(comp:: PulseqComponents, ::Val{:extensions}) push!(content, "") end - return PulseqSection{:extensions}(content) + return PulseqSection{:extensions}(content), extension_vec_id end \ No newline at end of file diff --git a/src/sequence_io/pulseq_io/pulseq_io.jl b/src/sequence_io/pulseq_io/pulseq_io.jl index e2170991e9b5d1627aa7733dcfc1ccb8f0a12e9f..6eb637fa2b6654338af64ab0ea1e0aa91ea18281 100644 --- a/src/sequence_io/pulseq_io/pulseq_io.jl +++ b/src/sequence_io/pulseq_io/pulseq_io.jl @@ -38,7 +38,7 @@ function write_pulseq(io::IO, sequence::Types.PulseqSequence) error("Can only write to pulseq version 1.4 or later.") end sections = ParseSections.gen_all_sections(sequence) - for key in [:version, :definitions, :blocks, :rf, :gradients, :trap, :adc, :shapes] + for key in [:version, :definitions, :blocks, :rf, :gradients, :trap, :adc, :extensions, :shapes] if length(sections[key].content) == 0 continue end diff --git a/src/sequence_io/pulseq_io/types.jl b/src/sequence_io/pulseq_io/types.jl index d093917b74f544fd98ed3317c4ce9bc568b1bc83..d94aca9553eaeb2450eb28803b92f7e720aa06d6 100644 --- a/src/sequence_io/pulseq_io/types.jl +++ b/src/sequence_io/pulseq_io/types.jl @@ -125,7 +125,7 @@ struct PulseqBlock gy :: Union{Nothing, AnyPulseqGradient} gz :: Union{Nothing, AnyPulseqGradient} adc :: Union{Nothing, PulseqADC} - ext :: Vector{<:Tuple{PulseqExtension, Int}} + ext :: Vector end """