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&#39;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&#39;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=&lt;halfway&gt;)
-GenericPulse(time, amplitude; phase=0., frequency=0., effective_time=&lt;halfway&gt;)</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 =&gt; <a href="#MRIBuilder.Containers.BuildingBlocks.Wait"><code>Wait</code></a>.</li><li><code>building_block</code> or <code>sequence</code> =&gt; no change.</li><li>RF pulse/readout =&gt; 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(&lt;name&gt;=: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 &quot;../pulseq.jl&quot; (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(:&lt;title&gt;)(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(:&lt;title&gt;))</code></pre><p>Creates a specific <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a>{&lt;title&gt;} 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{&lt;:AbstractString}}" href="#MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_properties-Tuple{Vector{&lt;: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">&lt;name&gt; &lt;value&gt;
+└─ 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=&lt;halfway&gt;)
+GenericPulse(time, amplitude; phase=0., frequency=0., effective_time=&lt;halfway&gt;)</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 =&gt; <a href="#MRIBuilder.Containers.BuildingBlocks.Wait"><code>Wait</code></a>.</li><li><code>building_block</code> or <code>sequence</code> =&gt; no change.</li><li>RF pulse/readout =&gt; 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(&lt;name&gt;=: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 &quot;../pulseq.jl&quot; (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(:&lt;title&gt;)(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(:&lt;title&gt;))</code></pre><p>Creates a specific <a href="#MRIBuilder.SequenceIO.PulseqIO.Types.PulseqSection"><code>PulseqSection</code></a>{&lt;title&gt;} 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{&lt;:AbstractString}}" href="#MRIBuilder.SequenceIO.PulseqIO.BasicParsers.parse_pulseq_properties-Tuple{Vector{&lt;: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">&lt;name&gt; &lt;value&gt;
 &lt;name2&gt; &lt;value2&gt;
-...</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(&quot;### 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 &lt;= depth &lt;= 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&quot;), nothing, Dict{Symbol, Any}(:typesig =&gt; Tuple{Any}, :module =&gt; MakieCore, :linenumber =&gt; 4, :binding =&gt; MakieCore.generic<em>plot</em>attributes!, :path =&gt; &quot;/root/.julia/packages/MakieCore/NeQjl/src/basic_plots.jl&quot;))</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(&quot;### 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 &lt;= depth &lt;= 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&quot;), nothing, Dict{Symbol, Any}(:typesig =&gt; Tuple{Any}, :module =&gt; MakieCore, :linenumber =&gt; 4, :binding =&gt; MakieCore.generic<em>plot</em>attributes!, :path =&gt; &quot;/root/.julia/packages/MakieCore/NeQjl/src/basic_plots.jl&quot;))</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 &lt;-&gt; -longitudinal, +transverse &lt;-&gt; -transverse)</li><li><code>:excite</code>/90: Takes spin state one step along the following sequence +longitudinal -&gt; +transverse -&gt; -longitudinal -&gt; -transverse -&gt; +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&#39;-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&#39;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&#39;-weighting as <span>$e^{t/T_2&#39;}$</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&#39;-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 &lt;-&gt; -longitudinal, +transverse &lt;-&gt; -transverse)</li><li><code>:excite</code>/90: Takes spin state one step along the following sequence +longitudinal -&gt; +transverse -&gt; -longitudinal -&gt; -transverse -&gt; +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&#39;-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&#39;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&#39;-weighting as <span>$e^{t/T_2&#39;}$</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&#39;-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
zcmeFac{o<@yEeXPpoFJHDH&3fDJ3F8Pep@5A(5d%#zYY!<dH^{jFll}o+?u!qGYO+
zSyZM<$V_DTo$Jx?`R@JQ``G)x-|@b$y^sCLV?Ar#_jO<Qb)DyVUH96TH1?^o&R;g4
zAPCl7JGbvAh}mfbF^k5`h))#Rjgs-7xkvY?ZYQS6|B1|t4Il`9V%PSqT28mSo6opb
zYd@Xtm%6uT(aOC!y8}-Yth%@8p5Q`@cULabB19K8H@{qD&?~rgomKYP(cMJzY7eco
z=NUHclzK)Rn$4hjdGU_jMCa_Cp(f|tZ<mk0-p9BqwDfjGMc3F%#iz$NNR9o_y;Je?
z?CUX}JI{<M7z#nWJfP~pK>wFCGmZT3r^x@)|9e||i7~_GJNq2wk@M9MTrhXrt2{ZW
zU$gH%azP{EZPS9mjxS$=Z{FN!`=RN@iyaQ)MBmb^6U{jeT|rs&pKp4^r}evc?;aQ&
zG&p=XY?EzD4wr5SXDxNZHfHj^Y?qb)@BVMuA=0r5#Ky+PmaH>eOob(LcU<90C}$w*
z7nw0L5NS4i?h_AE$sb#5>m(SIkhuV(dDuKT-FYK7+jZ<=<8FNBGxM2aPgriY%W%R!
zKReSKo}2AH{q!H7iHeDBd`u9LH%K?GmthnjA{+mke`emjyV7|p|7=2w(-S-5eer@n
zU&w52J?b2_my?mu*fpC<5Z1T2n9Iw^pK7jIM4CALvyf-Tm0iP)Y4`4JKeC=6Zf(P@
z3NCaGyLdf|WSvJNJVXR2jD&HK+9H13Ut=}>OH1)jV>S$pkhzM<Niva-Uao?#hIo;a
zWfjDCD#%e4Tv!N8eded%gPg`G3Te3`xQ&M#eOi)vhPDc;@b?57{i{;DJcPz5goi45
zkN@yoT?>m&!3zYTu#Emda;^nD|LYOGHC_B?^xS{Pf$9ABH#@-nXUydC|C*Fq%<O+P
z(;gKDLYqpT`vaf9cG~iH@)iHqI$t-;|6|Eu%|DL{y86eI4@~|Je0B66TZ(bd`EB=O
zrEC67f(!`1tSxllJo(ID7Cv_2@2LK+Uh$2;&&>Jz%+T3|4<ByO4utzGoH07@Uz3ge
zoydAbjsK}1sO6N9UhvCE|NfhBgWI@e+@cvTqpuSJAE6o?5D?(+&rj>?@8?!Jm;240
zC@3cHhUK6>pwVb^Sh$!4Tt>g|<)7`5u#z0$vm2Ug99s(K1h5dw9lzX>`e6B{6D3#l
zvrfb(&&Jfg%*=##RF6$;&6-F#UhJn|28;^fVrHFN)bl>82HQr)=a?`t^RV;h&(BX~
zAOfHLa>F%_qu&jB#y{kpoiEBj=s*8uD2)o)*^8JNA`?OcX7<O6?;rD14LHb;e(i{;
z{hFHB`_C-FT<P1G+*?{3c6q?H<3xTf25q;uw|DWjwvK4RqfBxhZLU{TQj(hX%$}v~
z7V=Dsi`%KanlO$|SJsW)w<185Ae_X=`^=*WZ6gYfS@gd_A~2LBt*U^}VH*#*^o?KJ
z$sdyeeuD7Z!B5*wdK2Ak%vMsUtKsMcJbLPyZOS{NHR<Myx>0(QAEwb*-Dnc|i2hUR
zg)PbDNf8NMrHn5`?!Fp))zZ@+Yew2TYSCHpCdHl_@{Z>v$k7Yp#sRZ+4<AlSSVW}l
z*ciw_gj`Z)4n&Nh-<S*zq0BUmOSpq1lL7YA-?5w~ot?ZGrZe`PAAFTeSM>R8=-f~S
zAC6l@_sZ><3Va?jELA4APy(Vb{X1-IF-$XeAUE7+$#4M^Y?{brcwXr$26CZx*OR`?
zf%%Xdj&z@2!@-_2W~1*%^6qp)k=FdjrKBgQ&8EgZ$3H^6NT(&|QEIZAG)CMa@t<Vu
z(b$43Og606)zK-wW`n_t|CE!Lmm=pe7waODuX1x2u2y(W`U^SLvX}WcZY)|INO*`R
zq{T0Qjb>~}UmQ-Ez$4hu8qT<>mLlby`C>xE4`wE$VEP+e(@jlH?Q=-8I(PrR-+UI9
z4)5UL;9O&TQAGXynV#0xLX4Phgk4wM!^6Xc{0M@#JUe~?_PhowZhh~C61lW6)6AXs
zk8x9BXyp#OZbW&^dCh_S`}gbU2+>YDI*#=9`LmM?6R1i?GSUXc*)QS}6BFSo9xw04
zFPQmCbTXU6sZ(wB^N6?$SW0``Dsli9tCXKhNl9s3Ab_Wfq!z|(fJe|>iJZH!(C-B%
zKbGWpxsM<!upk?X_nM|F??jX)-C^bdMdUibg!DBktJIoHUO8h`Q#fhPlPBd?<faP`
zn!J7c_Tj^a+cO+xk=Dqauwk_KWAKvi-@n6+l%>r*D_^|uK7~M2qf9>QEOS?FvS@0?
zO=j$}w$;(}`0A<5Y)Tq;2XK~!$Sk5J(o|{5k|pGL6P^K1NY-V2Jom(PY`|wS{YcS;
zp2m!>>i8;ufo<tE+rv17_ia~IJ@`3GEnGoPL7^#$TK<+X>dBKQnLZk4DMX)c@ywQz
zrZC%lh(8c3W79ZPAM4Q5INau^#4CF;vfnFzdg`pHp(w3ycsTj7vU!sh2}c4|XJ%}!
zbb)O}W7?5zZK^{qlVgKl{CKyxv=v{AI5%$bqpyXDjpysT`+LUf=FXXuVNvyYp{-#{
zVg=oie;KgyoNM1Rrl(JzcJQrRv&Lz(`Ao3bq5ZnLKZ=*z-n)12ru*yVwz=z_2in6@
z`#&Ni7pUotNGbaGV+?T$VP*A7>gsR2S(Z5VG-@+nzjMdnY#3`LwnK%9Yd6jD96RZ0
zaAKcN?d^+sc*JOHL_{__e7pJ0eyT3->}b2Uj}Hkm5>{>6G}`p|6sIG%_}aCP?K^h6
zxa8z~0}}C4{<`K{O``C+^u0ngeW~t~iFR$p>WX9SqaWRE2ci+bH=St8-W4G9bEGG+
z{RuY{m7SeEfQf-%mpcCXwugsDXH_f~t6Wv>wZQH5$5hPC&9`r-<t$?$GCgr?U*0Vu
zw7!uM5<_QvH2GW+x<cM@VsiAOk=w9#+v;6)sYcW8)4kIMPaJKYUtG8@x34hzWBbI|
z;DZMb)~;QvH<GBIm14)QaCXG{^ywkbSxgBA!bJUp-lsoL^tZk+H8tI}Yga=<!@$<I
zm<>K`D|V}?ZCtvbJV^Zg<5RIYyBP=>59P0vk?w{^$KUV@Jcp&DY&OKt6&8-INj!Mg
z$%#kKzP*TDshZdC>ebxSo%`Qs+9*x^Xj9EEvdy3T+}k_-{Ymdg??)v$xkHNPxh6x6
z8CH2N!{eX4*coTd${+iD%QARAF=APIV|8OjKQC3BvaFYLx;;QW>Ckeb;B%#E^|@8T
z!qekjsl|RbgMtimoz~0CpB?=CYOdE2%(i&#>-s0XPnR!W{xj{&zTLYm8`I-+zgI?W
zv$pQOEq6+B{A;vkw943zAFG6fQuMQ4mzG+*3X?{h@ryf&ufO!;3w|<t&z?PR!ncU>
zZ8F^8(p4+&ths;xhNI6fs^$w2)fBI1#*#}<gZ0E7Fu1a|=hV9pJN}I$uQq)QxxI6C
zfka?n;5>nE)khx2j)!fuuy1`nuSPr0IL*y*kbVD_>4`5&qJ!>3=jX7L<vUJKO$Ivm
zJU;d1s*yJ0Rh{?vj~|C0+usMar(Qhs(QWjt1E%+2n-3f3)9LUnXVZO=vn*v@hQ5YM
z9oIUDl}NIviV2$VJt6QgbJ-+k1*MVw;K90qGY>N&hg*F3WUOkfzg5R`K6Px$wo_D8
zWIub{*4DNyYG17WV|&xl@6GHhHdiMeOue#X9hURdhg|2tq^hE#BFyg$$MC>_y@LaS
zqLi=qwPn&djy-y-KXMQ}yYFmvXt(w#uBpkG@Fidcw@`2d>TK%I>*3*sQ^w=+XTF=5
znLQn@)mNIH7`)0Y<${}I-wdR(va_eYdp4x5G&wXq@n*W>w%j1R5^>F{E+tuQ@SV;3
zOlfQk!#tN+Ol%bu71g|>0|Pgv6Xz6S``uP_Yi#dgBXnP3|JZ(fYLI_!a(uWeG37p^
zOP=9}(pp}-Q{<17b0hpLCL?67@k@|O38Saot*v)^`nO8UcAwX0jJh*8FtBW+d1a8e
zzN@P%;t&2IvVc}Y;pLV1G886lRhwz^zAX27Rn?=dUUMZRBvx!bEy+e3_!$%&Tn7*D
z5KPw3k_io(O;{xyi1pnUJ2*0uk`b|ExT|i{2Q}Su7b=^Z^RyFnbW&M77+0@e4XlKl
zurAxEVZdVT=k?iGwF<^S=$R+r%cpcAeiU9AbG!2AaGlXd_vuNIyxLXDmYy1Cx9hMF
zP9ZASmT|L}zoCRFFc2Q|7c#H#&Q*7v9Cx^q`~IP6`63Pu#C{n3u)y;|Z<ea6D$(fy
zL}T+hhi}!_leb^9Em9h+km8ExAi4v0eF%`E70Z`eNX#eV7BEId`zPM*ZF+ocO8<_c
z+qj?mL^S2-)WjH{+t6E<b-5ZkIx=qKr`r_Q`<d}DFW+d6V7Q8A{_fr`Z*_vWdHlvG
z(m8fPzvBs{t;h|`G~fG?kp&fJ)`*MWk+IR+x^=6DhK7mBJvdvYb*PWe%hCYhk7s-H
zc0b*Pu$N&a&a{k)+6Dw$CiP)$dv~{3?>KkrGE>ooGdH82laf94`Kn>+rY~+>V!Hm}
z;qa5GhT{>Xy?n@4KM^iylq+1~yZ7u#thfb6JaI`l+`mrmjaO~5zLomd>i7V;9gH5$
zQm@bIv2A3dHNF%>GF9e3y?8+5$IsE;=`N$`gppf3n@_J15>jFA$97Tt+5M=o4bGF9
zpPzqN)}{ADURkcTva&~RWlp$bSM6RyCue75xr|2KSkTFu--JXv++~a{ukXksqU(+s
z9Cr%g64#?)&Aq+3&vc5}4t;$)U@>pryhg7NA3h8`+a0d=2uU|GG7{0hbPH`6q9&)P
z&JbMMv^=P|cba+D+yxXWzICj<<odvMAb9p=8%s({<Kgjvay1l!C$xXIF#`WyiP>bD
zlH1&N%qH0kF?Pe;+wx~#PaL>mazJ|ZG=E&~#Kgpn8#g|`x>cTb2J6~Ympc0OZBe@g
zB!pa-Vau_X3<Y6y8KyS5(Uq-bprahgXKkvyW49B6mca8<Z?=pgj+Zbk5!V~4)wf-n
z$nL=zc=KlamoHDUvtjYW4&rH&qN`TSVX899K6#}0DtGO4UYxdGhNX5(o(JrZZvM7#
zd>AUk`fy^XuTSzZg~ZHSz8S$+g8~EhhATAek8NQfK827dT`mp#o>LKS?(@Krf8uMj
z-_xJp<=X;IF%Zhy+<a=O9m;Log~ivF>pu|!uYYLCU-A02@1;w2c6OJpUQPepJBKKE
zz4Xf#af*wJizWLqVHM!UVwbbbu-q2A*6n$Q`Nq!}WiBxQIkzd--`f>1KnI3#3%XuW
zp7s|n$LyV3yq8QNMC<nigYgG9H8)4N4(xI^n7WHtLxNVV3xSL+WQ<5P`j~d4D8s6*
zHa@z$ZyP~$t2}Y+Y2PuXT%T#9FD=bLSYMM4x*ERO!4lDrdJ(IeVcqa>S+As3ZPH6c
zpV#*@nqJ-7v}gBjY$MszyvjXiuqzPQf{{Ohf)Y|XqS{-w9DC`zLeBo)gy2$MUfzWZ
z7xM9a%yF=q5@Ym@zIU%3ON+>I;>3vrE6<+zeq~)`DZAF^2nUF)r>f&LYt9Dz`0?YV
zVl4d4#g?rLN@t2;YCit&qethf)`4GqhlBNg*a9zX%uTqD$3aKxkJF4^FxP8Dl|(L9
zsfKy4Z_5=$>?pANIy`=M^g9T`AfIAFRB?V7K;F;Cj~~Cm#zFK+oD|v<EaCQCy<<W^
zxUbg!#fujRe+YcQ_R2k9y1Ng93)<TD(t~zK)ZM#xMO<AGPjpgdd+6cH9XoblI<9;w
z($&`dYP)xj|NJ=py|r~<>`TOQK3^?u%-`=v`~q5WUZy4s0&(iSdkE42%FK}?qT=E;
zUBkoQYTEo*JR0$bd+;UlW+qX~EM+KDZG6*`OBXahIrH(!8SLt_884CfR;^Q<96I1U
zIIQkI&LKxvZj<88W*s?nD3sFrvzMG)uc&LGDxce`b!KnE!Qx3V(kh`rxjtIeuduLi
zz|ZKZ>)4O}HtIzW52As!6x&n<d>cO@aSh5pjHZW;I2E5_kF7lr!z>_U`$6o9*(~zU
zNl7D)RddOIRj)zx#E<Ns|4MtNsrvE0rT=7%6&Mlk;3vqK2O2gmB?#REnwoE0UtAHj
zu42~R{z@j$IRw}l@nTzP>RgT0vFZ`LimpH2MyuvejdxvJzRBh6*~Ap6r>b_a&iZ4;
zFijF527C=!OvhkhHw7Y*g4X{1H}dnR@ilJ>+<5-Hd2)!o-|iB`NoF5*zH?J!U%;to
z6ef1w1@q@`KKaSx+g)QH5HOLE&e#Yx?hWl&)J8$Tykju$fddCPb><Krg7t9LojXg&
zbiBnLAqZ*4`a|xaBid<uz?Wi>ou~SIlyU+2kinVXBB6l`fM&1=q!{MmDFxUy@hJ-l
z;-`t^($8-ql*}qZ&Yx!#pk-x^Vp*yqx6TrHj%13Uu!Mu-nB-Ee;CVlx_4V1N809OT
z{#xliH5g%E51a}xG5X;wB7qyg9tU;tk|nC!w^xKoCqitrxDR#n7Tob5@H0?!a9$H2
zY4G*y3pqIh0|KfZpE@o;duAN6$@WA2gJZqTPhxX)>*p~Fcub!fXfOTr>C?S?tK@j(
z9j*2B!kP+sDHQ+U;4fWWqV9|N`1p8v&kcUwYnp*@Vg!Br=TPS(vscUH7O=9us;KCG
zcmE3IuG`NMpzW5HmH|~{%6YKw*^#7&dPh`Y->JIq%}*vLC;j-8BxseLr%!!(-JER~
z?c?J!LIZAreB+KCWS<QruB4<i=1M?`09>3idp4Amk|W!<ZwD0)5ZaqAjMN2qW%Ir1
zvAq*GRzX2QcenMNjKZg&N6h`bQs>|wKL^U!9Xoc+Ve_5RD#X6J6a&C$ee7C+=U{md
znVwFL=+EJtMHsJxGxLBN>6ggL$-O8pmN3Yv#(r<N7*GXKIOX8LNky9Q@%FZmx~x2m
zN2tcubsYz$wyG6N_QvKeE4ePnH{u#lS_JiL0rv)zXXoeCCc?qb9+6y%d@p%!!s)Sa
z8W0%#@m&mq=nw$Eu&}VwSbG5VA{Gn4ce3Bl{pMLVPfKXJY)H#iK#db13hk2kS+}ki
zfy2F<#mKoMaA;^KHr!=5v!<TjGEUANx3~!+;a*zWNvxlyrsjs%4qqz;1O<;3crf_6
z9XWaOq?wr+Cf{)q93(Ywr16gY8OzMW^=lagK4tsz$hCg?0>=5Vw1qa00~yvt^lcd=
zz|yj^Z_Q7#c#2=X9PO&>1=UNvv>yVq)Dnrq%&e?{t9d+Z%Qmh-tUVCBFVNK)tMTaJ
zL&I}prgBXHv=<i&o*U~3UKY>kcukpEHVzNHaN$B(KF{Vm5}P->0P8vc>%AkPj>78I
zroi>~AwfZ0OP4wgebp=vW+6OQU<d=l!>`KA1BxzQya-aL(Epr6+l2#c7rR|WRkgh3
z!LgTDdj}Z<p*`?uLS=Ar`hh<^_fisGzkYqqS<y|KvJhI=9nRLs43z`^Q&ujhGjg|i
zW{H^yW2w69Qa|3`6HKGLe*Jn+kl3M|)A5fUos#~rJGSb@^XEwhPimW+4Vdk)8qd6#
z+(#OYbEPb$&xgyowdcKUzIc{sh?s1AW=Tm&YW`FX(kk^L64q57xf?Q4h?@x07zhN2
zT+|{ccR|(8j&wT@zS{K4^*u<mO?}$d%+R$G65;EQU8oghBW1-;%4D=KuZ+aN%cDwz
zPD|zeXuV=#Vev*`@Tya#nHh;$y}h}dPeD00*t+!@@*7g;aml4L3V>Akt5<GF`(gv1
z!9vN6U(5CS$Hujv-ZIlXqGerwq@ku_X_>&YY*TXPP3*=mpFdyl_AYHf!~=|U9~&@b
znL?4$`YmEtQDGs-gOCrl;NCrZtg2$J&2is>4UbI-AivrN*=J;QRLQQDHphKV_aaZq
zNoFIg|H+emAk#Y@AF~lBl>*E-RM9Pm$IQg!$N2cU>B&*9=^cns^8@lPocdg`OHFNP
zWF+&)x`czN9}onN(swMSwY@X|pc_dDSEmWjrWU*|<*)^SK+ZN0pn<$#XuNK%$)Sf0
z43q$MA%JX_le=U;x}AYIxkgkc$q8m?cj1N$1d1Lke(|DopSASX*s53XM2Is$Ak>Qh
zk?gz*PLK(thq{cJV4^Lk65ZbHkl@&AgQNlx7W^@}FHulXFynoMecg67wX01)Lmq<u
z^52ZyCx=l9>Nj5aDlzq`rMJ-*$L{*{^mHJ076C9Zpcb=NVcPrmAN4k3CF?)kwJ)wL
zA!Fu==FM_EvL}uA?c4X|^_^s$0w`7X_V(d!BZq#+W^6_iBWVD!Tf5%$ASbqWbPRV^
zy|kP&)ZHK@Dq8;LjXGOfTN~4YrF}^5`pK{-qkwS)8?VArgzQ_lM12OHzn{yxO!x6s
z-xcz({ZLn(I@>0j#(Q^iXA>TI8{`7d)TbRG*L=J)Hu<m$$jANz2ZYtb#eCx9<6(N(
z`jI_%TnDVOV!ZXrIx3Y4VjxV)kcNQ5khD<Vyt%jvz!6Xc!BC$K0l?MG4UF{W;#q|9
z-uL<L?#9NSkcVG*t#Cs+3RFm_8z)0?(jkuJ%SF$K15hRa!d$v^Y4_!=J=n$FmlgUQ
zCw}yU&2z99*6Z8m-Om&`e*6mzXB9OBSQZr(72!VhxG{ks(y{>urzU@v2Zn-70YTLk
zhKOvqd9MG(5=4IvD#Wbg&_EjXbUc)q>;2%Zkec-5`)f@e$JiH_>#(q}#Hxkfb$G%+
z6x4POkH^KWNj|fOw8Q@WG5AAH%Ct1F$knS09$RZWJ_!Y}?RK2S1l6ybrqFx@;mcmu
zsqYgKPebMX5y=zQf^UkJZaQ)Mb_Il6M?^@s5`Tfl^jm&@>Sks!AYqLOY9Sjl4?T5t
z2H8(J{P=FB$Qtr)Tk+@A)Luwe?UE~3u3W#qALLI%U)#Ge%Qhk~FrT^g`0ri-Y3q7P
zxu%Dvdo(mENg$Fbg4o}Kz4GkYGw59QvT(s)>A^;u^M<OC+AW#AY+%x}X3fGv3ukC=
z6^EY;%2?M|Vs)HblM@rWE^~?oNf><V?oP@{@kubsp8|A;UyAwwEU_^&m%M(hqt8hY
zHEGDp?(WlVFa56A`xMsg16EJeN!H6g8P(L_1l<l&A25Gn3QHMM<Z>bX61Cg1n!MlZ
z5TW29`6G>130*D<$QbqY^*??%9XxnYVEegq=X7=J!9ld@<`Bx9&tJY|UoO*)fJVLO
zGW^Y^;o)i-8J*aw_>`{xm4bpC92|LhdES&cbLI%D`d+<sNz-6)HS%TV?sKkhZf#O$
z!y<<xHe}fv-QS`8sv=Y>;Kq$`kRE~U0GjC*Rk(+R)GQ)y68n>s{9c9Kuj}%ri0fyn
z?b^jHZF%!sPJ;2*$|%HJo5u8o)TIk9I1hfd$O>uEz&_Z!;n1gkY=xNn_qRZZ*nK6z
z*WceCXe`CxNm<L?9ajupI`4z^Bqq;Coi!V(NaR*82&Eiy3l=P>C@((?<XNMm%{mjO
zYrYGW?_CotVX$9saT1bbJ#T>cCq%?CU<2(tPF7D5;gGu7_!JMbkwPLKg^;6dp-B*0
z-7opvhXx1ntOy?HE{bc{#vgiQW|^3fiOAg3{A3gY-py?RG7cwaBXkxo-E_(E)G7Tu
z7l*@#Z#Qz-zWUP95$Nw9nGp(g^I}AV(eB-s$t@-M0FaD)&bhH2%u!XHccY^>S=Vc1
zoiM0z2z}Ae;0y?%r<%jEL;|9~>Q$@aQdo43zBgLQ;B(aesx?$g;OdxtcM@_W%KdH3
zKr4H{f0v-4IR6cX&`CKQpCdsKQwRTKY8nMnC2EBku_|I9L?G+_$90<X&Yr0VSq~^P
z*K4bTL7W|CAoF`OU&;cHKdhsp17u#KV`|4Cq_%V4z7vo|DR;B8e`M4dUb%WzOk7;s
zU<pwW#mULJH$ri;C+lO-oj2`fKEX!k4mlWb$soO=EV1v-=6M1O<`zM|EcWAb2Xm}(
zh%!SVbNNZ&5fCe3A)&ICkoCtlY}jD=<x<vXsfMt8^S3K|9K{HtR(MHrl3vDcHZLzP
zDJiKZ4qY+nabfSGw)tTHkx{8-iIMBVMT_jeH_2saN2x4i_G~<XK~GIhA+mC?@5^mY
zw>V&<*k9|Ktd}tk6<NiXXRQzL;lNBzCD()Ps}J8f6dm^N-5Xd0<gx`SGjE7V>M|MY
zY^aQ&H6<-TCbJkB?N6Pm(eVyLma&uuHUU?nQD&sbYuB!240CM=Z0YO-ATuIyQ=6MR
zJP|Y+^~oAEWAK!~Fx-n5pC0Kx)Nh>n6VwG+Rl82R?e?8JZLO_jbZBi|Ny~QXKN_Lv
zh6ERzBT>!#b6Rg+{hB;OC1?%sK8PvI0#He=hlOpnc(<y?;gH|H*ejPVHKZN!y3Ljc
zaP;Y!7v!2GIDyAxfc)3uf6eCUC+gV{{#L@5AtzBUf|CNLtL)fOYH*W80Fg2q<|%DC
zJ5m8$I5>DfKX4K9IJ9l6=A4W*OKva_ar1;)V*l`ugs%Pk8#iv0l6nLlfA{dt3(W`=
z8NQ_hB>*M&V`Iy=w}+?=r1ft=dx==NiL(i2hK1gI=6h16h&KtH0t1KN?O9hEg-hz0
z7zH$*bbrVr8TUia%gwi)tP~#~bp+(LH*Yd$B8WY5r@#8!%?bomMPSxR2|aCMXlMxE
zuF<Io+t}!tjJAu6ozQ53Q9*%Uc%_H{8a_;%Ka&rmhpXirzG*?8b6kwOnUNXyyq8zU
zLKYzdZT_?0#EhOE9;se0cX^f!LPhob0m=wWj&>4(?TEq1Sm~#h@Q2>cu>)*bD5xT)
zo2KkwfVLGgd*&ylk69|Qp#<gR9)oAl`36cdswyh)%!+H_?!yRQGRS1WNo7YMb7I`k
zNvd_Ut*&uP2?+|effaL6QJuhA?AX2?bQ3Y2Fb;s+A`cFWyy^9fpN6QpO-1E`;|6)P
z*-T6bFvHyq2iTytEe2~u*&##w8Cpt|A0Tj(I1rq}UKaWe=%#ZoEBj#6sW%<KqTmQE
zaKCZjl8!RY3~eY+uL14g3yT&lYCqZc>6x6I93+~g#stg9NIv&tVtkjbr?Q>--o(9V
z5g1>7T=M)Hbj)atf4*f4%yMpW_+Y=W!xY#P_CrdJ#PUjrWuV#n=$Y}|JCtc=G9w<f
z^WSIUz`cD#LuxyBUi9@1DuSl;_RSlTd|M_`Nit~K+S>Xn@UsZy=H_CcJU!3#rJyBY
zXIr)udOsvH(Q!sb#!TCf7y<M?K(B46m#j0$Sw%bP;9&6J=nDX<J9qAA*O^M4-fRGz
zS<5mBC-j=jIt~)3Rp%`N2b#Ya0qvGd4;j#Yrh#(Z3JsNW{c*C!q2V4l$n)pVf#X>O
z=FgvxV8YG85uLM!Q0_66Tzd5AQK5aeou;SU1hz-3TyyOGFxhC88lO@wbPd@9jsa()
zGGi;Fik7^M*Lsd8B`p(@Yg$?w<iV07J9ok~B#T7MtwOmoEGVcpX7BP}Xf=G~I4?mQ
z8>nr`bslU_14PH%u@SZPZrZQ_K$Mpc4i5(w0j{AqTPl@q%z<R8y+YAdmY<(rUS6LK
z0VMSHZIbOKB$u&;Oza3|@kFU3DV-et(T9%<ew<rbK`JVfKS$L8D%eK58`^q%-6ww7
zA-1BU%VQXF<mxqRzM>Ay!LC;V9C4~O`F=>!*m?^<my;(uJ3EVeUIL^<_sDvTk$Wy#
ze+e+?rjZB*=MA#5vTN7waxid0f!mlB$QdC5bOUvQG^;uZy%OEqyAFB`et824z@|Az
zo7`D1g4P**NHtP&R=(c7i)+ae;b<1I9sikLKnr+#cSk~3;jz9528}ipv4J@kadNKK
zFG;uksJLZ|8)$k$*F*hcw<2T*c>vCkkfqK|l0?DVnH~4)w%nuaY~7pk8O&UxWumF~
zVq=wts}GQ?#mCJp2LTp63^fidQOq>uS2;5gT5)>f)IS&o7H#yZI#-a5nUGotf9!Dv
z!nX}rUQp$#Zkn+tkK$<4DJ&SEwPoVNvx<s}p`oEjQ}#<C(B`{OqmE->qwTa55zy-)
z9pR%c)d8e>6p4(i1nCEQ&1`-ZxOB(Ks+he30s;V#2Y?z2ERkhv5H+7a-!8`^Wv1rh
zGG3*wl$<HT1iM_RuC9ifSki)o351Hmc|xX$)<p!kn{ac~pw=lV88NqXcjtnnfvCTu
z7Ki=k+?VdkMx-74!&*4lM=}B4;vt$QblLNhC>7kGu>vKx&HVhIx>ECX43?-N?v)1!
zf7llyxs}(u4kU)mEFdus2EHW?4RR6^`>wRw&*?>9Cy7ksw)Xe;qnP1uwYZtiU!q?u
z(ha!UN|KuH&n}qkbwO22Q76qkeSC9`j{u)SR1M!`8{U2N9Vt>=y}HEE31EgzeC5hk
z2nROr?p>nXg=Pbwq36d(cx-vwH4N<cHYcRS`$~YYx{g8cw&g(SFieE=XYT&Umv1m|
ziL(=tGDu@VCibtNk?jq&LK=zc5sKX0+z;>gInFNu&eq0o(?b4ITe@PHlq3d44d|a4
zY|IZLeOj8N+~EgDcYukI8!c00Cs5W=<UbHNvfDxKrtk++ZB3pZ1~zc~_;HAI<t^an
zNJ`*(i69;xJ8om^tXZ=LpoHz^wdKKx36Mzfkg9CEHWKlVe@nCv2@gLpkvtE@K8A8#
za3a!0@+AJSazyj^6qf1Y@^UMLGoa7Fq9PympX1{Y1C4C7(G%12A@BXikJHaDaZs7>
z>|3&8Mc$F3xy}lkE!oHBSRl9#u-rI&FvI4(OpSxwW^7-H$IH&mXe4)=SS71vK(f&(
z@LR__3=I6Kz!M$;Cm<rjTHD${@zH_0mWCKVK}v>4kD?IxEl1-)Ny$!|dD=4)3j(Ot
zl8#D5nnMsBr7Wx0BpU^lE^@BcgYe^GZ$A*AuDF(Lt#BExIS9FcWEq+Fv$LI0M}lPX
zu4|Zj5$VbeX%7id%U}ubHkm_T>mNi@3XLTzKwY|Cv2`KB*9fauk9|u_ZLiF}#ATTe
zJr?u=ntLfpFA6cz<{U6$LU}dW4uNbK;WiS=Gk5OX&mA2o#}6VUtqx5;@-f@)7`d_r
zIrlO}UV>LAtQ8j*mz3=L`ZoG*(|Y+dPN=7lY+Zo}J5IuTvG?;Q2Ck5p)6b#3WTBE$
zJ{l<Yu?ee%_}{!)4WxR1N0j9<X-gAVjZ->0K~Rwl4Z|A~cqpEfI9~|c*sJQ{PF<fr
zXIj>X?90v2oB{UNkTJIf*e)eJ^uFG*eTvfI_0it;*L}Dg0r()${e~HKk4y;3bqBK@
zR<yFR5`RxjDSyy6$r-n-fhx3eB{kgXJ(3IJ1u$Vk3QJ9FRVUUYeI198l|Mmb>^^+B
zY0tX6(?3USNOkBSm3qEbewmEOA3jZ?F6QFehYlbSk;~U6bpVtTK0#^Uc45I=y%J<5
z6I0W%pFiR6Tmr$%k@M7UcA-f>j`i~8%Q1Uzjf}jvEsx_5o@56bb1+ErfRqck;`pt4
z7xN#9_XiRmQmO!j*|Q8Kel2ixq$5$E)Z76y(~KWb--4yn_20FPu}$$a#tak-iLEy2
zkf09&CW0>3R9l}@EDos?JDLnPMSzM-Oia^wyk(+2xLoA^k?+l2U%s3{>g$j6uD}%J
z`fI1sts6E#Mn#p(-rV)wdO|r6yNGG-T(jfH%Ufn>aQoY>X~GEC^+2|nbAJG>F)%P-
z`;jq!HWj?Kt<8sZxzO>;Gs#hvg<D<+Fc8%Ed2w;swrlF)3ZMu#Z{EBI1ang3uek42
zNflC5{7_SaycoA|VESnCD>cx1k|?AYB<4t*E#9Q}NfU${Y7Pu5)<BJc!$5h8khQyu
zefCIA$TJlc4wDjpw2B}a5Ik3!_Q;%Ql6@SU1l9nO8|!^l5Wt#bdI+3OX=iTANJ*pd
zP@x(%OQ>AwCZ&ty7W_sUuwjx}cm0D#8BKbQjBj3s(o{MyByx@U`be1f(4j*`7g!G%
zEJ@maf};n83#XG-#wa8_d?F@xMVVQv8*q_r{(Mq^q4R5mxXege8!3!eRDgH~kYI*n
zd4s|Xg!C7bu-wLn#wG^ebfC`T39CY7glLik3E2_P(i3ceeoeb@0cEVz-B%uN!$LC7
zP`zpB`rZ_}DjvpRyF%w5Ivh;IzF>iZV|NJlWr6Ps1t&@1rA?a-vI(wS38CjLDn^L5
z^8%uU+<&w%Vb9*Yxi~|+fg4d!1oc7%g$YnKDl-Ig^zQ;zG#JhHEp2Wlt44alQB|?(
zklEzduh#^gG4?^D1=_=0L01K6j~)$TN*PltPpSdC&OqlG9uEq45U4vxf~-tUsY6v6
z>a6;B?q|=tcl&=+5tXY;qjDtTgx^=V{s%3Ng-c8WVYi;$>luZEL+VH&4Rd4>AX7T_
z4)hohi;O~qddN0mGBzT-u17%UZyMDb3o#1x<*S{Loijr%zSZop(2O%s@#DR7{d)gU
zl{$+6S|_6K-ZcXiMgJ>YG|l;M7RI3#>gn$K^@4)YM)~Iwx~Srd7B4oLXto9hX}lpp
zHrF$2p4c^x_MRI70UZWw3Uq-*1_lPkhdKp)%7fSSqEG;ORE<KQOb@zz;6e~_5_wQ8
zMElkkG;+Y{ECm8;^o#fMY1m*teGJnnb@+y_etE91pa!N2$U2C?UUme1bx`|2+XK1g
z5Sb!^f<<+8qXnL`>}3Ii0h7?w1W;RhV{!%L7gKkpfXqI!f0ZY!^nuI_rR=~hgKph=
zUlu5ea?G0d73h^n0Sv%SIY^o}1mP1+meXj0pfV%Xf-i|lNT4|k5I3%dPA@7hur4=Y
zatiQ@*3_O&l}(wcL0JfYD0_4QWM*}Z!!xt(Dk_#)4_N+5Cem2#g-5`jfMdNW5E&qn
zjKTqcIc}{-uM^62knZT}_snLW!KMwo82(KtyC|gCFI~1QEHt#?{+=aZgr66z*t}6(
zJQ-+@%Ix(_64jt&C0^pwk>5%7;3@bh@FoH!jDL$`rXKm_i?9y>8Mg2fyS59B3D#_$
z6kig9dU}$Z&wlB`h1Zd`?(O2hGgMG%5=V2R_Yy<@B8+(i^(>Gr%S1*Gy)MK?e20W_
zJWv1DS>D|>PW-E6$TdAVlZt|Jf7?qSX?<qeN!eSQY}we@rohAKwIcwG+fFP}(w5cc
z07te@$6|QQOij5r?IZ~EcYi3R+-)>OLd7AaVT>#0@slU1VBQcoPjoB&$rp&2x3==r
zW?dII`K3w;Y{x{;^fc~Z;npR$=8e^RX7pMyTK35ns;;gsvfZ~FB9iM6dXpTr{NNgB
z*o1J?9_&<rirWcT^OlUwKwlq)ir%?nq%Iw1qOfdwPNC*ZRy<@SQ1wT;!X|WFJp=F6
z75ZtER@8}(6<@t{`SJ}Pu~{C10pcb|t0r&!u-36L(EBzc@~4U7lG2hAr*HAG+aJ4k
z^fAM&Xrxkj;R5Q{hHOl%%Wk6n9De{J^fL+W>G!LJ?*lao3*TobSl|5A?I*;k+88S+
zBp?|Rlan<%bDj)A6+j2)@b_kYwvKy4=we98OwjXHX8tL>>2ya&2ecU;HVqE7&k@(M
zk{LasXCxGaO8NG_z=MXn)YXGe$tv$PM=u~0PMK-zhc=w(oImpAs=i`a_W+}%Zz-F0
zKyfDViQlCBB^pL9F+Ise=2>&bnL%3hyM_U&ZAZC`4_UMoXG%sr@_HqXPD$n?Ow;_k
zCw{c~A!u!JpPE1t(!&`r7?318&qaLyG%M*RN5m>DK7r@k*Fy$JHn%!Hi>O8G3(2$}
zdp>J!-lC{@uI%R8ge!$@2q~y4=%cp^KM7V0)`6u=pP<fzy2s_L`APOQL`3vLiBq@m
zfx7WDRPsn66nAe5FfQ0>*5ecBb#`u^O??>{5+Vyl1W-R{`Z_!p5et<f<7Y<4JCt=b
zG$c*SZUO+79>JiWj(-z%c9AtUMI`3i;*#D}5LwkZH4vOX(PQf#ooFbI3PnX!UDrqF
zFL&T~B}agyvuxgf?&<;ukXPY%r2)?_;8UD{V+R&p;t)>JeNc$1sfDJtvG={AO^Z~u
z^z_CdHslSx+p~d{lwP5oU}PhZ1eh2)+S?bP6o#&%1kvOeOk%XNN_CIdOvzD@l^O^z
z2m}lydy&b;>;gNVM6V8`$K>M~H8Eo&S?vlAR$WFD0pWP_>J=*sOF+@z@CQX)8@+sF
zqo3%(l*Lq(0L(CfU~qR7sX=F;n_>@gf$1h_iwZm!Mu$}YOTI*j%(8b?Rc>x>s1L63
znJH7Y^D0$aLITmzsRhzp<pZ@Em2l8TXi-E#E7?{uBdN;qD4lafJrB4aF^j1VYzSAW
zMJO7uN&O*M8QL|xXv*f`<IA_G5)#;s&Jy?!5}Hl!g(@iRkSc%yQO)L}PK>>APdT~Q
zB01yei_4gJ=@UheTFj^YxqkJcUn*m!#6({aJDSMBgAv*Y7E-~)(qlzvGw|Y9(H+V-
z|4hwPD*4f;UuE7C%?UXvdY<db$hOB%>)glC$$=*UuiJZ?J7W|d(5FGUo0Mb?AJq|m
zkkj5DO%fkFy9Z7uMZeY@G{SBB+##x?ehce<|MpGfkM2*$3q+bnc6N4OUmqmVc>)Ss
zws0(31OVSYA{-e+LOV6Jo5%e)7caibyJfSG&;^xMaN~z$W8bbx_~Lyi!hTL>8XEq7
zetwjrh=+|{P&)M=nv}*yoD<m=`~ZY^-68yXV>Oz*6Fdv~=n99bZ}q<19&lb*34k=o
zXkMSLlv%}}l0jUYIa2)f>(>!w61o^YEN}3cLcVphus}TlZLerBhe`s>qTz{z4H`_A
znp?N3j?d!|YRY#vaxf5iYg+vP9gmw<uO<gcHYy!cX8_-GK@(7v^wG_Z-MWC$NSI_l
zEW6S~<&RRdu;?KNK)6N!#r~GiUg<j1A*4}Y_PU@<R4Gv~slop~>b7MN>%!(;mp}0^
z)AI;295eyrM^-&sgEb>>kc|S+Ujh2$(8siU=T868Tx03e+{p<rM*cvVXroyj`m9f&
zyZA&%f(?%4>;Wtc`f`+gsbu7a<As~$<<XwBJgcLp>G7cZ)ED>p0$9C_6mjZBa&6J0
zfz;7a7RVX%EbNi{^i)BCa_HQSOIb#){c|iR84;x`hRC)K8jYmQWI7cYL*FT4U;0K_
zBm-ci>vJ`KqGWjzIovjHIEaV$4}`VRPLSO8Re9fS*|*3D0?*y2N8P78)!h?5+`0+f
zz32TI2nF_sVy;{%N6JRKc34CN<gUjjTMB*hB%un0&uVFJ*UB?8_y8AH8viONckK|u
z89<uv@=dSz+p_6yJ#?r69lEi}jzA{;?h`NF>nmG!I(7rL101F5XGu&-diXp>eUFLH
z6+=W@0rJzw>8a5(ADmSkG}$h57h38=dE%S?p*m*zuBhl(O@cPa+~sd~r>=3{@ICb^
zPulVp>M*5OK*NHkJMnPziE6d5Ag|$U#TjRV*nM~4MZ;g;wxN&{qU3%~O-;?j#02yR
zq#Mmid<F%m<hc&C?~<CD$D08D0~KU&a4_-GCMHrjbHIYQxw;yj?a9EPjq+TiH*DDN
zph;**lMd}Z_1N(toAI^}E?vpE7>4?efxy^Lociy6yS$j6vf00|km@Wj>Ut~NzM~AD
zB<e~A{dDCuH1qeFJ>+DSCR*6tf4=_+Q3!mktF`qZ+7q;^mSKz-i`Cn^-Zwt7h1jAf
zPj<Q^iIJ*84i^ze3PbKtJ4mWyz^t(s{Yp2F&q4ftx!$&X5%Y?j*rgpWK-bHrtBZ=F
zQ8*D||NQy0PW?pRwM`$;P1gnVh#u-K0^3iYK8-!Xt6u;e4&t@gSrKC(W^5R@+SAW!
z=Rn?QZzox(wx~u5qDXdjJ=kXWLdHlc`Z%VsKv8bb2x~2}W#Q2y(W;|G5)XVTJr6&1
zrR&-k(J6>dy|D*x>bi#U1$1X(8!g2l$5Qn-cjW63cL9F^8pz(m2lBJ5Qp(p5x;!`^
zS5FzCG_KFNT1c{yMzq2TJZ~xT5goLxK}bQjEAL1Z6bYOZrni(meDp|M7cJlf(FMx~
zK_ZwZ0L5YK#S$Zhky4xka;o<ud#jQ81-3&a#hKw4^@#7Em|V!00AyZN{;G@4Oz|&w
zrpN2@6_1XnGuuHD_EQ{>E9B!|Z~--&kDlz(wZD4-a-F51TT4lyx<3etHiZ^&Jwddy
zLA6+q;Q21Y>fqz$eF!V)7)(h!a+Oq?atB|_v&*kM3f_Zufq|xcOsk}6>5?T7?{rQD
zl3z}fWsE8s1EnH$M}h6Gt`p!UkUgvi$V?9+32l9o#k+g1S!9PTDnj!F6p?z^R%~V#
z_~1JD>eDA<E?;s&IG_FXWVlo7B?JP8?s`q;>$h)rx3yJ4$Awco#YlhxzC!{-gM^BT
z3R%WFaKP*Q`Kw0yX#E950bxgDAGsM7<ElD!l5|_>ipyH(`Ezi4;uhN9x1%dc&C$^j
zo%sq3t!QY(ZUksMLZud>K_90}!RRnDQZ%Zp)M#6B4hOBU5GT)^F~Z4|e!KIaMmRQ<
zP9ZIV9hNnq#D-gYd~4yM`Zyx?r9K@OL3tP48l63;p1r{-5bOcKz2q$|P}2-@PCE~j
z3VTz~G2oK-6dhi`A)A~<^9&;(d`d1Q{RT&32J)}qh+91cM-Pp+$@*0K9unxJFdrdL
zeaql@cEJS-b5F>xkYd~l0t|3*(%wE{Vozhbg%mV}FwuF0^&ZT0%*@yi7;#eoYYWH)
zGc7F~17lbG5xILEx19YdbkT1FIhlH?G^Kez7=rdKoDy?d8dg@|!t2=GB8aZ%us9sd
z)xvnSjS8985}y`^2+)SjjdlZh19tQES3reDMmV6=mB>!iukSgqURIW@Hv2h!1_MGn
z>>R#(Xm40aDRfC!24`CLIznlB;hUzsvzzervMR-$!h6GpaCS|hH5BqBH$Lps7320E
zHs7Oi=MLW~VXBov(QaWvGR93rF>~t@@@{4P<lUZB`%UsjuU0u>J<9{n?SF8l_6I*&
z?B{w?Y7dMlmym}#DLAP}l#>t7e!xnYwR+*`_MzESUG`0xI2h;Z&q$C0PFK9^0dCwz
z*_%8Ztcx?WwMF>0<N;}!V>lp89-W{KlV?oL-kk{0p7OdWZ-pt5gZOXn`ZnmQ{judZ
z^GcpTH3gB_(o{c}ka~Lu<xu({=*K91@1V1p{z&>M$v@XxyD<<_<f-g5^!X*lF7xzX
z{+=+t`seTTd-ZRfKl69;8Il}Uy$nPU4owc9#B(dQpF#1E{#^11Zs?!69T?*#4;6hq
zy_u}Yq3clEkejGy#=+8=FKbN|XMRdtKxonaJS;FmV6kf;gU4mk3iJWZJn)Zs$(u{r
zNp2wu9>U9b$uqHPw?E?j2K2!X=o`((r5X$WJOgRFlm)*<y8Iay{gi0@fD~=>ofPCJ
zlHo@-`^_Q>aM+{vz<q8impp^A^XV^)Gv+!lw*3A17yAf}eP~)IB^zv8)!3>nBV$Q<
zO!R}$wFmN+zjyUxAmVrDg^`DEJ$938mT;zf_Qzv{a>BcP*5sk_$VI<L%tIa@6$4@H
zBG2+xXx_h5f1X@w`q#{TnTXGE?_%RVy<Rr+o$zn3DC7dKB4@>=`pZW?lgD|D(T1Ws
z@8xlZUuNg=r07sjDPW06i(L_<6z)!#+;Rac%5Qg^_1EPXRDl|g8ao+O1(NPHdiwXS
z|L5QJjqvy1Lllj|>G%-xY_`V>xYlYw(t-2%Espnl5(9k_qAh0^;EIgVUl07jJBygk
z&y#0Qy<0ZO<hp1P<HPOSwPxGRdG@SXhi`=qXRu?i#q2Y7F%H%-oJ}e#GHP_Jvv^I5
zGkR2ui#fHPyG7M#KG@N;@cNEtb5>p~*+=Cc9aWvoRTnB}ZU2z-IOfA>>fMAB%^ZcN
z;?&*L?*yz?uO&+4JpC1Rv2zc9V^JP-dN^14^*mbprP6-l;XNwzfBt3Hquyf*^>Z)&
zx$@^y4>9hu>@!!Azc~NC#~~GlhwY`y2svTO4dL&{{&B;9xlEbafAxyBGgmFo>81_e
zWcZc_H>H1VxeMR1Ev6ou#nfh=u*)S#lauQ4SyNy(|Cia+f$iQD{yiczqW!k=&TuE6
zfBa(owQz{ndRBGRuUV8{kccqNJdInyN69&sUik1*SDibO?Y9vuM&xN2=F0FS2LDrx
z0?w_9bNTmNxXMWX<>);Q<sg}K!C@0t4<USe*Q4Xy4t%pH|1yx;U!!_1Pa_UJWD}T~
zgUV(GlU?2vkJ}u~r2%H^<XdpxyMIQdSntR;OT%aWuZx#&E{}tGHfu36&{xKeZ<hb+
zb;oA?9T8Uy6MgFU8aSz=>xqTGhflwflS<g{<6ouT^pY?s4UnGsC2R}*o)=ApXI2|y
zF1gVeHuHe>@8<orV2J7BzrVy$82^l$15Y}%|JU?Z&D`(v`f5h{q&To5VxcMAGrtJl
z`Mc7;y#=?TPXN>QU;WQ9{<aGTOVzBu1C|+5jERej%g&ai`R~5}ZjTPJD)jew8!G1?
z>9bz`X?kFT%r76&6Ih^fjd8;0w;x!4J<Pn-oAPP;_kjOvFWDGP{n{X-Y!h^cpc{47
zErIA0ro?&gPKJw~a48chlj`IJ%4w0J#Ci&rkM$0V046hG6k|1a<_nW28{HNtO93|C
z+aFJ%qRR~$y34sT4HjYp7M!DeA7K*BJ*(F%ii_B|150!DG-HX1)Z7nDutV5NY>iHV
zXpH<-BwPXwHFTF=jt`!1#l^YXnEhFCVJkl_Y)IPnRdH@4w_nY9-^Cs=%-E;%1(apN
z*7qrX-N|5nS$U`8z2G;XgeQsz4#D>^PzsZ$ziXfIa{fJ=_tS5}j?YbYsm`ZA>X~&X
zap>LknX4rAH!BC7zDIv9AGUbO4Ln2^5AkAp|M#k$A1^LmVq2gjcS?Y`7ys)4^smBW
zFM44JA>u3kJ`MBu^ML<)7+y9WVx2n~E*8yIFugY%ilZzzwnUzc0CgV$(W<vhOval^
znj!H3+n>m6Fq4~D$)3sZ@Sfltem2G<)MVWUt&pTvNLy;*P_WAv@~jNb1bS0ao_x;%
z!k_+`KYbPq?bLw7-}x7=(n~Xb28KITDjY$hfDWAf(c;sKmO~VICL!&UbwV)VRNV(h
zaomwSYJt9RJyc64H|eQ!|DL4KYiP4j<0R3eKq*9DBsw-TI)e0T70EM)B#=iF(*z2B
zIMg+Sr%8y2lnv}jj$J?xdv=oXYORMI8%#BqDfH$Jg6<s@X1zdhY_fX^A!OWt8ymzG
zoC?R&^+t@oJ(KypMruK%aWKF60@hj0j#(dEtd7OvbY3%537mBipuujkKYMLHc-f>r
z{k2rvR02BCnCQ#9$d5<vArwRI*G-_BI0!a9?8UB#Gem|WftOXTp&c{avC)ECu?9*g
zD0kM>)aO^;pAfh9B96f)N(Uh1dQ%{^NTJFnr0#2ZDI?k7$q4$KOZu*Zc5TegcYbs~
zk;3@PM<lmGo0Gw@UrM2X56`<?=cACbHlaCY{O1xe-9A2WK51!b)Z8rkygHX(H(&bA
z<)JH=au`AuoGOI>qw64gCigNQiM``!`GFH>v(U7pcl@}vcFk6%6<P-lRDpXG8_HJL
zmzaBbl1Br((C1k@ZAo<5l4oz~Qt%RlhDiIvNl(#vYaZ>qqSN3^GbigJ2E7O^5pDcv
zY26H{DO{9@=0eaQn@*i{59*k^uL4|x@9wp|G7a~p-l9MA_POy+)^mNNvq>5&9}Av*
zWqS_Hrx(pX=L%`_^sOK4@cMGPr_llD;|*|(9fYqg|5>P!TPRAU-~n|QQu4Mz5gNoq
zbV=(dh%=hA%3yjyC#dBV<^c1~clU?Spqbnr5+`doPFH-~<QTvFM0U$FCcXs%P}5w{
zFl*hNK8szU4}P1Jl7hCqpW|6lZhRb^GF_4r^LECdL@})N_@u~fVzJP)`l_AaP|?@s
z@+~^kRojCO$mB<ZO4EZ%iHV8JpM1hjg9K7WDTKcMSn*M{bzH?Zl`47i)Fc$LFB9)Q
zSK&B5n3JeHj;vw(1)bPqfMU?_c!X>1q2nt~S8jcfF=q`kNz`(k?7%|3q6>7@Lyv#5
zeKEUmb_2HV<ttaLEG?HUph4mugH)h<_6=@l`?w>hIAsLtEd0DPUh5l;W8aS=zA68o
zpJk+%P+g9rBaeN{P^IiLVpT2bJ7}!dgGgd%_~D&RX&Lqt-2Z*nX;BX+ZFHVv`GSH@
zRBDJ_)D2PGil)!p_a~lsQ_%PS(6S~$=*=|L{pCD~+*EW(J+phcA`4Tx11gF>%2&4@
zrSIxGB(RZxK0$;DyL<MbvXtFd$l@pWIb;iZsZd_2gSVi+d~l>^yRZEBY)T=HE|3Ed
zQa{&~oVBdUNL$;XaGtR1<ZvAX)w4K)0m2v3rZZ)-MU=LDV?Ow^e~_QDuBN8l1ZM0|
zt%*JRo;<^hWxcvWeq=O%nrx*3J+<6Z(Lo-<fY&aeW_QNif&_K5rGoqmq7W<Z<rq%%
zez>(>5=I=nCELi2bWV8ab_h~HjEBerj{-a=3m7)Rr?3Si&;}x&S${Vn;TyaAk8NtH
z5pN^WezK#gKukZgJ1*MSQj9}FH|<mP0d<2+>qC><Hhpk9wlVqZiZe}i1q@8j8}*QV
zh>P0Yo_!d%JNiquF)ulM^4auM@3f(P>1yo9M%GPDeW-e?+O=L-e!>YZ+je5E1v-$&
z7OL_rq=sxT-HqNAM8#noOS|t!vP*=mZ|}2uQFt7|XRl=5Cyg8@y+AZ2dnN7UYq>AC
z?TWbrSuMIVip)xK*^aoxg7p%wIL`9t{`~%A8#CFA1Yy=nean7B!zmoL&qN&nh9}v7
z(<}aD^yy$TzTM1<>ie?wN1q4jpJ+gf5T2C>KZPpvBg_3~7Rnzy&h6K6oGa<TEb@rt
z%~A4rb(Zb+o71OOZsFQ^%Dd7Z-TCI>^|M;!dviIcvI8Z8n;OldH~Wx^F47U@{QM)~
zh`L)w>W|?Z#YcxagKf<4Wzy4eMx1M%ArH0wh|daSf<bf>oWV)H?^~lnO?fvYP%)!J
zm$T9zp6+~S?(79S#y{h@do$!n=c(3H@TJ=)3+F+ZeE~-|(A0c@MZ*~YS9r|T{YOpE
z+5mA`eY&4?A4C2Mzlwk|q<ca+s5LJD)xklOinlSptq5{J=ddxF(gbLb|6epN*s!Ku
z`ieH#5Wi0U+(O7?#a!`w?(hF{=ZqoviJe_PO5b<JHp3>?15ZRmMQ>GYAGn{8kdTv;
zgEHQ;({+(U6C2T^7(e}U?~)*F>xmK1ri7%VBwT~0G*MBj&P-xs6fRFlC|j}cRn>-L
zJ#gUDSktTMOr@PfRb|s50fp|gqOjc0*hQzRWLqDYzrBkXO)lc3s#8o|UL0;X{gaHJ
z>FA`LpYO(>h4xGwXC6Ql)za3^IIT~FrJ?-HckV|N4h?6^^6e>mTh=a5(K&b!k+-?d
z@T|>7_fqcTxBFw2CgV%hSGatQ;`UV;E}E-)f4?kV?FSv^0P>ukUQRgQF7@q5AptF;
z@1MGzB_D<!9x^`Tg>KC(8b1;e6Cv#(=bS#Yahu_+7F3Hiy8h_nmNKJJa!z;J|Ln<%
zfWLMPK09dWyt?SEx%8FIqMtR*A?qA8Fv!C$O?KyRI$gCl`Wjk`$MZi9C3*p348Lcx
zPsBu#hf(^(k9aeehmh96gOIXQ($lM9J^$E;1L%_7C*PB9H2LiyDjlTCi?v5*!Q*fX
z|L0{2<>oH2U|K|^^MIXj9@;9A7*1kx0yLaInt}q~==k1durF_-$u!(_V_ub5G(l7<
zJYXt>j=cge(|~T-RT));Jfnn`@$CHTI)ZnGfaM5&wg(?~`7M+FhA@e4GdFDgQTSqZ
zzHjZS-&gcM-Ifi<#2anoX_7d~WZ}<xpY-bomq+)xpa@E)ZRV(l4+ju5&AZca!kXvY
zkCq3Sv<ShOu#)RZmI~h%=Z${2)sil-?E*8cI@o!C=xJ{a9BB9WeCbTdSMuCN*RVzN
zhIR7S_gw-ZBa{c9FK0$T{8sJaH1t;Wn9W?J13;PtB~d|Kjh#f&7{VgvwTI~+ihBAN
z&WwuuC{&aNuupi1&7&=r0P7%>lV(%r2Lte9OE3y}C;lZKmX?;^c(lprN?x44Aa!8^
zeT(6Gy$hFA=(}hSqre=1B7$fYr0lQUpv7F}De3YCzt?Mgzqi)>nl^LQSQ@$^psS9Z
z;39~09P68t{9yi(&3rBp(ulCV{P!Z0)x9M@+AtCxwN(5DR81(m;vr!mg~W4Jd~|;>
zocuS*a<}gJlDC<YdWF1bgdE8+&cY!+ax9Sz|MDGax%jK(mp0zQm#pj?=8+aRm+|yJ
zA4A%we<AZ)bGm)_@R8XO7eskK^2&!)^O7~czIK3|{10YKzL+cKAo)u-X^DUSvXQ=!
z^lv6n%^UEl)sk@B<`EeD%-9cwpqHF(9lBR3{)@r>%|~HLl=)c8N^4yBs&ELaN)E8L
zzHo>ft^byPKY`l%dmH}z-7E-EduBHFE2w|wUEA&t@!*#cYIVIOCsqIa`qw6VpKe=2
z8ut-7Q=#MB(s;Ms%rgC57zc8HkTVg#GnxdwjU=M`E8jV*lb!$q{%;pi`mto*-vzOr
zSrEFh{+M|q-66@f*9%~&0(_ns#$Ox%xiVd7$;^V7abO+yN~oohi~33k!}w#<<kI<3
z^t?%a3I*lYqF)o2hbTf24dgffc)(u+{C6My!%yswxcnRI{hKfE)nT6V+v+-6T3Uw>
z^H6u*-w(XsIZ5A&q)+9{4PL4B+re^9v!;z$(SENdHI^LidN}OqVNqJfN8!c4z1?7P
zepLTmcm)S`Zpzet8W(ws+Z6K3;FW5^+sF}?Tu|N_MK@dsJQ;fjzHtd3l}pZS5R+~E
z_bO|Q9I5oh!w#&ZFEn1&H{amGj0GFWJ3@FNJpT0-f9{$y{%g7R;SvAx%irhy<6=%K
zeW7PA<}5tDfj)I>^1BPl_t6u%4E^!mo%ATP9MjuJ4)5qn%Kop2GNeK2^D5U6*ho6)
zLjnAOzQ%Mr{g-3Sj)<wef8ZnF0bZr@(p<1Hn(hkZ{5q@8yx=@|*zN^q20PsXG7Grx
zSDNm0qpt(&9Ip8WD9GWJz3)CnLH+G`ydJwWZ1Mg5@j)lHWumW^%AEX($)Z_AL<AWV
zM+6M@^cvsUFqjwq2lUQhP6bOxL`2O3tX@Ayyj_>~hOYoJ6ESZ!oSs;9lk{7E4f5?H
z%2d2I_J90`)#A-$y@#u>{+M4LUYo<pySejT0GsS54~4AQ9e8I2p}Z&$&=Ig+-OC5Z
zk|O+->GAG=_n80v!2aJi{^yJM|7`XD6I*HR+Ox^SZ1?^BK%N&f$t?}~T^|Zog>FjC
z$w@%hW|WAb45UpN<)EACOZZuw-L*j9S1+^zh#z=8!l}xwOgPWsxa~bMP<r;n91?o&
z4Us&83sEG7dRDjoCC{TGHu?6R_xcfNx>*7K`gQ~y_&e&`#jkTg^i_R%8tUKLfbyar
z8;GzUlrFTT3q@qR8tsG45UIfLQcjrzi|2zgpPTG5vfVkzKzIZN#|lKNZyB!E(YJ9Z
zTN{gac?@Ji8~Ajd1(Kp0c!`#d&gWQ$<Ts=O_JJ2~N(1x0b><GLydMCaQS5g68s)Q0
z9*|q^N%zBY^oTwM`-8@UVfEJKPYp9L@lZ@l);;}kv@&vQuz};DLG-5+={H?x7X}-;
zSl~mv!Vvx2A23Qks0Zj7@S#A5dn)xtL5iK#+zsIp9VSdBds_%%@oe({N5B&5#ksEJ
zyEVwO1_2S|%cc|)gYecCcl5z)n%a&HbR55Jr{Wcg{uyr{9{Uo!oB}e-x}2|f5r|>J
zEqJG;ZEk-t&RF2Qd}&YSdkNY}yr_iicaodJ`=mT%U+^*~CL~OC7)_aiI^#u|{ZJe?
z<F%ydg%Z<C{~B`4cb)*W2}e+AyR4{T^7UhMLYoZ<4b2i%W^_ND42WnnyJh1TXX>|Q
zL>4b}Az#sjW{NEE?3frcoQp&=xy>E*YfIN31usR=$0Vkcvp$fbT%#&#_hiKxFE5PU
zAOGl$;**#dp)*RW0s2zGxwo-z!TV%#&B-S3x36JwRbFS4_cmFq0!{Yi;^dev6<@)b
zjn1S;ua`lNV{VC$4NsVM{OGc5^XadkG<;OuOzQ^d6B<7&Vf@h&K|dO0sxx9L{((Jt
zcsn)cTLPt!e3vEKFJ)3$ksYRBmI#+`kn*8F`EC9d*Z31s4!RzMFHokYM)M)Bj@oUC
zmPTuC1J;j&x^$zt23ptf@+lrFl;RgS4cFXlg%@|ohP8c(^5G?4IOj4Qfp=?~3l55&
z#{reKA|mqzz=oeT*uYN)#72~t241}@qO;=ViZh3qqyE3v&ONT?`;X&U`{lUhxcrb5
zXH2H4R5F*;<Fqbp%%!Q27;;dSDG{pi9h<V6iFKb^H<t<#DOt-s5-CC?y6B3Kbn5r~
z<iFn^zd!cdzw|igd_SM}_4R(eU*E*UD$Zxu8J#1SSwhm8d0~Cos-z#}TH3>$5eO>z
zwpg_c&oQF|mFLkMmecOGbc`t+j_543BBvc8Fw@rq&7$M8+lXY^{wduOC~G=oI=K>%
zscyLXys>}3urSE=I%~`pgsZXz&AIR7n&0J0U^Z<~H+f!=@!26c&UdDQps&do4}C+m
z3=f#|d;{mW_C+Ojyo}F^UwRJh|3YPUo!lSuDzf8)>V^{+JfS5GGFsG%aOB0Z;F3S$
z;vR#n_fkZCcjc4w=R2(mV>weH{t61JkIk&VJ}GIFQzI%l8Nb9hRlO{<3b7CXmq%ID
z>jJYvhAS{Ho;+Et@!SO^9D)Yqcy8$3zO}uq2heF}QkU=-d-w0p^j_%i4t8I1bEaw&
zAO{MDpX*}A9?cS*AfrX6yzrjzwBwgYN1DHNeU)_4BTP7>YIGrbf>YHadA@QeMHsN2
zrJr}S?*tne6w@FJ>KfBeorc(+fYb}|*Es71h+w=8pIp$9=8GSK!PlW{a6B8zNxmn{
z#U7Uj^ZhN^`+-*a#K;@cEQ6+R_owa}oolG*r9Tz5s4iRvKJ*mzNM8*3oMzuGP_U3~
znTp{<{F>N$HzFdUAmEE4S$WH<qR3qe37BtrXK7@p8}*=-eWb^+=?!5y0&WbwSGrMi
zDQhTkyMal}H!6X(We2#6@U&mw-aeJ=f9Fwh@qBkoLr59Rma=Z<vnv&vm-xzgDaC+R
z!pBRd33`nx9x}9mvzHByWiH@oRgYJ<><{->c)^;x+xbeMHN;|+c^pE#|24)LPzcau
zCO041KD_7e=WiDmqo;5XC@y}t#p>FV?ZG~c_csB1t`XQeKNMbP+-@j#78{k0x*i_Z
zs}^8;5$&m?@`GEZ#)058U@-R{O$wR%;u4grMVr5JeA7$8w))D}g)>U?H@DREi{6)N
zE@Y`@cDxb`=mK+>9l$JVyLUVB@4<sZhK!HnDT<<!HGc2_SO-HMXKegNsojO?7>*sw
zj)|`BXf2(5-8g0u{X7d|t#Uhxh)h_CiImP1=K{8?2%B-FFt5LGFz81S>(pZZqRb)9
z<S1YyuMUyqCDq$N(8`4w@lQ!^!yq*ETvY$P$-#~Zzm0(erq`#S0pa7r*Hn7tEZ3;)
z_5~Sbsb<-9FqoP$`S_+@{X0qn)K0RcoK@M%*sXDvx}F(xG9Kj<0bJ0$uQ*P-Bp_hf
z0d&eD*JiCUJF7<vkb7sROCw8Z6-iHP>l~VbuPctL-u@}i1I5dkX>)z*%L3J5ce4*F
z1k&6!<=W9(XODliiPRkVuzj?Yjwi8(I_<BEZYZ79SQah|vD{#jOZrlM0z`yf_B6?a
zi~v=wbW#h(DalcNNjq|~Y;2=@`+b1-5Z#GJQu;;x&Gn}$f9?~*IzW=@+D~l$<Z=*o
z0nbT*wZUfBWeNr)9b%ZawT7+mav)KqEa2@`x5bDqX<3Pc`cU2ITlCsxW%P-ThrLLj
zhe-h8D`W2B+VZ^9)iIHaFN~19c#bb4%s-L5E`Pi~|G|#=kFbn(Ml?!UQq*@dcHEkU
zJd3LG7kmAbfD9nXWBY_sB3E;oeE&1iJo&8e)p40Ec-CusQji!yA(Do>3<C?}AUD&Q
zGz@^o2Trw9z}-ceosS3SUTW;lmA*(C6E@?#T8{ydp6PN28Bej{vkGYd)JF@X51?iz
z&P@?VNXD#PWfE!7wo%_dbddMW=>`HIW-N!`i;v&Im^QJACvZXMqryN%iZq{4!vqHT
zmP-Yt#^c82V0*CR%O4fN(Te30ipmrsMF)1%M6mcRH*@{B@s$Lu;MYwYju;O%R3!S)
zUIQRTt{B+rVsdp%v)MQMispaXce+9O3WJZfckjCx2o<EBU4?qF&yy3tXhYn>u`jnz
zPX}EU1%TxB==<*O4%-zHe9+;W>yP4p4z{-EVf<SxITtwESZJy*`*~6oyX*H?B}G#i
z5e8Us?s(ATFNlP|>O$GgC)JC}jJ&VBsi_edyMK$LY$W?)8|#l=Bsibs##!jrBl4df
zy7<mBLkZ_p!+5um@ymStj<#N4i}qV$ibC=vXfS2bR<PVt%?S2jfIIIuA!C<Q^SyH0
zAWkEO)d~KaG<O3x2WW&RS)Klu_QKeUbH+;N3V-aWXf}&e-r4n3QTxPLej(|0_q-BT
z-u&&@?OOTy2#@nGLcPC<MfhGLFi*T?<^SkG|H1Z!b~Z4IdSP|#XiA0lC;<&<jB=ba
zHf(jRMX0Q^xo>APz7D|XDJG)=d#{LClX_Zs>FKHn4l66+-Ul}%uB`FcRU?KNFIkDW
zdDF9^+FsxZBM!h=)CiP#or8u({~04b)X;DkBXG(8@gKY9rZ|3)$=?SK>OxxoPMiMz
zh{7_wH60`f+lcyXC94RDJ0>VWyLK(evenT2(n;&dErQ`|BG<5W`TgK#UiK=(Ypvj?
z!V+gA<}@^Rir1@KTwHa0-a`?ZNA8k@i4*r3K}}K{A8|@s9ME1l{HsY%_wMr?66#DO
zWqo52xoVjK@w|$n@NkYj-}Nxf|J5N;v4dQTN@`g(Q+Pcw`eRNJZ?$jlURGP08TNXZ
z40?7&71~oVUdXy2BN)pZLLtqbJNG6BEh=CUR1tNkE{qLeWir!S^ZQY4tcsFyOrvI#
zmfwYBnU3frF{m?h)#F}HVkuz=<b{kJdKV*9)tOmCn2v-sOG;U2Fo3TE%pEUMgQ)iy
zBT$yr5lP|OR#MseQX(=>K7?cvW$!~gW<l0&>&Fas4dDT7lvQx~2>#7f512(O#3(4C
zGucq{g$HgzK^l$@u<XFmo)uJG0RZYd<zl?Lx$*Q$F&9D{jwA4)M%XEe&{n>+WSX0k
zUHn{m2r3AQwuu`mcTX%Sw_>e^70WIT#DasK)_WdsmkLQtt+vi83G22=Ou$IVkHxfq
zO>XH#YD%rI%6TNTFZ^DiJGQhz4ab}uk19&^<Ow<Rob0sRbv`ztwQ!a#J$}vN3{%-P
zO^BSnfoGwVi6J$W;KIap*4ub`L+J(zv#%z(aF^G_7(_IK@IX=$?V7jp^NCT~ibdW<
zwmv&{AZ+<mAvul}ita75Ty=D0QvOo{a1VvBw1k8NA8kEipF(0(L|u32UkkKG-J{;K
zkx}?ownZK0^s2bKhML$#q)wgd!C8s&Jo?yq)w3yq<Nu5mW5xAnQ-ig_9d|e*_p^ni
zF@+>XkR3&|nxB=mavXi9)Td{k?Cp@9th_@#D@=!kCX@zgDSYp)*e~)14}NHCVruV8
zNp4+>Tu+VT8`#cLCq}MaU0)!I5ebc-vka7PTlqnV7FP)EWK)a1t4??iDIXg>`=iB4
zs?#=m)GX-=by=+$wRNbqKeQ#G8K96vxrKqc9a}!VZ8nP*Upu+_)F$lTx3|5sbC}Nx
z>!rKejuNjYY&3s%j3zLfUP4Uro$TCq1osbO|JzoV^t5if!RPNp6_;z#jhAbby4f4b
zg&GNKvtr+DXK$Tj2;GX_ka;xugUW8?t#6xZt_0={d^IclOk(rAraufvntdPYOzk)p
zrTA3W?FK?vMM@X@4kvm%N_rlrkg)LpoS)^c%kd%8M9+#IkM<Cg5t0dcn99R=G7dd3
zG1>RZ{RuzB`Wd`Gh>t8EttMLZiJ9%{s;5l0JY;IE?~Qa0>hhJCX}fS{<QQ`T4jnm3
z3z#HoLgguZC_XyN^mh~6oOxBLpR^ZGsl9TkV2YF<$5vaB9kso9YEgiTr@ldl$VSS<
zjmcCAxb>+gd%ie}STj+MwGo^D{#7aR{y{B!J|i(E2bhP=7}r&I5(KJFxM=7!0Dlx+
zpc>zv+Ix)SoTlO>r300%RGCT{jWi>~K3S$v$odE2?}*EttVnW6e<oNw<|#JxMlT<j
z241k8_?1Fpbo;xZX3wuP_B_KIf7RDpa1R?($`*Q_xNWEFInaBBpr#Fi!F0E4f=!y3
zrH;p6ezw5=Lb5G-Ib>6?*1-DNO8cTabuzxL8aZ_SK|b|X%;rXT6%0%XHO`%?;wcGd
zM!!Gsr_8{$6=L)79W~msVMFP{WCsYybKZOyIuVp87jrOXlaL;#%^q<Ixw3{O5<e-7
z2euY#JmwQr#r<xh^)KGbU@mzPkrRBMUAbgEVw911OT&Gho9gY4>bf9a2lEyJl1$NC
z*W&OG5n7{4Mcz=hQguSWdNFyYJ~ds<g&IM%@JkY3z^>)+$=)hi1y7J-Dd+rM@nwa?
zNHd!5v{s#EYN}d)Z9-{=x2`Js%GIlehK7tZukoXs@ToC|hGJojNW<(ioz9hAnQCOY
zDc?M6-9NZ|lW4@Yhl=4p8)AMUNTSTO<j-vsiY$t~fGr_Y)Kj0rLs{w9=Hse!<D;tU
z(eJwIY(at;mwEqKM-S0dz~n&A*3`efm61JlSuQ>-N^A1mU?rKOn7$)&nhWvLHpTH^
z!aeIlU(cIo24RO)nc};GDU(a+WVw6oFY~+g$fVT6Z`!c=!vQs{h72e7;I^xqio?3S
zeM1}&y^cacUZI{ItWV5K@<A+o1hK)>5RL7LF#(q1RK46)XLmo@PY(o?g}bm(ab$5$
z7B>u8q@8PDxaNVzxH@W1@kWC-R)R&J288p#=uG{0l!E#j?kwFMoklcWg+s$i>KrgM
zO>T$AvKMGbHan&QON7wC6>VxfUERoWiNBAZ_P$E_lD7x_twF&*Sfu^qAEmak-1b^?
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&gt; 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&gt; 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&#39;-weighting as <span>$e^{t/T_2&#39;}$</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&#39;-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, :&gt;=/:&lt;=, 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&#39;-weighting as <span>$e^{t/T_2&#39;}$</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&#39;-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, :&gt;=/:&lt;=, 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