From 4be0ee7f135598dc5d380176bebd2f81b3feb132 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" <documenter@juliadocs.github.io> Date: Fri, 18 Oct 2024 15:04:07 +0100 Subject: [PATCH] build based on 232eca2 --- dev/.documenter-siteinfo.json | 2 +- dev/adjust_sequences/index.html | 2 +- dev/api/index.html | 18 +++++++++--------- dev/defining_sequence/index.html | 6 +++--- dev/dwi_1_80_min_2_15.png | Bin 29805 -> 29811 bytes dev/dwi_1_80_min_2_15_epi.png | Bin 39153 -> 39114 bytes dev/implemented_sequences/index.html | 2 +- dev/index.html | 2 +- dev/objects.inv | Bin 4280 -> 4280 bytes dev/scanners/index.html | 4 ++-- dev/sequence_optimisation/index.html | 4 ++-- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index 25739b9..31067f8 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-10-18T14:27:28","documenter_version":"1.7.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-10-18T15:04:00","documenter_version":"1.7.0"}} \ No newline at end of file diff --git a/dev/adjust_sequences/index.html b/dev/adjust_sequences/index.html index eaf3998..fd90ac1 100644 --- a/dev/adjust_sequences/index.html +++ b/dev/adjust_sequences/index.html @@ -1,4 +1,4 @@ <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Post-hoc adjustments · MRIBuilder.jl</title><meta name="title" content="Post-hoc adjustments · MRIBuilder.jl"/><meta property="og:title" content="Post-hoc adjustments · MRIBuilder.jl"/><meta property="twitter:title" content="Post-hoc adjustments · MRIBuilder.jl"/><meta name="description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="twitter:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/adjust_sequences/"/><meta property="twitter:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/adjust_sequences/"/><link rel="canonical" href="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/adjust_sequences/"/><script data-outdated-warner src="../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../search_index.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href="../">MRIBuilder.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../sequence_optimisation/">Optimisation</a></li><li><a class="tocitem" href="../implemented_sequences/">Implemented sequences</a></li><li><a class="tocitem" href="../defining_sequence/">Defining sequences</a></li><li class="is-active"><a class="tocitem" href>Post-hoc adjustments</a><ul class="internal"><li><a class="tocitem" href="#Post-hoc-adjustments-API"><span>Post-hoc adjustments API</span></a></li></ul></li><li><a class="tocitem" href="../scanners/">Scanners</a></li><li><a class="tocitem" href="../api/">Internal API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Post-hoc adjustments</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Post-hoc adjustments</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl" title="View the repository"><span class="docs-icon fa-brands">ï¡</span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/main/docs/src/adjust_sequences.md" title="Edit source"><span class="docs-icon fa-solid">ï„</span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="adjust_sequences"><a class="docs-heading-anchor" href="#adjust_sequences">Post-hoc adjustment of sequences</a><a id="adjust_sequences-1"></a><a class="docs-heading-anchor-permalink" href="#adjust_sequences" title="Permalink"></a></h1><p>Typically a sequence is repeated for multiple <a href="@ref"><code>repetition_time</code></a> (<a href="@ref"><code>TR</code></a>) to allow the acquisition of multiple k-space lines, slice selection, or other sequence parameters (e.g., varying diffusion-weighting parameters for <a href="../implemented_sequences/#MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}"><code>DiffusionSpinEcho</code></a>). MRIBuilder supports this by allowing the creation of a longer sequence out of multiple repeats of a base sequence with some minor alterations.</p><p>To support post-hoc alterations, each RF pulse or gradient waveform in the sequence can be given a label. Some commonly-used labels in MRIBuilder are:</p><ul><li><code>:diffusion</code> used for diffusion-weighted gradients produced by <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.dwi_gradients-Tuple{}"><code>dwi_gradients</code></a>.</li><li><code>:FOV</code> used for gradients that should align with the field-of-view (slice-select gradients in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}"><code>excitation_pulse</code></a> or <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.refocus_pulse-Tuple{}"><code>refocus_pulse</code></a> and readout gradients in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>readout_event</code></a>).</li></ul><p>Post-hoc alterations can be applied to gradients or RF pulses with a specific labels (or to all gradients/RF pulses) using <a href="#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust</code></a>. Some example usages are:</p><ul><li>Reduce the RF pulse amplitude by 20% (e.g., to model the effect of transmit bias field): <code>adjust(sequence, pulse=(scale=0.8, ))</code></li><li>Repeat sequence 2 times with different diffusion-weighted gradient orientations (x- and y-direction) and gradient strength reduced by 30%: <code>adjust(sequence, diffusion=(orientation=[[1., 0., 0], [0., 1., 0.]], scale=0.7))</code></li><li>Repeat the sequence by shifting the excited slice by the given number of millimetres in the slice-select direction: <code>adjust(sequence, FOV=(shift=[-7.5, -2.5, 2.5, 7.5, -5., 0., 5., 10.]))</code>. These shifts represent an interleaved acquisition scheme, where the acquired slices/bands are 2.5 mm apart.</li><li>Rotations defined using the <a href="https://github.com/JuliaGeometry/Rotations.jl"><code>Rotations.jl</code></a> package can be applied to gradient orientations or the field of view. For example, to rotate the field of view by 45 degrees around the y-axis:</li></ul><pre><code class="language-julia hljs">using Rotations rotation = Rotations.AngleAxis(deg2rad(45), 0., 1., 0.) -adjust(sequence, FOV=(rotation=rotation, ))</code></pre><p>When repeating the same sequence, a spoiler gradient and/or dead time can be added in between each pair of repeats by supplying the appropriate keywords to the <code>merge</code> parameter in <a href="#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust</code></a> (e.g., <code>merge=(wait_time=10., )</code>). These parameters are described in more detail in <a href="#MRIBuilder.PostHoc.merge_sequences-Tuple{Vararg{Sequence}}"><code>merge_sequences</code></a>.</p><h2 id="Post-hoc-adjustments-API"><a class="docs-heading-anchor" href="#Post-hoc-adjustments-API">Post-hoc adjustments API</a><a id="Post-hoc-adjustments-API-1"></a><a class="docs-heading-anchor-permalink" href="#Post-hoc-adjustments-API" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.PostHoc" href="#MRIBuilder.PostHoc"><code>MRIBuilder.PostHoc</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Define post-fitting adjustments of the sequences</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/post_hoc.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.PostHoc.merge_sequences-Tuple{Vararg{Sequence}}" href="#MRIBuilder.PostHoc.merge_sequences-Tuple{Vararg{Sequence}}"><code>MRIBuilder.PostHoc.merge_sequences</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">merge_sequences(sequences...; wait_time=0.)</code></pre><p>Merge multiple sequences together.</p><p>Sequences will be run one after each other with <code>wait_time</code> in between.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/post_hoc.jl#L141-L147">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}" href="#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>MRIBuilder.Variables.adjust</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">adjust(block; kwargs...)</code></pre><p>Generate one or more new sequences/building_blocks/components with some post-fitting adjustments.</p><p>The following adjustments are allowed:</p><ul><li>for MR gradients<ul><li><code>orientation</code>: set the orientation to a given vector.</li><li><code>rotation</code>: rotate the gradient orientations using a rotations from <a href="https://juliageometry.github.io/Rotations.jl/stable/"><code>Rotations.jl</code></a>.</li><li><code>scale</code>: multiply the gradient strength by the given value. Note that if you use a value not between -1 and 1 you might break the scanner's maximum gradient or slew rate.</li></ul></li><li>for RF pulses:<ul><li><code>frequency</code>: shift the off-resonance frequency by the given value (in kHz).</li><li><code>scale</code>: multiply the RF pulse amplitude by the given value (used to model the B1 transmit field).</li></ul></li></ul><p>A vector of multiple values can be passed on to any of these in order to create multiple sequences with different adjustments. The will usually be merged together. You can get the individual sequences by passing on <code>merge=false</code>. The time between these repeated sequences can be adjusted using the keywords described in <a href="#MRIBuilder.PostHoc.merge_sequences-Tuple{Vararg{Sequence}}"><code>merge_sequences</code></a> passed on to the merge keyword: e.g., <code>merge=(wait_time=10, )</code> adds a wait time of 10 ms between each repeated sequence.</p><p>Specific sequence components that can be adjusted are identified by their <code>group</code> name. For example, <code>adjust(sequence, diffusion=(orientation=[0, 1, 0], ))</code> will set any gradient in the group <code>:diffusion</code> to point in the y-direction.</p><p>To affect all gradients or pulses, use <code>gradient=</code> or <code>pulse</code>, e.g. <code>adjust(sequence, pulse=(scale=0.5, ))</code> will divide the amplitude of all RV pulses by two.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/post_hoc.jl#L12-L37">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../defining_sequence/">« Defining sequences</a><a class="docs-footer-nextpage" href="../scanners/">Scanners »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 14:27">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> +adjust(sequence, FOV=(rotation=rotation, ))</code></pre><p>When repeating the same sequence, a spoiler gradient and/or dead time can be added in between each pair of repeats by supplying the appropriate keywords to the <code>merge</code> parameter in <a href="#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust</code></a> (e.g., <code>merge=(wait_time=10., )</code>). These parameters are described in more detail in <a href="#MRIBuilder.PostHoc.merge_sequences-Tuple{Vararg{Sequence}}"><code>merge_sequences</code></a>.</p><h2 id="Post-hoc-adjustments-API"><a class="docs-heading-anchor" href="#Post-hoc-adjustments-API">Post-hoc adjustments API</a><a id="Post-hoc-adjustments-API-1"></a><a class="docs-heading-anchor-permalink" href="#Post-hoc-adjustments-API" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.PostHoc" href="#MRIBuilder.PostHoc"><code>MRIBuilder.PostHoc</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Define post-fitting adjustments of the sequences</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/post_hoc.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.PostHoc.merge_sequences-Tuple{Vararg{Sequence}}" href="#MRIBuilder.PostHoc.merge_sequences-Tuple{Vararg{Sequence}}"><code>MRIBuilder.PostHoc.merge_sequences</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">merge_sequences(sequences...; wait_time=0.)</code></pre><p>Merge multiple sequences together.</p><p>Sequences will be run one after each other with <code>wait_time</code> in between.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/post_hoc.jl#L141-L147">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}" href="#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>MRIBuilder.Variables.adjust</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">adjust(block; kwargs...)</code></pre><p>Generate one or more new sequences/building_blocks/components with some post-fitting adjustments.</p><p>The following adjustments are allowed:</p><ul><li>for MR gradients<ul><li><code>orientation</code>: set the orientation to a given vector.</li><li><code>rotation</code>: rotate the gradient orientations using a rotations from <a href="https://juliageometry.github.io/Rotations.jl/stable/"><code>Rotations.jl</code></a>.</li><li><code>scale</code>: multiply the gradient strength by the given value. Note that if you use a value not between -1 and 1 you might break the scanner's maximum gradient or slew rate.</li></ul></li><li>for RF pulses:<ul><li><code>frequency</code>: shift the off-resonance frequency by the given value (in kHz).</li><li><code>scale</code>: multiply the RF pulse amplitude by the given value (used to model the B1 transmit field).</li></ul></li></ul><p>A vector of multiple values can be passed on to any of these in order to create multiple sequences with different adjustments. The will usually be merged together. You can get the individual sequences by passing on <code>merge=false</code>. The time between these repeated sequences can be adjusted using the keywords described in <a href="#MRIBuilder.PostHoc.merge_sequences-Tuple{Vararg{Sequence}}"><code>merge_sequences</code></a> passed on to the merge keyword: e.g., <code>merge=(wait_time=10, )</code> adds a wait time of 10 ms between each repeated sequence.</p><p>Specific sequence components that can be adjusted are identified by their <code>group</code> name. For example, <code>adjust(sequence, diffusion=(orientation=[0, 1, 0], ))</code> will set any gradient in the group <code>:diffusion</code> to point in the y-direction.</p><p>To affect all gradients or pulses, use <code>gradient=</code> or <code>pulse</code>, e.g. <code>adjust(sequence, pulse=(scale=0.5, ))</code> will divide the amplitude of all RV pulses by two.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/post_hoc.jl#L12-L37">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../defining_sequence/">« Defining sequences</a><a class="docs-footer-nextpage" href="../scanners/">Scanners »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 15:04">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> diff --git a/dev/api/index.html b/dev/api/index.html index 403cbdd..25c20ae 100644 --- a/dev/api/index.html +++ b/dev/api/index.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Internal API · MRIBuilder.jl</title><meta name="title" content="Internal API · MRIBuilder.jl"/><meta property="og:title" content="Internal API · MRIBuilder.jl"/><meta property="twitter:title" content="Internal API · MRIBuilder.jl"/><meta name="description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="twitter:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/api/"/><meta property="twitter:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/api/"/><link rel="canonical" href="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/api/"/><script data-outdated-warner src="../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../search_index.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href="../">MRIBuilder.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../sequence_optimisation/">Optimisation</a></li><li><a class="tocitem" href="../implemented_sequences/">Implemented sequences</a></li><li><a class="tocitem" href="../defining_sequence/">Defining sequences</a></li><li><a class="tocitem" href="../adjust_sequences/">Post-hoc adjustments</a></li><li><a class="tocitem" href="../scanners/">Scanners</a></li><li class="is-active"><a class="tocitem" href>Internal API</a><ul class="internal"><li><a class="tocitem" href="#Type-diagram"><span>Type diagram</span></a></li><li><a class="tocitem" href="#Sequence-components"><span>Sequence components</span></a></li><li><a class="tocitem" href="#Containers-for-sequence-components"><span>Containers for sequence components</span></a></li><li><a class="tocitem" href="#Pre-defined-sequence-parts"><span>Pre-defined sequence parts</span></a></li><li><a class="tocitem" href="#Sequence-I/O"><span>Sequence I/O</span></a></li><li><a class="tocitem" href="#Plot"><span>Plot</span></a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Internal API</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Internal API</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl" title="View the repository"><span class="docs-icon fa-brands">ï¡</span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/main/docs/src/api.md" title="Edit source"><span class="docs-icon fa-solid">ï„</span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="MRIBuilder.jl-internal-API"><a class="docs-heading-anchor" href="#MRIBuilder.jl-internal-API">MRIBuilder.jl internal API</a><a id="MRIBuilder.jl-internal-API-1"></a><a class="docs-heading-anchor-permalink" href="#MRIBuilder.jl-internal-API" title="Permalink"></a></h1><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder" href="#MRIBuilder"><code>MRIBuilder</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Builds and optimises NMR/MRI sequences.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/MRIBuilder.jl#L1-L3">source</a></section></article><h2 id="Type-diagram"><a class="docs-heading-anchor" href="#Type-diagram">Type diagram</a><a id="Type-diagram-1"></a><a class="docs-heading-anchor-permalink" href="#Type-diagram" title="Permalink"></a></h2><pre><code class="nohighlight hljs">AbstractBlock +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Internal API · MRIBuilder.jl</title><meta name="title" content="Internal API · MRIBuilder.jl"/><meta property="og:title" content="Internal API · MRIBuilder.jl"/><meta property="twitter:title" content="Internal API · MRIBuilder.jl"/><meta name="description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="twitter:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/api/"/><meta property="twitter:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/api/"/><link rel="canonical" href="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/api/"/><script data-outdated-warner src="../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../search_index.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href="../">MRIBuilder.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../sequence_optimisation/">Optimisation</a></li><li><a class="tocitem" href="../implemented_sequences/">Implemented sequences</a></li><li><a class="tocitem" href="../defining_sequence/">Defining sequences</a></li><li><a class="tocitem" href="../adjust_sequences/">Post-hoc adjustments</a></li><li><a class="tocitem" href="../scanners/">Scanners</a></li><li class="is-active"><a class="tocitem" href>Internal API</a><ul class="internal"><li><a class="tocitem" href="#Type-diagram"><span>Type diagram</span></a></li><li><a class="tocitem" href="#Sequence-components"><span>Sequence components</span></a></li><li><a class="tocitem" href="#Containers-for-sequence-components"><span>Containers for sequence components</span></a></li><li><a class="tocitem" href="#Pre-defined-sequence-parts"><span>Pre-defined sequence parts</span></a></li><li><a class="tocitem" href="#Sequence-I/O"><span>Sequence I/O</span></a></li><li><a class="tocitem" href="#Plot"><span>Plot</span></a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Internal API</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Internal API</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl" title="View the repository"><span class="docs-icon fa-brands">ï¡</span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/main/docs/src/api.md" title="Edit source"><span class="docs-icon fa-solid">ï„</span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="MRIBuilder.jl-internal-API"><a class="docs-heading-anchor" href="#MRIBuilder.jl-internal-API">MRIBuilder.jl internal API</a><a id="MRIBuilder.jl-internal-API-1"></a><a class="docs-heading-anchor-permalink" href="#MRIBuilder.jl-internal-API" title="Permalink"></a></h1><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder" href="#MRIBuilder"><code>MRIBuilder</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Builds and optimises NMR/MRI sequences.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/MRIBuilder.jl#L1-L3">source</a></section></article><h2 id="Type-diagram"><a class="docs-heading-anchor" href="#Type-diagram">Type diagram</a><a id="Type-diagram-1"></a><a class="docs-heading-anchor-permalink" href="#Type-diagram" title="Permalink"></a></h2><pre><code class="nohighlight hljs">AbstractBlock ├─ ContainerBlock │ ├─ AbstractAlternativeBlocks │ │ └─ AlternativeBlocks @@ -40,13 +40,13 @@ │ │ ├─ ConstantGradient1D │ │ └─ ConstantGradient3D │ └─ NoGradient -└─ Pathway</code></pre><h2 id="Sequence-components"><a class="docs-heading-anchor" href="#Sequence-components">Sequence components</a><a id="Sequence-components-1"></a><a class="docs-heading-anchor-permalink" href="#Sequence-components" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.BaseComponent" href="#MRIBuilder.Components.AbstractTypes.BaseComponent"><code>MRIBuilder.Components.AbstractTypes.BaseComponent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type for all individual components that form an MRI sequence (i.e., RF pulse, gradient waveform, or readout event).</p><p>RF pulses, instant gradients, and readouts are grouped together into <a href="#MRIBuilder.Components.AbstractTypes.EventComponent"><code>EventComponent</code></a>.</p><p>These all should have a <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a> in addition to any other relevant <a href="../sequence_optimisation/#variables"><code>variables</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L4-L10">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.EventComponent" href="#MRIBuilder.Components.AbstractTypes.EventComponent"><code>MRIBuilder.Components.AbstractTypes.EventComponent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type for all RF pulses, instant gradients and readouts that might play out during a gradient waveform.</p><p>These all have an <a href="#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a>, which should quantify at what single time one can approximate the RF pulse or readout to have taken place.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L39-L43">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.GradientWaveform" href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>MRIBuilder.Components.AbstractTypes.GradientWaveform</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type for all parts of a gradient waveform.</p><p>N should be 1 for a 1D gradient waveform or 3 for a 3D one.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L13-L17">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.RFPulseComponent" href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>MRIBuilder.Components.AbstractTypes.RFPulseComponent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super type for all RF pulses.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L46-L48">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.ReadoutComponent" href="#MRIBuilder.Components.AbstractTypes.ReadoutComponent"><code>MRIBuilder.Components.AbstractTypes.ReadoutComponent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super type for all readout events.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L93-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.edge_times-Tuple{MRIBuilder.Components.AbstractTypes.BaseComponent}" href="#MRIBuilder.Components.AbstractTypes.edge_times-Tuple{MRIBuilder.Components.AbstractTypes.BaseComponent}"><code>MRIBuilder.Components.AbstractTypes.edge_times</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">edge_times(container/component; tol=1e-6)</code></pre><p>Returns all the edge times during a sequence in ms.</p><p>Edges are defined as any time, when:</p><ul><li>the edge of a building block</li><li>the slope of the gradient profile changes suddenly</li><li>an RF pulse starts or ends</li></ul><p>Edges that are within <code>tol</code> ms of each other are considered to be one edge (default: 1 ns).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L118-L129">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.split_timestep-Tuple{Tuple{Number, MRIBuilder.Components.AbstractTypes.EventComponent}, Number}" href="#MRIBuilder.Components.AbstractTypes.split_timestep-Tuple{Tuple{Number, MRIBuilder.Components.AbstractTypes.EventComponent}, Number}"><code>MRIBuilder.Components.AbstractTypes.split_timestep</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">split_timestep(component, precision)</code></pre><p>Indicates the maximum timestep that a component can be linearised with and still achieve the required <code>precision</code>.</p><p>Typically, this will be determined by the maximum second derivative:</p><p><span>$\sqrt{\frac{2 \epsilon}{max(|d^2y/dx^2|)}}$</span></p><p>It should be infinite if the component is linear.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L99-L109">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.amplitude" href="#MRIBuilder.Variables.variables.amplitude"><code>MRIBuilder.Variables.variables.amplitude</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">amplitude(pulse)</code></pre><p>Return the amplitude of an <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L65-L69">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bandwidth" href="#MRIBuilder.Variables.variables.bandwidth"><code>MRIBuilder.Variables.variables.bandwidth</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bandwidth(pulse)</code></pre><p>Return the bandwidth of an <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L86-L90">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.flip_angle" href="#MRIBuilder.Variables.variables.flip_angle"><code>MRIBuilder.Variables.variables.flip_angle</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">flip_angle(pulse)</code></pre><p>Return the flip angle of an <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in degrees.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L79-L83">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.frequency" href="#MRIBuilder.Variables.variables.frequency"><code>MRIBuilder.Variables.variables.frequency</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">frequency(pulse)</code></pre><p>Return the off-resonance frequency of an <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L72-L76">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.gradient_strength" href="#MRIBuilder.Variables.variables.gradient_strength"><code>MRIBuilder.Variables.variables.gradient_strength</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_strength(gradient)</code></pre><p>Maximum 3D gradient strength of the gradient in kHz/um.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.phase" href="#MRIBuilder.Variables.variables.phase"><code>MRIBuilder.Variables.variables.phase</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">phase(pulse)</code></pre><p>Return the phase of an <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in degrees.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L58-L62">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.slew_rate" href="#MRIBuilder.Variables.variables.slew_rate"><code>MRIBuilder.Variables.variables.slew_rate</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slew_rate(gradient)</code></pre><p>Maximum 3D slew rate of the gradient in kHz/um/ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L25-L29">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.GradientWaveforms" href="#MRIBuilder.Components.GradientWaveforms"><code>MRIBuilder.Components.GradientWaveforms</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Module defining sub-types of the <a href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a>.</p><p>There are only three types of [<code>GradientBlock</code>] objects:</p><ul><li><a href="#MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient"><code>ChangingGradient</code></a>: any gradient changing linearly in strength.</li><li><a href="#MRIBuilder.Components.GradientWaveforms.ConstantGradientBlocks.ConstantGradient"><code>ConstantGradient</code></a>: any gradient staying constant in strength. These can overlap with a pulse (<code>SliceSelectPulse</code>).</li><li><a href="#MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient"><code>NoGradient</code></a>: any part of the gradient waveform when no gradient is active.</li></ul><p>These parts are combined into a full gradient waveform in a <code>BuildingBlock</code>.</p><p>Each part of this gradient waveform can compute:</p><ul><li><code>gradient_strength</code>: maximum gradient strength in each dimension.</li><li><code>slew_rate</code>: maximum slew rate in each dimension.</li><li><code>qval</code>/<code>qvec</code>: area under curve</li><li><code>bmat_gradient</code>: diffusion weighting (scalar in 1D or matrix in 3D).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/gradient_waveforms/gradient_waveforms.jl#L1-L16">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient" href="#MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient"><code>MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">NoGradient(duration)</code></pre><p>Part of a gradient waveform when there is no gradient active.</p><p>Usually, you do not want to create this object directly, use a <code>BuildingBlock</code> instead.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/gradient_waveforms/no_gradient_blocks.jl#L7-L13">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.GradientWaveforms.ConstantGradientBlocks.ConstantGradient" href="#MRIBuilder.Components.GradientWaveforms.ConstantGradientBlocks.ConstantGradient"><code>MRIBuilder.Components.GradientWaveforms.ConstantGradientBlocks.ConstantGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ConstantGradient(gradient_strength_vector, duration, group=nothing) -ConstantGradient(gradient_strength_scalar, orientation, duration, group=nothing)</code></pre><p>Underlying type for any flat part in a 3D (first constructor) or 3D (second constructor) gradient waveform.</p><p>Usually, you do not want to create this object directly, use a <code>BuildingBlock</code> instead.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/gradient_waveforms/constant_gradient_blocks.jl#L7-L14">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient" href="#MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient"><code>MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ChangingGradient(grad1_scalar, slew_rate_scalar, orientation, duration, group=nothing) -ChangingGradient(grad1_vec, slew_rate_vec, duration, group=nothing)</code></pre><p>Underlying type for any linearly changing part in a 1D (first constructor) or 3D (second constructor) gradient waveform.</p><p>Usually, you do not want to create this object directly, use a <code>BuildingBlock</code> instead.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/gradient_waveforms/changing_gradient_blocks.jl#L9-L16">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.split_gradient-Tuple{MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient, Vararg{Union{Number, JuMP.AbstractJuMPScalar}}}" href="#MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.split_gradient-Tuple{MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient, Vararg{Union{Number, JuMP.AbstractJuMPScalar}}}"><code>MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.split_gradient</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">split_gradient(constant/changing_gradient_block, times...)</code></pre><p>Split a single gradient at a given times.</p><p>All times are relative to the start of the gradient block (in ms). Times are assumed to be in increasing order and between 0 and the duration of the gradient block.</p><p>For N times this returns a vector with the N+1 replacement <a href="@ref"><code>ConstantGradient</code></a> or <a href="#MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient"><code>ChangingGradient</code></a> objects.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/gradient_waveforms/changing_gradient_blocks.jl#L93-L102">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.InstantGradients.InstantGradient" href="#MRIBuilder.Components.InstantGradients.InstantGradient"><code>MRIBuilder.Components.InstantGradients.InstantGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">InstantGradient(; orientation=nothing, group=nothing, variables...)</code></pre><p>If the <code>orientation</code> is set an <a href="#MRIBuilder.Components.InstantGradients.InstantGradient1D"><code>InstantGradient1D</code></a> is returned, otherwise an <a href="#MRIBuilder.Components.InstantGradients.InstantGradient3D"><code>InstantGradient3D</code></a>.</p><p><strong>Parameters</strong></p><ul><li><code>orientation</code> sets the gradient orientation as a length-3 vector. If not set, the gradient can be in any direction.</li><li><code>group</code>: name of the group to which this gradient belongs (used for scaling and rotating).</li></ul><p><strong>Variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a>: Spatial frequency on which spins will be dephased due to this pulsed gradient in rad/um.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.spoiler-sequence_optimisation"><code>variables.spoiler</code></a>: Length-scale on which spins will be dephased by exactly 2Ï€ in mm.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/instant_gradients.jl#L7-L19">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.InstantGradients.InstantGradient1D" href="#MRIBuilder.Components.InstantGradients.InstantGradient1D"><code>MRIBuilder.Components.InstantGradients.InstantGradient1D</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>An <a href="#MRIBuilder.Components.InstantGradients.InstantGradient"><code>InstantGradient</code></a> with a fixed orientation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/instant_gradients.jl#L37-L39">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.InstantGradients.InstantGradient3D" href="#MRIBuilder.Components.InstantGradients.InstantGradient3D"><code>MRIBuilder.Components.InstantGradients.InstantGradient3D</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>An <a href="#MRIBuilder.Components.InstantGradients.InstantGradient"><code>InstantGradient</code></a> with a variable orientation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/instant_gradients.jl#L48-L50">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.GenericPulses.GenericPulse" href="#MRIBuilder.Components.Pulses.GenericPulses.GenericPulse"><code>MRIBuilder.Components.Pulses.GenericPulses.GenericPulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">GenericPulse(time, amplitude, phase, effective_time=<halfway>) -GenericPulse(time, amplitude; phase=0., frequency=0., effective_time=<halfway>)</code></pre><p>Create a Pulse profile that has been fully defined by N control point.</p><p>All arguments should be arrays of the same length N defining these control points.</p><p>This pulse has no free variables.</p><ul><li><code>time</code>: time since the start of this <a href="@ref"><code>BuildingBlock</code></a> in ms.</li><li><code>amplitude</code>: amplitude of the RF pulse at every timepoint in kHz.</li><li><code>phase</code>: phase of the RF pulse at every timpoint in degrees. If not set explicitly it will be determined by the provided starting <code>phase</code> (degrees) and the <code>frequency</code> (kHz).</li><li><code>effective_time</code>: the time that the RF pulse should be considered to have taken place when computing a <code>Pathway</code> (defaults: whenever half of the final flip angle has been achieved for on-resonance spins).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/generic_pulses.jl#L8-L22">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.GenericPulses.GenericPulse-Tuple{GenericPulse, Number, Number}" href="#MRIBuilder.Components.Pulses.GenericPulses.GenericPulse-Tuple{GenericPulse, Number, Number}"><code>MRIBuilder.Components.Pulses.GenericPulses.GenericPulse</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">GenericPulse(pulse, t1, t2)</code></pre><p>Creates a new <a href="#MRIBuilder.Components.Pulses.GenericPulses.GenericPulse"><code>GenericPulse</code></a> by slicing another pulse between <code>t1</code> and <code>t2</code></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/generic_pulses.jl#L44-L48">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.InstantPulses.InstantPulse" href="#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>MRIBuilder.Components.Pulses.InstantPulses.InstantPulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">InstantPulse(; flip_angle=nothing, phase=nothing, group=nothing)</code></pre><p>Return an instant RF pulse that rotates all spins by <code>flip_angle</code> around an axis that has an angle of <code>phase</code> with the X-Y plane.</p><p><strong>Parameters</strong></p><ul><li><code>group</code>: name of the group to which this pulse belongs. This is used for scaling or adding phases/off-resonance frequencies.</li></ul><p><strong>Variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.flip_angle"><code>variables.flip_angle</code></a>: angle by which spins are rotated in degrees.</li><li><a href="#MRIBuilder.Variables.variables.phase"><code>variables.phase</code></a>: angle of axis around which spins are rotated in degrees.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/instant_pulses.jl#L6-L17">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse" href="#MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse"><code>MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ConstantPulse(; variables...)</code></pre><p>Represents an radio-frequency pulse with a constant amplitude and frequency (i.e., a rectangular function).</p><p><strong>Parameters</strong></p><ul><li><code>group</code>: name of the group to which this pulse belongs. This is used for scaling or adding phases/off-resonance frequencies.</li></ul><p><strong>Variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.flip_angle"><code>variables.flip_angle</code></a>: rotation expected for on-resonance spins in degrees.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: duration of the RF pulse in ms.</li><li><a href="#MRIBuilder.Variables.variables.amplitude"><code>variables.amplitude</code></a>: amplitude of the RF pulse in kHz.</li><li><a href="#MRIBuilder.Variables.variables.phase"><code>variables.phase</code></a>: phase at the start of the RF pulse in degrees.</li><li><a href="#MRIBuilder.Variables.variables.frequency"><code>variables.frequency</code></a>: frequency of the RF pulse relative to the Larmor frequency (in kHz).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/constant_pulses.jl#L7-L21">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.SincPulses.SincPulse" href="#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>MRIBuilder.Components.Pulses.SincPulses.SincPulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SincPulse(; Nzeros=3, apodise=true, variables...)</code></pre><p>Represents a radio-frequency pulse with a sinc-like amplitude and constant frequency.</p><p><strong>Parameters</strong></p><ul><li><code>Nzeros</code>: Number of zero-crossings on each side of the sinc pulse. Can be set to a tuple with two values to have a different number of zero crossings on the left and the right of the sinc pulse.</li><li><code>apodise</code>: if true (default) applies a Hanning apodising window to the sinc pulse.</li><li><code>group</code>: name of the group to which this pulse belongs. This is used for scaling or adding phases/off-resonance frequencies.</li></ul><p><strong>Variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.flip_angle"><code>variables.flip_angle</code></a>: rotation expected for on-resonance spins in degrees.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: duration of the RF pulse in ms.</li><li><a href="#MRIBuilder.Variables.variables.amplitude"><code>variables.amplitude</code></a>: amplitude of the RF pulse in kHz.</li><li><a href="#MRIBuilder.Variables.variables.phase"><code>variables.phase</code></a>: phase at the start of the RF pulse in degrees.</li><li><a href="#MRIBuilder.Variables.variables.frequency"><code>variables.frequency</code></a>: frequency of the RF pulse relative to the Larmor frequency (in kHz).</li><li><a href="#MRIBuilder.Variables.variables.bandwidth"><code>variables.bandwidth</code></a>: width of the rectangular function in frequency space (in kHz). If the <code>duration</code> is short (compared with 1/<code>bandwidth</code>), this bandwidth will only be approximate.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/sinc_pulses.jl#L8-L25">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.N_left" href="#MRIBuilder.Variables.variables.N_left"><code>MRIBuilder.Variables.variables.N_left</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">N_left(sinc_pulse)</code></pre><p>Number of zero-crossings of the <a href="#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> before the maximum.</p><p>Also, see <a href="#MRIBuilder.Variables.variables.N_right"><code>variables.N_right</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/sinc_pulses.jl#L89-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.N_right" href="#MRIBuilder.Variables.variables.N_right"><code>MRIBuilder.Variables.variables.N_right</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">N_left(sinc_pulse)</code></pre><p>Number of zero-crossings of the <a href="#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> after the maximum.</p><p>Also, see <a href="#MRIBuilder.Variables.variables.N_left"><code>variables.N_left</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/sinc_pulses.jl#L98-L104">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.lobe_duration" href="#MRIBuilder.Variables.variables.lobe_duration"><code>MRIBuilder.Variables.variables.lobe_duration</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">lobe_duration(sinc_pulse)</code></pre><p>Time between two zero-crossings of a <a href="#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/sinc_pulses.jl#L113-L117">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.CompositePulses.CompositePulse" href="#MRIBuilder.Components.Pulses.CompositePulses.CompositePulse"><code>MRIBuilder.Components.Pulses.CompositePulses.CompositePulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">CompositePulse(; base_pulse, nweights, variables...)</code></pre><p>A composite RF pulse formed by repeating a base RF pulse.</p><p><strong>Parameters</strong></p><ul><li><code>base_pulse</code>: The base RF pulse that will be repeated.</li><li><code>nweights</code>: The number of repeated pulses. This will be ignored if a vector of <code>weights</code> is explicitly provided.</li></ul><p><strong>Variables</strong></p><ul><li><code>weights</code>: The weight of each of the base RF pulses.</li><li><code>interpulse_delay</code>: Time between the center of the RF pulses. If not otherwise constrained, it will be minimised.</li><li><code>scale_amplitude</code>: How strongly one should scale the amplitude versus the duration to achieve the desired weights. If set to 1 only the RF pulse amplitude will be scaled. If set to 0 only the RF pulse duration will be scaled.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/composite_pulses.jl#L7-L20">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.CompositePulses.BinomialPulse-Tuple{}" href="#MRIBuilder.Components.Pulses.CompositePulses.BinomialPulse-Tuple{}"><code>MRIBuilder.Components.Pulses.CompositePulses.BinomialPulse</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">BinomialPulse(; base_pulse, npulses, flip=true, variables...)</code></pre><p>Creates a <a href="#MRIBuilder.Components.Pulses.CompositePulses.CompositePulse"><code>CompositePulse</code></a> of <code>npulses</code> repeats of <code>base_pulse</code>, where the <code>weights</code> are set by the biomial distribution.</p><p>If <code>flip</code> is true (default) every other pulse will be flipped (so that the total excitation is canceled). The <code>variables</code> are defined in <a href="#MRIBuilder.Components.Pulses.CompositePulses.CompositePulse"><code>CompositePulse</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/composite_pulses.jl#L146-L153">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Readouts.ADCs.ADC" href="#MRIBuilder.Components.Readouts.ADCs.ADC"><code>MRIBuilder.Components.Readouts.ADCs.ADC</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ADC(; center_halfway=true, oversample=1, variables...)</code></pre><p>Adds a readout event.</p><p><strong>Parameters</strong></p><ul><li><code>center_halfway</code>: by default the <code>time_to_center</code> is assumed to be half of the <code>duration</code>. Set this to false to disable this assumption.</li><li><code>oversample</code>: by how much the ADC should oversample (minimum of 1).</li></ul><p><strong>Variables</strong></p><ul><li><code>resolution</code>: number of voxels in the readout direction. This can be a non-integer value during optimisation.</li><li><code>nsamples</code>: number of samples in the readout. This can be a non-integer value during optimisation.</li><li><code>dwell_time</code>: Time between each readout sample in ms.</li><li><code>duration</code>: Total duration of the ADC event in ms.</li><li><code>time_to_center</code>: time till the center of k-space from start of ADC in ms.</li><li><code>effective_time</code>: same as <code>time_to_center</code>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L8-L24">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.dwell_time" href="#MRIBuilder.Variables.variables.dwell_time"><code>MRIBuilder.Variables.variables.dwell_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">dwell_time(adc)</code></pre><p>The dwell time of the ADC readout in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.nsamples" href="#MRIBuilder.Variables.variables.nsamples"><code>MRIBuilder.Variables.variables.nsamples</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">nsamples(adc)</code></pre><p>Number of samples in an ADC.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L89-L93">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.oversample" href="#MRIBuilder.Variables.variables.oversample"><code>MRIBuilder.Variables.variables.oversample</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">oversample(adc)</code></pre><p>The oversampling rate of the ADC readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L59-L63">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.resolution" href="#MRIBuilder.Variables.variables.resolution"><code>MRIBuilder.Variables.variables.resolution</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">resolution(readout)</code></pre><p>Resolution of the readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.time_to_center" href="#MRIBuilder.Variables.variables.time_to_center"><code>MRIBuilder.Variables.variables.time_to_center</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">time_to_center(adc)</code></pre><p>The time of the ADC readout to reach the center of k-space.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L73-L77">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Readouts.SingleReadouts.SingleReadout" href="#MRIBuilder.Components.Readouts.SingleReadouts.SingleReadout"><code>MRIBuilder.Components.Readouts.SingleReadouts.SingleReadout</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SingleReadout()</code></pre><p>Represents an instantaneous <code>Readout</code> of the signal.</p><p>It has no parameters or variables to set.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/single_readouts.jl#L7-L13">source</a></section></article><h2 id="Containers-for-sequence-components"><a class="docs-heading-anchor" href="#Containers-for-sequence-components">Containers for sequence components</a><a id="Containers-for-sequence-components-1"></a><a class="docs-heading-anchor-permalink" href="#Containers-for-sequence-components" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.ContainerBlock" href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>MRIBuilder.Containers.Abstract.ContainerBlock</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Parent type for <code>BuildingBlock</code> or <code>BaseSequence</code>, i.e., any building block that contains other MRI components/blocks.</p><p>Iterate over them to get the individual components.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L5-L9">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.amplitude" href="#MRIBuilder.Containers.Abstract.amplitude"><code>MRIBuilder.Containers.Abstract.amplitude</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">amplitude(sequence, time)</code></pre><p>Returns the RF amplitude at a particular time within the sequence in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L61-L65">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.end_time-Tuple{ContainerBlock, Any, Vararg{Any}}" href="#MRIBuilder.Containers.Abstract.end_time-Tuple{ContainerBlock, Any, Vararg{Any}}"><code>MRIBuilder.Containers.Abstract.end_time</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">end_time(container, indices...)</code></pre><p>Returns the start time of component with given <code>indices</code> with respect to the start of the <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a>.</p><p>Also see <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>, <a href="#MRIBuilder.Containers.Abstract.start_time-Tuple{ContainerBlock, Any, Any, Vararg{Any}}"><code>start_time</code></a>, and <a href="#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L25-L31">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.frequency" href="#MRIBuilder.Containers.Abstract.frequency"><code>MRIBuilder.Containers.Abstract.frequency</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">frequency(sequence, time)</code></pre><p>Returns the RF frequency at a particular time within the sequence in kHz.</p><p>NaN is returned if there is no pulse activate at that <code>time</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L78-L84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.gradient_strength" href="#MRIBuilder.Containers.Abstract.gradient_strength"><code>MRIBuilder.Containers.Abstract.gradient_strength</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_strength(sequence, time)</code></pre><p>Returns the gradient strength at a particular time within the sequence.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L53-L57">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.iter-Tuple{ContainerBlock, Val}" href="#MRIBuilder.Containers.Abstract.iter-Tuple{ContainerBlock, Val}"><code>MRIBuilder.Containers.Abstract.iter</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">iter(sequence, get_type)</code></pre><p>Helper functions for any <code>iter_*</code> functions.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L87-L91">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.iter_blocks-Tuple{ContainerBlock}" href="#MRIBuilder.Containers.Abstract.iter_blocks-Tuple{ContainerBlock}"><code>MRIBuilder.Containers.Abstract.iter_blocks</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">iter_blocks(sequence)</code></pre><p>Returns all the building blocks in the sequence with the time they will start</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L99-L103">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.iter_instant_gradients-Tuple{ContainerBlock}" href="#MRIBuilder.Containers.Abstract.iter_instant_gradients-Tuple{ContainerBlock}"><code>MRIBuilder.Containers.Abstract.iter_instant_gradients</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">iter_instant_gradients(sequence)</code></pre><p>Returns all the <a href="#MRIBuilder.Components.InstantGradients.InstantGradient"><code>InstantGradient</code></a> within the sequence with their timings</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L114-L118">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.iter_instant_pulses-Tuple{ContainerBlock}" href="#MRIBuilder.Containers.Abstract.iter_instant_pulses-Tuple{ContainerBlock}"><code>MRIBuilder.Containers.Abstract.iter_instant_pulses</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">iter_instant_pulses(sequence)</code></pre><p>Returns all the <a href="#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a> within the sequence with their timings</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L106-L110">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.phase" href="#MRIBuilder.Containers.Abstract.phase"><code>MRIBuilder.Containers.Abstract.phase</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">phase(sequence, time)</code></pre><p>Returns the RF phase at a particular time within the sequence in degrees.</p><p>NaN is returned if there is no pulse activate at that <code>time</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L69-L75">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.start_time-Tuple{ContainerBlock, Any, Any, Vararg{Any}}" href="#MRIBuilder.Containers.Abstract.start_time-Tuple{ContainerBlock, Any, Any, Vararg{Any}}"><code>MRIBuilder.Containers.Abstract.start_time</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">start_time(container, indices...)</code></pre><p>Returns the start time of component with given <code>indices</code> with respect to the start of the <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a>.</p><p>Also see <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>, <a href="#MRIBuilder.Containers.Abstract.end_time-Tuple{ContainerBlock, Any, Vararg{Any}}"><code>end_time</code></a>, and <a href="#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L13-L19">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.get_gradient" href="#MRIBuilder.Variables.get_gradient"><code>MRIBuilder.Variables.get_gradient</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_gradient(container, time)</code></pre><p>Gets the gradient running at a particular <code>time</code> (in ms) during a sequence of building block.</p><p>This function will return a tuple with 2 elements:</p><ol><li>The <a href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a> itself (which could be a <a href="#MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient"><code>NoGradient</code></a> object).</li><li>The time since the start of the gradient</li></ol></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L134-L142">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.get_pulse" href="#MRIBuilder.Variables.get_pulse"><code>MRIBuilder.Variables.get_pulse</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_pulse(container, time)</code></pre><p>Gets the pulse running at a particular <code>time</code> (in ms) during a sequence of building block.</p><p>If there is a RF pulse, this function will return a tuple with 2 elements:</p><ol><li>The <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> itself</li><li>The time since the start of the pulse</li></ol><p>If there is no active RF pulse, <code>nothing</code> is returned.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L122-L131">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.effective_time" href="#MRIBuilder.Variables.variables.effective_time"><code>MRIBuilder.Variables.variables.effective_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">effective_time(container, indices...)</code></pre><p>Returns the start time of component with given <code>indices</code> with respect to the start of the <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a>.</p><p>This will crash if the component does not have an <a href="#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a> (e.g., if it is (part of) a gradient waveform).</p><p>Also see <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>, <a href="#MRIBuilder.Containers.Abstract.start_time-Tuple{ContainerBlock, Any, Any, Vararg{Any}}"><code>start_time</code></a>, and <a href="#MRIBuilder.Containers.Abstract.end_time-Tuple{ContainerBlock, Any, Vararg{Any}}"><code>end_time</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L41-L49">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.readout_times" href="#MRIBuilder.Variables.variables.readout_times"><code>MRIBuilder.Variables.variables.readout_times</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">readout_times(sequence)</code></pre><p>Returns all the times that the sequence will readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L146-L150">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks" href="#MRIBuilder.Containers.BuildingBlocks"><code>MRIBuilder.Containers.BuildingBlocks</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Defines <a href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a>, <a href="#MRIBuilder.Containers.BuildingBlocks.BuildingBlock"><code>BuildingBlock</code></a> and <a href="#MRIBuilder.Containers.BuildingBlocks.Wait"><code>Wait</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock" href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Basic BuildingBlock, which can consist of a gradient waveforms with any number of RF pulses/readouts overlaid</p><p>Main interface:</p><ul><li>iteration will give the gradient waveforms interspersed by RF pulses/readouts.<ul><li>Indiviual indices can be accessed using <code>keys(building_block)</code></li></ul></li><li><a href="#MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock, Any, Any}"><code>waveform_sequence</code></a> returns just the gradient waveform as a sequence of <a href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a> objects.</li><li><a href="#MRIBuilder.Containers.BuildingBlocks.waveform-Tuple{BaseBuildingBlock}"><code>waveform</code></a> returns just the gradient waveform as a sequence of (time, gradient_strength) tuples.</li><li><a href="#MRIBuilder.Containers.BuildingBlocks.events-Tuple{BaseBuildingBlock}"><code>events</code></a> returns the RF pulses and readouts.</li><li><a href="#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a> returns area under curve for (part of) the gradient waveform.</li></ul><p>Sub-types need to implement:</p><ul><li><code>Base.keys</code>: returns sequence of keys to all the components.</li><li><code>Base.getindex</code>: returns the actual component for each key. For <code>events</code> (readout/pulses) this should return a tuple with <code>(time delay till start, event)</code>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L12-L26">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.BuildingBlock" href="#MRIBuilder.Containers.BuildingBlocks.BuildingBlock"><code>MRIBuilder.Containers.BuildingBlocks.BuildingBlock</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">BuildingBlock(waveform, events; duration=nothing, orientation=nothing, group)</code></pre><p>Generic <a href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a> that can capture any overlapping gradients, RF pulses, and/or readouts. The gradients cannot contain any free variables.</p><p>Scanner constraints are automatically applied.</p><p><strong>Arguments</strong></p><ul><li><code>waveform</code>: Sequence of 2-element tuples with (time, (Gx, Gy, Gz)). If <code>orientation</code> is set then the tuple is expected to look like (time, G). This cannot contain any free variables.</li><li><code>events</code>: Sequence of 2-element tuples with (time, pulse/readout). The <code>time</code> is the start time of the pulse/readout.</li><li><code>duration</code>: duration of this <code>BuildingBlock</code>. If not set then it will be assumed to be the time of the last element in <code>waveform</code>.</li><li><code>orientation</code>: orientation of the gradients in the waveform. If not set, then the full gradient vector should be given explicitly.</li><li><code>group</code>: group of the gradient waveform</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L307-L321">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.BuildingBlock-Tuple{MRIBuilder.Components.AbstractTypes.EventComponent}" href="#MRIBuilder.Containers.BuildingBlocks.BuildingBlock-Tuple{MRIBuilder.Components.AbstractTypes.EventComponent}"><code>MRIBuilder.Containers.BuildingBlocks.BuildingBlock</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">BuildingBlock(pulse/readout)</code></pre><p>Creates a <code>BuildingBlock</code> with no gradients and just the single [<code>EventComponent</code>]@(ref).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L362-L366">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.Wait" href="#MRIBuilder.Containers.BuildingBlocks.Wait"><code>MRIBuilder.Containers.BuildingBlocks.Wait</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>An empty BuildingBlock representing dead time.</p><p>It only has a single variable, namely its <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L406-L410">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.events-Tuple{BaseBuildingBlock}" href="#MRIBuilder.Containers.BuildingBlocks.events-Tuple{BaseBuildingBlock}"><code>MRIBuilder.Containers.BuildingBlocks.events</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">events(building_block)</code></pre><p>Returns just the non-gradient (i.e., RF pulses/readouts) events as a sequence of <a href="#MRIBuilder.Components.AbstractTypes.EventComponent"><code>EventComponent</code></a> objects (with their keys).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L38-L42">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.waveform-Tuple{BaseBuildingBlock}" href="#MRIBuilder.Containers.BuildingBlocks.waveform-Tuple{BaseBuildingBlock}"><code>MRIBuilder.Containers.BuildingBlocks.waveform</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">waveform(building_block)</code></pre><p>Returns the gradient waveform of any <a href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a> as a sequence of control points.</p><p>Each control point is stored as a tuple with the time in ms and the gradient as a length-3 vector. The gradient is linearly interpolated between these points (see <a href="#MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock, Any, Any}"><code>waveform_sequence</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L84-L91">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock, Any, Any}" href="#MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock, Any, Any}"><code>MRIBuilder.Containers.BuildingBlocks.waveform_sequence</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">waveform_sequence(building_block, first, last)</code></pre><p>Gets the sequence of <a href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a> from the event with key <code>first</code> till the event with key <code>last</code>.</p><p>Setting <code>first</code> to nothing indicates to start from the beginning of the <code>building_block</code>. Similarly, setting <code>last</code> to nothing indicates to continue till the end of the <code>building_block</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L154-L161">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock}" href="#MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock}"><code>MRIBuilder.Containers.BuildingBlocks.waveform_sequence</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">waveform_sequence(building_block)</code></pre><p>Returns just the gradient waveform as a sequence of <a href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a> objects (with their keys).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L47-L51">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bmat_gradient" href="#MRIBuilder.Variables.variables.bmat_gradient"><code>MRIBuilder.Variables.variables.bmat_gradient</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bmat_gradient(overlapping, qstart[, first_event, last_event])</code></pre><p>Computes the addition to the <a href="../defining_sequence/#MRIBuilder.Variables.variables.bmat"><code>variables.bmat</code></a> contributed by a specific building block or gradient.</p><p><code>qstart</code> represents the <a href="#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a> at the start of this component.</p><p>If <code>first_event</code> is set to something else than <code>nothing</code>, only the gradient waveform after this RF pulse/Readout will be considered. Similarly, if <code>last_event</code> is set to something else than <code>nothing</code>, only the gradient waveform up to this RF pulse/Readout will be considered.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L243-L252">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.qvec" href="#MRIBuilder.Variables.variables.qvec"><code>MRIBuilder.Variables.variables.qvec</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">qvec(overlapping[, first_event, last_event])</code></pre><p>Computes the area under the curve for the gradient waveform in <a href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a>.</p><p>If <code>first_event</code> is set to something else than <code>nothing</code>, only the gradient waveform after this RF pulse/Readout will be considered. Similarly, if <code>last_event</code> is set to something else than <code>nothing</code>, only the gradient waveform up to this RF pulse/Readout will be considered.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L233-L240">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences" href="#MRIBuilder.Containers.BaseSequences"><code>MRIBuilder.Containers.BaseSequences</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Defines <a href="#MRIBuilder.Containers.BaseSequences.BaseSequence"><code>BaseSequence</code></a> and <a href="#MRIBuilder.Containers.BaseSequences.Sequence"><code>Sequence</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/base_sequences.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences.BaseSequence" href="#MRIBuilder.Containers.BaseSequences.BaseSequence"><code>MRIBuilder.Containers.BaseSequences.BaseSequence</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type of any sequence of non-overlapping building blocks that should be played after each other.</p><p>It contains <code>N</code> <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a> objects (e.g., building blocks or other sequences).</p><p>Main interface:</p><ul><li>Acts as an iterable containing the blocks and sequences.<ul><li>Indiviual blocks/sequences can be obtained using indexing.</li><li>If there is a finite number of repeats, the iteration will continue over all repeats.</li></ul></li></ul><p>Sub-types need to implement:</p><ul><li><code>get_index_single_TR</code>: return the index assuming it is between 1 and N</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/base_sequences.jl#L14-L26">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences.Sequence" href="#MRIBuilder.Containers.BaseSequences.Sequence"><code>MRIBuilder.Containers.BaseSequences.Sequence</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">Sequence(blocks; name=:Sequence, variables...) -Sequence(blocks...; name=:Sequence, variables...)</code></pre><p>Defines an MRI sequence from a vector of building blocks.</p><p><strong>Arguments</strong></p><ul><li><code>blocks</code>: The actual building blocks that will be played in sequence. All the building blocks must be of type <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a>, which means that they cannot only contain actual <a href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a> objects, but also other <a href="#MRIBuilder.Containers.BaseSequences.BaseSequence"><code>BaseSequence</code></a> objects. Objects of a different type are converted into a <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a> internally:<ul><li>numbers/<code>nothing</code>/<code>:min</code>/<code>:max</code> : replaced with a <a href="#MRIBuilder.Containers.BuildingBlocks.Wait"><code>Wait</code></a> block with the appropriate constraint/objective added to its <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>.</li><li>RF pulse or readout: will be embedded within a <a href="#MRIBuilder.Containers.BuildingBlocks.BuildingBlock"><code>BuildingBlock</code></a> of the appropriate length</li></ul></li></ul><p>Specific named sequences might define additional variables.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/base_sequences.jl#L137-L150">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences.get_index_single_TR-Tuple{BaseSequence, Integer}" href="#MRIBuilder.Containers.BaseSequences.get_index_single_TR-Tuple{BaseSequence, Integer}"><code>MRIBuilder.Containers.BaseSequences.get_index_single_TR</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_index_single_TR(sequence, index)</code></pre><p>Used internally by any <a href="#MRIBuilder.Containers.BaseSequences.BaseSequence"><code>BaseSequence</code></a> to get a specific block. The <code>index</code> should be between 1 and N. It should be implemented for any sub-classes of <a href="#MRIBuilder.Containers.BaseSequences.BaseSequence"><code>BaseSequence</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/base_sequences.jl#L88-L94">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences.nrepeat-Tuple{BaseSequence}" href="#MRIBuilder.Containers.BaseSequences.nrepeat-Tuple{BaseSequence}"><code>MRIBuilder.Containers.BaseSequences.nrepeat</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">nrepeat(sequence)</code></pre><p>How often sequence should be repeated. </p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/base_sequences.jl#L98-L102">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences.to_block-Tuple{ContainerBlock}" href="#MRIBuilder.Containers.BaseSequences.to_block-Tuple{ContainerBlock}"><code>MRIBuilder.Containers.BaseSequences.to_block</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">to_block(block_like)</code></pre><p>Converst object into something that can be included in the sequence:</p><ul><li>:min/:max/number/variable/nothing => <a href="#MRIBuilder.Containers.BuildingBlocks.Wait"><code>Wait</code></a>.</li><li><code>building_block</code> or <code>sequence</code> => no change.</li><li>RF pulse/readout => will be embedded within a <a href="#MRIBuilder.Containers.BuildingBlocks.BuildingBlock"><code>BuildingBlock</code></a>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/base_sequences.jl#L201-L208">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Alternatives.AbstractAlternativeBlocks" href="#MRIBuilder.Containers.Alternatives.AbstractAlternativeBlocks"><code>MRIBuilder.Containers.Alternatives.AbstractAlternativeBlocks</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Parent type for all blocks that can take different MR sequence components between multiple repetitions of the sequence.</p><p>They can be extended into their individual components using <code>adjust(<name>=:all)</code>.</p><p>Each subtype of <a href="@ref"><code>AbstractAlternativeBlock</code></a> needs to implement two methods:</p><ul><li><a href="#MRIBuilder.Containers.Alternatives.get_alternatives_name-Tuple{AlternativeBlocks}"><code>get_alternatives_name</code></a>: returns the <code>name</code> used to identify this block in <code>adjust</code></li><li><a href="#MRIBuilder.Containers.Alternatives.get_alternatives_options-Tuple{AlternativeBlocks}"><code>get_alternatives_options</code></a>: returns a dictionary mapping the name of the different options to a <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a> with the actual sequence building block.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/alternatives.jl#L7-L15">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Alternatives.AlternativeBlocks" href="#MRIBuilder.Containers.Alternatives.AlternativeBlocks"><code>MRIBuilder.Containers.Alternatives.AlternativeBlocks</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">AlternativeBlocks(name, blocks)</code></pre><p>Represents a part of the sequence where there are multiple possible alternatives.</p><p>Variables can be matched across these alternatives using <a href="#MRIBuilder.Containers.Alternatives.match_blocks!-Tuple{AbstractAlternativeBlocks, Any}"><code>match_blocks!</code></a>.</p><p>The <code>name</code> is a symbol that is used to identify this <code>AlternativeBlocks</code> in the broader sequence (as in <code>adjust</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/alternatives.jl#L18-L26">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Alternatives.get_alternatives_name-Tuple{AlternativeBlocks}" href="#MRIBuilder.Containers.Alternatives.get_alternatives_name-Tuple{AlternativeBlocks}"><code>MRIBuilder.Containers.Alternatives.get_alternatives_name</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_alternatives_name(alternative_block)</code></pre><p>Get the name with which any <a href="#MRIBuilder.Containers.Alternatives.AbstractAlternativeBlocks"><code>AbstractAlternativeBlocks</code></a> will be identified in a call to <code>adjust</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/alternatives.jl#L34-L38">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Alternatives.get_alternatives_options-Tuple{AlternativeBlocks}" href="#MRIBuilder.Containers.Alternatives.get_alternatives_options-Tuple{AlternativeBlocks}"><code>MRIBuilder.Containers.Alternatives.get_alternatives_options</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_alternatives_options(alternative_block)</code></pre><p>Get the options available for a <a href="#MRIBuilder.Containers.Alternatives.AbstractAlternativeBlocks"><code>AbstractAlternativeBlocks</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/alternatives.jl#L41-L45">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Alternatives.match_blocks!-Tuple{AbstractAlternativeBlocks, Any}" href="#MRIBuilder.Containers.Alternatives.match_blocks!-Tuple{AbstractAlternativeBlocks, Any}"><code>MRIBuilder.Containers.Alternatives.match_blocks!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">match_blocks!(alternatives, function)</code></pre><p>Matches the outcome of given <code>function</code> on each of the building blocks in <a href="#MRIBuilder.Containers.Alternatives.AlternativeBlocks"><code>AlternativeBlocks</code></a>.</p><p>For example, <code>match_blocks!(alternatives, duration)</code> will ensure that all the alternative building blocks have the same duration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/alternatives.jl#L55-L61">source</a></section></article><h2 id="Pre-defined-sequence-parts"><a class="docs-heading-anchor" href="#Pre-defined-sequence-parts">Pre-defined sequence parts</a><a id="Pre-defined-sequence-parts-1"></a><a class="docs-heading-anchor-permalink" href="#Pre-defined-sequence-parts" title="Permalink"></a></h2><p>There are <a href="../defining_sequence/#helper_functions">helper functions</a> available to actually add these to a sequence.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids" href="#MRIBuilder.Parts.Trapezoids"><code>MRIBuilder.Parts.Trapezoids</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Defines a set of different options for MRI gradients.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids.BaseTrapezoid" href="#MRIBuilder.Parts.Trapezoids.BaseTrapezoid"><code>MRIBuilder.Parts.Trapezoids.BaseTrapezoid</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Parent type for any <code>BuildingBlock</code> that has a trapezoidal gradient waveform.</p><p>Sub-types:</p><ul><li><a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a></li><li><a href="#MRIBuilder.Parts.Trapezoids.SliceSelect"><code>SliceSelect</code></a></li><li><a href="#MRIBuilder.Parts.Trapezoids.LineReadout"><code>LineReadout</code></a></li></ul><p>The <code>N</code> indicates whether the gradient has a fixed orientation (N=1) or is free (N=3).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L14-L23">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids.LineReadout" href="#MRIBuilder.Parts.Trapezoids.LineReadout"><code>MRIBuilder.Parts.Trapezoids.LineReadout</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">LineReadout(adc; ramp_overlap=1., orientation=nothing, group=nothing, variables...)</code></pre><p>Defines a trapezoidal gradient with an ADC readout overlaid.</p><p>Parameters and variables are identical as for <a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> with the addition of:</p><p><strong>Parameters</strong></p><ul><li><code>adc</code>: <a href="#MRIBuilder.Components.Readouts.ADCs.ADC"><code>ADC</code></a> object that describes the readout.</li><li><code>ramp_overlap</code>: how much the gradient ramp should overlap with the ADC. 0 for no overlap, 1 for full overlap (default: 1). Can be set to <code>nothing</code> to become a free variable.</li></ul><p><strong>Variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.fov"><code>variables.fov</code></a>: FOV of the output image along this single k-space line in mm.</li><li><a href="#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a>: size of each voxel along this single k-space line in mm.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L239-L253">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids.SliceSelect" href="#MRIBuilder.Parts.Trapezoids.SliceSelect"><code>MRIBuilder.Parts.Trapezoids.SliceSelect</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SliceSelect(pulse; orientation=nothing, group=nothing, variables...)</code></pre><p>Defines a trapezoidal gradient with a pulse played out during the flat time.</p><p>Parameters and variables are identical as for <a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> with the addition of:</p><p><strong>Parameters</strong></p><ul><li><code>pulse</code>: sub-type of <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> that describes the RF pulse.</li></ul><p><strong>Variables</strong></p><ul><li><code>slice_thickness</code>: thickness of the selected slice in mm</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L179-L191">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids.Trapezoid" href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>MRIBuilder.Parts.Trapezoids.Trapezoid</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">Trapezoid(; orientation=nothing, group=nothing, variables...)</code></pre><p>Defines a trapezoidal pulsed gradient</p><p><strong>Parameters</strong></p><ul><li><code>orientation</code> sets the gradient orientation (completely free by default). Can be set to a vector for a fixed orientation.</li><li><code>group</code>: assign the trapezoidal gradient to a specific group. This group will be used to scale or rotate the gradients after optimisation.</li></ul><p><strong>Variables</strong></p><p>Variables can be set during construction or afterwards as an attribute. If not set, they will be determined during the sequence optimisation.</p><p><strong>Timing variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.rise_time"><code>variables.rise_time</code></a>: Time of the gradient to reach from 0 to maximum in ms. If explicitly set to 0, the scanner slew rate will be ignored.</li><li><a href="#MRIBuilder.Variables.variables.flat_time"><code>variables.flat_time</code></a>: Time that the gradient stays at maximum strength in ms.</li><li><a href="#MRIBuilder.Variables.variables.δ"><code>variables.δ</code></a>: effective pulse duration (<code>rise_time</code> + <code>flat_time</code>) in ms.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: total pulse duration (2 * <code>rise_time</code> + <code>flat_time</code>) in ms.</li></ul><p><strong>Gradient variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.gradient_strength"><code>variables.gradient_strength</code></a>: Maximum gradient strength achieved during the pulse in kHz/um</li><li><a href="#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a>: Spatial scale on which spins will be dephased due to this pulsed gradient in rad/um (given by <code>δ</code> * <code>gradient_strength</code>).</li></ul><p>The <code>bvalue</code> can be constrained for multiple gradient pulses by creating a <code>Pathway</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L26-L48">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids.opposite_kspace_lines-Tuple{}" href="#MRIBuilder.Parts.Trapezoids.opposite_kspace_lines-Tuple{}"><code>MRIBuilder.Parts.Trapezoids.opposite_kspace_lines</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">opposite_kspace_lines(; orientation=[1, 0, 0], kwargs...)</code></pre><p>Return a positive and negative readout of a k-space line.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L314-L318">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.flat_time" href="#MRIBuilder.Variables.variables.flat_time"><code>MRIBuilder.Variables.variables.flat_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">flat_time(trapezoid)</code></pre><p>Returns the flat time of a <a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L124-L128">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.fov" href="#MRIBuilder.Variables.variables.fov"><code>MRIBuilder.Variables.variables.fov</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">fov(readout)</code></pre><p>Defines the field of view of a readout in mm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L288-L292">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.ramp_overlap" href="#MRIBuilder.Variables.variables.ramp_overlap"><code>MRIBuilder.Variables.variables.ramp_overlap</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ramp_overlap(line_readout)</code></pre><p>Return the fraction of the gradient ramp that overlaps with the ADC readout.</p><p>Set to 0 to ensure that the ADC is only active during the flat time of the readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L302-L308">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.rise_time" href="#MRIBuilder.Variables.variables.rise_time"><code>MRIBuilder.Variables.variables.rise_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">rise_time(trapezoid)</code></pre><p>Returns the rise time of a <a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L117-L121">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.slice_thickness" href="#MRIBuilder.Variables.variables.slice_thickness"><code>MRIBuilder.Variables.variables.slice_thickness</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slice_thickness(slice_select)</code></pre><p>Defines the slice thickness for a RF pulse with an active gradient in mm (e.g., <a href="#MRIBuilder.Parts.Trapezoids.SliceSelect"><code>SliceSelect</code></a>).</p><p>Defines as <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.gradient_strength_norm-sequence_optimisation"><code>variables.gradient_strength_norm</code></a>(gradient) / <a href="#MRIBuilder.Variables.variables.bandwidth"><code>variables.bandwidth</code></a>(pulse)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L213-L219">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.voxel_size" href="#MRIBuilder.Variables.variables.voxel_size"><code>MRIBuilder.Variables.variables.voxel_size</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">voxel_size(readout)</code></pre><p>Defines the voxel size of a readout in mm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L295-L299">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.δ" href="#MRIBuilder.Variables.variables.δ"><code>MRIBuilder.Variables.variables.δ</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">δ(trapezoid)</code></pre><p>Returns the effective duration of a <a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p><p>Defined as <a href="#MRIBuilder.Variables.variables.rise_time"><code>variables.rise_time</code></a> + <a href="#MRIBuilder.Variables.variables.flat_time"><code>variables.flat_time</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L136-L142">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect" href="#MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect"><code>MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SpoiltSliceSelect(pulse; parameters..., variables...)</code></pre><p>Adds slice selection to the <code>pulse</code> and surrounds it with spoiler gradients.</p><p><strong>Parameters</strong></p><ul><li><code>orientation</code>: vector with orientation of the slice selection and the spoilers (default: [0, 0, 1])</li><li><code>group</code>: name of the group of the gradient. This will be used to scale and rotate the gradients after optimisation. Scaling is not recommended as this might ruin the spoiling.</li></ul><p><strong>Variables</strong></p><ul><li><code>duration</code>: total duration of the block in ms.</li><li><code>slice_thickness</code>: slice thickness in mm.</li><li><code>spoiler</code>: length scale on which the spoilers achieve 2Ï€ dephasing in mm. This sets the minimum spoiling. If this spoiling level is not achieved by the slice-select gradient alone, then there will be additional gradients added.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/spoilt_slice_selects.jl#L12-L25">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.all_gradient_strengths" href="#MRIBuilder.Variables.variables.all_gradient_strengths"><code>MRIBuilder.Variables.variables.all_gradient_strengths</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">all_gradient_strengths(spoilt_slice_select)</code></pre><p>Returns the gradient strength before, during, and after the pulse in <a href="#MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect"><code>SpoiltSliceSelect</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/spoilt_slice_selects.jl#L127-L131">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.fall_time" href="#MRIBuilder.Variables.variables.fall_time"><code>MRIBuilder.Variables.variables.fall_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">fall_time(spoilt_slice_select)</code></pre><p>Returns the time of the <a href="#MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect"><code>SpoiltSliceSelect</code></a> to return to zero.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/spoilt_slice_selects.jl#L135-L139">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.SliceSelectRephases.SliceSelectRephase" href="#MRIBuilder.Parts.SliceSelectRephases.SliceSelectRephase"><code>MRIBuilder.Parts.SliceSelectRephases.SliceSelectRephase</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SliceSelectRephase(pulse; kwargs...)</code></pre><p>Creates an excitatory RF pulse with slice selection and a rephasing gradient.</p><p>Parameters are the same as for <a href="#MRIBuilder.Parts.Trapezoids.SliceSelect"><code>SliceSelect</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/slice_select_rephases.jl#L7-L13">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.EPIReadouts.EPIReadout" href="#MRIBuilder.Parts.EPIReadouts.EPIReadout"><code>MRIBuilder.Parts.EPIReadouts.EPIReadout</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">EPIReadout(; resolution, ky_lines=-resolution[2]:resolution[2], recenter=false, group=:FOV, variables...)</code></pre><p>Defines an (accelerated) EPI readout.</p><p><strong>Parameters</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>: Resolution of the final image in the frequency- and phase-encode directions.</li><li><code>recenter</code>: if true, the signal will be recentred in k-space after the EPI readout.</li><li><code>group</code>: name of the group used to rotate the readout gradients (default: :FOV).</li></ul><p><strong>Variables:</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a>: size of the voxel in the frequency- and phase-encode directions.</li><li><a href="#MRIBuilder.Variables.variables.fov"><code>variables.fov</code></a>: size of the FOV in the frequency- and phase-encode directions.</li><li><a href="#MRIBuilder.Variables.variables.ramp_overlap"><code>variables.ramp_overlap</code></a>: what fraction of the gradient ramp should overlap with the readout.</li><li><a href="#MRIBuilder.Variables.variables.oversample"><code>variables.oversample</code></a>: by how much to oversample in the frequency-encode direcion.</li><li><a href="#MRIBuilder.Variables.variables.dwell_time"><code>variables.dwell_time</code></a>: dwell time in the frequency-encode direction</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/epi_readouts.jl#L8-L24">source</a></section></article><h2 id="Sequence-I/O"><a class="docs-heading-anchor" href="#Sequence-I/O">Sequence I/O</a><a id="Sequence-I/O-1"></a><a class="docs-heading-anchor-permalink" href="#Sequence-I/O" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.Pulseq" href="#MRIBuilder.SequenceIO.Pulseq"><code>MRIBuilder.SequenceIO.Pulseq</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Module converting MRIBuilder sequences to and from sequences recognised by <a href="@ref"><code>PulseqIO</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO" href="#MRIBuilder.SequenceIO.PulseqIO"><code>MRIBuilder.SequenceIO.PulseqIO</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Stand-alone module that reads/writes Pulseq files.</p><p>The pulseq files are read into or written from a set of types that closely match the Pulseq file format. The translation of these types into MRIBuilder types is defined in "../pulseq.jl" (i.e., <code>MRIBuilder.SequenceIO.Pulseq</code>)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/pulseq_io.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.read_pulseq-Tuple{IO}" href="#MRIBuilder.SequenceIO.PulseqIO.read_pulseq-Tuple{IO}"><code>MRIBuilder.SequenceIO.PulseqIO.read_pulseq</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read_pulseq(IO)</code></pre><p>Reads a sequence from a pulseq file (http://pulseq.github.io/). Pulseq files can be produced using matlab (http://pulseq.github.io/) or python (https://pypulseq.readthedocs.io/en/master/).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/pulseq_io.jl#L20-L25">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.write_pulseq-Tuple{IO, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence}" href="#MRIBuilder.SequenceIO.PulseqIO.write_pulseq-Tuple{IO, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence}"><code>MRIBuilder.SequenceIO.PulseqIO.write_pulseq</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">write_pulseq(IO, sequence)</code></pre><p>Writes a sequence to an output IO file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/pulseq_io.jl#L31-L35">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types" href="#MRIBuilder.SequenceIO.PulseqIO.Types"><code>MRIBuilder.SequenceIO.PulseqIO.Types</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Define the main types forming a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>PulseqSequence</code></a>.</p><p>Extensions and sections types are defined in their own modules.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L1-L5">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqComponent" href="#MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqComponent"><code>MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqComponent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type for any RF pulses/gradients/ADC/extensions that can play out during a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqBlock"><code>PulseqBlock</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L26-L28">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqGradient" href="#MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqGradient"><code>MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type of Pulseq gradients:</p><ul><li><a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqGradient"><code>PulseqGradient</code></a></li><li><a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqTrapezoid"><code>PulseqTrapezoid</code></a></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L47-L51">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqADC" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqADC"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqADC</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqADC(num::Int, dwell::Float64, delay::Int, frequency::Number, phase::Number)</code></pre><p>A trapezoidal gradient pulse defined in Pulseq (see <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L79-L83">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqBlock" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqBlock"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqBlock</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqBlock(duration::Int, rf::PulseqRFPulse, gx::AnyPulseqGradient, gy::AnyPulseqGradient, gz::AnyPulseqGradient, adc::PulseqADC, ext)</code></pre><p>Defines a Building Block with the Pulseq sequence (see <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>).</p><p>The RF pulse, gradients, and ADC can be set to <code>nothing</code>.</p><p>The <code>ext</code> is a sequence of extension blocks that will be played out. Set this to a sequence of zero length to not have any extensions.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L111-L120">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtension" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtension"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtension</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqExtension(definition::PulseqExtensionDefinition, id::Int)</code></pre><p>Reference to a specific implementation of a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtensionDefinition"><code>PulseqExtensionDefinition</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L101-L105">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtensionDefinition" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtensionDefinition"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtensionDefinition</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqExtensionDefinition(name, content)</code></pre><p>Abstract definition of an unknown Pulseq extension.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L92-L96">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqGradient" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqGradient"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqGradient(amplitude::Number, shape::PulseqShape, time::PulseqShape, delay::int)</code></pre><p>A generic gradient waveform defined in Pulseq (see <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L54-L58">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqRFPulse" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqRFPulse"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqRFPulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqRFPulse(amplitude::Number, magnitude::PulseqShape, phase::PulseqShape, time::PulseqShape, delay::Int, frequency::Number, phase_offset::Number)</code></pre><p>An RF pulse defined in Pulseq (see <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqSection(:<title>)(lines)</code></pre><p>Represents a section in the pulseq file format.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L8-L12">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqSequence(version::VersionNumber, definitions::NamedTuple, blocks::Vector{PulseqBlock})</code></pre><p>A full sequence defined according to the Pulseq <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L131-L135">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqShape(samples)</code></pre><p>Define the shape of a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqRFPulse"><code>PulseqRFPulse</code></a> or <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqGradient"><code>PulseqGradient</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L17-L21">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqTrapezoid" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqTrapezoid"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqTrapezoid</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqTrapezoid(amplitude::Number, rise::Int, flat::Int, fall::Int, delay::Int)</code></pre><p>A trapezoidal gradient pulse defined in Pulseq (see <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/types.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Parsers.gen_section" href="#MRIBuilder.SequenceIO.PulseqIO.Parsers.gen_section"><code>MRIBuilder.SequenceIO.PulseqIO.Parsers.gen_section</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gen_section(sequence, Val(:<title>))</code></pre><p>Creates a specific <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a>{<title>} from a part of the PulseqSequence.</p><p>This is the opposite of <a href="#MRIBuilder.SequenceIO.PulseqIO.Parsers.parse_section"><code>parse_section</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/parsers/parsers.jl#L16-L22">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Parsers.parse_section" href="#MRIBuilder.SequenceIO.PulseqIO.Parsers.parse_section"><code>MRIBuilder.SequenceIO.PulseqIO.Parsers.parse_section</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_section(section)</code></pre><p>Parses any <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a> and return the appropriate type.</p><p>The opposite is <a href="#MRIBuilder.SequenceIO.PulseqIO.Parsers.gen_section"><code>gen_section</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/parsers/parsers.jl#L6-L12">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_dict-Tuple{Any, Any, Any}" href="#MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_dict-Tuple{Any, Any, Any}"><code>MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_dict</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_pulseq_dict(line, names, dtypes)</code></pre><p>Parse a line of integers/floats with known names and dtypes.</p><p>This is useful to parse most of the columnar data in Pulseq, such as in BLOCKS, RF, GRADIENTS, etc.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/basic_parsers.jl#L3-L9">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_properties-Tuple{Vector{<:AbstractString}}" href="#MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_properties-Tuple{Vector{<:AbstractString}}"><code>MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_properties</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_pulseq_properties(lines)</code></pre><p>Parse any <code>pulseq</code> section formatted as:</p><pre><code class="nohighlight hljs"><name> <value> +└─ Pathway</code></pre><h2 id="Sequence-components"><a class="docs-heading-anchor" href="#Sequence-components">Sequence components</a><a id="Sequence-components-1"></a><a class="docs-heading-anchor-permalink" href="#Sequence-components" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.BaseComponent" href="#MRIBuilder.Components.AbstractTypes.BaseComponent"><code>MRIBuilder.Components.AbstractTypes.BaseComponent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type for all individual components that form an MRI sequence (i.e., RF pulse, gradient waveform, or readout event).</p><p>RF pulses, instant gradients, and readouts are grouped together into <a href="#MRIBuilder.Components.AbstractTypes.EventComponent"><code>EventComponent</code></a>.</p><p>These all should have a <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a> in addition to any other relevant <a href="../sequence_optimisation/#variables"><code>variables</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L4-L10">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.EventComponent" href="#MRIBuilder.Components.AbstractTypes.EventComponent"><code>MRIBuilder.Components.AbstractTypes.EventComponent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type for all RF pulses, instant gradients and readouts that might play out during a gradient waveform.</p><p>These all have an <a href="#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a>, which should quantify at what single time one can approximate the RF pulse or readout to have taken place.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L39-L43">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.GradientWaveform" href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>MRIBuilder.Components.AbstractTypes.GradientWaveform</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type for all parts of a gradient waveform.</p><p>N should be 1 for a 1D gradient waveform or 3 for a 3D one.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L13-L17">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.RFPulseComponent" href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>MRIBuilder.Components.AbstractTypes.RFPulseComponent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super type for all RF pulses.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L46-L48">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.ReadoutComponent" href="#MRIBuilder.Components.AbstractTypes.ReadoutComponent"><code>MRIBuilder.Components.AbstractTypes.ReadoutComponent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super type for all readout events.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L93-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.edge_times-Tuple{MRIBuilder.Components.AbstractTypes.BaseComponent}" href="#MRIBuilder.Components.AbstractTypes.edge_times-Tuple{MRIBuilder.Components.AbstractTypes.BaseComponent}"><code>MRIBuilder.Components.AbstractTypes.edge_times</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">edge_times(container/component; tol=1e-6)</code></pre><p>Returns all the edge times during a sequence in ms.</p><p>Edges are defined as any time, when:</p><ul><li>the edge of a building block</li><li>the slope of the gradient profile changes suddenly</li><li>an RF pulse starts or ends</li></ul><p>Edges that are within <code>tol</code> ms of each other are considered to be one edge (default: 1 ns).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L118-L129">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.AbstractTypes.split_timestep-Tuple{Tuple{Number, MRIBuilder.Components.AbstractTypes.EventComponent}, Number}" href="#MRIBuilder.Components.AbstractTypes.split_timestep-Tuple{Tuple{Number, MRIBuilder.Components.AbstractTypes.EventComponent}, Number}"><code>MRIBuilder.Components.AbstractTypes.split_timestep</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">split_timestep(component, precision)</code></pre><p>Indicates the maximum timestep that a component can be linearised with and still achieve the required <code>precision</code>.</p><p>Typically, this will be determined by the maximum second derivative:</p><p><span>$\sqrt{\frac{2 \epsilon}{max(|d^2y/dx^2|)}}$</span></p><p>It should be infinite if the component is linear.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L99-L109">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.amplitude" href="#MRIBuilder.Variables.variables.amplitude"><code>MRIBuilder.Variables.variables.amplitude</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">amplitude(pulse)</code></pre><p>Return the amplitude of an <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L65-L69">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bandwidth" href="#MRIBuilder.Variables.variables.bandwidth"><code>MRIBuilder.Variables.variables.bandwidth</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bandwidth(pulse)</code></pre><p>Return the bandwidth of an <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L86-L90">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.flip_angle" href="#MRIBuilder.Variables.variables.flip_angle"><code>MRIBuilder.Variables.variables.flip_angle</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">flip_angle(pulse)</code></pre><p>Return the flip angle of an <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in degrees.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L79-L83">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.frequency" href="#MRIBuilder.Variables.variables.frequency"><code>MRIBuilder.Variables.variables.frequency</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">frequency(pulse)</code></pre><p>Return the off-resonance frequency of an <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L72-L76">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.gradient_strength" href="#MRIBuilder.Variables.variables.gradient_strength"><code>MRIBuilder.Variables.variables.gradient_strength</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_strength(gradient)</code></pre><p>Maximum 3D gradient strength of the gradient in kHz/um.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.phase" href="#MRIBuilder.Variables.variables.phase"><code>MRIBuilder.Variables.variables.phase</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">phase(pulse)</code></pre><p>Return the phase of an <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in degrees.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L58-L62">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.slew_rate" href="#MRIBuilder.Variables.variables.slew_rate"><code>MRIBuilder.Variables.variables.slew_rate</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slew_rate(gradient)</code></pre><p>Maximum 3D slew rate of the gradient in kHz/um/ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L25-L29">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.GradientWaveforms" href="#MRIBuilder.Components.GradientWaveforms"><code>MRIBuilder.Components.GradientWaveforms</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Module defining sub-types of the <a href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a>.</p><p>There are only three types of [<code>GradientBlock</code>] objects:</p><ul><li><a href="#MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient"><code>ChangingGradient</code></a>: any gradient changing linearly in strength.</li><li><a href="#MRIBuilder.Components.GradientWaveforms.ConstantGradientBlocks.ConstantGradient"><code>ConstantGradient</code></a>: any gradient staying constant in strength. These can overlap with a pulse (<code>SliceSelectPulse</code>).</li><li><a href="#MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient"><code>NoGradient</code></a>: any part of the gradient waveform when no gradient is active.</li></ul><p>These parts are combined into a full gradient waveform in a <code>BuildingBlock</code>.</p><p>Each part of this gradient waveform can compute:</p><ul><li><code>gradient_strength</code>: maximum gradient strength in each dimension.</li><li><code>slew_rate</code>: maximum slew rate in each dimension.</li><li><code>qval</code>/<code>qvec</code>: area under curve</li><li><code>bmat_gradient</code>: diffusion weighting (scalar in 1D or matrix in 3D).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/gradient_waveforms/gradient_waveforms.jl#L1-L16">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient" href="#MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient"><code>MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">NoGradient(duration)</code></pre><p>Part of a gradient waveform when there is no gradient active.</p><p>Usually, you do not want to create this object directly, use a <code>BuildingBlock</code> instead.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/gradient_waveforms/no_gradient_blocks.jl#L7-L13">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.GradientWaveforms.ConstantGradientBlocks.ConstantGradient" href="#MRIBuilder.Components.GradientWaveforms.ConstantGradientBlocks.ConstantGradient"><code>MRIBuilder.Components.GradientWaveforms.ConstantGradientBlocks.ConstantGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ConstantGradient(gradient_strength_vector, duration, group=nothing) +ConstantGradient(gradient_strength_scalar, orientation, duration, group=nothing)</code></pre><p>Underlying type for any flat part in a 3D (first constructor) or 3D (second constructor) gradient waveform.</p><p>Usually, you do not want to create this object directly, use a <code>BuildingBlock</code> instead.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/gradient_waveforms/constant_gradient_blocks.jl#L7-L14">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient" href="#MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient"><code>MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ChangingGradient(grad1_scalar, slew_rate_scalar, orientation, duration, group=nothing) +ChangingGradient(grad1_vec, slew_rate_vec, duration, group=nothing)</code></pre><p>Underlying type for any linearly changing part in a 1D (first constructor) or 3D (second constructor) gradient waveform.</p><p>Usually, you do not want to create this object directly, use a <code>BuildingBlock</code> instead.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/gradient_waveforms/changing_gradient_blocks.jl#L9-L16">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.split_gradient-Tuple{MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient, Vararg{Union{Number, JuMP.AbstractJuMPScalar}}}" href="#MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.split_gradient-Tuple{MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient, Vararg{Union{Number, JuMP.AbstractJuMPScalar}}}"><code>MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.split_gradient</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">split_gradient(constant/changing_gradient_block, times...)</code></pre><p>Split a single gradient at a given times.</p><p>All times are relative to the start of the gradient block (in ms). Times are assumed to be in increasing order and between 0 and the duration of the gradient block.</p><p>For N times this returns a vector with the N+1 replacement <a href="@ref"><code>ConstantGradient</code></a> or <a href="#MRIBuilder.Components.GradientWaveforms.ChangingGradientBlocks.ChangingGradient"><code>ChangingGradient</code></a> objects.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/gradient_waveforms/changing_gradient_blocks.jl#L93-L102">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.InstantGradients.InstantGradient" href="#MRIBuilder.Components.InstantGradients.InstantGradient"><code>MRIBuilder.Components.InstantGradients.InstantGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">InstantGradient(; orientation=nothing, group=nothing, variables...)</code></pre><p>If the <code>orientation</code> is set an <a href="#MRIBuilder.Components.InstantGradients.InstantGradient1D"><code>InstantGradient1D</code></a> is returned, otherwise an <a href="#MRIBuilder.Components.InstantGradients.InstantGradient3D"><code>InstantGradient3D</code></a>.</p><p><strong>Parameters</strong></p><ul><li><code>orientation</code> sets the gradient orientation as a length-3 vector. If not set, the gradient can be in any direction.</li><li><code>group</code>: name of the group to which this gradient belongs (used for scaling and rotating).</li></ul><p><strong>Variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a>: Spatial frequency on which spins will be dephased due to this pulsed gradient in rad/um.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.spoiler-sequence_optimisation"><code>variables.spoiler</code></a>: Length-scale on which spins will be dephased by exactly 2Ï€ in mm.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/instant_gradients.jl#L7-L19">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.InstantGradients.InstantGradient1D" href="#MRIBuilder.Components.InstantGradients.InstantGradient1D"><code>MRIBuilder.Components.InstantGradients.InstantGradient1D</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>An <a href="#MRIBuilder.Components.InstantGradients.InstantGradient"><code>InstantGradient</code></a> with a fixed orientation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/instant_gradients.jl#L37-L39">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.InstantGradients.InstantGradient3D" href="#MRIBuilder.Components.InstantGradients.InstantGradient3D"><code>MRIBuilder.Components.InstantGradients.InstantGradient3D</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>An <a href="#MRIBuilder.Components.InstantGradients.InstantGradient"><code>InstantGradient</code></a> with a variable orientation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/instant_gradients.jl#L48-L50">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.GenericPulses.GenericPulse" href="#MRIBuilder.Components.Pulses.GenericPulses.GenericPulse"><code>MRIBuilder.Components.Pulses.GenericPulses.GenericPulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">GenericPulse(time, amplitude, phase, effective_time=<halfway>) +GenericPulse(time, amplitude; phase=0., frequency=0., effective_time=<halfway>)</code></pre><p>Create a Pulse profile that has been fully defined by N control point.</p><p>All arguments should be arrays of the same length N defining these control points.</p><p>This pulse has no free variables.</p><ul><li><code>time</code>: time since the start of this <a href="@ref"><code>BuildingBlock</code></a> in ms.</li><li><code>amplitude</code>: amplitude of the RF pulse at every timepoint in kHz.</li><li><code>phase</code>: phase of the RF pulse at every timpoint in degrees. If not set explicitly it will be determined by the provided starting <code>phase</code> (degrees) and the <code>frequency</code> (kHz).</li><li><code>effective_time</code>: the time that the RF pulse should be considered to have taken place when computing a <code>Pathway</code> (defaults: whenever half of the final flip angle has been achieved for on-resonance spins).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/generic_pulses.jl#L8-L22">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.GenericPulses.GenericPulse-Tuple{GenericPulse, Number, Number}" href="#MRIBuilder.Components.Pulses.GenericPulses.GenericPulse-Tuple{GenericPulse, Number, Number}"><code>MRIBuilder.Components.Pulses.GenericPulses.GenericPulse</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">GenericPulse(pulse, t1, t2)</code></pre><p>Creates a new <a href="#MRIBuilder.Components.Pulses.GenericPulses.GenericPulse"><code>GenericPulse</code></a> by slicing another pulse between <code>t1</code> and <code>t2</code></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/generic_pulses.jl#L44-L48">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.InstantPulses.InstantPulse" href="#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>MRIBuilder.Components.Pulses.InstantPulses.InstantPulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">InstantPulse(; flip_angle=nothing, phase=nothing, group=nothing)</code></pre><p>Return an instant RF pulse that rotates all spins by <code>flip_angle</code> around an axis that has an angle of <code>phase</code> with the X-Y plane.</p><p><strong>Parameters</strong></p><ul><li><code>group</code>: name of the group to which this pulse belongs. This is used for scaling or adding phases/off-resonance frequencies.</li></ul><p><strong>Variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.flip_angle"><code>variables.flip_angle</code></a>: angle by which spins are rotated in degrees.</li><li><a href="#MRIBuilder.Variables.variables.phase"><code>variables.phase</code></a>: angle of axis around which spins are rotated in degrees.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/instant_pulses.jl#L6-L17">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse" href="#MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse"><code>MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ConstantPulse(; variables...)</code></pre><p>Represents an radio-frequency pulse with a constant amplitude and frequency (i.e., a rectangular function).</p><p><strong>Parameters</strong></p><ul><li><code>group</code>: name of the group to which this pulse belongs. This is used for scaling or adding phases/off-resonance frequencies.</li></ul><p><strong>Variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.flip_angle"><code>variables.flip_angle</code></a>: rotation expected for on-resonance spins in degrees.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: duration of the RF pulse in ms.</li><li><a href="#MRIBuilder.Variables.variables.amplitude"><code>variables.amplitude</code></a>: amplitude of the RF pulse in kHz.</li><li><a href="#MRIBuilder.Variables.variables.phase"><code>variables.phase</code></a>: phase at the start of the RF pulse in degrees.</li><li><a href="#MRIBuilder.Variables.variables.frequency"><code>variables.frequency</code></a>: frequency of the RF pulse relative to the Larmor frequency (in kHz).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/constant_pulses.jl#L7-L21">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.SincPulses.SincPulse" href="#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>MRIBuilder.Components.Pulses.SincPulses.SincPulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SincPulse(; Nzeros=3, apodise=true, variables...)</code></pre><p>Represents a radio-frequency pulse with a sinc-like amplitude and constant frequency.</p><p><strong>Parameters</strong></p><ul><li><code>Nzeros</code>: Number of zero-crossings on each side of the sinc pulse. Can be set to a tuple with two values to have a different number of zero crossings on the left and the right of the sinc pulse.</li><li><code>apodise</code>: if true (default) applies a Hanning apodising window to the sinc pulse.</li><li><code>group</code>: name of the group to which this pulse belongs. This is used for scaling or adding phases/off-resonance frequencies.</li></ul><p><strong>Variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.flip_angle"><code>variables.flip_angle</code></a>: rotation expected for on-resonance spins in degrees.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: duration of the RF pulse in ms.</li><li><a href="#MRIBuilder.Variables.variables.amplitude"><code>variables.amplitude</code></a>: amplitude of the RF pulse in kHz.</li><li><a href="#MRIBuilder.Variables.variables.phase"><code>variables.phase</code></a>: phase at the start of the RF pulse in degrees.</li><li><a href="#MRIBuilder.Variables.variables.frequency"><code>variables.frequency</code></a>: frequency of the RF pulse relative to the Larmor frequency (in kHz).</li><li><a href="#MRIBuilder.Variables.variables.bandwidth"><code>variables.bandwidth</code></a>: width of the rectangular function in frequency space (in kHz). If the <code>duration</code> is short (compared with 1/<code>bandwidth</code>), this bandwidth will only be approximate.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/sinc_pulses.jl#L8-L25">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.N_left" href="#MRIBuilder.Variables.variables.N_left"><code>MRIBuilder.Variables.variables.N_left</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">N_left(sinc_pulse)</code></pre><p>Number of zero-crossings of the <a href="#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> before the maximum.</p><p>Also, see <a href="#MRIBuilder.Variables.variables.N_right"><code>variables.N_right</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/sinc_pulses.jl#L89-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.N_right" href="#MRIBuilder.Variables.variables.N_right"><code>MRIBuilder.Variables.variables.N_right</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">N_left(sinc_pulse)</code></pre><p>Number of zero-crossings of the <a href="#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> after the maximum.</p><p>Also, see <a href="#MRIBuilder.Variables.variables.N_left"><code>variables.N_left</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/sinc_pulses.jl#L98-L104">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.lobe_duration" href="#MRIBuilder.Variables.variables.lobe_duration"><code>MRIBuilder.Variables.variables.lobe_duration</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">lobe_duration(sinc_pulse)</code></pre><p>Time between two zero-crossings of a <a href="#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/sinc_pulses.jl#L113-L117">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.CompositePulses.CompositePulse" href="#MRIBuilder.Components.Pulses.CompositePulses.CompositePulse"><code>MRIBuilder.Components.Pulses.CompositePulses.CompositePulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">CompositePulse(; base_pulse, nweights, variables...)</code></pre><p>A composite RF pulse formed by repeating a base RF pulse.</p><p><strong>Parameters</strong></p><ul><li><code>base_pulse</code>: The base RF pulse that will be repeated.</li><li><code>nweights</code>: The number of repeated pulses. This will be ignored if a vector of <code>weights</code> is explicitly provided.</li></ul><p><strong>Variables</strong></p><ul><li><code>weights</code>: The weight of each of the base RF pulses.</li><li><code>interpulse_delay</code>: Time between the center of the RF pulses. If not otherwise constrained, it will be minimised.</li><li><code>scale_amplitude</code>: How strongly one should scale the amplitude versus the duration to achieve the desired weights. If set to 1 only the RF pulse amplitude will be scaled. If set to 0 only the RF pulse duration will be scaled.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/composite_pulses.jl#L7-L20">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Pulses.CompositePulses.BinomialPulse-Tuple{}" href="#MRIBuilder.Components.Pulses.CompositePulses.BinomialPulse-Tuple{}"><code>MRIBuilder.Components.Pulses.CompositePulses.BinomialPulse</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">BinomialPulse(; base_pulse, npulses, flip=true, variables...)</code></pre><p>Creates a <a href="#MRIBuilder.Components.Pulses.CompositePulses.CompositePulse"><code>CompositePulse</code></a> of <code>npulses</code> repeats of <code>base_pulse</code>, where the <code>weights</code> are set by the biomial distribution.</p><p>If <code>flip</code> is true (default) every other pulse will be flipped (so that the total excitation is canceled). The <code>variables</code> are defined in <a href="#MRIBuilder.Components.Pulses.CompositePulses.CompositePulse"><code>CompositePulse</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/composite_pulses.jl#L146-L153">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Readouts.ADCs.ADC" href="#MRIBuilder.Components.Readouts.ADCs.ADC"><code>MRIBuilder.Components.Readouts.ADCs.ADC</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ADC(; center_halfway=true, oversample=1, variables...)</code></pre><p>Adds a readout event.</p><p><strong>Parameters</strong></p><ul><li><code>center_halfway</code>: by default the <code>time_to_center</code> is assumed to be half of the <code>duration</code>. Set this to false to disable this assumption.</li><li><code>oversample</code>: by how much the ADC should oversample (minimum of 1).</li></ul><p><strong>Variables</strong></p><ul><li><code>resolution</code>: number of voxels in the readout direction. This can be a non-integer value during optimisation.</li><li><code>nsamples</code>: number of samples in the readout. This can be a non-integer value during optimisation.</li><li><code>dwell_time</code>: Time between each readout sample in ms.</li><li><code>duration</code>: Total duration of the ADC event in ms.</li><li><code>time_to_center</code>: time till the center of k-space from start of ADC in ms.</li><li><code>effective_time</code>: same as <code>time_to_center</code>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L8-L24">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.dwell_time" href="#MRIBuilder.Variables.variables.dwell_time"><code>MRIBuilder.Variables.variables.dwell_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">dwell_time(adc)</code></pre><p>The dwell time of the ADC readout in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.nsamples" href="#MRIBuilder.Variables.variables.nsamples"><code>MRIBuilder.Variables.variables.nsamples</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">nsamples(adc)</code></pre><p>Number of samples in an ADC.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L89-L93">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.oversample" href="#MRIBuilder.Variables.variables.oversample"><code>MRIBuilder.Variables.variables.oversample</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">oversample(adc)</code></pre><p>The oversampling rate of the ADC readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L59-L63">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.resolution" href="#MRIBuilder.Variables.variables.resolution"><code>MRIBuilder.Variables.variables.resolution</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">resolution(readout)</code></pre><p>Resolution of the readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.time_to_center" href="#MRIBuilder.Variables.variables.time_to_center"><code>MRIBuilder.Variables.variables.time_to_center</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">time_to_center(adc)</code></pre><p>The time of the ADC readout to reach the center of k-space.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L73-L77">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Components.Readouts.SingleReadouts.SingleReadout" href="#MRIBuilder.Components.Readouts.SingleReadouts.SingleReadout"><code>MRIBuilder.Components.Readouts.SingleReadouts.SingleReadout</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SingleReadout()</code></pre><p>Represents an instantaneous <code>Readout</code> of the signal.</p><p>It has no parameters or variables to set.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/single_readouts.jl#L7-L13">source</a></section></article><h2 id="Containers-for-sequence-components"><a class="docs-heading-anchor" href="#Containers-for-sequence-components">Containers for sequence components</a><a id="Containers-for-sequence-components-1"></a><a class="docs-heading-anchor-permalink" href="#Containers-for-sequence-components" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.ContainerBlock" href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>MRIBuilder.Containers.Abstract.ContainerBlock</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Parent type for <code>BuildingBlock</code> or <code>BaseSequence</code>, i.e., any building block that contains other MRI components/blocks.</p><p>Iterate over them to get the individual components.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L5-L9">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.amplitude" href="#MRIBuilder.Containers.Abstract.amplitude"><code>MRIBuilder.Containers.Abstract.amplitude</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">amplitude(sequence, time)</code></pre><p>Returns the RF amplitude at a particular time within the sequence in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L61-L65">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.end_time-Tuple{ContainerBlock, Any, Vararg{Any}}" href="#MRIBuilder.Containers.Abstract.end_time-Tuple{ContainerBlock, Any, Vararg{Any}}"><code>MRIBuilder.Containers.Abstract.end_time</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">end_time(container, indices...)</code></pre><p>Returns the start time of component with given <code>indices</code> with respect to the start of the <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a>.</p><p>Also see <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>, <a href="#MRIBuilder.Containers.Abstract.start_time-Tuple{ContainerBlock, Any, Any, Vararg{Any}}"><code>start_time</code></a>, and <a href="#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L25-L31">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.frequency" href="#MRIBuilder.Containers.Abstract.frequency"><code>MRIBuilder.Containers.Abstract.frequency</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">frequency(sequence, time)</code></pre><p>Returns the RF frequency at a particular time within the sequence in kHz.</p><p>NaN is returned if there is no pulse activate at that <code>time</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L78-L84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.gradient_strength" href="#MRIBuilder.Containers.Abstract.gradient_strength"><code>MRIBuilder.Containers.Abstract.gradient_strength</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_strength(sequence, time)</code></pre><p>Returns the gradient strength at a particular time within the sequence.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L53-L57">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.iter-Tuple{ContainerBlock, Val}" href="#MRIBuilder.Containers.Abstract.iter-Tuple{ContainerBlock, Val}"><code>MRIBuilder.Containers.Abstract.iter</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">iter(sequence, get_type)</code></pre><p>Helper functions for any <code>iter_*</code> functions.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L87-L91">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.iter_blocks-Tuple{ContainerBlock}" href="#MRIBuilder.Containers.Abstract.iter_blocks-Tuple{ContainerBlock}"><code>MRIBuilder.Containers.Abstract.iter_blocks</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">iter_blocks(sequence)</code></pre><p>Returns all the building blocks in the sequence with the time they will start</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L99-L103">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.iter_instant_gradients-Tuple{ContainerBlock}" href="#MRIBuilder.Containers.Abstract.iter_instant_gradients-Tuple{ContainerBlock}"><code>MRIBuilder.Containers.Abstract.iter_instant_gradients</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">iter_instant_gradients(sequence)</code></pre><p>Returns all the <a href="#MRIBuilder.Components.InstantGradients.InstantGradient"><code>InstantGradient</code></a> within the sequence with their timings</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L114-L118">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.iter_instant_pulses-Tuple{ContainerBlock}" href="#MRIBuilder.Containers.Abstract.iter_instant_pulses-Tuple{ContainerBlock}"><code>MRIBuilder.Containers.Abstract.iter_instant_pulses</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">iter_instant_pulses(sequence)</code></pre><p>Returns all the <a href="#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a> within the sequence with their timings</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L106-L110">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.phase" href="#MRIBuilder.Containers.Abstract.phase"><code>MRIBuilder.Containers.Abstract.phase</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">phase(sequence, time)</code></pre><p>Returns the RF phase at a particular time within the sequence in degrees.</p><p>NaN is returned if there is no pulse activate at that <code>time</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L69-L75">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Abstract.start_time-Tuple{ContainerBlock, Any, Any, Vararg{Any}}" href="#MRIBuilder.Containers.Abstract.start_time-Tuple{ContainerBlock, Any, Any, Vararg{Any}}"><code>MRIBuilder.Containers.Abstract.start_time</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">start_time(container, indices...)</code></pre><p>Returns the start time of component with given <code>indices</code> with respect to the start of the <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a>.</p><p>Also see <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>, <a href="#MRIBuilder.Containers.Abstract.end_time-Tuple{ContainerBlock, Any, Vararg{Any}}"><code>end_time</code></a>, and <a href="#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L13-L19">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.get_gradient" href="#MRIBuilder.Variables.get_gradient"><code>MRIBuilder.Variables.get_gradient</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_gradient(container, time)</code></pre><p>Gets the gradient running at a particular <code>time</code> (in ms) during a sequence of building block.</p><p>This function will return a tuple with 2 elements:</p><ol><li>The <a href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a> itself (which could be a <a href="#MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient"><code>NoGradient</code></a> object).</li><li>The time since the start of the gradient</li></ol></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L134-L142">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.get_pulse" href="#MRIBuilder.Variables.get_pulse"><code>MRIBuilder.Variables.get_pulse</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_pulse(container, time)</code></pre><p>Gets the pulse running at a particular <code>time</code> (in ms) during a sequence of building block.</p><p>If there is a RF pulse, this function will return a tuple with 2 elements:</p><ol><li>The <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> itself</li><li>The time since the start of the pulse</li></ol><p>If there is no active RF pulse, <code>nothing</code> is returned.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L122-L131">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.effective_time" href="#MRIBuilder.Variables.variables.effective_time"><code>MRIBuilder.Variables.variables.effective_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">effective_time(container, indices...)</code></pre><p>Returns the start time of component with given <code>indices</code> with respect to the start of the <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a>.</p><p>This will crash if the component does not have an <a href="#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a> (e.g., if it is (part of) a gradient waveform).</p><p>Also see <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>, <a href="#MRIBuilder.Containers.Abstract.start_time-Tuple{ContainerBlock, Any, Any, Vararg{Any}}"><code>start_time</code></a>, and <a href="#MRIBuilder.Containers.Abstract.end_time-Tuple{ContainerBlock, Any, Vararg{Any}}"><code>end_time</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L41-L49">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.readout_times" href="#MRIBuilder.Variables.variables.readout_times"><code>MRIBuilder.Variables.variables.readout_times</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">readout_times(sequence)</code></pre><p>Returns all the times that the sequence will readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L146-L150">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks" href="#MRIBuilder.Containers.BuildingBlocks"><code>MRIBuilder.Containers.BuildingBlocks</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Defines <a href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a>, <a href="#MRIBuilder.Containers.BuildingBlocks.BuildingBlock"><code>BuildingBlock</code></a> and <a href="#MRIBuilder.Containers.BuildingBlocks.Wait"><code>Wait</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock" href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Basic BuildingBlock, which can consist of a gradient waveforms with any number of RF pulses/readouts overlaid</p><p>Main interface:</p><ul><li>iteration will give the gradient waveforms interspersed by RF pulses/readouts.<ul><li>Indiviual indices can be accessed using <code>keys(building_block)</code></li></ul></li><li><a href="#MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock, Any, Any}"><code>waveform_sequence</code></a> returns just the gradient waveform as a sequence of <a href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a> objects.</li><li><a href="#MRIBuilder.Containers.BuildingBlocks.waveform-Tuple{BaseBuildingBlock}"><code>waveform</code></a> returns just the gradient waveform as a sequence of (time, gradient_strength) tuples.</li><li><a href="#MRIBuilder.Containers.BuildingBlocks.events-Tuple{BaseBuildingBlock}"><code>events</code></a> returns the RF pulses and readouts.</li><li><a href="#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a> returns area under curve for (part of) the gradient waveform.</li></ul><p>Sub-types need to implement:</p><ul><li><code>Base.keys</code>: returns sequence of keys to all the components.</li><li><code>Base.getindex</code>: returns the actual component for each key. For <code>events</code> (readout/pulses) this should return a tuple with <code>(time delay till start, event)</code>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L12-L26">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.BuildingBlock" href="#MRIBuilder.Containers.BuildingBlocks.BuildingBlock"><code>MRIBuilder.Containers.BuildingBlocks.BuildingBlock</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">BuildingBlock(waveform, events; duration=nothing, orientation=nothing, group)</code></pre><p>Generic <a href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a> that can capture any overlapping gradients, RF pulses, and/or readouts. The gradients cannot contain any free variables.</p><p>Scanner constraints are automatically applied.</p><p><strong>Arguments</strong></p><ul><li><code>waveform</code>: Sequence of 2-element tuples with (time, (Gx, Gy, Gz)). If <code>orientation</code> is set then the tuple is expected to look like (time, G). This cannot contain any free variables.</li><li><code>events</code>: Sequence of 2-element tuples with (time, pulse/readout). The <code>time</code> is the start time of the pulse/readout.</li><li><code>duration</code>: duration of this <code>BuildingBlock</code>. If not set then it will be assumed to be the time of the last element in <code>waveform</code>.</li><li><code>orientation</code>: orientation of the gradients in the waveform. If not set, then the full gradient vector should be given explicitly.</li><li><code>group</code>: group of the gradient waveform</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L307-L321">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.BuildingBlock-Tuple{MRIBuilder.Components.AbstractTypes.EventComponent}" href="#MRIBuilder.Containers.BuildingBlocks.BuildingBlock-Tuple{MRIBuilder.Components.AbstractTypes.EventComponent}"><code>MRIBuilder.Containers.BuildingBlocks.BuildingBlock</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">BuildingBlock(pulse/readout)</code></pre><p>Creates a <code>BuildingBlock</code> with no gradients and just the single [<code>EventComponent</code>]@(ref).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L362-L366">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.Wait" href="#MRIBuilder.Containers.BuildingBlocks.Wait"><code>MRIBuilder.Containers.BuildingBlocks.Wait</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>An empty BuildingBlock representing dead time.</p><p>It only has a single variable, namely its <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L406-L410">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.events-Tuple{BaseBuildingBlock}" href="#MRIBuilder.Containers.BuildingBlocks.events-Tuple{BaseBuildingBlock}"><code>MRIBuilder.Containers.BuildingBlocks.events</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">events(building_block)</code></pre><p>Returns just the non-gradient (i.e., RF pulses/readouts) events as a sequence of <a href="#MRIBuilder.Components.AbstractTypes.EventComponent"><code>EventComponent</code></a> objects (with their keys).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L38-L42">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.waveform-Tuple{BaseBuildingBlock}" href="#MRIBuilder.Containers.BuildingBlocks.waveform-Tuple{BaseBuildingBlock}"><code>MRIBuilder.Containers.BuildingBlocks.waveform</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">waveform(building_block)</code></pre><p>Returns the gradient waveform of any <a href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a> as a sequence of control points.</p><p>Each control point is stored as a tuple with the time in ms and the gradient as a length-3 vector. The gradient is linearly interpolated between these points (see <a href="#MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock, Any, Any}"><code>waveform_sequence</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L84-L91">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock, Any, Any}" href="#MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock, Any, Any}"><code>MRIBuilder.Containers.BuildingBlocks.waveform_sequence</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">waveform_sequence(building_block, first, last)</code></pre><p>Gets the sequence of <a href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a> from the event with key <code>first</code> till the event with key <code>last</code>.</p><p>Setting <code>first</code> to nothing indicates to start from the beginning of the <code>building_block</code>. Similarly, setting <code>last</code> to nothing indicates to continue till the end of the <code>building_block</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L154-L161">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock}" href="#MRIBuilder.Containers.BuildingBlocks.waveform_sequence-Tuple{BaseBuildingBlock}"><code>MRIBuilder.Containers.BuildingBlocks.waveform_sequence</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">waveform_sequence(building_block)</code></pre><p>Returns just the gradient waveform as a sequence of <a href="#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a> objects (with their keys).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L47-L51">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bmat_gradient" href="#MRIBuilder.Variables.variables.bmat_gradient"><code>MRIBuilder.Variables.variables.bmat_gradient</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bmat_gradient(overlapping, qstart[, first_event, last_event])</code></pre><p>Computes the addition to the <a href="../defining_sequence/#MRIBuilder.Variables.variables.bmat"><code>variables.bmat</code></a> contributed by a specific building block or gradient.</p><p><code>qstart</code> represents the <a href="#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a> at the start of this component.</p><p>If <code>first_event</code> is set to something else than <code>nothing</code>, only the gradient waveform after this RF pulse/Readout will be considered. Similarly, if <code>last_event</code> is set to something else than <code>nothing</code>, only the gradient waveform up to this RF pulse/Readout will be considered.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L243-L252">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.qvec" href="#MRIBuilder.Variables.variables.qvec"><code>MRIBuilder.Variables.variables.qvec</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">qvec(overlapping[, first_event, last_event])</code></pre><p>Computes the area under the curve for the gradient waveform in <a href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a>.</p><p>If <code>first_event</code> is set to something else than <code>nothing</code>, only the gradient waveform after this RF pulse/Readout will be considered. Similarly, if <code>last_event</code> is set to something else than <code>nothing</code>, only the gradient waveform up to this RF pulse/Readout will be considered.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L233-L240">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences" href="#MRIBuilder.Containers.BaseSequences"><code>MRIBuilder.Containers.BaseSequences</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Defines <a href="#MRIBuilder.Containers.BaseSequences.BaseSequence"><code>BaseSequence</code></a> and <a href="#MRIBuilder.Containers.BaseSequences.Sequence"><code>Sequence</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/base_sequences.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences.BaseSequence" href="#MRIBuilder.Containers.BaseSequences.BaseSequence"><code>MRIBuilder.Containers.BaseSequences.BaseSequence</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type of any sequence of non-overlapping building blocks that should be played after each other.</p><p>It contains <code>N</code> <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a> objects (e.g., building blocks or other sequences).</p><p>Main interface:</p><ul><li>Acts as an iterable containing the blocks and sequences.<ul><li>Indiviual blocks/sequences can be obtained using indexing.</li><li>If there is a finite number of repeats, the iteration will continue over all repeats.</li></ul></li></ul><p>Sub-types need to implement:</p><ul><li><code>get_index_single_TR</code>: return the index assuming it is between 1 and N</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/base_sequences.jl#L14-L26">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences.Sequence" href="#MRIBuilder.Containers.BaseSequences.Sequence"><code>MRIBuilder.Containers.BaseSequences.Sequence</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">Sequence(blocks; name=:Sequence, variables...) +Sequence(blocks...; name=:Sequence, variables...)</code></pre><p>Defines an MRI sequence from a vector of building blocks.</p><p><strong>Arguments</strong></p><ul><li><code>blocks</code>: The actual building blocks that will be played in sequence. All the building blocks must be of type <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a>, which means that they cannot only contain actual <a href="#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a> objects, but also other <a href="#MRIBuilder.Containers.BaseSequences.BaseSequence"><code>BaseSequence</code></a> objects. Objects of a different type are converted into a <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a> internally:<ul><li>numbers/<code>nothing</code>/<code>:min</code>/<code>:max</code> : replaced with a <a href="#MRIBuilder.Containers.BuildingBlocks.Wait"><code>Wait</code></a> block with the appropriate constraint/objective added to its <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>.</li><li>RF pulse or readout: will be embedded within a <a href="#MRIBuilder.Containers.BuildingBlocks.BuildingBlock"><code>BuildingBlock</code></a> of the appropriate length</li></ul></li></ul><p>Specific named sequences might define additional variables.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/base_sequences.jl#L137-L150">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences.get_index_single_TR-Tuple{BaseSequence, Integer}" href="#MRIBuilder.Containers.BaseSequences.get_index_single_TR-Tuple{BaseSequence, Integer}"><code>MRIBuilder.Containers.BaseSequences.get_index_single_TR</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_index_single_TR(sequence, index)</code></pre><p>Used internally by any <a href="#MRIBuilder.Containers.BaseSequences.BaseSequence"><code>BaseSequence</code></a> to get a specific block. The <code>index</code> should be between 1 and N. It should be implemented for any sub-classes of <a href="#MRIBuilder.Containers.BaseSequences.BaseSequence"><code>BaseSequence</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/base_sequences.jl#L88-L94">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences.nrepeat-Tuple{BaseSequence}" href="#MRIBuilder.Containers.BaseSequences.nrepeat-Tuple{BaseSequence}"><code>MRIBuilder.Containers.BaseSequences.nrepeat</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">nrepeat(sequence)</code></pre><p>How often sequence should be repeated. </p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/base_sequences.jl#L98-L102">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.BaseSequences.to_block-Tuple{ContainerBlock}" href="#MRIBuilder.Containers.BaseSequences.to_block-Tuple{ContainerBlock}"><code>MRIBuilder.Containers.BaseSequences.to_block</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">to_block(block_like)</code></pre><p>Converst object into something that can be included in the sequence:</p><ul><li>:min/:max/number/variable/nothing => <a href="#MRIBuilder.Containers.BuildingBlocks.Wait"><code>Wait</code></a>.</li><li><code>building_block</code> or <code>sequence</code> => no change.</li><li>RF pulse/readout => will be embedded within a <a href="#MRIBuilder.Containers.BuildingBlocks.BuildingBlock"><code>BuildingBlock</code></a>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/base_sequences.jl#L201-L208">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Alternatives.AbstractAlternativeBlocks" href="#MRIBuilder.Containers.Alternatives.AbstractAlternativeBlocks"><code>MRIBuilder.Containers.Alternatives.AbstractAlternativeBlocks</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Parent type for all blocks that can take different MR sequence components between multiple repetitions of the sequence.</p><p>They can be extended into their individual components using <code>adjust(<name>=:all)</code>.</p><p>Each subtype of <a href="@ref"><code>AbstractAlternativeBlock</code></a> needs to implement two methods:</p><ul><li><a href="#MRIBuilder.Containers.Alternatives.get_alternatives_name-Tuple{AlternativeBlocks}"><code>get_alternatives_name</code></a>: returns the <code>name</code> used to identify this block in <code>adjust</code></li><li><a href="#MRIBuilder.Containers.Alternatives.get_alternatives_options-Tuple{AlternativeBlocks}"><code>get_alternatives_options</code></a>: returns a dictionary mapping the name of the different options to a <a href="#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a> with the actual sequence building block.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/alternatives.jl#L7-L15">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Alternatives.AlternativeBlocks" href="#MRIBuilder.Containers.Alternatives.AlternativeBlocks"><code>MRIBuilder.Containers.Alternatives.AlternativeBlocks</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">AlternativeBlocks(name, blocks)</code></pre><p>Represents a part of the sequence where there are multiple possible alternatives.</p><p>Variables can be matched across these alternatives using <a href="#MRIBuilder.Containers.Alternatives.match_blocks!-Tuple{AbstractAlternativeBlocks, Any}"><code>match_blocks!</code></a>.</p><p>The <code>name</code> is a symbol that is used to identify this <code>AlternativeBlocks</code> in the broader sequence (as in <code>adjust</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/alternatives.jl#L18-L26">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Alternatives.get_alternatives_name-Tuple{AlternativeBlocks}" href="#MRIBuilder.Containers.Alternatives.get_alternatives_name-Tuple{AlternativeBlocks}"><code>MRIBuilder.Containers.Alternatives.get_alternatives_name</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_alternatives_name(alternative_block)</code></pre><p>Get the name with which any <a href="#MRIBuilder.Containers.Alternatives.AbstractAlternativeBlocks"><code>AbstractAlternativeBlocks</code></a> will be identified in a call to <code>adjust</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/alternatives.jl#L34-L38">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Alternatives.get_alternatives_options-Tuple{AlternativeBlocks}" href="#MRIBuilder.Containers.Alternatives.get_alternatives_options-Tuple{AlternativeBlocks}"><code>MRIBuilder.Containers.Alternatives.get_alternatives_options</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_alternatives_options(alternative_block)</code></pre><p>Get the options available for a <a href="#MRIBuilder.Containers.Alternatives.AbstractAlternativeBlocks"><code>AbstractAlternativeBlocks</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/alternatives.jl#L41-L45">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Containers.Alternatives.match_blocks!-Tuple{AbstractAlternativeBlocks, Any}" href="#MRIBuilder.Containers.Alternatives.match_blocks!-Tuple{AbstractAlternativeBlocks, Any}"><code>MRIBuilder.Containers.Alternatives.match_blocks!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">match_blocks!(alternatives, function)</code></pre><p>Matches the outcome of given <code>function</code> on each of the building blocks in <a href="#MRIBuilder.Containers.Alternatives.AlternativeBlocks"><code>AlternativeBlocks</code></a>.</p><p>For example, <code>match_blocks!(alternatives, duration)</code> will ensure that all the alternative building blocks have the same duration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/alternatives.jl#L55-L61">source</a></section></article><h2 id="Pre-defined-sequence-parts"><a class="docs-heading-anchor" href="#Pre-defined-sequence-parts">Pre-defined sequence parts</a><a id="Pre-defined-sequence-parts-1"></a><a class="docs-heading-anchor-permalink" href="#Pre-defined-sequence-parts" title="Permalink"></a></h2><p>There are <a href="../defining_sequence/#helper_functions">helper functions</a> available to actually add these to a sequence.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids" href="#MRIBuilder.Parts.Trapezoids"><code>MRIBuilder.Parts.Trapezoids</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Defines a set of different options for MRI gradients.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids.BaseTrapezoid" href="#MRIBuilder.Parts.Trapezoids.BaseTrapezoid"><code>MRIBuilder.Parts.Trapezoids.BaseTrapezoid</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Parent type for any <code>BuildingBlock</code> that has a trapezoidal gradient waveform.</p><p>Sub-types:</p><ul><li><a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a></li><li><a href="#MRIBuilder.Parts.Trapezoids.SliceSelect"><code>SliceSelect</code></a></li><li><a href="#MRIBuilder.Parts.Trapezoids.LineReadout"><code>LineReadout</code></a></li></ul><p>The <code>N</code> indicates whether the gradient has a fixed orientation (N=1) or is free (N=3).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L14-L23">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids.LineReadout" href="#MRIBuilder.Parts.Trapezoids.LineReadout"><code>MRIBuilder.Parts.Trapezoids.LineReadout</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">LineReadout(adc; ramp_overlap=1., orientation=nothing, group=nothing, variables...)</code></pre><p>Defines a trapezoidal gradient with an ADC readout overlaid.</p><p>Parameters and variables are identical as for <a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> with the addition of:</p><p><strong>Parameters</strong></p><ul><li><code>adc</code>: <a href="#MRIBuilder.Components.Readouts.ADCs.ADC"><code>ADC</code></a> object that describes the readout.</li><li><code>ramp_overlap</code>: how much the gradient ramp should overlap with the ADC. 0 for no overlap, 1 for full overlap (default: 1). Can be set to <code>nothing</code> to become a free variable.</li></ul><p><strong>Variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.fov"><code>variables.fov</code></a>: FOV of the output image along this single k-space line in mm.</li><li><a href="#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a>: size of each voxel along this single k-space line in mm.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L239-L253">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids.SliceSelect" href="#MRIBuilder.Parts.Trapezoids.SliceSelect"><code>MRIBuilder.Parts.Trapezoids.SliceSelect</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SliceSelect(pulse; orientation=nothing, group=nothing, variables...)</code></pre><p>Defines a trapezoidal gradient with a pulse played out during the flat time.</p><p>Parameters and variables are identical as for <a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> with the addition of:</p><p><strong>Parameters</strong></p><ul><li><code>pulse</code>: sub-type of <a href="#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> that describes the RF pulse.</li></ul><p><strong>Variables</strong></p><ul><li><code>slice_thickness</code>: thickness of the selected slice in mm</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L179-L191">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids.Trapezoid" href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>MRIBuilder.Parts.Trapezoids.Trapezoid</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">Trapezoid(; orientation=nothing, group=nothing, variables...)</code></pre><p>Defines a trapezoidal pulsed gradient</p><p><strong>Parameters</strong></p><ul><li><code>orientation</code> sets the gradient orientation (completely free by default). Can be set to a vector for a fixed orientation.</li><li><code>group</code>: assign the trapezoidal gradient to a specific group. This group will be used to scale or rotate the gradients after optimisation.</li></ul><p><strong>Variables</strong></p><p>Variables can be set during construction or afterwards as an attribute. If not set, they will be determined during the sequence optimisation.</p><p><strong>Timing variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.rise_time"><code>variables.rise_time</code></a>: Time of the gradient to reach from 0 to maximum in ms. If explicitly set to 0, the scanner slew rate will be ignored.</li><li><a href="#MRIBuilder.Variables.variables.flat_time"><code>variables.flat_time</code></a>: Time that the gradient stays at maximum strength in ms.</li><li><a href="#MRIBuilder.Variables.variables.δ"><code>variables.δ</code></a>: effective pulse duration (<code>rise_time</code> + <code>flat_time</code>) in ms.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: total pulse duration (2 * <code>rise_time</code> + <code>flat_time</code>) in ms.</li></ul><p><strong>Gradient variables</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.gradient_strength"><code>variables.gradient_strength</code></a>: Maximum gradient strength achieved during the pulse in kHz/um</li><li><a href="#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a>: Spatial scale on which spins will be dephased due to this pulsed gradient in rad/um (given by <code>δ</code> * <code>gradient_strength</code>).</li></ul><p>The <code>bvalue</code> can be constrained for multiple gradient pulses by creating a <code>Pathway</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L26-L48">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.Trapezoids.opposite_kspace_lines-Tuple{}" href="#MRIBuilder.Parts.Trapezoids.opposite_kspace_lines-Tuple{}"><code>MRIBuilder.Parts.Trapezoids.opposite_kspace_lines</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">opposite_kspace_lines(; orientation=[1, 0, 0], kwargs...)</code></pre><p>Return a positive and negative readout of a k-space line.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L314-L318">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.flat_time" href="#MRIBuilder.Variables.variables.flat_time"><code>MRIBuilder.Variables.variables.flat_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">flat_time(trapezoid)</code></pre><p>Returns the flat time of a <a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L124-L128">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.fov" href="#MRIBuilder.Variables.variables.fov"><code>MRIBuilder.Variables.variables.fov</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">fov(readout)</code></pre><p>Defines the field of view of a readout in mm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L288-L292">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.ramp_overlap" href="#MRIBuilder.Variables.variables.ramp_overlap"><code>MRIBuilder.Variables.variables.ramp_overlap</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ramp_overlap(line_readout)</code></pre><p>Return the fraction of the gradient ramp that overlaps with the ADC readout.</p><p>Set to 0 to ensure that the ADC is only active during the flat time of the readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L302-L308">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.rise_time" href="#MRIBuilder.Variables.variables.rise_time"><code>MRIBuilder.Variables.variables.rise_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">rise_time(trapezoid)</code></pre><p>Returns the rise time of a <a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L117-L121">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.slice_thickness" href="#MRIBuilder.Variables.variables.slice_thickness"><code>MRIBuilder.Variables.variables.slice_thickness</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slice_thickness(slice_select)</code></pre><p>Defines the slice thickness for a RF pulse with an active gradient in mm (e.g., <a href="#MRIBuilder.Parts.Trapezoids.SliceSelect"><code>SliceSelect</code></a>).</p><p>Defines as <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.gradient_strength_norm-sequence_optimisation"><code>variables.gradient_strength_norm</code></a>(gradient) / <a href="#MRIBuilder.Variables.variables.bandwidth"><code>variables.bandwidth</code></a>(pulse)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L213-L219">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.voxel_size" href="#MRIBuilder.Variables.variables.voxel_size"><code>MRIBuilder.Variables.variables.voxel_size</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">voxel_size(readout)</code></pre><p>Defines the voxel size of a readout in mm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L295-L299">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.δ" href="#MRIBuilder.Variables.variables.δ"><code>MRIBuilder.Variables.variables.δ</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">δ(trapezoid)</code></pre><p>Returns the effective duration of a <a href="#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p><p>Defined as <a href="#MRIBuilder.Variables.variables.rise_time"><code>variables.rise_time</code></a> + <a href="#MRIBuilder.Variables.variables.flat_time"><code>variables.flat_time</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L136-L142">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect" href="#MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect"><code>MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SpoiltSliceSelect(pulse; parameters..., variables...)</code></pre><p>Adds slice selection to the <code>pulse</code> and surrounds it with spoiler gradients.</p><p><strong>Parameters</strong></p><ul><li><code>orientation</code>: vector with orientation of the slice selection and the spoilers (default: [0, 0, 1])</li><li><code>group</code>: name of the group of the gradient. This will be used to scale and rotate the gradients after optimisation. Scaling is not recommended as this might ruin the spoiling.</li></ul><p><strong>Variables</strong></p><ul><li><code>duration</code>: total duration of the block in ms.</li><li><code>slice_thickness</code>: slice thickness in mm.</li><li><code>spoiler</code>: length scale on which the spoilers achieve 2Ï€ dephasing in mm. This sets the minimum spoiling. If this spoiling level is not achieved by the slice-select gradient alone, then there will be additional gradients added.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/spoilt_slice_selects.jl#L12-L25">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.all_gradient_strengths" href="#MRIBuilder.Variables.variables.all_gradient_strengths"><code>MRIBuilder.Variables.variables.all_gradient_strengths</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">all_gradient_strengths(spoilt_slice_select)</code></pre><p>Returns the gradient strength before, during, and after the pulse in <a href="#MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect"><code>SpoiltSliceSelect</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/spoilt_slice_selects.jl#L127-L131">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.fall_time" href="#MRIBuilder.Variables.variables.fall_time"><code>MRIBuilder.Variables.variables.fall_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">fall_time(spoilt_slice_select)</code></pre><p>Returns the time of the <a href="#MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect"><code>SpoiltSliceSelect</code></a> to return to zero.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/spoilt_slice_selects.jl#L135-L139">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.SliceSelectRephases.SliceSelectRephase" href="#MRIBuilder.Parts.SliceSelectRephases.SliceSelectRephase"><code>MRIBuilder.Parts.SliceSelectRephases.SliceSelectRephase</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SliceSelectRephase(pulse; kwargs...)</code></pre><p>Creates an excitatory RF pulse with slice selection and a rephasing gradient.</p><p>Parameters are the same as for <a href="#MRIBuilder.Parts.Trapezoids.SliceSelect"><code>SliceSelect</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/slice_select_rephases.jl#L7-L13">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.EPIReadouts.EPIReadout" href="#MRIBuilder.Parts.EPIReadouts.EPIReadout"><code>MRIBuilder.Parts.EPIReadouts.EPIReadout</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">EPIReadout(; resolution, ky_lines=-resolution[2]:resolution[2], recenter=false, group=:FOV, variables...)</code></pre><p>Defines an (accelerated) EPI readout.</p><p><strong>Parameters</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>: Resolution of the final image in the frequency- and phase-encode directions.</li><li><code>recenter</code>: if true, the signal will be recentred in k-space after the EPI readout.</li><li><code>group</code>: name of the group used to rotate the readout gradients (default: :FOV).</li></ul><p><strong>Variables:</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a>: size of the voxel in the frequency- and phase-encode directions.</li><li><a href="#MRIBuilder.Variables.variables.fov"><code>variables.fov</code></a>: size of the FOV in the frequency- and phase-encode directions.</li><li><a href="#MRIBuilder.Variables.variables.ramp_overlap"><code>variables.ramp_overlap</code></a>: what fraction of the gradient ramp should overlap with the readout.</li><li><a href="#MRIBuilder.Variables.variables.oversample"><code>variables.oversample</code></a>: by how much to oversample in the frequency-encode direcion.</li><li><a href="#MRIBuilder.Variables.variables.dwell_time"><code>variables.dwell_time</code></a>: dwell time in the frequency-encode direction</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/epi_readouts.jl#L8-L24">source</a></section></article><h2 id="Sequence-I/O"><a class="docs-heading-anchor" href="#Sequence-I/O">Sequence I/O</a><a id="Sequence-I/O-1"></a><a class="docs-heading-anchor-permalink" href="#Sequence-I/O" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.Pulseq" href="#MRIBuilder.SequenceIO.Pulseq"><code>MRIBuilder.SequenceIO.Pulseq</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Module converting MRIBuilder sequences to and from sequences recognised by <a href="@ref"><code>PulseqIO</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO" href="#MRIBuilder.SequenceIO.PulseqIO"><code>MRIBuilder.SequenceIO.PulseqIO</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Stand-alone module that reads/writes Pulseq files.</p><p>The pulseq files are read into or written from a set of types that closely match the Pulseq file format. The translation of these types into MRIBuilder types is defined in "../pulseq.jl" (i.e., <code>MRIBuilder.SequenceIO.Pulseq</code>)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/pulseq_io.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.read_pulseq-Tuple{IO}" href="#MRIBuilder.SequenceIO.PulseqIO.read_pulseq-Tuple{IO}"><code>MRIBuilder.SequenceIO.PulseqIO.read_pulseq</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">read_pulseq(IO)</code></pre><p>Reads a sequence from a pulseq file (http://pulseq.github.io/). Pulseq files can be produced using matlab (http://pulseq.github.io/) or python (https://pypulseq.readthedocs.io/en/master/).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/pulseq_io.jl#L20-L25">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.write_pulseq-Tuple{IO, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence}" href="#MRIBuilder.SequenceIO.PulseqIO.write_pulseq-Tuple{IO, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence}"><code>MRIBuilder.SequenceIO.PulseqIO.write_pulseq</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">write_pulseq(IO, sequence)</code></pre><p>Writes a sequence to an output IO file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/pulseq_io.jl#L31-L35">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types" href="#MRIBuilder.SequenceIO.PulseqIO.Types"><code>MRIBuilder.SequenceIO.PulseqIO.Types</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Define the main types forming a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>PulseqSequence</code></a>.</p><p>Extensions and sections types are defined in their own modules.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L1-L5">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqComponent" href="#MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqComponent"><code>MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqComponent</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type for any RF pulses/gradients/ADC/extensions that can play out during a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqBlock"><code>PulseqBlock</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L26-L28">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqGradient" href="#MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqGradient"><code>MRIBuilder.SequenceIO.PulseqIO.Types.AnyPulseqGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Super-type of Pulseq gradients:</p><ul><li><a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqGradient"><code>PulseqGradient</code></a></li><li><a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqTrapezoid"><code>PulseqTrapezoid</code></a></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L47-L51">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqADC" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqADC"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqADC</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqADC(num::Int, dwell::Float64, delay::Int, frequency::Number, phase::Number)</code></pre><p>A trapezoidal gradient pulse defined in Pulseq (see <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L79-L83">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqBlock" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqBlock"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqBlock</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqBlock(duration::Int, rf::PulseqRFPulse, gx::AnyPulseqGradient, gy::AnyPulseqGradient, gz::AnyPulseqGradient, adc::PulseqADC, ext)</code></pre><p>Defines a Building Block with the Pulseq sequence (see <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>).</p><p>The RF pulse, gradients, and ADC can be set to <code>nothing</code>.</p><p>The <code>ext</code> is a sequence of extension blocks that will be played out. Set this to a sequence of zero length to not have any extensions.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L111-L120">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtension" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtension"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtension</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqExtension(definition::PulseqExtensionDefinition, id::Int)</code></pre><p>Reference to a specific implementation of a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtensionDefinition"><code>PulseqExtensionDefinition</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L101-L105">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtensionDefinition" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtensionDefinition"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqExtensionDefinition</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqExtensionDefinition(name, content)</code></pre><p>Abstract definition of an unknown Pulseq extension.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L92-L96">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqGradient" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqGradient"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqGradient</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqGradient(amplitude::Number, shape::PulseqShape, time::PulseqShape, delay::int)</code></pre><p>A generic gradient waveform defined in Pulseq (see <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L54-L58">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqRFPulse" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqRFPulse"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqRFPulse</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqRFPulse(amplitude::Number, magnitude::PulseqShape, phase::PulseqShape, time::PulseqShape, delay::Int, frequency::Number, phase_offset::Number)</code></pre><p>An RF pulse defined in Pulseq (see <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqSection(:<title>)(lines)</code></pre><p>Represents a section in the pulseq file format.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L8-L12">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqSequence(version::VersionNumber, definitions::NamedTuple, blocks::Vector{PulseqBlock})</code></pre><p>A full sequence defined according to the Pulseq <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L131-L135">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqShape(samples)</code></pre><p>Define the shape of a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqRFPulse"><code>PulseqRFPulse</code></a> or <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqGradient"><code>PulseqGradient</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L17-L21">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Types.PulseqTrapezoid" href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqTrapezoid"><code>MRIBuilder.SequenceIO.PulseqIO.Types.PulseqTrapezoid</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqTrapezoid(amplitude::Number, rise::Int, flat::Int, fall::Int, delay::Int)</code></pre><p>A trapezoidal gradient pulse defined in Pulseq (see <a href="https://raw.githubusercontent.com/pulseq/pulseq/master/doc/specification.pdf">specification</a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/types.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Parsers.gen_section" href="#MRIBuilder.SequenceIO.PulseqIO.Parsers.gen_section"><code>MRIBuilder.SequenceIO.PulseqIO.Parsers.gen_section</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gen_section(sequence, Val(:<title>))</code></pre><p>Creates a specific <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a>{<title>} from a part of the PulseqSequence.</p><p>This is the opposite of <a href="#MRIBuilder.SequenceIO.PulseqIO.Parsers.parse_section"><code>parse_section</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/parsers/parsers.jl#L16-L22">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Parsers.parse_section" href="#MRIBuilder.SequenceIO.PulseqIO.Parsers.parse_section"><code>MRIBuilder.SequenceIO.PulseqIO.Parsers.parse_section</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_section(section)</code></pre><p>Parses any <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a> and return the appropriate type.</p><p>The opposite is <a href="#MRIBuilder.SequenceIO.PulseqIO.Parsers.gen_section"><code>gen_section</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/parsers/parsers.jl#L6-L12">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_dict-Tuple{Any, Any, Any}" href="#MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_dict-Tuple{Any, Any, Any}"><code>MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_dict</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_pulseq_dict(line, names, dtypes)</code></pre><p>Parse a line of integers/floats with known names and dtypes.</p><p>This is useful to parse most of the columnar data in Pulseq, such as in BLOCKS, RF, GRADIENTS, etc.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/basic_parsers.jl#L3-L9">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_properties-Tuple{Vector{<:AbstractString}}" href="#MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_properties-Tuple{Vector{<:AbstractString}}"><code>MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_properties</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_pulseq_properties(lines)</code></pre><p>Parse any <code>pulseq</code> section formatted as:</p><pre><code class="nohighlight hljs"><name> <value> <name2> <value2> -...</code></pre><p>This includes the VERSION, DEFINITIONS, and part of the SHAPES</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/basic_parsers.jl#L18-L29">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_value-Tuple{AbstractString}" href="#MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_value-Tuple{AbstractString}"><code>MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_value</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_value(string)</code></pre><p>Tries to value the <code>string</code> as a number of sequence of numbers. If that does not work, the <code>string</code> is returned.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/basic_parsers.jl#L39-L44">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Components" href="#MRIBuilder.SequenceIO.PulseqIO.Components"><code>MRIBuilder.SequenceIO.PulseqIO.Components</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Define a list of all the <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape"><code>PulseqShape</code></a> and <a href="@ref"><code>PulseqComponent</code></a> that are used in a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>PulseqSequence</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/components.jl#L1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents" href="#MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents"><code>MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqComponents(shapes, pulses, grads, adcs, extensions)</code></pre><p>All the shapes, pulses, grads, adcs, and extensions used in a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>PulseqSequence</code></a>.</p><p>They can be provided as a dictionary from the integer ID to the object or as a vector.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/components.jl#L6-L12">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Components.add_components!-Tuple{MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents, Dict{Int64}, Nothing}" href="#MRIBuilder.SequenceIO.PulseqIO.Components.add_components!-Tuple{MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents, Dict{Int64}, Nothing}"><code>MRIBuilder.SequenceIO.PulseqIO.Components.add_components!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">add_components(comp::PulseqComponents, search_vec::Vector, component) -add_components(comp::PulseqComponents, shape::PulseqShape)</code></pre><p>Adds a component to the <a href="@ref"><code>search_vec</code></a>, which is assumed to be the appropriate vector within the <code>comp</code>.</p><p>It will check whether the <code>component</code> is already part of the <code>search_vec</code> before adding it. The integer ID of the position of the <code>component</code> in <code>search_vec</code> is returned.</p><p>0 is returned if <code>component</code> is <code>nothing</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/components.jl#L38-L48">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Components.same_component-Tuple{MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents, Any, Any}" href="#MRIBuilder.SequenceIO.PulseqIO.Components.same_component-Tuple{MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents, Any, Any}"><code>MRIBuilder.SequenceIO.PulseqIO.Components.same_component</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">same_component(comp::PulseqComponents, a, b)</code></pre><p>Check whether components <code>a</code> and <code>b</code> are the same when using the shapes represented in <code>comp</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/components.jl#L60-L64">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Components.same_shape-Tuple{MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape}" href="#MRIBuilder.SequenceIO.PulseqIO.Components.same_shape-Tuple{MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape}"><code>MRIBuilder.SequenceIO.PulseqIO.Components.same_shape</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">same_component(a, b)</code></pre><p>Check whether shapes <code>a</code> and <code>b</code> are the same.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/components.jl#L96-L100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.SectionsIO" href="#MRIBuilder.SequenceIO.PulseqIO.SectionsIO"><code>MRIBuilder.SequenceIO.PulseqIO.SectionsIO</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Define IO for <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/sections_io.jl#L1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.SectionsIO.parse_pulseq_sections-Tuple{IO}" href="#MRIBuilder.SequenceIO.PulseqIO.SectionsIO.parse_pulseq_sections-Tuple{IO}"><code>MRIBuilder.SequenceIO.PulseqIO.SectionsIO.parse_pulseq_sections</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_pulseq_sections(io)</code></pre><p>Reads a Pulseq file into a dictionary of <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a> objects.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/sections_io.jl#L5-L9">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.SectionsIO.write_pulseq_section-Union{Tuple{T}, Tuple{IO, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection{T}}} where T" href="#MRIBuilder.SequenceIO.PulseqIO.SectionsIO.write_pulseq_section-Union{Tuple{T}, Tuple{IO, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection{T}}} where T"><code>MRIBuilder.SequenceIO.PulseqIO.SectionsIO.write_pulseq_section</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">write_pulseq_section(io, section::PulseqSection)</code></pre><p>Writes a Pulseq <code>section</code> to the <code>IO</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/sections_io.jl#L31-L35">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.ParseSections" href="#MRIBuilder.SequenceIO.PulseqIO.ParseSections"><code>MRIBuilder.SequenceIO.PulseqIO.ParseSections</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Translate between sets of <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a> objects and <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>PulseqSequence</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/parse_sections.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.ParseSections.parse_all_sections-Tuple{Dict{String, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection}}" href="#MRIBuilder.SequenceIO.PulseqIO.ParseSections.parse_all_sections-Tuple{Dict{String, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection}}"><code>MRIBuilder.SequenceIO.PulseqIO.ParseSections.parse_all_sections</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_all_sections(sections)</code></pre><p>Parses the sections read from a Pulseq file.</p><p>Returns a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>PulseqSequence</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequence_io/pulseq_io/parse_sections.jl#L10-L16">source</a></section></article><h2 id="Plot"><a class="docs-heading-anchor" href="#Plot">Plot</a><a id="Plot-1"></a><a class="docs-heading-anchor-permalink" href="#Plot" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Plot.SequenceDiagram" href="#MRIBuilder.Plot.SequenceDiagram"><code>MRIBuilder.Plot.SequenceDiagram</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SequenceDiagram(; RFx, RFy, Gx, Gy, Gz, ADC)</code></pre><p>All the lines forming a sequence diagram.</p><p>Each parameter should be a <a href="#MRIBuilder.Plot.SinglePlotLine"><code>SinglePlotLine</code></a> if provided. Any parameters not provided will be set to a <a href="#MRIBuilder.Plot.SinglePlotLine"><code>SinglePlotLine</code></a> with zero amplitude.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/plot.jl#L87-L94">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Plot.SinglePlotLine" href="#MRIBuilder.Plot.SinglePlotLine"><code>MRIBuilder.Plot.SinglePlotLine</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SinglePlotLine(times, amplitudes, event_times, event_amplitudes)</code></pre><p>A single line in a sequence diagram (e.g., RFx, Gy, ADC).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/plot.jl#L7-L11">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Plot.plot_sequence" href="#MRIBuilder.Plot.plot_sequence"><code>MRIBuilder.Plot.plot_sequence</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">plot_sequence(sequence; figure=(), axis=(), attributes...) +...</code></pre><p>This includes the VERSION, DEFINITIONS, and part of the SHAPES</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/basic_parsers.jl#L18-L29">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_value-Tuple{AbstractString}" href="#MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_value-Tuple{AbstractString}"><code>MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_value</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_value(string)</code></pre><p>Tries to value the <code>string</code> as a number of sequence of numbers. If that does not work, the <code>string</code> is returned.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/basic_parsers.jl#L39-L44">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Components" href="#MRIBuilder.SequenceIO.PulseqIO.Components"><code>MRIBuilder.SequenceIO.PulseqIO.Components</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Define a list of all the <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape"><code>PulseqShape</code></a> and <a href="@ref"><code>PulseqComponent</code></a> that are used in a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>PulseqSequence</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/components.jl#L1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents" href="#MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents"><code>MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">PulseqComponents(shapes, pulses, grads, adcs, extensions)</code></pre><p>All the shapes, pulses, grads, adcs, and extensions used in a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>PulseqSequence</code></a>.</p><p>They can be provided as a dictionary from the integer ID to the object or as a vector.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/components.jl#L6-L12">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Components.add_components!-Tuple{MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents, Dict{Int64}, Nothing}" href="#MRIBuilder.SequenceIO.PulseqIO.Components.add_components!-Tuple{MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents, Dict{Int64}, Nothing}"><code>MRIBuilder.SequenceIO.PulseqIO.Components.add_components!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">add_components(comp::PulseqComponents, search_vec::Vector, component) +add_components(comp::PulseqComponents, shape::PulseqShape)</code></pre><p>Adds a component to the <a href="@ref"><code>search_vec</code></a>, which is assumed to be the appropriate vector within the <code>comp</code>.</p><p>It will check whether the <code>component</code> is already part of the <code>search_vec</code> before adding it. The integer ID of the position of the <code>component</code> in <code>search_vec</code> is returned.</p><p>0 is returned if <code>component</code> is <code>nothing</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/components.jl#L38-L48">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Components.same_component-Tuple{MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents, Any, Any}" href="#MRIBuilder.SequenceIO.PulseqIO.Components.same_component-Tuple{MRIBuilder.SequenceIO.PulseqIO.Components.PulseqComponents, Any, Any}"><code>MRIBuilder.SequenceIO.PulseqIO.Components.same_component</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">same_component(comp::PulseqComponents, a, b)</code></pre><p>Check whether components <code>a</code> and <code>b</code> are the same when using the shapes represented in <code>comp</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/components.jl#L60-L64">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.Components.same_shape-Tuple{MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape}" href="#MRIBuilder.SequenceIO.PulseqIO.Components.same_shape-Tuple{MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqShape}"><code>MRIBuilder.SequenceIO.PulseqIO.Components.same_shape</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">same_component(a, b)</code></pre><p>Check whether shapes <code>a</code> and <code>b</code> are the same.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/components.jl#L96-L100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.SectionsIO" href="#MRIBuilder.SequenceIO.PulseqIO.SectionsIO"><code>MRIBuilder.SequenceIO.PulseqIO.SectionsIO</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Define IO for <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/sections_io.jl#L1">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.SectionsIO.parse_pulseq_sections-Tuple{IO}" href="#MRIBuilder.SequenceIO.PulseqIO.SectionsIO.parse_pulseq_sections-Tuple{IO}"><code>MRIBuilder.SequenceIO.PulseqIO.SectionsIO.parse_pulseq_sections</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_pulseq_sections(io)</code></pre><p>Reads a Pulseq file into a dictionary of <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a> objects.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/sections_io.jl#L5-L9">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.SectionsIO.write_pulseq_section-Union{Tuple{T}, Tuple{IO, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection{T}}} where T" href="#MRIBuilder.SequenceIO.PulseqIO.SectionsIO.write_pulseq_section-Union{Tuple{T}, Tuple{IO, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection{T}}} where T"><code>MRIBuilder.SequenceIO.PulseqIO.SectionsIO.write_pulseq_section</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">write_pulseq_section(io, section::PulseqSection)</code></pre><p>Writes a Pulseq <code>section</code> to the <code>IO</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/sections_io.jl#L31-L35">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.ParseSections" href="#MRIBuilder.SequenceIO.PulseqIO.ParseSections"><code>MRIBuilder.SequenceIO.PulseqIO.ParseSections</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Translate between sets of <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a> objects and <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>PulseqSequence</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/parse_sections.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.SequenceIO.PulseqIO.ParseSections.parse_all_sections-Tuple{Dict{String, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection}}" href="#MRIBuilder.SequenceIO.PulseqIO.ParseSections.parse_all_sections-Tuple{Dict{String, MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection}}"><code>MRIBuilder.SequenceIO.PulseqIO.ParseSections.parse_all_sections</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">parse_all_sections(sections)</code></pre><p>Parses the sections read from a Pulseq file.</p><p>Returns a <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSequence"><code>PulseqSequence</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequence_io/pulseq_io/parse_sections.jl#L10-L16">source</a></section></article><h2 id="Plot"><a class="docs-heading-anchor" href="#Plot">Plot</a><a id="Plot-1"></a><a class="docs-heading-anchor-permalink" href="#Plot" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Plot.SequenceDiagram" href="#MRIBuilder.Plot.SequenceDiagram"><code>MRIBuilder.Plot.SequenceDiagram</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SequenceDiagram(; RFx, RFy, Gx, Gy, Gz, ADC)</code></pre><p>All the lines forming a sequence diagram.</p><p>Each parameter should be a <a href="#MRIBuilder.Plot.SinglePlotLine"><code>SinglePlotLine</code></a> if provided. Any parameters not provided will be set to a <a href="#MRIBuilder.Plot.SinglePlotLine"><code>SinglePlotLine</code></a> with zero amplitude.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/plot.jl#L87-L94">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Plot.SinglePlotLine" href="#MRIBuilder.Plot.SinglePlotLine"><code>MRIBuilder.Plot.SinglePlotLine</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SinglePlotLine(times, amplitudes, event_times, event_amplitudes)</code></pre><p>A single line in a sequence diagram (e.g., RFx, Gy, ADC).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/plot.jl#L7-L11">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Plot.plot_sequence" href="#MRIBuilder.Plot.plot_sequence"><code>MRIBuilder.Plot.plot_sequence</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">plot_sequence(sequence; figure=(), axis=(), attributes...) plot(sequence; attributes...) -plot!([scene,] sequence; attributes...)</code></pre><p>Plot the sequence diagram.</p><p>Calling <code>plot_sequence</code> will result in a much cleaner sequence diagram (recommended). However, if you want to combine this diagram with other plots you will have to use <code>plot</code> or <code>plot!</code> instead.</p><p>If called as <code>plot_sequence</code> the user can also supply <code>Makie.Figure</code> (<code>figure=(...)</code>) and <code>Makie.Axis</code> (<code>axis=(...)</code>) keywords. If called using the <code>plot</code> or <code>plot!</code> interface, only the attributes listed below can be supplied</p><p>This function will only work if <a href="https://makie.org"><code>Makie</code></a> is installed and imported.</p><p><strong>Attributes</strong></p><p><strong>Line properties</strong></p><ul><li><code>linecolor</code> sets the color of the lines. If you want to set the text color to the same value, you can also use <code>color=...</code>.</li><li><code>linewidth=1.5</code> sets the width of the lines.</li><li><code>instant_width=3.</code> sets the width of any instant gradients or pulses with respect to the <code>linewidth</code>.</li></ul><p><strong>Text properties</strong></p><ul><li><code>textcolor</code> sets the color of the text. If you want to set the line color to the same value, you can also use <code>color=...</code>.</li><li><code>font</code> sets whether the rendered text is :regular, :bold, or :italic.</li><li><code>fontsize</code>: set the size of each character.</li></ul><p>Base.Docs.DocStr(svec("### Generic attributes\n\n- <code>visible::Bool = true</code> sets whether the plot will be rendered or not.\n- <code>overdraw::Bool = false</code> sets whether the plot will draw over other plots. This specifically means ignoring depth checks in GL backends.\n- <code>transparency::Bool = false</code> adjusts how the plot deals with transparency. In GLMakie <code>transparency = true</code> results in using Order Independent Transparency.\n- <code>fxaa::Bool = true</code> adjusts whether the plot is rendered with fxaa (anti-aliasing).\n- <code>inspectable::Bool = true</code> sets whether this plot should be seen by <code>DataInspector</code>.\n- <code>depth_shift::Float32 = 0f0</code> adjusts the depth value of a plot after all other transformations, i.e. in clip space, where <code>0 <= depth <= 1</code>. This only applies to GLMakie and WGLMakie and can be used to adjust render order (like a tunable overdraw).\n- <code>model::Makie.Mat4f</code> sets a model matrix for the plot. This replaces adjustments made with <code>translate!</code>, <code>rotate!</code> and <code>scale!</code>.\n- <code>space::Symbol = :data</code> sets the transformation space for box encompassing the volume plot. See <code>Makie.spaces()</code> for possible inputs.\n- <code>clip_planes::Vector{Plane3f} = Plane3f[]</code>: allows you to specify up to 8 planes behind which plot objects get clipped (i.e. become invisible). By default clip planes are inherited from the parent plot or scene.\n"), nothing, Dict{Symbol, Any}(:typesig => Tuple{Any}, :module => MakieCore, :linenumber => 4, :binding => MakieCore.generic<em>plot</em>attributes!, :path => "/root/.julia/packages/MakieCore/NeQjl/src/basic_plots.jl"))</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/plot.jl#L220-L248">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Plot.range_event-Tuple{MRIBuilder.Plot.SinglePlotLine}" href="#MRIBuilder.Plot.range_event-Tuple{MRIBuilder.Plot.SinglePlotLine}"><code>MRIBuilder.Plot.range_event</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">range_event(single_plot_line)</code></pre><p>Returns the minimum and maximum amplitude for the events in <a href="#MRIBuilder.Plot.SinglePlotLine"><code>SinglePlotLine</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/plot.jl#L63-L67">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Plot.range_line-Tuple{MRIBuilder.Plot.SinglePlotLine}" href="#MRIBuilder.Plot.range_line-Tuple{MRIBuilder.Plot.SinglePlotLine}"><code>MRIBuilder.Plot.range_line</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">range_line(single_plot_line)</code></pre><p>Returns the minimum and maximum amplitude for a <a href="#MRIBuilder.Plot.SinglePlotLine"><code>SinglePlotLine</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/plot.jl#L53-L57">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../scanners/">« Scanners</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 14:27">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> +plot!([scene,] sequence; attributes...)</code></pre><p>Plot the sequence diagram.</p><p>Calling <code>plot_sequence</code> will result in a much cleaner sequence diagram (recommended). However, if you want to combine this diagram with other plots you will have to use <code>plot</code> or <code>plot!</code> instead.</p><p>If called as <code>plot_sequence</code> the user can also supply <code>Makie.Figure</code> (<code>figure=(...)</code>) and <code>Makie.Axis</code> (<code>axis=(...)</code>) keywords. If called using the <code>plot</code> or <code>plot!</code> interface, only the attributes listed below can be supplied</p><p>This function will only work if <a href="https://makie.org"><code>Makie</code></a> is installed and imported.</p><p><strong>Attributes</strong></p><p><strong>Line properties</strong></p><ul><li><code>linecolor</code> sets the color of the lines. If you want to set the text color to the same value, you can also use <code>color=...</code>.</li><li><code>linewidth=1.5</code> sets the width of the lines.</li><li><code>instant_width=3.</code> sets the width of any instant gradients or pulses with respect to the <code>linewidth</code>.</li></ul><p><strong>Text properties</strong></p><ul><li><code>textcolor</code> sets the color of the text. If you want to set the line color to the same value, you can also use <code>color=...</code>.</li><li><code>font</code> sets whether the rendered text is :regular, :bold, or :italic.</li><li><code>fontsize</code>: set the size of each character.</li></ul><p>Base.Docs.DocStr(svec("### Generic attributes\n\n- <code>visible::Bool = true</code> sets whether the plot will be rendered or not.\n- <code>overdraw::Bool = false</code> sets whether the plot will draw over other plots. This specifically means ignoring depth checks in GL backends.\n- <code>transparency::Bool = false</code> adjusts how the plot deals with transparency. In GLMakie <code>transparency = true</code> results in using Order Independent Transparency.\n- <code>fxaa::Bool = true</code> adjusts whether the plot is rendered with fxaa (anti-aliasing).\n- <code>inspectable::Bool = true</code> sets whether this plot should be seen by <code>DataInspector</code>.\n- <code>depth_shift::Float32 = 0f0</code> adjusts the depth value of a plot after all other transformations, i.e. in clip space, where <code>0 <= depth <= 1</code>. This only applies to GLMakie and WGLMakie and can be used to adjust render order (like a tunable overdraw).\n- <code>model::Makie.Mat4f</code> sets a model matrix for the plot. This replaces adjustments made with <code>translate!</code>, <code>rotate!</code> and <code>scale!</code>.\n- <code>space::Symbol = :data</code> sets the transformation space for box encompassing the volume plot. See <code>Makie.spaces()</code> for possible inputs.\n- <code>clip_planes::Vector{Plane3f} = Plane3f[]</code>: allows you to specify up to 8 planes behind which plot objects get clipped (i.e. become invisible). By default clip planes are inherited from the parent plot or scene.\n"), nothing, Dict{Symbol, Any}(:typesig => Tuple{Any}, :module => MakieCore, :linenumber => 4, :binding => MakieCore.generic<em>plot</em>attributes!, :path => "/root/.julia/packages/MakieCore/NeQjl/src/basic_plots.jl"))</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/plot.jl#L220-L248">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Plot.range_event-Tuple{MRIBuilder.Plot.SinglePlotLine}" href="#MRIBuilder.Plot.range_event-Tuple{MRIBuilder.Plot.SinglePlotLine}"><code>MRIBuilder.Plot.range_event</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">range_event(single_plot_line)</code></pre><p>Returns the minimum and maximum amplitude for the events in <a href="#MRIBuilder.Plot.SinglePlotLine"><code>SinglePlotLine</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/plot.jl#L63-L67">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Plot.range_line-Tuple{MRIBuilder.Plot.SinglePlotLine}" href="#MRIBuilder.Plot.range_line-Tuple{MRIBuilder.Plot.SinglePlotLine}"><code>MRIBuilder.Plot.range_line</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">range_line(single_plot_line)</code></pre><p>Returns the minimum and maximum amplitude for a <a href="#MRIBuilder.Plot.SinglePlotLine"><code>SinglePlotLine</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/plot.jl#L53-L57">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../scanners/">« Scanners</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 15:03">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> diff --git a/dev/defining_sequence/index.html b/dev/defining_sequence/index.html index 10c6da7..b600211 100644 --- a/dev/defining_sequence/index.html +++ b/dev/defining_sequence/index.html @@ -35,11 +35,11 @@ end</code></pre><p>For this sequence, we define the <a href="../implemented_sequ get_gradient(seq::DiffusionSpinEcho) = (gradient=seq[:gradient], gradient2=seq[:gradient2]) get_readout(seq::DiffusionSpinEcho) = seq.readout</code></pre><p>Note that we can indicate we are interested in multiple RF pulses/gradients by supplying them as a named tuple (<code>(excitation=..., refocus=...)</code>).</p><p>Setting this allows us to get RF pulse or gradient-specific properties by calling the sequence, for example:</p><pre><code class="language-julia hljs">using MRIBuilder sequence = DiffusionSpinEcho(bval=1., TE=:min, slice_thickness=2.) -variables.flip_angle(sequence)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">(excitation = 89.99999999998127, refocus = 180.00000000002387)</code></pre><p>Here we can see that we get the <a href="../api/#MRIBuilder.Variables.variables.flip_angle"><code>variables.flip_angle</code></a> for each of the two RF pulses defined using <a href="../api/#MRIBuilder.Variables.get_pulse"><code>get_pulse</code></a> above.</p><p>The final component to defining summary variables is to define one or more default coherence pathways using <a href="#MRIBuilder.Variables.get_pathway"><code>get_pathway</code></a>:</p><pre><code class="language-julia hljs">get_pathway(seq::DiffusionSpinEcho) = Pathway(seq, [90, 180], 1, group=:diffusion)</code></pre><p>Here the coherence <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> sets out what a specific set of spins might experience during the sequence. In this case the sequence experiences two RF pulses and is excited by the first pulse and flipped by the second (<code>[90, 180]</code>). It is then observed during the first readout (<code>1</code>). For such a <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> we can compute:</p><ul><li>the time that the spin spends in each longitudinal and transverse direction, which is particularly useful in the transverse direction to compute the amount of T2-weighting (<a href="#MRIBuilder.Variables.variables.duration_transverse"><code>variables.duration_transverse</code></a>) and the amount of time spent dephasing to compute the amount of T2*-weighting (<a href="#MRIBuilder.Variables.variables.duration_dephase"><code>variables.duration_dephase</code></a>).</li><li>the diffusion weighting experienced (<a href="#MRIBuilder.Variables.variables.bval"><code>variables.bval</code></a>, <a href="#MRIBuilder.Variables.variables.bmat"><code>variables.bmat</code></a>, and <a href="#MRIBuilder.Variables.variables.net_dephasing"><code>variables.net_dephasing</code></a>)</li></ul><p>By defining a default pathway for the sequence, the user can now put constraints on any or all of these variables.</p><h2 id="helper_functions"><a class="docs-heading-anchor" href="#helper_functions">Component helper functions</a><a id="helper_functions-1"></a><a class="docs-heading-anchor-permalink" href="#helper_functions" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.dwi_gradients-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.dwi_gradients-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.dwi_gradients</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">dwi_gradients(; type, optimise=false, refocus=true, orientation=[1, 0, 0], group=:diffusion, variables...)</code></pre><p>Returns two diffusion-weighting gradients that are guaranteed to cancel each other out.</p><p><strong>Parameters</strong></p><ul><li><code>type</code>: A symbol describing the type of gradient. One of:<ul><li><code>:trapezoid</code>: Pulsed trapezoidal gradient profile. See <a href="../api/#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> for the relevant <code>variables</code>.</li><li><code>:instant</code>: instantaneous gradient (e.g., to test short-pulse approximations). See <a href="../api/#MRIBuilder.Components.InstantGradients.InstantGradient"><code>InstantGradient</code></a> for the relevant <code>variables</code>.</li></ul></li><li><code>optimise</code>: Whether to optimise this readout event in isolation from the rest of the sequence. Use this with caution. It can speed up the optimisation (and for very complicated sequences make it more robust), however the resulting parameters might not represent the optimal solution of any external constraints (which are ignored if the readout is optimised in isolation).</li><li><code>scanner</code>: Used for testing. Do not set this parameter at this level (instead set it for the total sequence using <a href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>build_sequence</code></a>).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/helper_functions.jl#L181-L192">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.excitation_pulse</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">excitation_pulse(; parameters...)</code></pre><p>Create an excitation RF pulse.</p><p>By default there is no slice-selective gradient. To enable slice selection <code>min_slice_thickness</code> has to be set to a number or to :min. If <code>min_slice_thickness</code> is not set or is set to <code>:min</code>, then either <code>bandwidth</code> or <code>duration</code> should be set, otherwise the optimisation might be unconstrained (ignore this for <code>shape=:instant</code>).</p><p><strong>Parameters</strong></p><p>For an <a href="../api/#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a> (i.e., <code>shape=:instant</code>), only the <code>flip_angle</code>, <code>phase</code>, and <code>group</code> will be used. All other parameters are ignored.</p><ul><li><code>optimise</code>: set to true to optimise this RF pulse separately from the embedding sequence.</li></ul><p><strong>Pulse parameters</strong></p><ul><li><code>shape</code>: The shape of the RF pulse. One of <code>:sinc</code> (for <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a>), <code>:constant</code>/<code>:hard</code> (for <a href="../api/#MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse"><code>ConstantPulse</code></a>), or <code>:instant</code> (for <a href="../api/#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a>). Default is :sinc for slice-selective pulses or :instant otherwise.</li><li><code>flip_angle</code>: size of the flip due to the RF pulse in degrees (default: 90).</li><li><code>phase</code>: angle of the RF pulse in the x-y plane in degrees (default: 0).</li><li><code>frequency</code>: frequency of the RF pulse relative to the Larmor frequency in kHz (default: 0).</li><li><code>bandwidth</code>: width of the RF pulse in Fourier space in kHz (default: free variable).</li><li><code>duration</code>: duration of the RF pulse in ms (default: free variable).</li><li><code>Nzeros</code>: sets the number of zero crossings for a <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> (default: 3). Can be set to a tuple of two numbers to set a different number of zero crossings before and after the pulse maximum.</li><li><code>group</code>: name of the group of which the RF pulse is part. This is used to add transformations after the sequence is optimised.</li></ul><p><strong>Slice selection</strong></p><ul><li><code>slice_thickness</code>: minimum slice thickness that should be possible without adjusting the sequence timings in um (not mm!) (default: no slice selection). Can be set to <code>:min</code> to indicate that this should be minimised given the scanner constraints and user values for <code>bandwidth</code> or <code>duration</code>.</li><li><code>rephase</code>: set to false to disable the spin rephasing after the RF pulse.</li><li><code>rotate_grad</code>: name of the parameter with which the slice selection gradient will be rotated after sequence optimisation (default: <code>:FOV</code>).</li><li><code>scanner</code>: overrides the <a href="#MRIBuilder.BuildSequences.global_scanner-Tuple{}"><code>global_scanner</code></a> for this part of the sequence. Recommended to set only if not part of a larger sequence.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/helper_functions.jl#L26-L54">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.gradient_spoiler-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.gradient_spoiler-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.gradient_spoiler</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_spoiler(; optimise=false, orientation=[0, 0, 1], rotate=:FOV, scale=:spoiler, spoiler=1., duration=:min, variables...)</code></pre><p>Returns two DWI gradients that are guaranteed to cancel each other out.</p><p><strong>Parameters</strong></p><ul><li><code>orientation</code>: Orientation of the gradient (default: slice-select direction).</li><li><code>rotate</code>: in which coordinate system is the <code>orientation</code> defined (default: :FOV).</li><li><code>scale</code>: variable controlling how the gradients should be scaled after optimsation (default: :spoiler).</li><li><code>optimise</code>: Whether to optimise this readout event in isolation from the rest of the sequence. Use this with caution. It can speed up the optimisation (and for very complicated sequences make it more robust), however the resulting parameters might not represent the optimal solution of any external constraints (which are ignored if the readout is optimised in isolation).</li><li><code>scanner</code>: Used for testing. Do not set this parameter at this level (instead set it for the total sequence using <a href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>build_sequence</code></a>).</li></ul><p><strong>Variables</strong></p><ul><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.spoiler-sequence_optimisation"><code>variables.spoiler</code></a>: maximum spoiler scale (before applying any reductions due to <code>scale</code>).</li><li>Any other parameters expected by <a href="../api/#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/helper_functions.jl#L288-L303">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.interpret_image_size-NTuple{4, Any}" href="#MRIBuilder.Parts.HelperFunctions.interpret_image_size-NTuple{4, Any}"><code>MRIBuilder.Parts.HelperFunctions.interpret_image_size</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">interpret_image_size(fov, resolution, voxel_size, slice_thickness)</code></pre><p>Combines the user-provided information of the image size to produce a tuple with:</p><ul><li><code>slice_thickness</code>: if not set explicitly, will be set to the third element of <code>voxel_size</code></li><li><code>resolution_z</code>: number of voxels in the slice-select direction.</li><li>keywords parameters for the <a href="#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>readout_event</code></a> functions with the <code>fov</code>, <code>resolution</code>, and <code>voxel_size</code> in the x- and y- dimensions.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/helper_functions.jl#L236-L243">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.readout_event</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">readout_event(; type, optimise=false, variables...)</code></pre><p>Adds a readout event to the sequence.</p><p><strong>Parameters</strong></p><ul><li><code>type</code>: A symbol describing the type of readout. It will default to <code>:epi</code> if a resolution has been set and <code>:instant</code> otherwise. Can be set to one of the following:<ul><li><code>:epi</code>: EPI readout. See <a href="../api/#MRIBuilder.Parts.EPIReadouts.EPIReadout"><code>EPIReadout</code></a> for the relevant <code>variables</code>.</li><li><code>:instant</code>: single isolated readout event <a href="../api/#MRIBuilder.Components.Readouts.SingleReadouts.SingleReadout"><code>SingleReadout</code></a> (e.g., for NMR). Does not expect any <code>variables</code>.</li></ul></li><li><code>optimise</code>: Whether to optimise this readout event in isolation from the rest of the sequence. Use this with caution. It can speed up the optimisation (and for very complicated sequences make it more robust), however the resulting parameters might not represent the optimal solution of any external constraints (which are ignored if the readout is optimised in isolation).</li><li><code>scanner</code>: Used for testing. Do not set this parameter at this level (instead set it for the total sequence using <a href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>build_sequence</code></a>).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/helper_functions.jl#L146-L157">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.refocus_pulse-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.refocus_pulse-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.refocus_pulse</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">refocus_pulse(; parameters...)</code></pre><p>Create an excitation RF pulse.</p><p>By default there is no slice-selective gradient. To enable slice selection <code>slice_thickness</code> has to be set to a number or to :min. If <code>slice_thickness</code> is not set or is set to <code>:min</code>, then either <code>bandwidth</code> or <code>duration</code> should be set, otherwise the optimisation might be unconstrained (ignore this for <code>shape=:instant</code>).</p><p><strong>Parameters</strong></p><ul><li><code>optimise</code>: set to true to optimise this RF pulse separately from the embedding sequence.</li></ul><p><strong>Pulse parameters</strong></p><p>For an <a href="../api/#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a> (i.e., <code>shape=:instant</code>), only the <code>flip_angle</code>, <code>phase</code>, and <code>group</code> will be used. All other parameters are ignored.</p><ul><li><code>shape</code>: The shape of the RF pulse. One of <code>:sinc</code> (for <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a>), <code>:constant</code>/<code>:hard</code> (for <a href="../api/#MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse"><code>ConstantPulse</code></a>), or <code>:instant</code> (for <a href="../api/#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a>). Default is :sinc for slice-selective pulses or :instant otherwise.</li><li><code>flip_angle</code>: size of the flip due to the RF pulse in degrees (default: 180).</li><li><code>phase</code>: angle of the RF pulse in the x-y plane in degrees (default: 0).</li><li><code>frequency</code>: frequency of the RF pulse relative to the Larmor frequency in kHz (default: 0).</li><li><code>bandwidth</code>: width of the RF pulse in Fourier space in kHz (default: free variable).</li><li><code>duration</code>: duration of the RF pulse in ms (default: free variable).</li><li><code>Nzeros</code>: sets the number of zero crossings for a <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> (default: 3). Can be set to a tuple of two numbers to set a different number of zero crossings before and after the pulse maximum.</li><li><code>group</code>: name of the group of which the RF pulse is part. This is used to add transformations after the sequence is optimised.</li></ul><p><strong>Slice selection and spoilers</strong></p><ul><li><code>slice_thickness</code>: minimum slice thickness that should be possible without adjusting the sequence timings in um (not mm!) (default: no slice selection). Can be set to <code>:min</code> to indicate that this should be minimised given the scanner constraints and user values for <code>bandwidth</code> or <code>duration</code>.</li><li><code>spoiler</code>: set to the spatial scale on which the spins should be dephased in mm. For rotating spoilers, this does include the contribution from the slice select gradient as well.</li><li><code>rotate_grad</code>: name of the parameter with which the slice selection and spoiler gradient will be rotated after sequence optimisation (default: <code>:FOV</code>).</li><li><code>scanner</code>: overrides the <a href="#MRIBuilder.BuildSequences.global_scanner-Tuple{}"><code>global_scanner</code></a> for this part of the sequence. Recommended to set only if not part of a larger sequence.</li><li><code>orientation</code>: vector with orientation of slice select gradient and pulses (defaults: z-direction).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/helper_functions.jl#L86-L115">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.saturation_pulse-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.saturation_pulse-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.saturation_pulse</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">saturation_pulse(; pulse=(), binomial_order=1, variables...)</code></pre><p>Creates a saturation pulse consisting of repeating instances of <code>pulse_type</code>.</p><p><strong>Parameters</strong></p><ul><li><code>pulse</code>: Parameters/variables used to define the basic RF pulse used in the saturation pulse. These can be:<ul><li><code>type</code>: <a href="../api/#MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse"><code>ConstantPulse</code></a> (default), <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a>, <a href="../api/#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a>, etc.</li><li>Variables describing that type (e.g., <code>flip_angle</code>, <code>duration</code>, <code>frequency</code>)</li></ul></li><li><code>binomial_order</code>: How many repeats of <code>pulse_type</code> there should be in a single binomial pulse.</li></ul><p><strong>Variables</strong></p><ul><li><code>nrepeat</code>: number of repeats of the binomial pulse. This should typically be set by the user.</li><li><code>interblock_delay</code>: time between the start of each pulse. Should be short compared with the T1, but long enough to limit SAR.</li><li><code>duration</code>: total duration of the saturation pulse.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/helper_functions.jl#L313-L328">source</a></section></article><h2 id="Optimisation-helper-functions"><a class="docs-heading-anchor" href="#Optimisation-helper-functions">Optimisation helper functions</a><a id="Optimisation-helper-functions-1"></a><a class="docs-heading-anchor-permalink" href="#Optimisation-helper-functions" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}" href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>MRIBuilder.BuildSequences.build_sequence</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Wrapper to build a sequence.</p><p>Use as </p><pre><code class="language-julia hljs">build_sequence(scanner;) do +variables.flip_angle(sequence)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">(excitation = 89.99999999998374, refocus = 180.00000000001606)</code></pre><p>Here we can see that we get the <a href="../api/#MRIBuilder.Variables.variables.flip_angle"><code>variables.flip_angle</code></a> for each of the two RF pulses defined using <a href="../api/#MRIBuilder.Variables.get_pulse"><code>get_pulse</code></a> above.</p><p>The final component to defining summary variables is to define one or more default coherence pathways using <a href="#MRIBuilder.Variables.get_pathway"><code>get_pathway</code></a>:</p><pre><code class="language-julia hljs">get_pathway(seq::DiffusionSpinEcho) = Pathway(seq, [90, 180], 1, group=:diffusion)</code></pre><p>Here the coherence <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> sets out what a specific set of spins might experience during the sequence. In this case the sequence experiences two RF pulses and is excited by the first pulse and flipped by the second (<code>[90, 180]</code>). It is then observed during the first readout (<code>1</code>). For such a <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> we can compute:</p><ul><li>the time that the spin spends in each longitudinal and transverse direction, which is particularly useful in the transverse direction to compute the amount of T2-weighting (<a href="#MRIBuilder.Variables.variables.duration_transverse"><code>variables.duration_transverse</code></a>) and the amount of time spent dephasing to compute the amount of T2*-weighting (<a href="#MRIBuilder.Variables.variables.duration_dephase"><code>variables.duration_dephase</code></a>).</li><li>the diffusion weighting experienced (<a href="#MRIBuilder.Variables.variables.bval"><code>variables.bval</code></a>, <a href="#MRIBuilder.Variables.variables.bmat"><code>variables.bmat</code></a>, and <a href="#MRIBuilder.Variables.variables.net_dephasing"><code>variables.net_dephasing</code></a>)</li></ul><p>By defining a default pathway for the sequence, the user can now put constraints on any or all of these variables.</p><h2 id="helper_functions"><a class="docs-heading-anchor" href="#helper_functions">Component helper functions</a><a id="helper_functions-1"></a><a class="docs-heading-anchor-permalink" href="#helper_functions" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.dwi_gradients-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.dwi_gradients-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.dwi_gradients</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">dwi_gradients(; type, optimise=false, refocus=true, orientation=[1, 0, 0], group=:diffusion, variables...)</code></pre><p>Returns two diffusion-weighting gradients that are guaranteed to cancel each other out.</p><p><strong>Parameters</strong></p><ul><li><code>type</code>: A symbol describing the type of gradient. One of:<ul><li><code>:trapezoid</code>: Pulsed trapezoidal gradient profile. See <a href="../api/#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> for the relevant <code>variables</code>.</li><li><code>:instant</code>: instantaneous gradient (e.g., to test short-pulse approximations). See <a href="../api/#MRIBuilder.Components.InstantGradients.InstantGradient"><code>InstantGradient</code></a> for the relevant <code>variables</code>.</li></ul></li><li><code>optimise</code>: Whether to optimise this readout event in isolation from the rest of the sequence. Use this with caution. It can speed up the optimisation (and for very complicated sequences make it more robust), however the resulting parameters might not represent the optimal solution of any external constraints (which are ignored if the readout is optimised in isolation).</li><li><code>scanner</code>: Used for testing. Do not set this parameter at this level (instead set it for the total sequence using <a href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>build_sequence</code></a>).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/helper_functions.jl#L181-L192">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.excitation_pulse</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">excitation_pulse(; parameters...)</code></pre><p>Create an excitation RF pulse.</p><p>By default there is no slice-selective gradient. To enable slice selection <code>min_slice_thickness</code> has to be set to a number or to :min. If <code>min_slice_thickness</code> is not set or is set to <code>:min</code>, then either <code>bandwidth</code> or <code>duration</code> should be set, otherwise the optimisation might be unconstrained (ignore this for <code>shape=:instant</code>).</p><p><strong>Parameters</strong></p><p>For an <a href="../api/#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a> (i.e., <code>shape=:instant</code>), only the <code>flip_angle</code>, <code>phase</code>, and <code>group</code> will be used. All other parameters are ignored.</p><ul><li><code>optimise</code>: set to true to optimise this RF pulse separately from the embedding sequence.</li></ul><p><strong>Pulse parameters</strong></p><ul><li><code>shape</code>: The shape of the RF pulse. One of <code>:sinc</code> (for <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a>), <code>:constant</code>/<code>:hard</code> (for <a href="../api/#MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse"><code>ConstantPulse</code></a>), or <code>:instant</code> (for <a href="../api/#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a>). Default is :sinc for slice-selective pulses or :instant otherwise.</li><li><code>flip_angle</code>: size of the flip due to the RF pulse in degrees (default: 90).</li><li><code>phase</code>: angle of the RF pulse in the x-y plane in degrees (default: 0).</li><li><code>frequency</code>: frequency of the RF pulse relative to the Larmor frequency in kHz (default: 0).</li><li><code>bandwidth</code>: width of the RF pulse in Fourier space in kHz (default: free variable).</li><li><code>duration</code>: duration of the RF pulse in ms (default: free variable).</li><li><code>Nzeros</code>: sets the number of zero crossings for a <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> (default: 3). Can be set to a tuple of two numbers to set a different number of zero crossings before and after the pulse maximum.</li><li><code>group</code>: name of the group of which the RF pulse is part. This is used to add transformations after the sequence is optimised.</li></ul><p><strong>Slice selection</strong></p><ul><li><code>slice_thickness</code>: minimum slice thickness that should be possible without adjusting the sequence timings in um (not mm!) (default: no slice selection). Can be set to <code>:min</code> to indicate that this should be minimised given the scanner constraints and user values for <code>bandwidth</code> or <code>duration</code>.</li><li><code>rephase</code>: set to false to disable the spin rephasing after the RF pulse.</li><li><code>rotate_grad</code>: name of the parameter with which the slice selection gradient will be rotated after sequence optimisation (default: <code>:FOV</code>).</li><li><code>scanner</code>: overrides the <a href="#MRIBuilder.BuildSequences.global_scanner-Tuple{}"><code>global_scanner</code></a> for this part of the sequence. Recommended to set only if not part of a larger sequence.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/helper_functions.jl#L26-L54">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.gradient_spoiler-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.gradient_spoiler-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.gradient_spoiler</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_spoiler(; optimise=false, orientation=[0, 0, 1], rotate=:FOV, scale=:spoiler, spoiler=1., duration=:min, variables...)</code></pre><p>Returns two DWI gradients that are guaranteed to cancel each other out.</p><p><strong>Parameters</strong></p><ul><li><code>orientation</code>: Orientation of the gradient (default: slice-select direction).</li><li><code>rotate</code>: in which coordinate system is the <code>orientation</code> defined (default: :FOV).</li><li><code>scale</code>: variable controlling how the gradients should be scaled after optimsation (default: :spoiler).</li><li><code>optimise</code>: Whether to optimise this readout event in isolation from the rest of the sequence. Use this with caution. It can speed up the optimisation (and for very complicated sequences make it more robust), however the resulting parameters might not represent the optimal solution of any external constraints (which are ignored if the readout is optimised in isolation).</li><li><code>scanner</code>: Used for testing. Do not set this parameter at this level (instead set it for the total sequence using <a href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>build_sequence</code></a>).</li></ul><p><strong>Variables</strong></p><ul><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.spoiler-sequence_optimisation"><code>variables.spoiler</code></a>: maximum spoiler scale (before applying any reductions due to <code>scale</code>).</li><li>Any other parameters expected by <a href="../api/#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/helper_functions.jl#L288-L303">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.interpret_image_size-NTuple{4, Any}" href="#MRIBuilder.Parts.HelperFunctions.interpret_image_size-NTuple{4, Any}"><code>MRIBuilder.Parts.HelperFunctions.interpret_image_size</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">interpret_image_size(fov, resolution, voxel_size, slice_thickness)</code></pre><p>Combines the user-provided information of the image size to produce a tuple with:</p><ul><li><code>slice_thickness</code>: if not set explicitly, will be set to the third element of <code>voxel_size</code></li><li><code>resolution_z</code>: number of voxels in the slice-select direction.</li><li>keywords parameters for the <a href="#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>readout_event</code></a> functions with the <code>fov</code>, <code>resolution</code>, and <code>voxel_size</code> in the x- and y- dimensions.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/helper_functions.jl#L236-L243">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.readout_event</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">readout_event(; type, optimise=false, variables...)</code></pre><p>Adds a readout event to the sequence.</p><p><strong>Parameters</strong></p><ul><li><code>type</code>: A symbol describing the type of readout. It will default to <code>:epi</code> if a resolution has been set and <code>:instant</code> otherwise. Can be set to one of the following:<ul><li><code>:epi</code>: EPI readout. See <a href="../api/#MRIBuilder.Parts.EPIReadouts.EPIReadout"><code>EPIReadout</code></a> for the relevant <code>variables</code>.</li><li><code>:instant</code>: single isolated readout event <a href="../api/#MRIBuilder.Components.Readouts.SingleReadouts.SingleReadout"><code>SingleReadout</code></a> (e.g., for NMR). Does not expect any <code>variables</code>.</li></ul></li><li><code>optimise</code>: Whether to optimise this readout event in isolation from the rest of the sequence. Use this with caution. It can speed up the optimisation (and for very complicated sequences make it more robust), however the resulting parameters might not represent the optimal solution of any external constraints (which are ignored if the readout is optimised in isolation).</li><li><code>scanner</code>: Used for testing. Do not set this parameter at this level (instead set it for the total sequence using <a href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>build_sequence</code></a>).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/helper_functions.jl#L146-L157">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.refocus_pulse-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.refocus_pulse-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.refocus_pulse</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">refocus_pulse(; parameters...)</code></pre><p>Create an excitation RF pulse.</p><p>By default there is no slice-selective gradient. To enable slice selection <code>slice_thickness</code> has to be set to a number or to :min. If <code>slice_thickness</code> is not set or is set to <code>:min</code>, then either <code>bandwidth</code> or <code>duration</code> should be set, otherwise the optimisation might be unconstrained (ignore this for <code>shape=:instant</code>).</p><p><strong>Parameters</strong></p><ul><li><code>optimise</code>: set to true to optimise this RF pulse separately from the embedding sequence.</li></ul><p><strong>Pulse parameters</strong></p><p>For an <a href="../api/#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a> (i.e., <code>shape=:instant</code>), only the <code>flip_angle</code>, <code>phase</code>, and <code>group</code> will be used. All other parameters are ignored.</p><ul><li><code>shape</code>: The shape of the RF pulse. One of <code>:sinc</code> (for <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a>), <code>:constant</code>/<code>:hard</code> (for <a href="../api/#MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse"><code>ConstantPulse</code></a>), or <code>:instant</code> (for <a href="../api/#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a>). Default is :sinc for slice-selective pulses or :instant otherwise.</li><li><code>flip_angle</code>: size of the flip due to the RF pulse in degrees (default: 180).</li><li><code>phase</code>: angle of the RF pulse in the x-y plane in degrees (default: 0).</li><li><code>frequency</code>: frequency of the RF pulse relative to the Larmor frequency in kHz (default: 0).</li><li><code>bandwidth</code>: width of the RF pulse in Fourier space in kHz (default: free variable).</li><li><code>duration</code>: duration of the RF pulse in ms (default: free variable).</li><li><code>Nzeros</code>: sets the number of zero crossings for a <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> (default: 3). Can be set to a tuple of two numbers to set a different number of zero crossings before and after the pulse maximum.</li><li><code>group</code>: name of the group of which the RF pulse is part. This is used to add transformations after the sequence is optimised.</li></ul><p><strong>Slice selection and spoilers</strong></p><ul><li><code>slice_thickness</code>: minimum slice thickness that should be possible without adjusting the sequence timings in um (not mm!) (default: no slice selection). Can be set to <code>:min</code> to indicate that this should be minimised given the scanner constraints and user values for <code>bandwidth</code> or <code>duration</code>.</li><li><code>spoiler</code>: set to the spatial scale on which the spins should be dephased in mm. For rotating spoilers, this does include the contribution from the slice select gradient as well.</li><li><code>rotate_grad</code>: name of the parameter with which the slice selection and spoiler gradient will be rotated after sequence optimisation (default: <code>:FOV</code>).</li><li><code>scanner</code>: overrides the <a href="#MRIBuilder.BuildSequences.global_scanner-Tuple{}"><code>global_scanner</code></a> for this part of the sequence. Recommended to set only if not part of a larger sequence.</li><li><code>orientation</code>: vector with orientation of slice select gradient and pulses (defaults: z-direction).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/helper_functions.jl#L86-L115">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Parts.HelperFunctions.saturation_pulse-Tuple{}" href="#MRIBuilder.Parts.HelperFunctions.saturation_pulse-Tuple{}"><code>MRIBuilder.Parts.HelperFunctions.saturation_pulse</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">saturation_pulse(; pulse=(), binomial_order=1, variables...)</code></pre><p>Creates a saturation pulse consisting of repeating instances of <code>pulse_type</code>.</p><p><strong>Parameters</strong></p><ul><li><code>pulse</code>: Parameters/variables used to define the basic RF pulse used in the saturation pulse. These can be:<ul><li><code>type</code>: <a href="../api/#MRIBuilder.Components.Pulses.ConstantPulses.ConstantPulse"><code>ConstantPulse</code></a> (default), <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a>, <a href="../api/#MRIBuilder.Components.Pulses.InstantPulses.InstantPulse"><code>InstantPulse</code></a>, etc.</li><li>Variables describing that type (e.g., <code>flip_angle</code>, <code>duration</code>, <code>frequency</code>)</li></ul></li><li><code>binomial_order</code>: How many repeats of <code>pulse_type</code> there should be in a single binomial pulse.</li></ul><p><strong>Variables</strong></p><ul><li><code>nrepeat</code>: number of repeats of the binomial pulse. This should typically be set by the user.</li><li><code>interblock_delay</code>: time between the start of each pulse. Should be short compared with the T1, but long enough to limit SAR.</li><li><code>duration</code>: total duration of the saturation pulse.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/helper_functions.jl#L313-L328">source</a></section></article><h2 id="Optimisation-helper-functions"><a class="docs-heading-anchor" href="#Optimisation-helper-functions">Optimisation helper functions</a><a id="Optimisation-helper-functions-1"></a><a class="docs-heading-anchor-permalink" href="#Optimisation-helper-functions" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}" href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>MRIBuilder.BuildSequences.build_sequence</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Wrapper to build a sequence.</p><p>Use as </p><pre><code class="language-julia hljs">build_sequence(scanner;) do ... end</code></pre><p>Within the code block you can create one or more sequences, e.g.</p><pre><code class="nohighlight hljs">seq = Sequence( SincPulse(flip_angle=90, phase=0, duration=2., bandwidth=:max) nothing., SingleReadout -)</code></pre><p>You can also add any arbitrary constraints or objectives using one of:</p><ul><li><code>set_simple_constraints!</code></li><li><code>apply_simple_constraint!</code></li><li><code>add_cost_function!</code></li></ul><p>As soon as the code block ends the sequence is optimised (if <code>optimise=true</code>) and returned.</p><p><strong>Parameters</strong></p><ul><li><code>scanner</code>: Set to a <a href="../scanners/#MRIBuilder.Scanners.Scanner"><code>Scanner</code></a> to limit the gradient strength and slew rate. When this call to <code>build_sequence</code> is embedded in another, this parameter can be set to <code>nothing</code> to indicate that the same scanner should be used. </li><li><code>optimise</code>: Whether to optimise and fix the sequence as soon as it is returned. This defaults to <code>true</code> if a scanner is provided and <code>false</code> if no scanner is provided.</li><li><code>n_attempts</code>: How many times to restart the optimiser (default: 20)? Decrease if you want to quickly check feasibility of a simple sequence. Increase if convergence fails for a complex sequence.</li><li><code>kwargs...</code>: Other keywords are passed on as attributes to the <code>optimiser_constructor</code> (e.g., set <code>print_level=3</code> to make the Ipopt optimiser quieter).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/build_sequences.jl#L32-L62">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.fixed-Tuple{Any}" href="#MRIBuilder.BuildSequences.fixed-Tuple{Any}"><code>MRIBuilder.BuildSequences.fixed</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">fixed(building_block)</code></pre><p>Return an equiavalent <code>BuildingBlock</code> with all free variables replaced by numbers.</p><p>This will only work after calling <code>optimize!</code>(@ref)(<a href="@ref"><code>global_model</code></a>()). It is used internally by <a href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>build_sequence</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/build_sequences.jl#L235-L242">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.get_optimiser-Tuple{JuMP.Model}" href="#MRIBuilder.BuildSequences.get_optimiser-Tuple{JuMP.Model}"><code>MRIBuilder.BuildSequences.get_optimiser</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_optimiser(model)</code></pre><p>Returns a JuMP solver (https://jump.dev/JuMP.jl/stable/installation/#Supported-solvers) appropriate for this model.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/build_sequences.jl#L113-L117">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.global_scanner-Tuple{}" href="#MRIBuilder.BuildSequences.global_scanner-Tuple{}"><code>MRIBuilder.BuildSequences.global_scanner</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">global_scanner()</code></pre><p>Return the currently set <a href="../scanners/#MRIBuilder.Scanners.Scanner"><code>Scanner</code></a>.</p><p>The scanner can be set using <a href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>build_sequence</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/build_sequences.jl#L220-L226">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.iterate_cost-Tuple{}" href="#MRIBuilder.BuildSequences.iterate_cost-Tuple{}"><code>MRIBuilder.BuildSequences.iterate_cost</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">iterate_cost()</code></pre><p>Return a sequence of all the cost functions that should be optimised in order.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/build_sequences.jl#L13-L17">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.model_has_integers-Tuple{JuMP.Model}" href="#MRIBuilder.BuildSequences.model_has_integers-Tuple{JuMP.Model}"><code>MRIBuilder.BuildSequences.model_has_integers</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">model_has_integers(model)</code></pre><p>Returns true if the model contains integer variables.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/build_sequences.jl#L106-L110">source</a></section></article><h2 id="Pathways-API"><a class="docs-heading-anchor" href="#Pathways-API">Pathways API</a><a id="Pathways-API-1"></a><a class="docs-heading-anchor-permalink" href="#Pathways-API" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.GradientTracker" href="#MRIBuilder.Pathways.GradientTracker"><code>MRIBuilder.Pathways.GradientTracker</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Helper structure for <a href="#MRIBuilder.Pathways.PathwayWalker"><code>PathwayWalker</code></a>, which is itself a helper for <code>Pathway</code>. You are deep down the rabit hole now...</p><p>For documentation, see that structure and <a href="#MRIBuilder.Pathways.walk_pathway!-Tuple{Sequence, MRIBuilder.Pathways.PathwayWalker, Vector{Symbol}, Ref{Int64}}"><code>walk_pathway!</code></a> and <a href="#MRIBuilder.Pathways.update_walker_gradient!-Tuple{MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}"><code>update_walker_gradient!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L222-L226">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.Pathway" href="#MRIBuilder.Pathways.Pathway"><code>MRIBuilder.Pathways.Pathway</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">Pathway(sequence::Sequence, pulse_effects::Vector{:Symbol/Number}, readout_index=1; group=nothing)</code></pre><p>Describes how a specific spin/isochromat might experience the sequence.</p><p>Only a single pathway through the RF pulses is considered, so that at every point in time the spins are in one of the following four states:</p><ul><li>+longitudinal: initial relaxed state</li><li>+transverse: excited state. During this time gradients will affect the <a href="#MRIBuilder.Variables.variables.area_under_curve"><code>variables.area_under_curve</code></a> (or <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.qval-sequence_optimisation"><code>variables.qval</code></a>) and <a href="#MRIBuilder.Variables.variables.bval"><code>variables.bval</code></a>.</li><li>-longitudinal: inverse state</li><li>-transverse: inverse excited state. During this time all gradients will have the inverse effect compared with +transverse.</li></ul><p>The RF pulses cause mappings between these different states as described below.</p><p><strong>Parameters</strong></p><ul><li><code>sequence</code>: MRI <a href="../api/#MRIBuilder.Containers.BaseSequences.Sequence"><code>Sequence</code></a> to be considered.</li><li><code>pulse_effects</code>: How each RF pulse affects the spins. This can be one of the following:<ul><li><code>:skip</code>/<code>:ignore</code>/0: This RF pulse leaves the spins unaffected.</li><li><code>:refocus</code>/<code>:invert</code>/180: Flips the sign of the spin state (i.e., +longitudinal <-> -longitudinal, +transverse <-> -transverse)</li><li><code>:excite</code>/90: Takes spin state one step along the following sequence +longitudinal -> +transverse -> -longitudinal -> -transverse -> +longitudinal</li><li><code>:neg_excite</code>/270/-90: Inverse step compared with <code>:excite</code>.</li></ul></li><li><code>readout_index</code>: After encountering the number of pulses as defined in <code>pulse_effects</code>, continue the <code>Pathway</code> until the readout given by <code>index</code> is reached. If set to 0 the <code>Pathway</code> is terminated immediately after the last RF pulse.</li><li><code>group</code>: which gradient grouping to consider for the <code>net_dephasing</code> and <code>bmat</code>. If not set, all gradients will be considered (using their current alignment).</li></ul><p><strong>Attributes</strong></p><p>Over the pathway the following values are computed. Each can be accessed by calling the appropriate function:</p><p><strong>Timings</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.duration_state"><code>variables.duration_state</code></a>: The total amount of time spent in a specific state in this pathway (+longitudinal, +transverse, -longitudinal, or -transverse)</li><li><a href="#MRIBuilder.Variables.variables.duration_transverse"><code>variables.duration_transverse</code></a>: The total amount of time the spins spent in the transverse plane in ms. This can be used to quantify the expected effect of T2-decay.</li><li><a href="#MRIBuilder.Variables.variables.duration_dephase"><code>variables.duration_dephase</code></a>: The total amount of time the spins spent in the +transverse relative to -transverse state in ms. The absolute value of this can be used to quantify the expected effect of T2'-decay.</li></ul><p><strong>Effect of gradients</strong></p><p>The area under curve, q-values, and b-values are computed separately for each group of gradients (depending on the <code>group</code> keyword set during construction).</p><ul><li><a href="#MRIBuilder.Variables.variables.net_dephasing"><code>variables.net_dephasing</code></a>: Net displacement vector in k-space/q-space.</li><li><a href="#MRIBuilder.Variables.variables.bmat"><code>variables.bmat</code></a>: Net diffusion weighting due to gradients along the <code>Pathway</code> in matrix form.</li><li><a href="#MRIBuilder.Variables.variables.bval"><code>variables.bval</code></a>: Net diffusion weighting due to gradients along the <code>Pathway</code> as a single number.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L9-L46">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.PathwayWalker" href="#MRIBuilder.Pathways.PathwayWalker"><code>MRIBuilder.Pathways.PathwayWalker</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Helper structure for <code>Pathway</code>.</p><p>For documentation, see that structure and <a href="#MRIBuilder.Pathways.walk_pathway!-Tuple{Sequence, MRIBuilder.Pathways.PathwayWalker, Vector{Symbol}, Ref{Int64}}"><code>walk_pathway!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L236-L240">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.duration_state_index-Tuple{Any, Any}" href="#MRIBuilder.Pathways.duration_state_index-Tuple{Any, Any}"><code>MRIBuilder.Pathways.duration_state_index</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_state_index(transverse, positive)</code></pre><p>Returns the index of a specific state in the <code>Pathway.duration_state</code> vector.</p><p>This function is used internally to access that vector.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L492-L498">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.interpret_pulse_effects-Tuple{Number}" href="#MRIBuilder.Pathways.interpret_pulse_effects-Tuple{Number}"><code>MRIBuilder.Pathways.interpret_pulse_effects</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">interpret_pulse_effects(number_or_symbol)</code></pre><p>Interpret the various numbers and symbols that can be passed on to a <code>Pathway</code>.</p><p>The result will be one of:</p><ul><li>:ignore (if input is 0, :ignore, or :skip).</li><li>:excite (if input is 90 or :excite).</li><li>:refocus (if input is 180, :refocus, or :excite).</li><li>:neg_excite (if input is -90, 270, or :negexcite).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L178-L188">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.update_gradient_tracker_till_time!-Tuple{MRIBuilder.Pathways.PathwayWalker, Union{Nothing, Symbol}, Union{Number, JuMP.AbstractJuMPScalar}}" href="#MRIBuilder.Pathways.update_gradient_tracker_till_time!-Tuple{MRIBuilder.Pathways.PathwayWalker, Union{Nothing, Symbol}, Union{Number, JuMP.AbstractJuMPScalar}}"><code>MRIBuilder.Pathways.update_gradient_tracker_till_time!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">update_gradient_tracker_till_time!(walker::PathwayWalker, key, new_time) -update_gradient_tracker_till_time!(tracker::GradientTracker, new_time)</code></pre><p>Update the <code>bmat</code> for any time passed since the last update (assuming there will no gradients during that period).</p><p>The <code>bmat</code> is updated with the outer produce of <code>qvec</code> with itself multiplied by the time since the last update.</p><p>When called with the first signature the tracker will be created from scratch if a tracker with that <code>key</code> does not exist.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L373-L382">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.update_walker_gradient!-Tuple{MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}" href="#MRIBuilder.Pathways.update_walker_gradient!-Tuple{MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}"><code>MRIBuilder.Pathways.update_walker_gradient!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">update_walker_gradient!(gradient_block::GradientWaveform, walker::PathwayWalker, gradient_start_time::VariableType; overlapping_pulses=[], overlapping_readouts=[])</code></pre><p>Update the walker's <code>qvec</code> and <code>bmat</code> based on the given <code>gradient_block</code>.</p><p>The following steps will be taken:</p><ul><li>Do nothing if <code>walker.is_transverse</code> is false</li><li>increase the appropriate <code>walker.bmat</code> by the outer product of <code>walker.qvec</code> with itself multiplied by the time since the last gradient</li><li>update the appropriate <code>walker.qvec</code> and <code>walker.bmat</code> based on the gradient waveform. This will require appropriate <code>qvec</code>/<code>bmat</code> functions to be defined for the gradient building block.</li><li>update <code>walker.last_gradient_time</code> to the time at the end of the gradient.</li></ul><p>This requires <a href="../api/#MRIBuilder.Variables.variables.bmat_gradient"><code>variables.bmat_gradient</code></a> and <a href="../api/#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a> to be implemented for the <a href="../api/#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L448-L460">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.update_walker_instant_gradient!-Union{Tuple{N}, Tuple{InstantGradient{N}, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}} where N" href="#MRIBuilder.Pathways.update_walker_instant_gradient!-Union{Tuple{N}, Tuple{InstantGradient{N}, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}} where N"><code>MRIBuilder.Pathways.update_walker_instant_gradient!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">update_walker_instant_gradient!(gradient, walker)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L480-L482">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.update_walker_pulse!-Tuple{MRIBuilder.Pathways.PathwayWalker, AbstractVector{Symbol}, Union{Number, JuMP.AbstractJuMPScalar}}" href="#MRIBuilder.Pathways.update_walker_pulse!-Tuple{MRIBuilder.Pathways.PathwayWalker, AbstractVector{Symbol}, Union{Number, JuMP.AbstractJuMPScalar}}"><code>MRIBuilder.Pathways.update_walker_pulse!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">update_walker_pulse!(walker::PathwayWalker, pulse_effects::Vector, pulse_time)</code></pre><p>Apply the first element of <code>pulse_effects</code> to the <code>walker</code> at the given <code>pulse_time</code>.</p><p>The following steps will be taken if the first <code>pulse_effect</code> is not <code>:ignore</code></p><ul><li>if <code>walker.is_transverse</code> is true before the pulse, increase the <code>walker.bmat</code> by the outer product of <code>walker.qvec</code> with itself multiplied by the time since the last gradient</li><li>update <code>walker.duration_states</code> with time since last pulse.</li><li>update <code>walker.last_pulse_time</code></li><li>update <code>walker.is_transverse</code>, and <code>walker.is_positive</code> based on the first value in <code>pulse_effects</code>. </li><li>if <code>walker.is_positive</code> changed in the previous step than the <code>walker.qvec</code> needs to be flipped.</li><li>remove the first element from <code>pulse_effects</code>.</li></ul><p>If the first element is <code>:ignore</code> the only effect is that the first element is removed from <code>pulse_effects</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L398-L412">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.update_walker_till_time!" href="#MRIBuilder.Pathways.update_walker_till_time!"><code>MRIBuilder.Pathways.update_walker_till_time!</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">update_walker_till_time!(walker::PathwayWalker, new_time[, gradient_group])</code></pre><p>Updates all parts of a <a href="#MRIBuilder.Pathways.PathwayWalker"><code>PathwayWalker</code></a> up to the given time.</p><p>This updates the <code>walker.duration_states</code> and the <code>bmat</code> for each gradient tracker. If <code>gradient_group</code> are provided, then only the gradient tracker matching that group will be updated. If that gradient tracker does not exist, it will be created.</p><p>This function is used to get the <code>walker</code> up to date till the start of a gradient, pulse, or final readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L347-L357">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.walk_pathway!-Tuple{Sequence, MRIBuilder.Pathways.PathwayWalker, Vector{Symbol}, Ref{Int64}}" href="#MRIBuilder.Pathways.walk_pathway!-Tuple{Sequence, MRIBuilder.Pathways.PathwayWalker, Vector{Symbol}, Ref{Int64}}"><code>MRIBuilder.Pathways.walk_pathway!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">walk_pathway!(bb::Sequence/BuildingBlock, walker::PathwayWalker, pulse_effects::Vector, nreadout::Ref{Int}, start_time)</code></pre><p>Computes the effect of a specific <a href="../api/#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a> (starting at <code>start_time</code>) on the <a href="#MRIBuilder.Pathways.PathwayWalker"><code>PathwayWalker</code></a>.</p><p>For individual pulses and gradients, the following behaviour is implemented:</p><ul><li>If a pulse is encountered, call <a href="#MRIBuilder.Pathways.update_walker_pulse!-Tuple{MRIBuilder.Pathways.PathwayWalker, AbstractVector{Symbol}, Union{Number, JuMP.AbstractJuMPScalar}}"><code>update_walker_pulse!</code></a><code>(walker, pulse_effects, pulse_effective_time)</code></li><li>If a gradient is encountered, call <a href="#MRIBuilder.Pathways.update_walker_gradient!-Tuple{MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}"><code>update_walker_gradient!</code></a>(gradient, walker, gradient<em>start</em>time)</li></ul><p>For overlapping gradients/pulses, one should first encounter the part of the gradient before the <a href="../api/#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a> of the pulse, then apply the pulse, and then the rest of the gradient. This effective time can be passed on to <a href="#MRIBuilder.Pathways.update_walker_gradient!-Tuple{MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}"><code>update_walker_gradient!</code></a> to allow part of the gradient waveform to be applied.</p><p>The function should return <code>true</code> if the <code>Pathway</code> has reached its end (i.e., the final readout) and <code>false</code> otherwise.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L255-L269">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.get_pathway" href="#MRIBuilder.Variables.get_pathway"><code>MRIBuilder.Variables.get_pathway</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_pathway(sequence)</code></pre><p>Gets the main <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> that spins are expected to experience in the sequence.</p><p>Multiple pathways might be returned as an array or (named)tuple.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L168-L174">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.area_under_curve" href="#MRIBuilder.Variables.variables.area_under_curve"><code>MRIBuilder.Variables.variables.area_under_curve</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">area_under_curve(pathway::Pathway)</code></pre><p>Return net displacement in k-space (i.e., spoiling) experienced by the spins following a specific <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a>.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>area_under_curve</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L131-L139">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bmat" href="#MRIBuilder.Variables.variables.bmat"><code>MRIBuilder.Variables.variables.bmat</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bmat(pathway::Pathway)</code></pre><p>Return 3x3 diffusion-weighted matrix experienced by the spins following a specific <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in rad^2 ms/um^2.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>bmat</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L144-L152">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bval" href="#MRIBuilder.Variables.variables.bval"><code>MRIBuilder.Variables.variables.bval</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bval(pathway::Pathway)</code></pre><p>Return size of diffusion-weighting experienced by the spins following a specific <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in rad^2 ms/um^2.</p><p>Only gradients active while the spins are in the transverse plane will contribute to the diffusion weighting.</p><p>Returns a NamedTuple with the <code>bval</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L156-L164">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_dephase" href="#MRIBuilder.Variables.variables.duration_dephase"><code>MRIBuilder.Variables.variables.duration_dephase</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_dephase(pathway::Pathway)</code></pre><p>Returns the net time that spins following the given <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in the +transverse versus the -transverse state. This determines the amount of T2'-weighting as <span>$e^{t/T_2'}$</span>, where <span>$t$</span> is the <code>duration_dephase</code>.</p><p>Also see <a href="#MRIBuilder.Variables.variables.duration_transverse"><code>variables.duration_transverse</code></a> for T2-weighting.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L106-L113">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_state" href="#MRIBuilder.Variables.variables.duration_state"><code>MRIBuilder.Variables.variables.duration_state</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_state(pathway::Pathway, transverse::Bool, positive::Bool)</code></pre><p>Returns how long the <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in a specific state.</p><p>The requested state can be set using <code>transverse</code> and <code>positive</code> as follows:</p><ul><li><code>transverse=false</code>, <code>positive=true</code>: +longitudinal</li><li><code>transverse=true</code>, <code>positive=true</code>: +transverse</li><li><code>transverse=false</code>, <code>positive=false</code>: -longitudinal</li><li><code>transverse=true</code>, <code>positive=false</code>: -transverse</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L77-L87">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_transverse" href="#MRIBuilder.Variables.variables.duration_transverse"><code>MRIBuilder.Variables.variables.duration_transverse</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_transverse(pathway::Pathway)</code></pre><p>Returns the total amount of time that spins following the given <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in the transverse plane. This determines the amount of T2-weighting as <span>$e^{t/T_2}$</span>, where <span>$t$</span> is the <code>duration_transverse</code>.</p><p>Also see <a href="#MRIBuilder.Variables.variables.duration_dephase"><code>variables.duration_dephase</code></a> for T2'-weighting.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L93-L100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.net_dephasing" href="#MRIBuilder.Variables.variables.net_dephasing"><code>MRIBuilder.Variables.variables.net_dephasing</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">net_dephasing(pathway::Pathway)</code></pre><p>Return net displacement vector in k-space/q-space experienced by the spins following a specific <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in kHz/um.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>qvec</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L118-L126">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../implemented_sequences/">« Implemented sequences</a><a class="docs-footer-nextpage" href="../adjust_sequences/">Post-hoc adjustments »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 14:27">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> +)</code></pre><p>You can also add any arbitrary constraints or objectives using one of:</p><ul><li><code>set_simple_constraints!</code></li><li><code>apply_simple_constraint!</code></li><li><code>add_cost_function!</code></li></ul><p>As soon as the code block ends the sequence is optimised (if <code>optimise=true</code>) and returned.</p><p><strong>Parameters</strong></p><ul><li><code>scanner</code>: Set to a <a href="../scanners/#MRIBuilder.Scanners.Scanner"><code>Scanner</code></a> to limit the gradient strength and slew rate. When this call to <code>build_sequence</code> is embedded in another, this parameter can be set to <code>nothing</code> to indicate that the same scanner should be used. </li><li><code>optimise</code>: Whether to optimise and fix the sequence as soon as it is returned. This defaults to <code>true</code> if a scanner is provided and <code>false</code> if no scanner is provided.</li><li><code>n_attempts</code>: How many times to restart the optimiser (default: 20)? Decrease if you want to quickly check feasibility of a simple sequence. Increase if convergence fails for a complex sequence.</li><li><code>kwargs...</code>: Other keywords are passed on as attributes to the <code>optimiser_constructor</code> (e.g., set <code>print_level=3</code> to make the Ipopt optimiser quieter).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/build_sequences.jl#L32-L62">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.fixed-Tuple{Any}" href="#MRIBuilder.BuildSequences.fixed-Tuple{Any}"><code>MRIBuilder.BuildSequences.fixed</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">fixed(building_block)</code></pre><p>Return an equiavalent <code>BuildingBlock</code> with all free variables replaced by numbers.</p><p>This will only work after calling <code>optimize!</code>(@ref)(<a href="@ref"><code>global_model</code></a>()). It is used internally by <a href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>build_sequence</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/build_sequences.jl#L235-L242">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.get_optimiser-Tuple{JuMP.Model}" href="#MRIBuilder.BuildSequences.get_optimiser-Tuple{JuMP.Model}"><code>MRIBuilder.BuildSequences.get_optimiser</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_optimiser(model)</code></pre><p>Returns a JuMP solver (https://jump.dev/JuMP.jl/stable/installation/#Supported-solvers) appropriate for this model.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/build_sequences.jl#L113-L117">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.global_scanner-Tuple{}" href="#MRIBuilder.BuildSequences.global_scanner-Tuple{}"><code>MRIBuilder.BuildSequences.global_scanner</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">global_scanner()</code></pre><p>Return the currently set <a href="../scanners/#MRIBuilder.Scanners.Scanner"><code>Scanner</code></a>.</p><p>The scanner can be set using <a href="#MRIBuilder.BuildSequences.build_sequence-Tuple{Function, Union{Nothing, Scanner}, Tuple, Bool, Int64}"><code>build_sequence</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/build_sequences.jl#L220-L226">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.iterate_cost-Tuple{}" href="#MRIBuilder.BuildSequences.iterate_cost-Tuple{}"><code>MRIBuilder.BuildSequences.iterate_cost</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">iterate_cost()</code></pre><p>Return a sequence of all the cost functions that should be optimised in order.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/build_sequences.jl#L13-L17">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.BuildSequences.model_has_integers-Tuple{JuMP.Model}" href="#MRIBuilder.BuildSequences.model_has_integers-Tuple{JuMP.Model}"><code>MRIBuilder.BuildSequences.model_has_integers</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">model_has_integers(model)</code></pre><p>Returns true if the model contains integer variables.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/build_sequences.jl#L106-L110">source</a></section></article><h2 id="Pathways-API"><a class="docs-heading-anchor" href="#Pathways-API">Pathways API</a><a id="Pathways-API-1"></a><a class="docs-heading-anchor-permalink" href="#Pathways-API" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.GradientTracker" href="#MRIBuilder.Pathways.GradientTracker"><code>MRIBuilder.Pathways.GradientTracker</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Helper structure for <a href="#MRIBuilder.Pathways.PathwayWalker"><code>PathwayWalker</code></a>, which is itself a helper for <code>Pathway</code>. You are deep down the rabit hole now...</p><p>For documentation, see that structure and <a href="#MRIBuilder.Pathways.walk_pathway!-Tuple{Sequence, MRIBuilder.Pathways.PathwayWalker, Vector{Symbol}, Ref{Int64}}"><code>walk_pathway!</code></a> and <a href="#MRIBuilder.Pathways.update_walker_gradient!-Tuple{MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}"><code>update_walker_gradient!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L222-L226">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.Pathway" href="#MRIBuilder.Pathways.Pathway"><code>MRIBuilder.Pathways.Pathway</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">Pathway(sequence::Sequence, pulse_effects::Vector{:Symbol/Number}, readout_index=1; group=nothing)</code></pre><p>Describes how a specific spin/isochromat might experience the sequence.</p><p>Only a single pathway through the RF pulses is considered, so that at every point in time the spins are in one of the following four states:</p><ul><li>+longitudinal: initial relaxed state</li><li>+transverse: excited state. During this time gradients will affect the <a href="#MRIBuilder.Variables.variables.area_under_curve"><code>variables.area_under_curve</code></a> (or <a href="../sequence_optimisation/#MRIBuilder.Variables.variables.qval-sequence_optimisation"><code>variables.qval</code></a>) and <a href="#MRIBuilder.Variables.variables.bval"><code>variables.bval</code></a>.</li><li>-longitudinal: inverse state</li><li>-transverse: inverse excited state. During this time all gradients will have the inverse effect compared with +transverse.</li></ul><p>The RF pulses cause mappings between these different states as described below.</p><p><strong>Parameters</strong></p><ul><li><code>sequence</code>: MRI <a href="../api/#MRIBuilder.Containers.BaseSequences.Sequence"><code>Sequence</code></a> to be considered.</li><li><code>pulse_effects</code>: How each RF pulse affects the spins. This can be one of the following:<ul><li><code>:skip</code>/<code>:ignore</code>/0: This RF pulse leaves the spins unaffected.</li><li><code>:refocus</code>/<code>:invert</code>/180: Flips the sign of the spin state (i.e., +longitudinal <-> -longitudinal, +transverse <-> -transverse)</li><li><code>:excite</code>/90: Takes spin state one step along the following sequence +longitudinal -> +transverse -> -longitudinal -> -transverse -> +longitudinal</li><li><code>:neg_excite</code>/270/-90: Inverse step compared with <code>:excite</code>.</li></ul></li><li><code>readout_index</code>: After encountering the number of pulses as defined in <code>pulse_effects</code>, continue the <code>Pathway</code> until the readout given by <code>index</code> is reached. If set to 0 the <code>Pathway</code> is terminated immediately after the last RF pulse.</li><li><code>group</code>: which gradient grouping to consider for the <code>net_dephasing</code> and <code>bmat</code>. If not set, all gradients will be considered (using their current alignment).</li></ul><p><strong>Attributes</strong></p><p>Over the pathway the following values are computed. Each can be accessed by calling the appropriate function:</p><p><strong>Timings</strong></p><ul><li><a href="#MRIBuilder.Variables.variables.duration_state"><code>variables.duration_state</code></a>: The total amount of time spent in a specific state in this pathway (+longitudinal, +transverse, -longitudinal, or -transverse)</li><li><a href="#MRIBuilder.Variables.variables.duration_transverse"><code>variables.duration_transverse</code></a>: The total amount of time the spins spent in the transverse plane in ms. This can be used to quantify the expected effect of T2-decay.</li><li><a href="#MRIBuilder.Variables.variables.duration_dephase"><code>variables.duration_dephase</code></a>: The total amount of time the spins spent in the +transverse relative to -transverse state in ms. The absolute value of this can be used to quantify the expected effect of T2'-decay.</li></ul><p><strong>Effect of gradients</strong></p><p>The area under curve, q-values, and b-values are computed separately for each group of gradients (depending on the <code>group</code> keyword set during construction).</p><ul><li><a href="#MRIBuilder.Variables.variables.net_dephasing"><code>variables.net_dephasing</code></a>: Net displacement vector in k-space/q-space.</li><li><a href="#MRIBuilder.Variables.variables.bmat"><code>variables.bmat</code></a>: Net diffusion weighting due to gradients along the <code>Pathway</code> in matrix form.</li><li><a href="#MRIBuilder.Variables.variables.bval"><code>variables.bval</code></a>: Net diffusion weighting due to gradients along the <code>Pathway</code> as a single number.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L9-L46">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.PathwayWalker" href="#MRIBuilder.Pathways.PathwayWalker"><code>MRIBuilder.Pathways.PathwayWalker</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Helper structure for <code>Pathway</code>.</p><p>For documentation, see that structure and <a href="#MRIBuilder.Pathways.walk_pathway!-Tuple{Sequence, MRIBuilder.Pathways.PathwayWalker, Vector{Symbol}, Ref{Int64}}"><code>walk_pathway!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L236-L240">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.duration_state_index-Tuple{Any, Any}" href="#MRIBuilder.Pathways.duration_state_index-Tuple{Any, Any}"><code>MRIBuilder.Pathways.duration_state_index</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_state_index(transverse, positive)</code></pre><p>Returns the index of a specific state in the <code>Pathway.duration_state</code> vector.</p><p>This function is used internally to access that vector.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L492-L498">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.interpret_pulse_effects-Tuple{Number}" href="#MRIBuilder.Pathways.interpret_pulse_effects-Tuple{Number}"><code>MRIBuilder.Pathways.interpret_pulse_effects</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">interpret_pulse_effects(number_or_symbol)</code></pre><p>Interpret the various numbers and symbols that can be passed on to a <code>Pathway</code>.</p><p>The result will be one of:</p><ul><li>:ignore (if input is 0, :ignore, or :skip).</li><li>:excite (if input is 90 or :excite).</li><li>:refocus (if input is 180, :refocus, or :excite).</li><li>:neg_excite (if input is -90, 270, or :negexcite).</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L178-L188">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.update_gradient_tracker_till_time!-Tuple{MRIBuilder.Pathways.PathwayWalker, Union{Nothing, Symbol}, Union{Number, JuMP.AbstractJuMPScalar}}" href="#MRIBuilder.Pathways.update_gradient_tracker_till_time!-Tuple{MRIBuilder.Pathways.PathwayWalker, Union{Nothing, Symbol}, Union{Number, JuMP.AbstractJuMPScalar}}"><code>MRIBuilder.Pathways.update_gradient_tracker_till_time!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">update_gradient_tracker_till_time!(walker::PathwayWalker, key, new_time) +update_gradient_tracker_till_time!(tracker::GradientTracker, new_time)</code></pre><p>Update the <code>bmat</code> for any time passed since the last update (assuming there will no gradients during that period).</p><p>The <code>bmat</code> is updated with the outer produce of <code>qvec</code> with itself multiplied by the time since the last update.</p><p>When called with the first signature the tracker will be created from scratch if a tracker with that <code>key</code> does not exist.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L373-L382">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.update_walker_gradient!-Tuple{MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}" href="#MRIBuilder.Pathways.update_walker_gradient!-Tuple{MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}"><code>MRIBuilder.Pathways.update_walker_gradient!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">update_walker_gradient!(gradient_block::GradientWaveform, walker::PathwayWalker, gradient_start_time::VariableType; overlapping_pulses=[], overlapping_readouts=[])</code></pre><p>Update the walker's <code>qvec</code> and <code>bmat</code> based on the given <code>gradient_block</code>.</p><p>The following steps will be taken:</p><ul><li>Do nothing if <code>walker.is_transverse</code> is false</li><li>increase the appropriate <code>walker.bmat</code> by the outer product of <code>walker.qvec</code> with itself multiplied by the time since the last gradient</li><li>update the appropriate <code>walker.qvec</code> and <code>walker.bmat</code> based on the gradient waveform. This will require appropriate <code>qvec</code>/<code>bmat</code> functions to be defined for the gradient building block.</li><li>update <code>walker.last_gradient_time</code> to the time at the end of the gradient.</li></ul><p>This requires <a href="../api/#MRIBuilder.Variables.variables.bmat_gradient"><code>variables.bmat_gradient</code></a> and <a href="../api/#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a> to be implemented for the <a href="../api/#MRIBuilder.Components.AbstractTypes.GradientWaveform"><code>GradientWaveform</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L448-L460">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.update_walker_instant_gradient!-Union{Tuple{N}, Tuple{InstantGradient{N}, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}} where N" href="#MRIBuilder.Pathways.update_walker_instant_gradient!-Union{Tuple{N}, Tuple{InstantGradient{N}, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}} where N"><code>MRIBuilder.Pathways.update_walker_instant_gradient!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">update_walker_instant_gradient!(gradient, walker)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L480-L482">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.update_walker_pulse!-Tuple{MRIBuilder.Pathways.PathwayWalker, AbstractVector{Symbol}, Union{Number, JuMP.AbstractJuMPScalar}}" href="#MRIBuilder.Pathways.update_walker_pulse!-Tuple{MRIBuilder.Pathways.PathwayWalker, AbstractVector{Symbol}, Union{Number, JuMP.AbstractJuMPScalar}}"><code>MRIBuilder.Pathways.update_walker_pulse!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">update_walker_pulse!(walker::PathwayWalker, pulse_effects::Vector, pulse_time)</code></pre><p>Apply the first element of <code>pulse_effects</code> to the <code>walker</code> at the given <code>pulse_time</code>.</p><p>The following steps will be taken if the first <code>pulse_effect</code> is not <code>:ignore</code></p><ul><li>if <code>walker.is_transverse</code> is true before the pulse, increase the <code>walker.bmat</code> by the outer product of <code>walker.qvec</code> with itself multiplied by the time since the last gradient</li><li>update <code>walker.duration_states</code> with time since last pulse.</li><li>update <code>walker.last_pulse_time</code></li><li>update <code>walker.is_transverse</code>, and <code>walker.is_positive</code> based on the first value in <code>pulse_effects</code>. </li><li>if <code>walker.is_positive</code> changed in the previous step than the <code>walker.qvec</code> needs to be flipped.</li><li>remove the first element from <code>pulse_effects</code>.</li></ul><p>If the first element is <code>:ignore</code> the only effect is that the first element is removed from <code>pulse_effects</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L398-L412">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.update_walker_till_time!" href="#MRIBuilder.Pathways.update_walker_till_time!"><code>MRIBuilder.Pathways.update_walker_till_time!</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">update_walker_till_time!(walker::PathwayWalker, new_time[, gradient_group])</code></pre><p>Updates all parts of a <a href="#MRIBuilder.Pathways.PathwayWalker"><code>PathwayWalker</code></a> up to the given time.</p><p>This updates the <code>walker.duration_states</code> and the <code>bmat</code> for each gradient tracker. If <code>gradient_group</code> are provided, then only the gradient tracker matching that group will be updated. If that gradient tracker does not exist, it will be created.</p><p>This function is used to get the <code>walker</code> up to date till the start of a gradient, pulse, or final readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L347-L357">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Pathways.walk_pathway!-Tuple{Sequence, MRIBuilder.Pathways.PathwayWalker, Vector{Symbol}, Ref{Int64}}" href="#MRIBuilder.Pathways.walk_pathway!-Tuple{Sequence, MRIBuilder.Pathways.PathwayWalker, Vector{Symbol}, Ref{Int64}}"><code>MRIBuilder.Pathways.walk_pathway!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">walk_pathway!(bb::Sequence/BuildingBlock, walker::PathwayWalker, pulse_effects::Vector, nreadout::Ref{Int}, start_time)</code></pre><p>Computes the effect of a specific <a href="../api/#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a> (starting at <code>start_time</code>) on the <a href="#MRIBuilder.Pathways.PathwayWalker"><code>PathwayWalker</code></a>.</p><p>For individual pulses and gradients, the following behaviour is implemented:</p><ul><li>If a pulse is encountered, call <a href="#MRIBuilder.Pathways.update_walker_pulse!-Tuple{MRIBuilder.Pathways.PathwayWalker, AbstractVector{Symbol}, Union{Number, JuMP.AbstractJuMPScalar}}"><code>update_walker_pulse!</code></a><code>(walker, pulse_effects, pulse_effective_time)</code></li><li>If a gradient is encountered, call <a href="#MRIBuilder.Pathways.update_walker_gradient!-Tuple{MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}"><code>update_walker_gradient!</code></a>(gradient, walker, gradient<em>start</em>time)</li></ul><p>For overlapping gradients/pulses, one should first encounter the part of the gradient before the <a href="../api/#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a> of the pulse, then apply the pulse, and then the rest of the gradient. This effective time can be passed on to <a href="#MRIBuilder.Pathways.update_walker_gradient!-Tuple{MRIBuilder.Components.GradientWaveforms.NoGradientBlocks.NoGradient, MRIBuilder.Pathways.PathwayWalker, Union{Number, JuMP.AbstractJuMPScalar}}"><code>update_walker_gradient!</code></a> to allow part of the gradient waveform to be applied.</p><p>The function should return <code>true</code> if the <code>Pathway</code> has reached its end (i.e., the final readout) and <code>false</code> otherwise.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L255-L269">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.get_pathway" href="#MRIBuilder.Variables.get_pathway"><code>MRIBuilder.Variables.get_pathway</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_pathway(sequence)</code></pre><p>Gets the main <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> that spins are expected to experience in the sequence.</p><p>Multiple pathways might be returned as an array or (named)tuple.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L168-L174">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.area_under_curve" href="#MRIBuilder.Variables.variables.area_under_curve"><code>MRIBuilder.Variables.variables.area_under_curve</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">area_under_curve(pathway::Pathway)</code></pre><p>Return net displacement in k-space (i.e., spoiling) experienced by the spins following a specific <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a>.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>area_under_curve</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L131-L139">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bmat" href="#MRIBuilder.Variables.variables.bmat"><code>MRIBuilder.Variables.variables.bmat</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bmat(pathway::Pathway)</code></pre><p>Return 3x3 diffusion-weighted matrix experienced by the spins following a specific <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in rad^2 ms/um^2.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>bmat</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L144-L152">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bval" href="#MRIBuilder.Variables.variables.bval"><code>MRIBuilder.Variables.variables.bval</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bval(pathway::Pathway)</code></pre><p>Return size of diffusion-weighting experienced by the spins following a specific <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in rad^2 ms/um^2.</p><p>Only gradients active while the spins are in the transverse plane will contribute to the diffusion weighting.</p><p>Returns a NamedTuple with the <code>bval</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L156-L164">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_dephase" href="#MRIBuilder.Variables.variables.duration_dephase"><code>MRIBuilder.Variables.variables.duration_dephase</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_dephase(pathway::Pathway)</code></pre><p>Returns the net time that spins following the given <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in the +transverse versus the -transverse state. This determines the amount of T2'-weighting as <span>$e^{t/T_2'}$</span>, where <span>$t$</span> is the <code>duration_dephase</code>.</p><p>Also see <a href="#MRIBuilder.Variables.variables.duration_transverse"><code>variables.duration_transverse</code></a> for T2-weighting.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L106-L113">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_state" href="#MRIBuilder.Variables.variables.duration_state"><code>MRIBuilder.Variables.variables.duration_state</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_state(pathway::Pathway, transverse::Bool, positive::Bool)</code></pre><p>Returns how long the <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in a specific state.</p><p>The requested state can be set using <code>transverse</code> and <code>positive</code> as follows:</p><ul><li><code>transverse=false</code>, <code>positive=true</code>: +longitudinal</li><li><code>transverse=true</code>, <code>positive=true</code>: +transverse</li><li><code>transverse=false</code>, <code>positive=false</code>: -longitudinal</li><li><code>transverse=true</code>, <code>positive=false</code>: -transverse</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L77-L87">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_transverse" href="#MRIBuilder.Variables.variables.duration_transverse"><code>MRIBuilder.Variables.variables.duration_transverse</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_transverse(pathway::Pathway)</code></pre><p>Returns the total amount of time that spins following the given <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in the transverse plane. This determines the amount of T2-weighting as <span>$e^{t/T_2}$</span>, where <span>$t$</span> is the <code>duration_transverse</code>.</p><p>Also see <a href="#MRIBuilder.Variables.variables.duration_dephase"><code>variables.duration_dephase</code></a> for T2'-weighting.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L93-L100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.net_dephasing" href="#MRIBuilder.Variables.variables.net_dephasing"><code>MRIBuilder.Variables.variables.net_dephasing</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">net_dephasing(pathway::Pathway)</code></pre><p>Return net displacement vector in k-space/q-space experienced by the spins following a specific <a href="#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in kHz/um.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>qvec</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L118-L126">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../implemented_sequences/">« Implemented sequences</a><a class="docs-footer-nextpage" href="../adjust_sequences/">Post-hoc adjustments »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 15:04">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> diff --git a/dev/dwi_1_80_min_2_15.png b/dev/dwi_1_80_min_2_15.png index 9dea1720d4ca87e450bc746491973dec8a59c059..ae655dc3fb5a8f1a33f57c884d040655bdc591fb 100644 GIT binary patch literal 29811 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 UvF~qD6nz@gZD)O+s$8<|KU}`=yZ`_I literal 29805 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 diff --git a/dev/dwi_1_80_min_2_15_epi.png b/dev/dwi_1_80_min_2_15_epi.png index 5dcae52e82a0eef6645917f79efbf181854130e8..444490f59ab70122ea23b3357f76f89b3dde7919 100644 GIT binary patch literal 39114 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 literal 39153 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 ASpWb4 diff --git a/dev/implemented_sequences/index.html b/dev/implemented_sequences/index.html index d963a82..88e78ca 100644 --- a/dev/implemented_sequences/index.html +++ b/dev/implemented_sequences/index.html @@ -10,4 +10,4 @@ f = plot(sequence) f</code></pre><p><img src="../dwi_1_80_min_2_15.png" alt="DWI sequence diagram with fixed diffusion time and rise time"/></p><p>Note that the previous sequences do not contain a realistic readout. Most sequences will only include an instant readout, unless you directly set the <a href="../api/#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a> and <a href="../api/#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>.</p><pre><code class="language-julia hljs">sequence = DiffusionSpinEcho(bval=1., TE=:min, voxel_size=2, resolution=(20, 20, 20)) f = plot(sequence) f</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">┌ Warning: The relaxation is only almost solved. -â”” @ Juniper ~/.julia/packages/Juniper/HBPrQ/src/model.jl:110</code></pre><p><img src="../dwi_1_80_min_2_15_epi.png" alt="DWI sequence diagram with EPI readout"/></p><h2 id="Available-sequences"><a class="docs-heading-anchor" href="#Available-sequences">Available sequences</a><a id="Available-sequences-1"></a><a class="docs-heading-anchor-permalink" href="#Available-sequences" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Sequences.GradientEchoes.GradientEcho-Tuple{}" href="#MRIBuilder.Sequences.GradientEchoes.GradientEcho-Tuple{}"><code>MRIBuilder.Sequences.GradientEchoes.GradientEcho</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">GradientEcho(; echo_time, excitation=(), readout=(), optim=() resolution/fov/voxel_size/slice_thickness, scanner)</code></pre><p>Defines a gradient echo sequence with a single readout event.</p><p>By default, an instant excitation pulse and readout event are used. If image parameters are provided, this will switch to a sinc pulse and EPI readout.</p><p><strong>Parameters</strong></p><ul><li><code>excitation</code>: properties of the excitation pulse as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}"><code>excitation_pulse</code></a>.</li><li><code>readout</code>: properties of the readout as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>readout_event</code></a>.</li><li>Image parameters (<a href="../api/#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>/<a href="../api/#MRIBuilder.Variables.variables.fov"><code>variables.fov</code></a>/<a href="../api/#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a>/<a href="../api/#MRIBuilder.Variables.variables.slice_thickness"><code>variables.slice_thickness</code></a>): describe the properties of the resulting image. See <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.interpret_image_size-NTuple{4, Any}"><code>interpret_image_size</code></a> for details.</li><li><code>optim</code>: parameters to pass on to the Ipopt optimiser (see https://coin-or.github.io/Ipopt/OPTIONS.html).</li><li><code>scanner</code>: Sets the <a href="@ref"><code>Scanner</code></a> used to constraint the gradient parameters. If not set, the <a href="../scanners/#MRIBuilder.Scanners.Default_Scanner"><code>Default_Scanner</code></a> will be used.</li></ul><p><strong>Variables</strong></p><ul><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.TE-sequence_optimisation"><code>variables.TE</code></a>/<a href="#MRIBuilder.Variables.variables.echo_time"><code>variables.echo_time</code></a>: echo time between excitation pulse and readout in ms (required).</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: total duration of the sequence from start of excitation pulse to end of readout in ms.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/gradient_echoes.jl#L11-L29">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Sequences.SpinEchoes.SpinEcho-Tuple{}" href="#MRIBuilder.Sequences.SpinEchoes.SpinEcho-Tuple{}"><code>MRIBuilder.Sequences.SpinEchoes.SpinEcho</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SpinEcho(; echo_time, delay=0., excitation=(), refocus=(), readout=(), optim=(), resolution/fov/voxel_size/slice_thickness, scanner)</code></pre><p>Defines a gradient echo sequence with a single readout event.</p><p>By default, an instant excitation pulse and readout event are used. If image parameters are provided, this will switch to a sinc pulse and EPI readout.</p><p><strong>Parameters</strong></p><ul><li><a href="@ref"><code>excitation</code></a>: properties of the excitation pulse as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}"><code>excitation_pulse</code></a>.</li><li><a href="@ref"><code>refocus</code></a>: properties of the refocus pulse as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.refocus_pulse-Tuple{}"><code>refocus_pulse</code></a>.</li><li><a href="@ref"><code>readout</code></a>: properties of the readout as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>readout_event</code></a>.</li><li>Image parameters (<a href="../api/#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>/<a href="../api/#MRIBuilder.Variables.variables.fov"><code>variables.fov</code></a>/<a href="../api/#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a>/<a href="../api/#MRIBuilder.Variables.variables.slice_thickness"><code>variables.slice_thickness</code></a>): describe the properties of the resulting image. See <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.interpret_image_size-NTuple{4, Any}"><code>interpret_image_size</code></a> for details.</li><li><a href="@ref"><code>optim</code></a>: parameters to pass on to the Ipopt optimiser (see https://coin-or.github.io/Ipopt/OPTIONS.html).</li><li><a href="@ref"><code>scanner</code></a>: Sets the <a href="@ref"><code>Scanner</code></a> used to constraint the gradient parameters. If not set, the <a href="../scanners/#MRIBuilder.Scanners.Default_Scanner"><code>Default_Scanner</code></a> will be used.</li></ul><p><strong>Variables</strong></p><ul><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.TE-sequence_optimisation"><code>variables.TE</code></a>/<a href="#MRIBuilder.Variables.variables.echo_time"><code>variables.echo_time</code></a>: echo time between excitation pulse and spin echo in ms (required).</li><li><a href="#MRIBuilder.Variables.variables.delay"><code>variables.delay</code></a>: delay between the readout and the peak of the spin echo in ms (positive number indicates that readout is after the spin echo). Defaults to zero.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: total duration of the sequence from start of excitation pulse to end of readout or spoiler in ms.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/spin_echoes.jl#L11-L31">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.echo_time" href="#MRIBuilder.Variables.variables.echo_time"><code>MRIBuilder.Variables.variables.echo_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">echo_time(sequence)</code></pre><p>Returns the echo time of a sequence in ms.</p><p>This is typically defined as the time between the excitation pulse and the crossing of k=0 during the MRI readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/spin_echoes.jl#L56-L62">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}" href="#MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}"><code>MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">DiffusionSpinEcho(; echo_time, delay=0., excitation=(), gradient=(), refocus=(), readout=(), optim=(), resolution/fov/voxel_size/slice_thickness, scanner)</code></pre><p>Defines a diffusion-weighted spin echo (Stejskal-Tanner) sequence.</p><p><code>DWI</code>, <code>DW_SE</code>, and <code>DiffusionSpinEcho</code> are all synonyms.</p><p>By default, an instant excitation pulse and readout event are used. If image parameters are provided, this will switch to a sinc pulse and EPI readout.</p><p><strong>Parameters</strong></p><ul><li><code>excitation</code>: properties of the excitation pulse as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}"><code>excitation_pulse</code></a>.</li><li><code>gradient</code>: properties of the diffusion-weighting gradients as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.dwi_gradients-Tuple{}"><code>dwi_gradients</code></a>.</li><li><code>refocus</code>: properties of the refocus pulse as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.refocus_pulse-Tuple{}"><code>refocus_pulse</code></a>.</li><li><code>readout</code>: properties of the readout as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>readout_event</code></a>.</li><li>Image parameters (<a href="../api/#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>/<a href="../api/#MRIBuilder.Variables.variables.fov"><code>variables.fov</code></a>/<a href="../api/#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a>/<a href="../api/#MRIBuilder.Variables.variables.slice_thickness"><code>variables.slice_thickness</code></a>): describe the properties of the resulting image. See <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.interpret_image_size-NTuple{4, Any}"><code>interpret_image_size</code></a> for details.</li><li><code>optim</code>: parameters to pass on to the Ipopt optimiser (see https://coin-or.github.io/Ipopt/OPTIONS.html).</li><li><code>scanner</code>: Sets the <a href="../scanners/#MRIBuilder.Scanners.Scanner"><code>Scanner</code></a> used to constraint the gradient parameters. If not set, the <a href="../scanners/#MRIBuilder.Scanners.Default_Scanner"><code>Default_Scanner</code></a> will be used.</li></ul><p><strong>Variables</strong></p><ul><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.TE-sequence_optimisation"><code>variables.TE</code></a>/<a href="#MRIBuilder.Variables.variables.echo_time"><code>variables.echo_time</code></a>: echo time between excitation pulse and spin echo in ms.</li><li><a href="#MRIBuilder.Variables.variables.delay"><code>variables.delay</code></a>: delay between the readout and the peak of the spin echo in ms (positive number indicates that readout is after the spin echo). Defaults to zero.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: total duration of the sequence from start of excitation pulse to end of readout or spoiler in ms.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.Δ-sequence_optimisation"><code>variables.Δ</code></a>/<a href="#MRIBuilder.Variables.variables.diffusion_time"><code>variables.diffusion_time</code></a>: Time from the start of one diffusion-weighted gradient till the other in ms.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/diffusion_spin_echoes.jl#L15-L39">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.delay" href="#MRIBuilder.Variables.variables.delay"><code>MRIBuilder.Variables.variables.delay</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">delay(sequence)</code></pre><p>Returns the offset beetween the readout and the spin echo in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/diffusion_spin_echoes.jl#L91-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.diffusion_time" href="#MRIBuilder.Variables.variables.diffusion_time"><code>MRIBuilder.Variables.variables.diffusion_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">diffusion_time(diffusion_sequence)</code></pre><p>Returns the diffusion time of a <a href="#MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}"><code>DiffusionSpinEcho</code></a> in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/diffusion_spin_echoes.jl#L84-L88">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../sequence_optimisation/">« Optimisation</a><a class="docs-footer-nextpage" href="../defining_sequence/">Defining sequences »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 14:27">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> +â”” @ Juniper ~/.julia/packages/Juniper/HBPrQ/src/model.jl:110</code></pre><p><img src="../dwi_1_80_min_2_15_epi.png" alt="DWI sequence diagram with EPI readout"/></p><h2 id="Available-sequences"><a class="docs-heading-anchor" href="#Available-sequences">Available sequences</a><a id="Available-sequences-1"></a><a class="docs-heading-anchor-permalink" href="#Available-sequences" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Sequences.GradientEchoes.GradientEcho-Tuple{}" href="#MRIBuilder.Sequences.GradientEchoes.GradientEcho-Tuple{}"><code>MRIBuilder.Sequences.GradientEchoes.GradientEcho</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">GradientEcho(; echo_time, excitation=(), readout=(), optim=() resolution/fov/voxel_size/slice_thickness, scanner)</code></pre><p>Defines a gradient echo sequence with a single readout event.</p><p>By default, an instant excitation pulse and readout event are used. If image parameters are provided, this will switch to a sinc pulse and EPI readout.</p><p><strong>Parameters</strong></p><ul><li><code>excitation</code>: properties of the excitation pulse as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}"><code>excitation_pulse</code></a>.</li><li><code>readout</code>: properties of the readout as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>readout_event</code></a>.</li><li>Image parameters (<a href="../api/#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>/<a href="../api/#MRIBuilder.Variables.variables.fov"><code>variables.fov</code></a>/<a href="../api/#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a>/<a href="../api/#MRIBuilder.Variables.variables.slice_thickness"><code>variables.slice_thickness</code></a>): describe the properties of the resulting image. See <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.interpret_image_size-NTuple{4, Any}"><code>interpret_image_size</code></a> for details.</li><li><code>optim</code>: parameters to pass on to the Ipopt optimiser (see https://coin-or.github.io/Ipopt/OPTIONS.html).</li><li><code>scanner</code>: Sets the <a href="@ref"><code>Scanner</code></a> used to constraint the gradient parameters. If not set, the <a href="../scanners/#MRIBuilder.Scanners.Default_Scanner"><code>Default_Scanner</code></a> will be used.</li></ul><p><strong>Variables</strong></p><ul><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.TE-sequence_optimisation"><code>variables.TE</code></a>/<a href="#MRIBuilder.Variables.variables.echo_time"><code>variables.echo_time</code></a>: echo time between excitation pulse and readout in ms (required).</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: total duration of the sequence from start of excitation pulse to end of readout in ms.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/gradient_echoes.jl#L11-L29">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Sequences.SpinEchoes.SpinEcho-Tuple{}" href="#MRIBuilder.Sequences.SpinEchoes.SpinEcho-Tuple{}"><code>MRIBuilder.Sequences.SpinEchoes.SpinEcho</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">SpinEcho(; echo_time, delay=0., excitation=(), refocus=(), readout=(), optim=(), resolution/fov/voxel_size/slice_thickness, scanner)</code></pre><p>Defines a gradient echo sequence with a single readout event.</p><p>By default, an instant excitation pulse and readout event are used. If image parameters are provided, this will switch to a sinc pulse and EPI readout.</p><p><strong>Parameters</strong></p><ul><li><a href="@ref"><code>excitation</code></a>: properties of the excitation pulse as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}"><code>excitation_pulse</code></a>.</li><li><a href="@ref"><code>refocus</code></a>: properties of the refocus pulse as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.refocus_pulse-Tuple{}"><code>refocus_pulse</code></a>.</li><li><a href="@ref"><code>readout</code></a>: properties of the readout as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>readout_event</code></a>.</li><li>Image parameters (<a href="../api/#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>/<a href="../api/#MRIBuilder.Variables.variables.fov"><code>variables.fov</code></a>/<a href="../api/#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a>/<a href="../api/#MRIBuilder.Variables.variables.slice_thickness"><code>variables.slice_thickness</code></a>): describe the properties of the resulting image. See <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.interpret_image_size-NTuple{4, Any}"><code>interpret_image_size</code></a> for details.</li><li><a href="@ref"><code>optim</code></a>: parameters to pass on to the Ipopt optimiser (see https://coin-or.github.io/Ipopt/OPTIONS.html).</li><li><a href="@ref"><code>scanner</code></a>: Sets the <a href="@ref"><code>Scanner</code></a> used to constraint the gradient parameters. If not set, the <a href="../scanners/#MRIBuilder.Scanners.Default_Scanner"><code>Default_Scanner</code></a> will be used.</li></ul><p><strong>Variables</strong></p><ul><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.TE-sequence_optimisation"><code>variables.TE</code></a>/<a href="#MRIBuilder.Variables.variables.echo_time"><code>variables.echo_time</code></a>: echo time between excitation pulse and spin echo in ms (required).</li><li><a href="#MRIBuilder.Variables.variables.delay"><code>variables.delay</code></a>: delay between the readout and the peak of the spin echo in ms (positive number indicates that readout is after the spin echo). Defaults to zero.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: total duration of the sequence from start of excitation pulse to end of readout or spoiler in ms.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/spin_echoes.jl#L11-L31">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.echo_time" href="#MRIBuilder.Variables.variables.echo_time"><code>MRIBuilder.Variables.variables.echo_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">echo_time(sequence)</code></pre><p>Returns the echo time of a sequence in ms.</p><p>This is typically defined as the time between the excitation pulse and the crossing of k=0 during the MRI readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/spin_echoes.jl#L56-L62">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}" href="#MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}"><code>MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">DiffusionSpinEcho(; echo_time, delay=0., excitation=(), gradient=(), refocus=(), readout=(), optim=(), resolution/fov/voxel_size/slice_thickness, scanner)</code></pre><p>Defines a diffusion-weighted spin echo (Stejskal-Tanner) sequence.</p><p><code>DWI</code>, <code>DW_SE</code>, and <code>DiffusionSpinEcho</code> are all synonyms.</p><p>By default, an instant excitation pulse and readout event are used. If image parameters are provided, this will switch to a sinc pulse and EPI readout.</p><p><strong>Parameters</strong></p><ul><li><code>excitation</code>: properties of the excitation pulse as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.excitation_pulse-Tuple{}"><code>excitation_pulse</code></a>.</li><li><code>gradient</code>: properties of the diffusion-weighting gradients as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.dwi_gradients-Tuple{}"><code>dwi_gradients</code></a>.</li><li><code>refocus</code>: properties of the refocus pulse as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.refocus_pulse-Tuple{}"><code>refocus_pulse</code></a>.</li><li><code>readout</code>: properties of the readout as described in <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.readout_event-Tuple{}"><code>readout_event</code></a>.</li><li>Image parameters (<a href="../api/#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>/<a href="../api/#MRIBuilder.Variables.variables.fov"><code>variables.fov</code></a>/<a href="../api/#MRIBuilder.Variables.variables.voxel_size"><code>variables.voxel_size</code></a>/<a href="../api/#MRIBuilder.Variables.variables.slice_thickness"><code>variables.slice_thickness</code></a>): describe the properties of the resulting image. See <a href="../defining_sequence/#MRIBuilder.Parts.HelperFunctions.interpret_image_size-NTuple{4, Any}"><code>interpret_image_size</code></a> for details.</li><li><code>optim</code>: parameters to pass on to the Ipopt optimiser (see https://coin-or.github.io/Ipopt/OPTIONS.html).</li><li><code>scanner</code>: Sets the <a href="../scanners/#MRIBuilder.Scanners.Scanner"><code>Scanner</code></a> used to constraint the gradient parameters. If not set, the <a href="../scanners/#MRIBuilder.Scanners.Default_Scanner"><code>Default_Scanner</code></a> will be used.</li></ul><p><strong>Variables</strong></p><ul><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.TE-sequence_optimisation"><code>variables.TE</code></a>/<a href="#MRIBuilder.Variables.variables.echo_time"><code>variables.echo_time</code></a>: echo time between excitation pulse and spin echo in ms.</li><li><a href="#MRIBuilder.Variables.variables.delay"><code>variables.delay</code></a>: delay between the readout and the peak of the spin echo in ms (positive number indicates that readout is after the spin echo). Defaults to zero.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>: total duration of the sequence from start of excitation pulse to end of readout or spoiler in ms.</li><li><a href="../sequence_optimisation/#MRIBuilder.Variables.variables.Δ-sequence_optimisation"><code>variables.Δ</code></a>/<a href="#MRIBuilder.Variables.variables.diffusion_time"><code>variables.diffusion_time</code></a>: Time from the start of one diffusion-weighted gradient till the other in ms.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/diffusion_spin_echoes.jl#L15-L39">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.delay" href="#MRIBuilder.Variables.variables.delay"><code>MRIBuilder.Variables.variables.delay</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">delay(sequence)</code></pre><p>Returns the offset beetween the readout and the spin echo in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/diffusion_spin_echoes.jl#L91-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.diffusion_time" href="#MRIBuilder.Variables.variables.diffusion_time"><code>MRIBuilder.Variables.variables.diffusion_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">diffusion_time(diffusion_sequence)</code></pre><p>Returns the diffusion time of a <a href="#MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}"><code>DiffusionSpinEcho</code></a> in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/diffusion_spin_echoes.jl#L84-L88">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../sequence_optimisation/">« Optimisation</a><a class="docs-footer-nextpage" href="../defining_sequence/">Defining sequences »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 15:04">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> diff --git a/dev/index.html b/dev/index.html index 41e07d8..03989f1 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Home · MRIBuilder.jl</title><meta name="title" content="Home · MRIBuilder.jl"/><meta property="og:title" content="Home · MRIBuilder.jl"/><meta property="twitter:title" content="Home · MRIBuilder.jl"/><meta name="description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="twitter:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/"/><meta property="twitter:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/"/><link rel="canonical" href="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/"/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href>MRIBuilder.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li class="is-active"><a class="tocitem" href>Home</a><ul class="internal"><li><a class="tocitem" href="#Installation"><span>Installation</span></a></li></ul></li><li><a class="tocitem" href="sequence_optimisation/">Optimisation</a></li><li><a class="tocitem" href="implemented_sequences/">Implemented sequences</a></li><li><a class="tocitem" href="defining_sequence/">Defining sequences</a></li><li><a class="tocitem" href="adjust_sequences/">Post-hoc adjustments</a></li><li><a class="tocitem" href="scanners/">Scanners</a></li><li><a class="tocitem" href="api/">Internal API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Home</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Home</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl" title="View the repository"><span class="docs-icon fa-brands">ï¡</span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/main/docs/src/index.md" title="Edit source"><span class="docs-icon fa-solid">ï„</span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="MRIBuilder"><a class="docs-heading-anchor" href="#MRIBuilder">MRIBuilder</a><a id="MRIBuilder-1"></a><a class="docs-heading-anchor-permalink" href="#MRIBuilder" title="Permalink"></a></h1><p><a href="https://git.fmrib.ox.ac.uk/ndcn0236/mribuilder.jl">MRIBuilder</a> allows for the creation and optimisation of MRI sequences within <a href="https://julialang.org">Julia</a>.</p><p>Depending on your application, there are several levels at which you can interact with MRIBuilder. The ones lower down require more expertise with Julia and the internals of MRIBuilder:</p><ol><li>Many sequences have already been implemented and can be obtained through a simple function call (see <a href="implemented_sequences/#implemented_sequences">Using implemented sequences</a>).</li><li>New sequences can be created out of pre-defined sequence components and by defining sequence-specific metrics (see <a href="defining_sequence/#defining_sequences">Defining new sequences</a>).</li><li>Finally, one can actually define new sequence components (not documented yet).</li></ol><p>Typically, the resulting sequence will only cover a single repetition time (TR). MRIBuilder enables the concatenation of single-TR sequences into a multi-TR sequence. During these repeats minor adjustments can be made to the single-TR sequence. This can be used to allow different repeats to image different lines in k-space or excite different slices (see <a href="adjust_sequences/#adjust_sequences">Post-hoc adjustment of sequences</a>).</p><p>The signal formation for the resulting sequence can be predicted using <a href="https://open.win.ox.ac.uk/pages/ndcn0236/mcmrsimulator.jl/stable">MCMRSimulator</a> given some representation of the imaged tissue. MRIBuilder can be used to read/write to the <a href="https://pulseq.github.io">pulseq</a> MR sequence file format. This can be used to run the sequence on MRI scanners as described in the <a href="https://pulseq.github.io">pulseq homepage</a>. Rather than just directly running the sequences from this library on the scanner, we strongly recommend to load it using the <a href="https://github.com/pulseq/pulseq">MATLAB pulseq</a> or <a href="https://github.com/imr-framework/pypulseq">python pypulseq</a> first as these libraries run additional checks!</p><h2 id="Installation"><a class="docs-heading-anchor" href="#Installation">Installation</a><a id="Installation-1"></a><a class="docs-heading-anchor-permalink" href="#Installation" title="Permalink"></a></h2><p>It can be run from the command line using the Julia REPL, from a Julia script, or in a <a href="https://jupyter.org">Jupyter notebook</a>. Like any Julia package, Julia can be installed using the built-in <a href="https://pkgdocs.julialang.org/v1/">Julia package manager</a>:</p><pre><code class="nohighlight hljs">pkg> add https://git.fmrib.ox.ac.uk/ndcn0236/mribuilder.jl.git</code></pre></article><nav class="docs-footer"><a class="docs-footer-nextpage" href="sequence_optimisation/">Optimisation »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 14:27">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Home · MRIBuilder.jl</title><meta name="title" content="Home · MRIBuilder.jl"/><meta property="og:title" content="Home · MRIBuilder.jl"/><meta property="twitter:title" content="Home · MRIBuilder.jl"/><meta name="description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="twitter:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/"/><meta property="twitter:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/"/><link rel="canonical" href="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/"/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href>MRIBuilder.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li class="is-active"><a class="tocitem" href>Home</a><ul class="internal"><li><a class="tocitem" href="#Installation"><span>Installation</span></a></li></ul></li><li><a class="tocitem" href="sequence_optimisation/">Optimisation</a></li><li><a class="tocitem" href="implemented_sequences/">Implemented sequences</a></li><li><a class="tocitem" href="defining_sequence/">Defining sequences</a></li><li><a class="tocitem" href="adjust_sequences/">Post-hoc adjustments</a></li><li><a class="tocitem" href="scanners/">Scanners</a></li><li><a class="tocitem" href="api/">Internal API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Home</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Home</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl" title="View the repository"><span class="docs-icon fa-brands">ï¡</span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/main/docs/src/index.md" title="Edit source"><span class="docs-icon fa-solid">ï„</span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="MRIBuilder"><a class="docs-heading-anchor" href="#MRIBuilder">MRIBuilder</a><a id="MRIBuilder-1"></a><a class="docs-heading-anchor-permalink" href="#MRIBuilder" title="Permalink"></a></h1><p><a href="https://git.fmrib.ox.ac.uk/ndcn0236/mribuilder.jl">MRIBuilder</a> allows for the creation and optimisation of MRI sequences within <a href="https://julialang.org">Julia</a>.</p><p>Depending on your application, there are several levels at which you can interact with MRIBuilder. The ones lower down require more expertise with Julia and the internals of MRIBuilder:</p><ol><li>Many sequences have already been implemented and can be obtained through a simple function call (see <a href="implemented_sequences/#implemented_sequences">Using implemented sequences</a>).</li><li>New sequences can be created out of pre-defined sequence components and by defining sequence-specific metrics (see <a href="defining_sequence/#defining_sequences">Defining new sequences</a>).</li><li>Finally, one can actually define new sequence components (not documented yet).</li></ol><p>Typically, the resulting sequence will only cover a single repetition time (TR). MRIBuilder enables the concatenation of single-TR sequences into a multi-TR sequence. During these repeats minor adjustments can be made to the single-TR sequence. This can be used to allow different repeats to image different lines in k-space or excite different slices (see <a href="adjust_sequences/#adjust_sequences">Post-hoc adjustment of sequences</a>).</p><p>The signal formation for the resulting sequence can be predicted using <a href="https://open.win.ox.ac.uk/pages/ndcn0236/mcmrsimulator.jl/stable">MCMRSimulator</a> given some representation of the imaged tissue. MRIBuilder can be used to read/write to the <a href="https://pulseq.github.io">pulseq</a> MR sequence file format. This can be used to run the sequence on MRI scanners as described in the <a href="https://pulseq.github.io">pulseq homepage</a>. Rather than just directly running the sequences from this library on the scanner, we strongly recommend to load it using the <a href="https://github.com/pulseq/pulseq">MATLAB pulseq</a> or <a href="https://github.com/imr-framework/pypulseq">python pypulseq</a> first as these libraries run additional checks!</p><h2 id="Installation"><a class="docs-heading-anchor" href="#Installation">Installation</a><a id="Installation-1"></a><a class="docs-heading-anchor-permalink" href="#Installation" title="Permalink"></a></h2><p>It can be run from the command line using the Julia REPL, from a Julia script, or in a <a href="https://jupyter.org">Jupyter notebook</a>. Like any Julia package, Julia can be installed using the built-in <a href="https://pkgdocs.julialang.org/v1/">Julia package manager</a>:</p><pre><code class="nohighlight hljs">pkg> add https://git.fmrib.ox.ac.uk/ndcn0236/mribuilder.jl.git</code></pre></article><nav class="docs-footer"><a class="docs-footer-nextpage" href="sequence_optimisation/">Optimisation »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 15:04">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/dev/objects.inv b/dev/objects.inv index c7cc8fcab9237048505028a4579ccec814ae50b9..cb6f67421d7f1fcc154e5e65d745a9a21c01ea0c 100644 GIT binary patch delta 12 Tcmdm?xI=M*Go$fFml6R09#RA| delta 12 Tcmdm?xI=M*Go#T)ml6R09!&%? diff --git a/dev/scanners/index.html b/dev/scanners/index.html index 76badec..74eda5f 100644 --- a/dev/scanners/index.html +++ b/dev/scanners/index.html @@ -1,3 +1,3 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Scanners · MRIBuilder.jl</title><meta name="title" content="Scanners · MRIBuilder.jl"/><meta property="og:title" content="Scanners · MRIBuilder.jl"/><meta property="twitter:title" content="Scanners · MRIBuilder.jl"/><meta name="description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="twitter:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/scanners/"/><meta property="twitter:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/scanners/"/><link rel="canonical" href="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/scanners/"/><script data-outdated-warner src="../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../search_index.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href="../">MRIBuilder.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../sequence_optimisation/">Optimisation</a></li><li><a class="tocitem" href="../implemented_sequences/">Implemented sequences</a></li><li><a class="tocitem" href="../defining_sequence/">Defining sequences</a></li><li><a class="tocitem" href="../adjust_sequences/">Post-hoc adjustments</a></li><li class="is-active"><a class="tocitem" href>Scanners</a><ul class="internal"><li><a class="tocitem" href="#Scanners-API"><span>Scanners API</span></a></li></ul></li><li><a class="tocitem" href="../api/">Internal API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Scanners</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Scanners</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl" title="View the repository"><span class="docs-icon fa-brands">ï¡</span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/main/docs/src/scanners.md" title="Edit source"><span class="docs-icon fa-solid">ï„</span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="scanners"><a class="docs-heading-anchor" href="#scanners">Scanners</a><a id="scanners-1"></a><a class="docs-heading-anchor-permalink" href="#scanners" title="Permalink"></a></h1><p>The MRI scanner that is used during acquisition puts various constraints on the MR sequences that can be used. These constraints include safety considerations, such as tissue heating, and hardware constraints, such as maximum gradient strength and slew rate. Currently, MRIBuilder only considers the latter.</p><p>To define a sequence appropriate for a specific scanner, a user would define a new <a href="#MRIBuilder.Scanners.Scanner"><code>Scanner</code></a> with the appropriate <a href="#MRIBuilder.Scanners.B0-Tuple{Scanner}"><code>B0</code></a>, maximum <a href="../api/#MRIBuilder.Variables.variables.gradient_strength"><code>variables.gradient_strength</code></a>, and maximum <a href="../api/#MRIBuilder.Variables.variables.slew_rate"><code>variables.slew_rate</code></a>. This scanner would then be passed on to the <a href="../sequence_optimisation/#sequence_optimisation">sequence optimisation</a>.</p><p>For ease of use, the <code>gradient_strength</code> and <code>slew_rate</code> of many scanners have already been pre-defined. These are listed below.</p><h2 id="Scanners-API"><a class="docs-heading-anchor" href="#Scanners-API">Scanners API</a><a id="Scanners-API-1"></a><a class="docs-heading-anchor-permalink" href="#Scanners-API" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners" href="#MRIBuilder.Scanners"><code>MRIBuilder.Scanners</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Define general <a href="#MRIBuilder.Scanners.Scanner"><code>Scanner</code></a> type and methods as well as some concrete scanners.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/scanners.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Default_Scanner" href="#MRIBuilder.Scanners.Default_Scanner"><code>MRIBuilder.Scanners.Default_Scanner</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>A default 1.5T scanner.</p><p>Matches the one used in <code>pulseq</code> (https://github.com/pulseq/pulseq/blob/master/matlab/%2Bmr/opts.m).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/scanners.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Siemens_Connectom" href="#MRIBuilder.Scanners.Siemens_Connectom"><code>MRIBuilder.Scanners.Siemens_Connectom</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Siemens 3T Connectom MRI scanner (<a href="@cite">fan22_MappingHumanConnectome</a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/scanners.jl#L83-L85">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Siemens_Connectom_v2" href="#MRIBuilder.Scanners.Siemens_Connectom_v2"><code>MRIBuilder.Scanners.Siemens_Connectom_v2</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Siemens 3T Connectom 2.0 MRI scanner (<a href="@cite">huang21_ConnectomeDevelopingnextgeneration</a>)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/scanners.jl#L88-L90">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Siemens_Prisma" href="#MRIBuilder.Scanners.Siemens_Prisma"><code>MRIBuilder.Scanners.Siemens_Prisma</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Siemens MAGNETOM 3T Prisma MRI scanner (https://www.siemens-healthineers.com/en-uk/magnetic-resonance-imaging/3t-mri-scanner/magnetom-prisma).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/scanners.jl#L73-L75">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Siemens_Terra" href="#MRIBuilder.Scanners.Siemens_Terra"><code>MRIBuilder.Scanners.Siemens_Terra</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Siemens MAGNETOM 7T Terra MRI scanner (https://www.siemens-healthineers.com/en-uk/magnetic-resonance-imaging/7t-mri-scanner/magnetom-terra)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/scanners.jl#L78-L80">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Scanner" href="#MRIBuilder.Scanners.Scanner"><code>MRIBuilder.Scanners.Scanner</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">Scanner(;B0=3., gradient=Inf, slew_rate=Inf, units=:kHz)</code></pre><p>Properties of an MRI scanner relevant for the MR signal simulations.</p><ul><li><a href="#MRIBuilder.Scanners.B0-Tuple{Scanner}"><code>B0</code></a>: magnetic field strength (in Tesla)</li><li><a href="#MRIBuilder.Scanners.gradient_strength"><code>gradient_strength</code></a>: maximum gradient strength long each axis.</li><li><a href="#MRIBuilder.Scanners.slew_rate"><code>slew_rate</code></a>: maximum rate of change in the gradient strength</li></ul><p>By default <code>gradient</code> and <code>slew_rate</code> are expected to be provided in units of, respectively, kHz/um and kHz/um/ms. However, if the keyword <code>units=:Tesla</code> is set, the <code>gradient</code> and <code>slew_rate</code> should be provided in units of, respectively, mT/m and T/m/s.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/scanners.jl#L8-L18">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.B0-Tuple{Scanner}" href="#MRIBuilder.Scanners.B0-Tuple{Scanner}"><code>MRIBuilder.Scanners.B0</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">B0(scanner) -B0(sequence)</code></pre><p>Returns the magnetic field strength of the scanner in Tesla.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/scanners.jl#L41-L46">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.gradient_strength" href="#MRIBuilder.Scanners.gradient_strength"><code>MRIBuilder.Scanners.gradient_strength</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_strength(scanner[, units])</code></pre><p>Returns the maximum magnetic field gradient of the scanner in kHz/um. By setting <code>units</code> to :Tesla, the gradient strength can be returned in mT/m instead.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/scanners.jl#L49-L54">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.slew_rate" href="#MRIBuilder.Scanners.slew_rate"><code>MRIBuilder.Scanners.slew_rate</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slew_rate(scanner[, units])</code></pre><p>Returns the maximum magnetic field slew rate of the scanner in kHz/um/ms. By setting <code>units</code> to :Tesla, the slew rate can be returned in T/m/s instead.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/scanners.jl#L57-L62">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../adjust_sequences/">« Post-hoc adjustments</a><a class="docs-footer-nextpage" href="../api/">Internal API »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 14:27">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Scanners · MRIBuilder.jl</title><meta name="title" content="Scanners · MRIBuilder.jl"/><meta property="og:title" content="Scanners · MRIBuilder.jl"/><meta property="twitter:title" content="Scanners · MRIBuilder.jl"/><meta name="description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="twitter:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/scanners/"/><meta property="twitter:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/scanners/"/><link rel="canonical" href="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/scanners/"/><script data-outdated-warner src="../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../search_index.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href="../">MRIBuilder.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../sequence_optimisation/">Optimisation</a></li><li><a class="tocitem" href="../implemented_sequences/">Implemented sequences</a></li><li><a class="tocitem" href="../defining_sequence/">Defining sequences</a></li><li><a class="tocitem" href="../adjust_sequences/">Post-hoc adjustments</a></li><li class="is-active"><a class="tocitem" href>Scanners</a><ul class="internal"><li><a class="tocitem" href="#Scanners-API"><span>Scanners API</span></a></li></ul></li><li><a class="tocitem" href="../api/">Internal API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Scanners</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Scanners</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl" title="View the repository"><span class="docs-icon fa-brands">ï¡</span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/main/docs/src/scanners.md" title="Edit source"><span class="docs-icon fa-solid">ï„</span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="scanners"><a class="docs-heading-anchor" href="#scanners">Scanners</a><a id="scanners-1"></a><a class="docs-heading-anchor-permalink" href="#scanners" title="Permalink"></a></h1><p>The MRI scanner that is used during acquisition puts various constraints on the MR sequences that can be used. These constraints include safety considerations, such as tissue heating, and hardware constraints, such as maximum gradient strength and slew rate. Currently, MRIBuilder only considers the latter.</p><p>To define a sequence appropriate for a specific scanner, a user would define a new <a href="#MRIBuilder.Scanners.Scanner"><code>Scanner</code></a> with the appropriate <a href="#MRIBuilder.Scanners.B0-Tuple{Scanner}"><code>B0</code></a>, maximum <a href="../api/#MRIBuilder.Variables.variables.gradient_strength"><code>variables.gradient_strength</code></a>, and maximum <a href="../api/#MRIBuilder.Variables.variables.slew_rate"><code>variables.slew_rate</code></a>. This scanner would then be passed on to the <a href="../sequence_optimisation/#sequence_optimisation">sequence optimisation</a>.</p><p>For ease of use, the <code>gradient_strength</code> and <code>slew_rate</code> of many scanners have already been pre-defined. These are listed below.</p><h2 id="Scanners-API"><a class="docs-heading-anchor" href="#Scanners-API">Scanners API</a><a id="Scanners-API-1"></a><a class="docs-heading-anchor-permalink" href="#Scanners-API" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners" href="#MRIBuilder.Scanners"><code>MRIBuilder.Scanners</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Define general <a href="#MRIBuilder.Scanners.Scanner"><code>Scanner</code></a> type and methods as well as some concrete scanners.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/scanners.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Default_Scanner" href="#MRIBuilder.Scanners.Default_Scanner"><code>MRIBuilder.Scanners.Default_Scanner</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>A default 1.5T scanner.</p><p>Matches the one used in <code>pulseq</code> (https://github.com/pulseq/pulseq/blob/master/matlab/%2Bmr/opts.m).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/scanners.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Siemens_Connectom" href="#MRIBuilder.Scanners.Siemens_Connectom"><code>MRIBuilder.Scanners.Siemens_Connectom</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Siemens 3T Connectom MRI scanner (<a href="@cite">fan22_MappingHumanConnectome</a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/scanners.jl#L83-L85">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Siemens_Connectom_v2" href="#MRIBuilder.Scanners.Siemens_Connectom_v2"><code>MRIBuilder.Scanners.Siemens_Connectom_v2</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Siemens 3T Connectom 2.0 MRI scanner (<a href="@cite">huang21_ConnectomeDevelopingnextgeneration</a>)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/scanners.jl#L88-L90">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Siemens_Prisma" href="#MRIBuilder.Scanners.Siemens_Prisma"><code>MRIBuilder.Scanners.Siemens_Prisma</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Siemens MAGNETOM 3T Prisma MRI scanner (https://www.siemens-healthineers.com/en-uk/magnetic-resonance-imaging/3t-mri-scanner/magnetom-prisma).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/scanners.jl#L73-L75">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Siemens_Terra" href="#MRIBuilder.Scanners.Siemens_Terra"><code>MRIBuilder.Scanners.Siemens_Terra</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Siemens MAGNETOM 7T Terra MRI scanner (https://www.siemens-healthineers.com/en-uk/magnetic-resonance-imaging/7t-mri-scanner/magnetom-terra)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/scanners.jl#L78-L80">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.Scanner" href="#MRIBuilder.Scanners.Scanner"><code>MRIBuilder.Scanners.Scanner</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">Scanner(;B0=3., gradient=Inf, slew_rate=Inf, units=:kHz)</code></pre><p>Properties of an MRI scanner relevant for the MR signal simulations.</p><ul><li><a href="#MRIBuilder.Scanners.B0-Tuple{Scanner}"><code>B0</code></a>: magnetic field strength (in Tesla)</li><li><a href="#MRIBuilder.Scanners.gradient_strength"><code>gradient_strength</code></a>: maximum gradient strength long each axis.</li><li><a href="#MRIBuilder.Scanners.slew_rate"><code>slew_rate</code></a>: maximum rate of change in the gradient strength</li></ul><p>By default <code>gradient</code> and <code>slew_rate</code> are expected to be provided in units of, respectively, kHz/um and kHz/um/ms. However, if the keyword <code>units=:Tesla</code> is set, the <code>gradient</code> and <code>slew_rate</code> should be provided in units of, respectively, mT/m and T/m/s.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/scanners.jl#L8-L18">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.B0-Tuple{Scanner}" href="#MRIBuilder.Scanners.B0-Tuple{Scanner}"><code>MRIBuilder.Scanners.B0</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">B0(scanner) +B0(sequence)</code></pre><p>Returns the magnetic field strength of the scanner in Tesla.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/scanners.jl#L41-L46">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.gradient_strength" href="#MRIBuilder.Scanners.gradient_strength"><code>MRIBuilder.Scanners.gradient_strength</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_strength(scanner[, units])</code></pre><p>Returns the maximum magnetic field gradient of the scanner in kHz/um. By setting <code>units</code> to :Tesla, the gradient strength can be returned in mT/m instead.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/scanners.jl#L49-L54">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Scanners.slew_rate" href="#MRIBuilder.Scanners.slew_rate"><code>MRIBuilder.Scanners.slew_rate</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slew_rate(scanner[, units])</code></pre><p>Returns the maximum magnetic field slew rate of the scanner in kHz/um/ms. By setting <code>units</code> to :Tesla, the slew rate can be returned in T/m/s instead.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/scanners.jl#L57-L62">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../adjust_sequences/">« Post-hoc adjustments</a><a class="docs-footer-nextpage" href="../api/">Internal API »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 15:04">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> diff --git a/dev/sequence_optimisation/index.html b/dev/sequence_optimisation/index.html index f46a64a..38d5e3e 100644 --- a/dev/sequence_optimisation/index.html +++ b/dev/sequence_optimisation/index.html @@ -1,9 +1,9 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Optimisation · MRIBuilder.jl</title><meta name="title" content="Optimisation · MRIBuilder.jl"/><meta property="og:title" content="Optimisation · MRIBuilder.jl"/><meta property="twitter:title" content="Optimisation · MRIBuilder.jl"/><meta name="description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="twitter:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/sequence_optimisation/"/><meta property="twitter:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/sequence_optimisation/"/><link rel="canonical" href="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/sequence_optimisation/"/><script data-outdated-warner src="../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../search_index.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href="../">MRIBuilder.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li class="is-active"><a class="tocitem" href>Optimisation</a><ul class="internal"><li><a class="tocitem" href="#variables"><span>Summary variables</span></a></li><li><a class="tocitem" href="#Variables-interface"><span>Variables interface</span></a></li></ul></li><li><a class="tocitem" href="../implemented_sequences/">Implemented sequences</a></li><li><a class="tocitem" href="../defining_sequence/">Defining sequences</a></li><li><a class="tocitem" href="../adjust_sequences/">Post-hoc adjustments</a></li><li><a class="tocitem" href="../scanners/">Scanners</a></li><li><a class="tocitem" href="../api/">Internal API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Optimisation</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Optimisation</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl" title="View the repository"><span class="docs-icon fa-brands">ï¡</span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/main/docs/src/sequence_optimisation.md" title="Edit source"><span class="docs-icon fa-solid">ï„</span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="sequence_optimisation"><a class="docs-heading-anchor" href="#sequence_optimisation">Sequence optimisation</a><a id="sequence_optimisation-1"></a><a class="docs-heading-anchor-permalink" href="#sequence_optimisation" title="Permalink"></a></h1><p>In MRIBuilder an MR <a href="../api/#MRIBuilder.Containers.BaseSequences.Sequence"><code>Sequence</code></a> is defined as a sequence of <a href="../api/#MRIBuilder.Containers.BuildingBlocks.BuildingBlock"><code>BuildingBlock</code></a> objects. Most <code>BuildingBlock</code> objects will contain free parameters determining, for example, the duration of the block or the strength/orientation of the MR gradient. In most MR sequence building software, the user will have to set all of these free parameters by computing the appropriate values given a desired echo time, b-value, etc.</p><p>In MRIBuilder the internal free parameters are not set directly. Instead, they are inferred using a non-linear, constrained optimisation. For each sequence type, the developer defines how to compute various summary variables from the <code>BuildingBlock</code> free parameters, such as <a href="../implemented_sequences/#MRIBuilder.Variables.variables.echo_time"><code>variables.echo_time</code></a>, <a href="#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>, <a href="../api/#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>, <a href="../api/#MRIBuilder.Variables.variables.gradient_strength"><code>variables.gradient_strength</code></a>, <a href="../implemented_sequences/#MRIBuilder.Variables.variables.diffusion_time"><code>variables.diffusion_time</code></a>, <a href="../defining_sequence/#MRIBuilder.Variables.variables.duration_transverse"><code>variables.duration_transverse</code></a> etc. A user can then create a specific instantiation of the sequence by fixing any of these summary variables to their desired values (or setting them to <code>:min</code>/<code>:max</code> to minimise/maximise them). In addition to the user-defined constraints, this optimisation will also take into account any <a href="../scanners/#scanners">scanner-defined constraints</a>. Internally, MRIBuilder will then optimise the <code>BuildingBlock</code> free parameters to match any user-defined constraints and/or objectives. This optimisation uses the <a href="https://github.com/coin-or/Ipopt">Ipopt</a> optimiser accessed through the <a href="https://jump.dev/JuMP.jl/stable/">JuMP.jl</a> library.</p><p>In addition to any user-defined objectives, the developer might also have defined secondary objectives (e.g., minimise the total sequence duration). These objective functions will only be considered if they do not affect the result of the user-defined primary objective. More details on these developer-defined secondary objectives can be found in the section on <a href="../defining_sequence/#defining_sequences">defining new sequences</a></p><h2 id="variables"><a class="docs-heading-anchor" href="#variables">Summary variables</a><a id="variables-1"></a><a class="docs-heading-anchor-permalink" href="#variables" title="Permalink"></a></h2><p>All variables are available as members of the <a href="#variables"><code>variables</code></a> structure.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables" href="#MRIBuilder.Variables.variables"><code>MRIBuilder.Variables.variables</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Main module containing all the MRIBuilder sequence variables.</p><p>All variables are available as members of this module, e.g. <code>variables.echo_time</code> returns the echo time variable. New variables can be defined using <code>@defvar</code>.</p><p>Set constraints on variables by passing them on as keywords during the sequence generation, e.g., <code>seq=SpinEcho(echo_time=70)</code>.</p><p>After sequence generation you can get the variable values by calling <code>variables.echo_time(seq)</code>. For the sequence defined above this would return 70. (or a number very close to that).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L127-L140">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.N_left-sequence_optimisation" href="#MRIBuilder.Variables.variables.N_left-sequence_optimisation"><code>MRIBuilder.Variables.variables.N_left</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">N_left(sinc_pulse)</code></pre><p>Number of zero-crossings of the <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> before the maximum.</p><p>Also, see <a href="../api/#MRIBuilder.Variables.variables.N_right"><code>variables.N_right</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/sinc_pulses.jl#L89-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.N_right-sequence_optimisation" href="#MRIBuilder.Variables.variables.N_right-sequence_optimisation"><code>MRIBuilder.Variables.variables.N_right</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">N_left(sinc_pulse)</code></pre><p>Number of zero-crossings of the <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> after the maximum.</p><p>Also, see <a href="../api/#MRIBuilder.Variables.variables.N_left"><code>variables.N_left</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/sinc_pulses.jl#L98-L104">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.TE-sequence_optimisation" href="#MRIBuilder.Variables.variables.TE-sequence_optimisation"><code>MRIBuilder.Variables.variables.TE</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">echo_time(sequence)</code></pre><p>Returns the echo time of a sequence in ms.</p><p>This is typically defined as the time between the excitation pulse and the crossing of k=0 during the MRI readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/spin_echoes.jl#L56-L62">source</a></section><section><div><pre><code class="language-julia hljs">echo_time(sequence)</code></pre><p>Computes the echo time(s) of a sequence in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L513-L517">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.TR-sequence_optimisation" href="#MRIBuilder.Variables.variables.TR-sequence_optimisation"><code>MRIBuilder.Variables.variables.TR</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">repetition_time(sequence)</code></pre><p>Computes the repetition_times of a sequence in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L520-L524">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.all_gradient_strengths-sequence_optimisation" href="#MRIBuilder.Variables.variables.all_gradient_strengths-sequence_optimisation"><code>MRIBuilder.Variables.variables.all_gradient_strengths</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">all_gradient_strengths(spoilt_slice_select)</code></pre><p>Returns the gradient strength before, during, and after the pulse in <a href="../api/#MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect"><code>SpoiltSliceSelect</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/spoilt_slice_selects.jl#L127-L131">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.amplitude-sequence_optimisation" href="#MRIBuilder.Variables.variables.amplitude-sequence_optimisation"><code>MRIBuilder.Variables.variables.amplitude</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">amplitude(pulse)</code></pre><p>Return the amplitude of an <a href="../api/#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L65-L69">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.area_under_curve-sequence_optimisation" href="#MRIBuilder.Variables.variables.area_under_curve-sequence_optimisation"><code>MRIBuilder.Variables.variables.area_under_curve</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">area_under_curve(pathway::Pathway)</code></pre><p>Return net displacement in k-space (i.e., spoiling) experienced by the spins following a specific <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a>.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>area_under_curve</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L131-L139">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bandwidth-sequence_optimisation" href="#MRIBuilder.Variables.variables.bandwidth-sequence_optimisation"><code>MRIBuilder.Variables.variables.bandwidth</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bandwidth(pulse)</code></pre><p>Return the bandwidth of an <a href="../api/#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L86-L90">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bmat-sequence_optimisation" href="#MRIBuilder.Variables.variables.bmat-sequence_optimisation"><code>MRIBuilder.Variables.variables.bmat</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bmat(pathway::Pathway)</code></pre><p>Return 3x3 diffusion-weighted matrix experienced by the spins following a specific <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in rad^2 ms/um^2.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>bmat</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L144-L152">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bmat_gradient-sequence_optimisation" href="#MRIBuilder.Variables.variables.bmat_gradient-sequence_optimisation"><code>MRIBuilder.Variables.variables.bmat_gradient</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bmat_gradient(overlapping, qstart[, first_event, last_event])</code></pre><p>Computes the addition to the <a href="../defining_sequence/#MRIBuilder.Variables.variables.bmat"><code>variables.bmat</code></a> contributed by a specific building block or gradient.</p><p><code>qstart</code> represents the <a href="../api/#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a> at the start of this component.</p><p>If <code>first_event</code> is set to something else than <code>nothing</code>, only the gradient waveform after this RF pulse/Readout will be considered. Similarly, if <code>last_event</code> is set to something else than <code>nothing</code>, only the gradient waveform up to this RF pulse/Readout will be considered.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L243-L252">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bval-sequence_optimisation" href="#MRIBuilder.Variables.variables.bval-sequence_optimisation"><code>MRIBuilder.Variables.variables.bval</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bval(pathway::Pathway)</code></pre><p>Return size of diffusion-weighting experienced by the spins following a specific <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in rad^2 ms/um^2.</p><p>Only gradients active while the spins are in the transverse plane will contribute to the diffusion weighting.</p><p>Returns a NamedTuple with the <code>bval</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L156-L164">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.delay-sequence_optimisation" href="#MRIBuilder.Variables.variables.delay-sequence_optimisation"><code>MRIBuilder.Variables.variables.delay</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">delay(sequence)</code></pre><p>Returns the offset beetween the readout and the spin echo in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/diffusion_spin_echoes.jl#L91-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.diffusion_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.diffusion_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.diffusion_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">diffusion_time(diffusion_sequence)</code></pre><p>Returns the diffusion time of a <a href="../implemented_sequences/#MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}"><code>DiffusionSpinEcho</code></a> in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/diffusion_spin_echoes.jl#L84-L88">source</a></section><section><div><pre><code class="language-julia hljs">diffusion_time(sequence)</code></pre><p>Computes the diffusion time of a sequence in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L527-L531">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration-sequence_optimisation" href="#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>MRIBuilder.Variables.variables.duration</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration(block)</code></pre><p>Duration of the sequence or building block in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L377-L381">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_dephase-sequence_optimisation" href="#MRIBuilder.Variables.variables.duration_dephase-sequence_optimisation"><code>MRIBuilder.Variables.variables.duration_dephase</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_dephase(pathway::Pathway)</code></pre><p>Returns the net time that spins following the given <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in the +transverse versus the -transverse state. This determines the amount of T2'-weighting as <span>$e^{t/T_2'}$</span>, where <span>$t$</span> is the <code>duration_dephase</code>.</p><p>Also see <a href="../defining_sequence/#MRIBuilder.Variables.variables.duration_transverse"><code>variables.duration_transverse</code></a> for T2-weighting.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L106-L113">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_state-sequence_optimisation" href="#MRIBuilder.Variables.variables.duration_state-sequence_optimisation"><code>MRIBuilder.Variables.variables.duration_state</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_state(pathway::Pathway, transverse::Bool, positive::Bool)</code></pre><p>Returns how long the <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in a specific state.</p><p>The requested state can be set using <code>transverse</code> and <code>positive</code> as follows:</p><ul><li><code>transverse=false</code>, <code>positive=true</code>: +longitudinal</li><li><code>transverse=true</code>, <code>positive=true</code>: +transverse</li><li><code>transverse=false</code>, <code>positive=false</code>: -longitudinal</li><li><code>transverse=true</code>, <code>positive=false</code>: -transverse</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L77-L87">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_transverse-sequence_optimisation" href="#MRIBuilder.Variables.variables.duration_transverse-sequence_optimisation"><code>MRIBuilder.Variables.variables.duration_transverse</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_transverse(pathway::Pathway)</code></pre><p>Returns the total amount of time that spins following the given <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in the transverse plane. This determines the amount of T2-weighting as <span>$e^{t/T_2}$</span>, where <span>$t$</span> is the <code>duration_transverse</code>.</p><p>Also see <a href="../defining_sequence/#MRIBuilder.Variables.variables.duration_dephase"><code>variables.duration_dephase</code></a> for T2'-weighting.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L93-L100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.dwell_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.dwell_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.dwell_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">dwell_time(adc)</code></pre><p>The dwell time of the ADC readout in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.echo_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.echo_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.echo_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">echo_time(sequence)</code></pre><p>Returns the echo time of a sequence in ms.</p><p>This is typically defined as the time between the excitation pulse and the crossing of k=0 during the MRI readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/spin_echoes.jl#L56-L62">source</a></section><section><div><pre><code class="language-julia hljs">echo_time(sequence)</code></pre><p>Computes the echo time(s) of a sequence in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L513-L517">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.effective_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.effective_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.effective_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">effective_time(container, indices...)</code></pre><p>Returns the start time of component with given <code>indices</code> with respect to the start of the <a href="../api/#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a>.</p><p>This will crash if the component does not have an <a href="../api/#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a> (e.g., if it is (part of) a gradient waveform).</p><p>Also see <a href="#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>, <a href="../api/#MRIBuilder.Containers.Abstract.start_time-Tuple{ContainerBlock, Any, Any, Vararg{Any}}"><code>start_time</code></a>, and <a href="../api/#MRIBuilder.Containers.Abstract.end_time-Tuple{ContainerBlock, Any, Vararg{Any}}"><code>end_time</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L41-L49">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.flat_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.flat_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.flat_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">flat_time(trapezoid)</code></pre><p>Returns the flat time of a <a href="../api/#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L124-L128">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.flip_angle-sequence_optimisation" href="#MRIBuilder.Variables.variables.flip_angle-sequence_optimisation"><code>MRIBuilder.Variables.variables.flip_angle</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">flip_angle(pulse)</code></pre><p>Return the flip angle of an <a href="../api/#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in degrees.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L79-L83">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.fov-sequence_optimisation" href="#MRIBuilder.Variables.variables.fov-sequence_optimisation"><code>MRIBuilder.Variables.variables.fov</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">fov(readout)</code></pre><p>Defines the field of view of a readout in mm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L288-L292">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.frequency-sequence_optimisation" href="#MRIBuilder.Variables.variables.frequency-sequence_optimisation"><code>MRIBuilder.Variables.variables.frequency</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">frequency(pulse)</code></pre><p>Return the off-resonance frequency of an <a href="../api/#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L72-L76">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.gradient_strength-sequence_optimisation" href="#MRIBuilder.Variables.variables.gradient_strength-sequence_optimisation"><code>MRIBuilder.Variables.variables.gradient_strength</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_strength(gradient)</code></pre><p>Maximum 3D gradient strength of the gradient in kHz/um.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.gradient_strength_norm-sequence_optimisation" href="#MRIBuilder.Variables.variables.gradient_strength_norm-sequence_optimisation"><code>MRIBuilder.Variables.variables.gradient_strength_norm</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_strength_norm(gradient)</code></pre><p>The norm of the <a href="../api/#MRIBuilder.Variables.variables.gradient_strength"><code>variables.gradient_strength</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L479-L483">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.lobe_duration-sequence_optimisation" href="#MRIBuilder.Variables.variables.lobe_duration-sequence_optimisation"><code>MRIBuilder.Variables.variables.lobe_duration</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">lobe_duration(sinc_pulse)</code></pre><p>Time between two zero-crossings of a <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/pulses/sinc_pulses.jl#L113-L117">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.net_dephasing-sequence_optimisation" href="#MRIBuilder.Variables.variables.net_dephasing-sequence_optimisation"><code>MRIBuilder.Variables.variables.net_dephasing</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">net_dephasing(pathway::Pathway)</code></pre><p>Return net displacement vector in k-space/q-space experienced by the spins following a specific <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in kHz/um.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>qvec</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/pathways.jl#L118-L126">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.nsamples-sequence_optimisation" href="#MRIBuilder.Variables.variables.nsamples-sequence_optimisation"><code>MRIBuilder.Variables.variables.nsamples</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">nsamples(adc)</code></pre><p>Number of samples in an ADC.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L89-L93">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.oversample-sequence_optimisation" href="#MRIBuilder.Variables.variables.oversample-sequence_optimisation"><code>MRIBuilder.Variables.variables.oversample</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">oversample(adc)</code></pre><p>The oversampling rate of the ADC readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L59-L63">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.phase-sequence_optimisation" href="#MRIBuilder.Variables.variables.phase-sequence_optimisation"><code>MRIBuilder.Variables.variables.phase</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">phase(pulse)</code></pre><p>Return the phase of an <a href="../api/#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in degrees.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L58-L62">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.qval-sequence_optimisation" href="#MRIBuilder.Variables.variables.qval-sequence_optimisation"><code>MRIBuilder.Variables.variables.qval</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">qval(gradient)</code></pre><p>The norm of the <a href="../api/#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L427-L431">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.qvec-sequence_optimisation" href="#MRIBuilder.Variables.variables.qvec-sequence_optimisation"><code>MRIBuilder.Variables.variables.qvec</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">qvec(overlapping[, first_event, last_event])</code></pre><p>Computes the area under the curve for the gradient waveform in <a href="../api/#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a>.</p><p>If <code>first_event</code> is set to something else than <code>nothing</code>, only the gradient waveform after this RF pulse/Readout will be considered. Similarly, if <code>last_event</code> is set to something else than <code>nothing</code>, only the gradient waveform up to this RF pulse/Readout will be considered.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/building_blocks.jl#L233-L240">source</a></section><section><div><pre><code class="language-julia hljs">qvec(gradient)</code></pre><p>The total integral of the area under the gradient curve as a length-3 vector.</p><p>The norm of this vector is available as <a href="#MRIBuilder.Variables.variables.qval-sequence_optimisation"><code>qval</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L452-L458">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.ramp_overlap-sequence_optimisation" href="#MRIBuilder.Variables.variables.ramp_overlap-sequence_optimisation"><code>MRIBuilder.Variables.variables.ramp_overlap</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ramp_overlap(line_readout)</code></pre><p>Return the fraction of the gradient ramp that overlaps with the ADC readout.</p><p>Set to 0 to ensure that the ADC is only active during the flat time of the readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L302-L308">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.readout_times-sequence_optimisation" href="#MRIBuilder.Variables.variables.readout_times-sequence_optimisation"><code>MRIBuilder.Variables.variables.readout_times</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">readout_times(sequence)</code></pre><p>Returns all the times that the sequence will readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/containers/abstract.jl#L146-L150">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.resolution-sequence_optimisation" href="#MRIBuilder.Variables.variables.resolution-sequence_optimisation"><code>MRIBuilder.Variables.variables.resolution</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">resolution(readout)</code></pre><p>Resolution of the readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.rise_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.rise_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.rise_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">rise_time(trapezoid)</code></pre><p>Returns the rise time of a <a href="../api/#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L117-L121">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.slew_rate-sequence_optimisation" href="#MRIBuilder.Variables.variables.slew_rate-sequence_optimisation"><code>MRIBuilder.Variables.variables.slew_rate</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slew_rate(gradient)</code></pre><p>Maximum 3D slew rate of the gradient in kHz/um/ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/abstract_types.jl#L25-L29">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.slew_rate_norm-sequence_optimisation" href="#MRIBuilder.Variables.variables.slew_rate_norm-sequence_optimisation"><code>MRIBuilder.Variables.variables.slew_rate_norm</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slew_rate_norm(gradient)</code></pre><p>The norm of the <a href="../api/#MRIBuilder.Variables.variables.slew_rate"><code>variables.slew_rate</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L486-L490">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.slice_thickness-sequence_optimisation" href="#MRIBuilder.Variables.variables.slice_thickness-sequence_optimisation"><code>MRIBuilder.Variables.variables.slice_thickness</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slice_thickness(slice_select)</code></pre><p>Defines the slice thickness for a RF pulse with an active gradient in mm (e.g., <a href="../api/#MRIBuilder.Parts.Trapezoids.SliceSelect"><code>SliceSelect</code></a>).</p><p>Defines as <a href="#MRIBuilder.Variables.variables.gradient_strength_norm-sequence_optimisation"><code>variables.gradient_strength_norm</code></a>(gradient) / <a href="../api/#MRIBuilder.Variables.variables.bandwidth"><code>variables.bandwidth</code></a>(pulse)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L213-L219">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.spoiler-sequence_optimisation" href="#MRIBuilder.Variables.variables.spoiler-sequence_optimisation"><code>MRIBuilder.Variables.variables.spoiler</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">spoiler(gradient)</code></pre><p>Spatial scale in mm over which the spoiler gradient will dephase by 2Ï€.</p><p>Automatically computed based on <a href="../api/#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L443-L449">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.time_to_center-sequence_optimisation" href="#MRIBuilder.Variables.variables.time_to_center-sequence_optimisation"><code>MRIBuilder.Variables.variables.time_to_center</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">time_to_center(adc)</code></pre><p>The time of the ADC readout to reach the center of k-space.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/components/readouts/ADCs.jl#L73-L77">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.voxel_size-sequence_optimisation" href="#MRIBuilder.Variables.variables.voxel_size-sequence_optimisation"><code>MRIBuilder.Variables.variables.voxel_size</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">voxel_size(readout)</code></pre><p>Defines the voxel size of a readout in mm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L295-L299">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.Δ-sequence_optimisation" href="#MRIBuilder.Variables.variables.Δ-sequence_optimisation"><code>MRIBuilder.Variables.variables.Δ</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">diffusion_time(diffusion_sequence)</code></pre><p>Returns the diffusion time of a <a href="../implemented_sequences/#MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}"><code>DiffusionSpinEcho</code></a> in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/sequences/diffusion_spin_echoes.jl#L84-L88">source</a></section><section><div><pre><code class="language-julia hljs">diffusion_time(sequence)</code></pre><p>Computes the diffusion time of a sequence in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L527-L531">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.δ-sequence_optimisation" href="#MRIBuilder.Variables.variables.δ-sequence_optimisation"><code>MRIBuilder.Variables.variables.δ</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">δ(trapezoid)</code></pre><p>Returns the effective duration of a <a href="../api/#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p><p>Defined as <a href="../api/#MRIBuilder.Variables.variables.rise_time"><code>variables.rise_time</code></a> + <a href="../api/#MRIBuilder.Variables.variables.flat_time"><code>variables.flat_time</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/parts/trapezoids.jl#L136-L142">source</a></section></article><h2 id="Variables-interface"><a class="docs-heading-anchor" href="#Variables-interface">Variables interface</a><a id="Variables-interface-1"></a><a class="docs-heading-anchor-permalink" href="#Variables-interface" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables" href="#MRIBuilder.Variables"><code>MRIBuilder.Variables</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Defines the functions that can be called on parts of an MRI sequence to query or constrain any variables.</p><p>In addition this defines:</p><ul><li><a href="#variables"><code>variables</code></a>: module containing all variables.</li><li><a href="#MRIBuilder.Variables.VariableType"><code>VariableType</code></a>: parent type for any variables (whether number or JuMP variable).</li><li><a href="#MRIBuilder.Variables.get_free_variable-Tuple{Number}"><code>get_free_variable</code></a>: helper function to create new JuMP variables.</li><li><a href="#MRIBuilder.Variables.add_cost_function!"><code>add_cost_function!</code></a>: add a specific term to the model cost functions.</li><li><a href="#MRIBuilder.Variables.set_simple_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock, Any}"><code>set_simple_constraints!</code></a>: call <a href="#MRIBuilder.Variables.apply_simple_constraint!-Tuple{AbstractVector, Symbol}"><code>apply_simple_constraint!</code></a> for each keyword argument.</li><li><a href="#MRIBuilder.Variables.apply_simple_constraint!-Tuple{AbstractVector, Symbol}"><code>apply_simple_constraint!</code></a>: set a simple equality constraint.</li><li><a href="../api/#MRIBuilder.Variables.get_pulse"><code>get_pulse</code></a>/<a href="../api/#MRIBuilder.Variables.get_gradient"><code>get_gradient</code></a>/<a href="#MRIBuilder.Variables.get_readout"><code>get_readout</code></a>: Used to get the pulse/gradient/readout part of a building block</li><li><a href="#MRIBuilder.Variables.gradient_orientation"><code>gradient_orientation</code></a>: returns the gradient orientation of a waveform if fixed.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L1-L13">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.VariableType" href="#MRIBuilder.Variables.VariableType"><code>MRIBuilder.Variables.VariableType</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Parent type for any variable in the MRI sequence.</p><p>Each variable can be one of:</p><ul><li>a new JuMP variable</li><li>an expression linking this variable to other JuMP variable</li><li>a number</li></ul><p>Create these using <a href="#MRIBuilder.Variables.get_free_variable-Tuple{Number}"><code>get_free_variable</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L543-L552">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.alternative_variables" href="#MRIBuilder.Variables.alternative_variables"><code>MRIBuilder.Variables.alternative_variables</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Mapping of variable names to alternative ways to compute that variables.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L151-L153">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.default_generic_method" href="#MRIBuilder.Variables.default_generic_method"><code>MRIBuilder.Variables.default_generic_method</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Contains for each variable the default, generic method.</p><p>This is the method that checks for <a href="@ref"><code>alternative_functions</code></a> or uses one of the getters.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L144-L148">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.getter_functions" href="#MRIBuilder.Variables.getter_functions"><code>MRIBuilder.Variables.getter_functions</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Mapping of symbols to actual getter functions.</p><p>Used in <a href="#MRIBuilder.Variables.set_getter!-Tuple{Symbol, Symbol}"><code>set_getter!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L622-L626">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.getters" href="#MRIBuilder.Variables.getters"><code>MRIBuilder.Variables.getters</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Assigns getters to specific variables.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L161-L163">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.AbstractBlock" href="#MRIBuilder.Variables.AbstractBlock"><code>MRIBuilder.Variables.AbstractBlock</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Parent type of all components, building block, and sequences that form an MRI sequence.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L21-L23">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.InvalidRoute" href="#MRIBuilder.Variables.InvalidRoute"><code>MRIBuilder.Variables.InvalidRoute</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Raised if there is no way to reach a valid function by the default, generic method (<a href="#MRIBuilder.Variables.default_generic_method"><code>default_generic_method</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L156-L158">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables._get_mult_variable-Tuple{Any, Any, Vararg{Any}}" href="#MRIBuilder.Variables._get_mult_variable-Tuple{Any, Any, Vararg{Any}}"><code>MRIBuilder.Variables._get_mult_variable</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Helper to call the variable for a result of a getter. Used in <a href="#MRIBuilder.Variables._get_variable-Tuple{Symbol, Set{Symbol}, Vararg{Any}}"><code>_get_variable</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L227-L229">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables._get_variable-Tuple{Symbol, Set{Symbol}, Vararg{Any}}" href="#MRIBuilder.Variables._get_variable-Tuple{Symbol, Set{Symbol}, Vararg{Any}}"><code>MRIBuilder.Variables._get_variable</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">_get_variable(name, tried_names, args...; kwargs...)</code></pre><p>Tries to find a route to get values for the variable <code>name</code> with the given <code>args</code> and <code>kwargs</code>.</p><p>The route through <code>tried_names</code> has already been attempted.</p><p>This function returns the route to get to the value and the value itself.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L168-L176">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.add_alternative_variable!-Tuple{Symbol, Symbol, Function, Bool}" href="#MRIBuilder.Variables.add_alternative_variable!-Tuple{Symbol, Symbol, Function, Bool}"><code>MRIBuilder.Variables.add_alternative_variable!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">add_alternative_variable!(name, other_func, conversion)</code></pre><p>Defines an alternative way to compute the variable with given <code>name</code>.</p><p>If the variable <code>name</code> is not defined and <code>other_name</code> is, then the value of <code>name</code> is computed by applying <code>conversion</code> to the value of <code>other_name</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L411-L418">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.add_cost_function!" href="#MRIBuilder.Variables.add_cost_function!"><code>MRIBuilder.Variables.add_cost_function!</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">add_cost_function!(function, level=2)</code></pre><p>Adds an additional term to the cost function.</p><p>This term will be minimised together with any other terms in the cost function. Terms added at a lower level will be optimised before any terms with a higher level.</p><p>By default, the term is added to the <code>level=2</code>, which is appropriate for any cost functions added by the developer, which will generally only be optimised after any user-defined cost functions (which are added at <code>level=1</code> by <a href="@ref"><code>add_simple_constraint!</code></a> or <a href="#MRIBuilder.Variables.set_simple_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock, Any}"><code>set_simple_constraints!</code></a>.</p><p>Any sequence will also have a <code>level=3</code> cost function, which minimises the total sequence duration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L642-L654">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.add_new_variable!-Tuple{Symbol}" href="#MRIBuilder.Variables.add_new_variable!-Tuple{Symbol}"><code>MRIBuilder.Variables.add_new_variable!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">add_new_variable!(name)</code></pre><p>Adds a new variable in <a href="#variables"><code>variables</code></a>.</p><p>This is a helper function, which is called by <code>@defvar</code> for any variable that does not exist yet.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L241-L247">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.adjust_groups-Tuple{MRIBuilder.Variables.AbstractBlock}" href="#MRIBuilder.Variables.adjust_groups-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>MRIBuilder.Variables.adjust_groups</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">adjust_groups(block)</code></pre><p>Returns an array of keywords in <a href="../adjust_sequences/#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust</code></a> that should affect a specfic block.</p><p>If any of these keywords are present in <a href="../adjust_sequences/#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust</code></a>, then <a href="#MRIBuilder.Variables.adjust_internal"><code>adjust_internal</code></a> will be called.</p><p>Some standard keywords are:</p><ul><li><code>:gradient</code>: expects gradient adjustment parameters</li><li><code>:pulse</code>: expects RF pulse adjustment parameters</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L45-L55">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.adjust_internal" href="#MRIBuilder.Variables.adjust_internal"><code>MRIBuilder.Variables.adjust_internal</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">adjust_internal(block, names_used; kwargs...)</code></pre><p>Returns the adjusted blocks and add any keywords used in the process to <code>names_used</code>.</p><p>This is a helper function used by <a href="../adjust_sequences/#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust</code></a>. It should be defined for any block that is adjustable (as defined by <a href="#MRIBuilder.Variables.adjust_groups-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust_groups</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L35-L42">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.apply_simple_constraint!-Tuple{AbstractVector, Symbol}" href="#MRIBuilder.Variables.apply_simple_constraint!-Tuple{AbstractVector, Symbol}"><code>MRIBuilder.Variables.apply_simple_constraint!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">apply_simple_constraint!(variable, value)</code></pre><p>Add a single constraint or objective to the <code>variable</code>.</p><p><code>value</code> can be one of:</p><ul><li><code>nothing</code>: do nothing</li><li><code>:min</code>: minimise the variable</li><li><code>:max</code>: maximise the variable</li><li><code>number</code>: fix variable to this value</li><li><code>equation</code>: fix variable to the result of this equation</li></ul><pre><code class="nohighlight hljs">apply_simple_constraint!(variable, :>=/:<=, value)</code></pre><p>Set an inequality constraint to the <code>variable</code>.</p><p><code>value</code> can be a number of an equation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L737-L755">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.base_variables-Tuple{}" href="#MRIBuilder.Variables.base_variables-Tuple{}"><code>MRIBuilder.Variables.base_variables</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">base_variables([T])</code></pre><p>Return dictionary with all <a href="@ref"><code>Variable</code></a> objects defined for a specific sequence component/block <code>T</code>.</p><p>This only returns those <a href="@ref"><code>Variable</code></a> directly defined for this component/block, not for any sub-components (through <a href="../api/#MRIBuilder.Variables.get_pulse"><code>get_pulse</code></a>, [<code>get_gradient</code>][(@ref), etc.)</p><p>If <code>T</code> is not provided, all <a href="@ref"><code>Variable</code></a> objects are returned.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L62-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.get_free_variable-Tuple{Number}" href="#MRIBuilder.Variables.get_free_variable-Tuple{Number}"><code>MRIBuilder.Variables.get_free_variable</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_free_variable(value; integer=false, start=0.01)</code></pre><p>Get a representation of a given <code>variable</code> given a user-defined constraint.</p><p>The result is guaranteed to be a <a href="#MRIBuilder.Variables.VariableType"><code>VariableType</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L556-L562">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.get_readout" href="#MRIBuilder.Variables.get_readout"><code>MRIBuilder.Variables.get_readout</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_readout(sequence)</code></pre><p>Get the main readout events played out during the sequence.</p><p>This has to be defined for individual sequences to work.</p><p>Any <code>readout</code> variables not explicitly defined for this sequence will be passed on to the readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L600-L608">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.gradient_orientation" href="#MRIBuilder.Variables.gradient_orientation"><code>MRIBuilder.Variables.gradient_orientation</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_orientation(building_block)</code></pre><p>Returns the gradient orientation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L634-L638">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.make_generic" href="#MRIBuilder.Variables.make_generic"><code>MRIBuilder.Variables.make_generic</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">make_generic(sequence/building_block/component)</code></pre><p>Returns a generic version of the <code>BaseSequence</code>, <code>BaseBuildingBlock</code>, or <code>BaseComponent</code></p><ul><li>Sequences are all flattened and returned as a single <code>Sequence</code> containing only <code>BuildingBlock</code> objects.</li><li>Any <code>BaseBuildingBlock</code> is converted into a <code>BuildingBlock</code>.</li><li>Pulses are replaced with <code>GenericPulse</code> (except for instant pulses).</li><li>Instant readouts are replaced with <code>ADC</code>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L789-L798">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.scanner_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock}" href="#MRIBuilder.Variables.scanner_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>MRIBuilder.Variables.scanner_constraints!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">scanner_constraints!(block)</code></pre><p>Constraints <a href="../api/#MRIBuilder.Variables.variables.gradient_strength"><code>variables.gradient_strength</code></a> and <a href="../api/#MRIBuilder.Variables.variables.slew_rate"><code>variables.slew_rate</code></a> to be less than the <a href="../defining_sequence/#MRIBuilder.BuildSequences.global_scanner-Tuple{}"><code>global_scanner</code></a> maximum.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L802-L806">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.set_getter!-Tuple{Symbol, Symbol}" href="#MRIBuilder.Variables.set_getter!-Tuple{Symbol, Symbol}"><code>MRIBuilder.Variables.set_getter!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">set_getter!(variable_name, getter)</code></pre><p>Set the getter function for <code>variable_name</code>.</p><p>If the value for <code>variable</code> is not defined for a sequence, the value for the result of the <code>getter</code> function is returned instead.</p><p>Possible values for the <code>getter</code> function are:</p><ul><li><code>:pulse</code>: <a href="../api/#MRIBuilder.Variables.get_pulse"><code>get_pulse</code></a></li><li><code>:gradient</code>: <a href="../api/#MRIBuilder.Variables.get_gradient"><code>get_gradient</code></a></li><li><code>:readout</code>: <a href="#MRIBuilder.Variables.get_readout"><code>get_readout</code></a></li><li><code>:pathway</code>: <a href="../defining_sequence/#MRIBuilder.Variables.get_pathway"><code>get_pathway</code></a></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L386-L398">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.set_simple_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock, Any}" href="#MRIBuilder.Variables.set_simple_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock, Any}"><code>MRIBuilder.Variables.set_simple_constraints!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">set_simple_constraints!(block, kwargs)</code></pre><p>Add any constraints or objective functions to the variables of a <a href="#MRIBuilder.Variables.AbstractBlock"><code>AbstractBlock</code></a>.</p><p>Each keyword argument has to match one of the functions in <a href="#variables"><code>variables</code></a>(block). If set to a numeric value, a constraint will be added to fix the function value to that numeric value. If set to <code>:min</code> or <code>:max</code>, minimising or maximising this function will be added to the cost function.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L662-L670">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variable_defined_for-Tuple{Symbol, Vararg{Any}}" href="#MRIBuilder.Variables.variable_defined_for-Tuple{Symbol, Vararg{Any}}"><code>MRIBuilder.Variables.variable_defined_for</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">variable_defined_for(variable, args...; kwargs...)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L84-L86">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.@defvar-Tuple{Any, Any}" href="#MRIBuilder.Variables.@defvar-Tuple{Any, Any}"><code>MRIBuilder.Variables.@defvar</code></a> — <span class="docstring-category">Macro</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">@defvar(function(s))</code></pre><p>Defines new <a href="#variables"><code>variables</code></a>.</p><p>Each variable is defined as regular Julia functions embedded within a <code>@defvar</code> macro. For example, to define a <code>variables.echo_time</code> variable for a <code>SpinEcho</code> sequence, one can use:</p><pre><code class="language-julia hljs">@defvar echo_time(ge::SpinEcho) = 2 * (variables.effective_time(ge, :refocus) - variables.effective_time(ge, :excitation))</code></pre><p>Multiple variables can be defined in a single <code>@defvar</code> by including them in a code block:</p><pre><code class="language-julia hljs">@defvar begin +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Optimisation · MRIBuilder.jl</title><meta name="title" content="Optimisation · MRIBuilder.jl"/><meta property="og:title" content="Optimisation · MRIBuilder.jl"/><meta property="twitter:title" content="Optimisation · MRIBuilder.jl"/><meta name="description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="twitter:description" content="Documentation for MRIBuilder.jl: an MRI sequence builder in Julia"/><meta property="og:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/sequence_optimisation/"/><meta property="twitter:url" content="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/sequence_optimisation/"/><link rel="canonical" href="https://open.win.ox.ac.uk/pages/ndcn0236/mribuilder.jl/stable/sequence_optimisation/"/><script data-outdated-warner src="../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../search_index.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-mocha.css" data-theme-name="catppuccin-mocha"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-macchiato.css" data-theme-name="catppuccin-macchiato"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-frappe.css" data-theme-name="catppuccin-frappe"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/catppuccin-latte.css" data-theme-name="catppuccin-latte"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href="../">MRIBuilder.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li class="is-active"><a class="tocitem" href>Optimisation</a><ul class="internal"><li><a class="tocitem" href="#variables"><span>Summary variables</span></a></li><li><a class="tocitem" href="#Variables-interface"><span>Variables interface</span></a></li></ul></li><li><a class="tocitem" href="../implemented_sequences/">Implemented sequences</a></li><li><a class="tocitem" href="../defining_sequence/">Defining sequences</a></li><li><a class="tocitem" href="../adjust_sequences/">Post-hoc adjustments</a></li><li><a class="tocitem" href="../scanners/">Scanners</a></li><li><a class="tocitem" href="../api/">Internal API</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Optimisation</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Optimisation</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl" title="View the repository"><span class="docs-icon fa-brands">ï¡</span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/main/docs/src/sequence_optimisation.md" title="Edit source"><span class="docs-icon fa-solid">ï„</span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="sequence_optimisation"><a class="docs-heading-anchor" href="#sequence_optimisation">Sequence optimisation</a><a id="sequence_optimisation-1"></a><a class="docs-heading-anchor-permalink" href="#sequence_optimisation" title="Permalink"></a></h1><p>In MRIBuilder an MR <a href="../api/#MRIBuilder.Containers.BaseSequences.Sequence"><code>Sequence</code></a> is defined as a sequence of <a href="../api/#MRIBuilder.Containers.BuildingBlocks.BuildingBlock"><code>BuildingBlock</code></a> objects. Most <code>BuildingBlock</code> objects will contain free parameters determining, for example, the duration of the block or the strength/orientation of the MR gradient. In most MR sequence building software, the user will have to set all of these free parameters by computing the appropriate values given a desired echo time, b-value, etc.</p><p>In MRIBuilder the internal free parameters are not set directly. Instead, they are inferred using a non-linear, constrained optimisation. For each sequence type, the developer defines how to compute various summary variables from the <code>BuildingBlock</code> free parameters, such as <a href="../implemented_sequences/#MRIBuilder.Variables.variables.echo_time"><code>variables.echo_time</code></a>, <a href="#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>, <a href="../api/#MRIBuilder.Variables.variables.resolution"><code>variables.resolution</code></a>, <a href="../api/#MRIBuilder.Variables.variables.gradient_strength"><code>variables.gradient_strength</code></a>, <a href="../implemented_sequences/#MRIBuilder.Variables.variables.diffusion_time"><code>variables.diffusion_time</code></a>, <a href="../defining_sequence/#MRIBuilder.Variables.variables.duration_transverse"><code>variables.duration_transverse</code></a> etc. A user can then create a specific instantiation of the sequence by fixing any of these summary variables to their desired values (or setting them to <code>:min</code>/<code>:max</code> to minimise/maximise them). In addition to the user-defined constraints, this optimisation will also take into account any <a href="../scanners/#scanners">scanner-defined constraints</a>. Internally, MRIBuilder will then optimise the <code>BuildingBlock</code> free parameters to match any user-defined constraints and/or objectives. This optimisation uses the <a href="https://github.com/coin-or/Ipopt">Ipopt</a> optimiser accessed through the <a href="https://jump.dev/JuMP.jl/stable/">JuMP.jl</a> library.</p><p>In addition to any user-defined objectives, the developer might also have defined secondary objectives (e.g., minimise the total sequence duration). These objective functions will only be considered if they do not affect the result of the user-defined primary objective. More details on these developer-defined secondary objectives can be found in the section on <a href="../defining_sequence/#defining_sequences">defining new sequences</a></p><h2 id="variables"><a class="docs-heading-anchor" href="#variables">Summary variables</a><a id="variables-1"></a><a class="docs-heading-anchor-permalink" href="#variables" title="Permalink"></a></h2><p>All variables are available as members of the <a href="#variables"><code>variables</code></a> structure.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables" href="#MRIBuilder.Variables.variables"><code>MRIBuilder.Variables.variables</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Main module containing all the MRIBuilder sequence variables.</p><p>All variables are available as members of this module, e.g. <code>variables.echo_time</code> returns the echo time variable. New variables can be defined using <code>@defvar</code>.</p><p>Set constraints on variables by passing them on as keywords during the sequence generation, e.g., <code>seq=SpinEcho(echo_time=70)</code>.</p><p>After sequence generation you can get the variable values by calling <code>variables.echo_time(seq)</code>. For the sequence defined above this would return 70. (or a number very close to that).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L127-L140">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.N_left-sequence_optimisation" href="#MRIBuilder.Variables.variables.N_left-sequence_optimisation"><code>MRIBuilder.Variables.variables.N_left</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">N_left(sinc_pulse)</code></pre><p>Number of zero-crossings of the <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> before the maximum.</p><p>Also, see <a href="../api/#MRIBuilder.Variables.variables.N_right"><code>variables.N_right</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/sinc_pulses.jl#L89-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.N_right-sequence_optimisation" href="#MRIBuilder.Variables.variables.N_right-sequence_optimisation"><code>MRIBuilder.Variables.variables.N_right</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">N_left(sinc_pulse)</code></pre><p>Number of zero-crossings of the <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a> after the maximum.</p><p>Also, see <a href="../api/#MRIBuilder.Variables.variables.N_left"><code>variables.N_left</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/sinc_pulses.jl#L98-L104">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.TE-sequence_optimisation" href="#MRIBuilder.Variables.variables.TE-sequence_optimisation"><code>MRIBuilder.Variables.variables.TE</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">echo_time(sequence)</code></pre><p>Returns the echo time of a sequence in ms.</p><p>This is typically defined as the time between the excitation pulse and the crossing of k=0 during the MRI readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/spin_echoes.jl#L56-L62">source</a></section><section><div><pre><code class="language-julia hljs">echo_time(sequence)</code></pre><p>Computes the echo time(s) of a sequence in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L513-L517">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.TR-sequence_optimisation" href="#MRIBuilder.Variables.variables.TR-sequence_optimisation"><code>MRIBuilder.Variables.variables.TR</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">repetition_time(sequence)</code></pre><p>Computes the repetition_times of a sequence in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L520-L524">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.all_gradient_strengths-sequence_optimisation" href="#MRIBuilder.Variables.variables.all_gradient_strengths-sequence_optimisation"><code>MRIBuilder.Variables.variables.all_gradient_strengths</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">all_gradient_strengths(spoilt_slice_select)</code></pre><p>Returns the gradient strength before, during, and after the pulse in <a href="../api/#MRIBuilder.Parts.SpoiltSliceSelects.SpoiltSliceSelect"><code>SpoiltSliceSelect</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/spoilt_slice_selects.jl#L127-L131">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.amplitude-sequence_optimisation" href="#MRIBuilder.Variables.variables.amplitude-sequence_optimisation"><code>MRIBuilder.Variables.variables.amplitude</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">amplitude(pulse)</code></pre><p>Return the amplitude of an <a href="../api/#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L65-L69">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.area_under_curve-sequence_optimisation" href="#MRIBuilder.Variables.variables.area_under_curve-sequence_optimisation"><code>MRIBuilder.Variables.variables.area_under_curve</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">area_under_curve(pathway::Pathway)</code></pre><p>Return net displacement in k-space (i.e., spoiling) experienced by the spins following a specific <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a>.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>area_under_curve</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L131-L139">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bandwidth-sequence_optimisation" href="#MRIBuilder.Variables.variables.bandwidth-sequence_optimisation"><code>MRIBuilder.Variables.variables.bandwidth</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bandwidth(pulse)</code></pre><p>Return the bandwidth of an <a href="../api/#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L86-L90">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bmat-sequence_optimisation" href="#MRIBuilder.Variables.variables.bmat-sequence_optimisation"><code>MRIBuilder.Variables.variables.bmat</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bmat(pathway::Pathway)</code></pre><p>Return 3x3 diffusion-weighted matrix experienced by the spins following a specific <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in rad^2 ms/um^2.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>bmat</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L144-L152">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bmat_gradient-sequence_optimisation" href="#MRIBuilder.Variables.variables.bmat_gradient-sequence_optimisation"><code>MRIBuilder.Variables.variables.bmat_gradient</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bmat_gradient(overlapping, qstart[, first_event, last_event])</code></pre><p>Computes the addition to the <a href="../defining_sequence/#MRIBuilder.Variables.variables.bmat"><code>variables.bmat</code></a> contributed by a specific building block or gradient.</p><p><code>qstart</code> represents the <a href="../api/#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a> at the start of this component.</p><p>If <code>first_event</code> is set to something else than <code>nothing</code>, only the gradient waveform after this RF pulse/Readout will be considered. Similarly, if <code>last_event</code> is set to something else than <code>nothing</code>, only the gradient waveform up to this RF pulse/Readout will be considered.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L243-L252">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.bval-sequence_optimisation" href="#MRIBuilder.Variables.variables.bval-sequence_optimisation"><code>MRIBuilder.Variables.variables.bval</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">bval(pathway::Pathway)</code></pre><p>Return size of diffusion-weighting experienced by the spins following a specific <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in rad^2 ms/um^2.</p><p>Only gradients active while the spins are in the transverse plane will contribute to the diffusion weighting.</p><p>Returns a NamedTuple with the <code>bval</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L156-L164">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.delay-sequence_optimisation" href="#MRIBuilder.Variables.variables.delay-sequence_optimisation"><code>MRIBuilder.Variables.variables.delay</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">delay(sequence)</code></pre><p>Returns the offset beetween the readout and the spin echo in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/diffusion_spin_echoes.jl#L91-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.diffusion_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.diffusion_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.diffusion_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">diffusion_time(diffusion_sequence)</code></pre><p>Returns the diffusion time of a <a href="../implemented_sequences/#MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}"><code>DiffusionSpinEcho</code></a> in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/diffusion_spin_echoes.jl#L84-L88">source</a></section><section><div><pre><code class="language-julia hljs">diffusion_time(sequence)</code></pre><p>Computes the diffusion time of a sequence in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L527-L531">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration-sequence_optimisation" href="#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>MRIBuilder.Variables.variables.duration</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration(block)</code></pre><p>Duration of the sequence or building block in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L377-L381">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_dephase-sequence_optimisation" href="#MRIBuilder.Variables.variables.duration_dephase-sequence_optimisation"><code>MRIBuilder.Variables.variables.duration_dephase</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_dephase(pathway::Pathway)</code></pre><p>Returns the net time that spins following the given <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in the +transverse versus the -transverse state. This determines the amount of T2'-weighting as <span>$e^{t/T_2'}$</span>, where <span>$t$</span> is the <code>duration_dephase</code>.</p><p>Also see <a href="../defining_sequence/#MRIBuilder.Variables.variables.duration_transverse"><code>variables.duration_transverse</code></a> for T2-weighting.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L106-L113">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_state-sequence_optimisation" href="#MRIBuilder.Variables.variables.duration_state-sequence_optimisation"><code>MRIBuilder.Variables.variables.duration_state</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_state(pathway::Pathway, transverse::Bool, positive::Bool)</code></pre><p>Returns how long the <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in a specific state.</p><p>The requested state can be set using <code>transverse</code> and <code>positive</code> as follows:</p><ul><li><code>transverse=false</code>, <code>positive=true</code>: +longitudinal</li><li><code>transverse=true</code>, <code>positive=true</code>: +transverse</li><li><code>transverse=false</code>, <code>positive=false</code>: -longitudinal</li><li><code>transverse=true</code>, <code>positive=false</code>: -transverse</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L77-L87">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.duration_transverse-sequence_optimisation" href="#MRIBuilder.Variables.variables.duration_transverse-sequence_optimisation"><code>MRIBuilder.Variables.variables.duration_transverse</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">duration_transverse(pathway::Pathway)</code></pre><p>Returns the total amount of time that spins following the given <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> spent in the transverse plane. This determines the amount of T2-weighting as <span>$e^{t/T_2}$</span>, where <span>$t$</span> is the <code>duration_transverse</code>.</p><p>Also see <a href="../defining_sequence/#MRIBuilder.Variables.variables.duration_dephase"><code>variables.duration_dephase</code></a> for T2'-weighting.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L93-L100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.dwell_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.dwell_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.dwell_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">dwell_time(adc)</code></pre><p>The dwell time of the ADC readout in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.echo_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.echo_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.echo_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">echo_time(sequence)</code></pre><p>Returns the echo time of a sequence in ms.</p><p>This is typically defined as the time between the excitation pulse and the crossing of k=0 during the MRI readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/spin_echoes.jl#L56-L62">source</a></section><section><div><pre><code class="language-julia hljs">echo_time(sequence)</code></pre><p>Computes the echo time(s) of a sequence in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L513-L517">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.effective_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.effective_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.effective_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">effective_time(container, indices...)</code></pre><p>Returns the start time of component with given <code>indices</code> with respect to the start of the <a href="../api/#MRIBuilder.Containers.Abstract.ContainerBlock"><code>ContainerBlock</code></a>.</p><p>This will crash if the component does not have an <a href="../api/#MRIBuilder.Variables.variables.effective_time"><code>variables.effective_time</code></a> (e.g., if it is (part of) a gradient waveform).</p><p>Also see <a href="#MRIBuilder.Variables.variables.duration-sequence_optimisation"><code>variables.duration</code></a>, <a href="../api/#MRIBuilder.Containers.Abstract.start_time-Tuple{ContainerBlock, Any, Any, Vararg{Any}}"><code>start_time</code></a>, and <a href="../api/#MRIBuilder.Containers.Abstract.end_time-Tuple{ContainerBlock, Any, Vararg{Any}}"><code>end_time</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L41-L49">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.flat_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.flat_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.flat_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">flat_time(trapezoid)</code></pre><p>Returns the flat time of a <a href="../api/#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L124-L128">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.flip_angle-sequence_optimisation" href="#MRIBuilder.Variables.variables.flip_angle-sequence_optimisation"><code>MRIBuilder.Variables.variables.flip_angle</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">flip_angle(pulse)</code></pre><p>Return the flip angle of an <a href="../api/#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in degrees.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L79-L83">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.fov-sequence_optimisation" href="#MRIBuilder.Variables.variables.fov-sequence_optimisation"><code>MRIBuilder.Variables.variables.fov</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">fov(readout)</code></pre><p>Defines the field of view of a readout in mm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L288-L292">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.frequency-sequence_optimisation" href="#MRIBuilder.Variables.variables.frequency-sequence_optimisation"><code>MRIBuilder.Variables.variables.frequency</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">frequency(pulse)</code></pre><p>Return the off-resonance frequency of an <a href="../api/#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in kHz.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L72-L76">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.gradient_strength-sequence_optimisation" href="#MRIBuilder.Variables.variables.gradient_strength-sequence_optimisation"><code>MRIBuilder.Variables.variables.gradient_strength</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_strength(gradient)</code></pre><p>Maximum 3D gradient strength of the gradient in kHz/um.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.gradient_strength_norm-sequence_optimisation" href="#MRIBuilder.Variables.variables.gradient_strength_norm-sequence_optimisation"><code>MRIBuilder.Variables.variables.gradient_strength_norm</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_strength_norm(gradient)</code></pre><p>The norm of the <a href="../api/#MRIBuilder.Variables.variables.gradient_strength"><code>variables.gradient_strength</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L479-L483">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.lobe_duration-sequence_optimisation" href="#MRIBuilder.Variables.variables.lobe_duration-sequence_optimisation"><code>MRIBuilder.Variables.variables.lobe_duration</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">lobe_duration(sinc_pulse)</code></pre><p>Time between two zero-crossings of a <a href="../api/#MRIBuilder.Components.Pulses.SincPulses.SincPulse"><code>SincPulse</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/pulses/sinc_pulses.jl#L113-L117">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.net_dephasing-sequence_optimisation" href="#MRIBuilder.Variables.variables.net_dephasing-sequence_optimisation"><code>MRIBuilder.Variables.variables.net_dephasing</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">net_dephasing(pathway::Pathway)</code></pre><p>Return net displacement vector in k-space/q-space experienced by the spins following a specific <a href="../defining_sequence/#MRIBuilder.Pathways.Pathway"><code>Pathway</code></a> in kHz/um.</p><p>Only gradients active while the spins are in the transverse plane are considered.</p><p>Returns a NamedTuple with the <code>qvec</code> for all gradient groups.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/pathways.jl#L118-L126">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.nsamples-sequence_optimisation" href="#MRIBuilder.Variables.variables.nsamples-sequence_optimisation"><code>MRIBuilder.Variables.variables.nsamples</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">nsamples(adc)</code></pre><p>Number of samples in an ADC.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L89-L93">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.oversample-sequence_optimisation" href="#MRIBuilder.Variables.variables.oversample-sequence_optimisation"><code>MRIBuilder.Variables.variables.oversample</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">oversample(adc)</code></pre><p>The oversampling rate of the ADC readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L59-L63">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.phase-sequence_optimisation" href="#MRIBuilder.Variables.variables.phase-sequence_optimisation"><code>MRIBuilder.Variables.variables.phase</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">phase(pulse)</code></pre><p>Return the phase of an <a href="../api/#MRIBuilder.Components.AbstractTypes.RFPulseComponent"><code>RFPulseComponent</code></a> in degrees.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L58-L62">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.qval-sequence_optimisation" href="#MRIBuilder.Variables.variables.qval-sequence_optimisation"><code>MRIBuilder.Variables.variables.qval</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">qval(gradient)</code></pre><p>The norm of the <a href="../api/#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L427-L431">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.qvec-sequence_optimisation" href="#MRIBuilder.Variables.variables.qvec-sequence_optimisation"><code>MRIBuilder.Variables.variables.qvec</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">qvec(overlapping[, first_event, last_event])</code></pre><p>Computes the area under the curve for the gradient waveform in <a href="../api/#MRIBuilder.Containers.BuildingBlocks.BaseBuildingBlock"><code>BaseBuildingBlock</code></a>.</p><p>If <code>first_event</code> is set to something else than <code>nothing</code>, only the gradient waveform after this RF pulse/Readout will be considered. Similarly, if <code>last_event</code> is set to something else than <code>nothing</code>, only the gradient waveform up to this RF pulse/Readout will be considered.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/building_blocks.jl#L233-L240">source</a></section><section><div><pre><code class="language-julia hljs">qvec(gradient)</code></pre><p>The total integral of the area under the gradient curve as a length-3 vector.</p><p>The norm of this vector is available as <a href="#MRIBuilder.Variables.variables.qval-sequence_optimisation"><code>qval</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L452-L458">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.ramp_overlap-sequence_optimisation" href="#MRIBuilder.Variables.variables.ramp_overlap-sequence_optimisation"><code>MRIBuilder.Variables.variables.ramp_overlap</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">ramp_overlap(line_readout)</code></pre><p>Return the fraction of the gradient ramp that overlaps with the ADC readout.</p><p>Set to 0 to ensure that the ADC is only active during the flat time of the readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L302-L308">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.readout_times-sequence_optimisation" href="#MRIBuilder.Variables.variables.readout_times-sequence_optimisation"><code>MRIBuilder.Variables.variables.readout_times</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">readout_times(sequence)</code></pre><p>Returns all the times that the sequence will readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/containers/abstract.jl#L146-L150">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.resolution-sequence_optimisation" href="#MRIBuilder.Variables.variables.resolution-sequence_optimisation"><code>MRIBuilder.Variables.variables.resolution</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">resolution(readout)</code></pre><p>Resolution of the readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.rise_time-sequence_optimisation" href="#MRIBuilder.Variables.variables.rise_time-sequence_optimisation"><code>MRIBuilder.Variables.variables.rise_time</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">rise_time(trapezoid)</code></pre><p>Returns the rise time of a <a href="../api/#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L117-L121">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.slew_rate-sequence_optimisation" href="#MRIBuilder.Variables.variables.slew_rate-sequence_optimisation"><code>MRIBuilder.Variables.variables.slew_rate</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slew_rate(gradient)</code></pre><p>Maximum 3D slew rate of the gradient in kHz/um/ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/abstract_types.jl#L25-L29">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.slew_rate_norm-sequence_optimisation" href="#MRIBuilder.Variables.variables.slew_rate_norm-sequence_optimisation"><code>MRIBuilder.Variables.variables.slew_rate_norm</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slew_rate_norm(gradient)</code></pre><p>The norm of the <a href="../api/#MRIBuilder.Variables.variables.slew_rate"><code>variables.slew_rate</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L486-L490">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.slice_thickness-sequence_optimisation" href="#MRIBuilder.Variables.variables.slice_thickness-sequence_optimisation"><code>MRIBuilder.Variables.variables.slice_thickness</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">slice_thickness(slice_select)</code></pre><p>Defines the slice thickness for a RF pulse with an active gradient in mm (e.g., <a href="../api/#MRIBuilder.Parts.Trapezoids.SliceSelect"><code>SliceSelect</code></a>).</p><p>Defines as <a href="#MRIBuilder.Variables.variables.gradient_strength_norm-sequence_optimisation"><code>variables.gradient_strength_norm</code></a>(gradient) / <a href="../api/#MRIBuilder.Variables.variables.bandwidth"><code>variables.bandwidth</code></a>(pulse)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L213-L219">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.spoiler-sequence_optimisation" href="#MRIBuilder.Variables.variables.spoiler-sequence_optimisation"><code>MRIBuilder.Variables.variables.spoiler</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">spoiler(gradient)</code></pre><p>Spatial scale in mm over which the spoiler gradient will dephase by 2Ï€.</p><p>Automatically computed based on <a href="../api/#MRIBuilder.Variables.variables.qvec"><code>variables.qvec</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L443-L449">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.time_to_center-sequence_optimisation" href="#MRIBuilder.Variables.variables.time_to_center-sequence_optimisation"><code>MRIBuilder.Variables.variables.time_to_center</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">time_to_center(adc)</code></pre><p>The time of the ADC readout to reach the center of k-space.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/components/readouts/ADCs.jl#L73-L77">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.voxel_size-sequence_optimisation" href="#MRIBuilder.Variables.variables.voxel_size-sequence_optimisation"><code>MRIBuilder.Variables.variables.voxel_size</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">voxel_size(readout)</code></pre><p>Defines the voxel size of a readout in mm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L295-L299">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.Δ-sequence_optimisation" href="#MRIBuilder.Variables.variables.Δ-sequence_optimisation"><code>MRIBuilder.Variables.variables.Δ</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">diffusion_time(diffusion_sequence)</code></pre><p>Returns the diffusion time of a <a href="../implemented_sequences/#MRIBuilder.Sequences.DiffusionSpinEchoes.DiffusionSpinEcho-Tuple{}"><code>DiffusionSpinEcho</code></a> in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/sequences/diffusion_spin_echoes.jl#L84-L88">source</a></section><section><div><pre><code class="language-julia hljs">diffusion_time(sequence)</code></pre><p>Computes the diffusion time of a sequence in ms.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L527-L531">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variables.δ-sequence_optimisation" href="#MRIBuilder.Variables.variables.δ-sequence_optimisation"><code>MRIBuilder.Variables.variables.δ</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">δ(trapezoid)</code></pre><p>Returns the effective duration of a <a href="../api/#MRIBuilder.Parts.Trapezoids.Trapezoid"><code>Trapezoid</code></a> gradient profile in ms.</p><p>Defined as <a href="../api/#MRIBuilder.Variables.variables.rise_time"><code>variables.rise_time</code></a> + <a href="../api/#MRIBuilder.Variables.variables.flat_time"><code>variables.flat_time</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/parts/trapezoids.jl#L136-L142">source</a></section></article><h2 id="Variables-interface"><a class="docs-heading-anchor" href="#Variables-interface">Variables interface</a><a id="Variables-interface-1"></a><a class="docs-heading-anchor-permalink" href="#Variables-interface" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables" href="#MRIBuilder.Variables"><code>MRIBuilder.Variables</code></a> — <span class="docstring-category">Module</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Defines the functions that can be called on parts of an MRI sequence to query or constrain any variables.</p><p>In addition this defines:</p><ul><li><a href="#variables"><code>variables</code></a>: module containing all variables.</li><li><a href="#MRIBuilder.Variables.VariableType"><code>VariableType</code></a>: parent type for any variables (whether number or JuMP variable).</li><li><a href="#MRIBuilder.Variables.get_free_variable-Tuple{Number}"><code>get_free_variable</code></a>: helper function to create new JuMP variables.</li><li><a href="#MRIBuilder.Variables.add_cost_function!"><code>add_cost_function!</code></a>: add a specific term to the model cost functions.</li><li><a href="#MRIBuilder.Variables.set_simple_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock, Any}"><code>set_simple_constraints!</code></a>: call <a href="#MRIBuilder.Variables.apply_simple_constraint!-Tuple{AbstractVector, Symbol}"><code>apply_simple_constraint!</code></a> for each keyword argument.</li><li><a href="#MRIBuilder.Variables.apply_simple_constraint!-Tuple{AbstractVector, Symbol}"><code>apply_simple_constraint!</code></a>: set a simple equality constraint.</li><li><a href="../api/#MRIBuilder.Variables.get_pulse"><code>get_pulse</code></a>/<a href="../api/#MRIBuilder.Variables.get_gradient"><code>get_gradient</code></a>/<a href="#MRIBuilder.Variables.get_readout"><code>get_readout</code></a>: Used to get the pulse/gradient/readout part of a building block</li><li><a href="#MRIBuilder.Variables.gradient_orientation"><code>gradient_orientation</code></a>: returns the gradient orientation of a waveform if fixed.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L1-L13">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.VariableType" href="#MRIBuilder.Variables.VariableType"><code>MRIBuilder.Variables.VariableType</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Parent type for any variable in the MRI sequence.</p><p>Each variable can be one of:</p><ul><li>a new JuMP variable</li><li>an expression linking this variable to other JuMP variable</li><li>a number</li></ul><p>Create these using <a href="#MRIBuilder.Variables.get_free_variable-Tuple{Number}"><code>get_free_variable</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L543-L552">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.alternative_variables" href="#MRIBuilder.Variables.alternative_variables"><code>MRIBuilder.Variables.alternative_variables</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Mapping of variable names to alternative ways to compute that variables.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L151-L153">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.default_generic_method" href="#MRIBuilder.Variables.default_generic_method"><code>MRIBuilder.Variables.default_generic_method</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Contains for each variable the default, generic method.</p><p>This is the method that checks for <a href="@ref"><code>alternative_functions</code></a> or uses one of the getters.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L144-L148">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.getter_functions" href="#MRIBuilder.Variables.getter_functions"><code>MRIBuilder.Variables.getter_functions</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Mapping of symbols to actual getter functions.</p><p>Used in <a href="#MRIBuilder.Variables.set_getter!-Tuple{Symbol, Symbol}"><code>set_getter!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L622-L626">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.getters" href="#MRIBuilder.Variables.getters"><code>MRIBuilder.Variables.getters</code></a> — <span class="docstring-category">Constant</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Assigns getters to specific variables.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L161-L163">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.AbstractBlock" href="#MRIBuilder.Variables.AbstractBlock"><code>MRIBuilder.Variables.AbstractBlock</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Parent type of all components, building block, and sequences that form an MRI sequence.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L21-L23">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.InvalidRoute" href="#MRIBuilder.Variables.InvalidRoute"><code>MRIBuilder.Variables.InvalidRoute</code></a> — <span class="docstring-category">Type</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Raised if there is no way to reach a valid function by the default, generic method (<a href="#MRIBuilder.Variables.default_generic_method"><code>default_generic_method</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L156-L158">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables._get_mult_variable-Tuple{Any, Any, Vararg{Any}}" href="#MRIBuilder.Variables._get_mult_variable-Tuple{Any, Any, Vararg{Any}}"><code>MRIBuilder.Variables._get_mult_variable</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><p>Helper to call the variable for a result of a getter. Used in <a href="#MRIBuilder.Variables._get_variable-Tuple{Symbol, Set{Symbol}, Vararg{Any}}"><code>_get_variable</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L227-L229">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables._get_variable-Tuple{Symbol, Set{Symbol}, Vararg{Any}}" href="#MRIBuilder.Variables._get_variable-Tuple{Symbol, Set{Symbol}, Vararg{Any}}"><code>MRIBuilder.Variables._get_variable</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">_get_variable(name, tried_names, args...; kwargs...)</code></pre><p>Tries to find a route to get values for the variable <code>name</code> with the given <code>args</code> and <code>kwargs</code>.</p><p>The route through <code>tried_names</code> has already been attempted.</p><p>This function returns the route to get to the value and the value itself.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L168-L176">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.add_alternative_variable!-Tuple{Symbol, Symbol, Function, Bool}" href="#MRIBuilder.Variables.add_alternative_variable!-Tuple{Symbol, Symbol, Function, Bool}"><code>MRIBuilder.Variables.add_alternative_variable!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">add_alternative_variable!(name, other_func, conversion)</code></pre><p>Defines an alternative way to compute the variable with given <code>name</code>.</p><p>If the variable <code>name</code> is not defined and <code>other_name</code> is, then the value of <code>name</code> is computed by applying <code>conversion</code> to the value of <code>other_name</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L411-L418">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.add_cost_function!" href="#MRIBuilder.Variables.add_cost_function!"><code>MRIBuilder.Variables.add_cost_function!</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">add_cost_function!(function, level=2)</code></pre><p>Adds an additional term to the cost function.</p><p>This term will be minimised together with any other terms in the cost function. Terms added at a lower level will be optimised before any terms with a higher level.</p><p>By default, the term is added to the <code>level=2</code>, which is appropriate for any cost functions added by the developer, which will generally only be optimised after any user-defined cost functions (which are added at <code>level=1</code> by <a href="@ref"><code>add_simple_constraint!</code></a> or <a href="#MRIBuilder.Variables.set_simple_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock, Any}"><code>set_simple_constraints!</code></a>.</p><p>Any sequence will also have a <code>level=3</code> cost function, which minimises the total sequence duration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L642-L654">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.add_new_variable!-Tuple{Symbol}" href="#MRIBuilder.Variables.add_new_variable!-Tuple{Symbol}"><code>MRIBuilder.Variables.add_new_variable!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">add_new_variable!(name)</code></pre><p>Adds a new variable in <a href="#variables"><code>variables</code></a>.</p><p>This is a helper function, which is called by <code>@defvar</code> for any variable that does not exist yet.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L241-L247">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.adjust_groups-Tuple{MRIBuilder.Variables.AbstractBlock}" href="#MRIBuilder.Variables.adjust_groups-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>MRIBuilder.Variables.adjust_groups</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">adjust_groups(block)</code></pre><p>Returns an array of keywords in <a href="../adjust_sequences/#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust</code></a> that should affect a specfic block.</p><p>If any of these keywords are present in <a href="../adjust_sequences/#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust</code></a>, then <a href="#MRIBuilder.Variables.adjust_internal"><code>adjust_internal</code></a> will be called.</p><p>Some standard keywords are:</p><ul><li><code>:gradient</code>: expects gradient adjustment parameters</li><li><code>:pulse</code>: expects RF pulse adjustment parameters</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L45-L55">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.adjust_internal" href="#MRIBuilder.Variables.adjust_internal"><code>MRIBuilder.Variables.adjust_internal</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">adjust_internal(block, names_used; kwargs...)</code></pre><p>Returns the adjusted blocks and add any keywords used in the process to <code>names_used</code>.</p><p>This is a helper function used by <a href="../adjust_sequences/#MRIBuilder.Variables.adjust-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust</code></a>. It should be defined for any block that is adjustable (as defined by <a href="#MRIBuilder.Variables.adjust_groups-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>adjust_groups</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L35-L42">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.apply_simple_constraint!-Tuple{AbstractVector, Symbol}" href="#MRIBuilder.Variables.apply_simple_constraint!-Tuple{AbstractVector, Symbol}"><code>MRIBuilder.Variables.apply_simple_constraint!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">apply_simple_constraint!(variable, value)</code></pre><p>Add a single constraint or objective to the <code>variable</code>.</p><p><code>value</code> can be one of:</p><ul><li><code>nothing</code>: do nothing</li><li><code>:min</code>: minimise the variable</li><li><code>:max</code>: maximise the variable</li><li><code>number</code>: fix variable to this value</li><li><code>equation</code>: fix variable to the result of this equation</li></ul><pre><code class="nohighlight hljs">apply_simple_constraint!(variable, :>=/:<=, value)</code></pre><p>Set an inequality constraint to the <code>variable</code>.</p><p><code>value</code> can be a number of an equation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L737-L755">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.base_variables-Tuple{}" href="#MRIBuilder.Variables.base_variables-Tuple{}"><code>MRIBuilder.Variables.base_variables</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">base_variables([T])</code></pre><p>Return dictionary with all <a href="@ref"><code>Variable</code></a> objects defined for a specific sequence component/block <code>T</code>.</p><p>This only returns those <a href="@ref"><code>Variable</code></a> directly defined for this component/block, not for any sub-components (through <a href="../api/#MRIBuilder.Variables.get_pulse"><code>get_pulse</code></a>, [<code>get_gradient</code>][(@ref), etc.)</p><p>If <code>T</code> is not provided, all <a href="@ref"><code>Variable</code></a> objects are returned.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L62-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.get_free_variable-Tuple{Number}" href="#MRIBuilder.Variables.get_free_variable-Tuple{Number}"><code>MRIBuilder.Variables.get_free_variable</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_free_variable(value; integer=false, start=0.01)</code></pre><p>Get a representation of a given <code>variable</code> given a user-defined constraint.</p><p>The result is guaranteed to be a <a href="#MRIBuilder.Variables.VariableType"><code>VariableType</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L556-L562">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.get_readout" href="#MRIBuilder.Variables.get_readout"><code>MRIBuilder.Variables.get_readout</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">get_readout(sequence)</code></pre><p>Get the main readout events played out during the sequence.</p><p>This has to be defined for individual sequences to work.</p><p>Any <code>readout</code> variables not explicitly defined for this sequence will be passed on to the readout.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L600-L608">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.gradient_orientation" href="#MRIBuilder.Variables.gradient_orientation"><code>MRIBuilder.Variables.gradient_orientation</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">gradient_orientation(building_block)</code></pre><p>Returns the gradient orientation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L634-L638">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.make_generic" href="#MRIBuilder.Variables.make_generic"><code>MRIBuilder.Variables.make_generic</code></a> — <span class="docstring-category">Function</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">make_generic(sequence/building_block/component)</code></pre><p>Returns a generic version of the <code>BaseSequence</code>, <code>BaseBuildingBlock</code>, or <code>BaseComponent</code></p><ul><li>Sequences are all flattened and returned as a single <code>Sequence</code> containing only <code>BuildingBlock</code> objects.</li><li>Any <code>BaseBuildingBlock</code> is converted into a <code>BuildingBlock</code>.</li><li>Pulses are replaced with <code>GenericPulse</code> (except for instant pulses).</li><li>Instant readouts are replaced with <code>ADC</code>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L789-L798">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.scanner_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock}" href="#MRIBuilder.Variables.scanner_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock}"><code>MRIBuilder.Variables.scanner_constraints!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">scanner_constraints!(block)</code></pre><p>Constraints <a href="../api/#MRIBuilder.Variables.variables.gradient_strength"><code>variables.gradient_strength</code></a> and <a href="../api/#MRIBuilder.Variables.variables.slew_rate"><code>variables.slew_rate</code></a> to be less than the <a href="../defining_sequence/#MRIBuilder.BuildSequences.global_scanner-Tuple{}"><code>global_scanner</code></a> maximum.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L802-L806">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.set_getter!-Tuple{Symbol, Symbol}" href="#MRIBuilder.Variables.set_getter!-Tuple{Symbol, Symbol}"><code>MRIBuilder.Variables.set_getter!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">set_getter!(variable_name, getter)</code></pre><p>Set the getter function for <code>variable_name</code>.</p><p>If the value for <code>variable</code> is not defined for a sequence, the value for the result of the <code>getter</code> function is returned instead.</p><p>Possible values for the <code>getter</code> function are:</p><ul><li><code>:pulse</code>: <a href="../api/#MRIBuilder.Variables.get_pulse"><code>get_pulse</code></a></li><li><code>:gradient</code>: <a href="../api/#MRIBuilder.Variables.get_gradient"><code>get_gradient</code></a></li><li><code>:readout</code>: <a href="#MRIBuilder.Variables.get_readout"><code>get_readout</code></a></li><li><code>:pathway</code>: <a href="../defining_sequence/#MRIBuilder.Variables.get_pathway"><code>get_pathway</code></a></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L386-L398">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.set_simple_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock, Any}" href="#MRIBuilder.Variables.set_simple_constraints!-Tuple{MRIBuilder.Variables.AbstractBlock, Any}"><code>MRIBuilder.Variables.set_simple_constraints!</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">set_simple_constraints!(block, kwargs)</code></pre><p>Add any constraints or objective functions to the variables of a <a href="#MRIBuilder.Variables.AbstractBlock"><code>AbstractBlock</code></a>.</p><p>Each keyword argument has to match one of the functions in <a href="#variables"><code>variables</code></a>(block). If set to a numeric value, a constraint will be added to fix the function value to that numeric value. If set to <code>:min</code> or <code>:max</code>, minimising or maximising this function will be added to the cost function.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L662-L670">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.variable_defined_for-Tuple{Symbol, Vararg{Any}}" href="#MRIBuilder.Variables.variable_defined_for-Tuple{Symbol, Vararg{Any}}"><code>MRIBuilder.Variables.variable_defined_for</code></a> — <span class="docstring-category">Method</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">variable_defined_for(variable, args...; kwargs...)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L84-L86">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="MRIBuilder.Variables.@defvar-Tuple{Any, Any}" href="#MRIBuilder.Variables.@defvar-Tuple{Any, Any}"><code>MRIBuilder.Variables.@defvar</code></a> — <span class="docstring-category">Macro</span><span class="is-flex-grow-1 docstring-article-toggle-button" title="Collapse docstring"></span></header><section><div><pre><code class="language-julia hljs">@defvar(function(s))</code></pre><p>Defines new <a href="#variables"><code>variables</code></a>.</p><p>Each variable is defined as regular Julia functions embedded within a <code>@defvar</code> macro. For example, to define a <code>variables.echo_time</code> variable for a <code>SpinEcho</code> sequence, one can use:</p><pre><code class="language-julia hljs">@defvar echo_time(ge::SpinEcho) = 2 * (variables.effective_time(ge, :refocus) - variables.effective_time(ge, :excitation))</code></pre><p>Multiple variables can be defined in a single <code>@defvar</code> by including them in a code block:</p><pre><code class="language-julia hljs">@defvar begin function var1(seq::SomeSequenceType) ... end function var2(seq::SomeSequenceType) ... end -end</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/3b8e3e657d0bf2da51c78738574860e5ee34a791/src/variables.jl#L271-L293">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../">« Home</a><a class="docs-footer-nextpage" href="../implemented_sequences/">Implemented sequences »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 14:27">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> +end</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://git.fmrib.ox.ac.uk/ndcn0236/MRIBuilder.jl/-/tree/232eca241998cb0f1dcb2b58947141f9987592e9/src/variables.jl#L271-L293">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../">« Home</a><a class="docs-footer-nextpage" href="../implemented_sequences/">Implemented sequences »</a><div class="flexbox-break"></div></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.7.0 on <span class="colophon-date" title="Friday 18 October 2024 15:04">Friday 18 October 2024</span>. Using Julia version 1.11.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><div data-docstringscollapsed="true"></div></html> -- GitLab