diff --git a/src/gradients/fixed_gradients.jl b/src/gradients/fixed_gradients.jl index a1c46fe2cf939e7c7256b85afb8316286c3001f2..cfe3e17f33db25dfed15ab04bff5c8b07bf27c97 100644 --- a/src/gradients/fixed_gradients.jl +++ b/src/gradients/fixed_gradients.jl @@ -1,6 +1,6 @@ module FixedGradients -import ...BuildingBlock: GradientBlock +import ...BuildingBlock: GradientBlock, fixed import ...Variables: variables, duration, qval diff --git a/src/pulses/constant_pulses.jl b/src/pulses/constant_pulses.jl index 136a1b472858f9e922a6f912a099b47cccf7363e..15b40f3dc84eff2567758208a2a3795715790e11 100644 --- a/src/pulses/constant_pulses.jl +++ b/src/pulses/constant_pulses.jl @@ -1,9 +1,10 @@ module ConstantPulses import JuMP: VariableRef, @constraint, @variable, value, Model -import ...BuildingBlocks: RFPulseBlock, set_simple_constraints! +import ...BuildingBlocks: RFPulseBlock, set_simple_constraints!, fixed import ...ConcreteBlocks: ConcreteBlock, to_concrete_block import ...Variables: variables, get_free_variable, flip_angle, phase, amplitude, frequency, bandwidth, start_time, end_time, VariableType, duration import ...BuildSequences: @global_model_constructor +import ..FixedPulses: FixedPulse """ ConstantPulse(; variables...) @@ -46,14 +47,14 @@ bandwidth(pulse::ConstantPulse) = 3.79098854 / duration(pulse) variables(::Type{<:ConstantPulse}) = [amplitude, duration, phase, frequency, flip_angle, bandwidth] -function to_concrete_block(block::ConstantPulse) +function fixed(block::ConstantPulse) d = value(duration(block)) - final_phase = value(phase(block)) + d * value(frequency(block)) * 360 - return ConcreteBlock(value(duration(block)), pulse=[ - ([0., d]), + final_phase = phase(block) + d * frequency(block) * 360 + return FixedPulse( + [0., d], value.([amplitude(block), amplitude(block)]), - value.([phase(block), final_phase]) - ]) + value.([phase(block), final_phase]), + ) end diff --git a/src/pulses/fixed_pulses.jl b/src/pulses/fixed_pulses.jl index a1e1ddb065af06c9296bad9b7e2dad27465ee098..f2740fc7984801f6b3d5cda7b3e44b5b85ee19b2 100644 --- a/src/pulses/fixed_pulses.jl +++ b/src/pulses/fixed_pulses.jl @@ -1,6 +1,6 @@ module FixedPulses -import ...BuildingBlock: PulseBlock +import ...BuildingBlock: PulseBlock, fixed import ...Variables: variables, duration @@ -32,8 +32,24 @@ end variables(::Type{<:FixedPulse}) = [] -duration(fg::FixedPulse) = maximum(fg.time) +duration(fp::FixedPulse) = maximum(fp.time) + +Base.show(io::IO, fp::FixedPulse) = print(io, "FixedPulse for $(duration(fp)) ms") + + +""" + FixedInstantPulse(flip_angle, phase) + +Fixed version of `InstantRFPulseBlock`, where both `flip_angle` and `phase` are actual numbers. +""" +struct FixedInstantPulse <: PulseBlock + flip_angle :: Number + phase :: Number +end + +duration(fip::FixedInstantPulse) = 0. + +fixed(fp::Union{FixedPulse, FixedInstantPulse}) = fp -Base.show(io::IO, fb::FixedPulse) = print(io, "FixedPulse for $(duration(fb)) ms") end diff --git a/src/pulses/instant_pulses.jl b/src/pulses/instant_pulses.jl index 06191851cd25515d916e932931cba6dfccb7eede..8a19599cf698cfdae32ced356d6a236e0bfffba5 100644 --- a/src/pulses/instant_pulses.jl +++ b/src/pulses/instant_pulses.jl @@ -1,9 +1,10 @@ module InstantPulses import JuMP: @constraint, @variable, VariableRef, value, Model -import ...BuildingBlocks: RFPulseBlock +import ...BuildingBlocks: RFPulseBlock, fixed import ...ConcreteBlocks: to_concrete_block, AbstractConcreteBlock import ...Variables: flip_angle, phase, start_time, variables, duration, get_free_variable, VariableType import ...BuildSequences: @global_model_constructor +import ..FixedPulses: FixedInstantPulse struct InstantRFPulseBlock <: RFPulseBlock model :: Model @@ -29,20 +30,8 @@ duration(instant::InstantRFPulseBlock) = 0. variables(::Type{<:InstantRFPulseBlock}) = [flip_angle, phase] -""" - ConcreteInstantRFPulse(flip_angle, phase) - -Instantaneous RF pulse with no free variables. - -See [`InstantRFPulseBlock`](@ref) for a version where [`flip_angle`](@ref) and [`phase`](@ref) are variables. -""" -struct ConcreteInstantRFPulse <: AbstractConcreteBlock - flip_angle :: Number - phase :: Number -end - -function to_concrete_block(block::InstantRFPulseBlock) - return ConcreteInstantRFPulse(value(flip_angle(block)), value(phase(block))) +function fixed(block::InstantRFPulseBlock) + return FixedInstantPulse(value(flip_angle(block)), value(phase(block))) end end \ No newline at end of file diff --git a/src/pulses/pulses.jl b/src/pulses/pulses.jl index 51db27d14564b39c362a7bcbbddbfd914f10a36b..8b8152ed5209d3bbb7cf751c16dc0cea321fd810 100644 --- a/src/pulses/pulses.jl +++ b/src/pulses/pulses.jl @@ -4,9 +4,9 @@ include("constant_pulses.jl") include("sinc_pulses.jl") include("fixed_pulses.jl") +import .FixedPulses: FixedPulse import .InstantPulses: InstantRFPulseBlock import .ConstantPulses: ConstantPulse import .SincPulses: SincPulse -import .FixedPulses: FixedPulse end \ No newline at end of file diff --git a/src/pulses/sinc_pulses.jl b/src/pulses/sinc_pulses.jl index 85f3bc495dfbded3d9da89b0439c56e185970fdf..78384f4e4bc7ded6d237ba0f1d75204666f58a85 100644 --- a/src/pulses/sinc_pulses.jl +++ b/src/pulses/sinc_pulses.jl @@ -3,10 +3,11 @@ module SincPulses import JuMP: VariableRef, @constraint, @variable, value, Model import QuadGK: quadgk import Polynomials: fit, Polynomial -import ...BuildingBlocks: RFPulseBlock, set_simple_constraints! +import ...BuildingBlocks: RFPulseBlock, set_simple_constraints!, fixed import ...ConcreteBlocks: ConcreteBlock, to_concrete_block import ...Variables: flip_angle, phase, amplitude, frequency, bandwidth, VariableType, variables, get_free_variable, duration import ...BuildSequences: @global_model_constructor +import ..FixedPulses: FixedPulse """ SincPulse(; symmetric=true, max_Nlobes=nothing, apodise=true, variables...) @@ -102,15 +103,12 @@ lobe_duration(pulse::SincPulse) = pulse.lobe_duration bandwidth(pulse::SincPulse) = 1 / lobe_duration(pulse) variables(::Type{<:SincPulse}) = [amplitude, N_left, N_right, duration, phase, frequency, flip_angle, lobe_duration, bandwidth] -function to_concrete_block(block::SincPulse) +function fixed(block::SincPulse) normed_times = -value(N_left(block)):0.1:value(N_right(block)) + 1e-5 times = ((normed_times .+ value(N_left(block))) .* value(lobe_duration(block))) amplitudes = value(amplitude(block)) .* (normalised_function.(normed_times; apodise=block.apodise)) phases = (value(frequency(block)) .* value(lobe_duration(block))) .* normed_times * 360 - return ConcreteBlock( - value(duration(block)); - pulse=(times, amplitudes, phases) - ) + return FixedPulse(times, amplitudes, phases) end end \ No newline at end of file