A sequence property that can be constrained and/or optimised.
:duration=>"duration of the building block in ms.",
],
It acts as a function, so you can call it on a sequence or building block to get the actual values (e.g., `v(sequence)`).
:sequence=>[
It can return one of the following:
:TR=>"Time on which an MRI sequence repeats itself in ms. Defaults to the result of [`repetition_time`](@ref).",
- a number
:repetition_time=>"Time on which an MRI sequence repeats itself in ms.",
- a vector of number
:TE=>"Echo time of the sequence in ms. Defaults to the result of [`echo_time`](@ref).",
- a NamedTuple with the values for individual sequence components
:echo_time=>"Echo time of the sequence in ms.",
"""
:diffusion_time=>"Diffusion time in ms (i.e., time between start of the diffusion-weighted gradients).",
struct Variable<:AnyVariable
:Δ=>"Diffusion time in ms (i.e., time between start of the diffusion-weighted gradients). Defaults to the result of [`diffusion_time`](@ref).",
name::Symbol
:qvec=>"Net dephasing due to gradients in rad/um.",
f::Function
:area_under_curve=>"Net dephasing due to gradients in rad/um (same as [`qvec`](@ref)).",
end
:bmat=>"Full 3x3 diffusion-weighting matrix in ms/um^2.",
:bval=>"Size of diffusion-weighting in ms/um^2 (trace of [`bmat`](@ref)).",
:duration_dephase=>"Net T2' dephasing experienced over a sequence (in ms).",
:duration_transverse=>"Net T2 signal loss experienced over a sequence (in ms). This is the total duration spins spent in the transverse plane.",
:delay=>"Delay between readout and spin echo in an asymmetric spin echo in ms.",
],
:pulse=>[
:flip_angle=>"The flip angle of the RF pulse in degrees",
:amplitude=>"The maximum amplitude of an RF pulse in kHz",
:phase=>"The angle of the phase of an RF pulse in KHz",
:frequency=>"The off-resonance frequency of an RF pulse (relative to the Larmor frequency of water) in KHz",
:bandwidth=>"Bandwidth of the RF pulse in kHz. To set constraints it is often better to use [`inverse_bandwidth`](@ref).",
:inverse_bandwidth=>"Inverse of bandwidth of the RF pulse in 1/kHz. Also see [`bandwidth`](@ref).",
:N_left=>"The number of zero crossings of the RF pulse before the main peak",
:N_right=>"The number of zero crossings of the RF pulse after the main peak",
:slice_thickness=>"Slice thickness of an RF pulse that is active during a gradient in mm. To set constraints it is often better to use [`inverse_slice_thickness`](@ref).",
:inverse_slice_thickness=>"Inverse of slice thickness of an RF pulse that is active during a gradient in 1/mm. Also, see [`slice_thickness`](@ref).",
],
:gradient=>[
:qval3=>"The spatial range with orientation on which the displacements can be detected due to this gradient in rad/um (also see [`qval`](@ref)).",
:qval=>"The spatial range on which the displacements can be detected due to this gradient in rad/um. This will be a scalar if the orientation is fixed and a scalar otherwise. If you always want a vector, use [`qvec`](@ref).",
:qval_square=>"Square of [`qval`](@ref) in rad^2/um^2.",
:δ=>"Effective duration of a gradient pulse ([`rise_time`](@ref) + [`flat_time`](@ref)) in ms.",
:rise_time=>"Time for gradient pulse to reach its maximum value in ms.",
:flat_time=>"Time of gradient pulse at maximum value in ms.",
:gradient_strength=>"Vector with maximum strength of a gradient along each dimension (kHz/um)",
:slew_rate=>"Vector with maximum slew rate of a gradient along each dimension (kHz/um/ms)",
:spoiler_scale=>"Length-scale on which spins will be dephased by exactly 2π in mm.",
],
:readout=>[
:dwell_time=>"Time between two samples in an `ADC` in ms.",
:nsamples=>"Number of samples during a readout. During the optimisation this might produce non-integer values.",
:fov=>"Size of the field of view in mm. To set constraints it is often better to use [`inverse_fov`](@ref).",
:inverse_fov=>"Inverse of size of the field of view in 1/mm. Also see [`fov`](@ref).",
:voxel_size=>"Size of each voxel in mm. To set constraints it is often better to use [`inverse_voxel_size`](@ref).",
:inverse_voxel_size=>"Inverse of voxel size in 1/mm. Also see [`voxel_size`](@ref).",
:resolution=>"Number of voxels in the final readout. During the optimisation this might produce non-integer values, but this will be fixed after optimsation.",
:oversample=>"How much to oversample with ([`nsamples`](@ref) / [`resolution`](@ref))",
:ramp_overlap=>"Fraction of overlap between ADC event and underlying gradient pulse ramp (between 0 and 1)."
],
]
"""
"""
Collection of all functions that return variables that can be used to query or constrain their values.
variable_defined_for(var, Val(type))
Check whether variable is defined for a specific sub-type.
as_string=" $func_symbol($block_symbol)\n\n$description\n\nThis represents a variable within the sequence. Variables can be set during the construction of a [`AbstractBlock`](@ref) or used to create constraints after the fact."