diff --git a/src/sequence_io/pulseq.jl b/src/sequence_io/pulseq.jl index e9ddb0920f702b9d5e00ed2d6c2489c41e679df5..c8d355c24b1f05f4999e4fd9d60c022374ecc0b5 100644 --- a/src/sequence_io/pulseq.jl +++ b/src/sequence_io/pulseq.jl @@ -129,8 +129,8 @@ function PulseqBlock(block::BaseBuildingBlock; BlockDurationRaster, AdcRasterTim ext = [] for (key, event) in events(block) gen = make_generic(event) - if event isa InstantPulse - push!(ext, (Int(div(start_time(block, key), 1e-3, RoundNearest)), event)) + if event isa Union{InstantPulse, InstantGradient} + push!(ext, (start_time(block, key), event)) elseif event isa RFPulseComponent if !isnothing(rf) error("Pulseq does not support a single building block containing multiple RF pulses.") @@ -197,10 +197,35 @@ end get_extension_name(::Tuple{<:Number, InstantPulse}) = :InstantPulse -function add_extension_definition!(content::Vector{String}, obj::Tuple{Int, InstantPulse}) +function add_extension_definition!(content::Vector{String}, obj::Tuple{Number, InstantPulse}) to_store = (obj[1], obj[2].flip_angle, obj[2].phase) for line in content - (id, this_line...) = parse.((Int, Int, Float64, Float64), split(line)) + (id, this_line...) = parse.((Int, Float64, Float64, Float64), split(line)) + if all(to_store .≈ this_line) + return id + end + end + push!(content, "$(length(content) + 1) " * join(string.(to_store), " ")) + return length(content) +end + + +# I/O of InstantGradient +function parse_extension(ext::PulseqExtensionDefinition{:InstantGradient}) + mapping = Dict{Int, InstantGradient}() + for line in ext.content + (id, delay, qvec...) = parse.((Int, Float64, Float64, Float64, Float64), split(line)) + mapping[id] = (delay, InstantGradient3D([qvec...], nothing)) + end + return mapping +end + +get_extension_name(::Tuple{<:Number, <:InstantGradient}) = :InstantGradient + +function add_extension_definition!(content::Vector{String}, obj::Tuple{<:Number, <:InstantGradient}) + to_store = (obj[1], variables.qvec(obj[2])...) + for line in content + (id, this_line...) = parse.((Int, Float64, Float64, Float64, Float64), split(line)) if all(to_store .≈ this_line) return id end