Þ¤pathÙ]/home/runner/work/KomaMRI.jl/KomaMRI.jl/docs/src/tutorial/pluto/01-gradient-echo-spin-echo.jl¨metadata�«frontmatterƒ¤tags‘«educational¥titleÙ!Understanding basic MRI sequences«descriptionÙBFree Induction Decay (FID), Gradient Echo (GE), and Spin Echo (SE)¬cell_resultsÞ0Ù$35ff3402-dc36-4b91-bec9-b4d21faf3e68Чrunning§runtimeÎ�ûØT¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$35ff3402-dc36-4b91-bec9-b4d21faf3e68¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚhŒ
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšZVóǰpersist_js_state·has_pluto_hook_featuresÂÙ$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7cЧrunning§runtimeÎ0o<[¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7c¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚp˜
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš_-³1°persist_js_state·has_pluto_hook_featuresÂÙ$2e65ae31-f50a-462b-9744-80bf6cdb388eЧrunning§runtimeÎ*–¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$2e65ae31-f50a-462b-9744-80bf6cdb388e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ$/
¤mime©text/html¬rootassignee°recon_t2_star_se²last_run_timestampËAÚµš_,R°persist_js_state·has_pluto_hook_featuresÂÙ$45952512-aaf1-43d8-a95e-c32bb2633f42Чrunning§runtimeÎÑÖ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$45952512-aaf1-43d8-a95e-c32bb2633f42¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ'
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšN�`»°persist_js_state·has_pluto_hook_featuresÂÙ$34824db7-13c4-45e2-befa-f027b9b585c0Чrunning§runtimeÎ{Ðð¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$34824db7-13c4-45e2-befa-f027b9b585c0¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ3ä
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš_„2/°persist_js_state·has_pluto_hook_featuresÂÙ$97104c46-e81f-444a-957f-0bbb1b02f1b8Чrunning§runtimeÎÙ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$97104c46-e81f-444a-957f-0bbb1b02f1b8¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ 

3. $T_{2}^{*}$-decay

The $T_{2}^{*}$-decay is the signal decay produced by microscopic distribution of off-resonance.

The exact distribution of off-resonance is

$$p_{\Delta w}(w) = \frac{T_2^{'}}{\pi(1+T_2^{'2} w^2)},\quad\text{with }\frac{1}{T_2^{*}} = \frac{1}{T_2} + \frac{1}{T_2^{'}}.$$

In this excercise we will simplify this distribution, but we will obtain a similar effect.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš^¤ñÔ°persist_js_state·has_pluto_hook_featuresÂÙ$97479437-9ce3-4b33-9134-0f2af89bccb5Чrunning§runtimeΫâg¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$97479437-9ce3-4b33-9134-0f2af89bccb5¹depends_on_disabled_cells¦queued¤logs“ˆ¥group¬GPUFunctions¤lineÿ£msg’Ú The GPU functionality is being called but no GPU backend is loaded to access it. Add 'using CUDA / Metal / AMDGPU / oneAPI' to your code. Defaulting back to the CPU. (No action is required if you want to run on the CPU). oneAPI support is experimental. ªtext/plain¥level¤Info¢id´KomaMRICore_991108fe§cell_idÙ$97479437-9ce3-4b33-9134-0f2af89bccb5¦kwargs�¤fileÙM/home/runner/.julia/packages/KomaMRICore/iTdyz/src/simulation/GPUFunctions.jlˆ¥group­SimulatorCore¤lineÿ£msg’Ù.Running simulation in the CPU with 4 thread(s)ªtext/plain¥level¤Info¢id´KomaMRICore_618da742§cell_idÙ$97479437-9ce3-4b33-9134-0f2af89bccb5¦kwargs•’¬koma_version’©v"0.13.0"ªtext/plain’ªsim_method’…¦prefix±KomaMRICore.Bloch¨elements�¤type¦struct¬prefix_short¥Bloch¨objectid°ffffffff967bc7f6Ù!application/vnd.pluto.tree+object’¥spins’£400ªtext/plain’«time_points’£143ªtext/plain’ªadc_points’£100ªtext/plain¤fileÙN/home/runner/.julia/packages/KomaMRICore/iTdyz/src/simulation/SimulatorCore.jlˆ¥group¦stdout¤lineÿ£msg’ÙM 0.009235 seconds (17.10 k allocations: 1.111 MiB, 72.55% compilation time) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$97479437-9ce3-4b33-9134-0f2af89bccb5¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÙ
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš\—ÿ°persist_js_state·has_pluto_hook_featuresÂÙ$964404f6-7f46-4df9-ad98-921948c3be69Чrunning§runtimeÎí¹ò¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$964404f6-7f46-4df9-ad98-921948c3be69¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ,r
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš_>ûô°persist_js_state·has_pluto_hook_featuresÂÙ$4a4a6bd3-b820-479c-89e3-f3ce79a316dbЧrunning§runtimeÎ X¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4a4a6bd3-b820-479c-89e3-f3ce79a316db¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ$
¤mime©text/html¬rootassignee±recon_t2_star_gre²last_run_timestampËAÚµš_0åÚ°persist_js_state·has_pluto_hook_featuresÂÙ$74666c1a-2673-4936-982b-6229bf92af66Чrunning§runtimeÎ#€¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$74666c1a-2673-4936-982b-6229bf92af66¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ…
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšN� š°persist_js_state·has_pluto_hook_featuresÂÙ$ada602d2-4f4b-4fb4-a763-8a639e05ff38Чrunning§runtimeÎ-H˜G¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ada602d2-4f4b-4fb4-a763-8a639e05ff38¹depends_on_disabled_cells¦queued¤logs“ˆ¥group¬GPUFunctions¤lineÿ£msg’Ú The GPU functionality is being called but no GPU backend is loaded to access it. Add 'using CUDA / Metal / AMDGPU / oneAPI' to your code. Defaulting back to the CPU. (No action is required if you want to run on the CPU). oneAPI support is experimental. ªtext/plain¥level¤Info¢id´KomaMRICore_991108fe§cell_idÙ$ada602d2-4f4b-4fb4-a763-8a639e05ff38¦kwargs�¤fileÙM/home/runner/.julia/packages/KomaMRICore/iTdyz/src/simulation/GPUFunctions.jlˆ¥group­SimulatorCore¤lineÿ£msg’Ù.Running simulation in the CPU with 4 thread(s)ªtext/plain¥level¤Info¢id´KomaMRICore_618da742§cell_idÙ$ada602d2-4f4b-4fb4-a763-8a639e05ff38¦kwargs•’¬koma_version’©v"0.13.0"ªtext/plain’ªsim_method’…¦prefix±KomaMRICore.Bloch¨elements�¤type¦struct¬prefix_short¥Bloch¨objectid°ffffffff967bc7f6Ù!application/vnd.pluto.tree+object’¥spins’¢20ªtext/plain’«time_points’£128ªtext/plain’ªadc_points’£100ªtext/plain¤fileÙN/home/runner/.julia/packages/KomaMRICore/iTdyz/src/simulation/SimulatorCore.jlˆ¥group¦stdout¤lineÿ£msg’Ù6 0.002432 seconds (11.85 k allocations: 753.172 KiB) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$ada602d2-4f4b-4fb4-a763-8a639e05ff38¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÙ
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš^̼Ӱpersist_js_state·has_pluto_hook_featuresÂÙ$27686262-1a1e-45fa-b4ee-90ae1d9ee34eЧrunning§runtimeÎGƸdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$27686262-1a1e-45fa-b4ee-90ae1d9ee34e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ6
  • (3.3) Simulate the seq_gre sequence

  • (3.4) Plot the simulated signal

  • (3.5) Compare the plot in (3.5) with (2.6)

  • (3.6) Reconstruct the 1D image

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšN�9u°persist_js_state·has_pluto_hook_featuresÂÙ$2ee7ba47-02e5-4b02-a162-ddbd5ed47c7bЧrunning§runtimeΓûC¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$2ee7ba47-02e5-4b02-a162-ddbd5ed47c7b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ‰”
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš^ʪ~°persist_js_state·has_pluto_hook_featuresÂÙ$e4ef5145-a63c-4f91-ac04-3b5bf16c0842Чrunning§runtimeÎ6N§¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e4ef5145-a63c-4f91-ac04-3b5bf16c0842¹depends_on_disabled_cells¦queued¤logs“ˆ¥group¬GPUFunctions¤lineÿ£msg’Ú The GPU functionality is being called but no GPU backend is loaded to access it. Add 'using CUDA / Metal / AMDGPU / oneAPI' to your code. Defaulting back to the CPU. (No action is required if you want to run on the CPU). oneAPI support is experimental. ªtext/plain¥level¤Info¢id´KomaMRICore_991108fe§cell_idÙ$e4ef5145-a63c-4f91-ac04-3b5bf16c0842¦kwargs�¤fileÙM/home/runner/.julia/packages/KomaMRICore/iTdyz/src/simulation/GPUFunctions.jlˆ¥group­SimulatorCore¤lineÿ£msg’Ù.Running simulation in the CPU with 4 thread(s)ªtext/plain¥level¤Info¢id´KomaMRICore_618da742§cell_idÙ$e4ef5145-a63c-4f91-ac04-3b5bf16c0842¦kwargs•’¬koma_version’©v"0.13.0"ªtext/plain’ªsim_method’…¦prefix±KomaMRICore.Bloch¨elements�¤type¦struct¬prefix_short¥Bloch¨objectid°ffffffff967bc7f6Ù!application/vnd.pluto.tree+object’¥spins’£400ªtext/plain’«time_points’£128ªtext/plain’ªadc_points’£100ªtext/plain¤fileÙN/home/runner/.julia/packages/KomaMRICore/iTdyz/src/simulation/SimulatorCore.jlˆ¥group¦stdout¤lineÿ£msg’Ù6 0.001617 seconds (11.85 k allocations: 802.398 KiB) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$e4ef5145-a63c-4f91-ac04-3b5bf16c0842¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÙ // Load the library for consistent smooth scrolling const {default: scrollIntoView} = await import("data:text/javascript;base64,dmFyIFE9ZT0+Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lJiYxPT09ZS5ub2RlVHlwZSxVPShlLHQpPT4oIXR8fCJoaWRkZW4iIT09ZSkmJiJ2aXNpYmxlIiE9PWUmJiJjbGlwIiE9PWUsQT0oZSx0KT0+e2lmKGUuY2xpZW50SGVpZ2h0PGUuc2Nyb2xsSGVpZ2h0fHxlLmNsaWVudFdpZHRoPGUuc2Nyb2xsV2lkdGgpe2xldCBsPWdldENvbXB1dGVkU3R5bGUoZSxudWxsKTtyZXR1cm4gVShsLm92ZXJmbG93WSx0KXx8VShsLm92ZXJmbG93WCx0KXx8KGU9PntsZXQgdD0oZT0+e2lmKCFlLm93bmVyRG9jdW1lbnR8fCFlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZnJhbWVFbGVtZW50fWNhdGNoe3JldHVybiBudWxsfX0pKGUpO3JldHVybiEhdCYmKHQuY2xpZW50SGVpZ2h0PGUuc2Nyb2xsSGVpZ2h0fHx0LmNsaWVudFdpZHRoPGUuc2Nyb2xsV2lkdGgpfSkoZSl9cmV0dXJuITF9LFg9KGUsdCxsLG8sbixyLGkscyk9PnI8ZSYmaT50fHxyPmUmJmk8dD8wOnI8PWUmJnM8PWx8fGk+PXQmJnM+PWw/ci1lLW86aT50JiZzPGx8fHI8ZSYmcz5sP2ktdCtuOjAsJD1lPT5lLnBhcmVudEVsZW1lbnQ/PyhlLmdldFJvb3ROb2RlKCkuaG9zdHx8bnVsbCksdHQ9KGUsdCk9Pnt2YXIgbCxvLG4scjtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybltdO2xldHtzY3JvbGxNb2RlOmksYmxvY2s6cyxpbmxpbmU6YSxib3VuZGFyeTpoLHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzOnV9PXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgaD9oOmU9PmUhPT1oO2lmKCFRKGUpKXRocm93IFR5cGVFcnJvcigiSW52YWxpZCB0YXJnZXQiKTtsZXQgdj1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbT1bXSx3PWU7Zm9yKDtRKHcpJiZnKHcpOyl7aWYoKHc9JCh3KSk9PT12KXttLnB1c2godyk7YnJlYWt9bnVsbCE9dyYmdz09PWRvY3VtZW50LmJvZHkmJkEodykmJiFBKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCl8fG51bGwhPXcmJkEodyx1KSYmbS5wdXNoKHcpfWxldCBXPW51bGwhPShvPW51bGw9PShsPXdpbmRvdy52aXN1YWxWaWV3cG9ydCk/dm9pZCAwOmwud2lkdGgpP286aW5uZXJXaWR0aCxIPW51bGwhPShyPW51bGw9PShuPXdpbmRvdy52aXN1YWxWaWV3cG9ydCk/dm9pZCAwOm4uaGVpZ2h0KT9yOmlubmVySGVpZ2h0LHtzY3JvbGxYOl8sc2Nyb2xsWTp4fT13aW5kb3cse2hlaWdodDpFLHdpZHRoOlQsdG9wOk4scmlnaHQ6TCxib3R0b206WSxsZWZ0OkN9PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUj0ic3RhcnQiPT09c3x8Im5lYXJlc3QiPT09cz9OOiJlbmQiPT09cz9ZOk4rRS8yLFY9ImNlbnRlciI9PT1hP0MrVC8yOiJlbmQiPT09YT9MOkMsQj1bXTtmb3IobGV0IEQ9MDtEPG0ubGVuZ3RoO0QrKyl7bGV0IE89bVtEXSx7aGVpZ2h0Omosd2lkdGg6SSx0b3A6UyxyaWdodDpxLGJvdHRvbTp6LGxlZnQ6Rn09Ty5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZigiaWYtbmVlZGVkIj09PWkmJk4+PTAmJkM+PTAmJlk8PUgmJkw8PVcmJk4+PVMmJlk8PXomJkM+PUYmJkw8PXEpYnJlYWs7bGV0IEc9Z2V0Q29tcHV0ZWRTdHlsZShPKSxKPXBhcnNlSW50KEcuYm9yZGVyTGVmdFdpZHRoLDEwKSxLPXBhcnNlSW50KEcuYm9yZGVyVG9wV2lkdGgsMTApLFA9cGFyc2VJbnQoRy5ib3JkZXJSaWdodFdpZHRoLDEwKSxaPXBhcnNlSW50KEcuYm9yZGVyQm90dG9tV2lkdGgsMTApLGVlPTAsZXQ9MCxlbD0ib2Zmc2V0V2lkdGgiaW4gTz9PLm9mZnNldFdpZHRoLU8uY2xpZW50V2lkdGgtSi1QOjAsZW89Im9mZnNldEhlaWdodCJpbiBPP08ub2Zmc2V0SGVpZ2h0LU8uY2xpZW50SGVpZ2h0LUstWjowLGVuPSJvZmZzZXRXaWR0aCJpbiBPPzA9PT1PLm9mZnNldFdpZHRoPzA6SS9PLm9mZnNldFdpZHRoOjAsZXI9Im9mZnNldEhlaWdodCJpbiBPPzA9PT1PLm9mZnNldEhlaWdodD8wOmovTy5vZmZzZXRIZWlnaHQ6MDtpZih2PT09TyllZT0ic3RhcnQiPT09cz9SOiJlbmQiPT09cz9SLUg6Im5lYXJlc3QiPT09cz9YKHgseCtILEgsSyxaLHgrUix4K1IrRSxFKTpSLUgvMixldD0ic3RhcnQiPT09YT9WOiJjZW50ZXIiPT09YT9WLVcvMjoiZW5kIj09PWE/Vi1XOlgoXyxfK1csVyxKLFAsXytWLF8rVitULFQpLGVlPU1hdGgubWF4KDAsZWUreCksZXQ9TWF0aC5tYXgoMCxldCtfKTtlbHNle2VlPSJzdGFydCI9PT1zP1ItUy1LOiJlbmQiPT09cz9SLXorWitlbzoibmVhcmVzdCI9PT1zP1goUyx6LGosSyxaK2VvLFIsUitFLEUpOlItKFMrai8yKStlby8yLGV0PSJzdGFydCI9PT1hP1YtRi1KOiJjZW50ZXIiPT09YT9WLShGK0kvMikrZWwvMjoiZW5kIj09PWE/Vi1xK1ArZWw6WChGLHEsSSxKLFArZWwsVixWK1QsVCk7bGV0e3Njcm9sbExlZnQ6ZWksc2Nyb2xsVG9wOmVkfT1PO2VlPU1hdGgubWF4KDAsTWF0aC5taW4oZWQrZWUvZXIsTy5zY3JvbGxIZWlnaHQtai9lcitlbykpLGV0PU1hdGgubWF4KDAsTWF0aC5taW4oZWkrZXQvZW4sTy5zY3JvbGxXaWR0aC1JL2VuK2VsKSksUis9ZWQtZWUsVis9ZWktZXR9Qi5wdXNoKHtlbDpPLHRvcDplZSxsZWZ0OmV0fSl9cmV0dXJuIEJ9LGY9ZT0+e3ZhciB0O3JldHVybiExPT09ZT97YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0In06KHQ9ZSk9PT1PYmplY3QodCkmJjAhPT1PYmplY3Qua2V5cyh0KS5sZW5ndGg/ZTp7YmxvY2s6InN0YXJ0IixpbmxpbmU6Im5lYXJlc3QifX07ZnVuY3Rpb24gYyhlLHQpe3ZhciBsO2lmKCFlLmlzQ29ubmVjdGVkfHwhKGU9PntsZXQgdD1lO2Zvcig7dCYmdC5wYXJlbnROb2RlOyl7aWYodC5wYXJlbnROb2RlPT09ZG9jdW1lbnQpcmV0dXJuITA7dD10LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290P3QucGFyZW50Tm9kZS5ob3N0OnQucGFyZW50Tm9kZX1yZXR1cm4hMX0pKGUpKXJldHVybjtpZigib2JqZWN0Ij09dHlwZW9mKGw9dCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBsLmJlaGF2aW9yKXJldHVybiB0LmJlaGF2aW9yKHR0KGUsdCkpO2xldCBvPSJib29sZWFuIj09dHlwZW9mIHR8fG51bGw9PXQ/dm9pZCAwOnQuYmVoYXZpb3I7Zm9yKGxldHtlbDpuLHRvcDpyLGxlZnQ6aX1vZiB0dChlLGYodCkpKW4uc2Nyb2xsKHt0b3A6cixsZWZ0OmksYmVoYXZpb3I6b30pfXZhciBkLHA9KCk9PihkfHwoZD0icGVyZm9ybWFuY2UiaW4gd2luZG93P3BlcmZvcm1hbmNlLm5vdy5iaW5kKHBlcmZvcm1hbmNlKTpEYXRlLm5vdyksZCgpKTtmdW5jdGlvbiBiKGUpe2xldCB0PU1hdGgubWluKChwKCktZS5zdGFydFRpbWUpL2UuZHVyYXRpb24sMSksbD1lLmVhc2UodCksbz1lLnN0YXJ0WCsoZS54LWUuc3RhcnRYKSpsLG49ZS5zdGFydFkrKGUueS1lLnN0YXJ0WSkqbDtlLm1ldGhvZChvLG4sdCxsKSxvIT09ZS54fHxuIT09ZS55P3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+YihlKSk6ZS5jYigpfWZ1bmN0aW9uIHkoZSx0LGwpe2xldCBvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTo2MDAsbj1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06ZT0+MSstLWUqZSplKmUqZSxyPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06dm9pZCAwLGk9YXJndW1lbnRzLmxlbmd0aD42P2FyZ3VtZW50c1s2XTp2b2lkIDAscz1lLnNjcm9sbExlZnQsYT1lLnNjcm9sbFRvcDtiKHtzY3JvbGxhYmxlOmUsbWV0aG9kKHQsbCxvLG4pe2xldCByPU1hdGguY2VpbCh0KSxzPU1hdGguY2VpbChsKTtlLnNjcm9sbExlZnQ9cixlLnNjcm9sbFRvcD1zLGk/Lih7dGFyZ2V0OmUsZWxhcHNlZDpvLHZhbHVlOm4sbGVmdDpyLHRvcDpzfSl9LHN0YXJ0VGltZTpwKCksc3RhcnRYOnMsc3RhcnRZOmEseDp0LHk6bCxkdXJhdGlvbjpvLGVhc2U6bixjYjpyfSl9dmFyIE09ZT0+ZSYmIWUuYmVoYXZpb3J8fCJzbW9vdGgiPT09ZS5iZWhhdmlvcixrPWZ1bmN0aW9uKGUsdCl7bGV0IGw9dHx8e307cmV0dXJuIE0obCk/YyhlLHtibG9jazpsLmJsb2NrLGlubGluZTpsLmlubGluZSxzY3JvbGxNb2RlOmwuc2Nyb2xsTW9kZSxib3VuZGFyeTpsLmJvdW5kYXJ5LHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzOmwuc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMsYmVoYXZpb3I6ZT0+UHJvbWlzZS5hbGwoZS5yZWR1Y2UoKGUsdCk9PntsZXR7ZWw6byxsZWZ0Om4sdG9wOnJ9PXQsaT1vLnNjcm9sbExlZnQscz1vLnNjcm9sbFRvcDtyZXR1cm4gaT09PW4mJnM9PT1yP2U6Wy4uLmUsbmV3IFByb21pc2UoZT0+eShvLG4scixsLmR1cmF0aW9uLGwuZWFzZSwoKT0+ZSh7ZWw6byxsZWZ0OltpLG5dLHRvcDpbcyxyXX0pLGwub25TY3JvbGxDaGFuZ2UpKV19LFtdKSl9KTpQcm9taXNlLnJlc29sdmUoYyhlLHQpKX07ZXhwb3J0e2sgYXMgZGVmYXVsdH07") const indent = true const aside = true const title_text = "Table of Contents" const include_definitions = false const tocNode = html`` tocNode.classList.toggle("aside", aside) tocNode.classList.toggle("indent", indent) const getParentCell = el => el.closest("pluto-cell") const getHeaders = () => { const depth = Math.max(1, Math.min(6, 3)) // should be in range 1:6 const range = Array.from({length: depth}, (x, i) => i+1) // [1, ..., depth] const selector = [ ...(include_definitions ? [ `pluto-notebook pluto-cell .pluto-docs-binding`, `pluto-notebook pluto-cell assignee:not(:empty)`, ] : []), ...range.map(i => `pluto-notebook pluto-cell h${i}`) ].join(",") return Array.from(document.querySelectorAll(selector)).filter(el => // exclude headers inside of a pluto-docs-binding block !(el.nodeName.startsWith("H") && el.closest(".pluto-docs-binding")) && !el.classList.contains("no-toc") ) } const document_click_handler = (event) => { const path = (event.path || event.composedPath()) const toc = path.find(elem => elem?.classList?.contains?.("toc-toggle")) if (toc) { event.stopImmediatePropagation() toc.closest(".plutoui-toc").classList.toggle("hide") } } document.addEventListener("click", document_click_handler) const header_to_index_entry_map = new Map() const currently_highlighted_set = new Set() const last_toc_element_click_time = { current: 0 } const intersection_callback = (ixs) => { let on_top = ixs.filter(ix => ix.intersectionRatio > 0 && ix.intersectionRect.y < ix.rootBounds.height / 2) if(on_top.length > 0){ currently_highlighted_set.forEach(a => a.classList.remove("in-view")) currently_highlighted_set.clear() on_top.slice(0,1).forEach(i => { let div = header_to_index_entry_map.get(i.target) div.classList.add("in-view") currently_highlighted_set.add(div) /// scroll into view /* const toc_height = tocNode.offsetHeight const div_pos = div.offsetTop const div_height = div.offsetHeight const current_scroll = tocNode.scrollTop const header_height = tocNode.querySelector("header").offsetHeight const scroll_to_top = div_pos - header_height const scroll_to_bottom = div_pos + div_height - toc_height // if we set a scrollTop, then the browser will stop any currently ongoing smoothscroll animation. So let's only do this if you are not currently in a smoothscroll. if(Date.now() - last_toc_element_click_time.current >= 2000) if(current_scroll < scroll_to_bottom){ tocNode.scrollTop = scroll_to_bottom } else if(current_scroll > scroll_to_top){ tocNode.scrollTop = scroll_to_top } */ }) } } let intersection_observer_1 = new IntersectionObserver(intersection_callback, { root: null, // i.e. the viewport threshold: 1, rootMargin: "-15px", // slightly smaller than the viewport // delay: 100, }) let intersection_observer_2 = new IntersectionObserver(intersection_callback, { root: null, // i.e. the viewport threshold: 1, rootMargin: "15px", // slightly larger than the viewport // delay: 100, }) const render = (elements) => { header_to_index_entry_map.clear() currently_highlighted_set.clear() intersection_observer_1.disconnect() intersection_observer_2.disconnect() let last_level = `H1` return html`${elements.map(h => { const parent_cell = getParentCell(h) let [className, title_el] = h.matches(`.pluto-docs-binding`) ? ["pluto-docs-binding-el", h.firstElementChild] : [h.nodeName, h] const id = title_el.matches("assignee") ? title_el.innerText.replace(/^const /, "") : title_el.id ? title_el.id : parent_cell.id const inner_html = title_el.innerHTML const a = html`${inner_html}` /* a.onmouseover=()=>{ parent_cell.firstElementChild.classList.add( 'highlight-pluto-cell-shoulder' ) } a.onmouseout=() => { parent_cell.firstElementChild.classList.remove( 'highlight-pluto-cell-shoulder' ) } */ a.onclick=(e) => { e.preventDefault(); history.replaceState(null, null, a.href) last_toc_element_click_time.current = Date.now() scrollIntoView(h, { behavior: 'smooth', block: 'start', }).then(() => // sometimes it doesn't scroll to the right place // solution: try a second time! scrollIntoView(h, { behavior: 'smooth', block: 'start', }) ) } // Remove any `id` attributes recursively, because they may interfere with linking-to-id using `#` const removeIdAttributes = (el) => { if (el && el.nodeType === 1) { // Element node if (el.hasAttribute?.("id")) el.removeAttribute?.("id") el.childNodes.forEach(removeIdAttributes) } } removeIdAttributes(a) // Remove Click-To-Copy-Header-ID feature a.querySelectorAll("pluto-header-id-copy-wrapper").forEach(el => el.remove()) const row = html`
${a}
` intersection_observer_1.observe(title_el) intersection_observer_2.observe(title_el) header_to_index_entry_map.set(title_el, row) if(className.startsWith("H")) last_level = className return row })}` } const invalidated = { current: false } const updateCallback = () => { if (!invalidated.current) { tocNode.querySelector("section").replaceWith( html`
${render(getHeaders())}
` ) } } updateCallback() setTimeout(updateCallback, 100) setTimeout(updateCallback, 1000) setTimeout(updateCallback, 5000) const notebook = document.querySelector("pluto-notebook") // We have a mutationobserver for each cell: const mut_observers = { current: [], } const createCellObservers = () => { mut_observers.current.forEach((o) => o.disconnect()) mut_observers.current = Array.from(notebook.querySelectorAll("pluto-cell")).map(el => { const o = new MutationObserver(updateCallback) o.observe(el, {attributeFilter: ["class"]}) return o }) } createCellObservers() // And one for the notebook's child list, which updates our cell observers: const notebookObserver = new MutationObserver(() => { updateCallback() createCellObservers() }) notebookObserver.observe(notebook, {childList: true}) // And finally, an observer for the document.body classList, to make sure that the toc also works when it is loaded during notebook initialization const bodyClassObserver = new MutationObserver(updateCallback) bodyClassObserver.observe(document.body, {attributeFilter: ["class"]}) // Hide/show the ToC when the screen gets small let match_listener = () => { const small = (tocNode.closest("pluto-editor") ?? document.body).scrollWidth < 1000 tocNode.classList.toggle("smallscreen", small) tocNode.classList.toggle("hide", small) } for(let s of [1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000]) { let m = matchMedia(`(max-width: ${s}px)`) m.addListener(match_listener) invalidation.then(() => m.removeListener(match_listener)) } match_listener() invalidation.then(() => { invalidated.current = true intersection_observer_1.disconnect() intersection_observer_2.disconnect() notebookObserver.disconnect() bodyClassObserver.disconnect() mut_observers.current.forEach((o) => o.disconnect()) document.removeEventListener("click", document_click_handler) }) return tocNode ¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšR(E9°persist_js_state·has_pluto_hook_featuresÂÙ$1231b832-47b1-4ccb-9b56-a67838598cc7Чrunning§runtimeÎî�4¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1231b832-47b1-4ccb-9b56-a67838598cc7¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ,Í
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš\3c$°persist_js_state·has_pluto_hook_featuresÂÙ$41d14dec-b852-4316-aefb-c3d08fa43216Чrunning§runtimeÎH�¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$41d14dec-b852-4316-aefb-c3d08fa43216¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚGÉ
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš^¤J°persist_js_state·has_pluto_hook_featuresÂÙ$ab8dc1ce-d1ef-43a0-9495-dac931b52aecЧrunning§runtimeÍ/¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ab8dc1ce-d1ef-43a0-9495-dac931b52aec¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¤true¤mimeªtext/plain¬rootassignee±activity_finished²last_run_timestampËAÚµš_�t°persist_js_state·has_pluto_hook_featuresÂÙ$58be4150-2b7a-4f9e-a7d7-40a086fd3a53Чrunning§runtimeÎ1ù4¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$58be4150-2b7a-4f9e-a7d7-40a086fd3a53¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙt ¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš_š8L°persist_js_state·has_pluto_hook_featuresÂÙ$d16efa62-dce7-4ec3-9e3c-b5e1677377fcЧrunning§runtimeÎR)B¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d16efa62-dce7-4ec3-9e3c-b5e1677377fc¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚµšYP¸o°persist_js_state·has_pluto_hook_featuresÂÙ$c02f3898-10cb-4f1e-b5ef-eb42b803baedЧrunning§runtimeÎ ç¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$c02f3898-10cb-4f1e-b5ef-eb42b803baed¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚt
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš_r•°persist_js_state·has_pluto_hook_featuresÂÙ$3357a283-a234-4d15-8fdf-7fbec58b33a7Чrunning§runtimeÎCC¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$3357a283-a234-4d15-8fdf-7fbec58b33a7¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚB

4. Spin Echo

The spin echo experiment has the advantage that the echo signal amplitud it is modulated by $\exp(-t/T_2)$ and not $\exp(-t/T_2^{*})$.

For this section we will use the phantom obj_t2star and a new sequence seq_se.

For this sequence we will need:

  • (4.1) A 90deg hard RF pulse

  • (4.2) A Delay of $\mathrm{TE}/2$ with a positive gradient (area Ax)

  • (4.3) A 180deg hard RF pulse

  • (4.4) A readout gradient of area 2Ax with an ADC (similar to (2.2)), such that the middle of the gradient and ADC are in $\mathrm{TE}$

  • (4.5) Create concatenating these blocks into a sequence called seq_se

  • (4.6) Plot seq_se and its k-space. Is the k-space the same as seq_gre in (2.3)?

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš_?X°persist_js_state·has_pluto_hook_featuresÂÙ$f11a2fa2-eff9-4979-b739-3da2b24a9a45Чrunning§runtimeÎ X¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$f11a2fa2-eff9-4979-b739-3da2b24a9a45¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ.

Generate a virtual object:

  • (1.4) A Phantom with 20 spins, with properties:

    • obj.x = [-1, 1] mm (20 spins along the $x$-axis)

    • obj.Ï� .= 1

    • obj.T1 .= 500 ms

    • obj.T2 .= 50 ms

  • (1.5) Plot the generated Phantom (check plot_phantom_map's docs)

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšN޲ö°persist_js_state·has_pluto_hook_featuresÂÙ$9179aa40-bb40-4a36-ae1e-00ae42935a5fЧrunning§runtimeÎ5D`ȸdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9179aa40-bb40-4a36-ae1e-00ae42935a5f¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙRSequence[ Ï„ = 30.587 ms | blocks: 3 | ADC: 1 | GR: 2 | RF: 1 | EXT: 0 | DEF: 11 ]¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚµš]¹•°persist_js_state·has_pluto_hook_featuresÂÙ$e4c80c24-20fd-42e5-9dcd-a65958569c01Чrunning§runtimeΗN7¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e4c80c24-20fd-42e5-9dcd-a65958569c01¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ¨

2. Gradient Echo

The gradient echo is one of the first steps to create an image. The big breakthrough was the addition of linearly increasing magnetic fields, or gradients, to encode the spin's positions in their frequency (Mmmh, someone said Fourier?). This works due to the fact that the frequency $f$ of a spin is

$$f(x) = \frac{\gamma}{2\pi} B_z(x) = \frac{\gamma}{2\pi} G_x x.$$

Let's create a different sequence.

  • Create a 90-deg hard RF pulse and put it in a variable seq_gre

  • (2.1) Create a gradient with area -Ax using gx_pre = Grad(A,T,rise,fall) append to seq_gre. As an optional challenge, put gx_pre.rise and gx_pre.fall so the satisfy the sys requierements

  • (2.2) Append a Sequence block called readout that includes:

    • A gradient of twice the area, or 2Ax. Call it gx

    • An ADC with adc2.delay = gx.rise and adc2.T = gx.T

  • (2.3) Plot seq_gre and its k-space

  • (2.4) Plot the $k$-space with the plot_kspace function

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš\8<Ѱpersist_js_state·has_pluto_hook_featuresÂÙ$9a88a54b-bcc7-41ad-8e60-f4d450dccb2dЧrunning§runtimeÎ$´Åθdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9a88a54b-bcc7-41ad-8e60-f4d450dccb2d¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ$)
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš^™Q°persist_js_state·has_pluto_hook_featuresÂÙ$27e65680-22a0-4079-b6df-d60a3218e52eЧrunning§runtimeÎ ƒ…¥¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$27e65680-22a0-4079-b6df-d60a3218e52e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙRSequence[ Ï„ = 31.174 ms | blocks: 4 | ADC: 1 | GR: 2 | RF: 2 | EXT: 0 | DEF: 11 ]¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚµš_a6ë°persist_js_state·has_pluto_hook_featuresÂÙ$1c79b37e-d4e0-490f-9466-20ce28f017aeЧrunning§runtimeΑ—²¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1c79b37e-d4e0-490f-9466-20ce28f017ae¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚœö
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš_~W°persist_js_state·has_pluto_hook_featuresÂÙ$ea542271-01c2-4962-a708-804b23a861b9Чrunning§runtimeÎ;€¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ea542271-01c2-4962-a708-804b23a861b9¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ¨
  • (1.6) Finally, use the generated seq, obj, and sys to simulate the FID (check simulate's docs)

  • (1.7) Plot the resulting raw data with plot_signal.

  • (1.8) Is the signal the same as Plot(t, exp.(-t ./ T2))?

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšNŽÝQ°persist_js_state·has_pluto_hook_featuresÂÙ$ee7e81e7-484c-44a8-a191-f73e24707ce9Чrunning§runtimeÎ Éиdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ee7e81e7-484c-44a8-a191-f73e24707ce9¹depends_on_disabled_cells¦queued¤logs�¦output†¤body±"T2 star phantom"¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚµš^ÈP°persist_js_state·has_pluto_hook_featuresÂÙ$0266632d-5ca4-4196-a523-33a66dd70e0cЧrunning§runtimeÍL<¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$0266632d-5ca4-4196-a523-33a66dd70e0c¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix£ADC¨elements•’¡N’£100ªtext/plain’¡T’¤0.05ªtext/plain’¥delay’£0.0ªtext/plain’£Î”f’£0.0ªtext/plain’¢Ï•’£0.0ªtext/plain¤type¦struct¬prefix_short£ADC¨objectid°89cef3440ebfe583¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee£adc²last_run_timestampËAÚµšT!á °persist_js_state·has_pluto_hook_featuresÂÙ$5df97874-f09c-4173-a2f6-893db322ccafЧrunning§runtimeΩ¥¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$5df97874-f09c-4173-a2f6-893db322ccaf¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙn

Understanding basic MRI sequences

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšNŽP/°persist_js_state·has_pluto_hook_featuresÂÙ$d6b1729a-874d-11ee-151a-9b0fcce2c4fdЧrunning§runtimeÎ�dü¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d6b1729a-874d-11ee-151a-9b0fcce2c4fd¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚµšQƒÂã°persist_js_state·has_pluto_hook_featuresÂÙ$6dfe338d-de85-4adb-b030-09455fae78a0Чrunning§runtimeγý¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6dfe338d-de85-4adb-b030-09455fae78a0¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙó

Welcome to the hands-on session on MRI simulation. Let's have some fun!

If you have any doubts about how to use a function, please search in the Live Docs at the bottom right.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšNŽvаpersist_js_state·has_pluto_hook_featuresÂÙ$3abca406-2e6b-4b37-8835-65cfad9d0caaЧrunning§runtimeÎ1ëù¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$3abca406-2e6b-4b37-8835-65cfad9d0caa¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚKÞ
¤mime©text/html¬rootassigneeªkspace_gre²last_run_timestampËAÚµš^=«°persist_js_state·has_pluto_hook_featuresÂÙ$c47a50b8-c930-4c96-9b34-2772186634d9Чrunning§runtimeÏa1)¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$c47a50b8-c930-4c96-9b34-2772186634d9¹depends_on_disabled_cells¦queued¤logs“ˆ¥group¬GPUFunctions¤lineÿ£msg’Ú The GPU functionality is being called but no GPU backend is loaded to access it. Add 'using CUDA / Metal / AMDGPU / oneAPI' to your code. Defaulting back to the CPU. (No action is required if you want to run on the CPU). oneAPI support is experimental. ªtext/plain¥level¤Info¢id´KomaMRICore_991108fe§cell_idÙ$c47a50b8-c930-4c96-9b34-2772186634d9¦kwargs�¤fileÙM/home/runner/.julia/packages/KomaMRICore/iTdyz/src/simulation/GPUFunctions.jlˆ¥group­SimulatorCore¤lineÿ£msg’Ù.Running simulation in the CPU with 4 thread(s)ªtext/plain¥level¤Info¢id´KomaMRICore_618da742§cell_idÙ$c47a50b8-c930-4c96-9b34-2772186634d9¦kwargs•’¬koma_version’©v"0.13.0"ªtext/plain’ªsim_method’…¦prefix±KomaMRICore.Bloch¨elements�¤type¦struct¬prefix_short¥Bloch¨objectid°ffffffff967bc7f6Ù!application/vnd.pluto.tree+object’¥spins’¢20ªtext/plain’«time_points’£115ªtext/plain’ªadc_points’£100ªtext/plain¤fileÙN/home/runner/.julia/packages/KomaMRICore/iTdyz/src/simulation/SimulatorCore.jlˆ¥group¦stdout¤lineÿ£msg’Ú“ Running simulation... 67%|████████████████████ | ETA: 0:00:01  simulated_blocks: 2  rf_blocks: 1  acq_samples: 0       Running simulation... 100%|██████████████████████████████| Time: 0:00:02  simulated_blocks: 3  rf_blocks: 1  acq_samples: 100 1.975972 seconds (4.69 M allocations: 287.730 MiB, 1.05% gc time, 109.06% compilation time: 85% of which was recompilation) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$c47a50b8-c930-4c96-9b34-2772186634d9¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÙ

Congratulations! you finished the simulation hands-on session 🥳!

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšN�|…°persist_js_state·has_pluto_hook_featuresÂÙ$abea2c43-d83e-4438-8cd3-4be06b8174b3Чrunning§runtimeÎ� ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$abea2c43-d83e-4438-8cd3-4be06b8174b3¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ7

Reproducibility

This Pluto notebook is reproducible by default, as it has an embedded Project.toml and Manifest.toml, that store the exact package versions used to create the notebook.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšN�ž°persist_js_state·has_pluto_hook_featuresÂÙ$f1f3b700-5916-496f-b938-46f7f08b4eb6Чrunning§runtimeÎ? ê¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$f1f3b700-5916-496f-b938-46f7f08b4eb6¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ-v
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš_hðpersist_js_state·has_pluto_hook_featuresÂÙ$0f96a83d-96ef-4768-9330-87c466e35c93Чrunning§runtimeÎ á2û¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$0f96a83d-96ef-4768-9330-87c466e35c93¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ_¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš\gÏ’°persist_js_state·has_pluto_hook_featuresÂÙ$8e474add-8651-431b-b481-7a139037dbd2Чrunning§runtimeÎ$ ׸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$8e474add-8651-431b-b481-7a139037dbd2¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ&

1. Free Induction Decay (FID)

The free induction decay is the simplest observable NMR signal. This signal is the one that follows a single tipping RF pulse.

To recreate this experiment, we will need to define a Sequence:

  • (1.1) A 90-deg block RF pulse, put it in a variable seq (check PulseDesigner.RF_hard's docs using the Live Docs)

  • (1.2) An ADC to capture the signal in a variable adc, concatenate with (1.1) using seq += adc

  • (1.3) Plot the generated Sequence (check plot_seq's docs)

For the hardware limits use the default scanner sys = Scanner().

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšRÅÌͰpersist_js_state·has_pluto_hook_featuresÂÙ$4e1434e1-673f-4206-a271-9edec10ebd6aЧrunning§runtimeΠ㜸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4e1434e1-673f-4206-a271-9edec10ebd6a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚLf
¤mime©text/html¬rootassignee©kspace_se²last_run_timestampËAÚµš_iœñ°persist_js_state·has_pluto_hook_featuresÂÙ$8b4a1ad9-2d6a-4c8f-bb8e-f43c2d058195Чrunning§runtimeÎÑ<`¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$8b4a1ad9-2d6a-4c8f-bb8e-f43c2d058195¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ+£
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµš]‚ $°persist_js_state·has_pluto_hook_featuresÂÙ$c6e33cb8-f42c-4643-9257-124d2804d3daЧrunning§runtimeΉ™¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$c6e33cb8-f42c-4643-9257-124d2804d3da¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙQSequence[ Ï„ = 0.587 ms | blocks: 1 | ADC: 0 | GR: 0 | RF: 1 | EXT: 0 | DEF: 11 ]¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚµšT&5°persist_js_state·has_pluto_hook_featuresÂÙ$7deadd58-b202-4508-b4c7-686f742cb713Чrunning§runtimeΤ5l¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$7deadd58-b202-4508-b4c7-686f742cb713¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’Ù[OS x86_64-linux-gnu Julia 1.13.2 KomaMRIBase 0.14.0 KomaMRICore 0.13.0 KomaMRIPlots 0.13.1 ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$7deadd58-b202-4508-b4c7-686f742cb713¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚµšPµq°persist_js_state·has_pluto_hook_featuresÂÙ$0975547d-67d9-4e6b-88ff-a9dd06a7f9efЧrunning§runtimeÏoòäc¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$0975547d-67d9-4e6b-88ff-a9dd06a7f9ef¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ*w
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚµšY>Êm°persist_js_state·has_pluto_hook_features±published_objects€¥bonds€´cell_execution_orderÜ0Ù$7deadd58-b202-4508-b4c7-686f742cb713Ù$d6b1729a-874d-11ee-151a-9b0fcce2c4fdÙ$5df97874-f09c-4173-a2f6-893db322ccafÙ$8529f36d-2d39-4b45-a821-01c8346539fdÙ$6dfe338d-de85-4adb-b030-09455fae78a0Ù$8e474add-8651-431b-b481-7a139037dbd2Ù$c6e33cb8-f42c-4643-9257-124d2804d3daÙ$0266632d-5ca4-4196-a523-33a66dd70e0cÙ$0975547d-67d9-4e6b-88ff-a9dd06a7f9efÙ$f11a2fa2-eff9-4979-b739-3da2b24a9a45Ù$d16efa62-dce7-4ec3-9e3c-b5e1677377fcÙ$35ff3402-dc36-4b91-bec9-b4d21faf3e68Ù$ea542271-01c2-4962-a708-804b23a861b9Ù$c47a50b8-c930-4c96-9b34-2772186634d9Ù$7a66ab47-918f-4582-895f-1b4690562051Ù$1231b832-47b1-4ccb-9b56-a67838598cc7Ù$e4c80c24-20fd-42e5-9dcd-a65958569c01Ù$74666c1a-2673-4936-982b-6229bf92af66Ù$0f96a83d-96ef-4768-9330-87c466e35c93Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5fÙ$8b4a1ad9-2d6a-4c8f-bb8e-f43c2d058195Ù$3abca406-2e6b-4b37-8835-65cfad9d0caaÙ$ada602d2-4f4b-4fb4-a763-8a639e05ff38Ù$9a88a54b-bcc7-41ad-8e60-f4d450dccb2dÙ$41d14dec-b852-4316-aefb-c3d08fa43216Ù$97104c46-e81f-444a-957f-0bbb1b02f1b8Ù$ee7e81e7-484c-44a8-a191-f73e24707ce9Ù$2ee7ba47-02e5-4b02-a162-ddbd5ed47c7bÙ$27686262-1a1e-45fa-b4ee-90ae1d9ee34eÙ$e4ef5145-a63c-4f91-ac04-3b5bf16c0842Ù$1a83d897-705b-443d-89a4-ea5e3e6a3c07Ù$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7cÙ$4a4a6bd3-b820-479c-89e3-f3ce79a316dbÙ$964404f6-7f46-4df9-ad98-921948c3be69Ù$3357a283-a234-4d15-8fdf-7fbec58b33a7Ù$27e65680-22a0-4079-b6df-d60a3218e52eÙ$f1f3b700-5916-496f-b938-46f7f08b4eb6Ù$4e1434e1-673f-4206-a271-9edec10ebd6aÙ$c02f3898-10cb-4f1e-b5ef-eb42b803baedÙ$45952512-aaf1-43d8-a95e-c32bb2633f42Ù$97479437-9ce3-4b33-9134-0f2af89bccb5Ù$1c79b37e-d4e0-490f-9466-20ce28f017aeÙ$2e65ae31-f50a-462b-9744-80bf6cdb388eÙ$34824db7-13c4-45e2-befa-f027b9b585c0Ù$fe8bbcd2-e8f5-4225-80c3-47e73176fb3dÙ$ab8dc1ce-d1ef-43a0-9495-dac931b52aecÙ$58be4150-2b7a-4f9e-a7d7-40a086fd3a53Ù$abea2c43-d83e-4438-8cd3-4be06b8174b3®process_status¥ready­julia_version§v1.13.2ªcell_orderÜ0Ù$5df97874-f09c-4173-a2f6-893db322ccafÙ$8529f36d-2d39-4b45-a821-01c8346539fdÙ$6dfe338d-de85-4adb-b030-09455fae78a0Ù$d6b1729a-874d-11ee-151a-9b0fcce2c4fdÙ$8e474add-8651-431b-b481-7a139037dbd2Ù$c6e33cb8-f42c-4643-9257-124d2804d3daÙ$0266632d-5ca4-4196-a523-33a66dd70e0cÙ$0975547d-67d9-4e6b-88ff-a9dd06a7f9efÙ$f11a2fa2-eff9-4979-b739-3da2b24a9a45Ù$d16efa62-dce7-4ec3-9e3c-b5e1677377fcÙ$35ff3402-dc36-4b91-bec9-b4d21faf3e68Ù$ea542271-01c2-4962-a708-804b23a861b9Ù$c47a50b8-c930-4c96-9b34-2772186634d9Ù$7a66ab47-918f-4582-895f-1b4690562051Ù$1231b832-47b1-4ccb-9b56-a67838598cc7Ù$e4c80c24-20fd-42e5-9dcd-a65958569c01Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5fÙ$8b4a1ad9-2d6a-4c8f-bb8e-f43c2d058195Ù$3abca406-2e6b-4b37-8835-65cfad9d0caaÙ$74666c1a-2673-4936-982b-6229bf92af66Ù$ada602d2-4f4b-4fb4-a763-8a639e05ff38Ù$41d14dec-b852-4316-aefb-c3d08fa43216Ù$9a88a54b-bcc7-41ad-8e60-f4d450dccb2dÙ$0f96a83d-96ef-4768-9330-87c466e35c93Ù$97104c46-e81f-444a-957f-0bbb1b02f1b8Ù$ee7e81e7-484c-44a8-a191-f73e24707ce9Ù$2ee7ba47-02e5-4b02-a162-ddbd5ed47c7bÙ$27686262-1a1e-45fa-b4ee-90ae1d9ee34eÙ$e4ef5145-a63c-4f91-ac04-3b5bf16c0842Ù$1a83d897-705b-443d-89a4-ea5e3e6a3c07Ù$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7cÙ$4a4a6bd3-b820-479c-89e3-f3ce79a316dbÙ$964404f6-7f46-4df9-ad98-921948c3be69Ù$3357a283-a234-4d15-8fdf-7fbec58b33a7Ù$27e65680-22a0-4079-b6df-d60a3218e52eÙ$f1f3b700-5916-496f-b938-46f7f08b4eb6Ù$4e1434e1-673f-4206-a271-9edec10ebd6aÙ$c02f3898-10cb-4f1e-b5ef-eb42b803baedÙ$45952512-aaf1-43d8-a95e-c32bb2633f42Ù$97479437-9ce3-4b33-9134-0f2af89bccb5Ù$1c79b37e-d4e0-490f-9466-20ce28f017aeÙ$2e65ae31-f50a-462b-9744-80bf6cdb388eÙ$34824db7-13c4-45e2-befa-f027b9b585c0Ù$fe8bbcd2-e8f5-4225-80c3-47e73176fb3dÙ$ab8dc1ce-d1ef-43a0-9495-dac931b52aecÙ$58be4150-2b7a-4f9e-a7d7-40a086fd3a53Ù$abea2c43-d83e-4438-8cd3-4be06b8174b3Ù$7deadd58-b202-4508-b4c7-686f742cb713«cell_inputsÞ0Ù$35ff3402-dc36-4b91-bec9-b4d21faf3e68„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$35ff3402-dc36-4b91-bec9-b4d21faf3e68«code_folded¤codeÙ=# (1.5) Plot the generated Phantom plot_phantom_map(obj, :T1)Ù$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7c„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7c«code_folded¤codeÚG# (3.5) Compare the plot in (3.4) with (2.6) begin signal_layout = Layout(yaxis=attr(range=[-5, 16.5])) relayout!(signal_gre, signal_layout; title="GRE-T2") relayout!(signal_t2_star_gre, signal_layout; title="GRE-T2*") fig_signal_2 = [signal_gre signal_t2_star_gre] relayout(fig_signal_2, showlegend=false, height=400) endÙ$2e65ae31-f50a-462b-9744-80bf6cdb388e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$2e65ae31-f50a-462b-9744-80bf6cdb388e«code_folded¤codeÙy# (4.9) Reconstruct the 1D image recon_t2_star_se = Plot(abs.(fftc(raw_t2_star_se.profiles[1].data)), Layout(height=400))Ù$45952512-aaf1-43d8-a95e-c32bb2633f42„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$45952512-aaf1-43d8-a95e-c32bb2633f42«code_foldedäcodeÙ¡md""" - (4.7) Simulate using `seq_se` and `obj_t2star` - (4.8) Compare the signal obtained in (4.6) with the one at (3.5) - (4.9) Reconstruct the 1D image """Ù$34824db7-13c4-45e2-befa-f027b9b585c0„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$34824db7-13c4-45e2-befa-f027b9b585c0«code_folded¤codeÙ³begin relayout!(recon_t2_star_se, recon_layout; title="SE") fig_recon_3 = [recon_gre recon_t2_star_gre recon_t2_star_se] relayout(fig_recon_3, showlegend=false, height=400) endÙ$97104c46-e81f-444a-957f-0bbb1b02f1b8„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$97104c46-e81f-444a-957f-0bbb1b02f1b8«code_foldedäcodeÚSmd""" # 3. $T_{2}^{*}$-decay The $$T_{2}^{*}$$-decay is the signal decay produced by microscopic distribution of off-resonance. $(Resource("https://raw.githubusercontent.com/LIBREhub/MRI-processing-2023/main/02-simulation/Figures/T2star.png", :width=>"400px")) The exact distribution of off-resonance is $$p_{\Delta w}(w) = \frac{T_2^{'}}{\pi(1+T_2^{'2} w^2)},\quad\text{with }\frac{1}{T_2^{*}} = \frac{1}{T_2} + \frac{1}{T_2^{'}}.$$ In this excercise we will simplify this distribution, but we will obtain a similar effect. - (3.1) Create a new phantom named `obj_t2star` with spins at the same positions as the original phantom `obj`, each having a linear distribution of off-resonance. To achieve this, follow these steps: * (3.1.1) Create an empty phantom called `obj_t2star`. * (3.1.2) Create a linear off-resonance distribution such that the range $$2\pi [-10, 10]\,\mathrm{rad/s}$$ is covered uniformly with $$N_{\mathrm{isochromats}} = 20$$ (use the function `range(start, stop, length)`). * (3.1.3) Iterate over the elements `off` of the linear distribution (`for` loop) and create copies of the original phantom (`obj_aux = copy(obj)`) and set the off-resonance of that copy to `off` with `obj_aux.Δw .= off`. * (3.1.4) Update `obj_t2star` by appending the modified copies `obj_aux` (`obj_t2star += obj_aux`). * (3.1.5) Finally, outside the loop, divide the proton density `obj_t2star.Ï�` by $$N_{\mathrm{isochromats}} = 20$$ and rename the phantom `obj_t2star.name = "T2 star phantom"`. - (3.2) Plot `obj_t2star` with `plot_phantom_map(obj_t2star, :Δw)` and verify it is correct """Ù$97479437-9ce3-4b33-9134-0f2af89bccb5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$97479437-9ce3-4b33-9134-0f2af89bccb5«code_folded¤codeÙ_# (4.7) Simulate using seq_se and obj_t2star raw_t2_star_se = simulate(obj_t2star, seq_se, sys)Ù$7a66ab47-918f-4582-895f-1b4690562051„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$7a66ab47-918f-4582-895f-1b4690562051«code_folded¤codeÙ_# (1.7) Plot the resulting raw data with plot_signal plot_signal(raw; slider=false, height=400)Ù$964404f6-7f46-4df9-ad98-921948c3be69„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$964404f6-7f46-4df9-ad98-921948c3be69«code_folded¤codeÚbegin recon_layout = Layout(yaxis=attr(range=[0, 0.8])) relayout!(recon_gre, recon_layout; title="GRE-T2") relayout!(recon_t2_star_gre, recon_layout; title="GRE-T2*") fig_recon_2 = [recon_gre recon_t2_star_gre] relayout(fig_recon_2, showlegend=false, height=400) endÙ$4a4a6bd3-b820-479c-89e3-f3ce79a316db„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4a4a6bd3-b820-479c-89e3-f3ce79a316db«code_folded¤codeÙ{# (3.6) Reconstruct the 1D image recon_t2_star_gre = Plot(abs.(fftc(raw_t2_star_gre.profiles[1].data)), Layout(height=400))Ù$74666c1a-2673-4936-982b-6229bf92af66„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$74666c1a-2673-4936-982b-6229bf92af66«code_foldedäcodeÙîmd""" - (2.5) Simulate the `seq_gre` sequence - (2.6) Plot the simulated signal - (2.7) Reconstruct the 1D image - (2.8) Do you notice anything weird? If the answer is yes, try adjusting `Ax` to change the `FOV` of the acquisition """Ù$ada602d2-4f4b-4fb4-a763-8a639e05ff38„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ada602d2-4f4b-4fb4-a763-8a639e05ff38«code_folded¤codeÙK# (2.5) Simulate the seq_gre sequence raw_gre = simulate(obj, seq_gre, sys)Ù$1a83d897-705b-443d-89a4-ea5e3e6a3c07„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1a83d897-705b-443d-89a4-ea5e3e6a3c07«code_folded¤codeÙÁ# (3.4) Plot the simulated signal begin signal_t2_star_gre = plot_signal(raw_t2_star_gre; slider=false, height=400) addtraces!(signal_t2_star_gre, t2_decay(t_adc_gre)) signal_t2_star_gre endÙ$27686262-1a1e-45fa-b4ee-90ae1d9ee34e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$27686262-1a1e-45fa-b4ee-90ae1d9ee34e«code_foldedäcodeÙ¥md""" - (3.3) Simulate the `seq_gre` sequence - (3.4) Plot the simulated signal - (3.5) Compare the plot in (3.5) with (2.6) - (3.6) Reconstruct the 1D image """Ù$2ee7ba47-02e5-4b02-a162-ddbd5ed47c7b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$2ee7ba47-02e5-4b02-a162-ddbd5ed47c7b«code_folded¤codeÙ:# (3.2) Plot obj_t2star plot_phantom_map(obj_t2star, :Δw)Ù$e4ef5145-a63c-4f91-ac04-3b5bf16c0842„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e4ef5145-a63c-4f91-ac04-3b5bf16c0842«code_folded¤codeÙZ# (3.3) Simulate the seq_gre sequence raw_t2_star_gre = simulate(obj_t2star, seq_gre, sys)Ù$8529f36d-2d39-4b45-a821-01c8346539fd„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$8529f36d-2d39-4b45-a821-01c8346539fd«code_foldedäcodeÙITableOfContents() # There should be a table of contents on the right --->Ù$1231b832-47b1-4ccb-9b56-a67838598cc7„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1231b832-47b1-4ccb-9b56-a67838598cc7«code_folded¤codeÙ÷# (1.8) Is the signal the same as `Plot(t, exp.(-t ./ T2))`? begin t = range(0, 50, 100) t2_decay(t) = scatter(x=t, y=20.0.*exp.(-t ./ 50), name="T2-decay", marker_color="purple") Plot(t2_decay(t), Layout(yaxis_range=[0, 20.1], height=400)) endÙ$41d14dec-b852-4316-aefb-c3d08fa43216„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$41d14dec-b852-4316-aefb-c3d08fa43216«code_folded¤codeÙá# (2.6) Plot the simulated signal begin t_adc_gre = KomaMRICore.get_adc_sampling_times(seq_gre)*1e3 signal_gre = plot_signal(raw_gre; slider=false, height=400) addtraces!(signal_gre, t2_decay(t_adc_gre)) signal_gre endÙ$ab8dc1ce-d1ef-43a0-9495-dac931b52aec„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ab8dc1ce-d1ef-43a0-9495-dac931b52aec«code_folded¤codeÙE# Set this boolean to `true` when you finish activity_finished = trueÙ$58be4150-2b7a-4f9e-a7d7-40a086fd3a53„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$58be4150-2b7a-4f9e-a7d7-40a086fd3a53«code_foldedäcodeÙ°if activity_finished html""" """ endÙ$d16efa62-dce7-4ec3-9e3c-b5e1677377fc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d16efa62-dce7-4ec3-9e3c-b5e1677377fc«code_folded¤codeÙ’# (1.4) A Phantom with 20 spins begin obj = Phantom(x=collect(range(-1e-3,1e-3,20))) obj.Ï� .= 1 obj.T1 .= 500e-3 obj.T2 .= 50e-3 nothing endÙ$c02f3898-10cb-4f1e-b5ef-eb42b803baed„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$c02f3898-10cb-4f1e-b5ef-eb42b803baed«code_folded¤codeÙ¨begin relayout!(kspace_gre; title="GRE") relayout!(kspace_se; title="SE") fig_kspace = [kspace_gre kspace_se] relayout(fig_kspace, showlegend=false, height=400) endÙ$3357a283-a234-4d15-8fdf-7fbec58b33a7„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$3357a283-a234-4d15-8fdf-7fbec58b33a7«code_foldedäcodeÚWmd""" # 4. Spin Echo $(Resource("https://raw.githubusercontent.com/LIBREhub/MRI-processing-2023/main/02-simulation/Figures/SE.gif", :width=>"400px")) The spin echo experiment has the advantage that the echo signal amplitud it is modulated by $$\exp(-t/T_2)$$ and not $$\exp(-t/T_2^{*})$$. For this section we will use the phantom `obj_t2star` and a new sequence `seq_se`. For this sequence we will need: - (4.1) A 90deg hard RF pulse - (4.2) A `Delay` of $$\mathrm{TE}/2$$ with a positive gradient (area `Ax`) - (4.3) A 180deg hard RF pulse - (4.4) A readout gradient of area `2Ax` with an ADC (similar to (2.2)), such that the middle of the gradient and ADC are in $$\mathrm{TE}$$ - (4.5) Create concatenating these blocks into a sequence called `seq_se` - (4.6) Plot `seq_se` and its k-space. Is the k-space the same as `seq_gre` in (2.3)? """Ù$f11a2fa2-eff9-4979-b739-3da2b24a9a45„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$f11a2fa2-eff9-4979-b739-3da2b24a9a45«code_foldedäcodeÚmd""" Generate a virtual object: - (1.4) A Phantom with 20 spins, with properties: - `obj.x` = [-1, 1] mm (20 spins along the $x$-axis) - `obj.Ï�` .= 1 - `obj.T1` .= 500 ms - `obj.T2` .= 50 ms - (1.5) Plot the generated `Phantom` (check `plot_phantom_map`'s docs) """Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5f„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9179aa40-bb40-4a36-ae1e-00ae42935a5f«code_folded¤codeÚ~# (2.1) Create a gradient `gx_pre`, use the variable `Ax`!! begin T_gx_pre = 10e-3 gx_pre = Grad(-Ax/T_gx_pre, T_gx_pre, 0, 0) seq_gre = Sequence() seq_gre += rf seq_gre += gx_pre # (2.2) Append a `Sequence` block called `readout` gx = Grad(2*Ax/(2T_gx_pre), 2T_gx_pre, 0, 0) adc2 = ADC(100, 2T_gx_pre) readout = Sequence([gx;;], [RF(0,0);;], [adc2]) seq_gre += readout endÙ$e4c80c24-20fd-42e5-9dcd-a65958569c01„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e4c80c24-20fd-42e5-9dcd-a65958569c01«code_foldedäcodeÚhmd""" # 2. Gradient Echo $(Resource("https://raw.githubusercontent.com/LIBREhub/MRI-processing-2023/main/02-simulation/Figures/GRE.gif", :width=>"400px")) The gradient echo is one of the first steps to create an image. The big breakthrough was the addition of linearly increasing magnetic fields, or gradients, to encode the spin's positions in their frequency (Mmmh, someone said Fourier?). This works due to the fact that the frequency $$f$$ of a spin is $$f(x) = \frac{\gamma}{2\pi} B_z(x) = \frac{\gamma}{2\pi} G_x x.$$ Let's create a different sequence. - Create a 90-deg hard RF pulse and put it in a variable `seq_gre` - (2.1) Create a gradient with area `-Ax` using `gx_pre = Grad(A,T,rise,fall)` append to `seq_gre`. As an optional challenge, put `gx_pre.rise` and `gx_pre.fall` so the satisfy the `sys` requierements - (2.2) Append a `Sequence` block called `readout` that includes: - A gradient of twice the area, or `2Ax`. Call it `gx` - An `ADC` with `adc2.delay = gx.rise` and `adc2.T = gx.T` - (2.3) Plot `seq_gre` and its k-space - (2.4) Plot the $$k$$-space with the `plot_kspace` function """Ù$9a88a54b-bcc7-41ad-8e60-f4d450dccb2d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9a88a54b-bcc7-41ad-8e60-f4d450dccb2d«code_folded¤codeÙÕ# (2.7) Reconstruct the 1D image begin fftc(x; dims=[1,2]) = fftshift(fft(ifftshift(x, dims), dims), dims)/prod(size(x)[dims]) recon_gre = Plot(abs.(fftc(raw_gre.profiles[1].data)), Layout(height=400)) endÙ$27e65680-22a0-4079-b6df-d60a3218e52e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$27e65680-22a0-4079-b6df-d60a3218e52e«code_folded¤codeÚÈ# (4.5) Create concatenating these blocks into a sequence called `seq_se` begin # (4.1) A 90deg hard RF pulse seq_se = Sequence() seq_se += rf # (4.2) A `Delay` of TE/2 with a positive gradient (area `Ax`) seq_se += -1*gx_pre # (4.3) A 180deg hard RF pulse seq_se += (0.0+2.0im)*rf # (4.4) A readout gradient of area `2Ax` with an ADC (similar to (2.2)), such that the middle of the gradient and ADC are in $$\mathrm{TE}$$ seq_se += readout endÙ$1c79b37e-d4e0-490f-9466-20ce28f017ae„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1c79b37e-d4e0-490f-9466-20ce28f017ae«code_folded¤codeÚ¶# (4.8) Compare the signal obtained in (4.7) with the one at (3.4) begin t_adc_se = KomaMRICore.get_adc_sampling_times(seq_se)*1e3 signal_t2_star_se = plot_signal(raw_t2_star_se; slider=false, height=400) addtraces!(signal_t2_star_se, t2_decay(t_adc_se)) relayout!(signal_t2_star_se, signal_layout; title="SE") fig_signal_3 = [signal_gre signal_t2_star_gre signal_t2_star_se] relayout(fig_signal_3, showlegend=false, height=400) endÙ$ea542271-01c2-4962-a708-804b23a861b9„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ea542271-01c2-4962-a708-804b23a861b9«code_foldedäcodeÙêmd""" - (1.6) Finally, use the generated `seq`, `obj`, and `sys` to simulate the FID (check `simulate`'s docs) - (1.7) Plot the resulting raw data with `plot_signal`. - (1.8) Is the signal the same as `Plot(t, exp.(-t ./ T2))`? """Ù$ee7e81e7-484c-44a8-a191-f73e24707ce9„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ee7e81e7-484c-44a8-a191-f73e24707ce9«code_folded¤codeÚ¿# (3.1) Create the new obj_t2star phantom begin # (3.1.1) Create an empty phantom obj_t2star = Phantom() # (3.1.2) Define the linear off-resonance distribution Niso = 20 linear_offresonance_distribution = 2Ï€ .* range(-10, 10, Niso) # (3.1.3) Iterate over the linear off-resonance distribution and ... for off = linear_offresonance_distribution # ... copy the original phantom and modify its off-resonance aux = copy(obj) aux.Δw .= off aux.y .+= off * 1e-6 # So the distribution is visible # (3.1.4) Update the phantom obj_t2star += aux end # (3.1.5) Divide the proton density and rename the phantom obj_t2star.Ï� .= 1.0 / Niso obj_t2star.name = "T2 star phantom" endÙ$0266632d-5ca4-4196-a523-33a66dd70e0c„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$0266632d-5ca4-4196-a523-33a66dd70e0c«code_folded¤codeÙ:# (1.2) An ADC to capture the signal adc = ADC(100, 50e-3)Ù$5df97874-f09c-4173-a2f6-893db322ccaf„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$5df97874-f09c-4173-a2f6-893db322ccaf«code_foldedäcodeÙ'md"# Understanding basic MRI sequences"Ù$d6b1729a-874d-11ee-151a-9b0fcce2c4fd„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d6b1729a-874d-11ee-151a-9b0fcce2c4fd«code_folded¤codeÙ:using KomaMRICore, KomaMRIPlots, FFTW, PlotlyBase, PlutoUIÙ$6dfe338d-de85-4adb-b030-09455fae78a0„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6dfe338d-de85-4adb-b030-09455fae78a0«code_foldedäcodeÙ¾md""" Welcome to the hands-on session on MRI simulation. Let's have some fun! If you have any doubts about how to use a function, please search in the **Live Docs** at the bottom right. """Ù$3abca406-2e6b-4b37-8835-65cfad9d0caa„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$3abca406-2e6b-4b37-8835-65cfad9d0caa«code_folded¤codeÙh# (2.4) Plot the $k$-space with the `plot_kspace` function kspace_gre = plot_kspace(seq_gre; height=400)Ù$c47a50b8-c930-4c96-9b34-2772186634d9„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$c47a50b8-c930-4c96-9b34-2772186634d9«code_folded¤codeÙf# (1.6) Finally, use the generated seq, obj, and sys to simulate the FID raw = simulate(obj, seq, sys)Ù$fe8bbcd2-e8f5-4225-80c3-47e73176fb3d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$fe8bbcd2-e8f5-4225-80c3-47e73176fb3d«code_foldedäcodeÙMmd""" Congratulations! you finished the simulation hands-on session 🥳! """Ù$abea2c43-d83e-4438-8cd3-4be06b8174b3„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$abea2c43-d83e-4438-8cd3-4be06b8174b3«code_foldedäcodeÙßmd"""# Reproducibility This [Pluto notebook](https://plutojl.org/) is reproducible by default, as it has an embedded `Project.toml` and `Manifest.toml`, that store the exact package versions used to create the notebook."""Ù$f1f3b700-5916-496f-b938-46f7f08b4eb6„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$f1f3b700-5916-496f-b938-46f7f08b4eb6«code_folded¤codeÙ|# (4.6) Plot seq_se and its k-space. Is the k-space the same as seq_gre in (2.3)? plot_seq(seq_se; slider=false, height=400)Ù$0f96a83d-96ef-4768-9330-87c466e35c93„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$0f96a83d-96ef-4768-9330-87c466e35c93«code_folded¤codeÙƒ# (2.8) Do you notice anything weird? Change Ax! @bind Ax Slider(range(0, 20, 20)*1e-5, default=10e-5) # Gradient's area in [T/m s]Ù$8e474add-8651-431b-b481-7a139037dbd2„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$8e474add-8651-431b-b481-7a139037dbd2«code_foldedäcodeÚ×md"""# 1. Free Induction Decay (FID) The free induction decay is the simplest observable NMR signal. This signal is the one that follows a single tipping RF pulse. $(PlutoUI.Resource("https://raw.githubusercontent.com/LIBREhub/MRI-processing-2023/main/02-simulation/Figures/FID.png", :width=>"300px")) To recreate this experiment, we will need to define a `Sequence`: - (1.1) A 90-deg block RF pulse, put it in a variable `seq` (check `PulseDesigner.RF_hard`'s docs using the Live Docs) - (1.2) An ADC to capture the signal in a variable `adc`, concatenate with (1.1) using `seq += adc` - (1.3) Plot the generated `Sequence` (check `plot_seq`'s docs) For the hardware limits use the default scanner `sys = Scanner()`. """Ù$4e1434e1-673f-4206-a271-9edec10ebd6a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4e1434e1-673f-4206-a271-9edec10ebd6a«code_folded¤codeÙ+kspace_se = plot_kspace(seq_se; height=400)Ù$8b4a1ad9-2d6a-4c8f-bb8e-f43c2d058195„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$8b4a1ad9-2d6a-4c8f-bb8e-f43c2d058195«code_folded¤codeÙR# (2.3) Plot `seq_gre` and the k-space plot_seq(seq_gre; slider=false, height=400)Ù$c6e33cb8-f42c-4643-9257-124d2804d3da„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$c6e33cb8-f42c-4643-9257-124d2804d3da«code_folded¤codeÙ¸# (1.1) A 90-deg block RF pulse begin sys = Scanner() durRF = Ï€/2/(2Ï€*γ*sys.limits.B1); #90-degree hard excitation pulse rf = PulseDesigner.RF_hard(sys.limits.B1, durRF, sys) endÙ$7deadd58-b202-4508-b4c7-686f742cb713„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$7deadd58-b202-4508-b4c7-686f742cb713«code_foldedäcodeÚ?begin begin using Pkg begin println("OS $(Base.Sys.MACHINE)") # OS println("Julia $VERSION") # Julia version # Koma sub-packages for (_, pkg) in filter(((_, pkg),) -> occursin("KomaMRI", pkg.name), Pkg.dependencies()) println("$(pkg.name) $(pkg.version)") end end end endÙ$0975547d-67d9-4e6b-88ff-a9dd06a7f9ef„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$0975547d-67d9-4e6b-88ff-a9dd06a7f9ef«code_folded¤codeÙ# (1.3) Plot the generated Sequence begin seq = Sequence() seq += rf seq += adc plot_seq(seq; slider=false, height=400) end´last_hot_reload_time˱cell_dependenciesÞ0Ù$35ff3402-dc36-4b91-bec9-b4d21faf3e68„´precedence_heuristic §cell_idÙ$35ff3402-dc36-4b91-bec9-b4d21faf3e68´downstream_cells_map€²upstream_cells_map‚°plot_phantom_map�£obj‘Ù$d16efa62-dce7-4ec3-9e3c-b5e1677377fcÙ$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7c„´precedence_heuristic §cell_idÙ$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7c´downstream_cells_map‚¬fig_signal_2�­signal_layout‘Ù$1c79b37e-d4e0-490f-9466-20ce28f017ae²upstream_cells_map†ªsignal_gre‘Ù$41d14dec-b852-4316-aefb-c3d08fa43216¦Layout�©relayout!�²signal_t2_star_gre‘Ù$1a83d897-705b-443d-89a4-ea5e3e6a3c07¨relayout�¤attr�Ù$2e65ae31-f50a-462b-9744-80bf6cdb388e„´precedence_heuristic §cell_idÙ$2e65ae31-f50a-462b-9744-80bf6cdb388e´downstream_cells_map�°recon_t2_star_se‘Ù$34824db7-13c4-45e2-befa-f027b9b585c0²upstream_cells_map…¤Plot�¦Layout�¤fftc‘Ù$9a88a54b-bcc7-41ad-8e60-f4d450dccb2d®raw_t2_star_se‘Ù$97479437-9ce3-4b33-9134-0f2af89bccb5£abs�Ù$45952512-aaf1-43d8-a95e-c32bb2633f42„´precedence_heuristic §cell_idÙ$45952512-aaf1-43d8-a95e-c32bb2633f42´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$34824db7-13c4-45e2-befa-f027b9b585c0„´precedence_heuristic §cell_idÙ$34824db7-13c4-45e2-befa-f027b9b585c0´downstream_cells_map�«fig_recon_3�²upstream_cells_map†±recon_t2_star_gre‘Ù$4a4a6bd3-b820-479c-89e3-f3ce79a316db¬recon_layout‘Ù$964404f6-7f46-4df9-ad98-921948c3be69©relayout!�°recon_t2_star_se‘Ù$2e65ae31-f50a-462b-9744-80bf6cdb388e¨relayout�©recon_gre‘Ù$9a88a54b-bcc7-41ad-8e60-f4d450dccb2dÙ$97104c46-e81f-444a-957f-0bbb1b02f1b8„´precedence_heuristic §cell_idÙ$97104c46-e81f-444a-957f-0bbb1b02f1b8´downstream_cells_map€²upstream_cells_map„¨Resource�§@md_str�¨getindex�¢=>�Ù$97479437-9ce3-4b33-9134-0f2af89bccb5„´precedence_heuristic §cell_idÙ$97479437-9ce3-4b33-9134-0f2af89bccb5´downstream_cells_map�®raw_t2_star_se’Ù$1c79b37e-d4e0-490f-9466-20ce28f017aeÙ$2e65ae31-f50a-462b-9744-80bf6cdb388e²upstream_cells_map„¦seq_se‘Ù$27e65680-22a0-4079-b6df-d60a3218e52e£sys‘Ù$c6e33cb8-f42c-4643-9257-124d2804d3daªobj_t2star‘Ù$ee7e81e7-484c-44a8-a191-f73e24707ce9¨simulate�Ù$7a66ab47-918f-4582-895f-1b4690562051„´precedence_heuristic §cell_idÙ$7a66ab47-918f-4582-895f-1b4690562051´downstream_cells_map€²upstream_cells_map‚«plot_signal�£raw‘Ù$c47a50b8-c930-4c96-9b34-2772186634d9Ù$964404f6-7f46-4df9-ad98-921948c3be69„´precedence_heuristic §cell_idÙ$964404f6-7f46-4df9-ad98-921948c3be69´downstream_cells_map‚«fig_recon_2�¬recon_layout‘Ù$34824db7-13c4-45e2-befa-f027b9b585c0²upstream_cells_map†±recon_t2_star_gre‘Ù$4a4a6bd3-b820-479c-89e3-f3ce79a316db¦Layout�©recon_gre‘Ù$9a88a54b-bcc7-41ad-8e60-f4d450dccb2d©relayout!�¨relayout�¤attr�Ù$4a4a6bd3-b820-479c-89e3-f3ce79a316db„´precedence_heuristic §cell_idÙ$4a4a6bd3-b820-479c-89e3-f3ce79a316db´downstream_cells_map�±recon_t2_star_gre’Ù$964404f6-7f46-4df9-ad98-921948c3be69Ù$34824db7-13c4-45e2-befa-f027b9b585c0²upstream_cells_map…¤Plot�¦Layout�¤fftc‘Ù$9a88a54b-bcc7-41ad-8e60-f4d450dccb2d¯raw_t2_star_gre‘Ù$e4ef5145-a63c-4f91-ac04-3b5bf16c0842£abs�Ù$74666c1a-2673-4936-982b-6229bf92af66„´precedence_heuristic §cell_idÙ$74666c1a-2673-4936-982b-6229bf92af66´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$ada602d2-4f4b-4fb4-a763-8a639e05ff38„´precedence_heuristic §cell_idÙ$ada602d2-4f4b-4fb4-a763-8a639e05ff38´downstream_cells_map�§raw_gre’Ù$41d14dec-b852-4316-aefb-c3d08fa43216Ù$9a88a54b-bcc7-41ad-8e60-f4d450dccb2d²upstream_cells_map„£obj‘Ù$d16efa62-dce7-4ec3-9e3c-b5e1677377fc£sys‘Ù$c6e33cb8-f42c-4643-9257-124d2804d3da¨simulate�§seq_gre‘Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5fÙ$1a83d897-705b-443d-89a4-ea5e3e6a3c07„´precedence_heuristic §cell_idÙ$1a83d897-705b-443d-89a4-ea5e3e6a3c07´downstream_cells_map�²signal_t2_star_gre’Ù$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7cÙ$1c79b37e-d4e0-490f-9466-20ce28f017ae²upstream_cells_map…«plot_signal�¯raw_t2_star_gre‘Ù$e4ef5145-a63c-4f91-ac04-3b5bf16c0842ªaddtraces!�¨t2_decay‘Ù$1231b832-47b1-4ccb-9b56-a67838598cc7©t_adc_gre‘Ù$41d14dec-b852-4316-aefb-c3d08fa43216Ù$27686262-1a1e-45fa-b4ee-90ae1d9ee34e„´precedence_heuristic §cell_idÙ$27686262-1a1e-45fa-b4ee-90ae1d9ee34e´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$2ee7ba47-02e5-4b02-a162-ddbd5ed47c7b„´precedence_heuristic §cell_idÙ$2ee7ba47-02e5-4b02-a162-ddbd5ed47c7b´downstream_cells_map€²upstream_cells_map‚ªobj_t2star‘Ù$ee7e81e7-484c-44a8-a191-f73e24707ce9°plot_phantom_map�Ù$e4ef5145-a63c-4f91-ac04-3b5bf16c0842„´precedence_heuristic §cell_idÙ$e4ef5145-a63c-4f91-ac04-3b5bf16c0842´downstream_cells_map�¯raw_t2_star_gre’Ù$1a83d897-705b-443d-89a4-ea5e3e6a3c07Ù$4a4a6bd3-b820-479c-89e3-f3ce79a316db²upstream_cells_map„£sys‘Ù$c6e33cb8-f42c-4643-9257-124d2804d3daªobj_t2star‘Ù$ee7e81e7-484c-44a8-a191-f73e24707ce9¨simulate�§seq_gre‘Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5fÙ$8529f36d-2d39-4b45-a821-01c8346539fd„´precedence_heuristic §cell_idÙ$8529f36d-2d39-4b45-a821-01c8346539fd´downstream_cells_map€²upstream_cells_map�¯TableOfContents�Ù$1231b832-47b1-4ccb-9b56-a67838598cc7„´precedence_heuristic §cell_idÙ$1231b832-47b1-4ccb-9b56-a67838598cc7´downstream_cells_map‚¡t�¨t2_decay“Ù$41d14dec-b852-4316-aefb-c3d08fa43216Ù$1a83d897-705b-443d-89a4-ea5e3e6a3c07Ù$1c79b37e-d4e0-490f-9466-20ce28f017ae²upstream_cells_mapˆ¤Plot�¡/�¦Layout�¡-�£exp�§scatter�¡*�¥range�Ù$41d14dec-b852-4316-aefb-c3d08fa43216„´precedence_heuristic §cell_idÙ$41d14dec-b852-4316-aefb-c3d08fa43216´downstream_cells_map‚ªsignal_gre’Ù$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7cÙ$1c79b37e-d4e0-490f-9466-20ce28f017ae©t_adc_gre‘Ù$1a83d897-705b-443d-89a4-ea5e3e6a3c07²upstream_cells_mapˆ«KomaMRICore‘Ù$d6b1729a-874d-11ee-151a-9b0fcce2c4fdÙ"KomaMRICore.get_adc_sampling_times�«plot_signal�ªaddtraces!�§raw_gre‘Ù$ada602d2-4f4b-4fb4-a763-8a639e05ff38¡*�¨t2_decay‘Ù$1231b832-47b1-4ccb-9b56-a67838598cc7§seq_gre‘Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5fÙ$ab8dc1ce-d1ef-43a0-9495-dac931b52aec„´precedence_heuristic §cell_idÙ$ab8dc1ce-d1ef-43a0-9495-dac931b52aec´downstream_cells_map�±activity_finished‘Ù$58be4150-2b7a-4f9e-a7d7-40a086fd3a53²upstream_cells_map€Ù$58be4150-2b7a-4f9e-a7d7-40a086fd3a53„´precedence_heuristic §cell_idÙ$58be4150-2b7a-4f9e-a7d7-40a086fd3a53´downstream_cells_map€²upstream_cells_map„±activity_finished‘Ù$ab8dc1ce-d1ef-43a0-9495-dac931b52aec¤Base�©@html_str�®Base.Docs.HTML�Ù$d16efa62-dce7-4ec3-9e3c-b5e1677377fc„´precedence_heuristic §cell_idÙ$d16efa62-dce7-4ec3-9e3c-b5e1677377fc´downstream_cells_map�£obj”Ù$35ff3402-dc36-4b91-bec9-b4d21faf3e68Ù$c47a50b8-c930-4c96-9b34-2772186634d9Ù$ada602d2-4f4b-4fb4-a763-8a639e05ff38Ù$ee7e81e7-484c-44a8-a191-f73e24707ce9²upstream_cells_map„§collect�§nothing�§Phantom�¥range�Ù$c02f3898-10cb-4f1e-b5ef-eb42b803baed„´precedence_heuristic §cell_idÙ$c02f3898-10cb-4f1e-b5ef-eb42b803baed´downstream_cells_map�ªfig_kspace�²upstream_cells_map„©relayout!�ªkspace_gre‘Ù$3abca406-2e6b-4b37-8835-65cfad9d0caa©kspace_se‘Ù$4e1434e1-673f-4206-a271-9edec10ebd6a¨relayout�Ù$3357a283-a234-4d15-8fdf-7fbec58b33a7„´precedence_heuristic §cell_idÙ$3357a283-a234-4d15-8fdf-7fbec58b33a7´downstream_cells_map€²upstream_cells_map„¨Resource�§@md_str�¨getindex�¢=>�Ù$f11a2fa2-eff9-4979-b739-3da2b24a9a45„´precedence_heuristic §cell_idÙ$f11a2fa2-eff9-4979-b739-3da2b24a9a45´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5f„´precedence_heuristic §cell_idÙ$9179aa40-bb40-4a36-ae1e-00ae42935a5f´downstream_cells_map†¤adc2�¨T_gx_pre�¦gx_pre‘Ù$27e65680-22a0-4079-b6df-d60a3218e52e¢gx�§readout‘Ù$27e65680-22a0-4079-b6df-d60a3218e52e§seq_gre•Ù$8b4a1ad9-2d6a-4c8f-bb8e-f43c2d058195Ù$3abca406-2e6b-4b37-8835-65cfad9d0caaÙ$ada602d2-4f4b-4fb4-a763-8a639e05ff38Ù$41d14dec-b852-4316-aefb-c3d08fa43216Ù$e4ef5145-a63c-4f91-ac04-3b5bf16c0842²upstream_cells_mapŠ¡/�¤Grad�¢rf‘Ù$c6e33cb8-f42c-4643-9257-124d2804d3da£ADC�¢Ax‘Ù$0f96a83d-96ef-4768-9330-87c466e35c93¨Sequence�¡+�¡-�¡*�¢RF�Ù$e4c80c24-20fd-42e5-9dcd-a65958569c01„´precedence_heuristic §cell_idÙ$e4c80c24-20fd-42e5-9dcd-a65958569c01´downstream_cells_map€²upstream_cells_map„¨Resource�§@md_str�¨getindex�¢=>�Ù$9a88a54b-bcc7-41ad-8e60-f4d450dccb2d„´precedence_heuristic §cell_idÙ$9a88a54b-bcc7-41ad-8e60-f4d450dccb2d´downstream_cells_map‚¤fftc’Ù$4a4a6bd3-b820-479c-89e3-f3ce79a316dbÙ$2e65ae31-f50a-462b-9744-80bf6cdb388e©recon_gre’Ù$964404f6-7f46-4df9-ad98-921948c3be69Ù$34824db7-13c4-45e2-befa-f027b9b585c0²upstream_cells_mapФprod�¡/�¤Plot�¦Layout�£abs�¨fftshift�¤size�§raw_gre‘Ù$ada602d2-4f4b-4fb4-a763-8a639e05ff38©ifftshift�£fft�Ù$27e65680-22a0-4079-b6df-d60a3218e52e„´precedence_heuristic §cell_idÙ$27e65680-22a0-4079-b6df-d60a3218e52e´downstream_cells_map�¦seq_se”Ù$f1f3b700-5916-496f-b938-46f7f08b4eb6Ù$4e1434e1-673f-4206-a271-9edec10ebd6aÙ$97479437-9ce3-4b33-9134-0f2af89bccb5Ù$1c79b37e-d4e0-490f-9466-20ce28f017ae²upstream_cells_map‡¢rf‘Ù$c6e33cb8-f42c-4643-9257-124d2804d3da¢im�¨Sequence�¡+�¦gx_pre‘Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5f¡*�§readout‘Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5fÙ$1c79b37e-d4e0-490f-9466-20ce28f017ae„´precedence_heuristic §cell_idÙ$1c79b37e-d4e0-490f-9466-20ce28f017ae´downstream_cells_mapƒ¬fig_signal_3�±signal_t2_star_se�¨t_adc_se�²upstream_cells_map�«KomaMRICore‘Ù$d6b1729a-874d-11ee-151a-9b0fcce2c4fd¦seq_se‘Ù$27e65680-22a0-4079-b6df-d60a3218e52eªaddtraces!�©relayout!�­signal_layout‘Ù$18c82ff1-0bde-4fa0-848c-d0eb73d1ac7c²signal_t2_star_gre‘Ù$1a83d897-705b-443d-89a4-ea5e3e6a3c07®raw_t2_star_se‘Ù$97479437-9ce3-4b33-9134-0f2af89bccb5ªsignal_gre‘Ù$41d14dec-b852-4316-aefb-c3d08fa43216Ù"KomaMRICore.get_adc_sampling_times�«plot_signal�¡*�¨t2_decay‘Ù$1231b832-47b1-4ccb-9b56-a67838598cc7¨relayout�Ù$ea542271-01c2-4962-a708-804b23a861b9„´precedence_heuristic §cell_idÙ$ea542271-01c2-4962-a708-804b23a861b9´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$ee7e81e7-484c-44a8-a191-f73e24707ce9„´precedence_heuristic §cell_idÙ$ee7e81e7-484c-44a8-a191-f73e24707ce9´downstream_cells_mapƒªobj_t2star“Ù$2ee7ba47-02e5-4b02-a162-ddbd5ed47c7bÙ$e4ef5145-a63c-4f91-ac04-3b5bf16c0842Ù$97479437-9ce3-4b33-9134-0f2af89bccb5Ù linear_offresonance_distribution�¤Niso�²upstream_cells_mapˆ¤copy�¡/�£obj‘Ù$d16efa62-dce7-4ec3-9e3c-b5e1677377fc¢Ï€�¡+�§Phantom�¡*�¥range�Ù$0266632d-5ca4-4196-a523-33a66dd70e0c„´precedence_heuristic §cell_idÙ$0266632d-5ca4-4196-a523-33a66dd70e0c´downstream_cells_map�£adc‘Ù$0975547d-67d9-4e6b-88ff-a9dd06a7f9ef²upstream_cells_map�£ADC�Ù$5df97874-f09c-4173-a2f6-893db322ccaf„´precedence_heuristic §cell_idÙ$5df97874-f09c-4173-a2f6-893db322ccaf´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$d6b1729a-874d-11ee-151a-9b0fcce2c4fd„´precedence_heuristic§cell_idÙ$d6b1729a-874d-11ee-151a-9b0fcce2c4fd´downstream_cells_map…«KomaMRICore’Ù$41d14dec-b852-4316-aefb-c3d08fa43216Ù$1c79b37e-d4e0-490f-9466-20ce28f017ae¬KomaMRIPlots�¤FFTW�§PlutoUI‘Ù$8e474add-8651-431b-b481-7a139037dbd2ªPlotlyBase�²upstream_cells_map€Ù$6dfe338d-de85-4adb-b030-09455fae78a0„´precedence_heuristic §cell_idÙ$6dfe338d-de85-4adb-b030-09455fae78a0´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$3abca406-2e6b-4b37-8835-65cfad9d0caa„´precedence_heuristic §cell_idÙ$3abca406-2e6b-4b37-8835-65cfad9d0caa´downstream_cells_map�ªkspace_gre‘Ù$c02f3898-10cb-4f1e-b5ef-eb42b803baed²upstream_cells_map‚«plot_kspace�§seq_gre‘Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5fÙ$c47a50b8-c930-4c96-9b34-2772186634d9„´precedence_heuristic §cell_idÙ$c47a50b8-c930-4c96-9b34-2772186634d9´downstream_cells_map�£raw‘Ù$7a66ab47-918f-4582-895f-1b4690562051²upstream_cells_map„£sys‘Ù$c6e33cb8-f42c-4643-9257-124d2804d3da£seq‘Ù$0975547d-67d9-4e6b-88ff-a9dd06a7f9ef¨simulate�£obj‘Ù$d16efa62-dce7-4ec3-9e3c-b5e1677377fcÙ$fe8bbcd2-e8f5-4225-80c3-47e73176fb3d„´precedence_heuristic §cell_idÙ$fe8bbcd2-e8f5-4225-80c3-47e73176fb3d´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$abea2c43-d83e-4438-8cd3-4be06b8174b3„´precedence_heuristic §cell_idÙ$abea2c43-d83e-4438-8cd3-4be06b8174b3´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$f1f3b700-5916-496f-b938-46f7f08b4eb6„´precedence_heuristic §cell_idÙ$f1f3b700-5916-496f-b938-46f7f08b4eb6´downstream_cells_map€²upstream_cells_map‚¦seq_se‘Ù$27e65680-22a0-4079-b6df-d60a3218e52e¨plot_seq�Ù$0f96a83d-96ef-4768-9330-87c466e35c93„´precedence_heuristic §cell_idÙ$0f96a83d-96ef-4768-9330-87c466e35c93´downstream_cells_map�¢Ax‘Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5f²upstream_cells_mapФCore�¤Base�¥@bind�¨Base.get�«PlutoRunner�¦Slider�¯Core.applicable�¡*�·PlutoRunner.create_bond�¥range�Ù$8e474add-8651-431b-b481-7a139037dbd2„´precedence_heuristic §cell_idÙ$8e474add-8651-431b-b481-7a139037dbd2´downstream_cells_map€²upstream_cells_map…§PlutoUI‘Ù$d6b1729a-874d-11ee-151a-9b0fcce2c4fd§@md_str�¨getindex�¢=>�°PlutoUI.Resource�Ù$4e1434e1-673f-4206-a271-9edec10ebd6a„´precedence_heuristic §cell_idÙ$4e1434e1-673f-4206-a271-9edec10ebd6a´downstream_cells_map�©kspace_se‘Ù$c02f3898-10cb-4f1e-b5ef-eb42b803baed²upstream_cells_map‚¦seq_se‘Ù$27e65680-22a0-4079-b6df-d60a3218e52e«plot_kspace�Ù$8b4a1ad9-2d6a-4c8f-bb8e-f43c2d058195„´precedence_heuristic §cell_idÙ$8b4a1ad9-2d6a-4c8f-bb8e-f43c2d058195´downstream_cells_map€²upstream_cells_map‚¨plot_seq�§seq_gre‘Ù$9179aa40-bb40-4a36-ae1e-00ae42935a5fÙ$c6e33cb8-f42c-4643-9257-124d2804d3da„´precedence_heuristic §cell_idÙ$c6e33cb8-f42c-4643-9257-124d2804d3da´downstream_cells_mapƒ£sys”Ù$c47a50b8-c930-4c96-9b34-2772186634d9Ù$ada602d2-4f4b-4fb4-a763-8a639e05ff38Ù$e4ef5145-a63c-4f91-ac04-3b5bf16c0842Ù$97479437-9ce3-4b33-9134-0f2af89bccb5¢rf“Ù$0975547d-67d9-4e6b-88ff-a9dd06a7f9efÙ$9179aa40-bb40-4a36-ae1e-00ae42935a5fÙ$27e65680-22a0-4079-b6df-d60a3218e52e¥durRF�²upstream_cells_map‡¡/�µPulseDesigner.RF_hard�¢Ï€�¢Î³�¡*�­PulseDesigner�§Scanner�Ù$7deadd58-b202-4508-b4c7-686f742cb713„´precedence_heuristic§cell_idÙ$7deadd58-b202-4508-b4c7-686f742cb713´downstream_cells_map�£Pkg‘Ù$7deadd58-b202-4508-b4c7-686f742cb713²upstream_cells_map‡¤Base�§println�§VERSION�¨occursin�¦filter�£Pkg‘Ù$7deadd58-b202-4508-b4c7-686f742cb713°Pkg.dependencies�Ù$0975547d-67d9-4e6b-88ff-a9dd06a7f9ef„´precedence_heuristic §cell_idÙ$0975547d-67d9-4e6b-88ff-a9dd06a7f9ef´downstream_cells_map�£seq‘Ù$c47a50b8-c930-4c96-9b34-2772186634d9²upstream_cells_map…¢rf‘Ù$c6e33cb8-f42c-4643-9257-124d2804d3da¨Sequence�¡+�£adc‘Ù$0266632d-5ca4-4196-a523-33a66dd70e0c¨plot_seq�©shortpath½01-gradient-echo-spin-echo.jl®last_save_timeËAÚµšN‚¨?«notebook_idÙ$9ad10328-cbef-11f1-9e8d-21ad0c7e29f7¥nbpkgŠ­busy_packages�Ù,waiting_for_permission_but_probably_disabled§enabledðterminal_outputs‡«KomaMRICoreÚö Resolving... ===  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Project.toml` [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Manifest.toml` [b27032c2] ↑ LibCURL v0.6.4 ⇒ v1.0.0 [37e2e46d] ↑ LinearAlgebra v1.12.0 ⇒ v1.13.0 [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0 [ea8e919c] ↑ SHA v0.7.0 ⇒ v1.0.0 [2f01184e] ↑ SparseArrays v1.12.0 ⇒ v1.13.0 [e66e0078] ↑ CompilerSupportLibraries_jll v1.3.0+1 ⇒ v1.5.5+2 [deac9b47] ↑ LibCURL_jll v8.15.0+0 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.0+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.3+1 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2025.11.4 ⇒ v2026.8.13 [4536629a] ↑ OpenBLAS_jll v0.3.29+0 ⇒ v0.3.30+0 [458c3c95] ↑ OpenSSL_jll v3.5.4+0 ⇒ v3.5.8+0 [efcefdf7] + PCRE2_jll v10.46.0+0 [bea87d4a] ↑ SuiteSparse_jll v7.8.3+2 ⇒ v7.10.1+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [3161d3a3] + Zstd_jll v1.5.7+1 [8e850ede] ↑ nghttp2_jll v1.64.0+1 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.7.0+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...¬KomaMRIPlotsÚö Resolving... ===  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Project.toml` [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Manifest.toml` [b27032c2] ↑ LibCURL v0.6.4 ⇒ v1.0.0 [37e2e46d] ↑ LinearAlgebra v1.12.0 ⇒ v1.13.0 [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0 [ea8e919c] ↑ SHA v0.7.0 ⇒ v1.0.0 [2f01184e] ↑ SparseArrays v1.12.0 ⇒ v1.13.0 [e66e0078] ↑ CompilerSupportLibraries_jll v1.3.0+1 ⇒ v1.5.5+2 [deac9b47] ↑ LibCURL_jll v8.15.0+0 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.0+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.3+1 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2025.11.4 ⇒ v2026.8.13 [4536629a] ↑ OpenBLAS_jll v0.3.29+0 ⇒ v0.3.30+0 [458c3c95] ↑ OpenSSL_jll v3.5.4+0 ⇒ v3.5.8+0 [efcefdf7] + PCRE2_jll v10.46.0+0 [bea87d4a] ↑ SuiteSparse_jll v7.8.3+2 ⇒ v7.10.1+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [3161d3a3] + Zstd_jll v1.5.7+1 [8e850ede] ↑ nghttp2_jll v1.64.0+1 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.7.0+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...¤FFTWÚö Resolving... ===  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Project.toml` [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Manifest.toml` [b27032c2] ↑ LibCURL v0.6.4 ⇒ v1.0.0 [37e2e46d] ↑ LinearAlgebra v1.12.0 ⇒ v1.13.0 [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0 [ea8e919c] ↑ SHA v0.7.0 ⇒ v1.0.0 [2f01184e] ↑ SparseArrays v1.12.0 ⇒ v1.13.0 [e66e0078] ↑ CompilerSupportLibraries_jll v1.3.0+1 ⇒ v1.5.5+2 [deac9b47] ↑ LibCURL_jll v8.15.0+0 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.0+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.3+1 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2025.11.4 ⇒ v2026.8.13 [4536629a] ↑ OpenBLAS_jll v0.3.29+0 ⇒ v0.3.30+0 [458c3c95] ↑ OpenSSL_jll v3.5.4+0 ⇒ v3.5.8+0 [efcefdf7] + PCRE2_jll v10.46.0+0 [bea87d4a] ↑ SuiteSparse_jll v7.8.3+2 ⇒ v7.10.1+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [3161d3a3] + Zstd_jll v1.5.7+1 [8e850ede] ↑ nghttp2_jll v1.64.0+1 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.7.0+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...§PlutoUIÚö Resolving... ===  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Project.toml` [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Manifest.toml` [b27032c2] ↑ LibCURL v0.6.4 ⇒ v1.0.0 [37e2e46d] ↑ LinearAlgebra v1.12.0 ⇒ v1.13.0 [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0 [ea8e919c] ↑ SHA v0.7.0 ⇒ v1.0.0 [2f01184e] ↑ SparseArrays v1.12.0 ⇒ v1.13.0 [e66e0078] ↑ CompilerSupportLibraries_jll v1.3.0+1 ⇒ v1.5.5+2 [deac9b47] ↑ LibCURL_jll v8.15.0+0 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.0+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.3+1 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2025.11.4 ⇒ v2026.8.13 [4536629a] ↑ OpenBLAS_jll v0.3.29+0 ⇒ v0.3.30+0 [458c3c95] ↑ OpenSSL_jll v3.5.4+0 ⇒ v3.5.8+0 [efcefdf7] + PCRE2_jll v10.46.0+0 [bea87d4a] ↑ SuiteSparse_jll v7.8.3+2 ⇒ v7.10.1+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [3161d3a3] + Zstd_jll v1.5.7+1 [8e850ede] ↑ nghttp2_jll v1.64.0+1 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.7.0+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...ªnbpkg_syncÚö Resolving... ===  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Project.toml` [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Manifest.toml` [b27032c2] ↑ LibCURL v0.6.4 ⇒ v1.0.0 [37e2e46d] ↑ LinearAlgebra v1.12.0 ⇒ v1.13.0 [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0 [ea8e919c] ↑ SHA v0.7.0 ⇒ v1.0.0 [2f01184e] ↑ SparseArrays v1.12.0 ⇒ v1.13.0 [e66e0078] ↑ CompilerSupportLibraries_jll v1.3.0+1 ⇒ v1.5.5+2 [deac9b47] ↑ LibCURL_jll v8.15.0+0 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.0+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.3+1 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2025.11.4 ⇒ v2026.8.13 [4536629a] ↑ OpenBLAS_jll v0.3.29+0 ⇒ v0.3.30+0 [458c3c95] ↑ OpenSSL_jll v3.5.4+0 ⇒ v3.5.8+0 [efcefdf7] + PCRE2_jll v10.46.0+0 [bea87d4a] ↑ SuiteSparse_jll v7.8.3+2 ⇒ v7.10.1+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [3161d3a3] + Zstd_jll v1.5.7+1 [8e850ede] ↑ nghttp2_jll v1.64.0+1 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.7.0+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...£PkgÚö Resolving... ===  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Project.toml` [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Manifest.toml` [b27032c2] ↑ LibCURL v0.6.4 ⇒ v1.0.0 [37e2e46d] ↑ LinearAlgebra v1.12.0 ⇒ v1.13.0 [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0 [ea8e919c] ↑ SHA v0.7.0 ⇒ v1.0.0 [2f01184e] ↑ SparseArrays v1.12.0 ⇒ v1.13.0 [e66e0078] ↑ CompilerSupportLibraries_jll v1.3.0+1 ⇒ v1.5.5+2 [deac9b47] ↑ LibCURL_jll v8.15.0+0 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.0+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.3+1 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2025.11.4 ⇒ v2026.8.13 [4536629a] ↑ OpenBLAS_jll v0.3.29+0 ⇒ v0.3.30+0 [458c3c95] ↑ OpenSSL_jll v3.5.4+0 ⇒ v3.5.8+0 [efcefdf7] + PCRE2_jll v10.46.0+0 [bea87d4a] ↑ SuiteSparse_jll v7.8.3+2 ⇒ v7.10.1+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [3161d3a3] + Zstd_jll v1.5.7+1 [8e850ede] ↑ nghttp2_jll v1.64.0+1 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.7.0+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...ªPlotlyBaseÚö Resolving... ===  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Project.toml` [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0  Updating `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ezsvsqyltd/Manifest.toml` [b27032c2] ↑ LibCURL v0.6.4 ⇒ v1.0.0 [37e2e46d] ↑ LinearAlgebra v1.12.0 ⇒ v1.13.0 [44cfe95a] ↑ Pkg v1.12.1 ⇒ v1.13.0 [ea8e919c] ↑ SHA v0.7.0 ⇒ v1.0.0 [2f01184e] ↑ SparseArrays v1.12.0 ⇒ v1.13.0 [e66e0078] ↑ CompilerSupportLibraries_jll v1.3.0+1 ⇒ v1.5.5+2 [deac9b47] ↑ LibCURL_jll v8.15.0+0 ⇒ v8.22.0+0 [e37daf67] ↑ LibGit2_jll v1.9.0+0 ⇒ v1.9.7+0 [29816b5a] ↑ LibSSH2_jll v1.11.3+1 ⇒ v1.11.104+0 [14a3606d] ↑ MozillaCACerts_jll v2025.11.4 ⇒ v2026.8.13 [4536629a] ↑ OpenBLAS_jll v0.3.29+0 ⇒ v0.3.30+0 [458c3c95] ↑ OpenSSL_jll v3.5.4+0 ⇒ v3.5.8+0 [efcefdf7] + PCRE2_jll v10.46.0+0 [bea87d4a] ↑ SuiteSparse_jll v7.8.3+2 ⇒ v7.10.1+0 [83775a58] ↑ Zlib_jll v1.3.1+2 ⇒ v1.3.2+0 [3161d3a3] + Zstd_jll v1.5.7+1 [8e850ede] ↑ nghttp2_jll v1.64.0+1 ⇒ v1.70.0+0 [3f19e933] ↑ p7zip_jll v17.7.0+0 ⇒ v17.8.3+0 Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...¶waiting_for_permission·restart_recommended_msgÀ´restart_required_msgÀ²installed_versionsˆ«KomaMRICore¦0.13.0¬KomaMRIPlots¦0.13.1¸__internal_julia_version¦1.13.2¤FFTW¦1.10.0§PlutoUI¦0.7.83£Pkg¦stdlibªPlotlyBase¦0.8.23Ù!__internal_julia_manifest_version¦1.13.2¯install_time_nsκh0ɬinstantiatedípluto_version¦v1.0.4«in_temp_dirÂ