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

Add default cost functions for DWI sequence

parent 03545662
No related branches found
No related tags found
1 merge request!4Resolve "Add secondary objective function"
module DiffusionSpinEchoes module DiffusionSpinEchoes
import ...Containers: Sequence import ...Containers: Sequence
import ...Components: InstantGradient
import ...Parts: excitation_pulse, readout_event, interpret_image_size, Trapezoid, gradient_spoiler, refocus_pulse, dwi_gradients import ...Parts: excitation_pulse, readout_event, interpret_image_size, Trapezoid, gradient_spoiler, refocus_pulse, dwi_gradients
import ...Containers: start_time, end_time import ...Containers: start_time, end_time
import ...Variables: get_pulse, get_readout, get_gradient, variables, @defvar import ...Variables: get_pulse, get_readout, get_gradient, variables, @defvar, add_cost_function!
import ...Pathways: Pathway, get_pathway import ...Pathways: Pathway, get_pathway
import ...BuildSequences: build_sequence import ...BuildSequences: build_sequence
import ...Scanners: Default_Scanner, Scanner import ...Scanners: Default_Scanner, Scanner
...@@ -36,7 +37,7 @@ If image parameters are provided, this will switch to a sinc pulse and EPI reado ...@@ -36,7 +37,7 @@ If image parameters are provided, this will switch to a sinc pulse and EPI reado
- [`variables.duration`](@ref): total duration of the sequence from start of excitation pulse to end of readout or spoiler in ms. - [`variables.duration`](@ref): total duration of the sequence from start of excitation pulse to end of readout or spoiler in ms.
- [`variables.Δ`](@ref)/[`variables.diffusion_time`](@ref): Time from the start of one diffusion-weighted gradient till the other in ms. - [`variables.Δ`](@ref)/[`variables.diffusion_time`](@ref): Time from the start of one diffusion-weighted gradient till the other in ms.
""" """
function DiffusionSpinEcho(; delay=0., excitation=(), gradient=(), refocus=(), readout=(), optim=(), spoiler=nothing, resolution=nothing, fov=nothing, voxel_size=nothing, slice_thickness=nothing, scanner=Default_Scanner, variables...) function DiffusionSpinEcho(; delay=0., excitation=(), gradient=(), refocus=(), readout=(), optim=(), spoiler=nothing, resolution=nothing, fov=nothing, voxel_size=nothing, slice_thickness=nothing, scanner=Default_Scanner, vars...)
build_sequence(scanner; optim...) do build_sequence(scanner; optim...) do
(slice_thickness, _, extra_readout_params) = interpret_image_size(fov, resolution, voxel_size, slice_thickness) (slice_thickness, _, extra_readout_params) = interpret_image_size(fov, resolution, voxel_size, slice_thickness)
(g1, g2) = dwi_gradients(; gradient...) (g1, g2) = dwi_gradients(; gradient...)
...@@ -50,11 +51,20 @@ function DiffusionSpinEcho(; delay=0., excitation=(), gradient=(), refocus=(), r ...@@ -50,11 +51,20 @@ function DiffusionSpinEcho(; delay=0., excitation=(), gradient=(), refocus=(), r
:gradient2 => g2, :gradient2 => g2,
nothing, nothing,
:readout => readout_event(; extra_readout_params..., readout...), :readout => readout_event(; extra_readout_params..., readout...),
nothing,
] ]
if !isnothing(spoiler) if !isnothing(spoiler)
push!(parts, gradient_spoiler(; spoiler...)) push!(parts, gradient_spoiler(; spoiler...))
end end
return Sequence(parts; name=:DiffusionSpinEcho, delay=delay, variables...) seq = Sequence(parts; name=:DiffusionSpinEcho, delay=delay, vars...)
if g1 isa InstantGradient
add_cost_function!((variables.duration(seq[2]) - variables.duration(seq[4]))^2)
add_cost_function!((variables.duration(seq[6]) - variables.duration(seq[8]))^2)
else
add_cost_function!(variables.duration(seq[6]) + variables.duration(seq[7]))
end
return seq
end end
end end
......
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