pulserver 0.2.2__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. pulserver-0.4.0/.github/DISCUSSION_TEMPLATE/ideas.yml +19 -0
  2. pulserver-0.4.0/.github/DISCUSSION_TEMPLATE/q-a.yml +24 -0
  3. pulserver-0.4.0/.github/ISSUE_TEMPLATE/documentation.yml +24 -0
  4. {pulserver-0.2.2 → pulserver-0.4.0}/.github/workflows/wheels.yml +1 -1
  5. {pulserver-0.2.2 → pulserver-0.4.0}/AGENTS.md +0 -1
  6. {pulserver-0.2.2 → pulserver-0.4.0}/PKG-INFO +3 -3
  7. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api/host.md +2 -1
  8. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api/index.md +9 -9
  9. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api/proxy.md +1 -0
  10. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api/recon.md +1 -0
  11. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/documentation.md +1 -1
  12. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/index.md +7 -7
  13. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/internals/index.md +6 -6
  14. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/internals/virtual-scanner.md +10 -5
  15. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/terminology.md +2 -1
  16. {pulserver-0.2.2 → pulserver-0.4.0}/docs/examples/course.md +6 -6
  17. {pulserver-0.2.2 → pulserver-0.4.0}/docs/examples/index.md +12 -12
  18. {pulserver-0.2.2 → pulserver-0.4.0}/docs/examples/tours.md +4 -5
  19. {pulserver-0.2.2 → pulserver-0.4.0}/docs/explanations/architecture.md +15 -8
  20. {pulserver-0.2.2 → pulserver-0.4.0}/docs/explanations/index.md +13 -15
  21. pulserver-0.4.0/docs/misc/index.md +15 -0
  22. {pulserver-0.2.2 → pulserver-0.4.0}/docs/user-guide/index.md +5 -5
  23. {pulserver-0.2.2 → pulserver-0.4.0}/docs/user-guide/reconstruction-client.md +35 -3
  24. {pulserver-0.2.2 → pulserver-0.4.0}/docs/user-guide/reconstruction-plugins.md +33 -2
  25. {pulserver-0.2.2 → pulserver-0.4.0}/docs/user-guide/running.md +55 -29
  26. {pulserver-0.2.2 → pulserver-0.4.0}/docs/user-guide/virtual-scanner.md +12 -6
  27. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/01-course/04_reconstruction_plugin.py +4 -3
  28. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/01-course/05_recon_plugin.py +6 -3
  29. pulserver-0.4.0/gallery/02-tours/_gallery_header.md +1 -0
  30. {pulserver-0.2.2 → pulserver-0.4.0}/pyproject.toml +2 -2
  31. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseg/pulseg_types.h +1 -1
  32. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/structure/pulseg_getters.c +20 -2
  33. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_cli.py +5 -0
  34. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/host/__init__.py +2 -2
  35. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/host/_command.py +17 -9
  36. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/host/_push.py +3 -2
  37. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/host/_server.py +4 -3
  38. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/host/_service.py +9 -7
  39. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/host/_store.py +126 -52
  40. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/ir/_checks.py +1 -1
  41. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/__init__.py +2 -1
  42. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/__main__.py +1 -1
  43. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/_designs.py +26 -12
  44. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/_intake.py +26 -23
  45. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/_local.py +1 -1
  46. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/_proxy.py +21 -15
  47. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/__init__.py +2 -0
  48. pulserver-0.4.0/src/pulserver/recon/_figure.py +31 -0
  49. pulserver-0.4.0/src/pulserver/recon/_replay.py +75 -0
  50. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_runtime/application.py +8 -0
  51. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_runtime/exam.py +25 -1
  52. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_runtime/mrd2dicom.py +338 -65
  53. pulserver-0.4.0/src/pulserver/recon/_runtime/offline.py +162 -0
  54. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/plugin.py +41 -10
  55. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_client.py +14 -7
  56. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_coils.py +15 -8
  57. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_command.py +19 -9
  58. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_console.py +35 -9
  59. pulserver-0.4.0/tests/native/read_rf_timing.c +50 -0
  60. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_app.py +13 -0
  61. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_images.py +58 -0
  62. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_mrd2dicom.py +342 -3
  63. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_console.py +12 -8
  64. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_console_sequences.py +3 -1
  65. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_design_push.py +50 -28
  66. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_design_server.py +5 -1
  67. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_design_service.py +93 -55
  68. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_exam_sharing.py +21 -1
  69. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_checks.py +4 -3
  70. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_rf.py +38 -0
  71. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_limits.py +6 -6
  72. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_plugin_options.py +2 -2
  73. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_protocol.py +1 -1
  74. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_proxy.py +266 -21
  75. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_rf_layout.py +3 -3
  76. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_scan_command.py +6 -2
  77. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_virtual.py +4 -2
  78. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_virtual_coils.py +15 -1
  79. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_zoo_wave.py +2 -2
  80. pulserver-0.2.2/CLAUDE.md +0 -1
  81. pulserver-0.2.2/GEMINI.md +0 -1
  82. pulserver-0.2.2/docs/misc/index.md +0 -15
  83. pulserver-0.2.2/gallery/02-tours/_gallery_header.md +0 -1
  84. pulserver-0.2.2/src/pulserver/recon/_runtime/offline.py +0 -91
  85. {pulserver-0.2.2 → pulserver-0.4.0}/.claude/skills/build-and-test/SKILL.md +0 -0
  86. {pulserver-0.2.2 → pulserver-0.4.0}/.claude/skills/write-documentation/SKILL.md +0 -0
  87. {pulserver-0.2.2 → pulserver-0.4.0}/.dockerignore +0 -0
  88. {pulserver-0.2.2 → pulserver-0.4.0}/.gitattributes +0 -0
  89. {pulserver-0.2.2 → pulserver-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  90. {pulserver-0.2.2 → pulserver-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  91. {pulserver-0.2.2 → pulserver-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  92. {pulserver-0.2.2 → pulserver-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  93. {pulserver-0.2.2 → pulserver-0.4.0}/.github/dependabot.yml +0 -0
  94. {pulserver-0.2.2 → pulserver-0.4.0}/.github/workflows/codeql.yml +0 -0
  95. {pulserver-0.2.2 → pulserver-0.4.0}/.github/workflows/console.yml +0 -0
  96. {pulserver-0.2.2 → pulserver-0.4.0}/.github/workflows/docs.yml +0 -0
  97. {pulserver-0.2.2 → pulserver-0.4.0}/.github/workflows/fields.yml +0 -0
  98. {pulserver-0.2.2 → pulserver-0.4.0}/.github/workflows/image.yml +0 -0
  99. {pulserver-0.2.2 → pulserver-0.4.0}/.github/workflows/koma.yml +0 -0
  100. {pulserver-0.2.2 → pulserver-0.4.0}/.github/workflows/style.yml +0 -0
  101. {pulserver-0.2.2 → pulserver-0.4.0}/.github/workflows/tags-release.yml +0 -0
  102. {pulserver-0.2.2 → pulserver-0.4.0}/.github/workflows/test-ci.yml +0 -0
  103. {pulserver-0.2.2 → pulserver-0.4.0}/.gitignore +0 -0
  104. {pulserver-0.2.2 → pulserver-0.4.0}/.pre-commit-config.yaml +0 -0
  105. {pulserver-0.2.2 → pulserver-0.4.0}/CMakeLists.txt +0 -0
  106. {pulserver-0.2.2 → pulserver-0.4.0}/CODE_OF_CONDUCT.md +0 -0
  107. {pulserver-0.2.2 → pulserver-0.4.0}/CONTRIBUTING.md +0 -0
  108. {pulserver-0.2.2 → pulserver-0.4.0}/LICENSE +0 -0
  109. {pulserver-0.2.2 → pulserver-0.4.0}/LICENSES/gadgetron-python-MIT.txt +0 -0
  110. {pulserver-0.2.2 → pulserver-0.4.0}/LICENSES/python-ismrmrd-server-MIT.txt +0 -0
  111. {pulserver-0.2.2 → pulserver-0.4.0}/NEXT.md +0 -0
  112. {pulserver-0.2.2 → pulserver-0.4.0}/README.md +0 -0
  113. {pulserver-0.2.2 → pulserver-0.4.0}/SECURITY.md +0 -0
  114. {pulserver-0.2.2 → pulserver-0.4.0}/SKILLS.md +0 -0
  115. {pulserver-0.2.2 → pulserver-0.4.0}/codecov.yml +0 -0
  116. {pulserver-0.2.2 → pulserver-0.4.0}/docker/Dockerfile +0 -0
  117. {pulserver-0.2.2 → pulserver-0.4.0}/docker/compose.yaml +0 -0
  118. {pulserver-0.2.2 → pulserver-0.4.0}/docker/entrypoint.sh +0 -0
  119. {pulserver-0.2.2 → pulserver-0.4.0}/docker/limits/limits.txt +0 -0
  120. {pulserver-0.2.2 → pulserver-0.4.0}/docker/smoke.py +0 -0
  121. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/architecture-dark.svg +0 -0
  122. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/architecture.svg +0 -0
  123. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/capabilities.js +0 -0
  124. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/context-dark.svg +0 -0
  125. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/context.svg +0 -0
  126. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/pulseg-dark.svg +0 -0
  127. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/pulseg.svg +0 -0
  128. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/pulserver-logo-dark.svg +0 -0
  129. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/pulserver-logo.svg +0 -0
  130. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/pulserver-mark-dark.svg +0 -0
  131. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/pulserver-mark.svg +0 -0
  132. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/pulserver.css +0 -0
  133. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/repetition-dark.svg +0 -0
  134. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/repetition.svg +0 -0
  135. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/safety-dark.svg +0 -0
  136. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/safety.svg +0 -0
  137. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/session-dark.svg +0 -0
  138. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/session.svg +0 -0
  139. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/virtual-dark.svg +0 -0
  140. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_static/virtual.svg +0 -0
  141. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_templates/autosummary/base.rst +0 -0
  142. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_templates/autosummary/class.rst +0 -0
  143. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_templates/autosummary/enum.rst +0 -0
  144. {pulserver-0.2.2 → pulserver-0.4.0}/docs/_templates/autosummary/function.rst +0 -0
  145. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api/design.md +0 -0
  146. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api/ir.md +0 -0
  147. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api/mrd.md +0 -0
  148. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api/protocol.md +0 -0
  149. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api/validate.md +0 -0
  150. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api/virtual.md +0 -0
  151. {pulserver-0.2.2 → pulserver-0.4.0}/docs/api_objects.py +0 -0
  152. {pulserver-0.2.2 → pulserver-0.4.0}/docs/colab.py +0 -0
  153. {pulserver-0.2.2 → pulserver-0.4.0}/docs/conf.py +0 -0
  154. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/installation.md +0 -0
  155. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/internals/calibration.md +0 -0
  156. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/internals/ir-cache.md +0 -0
  157. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/internals/protocol-wire.md +0 -0
  158. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/internals/reconstruction-proxy.md +0 -0
  159. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/internals/sar-ratios.md +0 -0
  160. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/releases.md +0 -0
  161. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/style.md +0 -0
  162. {pulserver-0.2.2 → pulserver-0.4.0}/docs/developer-guide/workflow.md +0 -0
  163. {pulserver-0.2.2 → pulserver-0.4.0}/docs/explanations/protocol.md +0 -0
  164. {pulserver-0.2.2 → pulserver-0.4.0}/docs/explanations/raw-data.md +0 -0
  165. {pulserver-0.2.2 → pulserver-0.4.0}/docs/explanations/reconstruction-session.md +0 -0
  166. {pulserver-0.2.2 → pulserver-0.4.0}/docs/explanations/reconstruction.md +0 -0
  167. {pulserver-0.2.2 → pulserver-0.4.0}/docs/explanations/safety-checks.md +0 -0
  168. {pulserver-0.2.2 → pulserver-0.4.0}/docs/explanations/scanner-representation.md +0 -0
  169. {pulserver-0.2.2 → pulserver-0.4.0}/docs/explanations/virtual-scanner.md +0 -0
  170. {pulserver-0.2.2 → pulserver-0.4.0}/docs/figure_style.py +0 -0
  171. {pulserver-0.2.2 → pulserver-0.4.0}/docs/index.md +0 -0
  172. {pulserver-0.2.2 → pulserver-0.4.0}/docs/misc/contributors.md +0 -0
  173. {pulserver-0.2.2 → pulserver-0.4.0}/docs/misc/license.md +0 -0
  174. {pulserver-0.2.2 → pulserver-0.4.0}/docs/misc/related.md +0 -0
  175. {pulserver-0.2.2 → pulserver-0.4.0}/docs/user-guide/scanner-sequences.md +0 -0
  176. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/01-course/01_protocol_to_image.py +0 -0
  177. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/01-course/02_sequence_plugin.py +0 -0
  178. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/01-course/03_scanner_representation.py +0 -0
  179. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/01-course/06_testing_on_the_virtual_scanner.py +0 -0
  180. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/01-course/README.rst +0 -0
  181. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/01-course/_gallery_header.md +0 -0
  182. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/02-tours/01_protocol_resolution.py +0 -0
  183. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/02-tours/02_segmentation.py +0 -0
  184. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/02-tours/03_fov_offset_enrichment.py +0 -0
  185. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/02-tours/README.rst +0 -0
  186. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/README.rst +0 -0
  187. {pulserver-0.2.2 → pulserver-0.4.0}/gallery/_gallery_header.md +0 -0
  188. {pulserver-0.2.2 → pulserver-0.4.0}/scripts/build_docs.sh +0 -0
  189. {pulserver-0.2.2 → pulserver-0.4.0}/scripts/check_throughput.py +0 -0
  190. {pulserver-0.2.2 → pulserver-0.4.0}/scripts/format_and_lint.sh +0 -0
  191. {pulserver-0.2.2 → pulserver-0.4.0}/scripts/make_artwork.py +0 -0
  192. {pulserver-0.2.2 → pulserver-0.4.0}/scripts/publish_docs.py +0 -0
  193. {pulserver-0.2.2 → pulserver-0.4.0}/setup.py +0 -0
  194. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/CMakeLists.txt +0 -0
  195. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/cache/pulseg_cache.c +0 -0
  196. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/core/pulseg_core.c +0 -0
  197. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/core/pulseg_error.c +0 -0
  198. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/core/pulseg_math.c +0 -0
  199. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseg/pulseg.h +0 -0
  200. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseg/pulseg_cache.h +0 -0
  201. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseg/pulseg_collection.h +0 -0
  202. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseg/pulseg_config.h +0 -0
  203. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseg/pulseg_errors.h +0 -0
  204. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseg/pulseg_io.h +0 -0
  205. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseg/pulseg_playout.h +0 -0
  206. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseg/pulseg_protocol.h +0 -0
  207. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseq/pulseq.h +0 -0
  208. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseq/pulseq_config.h +0 -0
  209. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/include/pulseq/pulseq_types.h +0 -0
  210. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/io/pulseg_opts.c +0 -0
  211. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/io/pulseg_protocol.c +0 -0
  212. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/playout/pulseg_playout.c +0 -0
  213. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/pulseg_internal.h +0 -0
  214. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/pulseq/pulseq_internal.h +0 -0
  215. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/pulseq/pulseq_shape.c +0 -0
  216. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/structure/pulseg_descriptor.c +0 -0
  217. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/structure/pulseg_repetition.c +0 -0
  218. {pulserver-0.2.2 → pulserver-0.4.0}/src/c/structure/pulseg_waves.c +0 -0
  219. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/fourier/bindings.cpp +0 -0
  220. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/fourier/bindings.hpp +0 -0
  221. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/fourier/parallel.hpp +0 -0
  222. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/fourier/timeline.cpp +0 -0
  223. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/fourier/timeline.hpp +0 -0
  224. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/collection.cpp +0 -0
  225. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/dedup.cpp +0 -0
  226. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/from_libraries.cpp +0 -0
  227. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/from_libraries.hpp +0 -0
  228. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/pulseg_convert.h +0 -0
  229. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/pulseq_file.cpp +0 -0
  230. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/pulseq_file.h +0 -0
  231. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/repetition.cpp +0 -0
  232. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/structure.cpp +0 -0
  233. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/wave_plan.cpp +0 -0
  234. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/ir/waves.cpp +0 -0
  235. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/module.cpp +0 -0
  236. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/native.hpp +0 -0
  237. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/playout.cpp +0 -0
  238. {pulserver-0.2.2 → pulserver-0.4.0}/src/cpp/playout.hpp +0 -0
  239. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/__init__.py +0 -0
  240. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_accelerators.py +0 -0
  241. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_labels.py +0 -0
  242. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_logs.py +0 -0
  243. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_memory.py +0 -0
  244. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_plugins.py +0 -0
  245. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/__init__.py +0 -0
  246. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/_evaluation.py +0 -0
  247. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/_inversion.py +0 -0
  248. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/_pmc.py +0 -0
  249. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/_saturation.py +0 -0
  250. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/_slab.py +0 -0
  251. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/_user.py +0 -0
  252. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/bssfp2d/retrospective.toml +0 -0
  253. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/fse3d/dual_region.toml +0 -0
  254. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/fse3d/navigator.toml +0 -0
  255. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/fse3d/optimized.toml +0 -0
  256. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/fse3d/shuffling.toml +0 -0
  257. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/fse3d/wave.toml +0 -0
  258. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/gre3d/full_plane.toml +0 -0
  259. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/gre3d/wave.toml +0 -0
  260. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/gre_multiecho2d/bipolar.toml +0 -0
  261. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/gre_multiecho3d/bipolar.toml +0 -0
  262. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/gre_multiecho3d/full_plane.toml +0 -0
  263. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/gre_multiecho3d/wave.toml +0 -0
  264. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/gre_spiral2d/variable_density.toml +0 -0
  265. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/gre_stack_of_spirals3d/variable_density.toml +0 -0
  266. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/mprage3d/navigator.toml +0 -0
  267. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/mprage3d/shuffling.toml +0 -0
  268. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/mprage3d/wave.toml +0 -0
  269. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/mprage_stack_of_spirals3d/variable_density.toml +0 -0
  270. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/se3d/full_plane.toml +0 -0
  271. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/se_spiral2d/variable_density.toml +0 -0
  272. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/se_stack_of_spirals3d/variable_density.toml +0 -0
  273. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/parameters/zte3d/meridian.toml +0 -0
  274. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/recon/epi.py +0 -0
  275. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/recon/nufft.py +0 -0
  276. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/recon/nufft_train.py +0 -0
  277. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/recon/pics.py +0 -0
  278. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/recon/pics_train.py +0 -0
  279. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/recon/pmc.py +0 -0
  280. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/bssfp2d.py +0 -0
  281. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/bssfp3d.py +0 -0
  282. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/epi2d.py +0 -0
  283. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/epi3d.py +0 -0
  284. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/fse3d.py +0 -0
  285. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/gre2d.py +0 -0
  286. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/gre3d.py +0 -0
  287. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/gre_multiecho2d.py +0 -0
  288. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/gre_multiecho3d.py +0 -0
  289. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/gre_propeller2d.py +0 -0
  290. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/gre_radial2d.py +0 -0
  291. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/gre_spiral2d.py +0 -0
  292. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/gre_stack_of_blades3d.py +0 -0
  293. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/gre_stack_of_spirals3d.py +0 -0
  294. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/gre_stack_of_stars3d.py +0 -0
  295. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/mprage3d.py +0 -0
  296. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/mprage_stack_of_spirals3d.py +0 -0
  297. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/mprage_stack_of_stars3d.py +0 -0
  298. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/se2d.py +0 -0
  299. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/se3d.py +0 -0
  300. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/se_epi_propeller2d.py +0 -0
  301. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/se_propeller2d.py +0 -0
  302. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/se_radial2d.py +0 -0
  303. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/se_spiral2d.py +0 -0
  304. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/se_stack_of_blades3d.py +0 -0
  305. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/se_stack_of_spirals3d.py +0 -0
  306. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/se_stack_of_stars3d.py +0 -0
  307. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/_zoo/sequences/zte3d.py +0 -0
  308. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/design/__init__.py +0 -0
  309. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/design/_entries.py +0 -0
  310. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/design/_options.py +0 -0
  311. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/design/_plugin.py +0 -0
  312. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/design/_rf.py +0 -0
  313. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/host/__main__.py +0 -0
  314. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/host/_blocks.py +0 -0
  315. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/host/_limits.py +0 -0
  316. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/ir/__init__.py +0 -0
  317. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/ir/_convert.py +0 -0
  318. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/ir/_playout.py +0 -0
  319. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/ir/_source.py +0 -0
  320. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/ir/_vendor.py +0 -0
  321. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/ir/_waves.py +0 -0
  322. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/mrd/__init__.py +0 -0
  323. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/mrd/_acquisitions.py +0 -0
  324. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/mrd/_header.py +0 -0
  325. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/mrd/_images.py +0 -0
  326. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/mrd/_metadata.py +0 -0
  327. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/mrd/_sequence.py +0 -0
  328. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/protocol/__init__.py +0 -0
  329. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/protocol/_keys.py +0 -0
  330. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/protocol/_prescription.py +0 -0
  331. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/protocol/_schema.py +0 -0
  332. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/protocol/_wire.py +0 -0
  333. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/_enrich.py +0 -0
  334. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/_held.py +0 -0
  335. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/_motion.py +0 -0
  336. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/_queue.py +0 -0
  337. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/_seqdesc.py +0 -0
  338. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/proxy/_workers.py +0 -0
  339. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/__main__.py +0 -0
  340. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_buffers.py +0 -0
  341. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_calibration.py +0 -0
  342. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_correct.py +0 -0
  343. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_exam_image.py +0 -0
  344. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_loader.py +0 -0
  345. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_runtime/__init__.py +0 -0
  346. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_runtime/concurrency.py +0 -0
  347. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_runtime/connection.py +0 -0
  348. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_runtime/constants.py +0 -0
  349. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_runtime/readers.py +0 -0
  350. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_runtime/writers.py +0 -0
  351. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/_units.py +0 -0
  352. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/gadgets.py +0 -0
  353. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/handlers/__init__.py +0 -0
  354. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/handlers/epi.py +0 -0
  355. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/handlers/nufft.py +0 -0
  356. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/handlers/nufft_train.py +0 -0
  357. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/handlers/pics.py +0 -0
  358. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/handlers/pics_train.py +0 -0
  359. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/recon/handlers/pmc.py +0 -0
  360. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/validate/__init__.py +0 -0
  361. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/validate/_command.py +0 -0
  362. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/validate/_compare.py +0 -0
  363. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/validate/_validate.py +0 -0
  364. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/validate/_xml.py +0 -0
  365. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/__init__.py +0 -0
  366. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_brainweb.py +0 -0
  367. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_export.py +0 -0
  368. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_fourier.py +0 -0
  369. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_girf.py +0 -0
  370. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_localizer.py +0 -0
  371. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_motion.py +0 -0
  372. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_phantom.py +0 -0
  373. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_stream.py +0 -0
  374. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_timeline.py +0 -0
  375. {pulserver-0.2.2 → pulserver-0.4.0}/src/pulserver/virtual/_tissue.py +0 -0
  376. {pulserver-0.2.2 → pulserver-0.4.0}/tests/_analytic.py +0 -0
  377. {pulserver-0.2.2 → pulserver-0.4.0}/tests/_host.py +0 -0
  378. {pulserver-0.2.2 → pulserver-0.4.0}/tests/_seqtext.py +0 -0
  379. {pulserver-0.2.2 → pulserver-0.4.0}/tests/_synthetic.py +0 -0
  380. {pulserver-0.2.2 → pulserver-0.4.0}/tests/_virtual.py +0 -0
  381. {pulserver-0.2.2 → pulserver-0.4.0}/tests/_zoo.py +0 -0
  382. {pulserver-0.2.2 → pulserver-0.4.0}/tests/conftest.py +0 -0
  383. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/bloch/bssfp.npy +0 -0
  384. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/bloch/epi_2d_main.npy +0 -0
  385. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/bloch/gre_2d_3sl.npy +0 -0
  386. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/bloch/steady_dess_hard_0hz.npy +0 -0
  387. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/bloch/steady_dess_hard_30hz.npy +0 -0
  388. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/bloch/steady_echo_hard_0hz.npy +0 -0
  389. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/bloch/steady_echo_hard_30hz.npy +0 -0
  390. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/bloch/steady_echo_selective_0hz.npy +0 -0
  391. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/bloch/steady_fid_hard_0hz.npy +0 -0
  392. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/sequences/dedup_gre_pair.seq +0 -0
  393. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/sequences/dedup_gre_pair_b.seq +0 -0
  394. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/sequences/epi_2d_main.seq +0 -0
  395. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/sequences/gre_2d_3sl.seq +0 -0
  396. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/sequences/mprage_stack_of_spirals_3d.seq +0 -0
  397. {pulserver-0.2.2 → pulserver-0.4.0}/tests/fixtures/sequences/zte_3d.seq +0 -0
  398. {pulserver-0.2.2 → pulserver-0.4.0}/tests/koma/Project.toml +0 -0
  399. {pulserver-0.2.2 → pulserver-0.4.0}/tests/koma/simulate.jl +0 -0
  400. {pulserver-0.2.2 → pulserver-0.4.0}/tests/native/check_initializers.c +0 -0
  401. {pulserver-0.2.2 → pulserver-0.4.0}/tests/native/print_wave_samples.c +0 -0
  402. {pulserver-0.2.2 → pulserver-0.4.0}/tests/native/read_cache_summary.c +0 -0
  403. {pulserver-0.2.2 → pulserver-0.4.0}/tests/native/read_rf_definitions.c +0 -0
  404. {pulserver-0.2.2 → pulserver-0.4.0}/tests/native/replay_an_instance.c +0 -0
  405. {pulserver-0.2.2 → pulserver-0.4.0}/tests/plugins/crash.py +0 -0
  406. {pulserver-0.2.2 → pulserver-0.4.0}/tests/plugins/gre2d.py +0 -0
  407. {pulserver-0.2.2 → pulserver-0.4.0}/tests/plugins/gre2d_raw.py +0 -0
  408. {pulserver-0.2.2 → pulserver-0.4.0}/tests/plugins/rf_train.py +0 -0
  409. {pulserver-0.2.2 → pulserver-0.4.0}/tests/plugins/stall.py +0 -0
  410. {pulserver-0.2.2 → pulserver-0.4.0}/tests/plugins/strong.py +0 -0
  411. {pulserver-0.2.2 → pulserver-0.4.0}/tests/plugins/tiny.py +0 -0
  412. {pulserver-0.2.2 → pulserver-0.4.0}/tests/plugins/typed.py +0 -0
  413. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_buffers.py +0 -0
  414. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_calibration.py +0 -0
  415. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_coil_compression.py +0 -0
  416. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_connection.py +0 -0
  417. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_correct.py +0 -0
  418. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_epi.py +0 -0
  419. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_exam_image.py +0 -0
  420. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_flags.py +0 -0
  421. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_gadgets.py +0 -0
  422. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_handlers.py +0 -0
  423. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_loader.py +0 -0
  424. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_nufft.py +0 -0
  425. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_pics.py +0 -0
  426. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_pmc.py +0 -0
  427. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_prewhiten.py +0 -0
  428. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_readers_writers.py +0 -0
  429. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_slots.py +0 -0
  430. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon/test_units.py +0 -0
  431. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon_plugins/children.py +0 -0
  432. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon_plugins/crash.py +0 -0
  433. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon_plugins/device.py +0 -0
  434. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon_plugins/exam.py +0 -0
  435. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon_plugins/gre2d.py +0 -0
  436. {pulserver-0.2.2 → pulserver-0.4.0}/tests/recon_plugins/pose.py +0 -0
  437. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_docs.py +0 -0
  438. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_docstring_defaults.py +0 -0
  439. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_docstrings.py +0 -0
  440. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_enrich.py +0 -0
  441. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_exam_artifacts.py +0 -0
  442. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_exam_calibration.py +0 -0
  443. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_host_slots.py +0 -0
  444. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_image.py +0 -0
  445. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir.py +0 -0
  446. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_designed.py +0 -0
  447. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_extensions.py +0 -0
  448. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_grouping.py +0 -0
  449. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_groups.py +0 -0
  450. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_labels.py +0 -0
  451. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_playout.py +0 -0
  452. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_profile.py +0 -0
  453. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_repetition.py +0 -0
  454. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_repetition_gradients.py +0 -0
  455. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_segments.py +0 -0
  456. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_source.py +0 -0
  457. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_steady_excitation.py +0 -0
  458. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_vendor.py +0 -0
  459. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_ir_waves.py +0 -0
  460. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_keys.py +0 -0
  461. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_koma.py +0 -0
  462. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_logs.py +0 -0
  463. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_memory.py +0 -0
  464. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_motion.py +0 -0
  465. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_mrd_images.py +0 -0
  466. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_mrd_sequence.py +0 -0
  467. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_plugins.py +0 -0
  468. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_publish_docs.py +0 -0
  469. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_resolution.py +0 -0
  470. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_seqdesc.py +0 -0
  471. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_sequence_plugin.py +0 -0
  472. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_smoke.py +0 -0
  473. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_validate.py +0 -0
  474. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_virtual_brainweb.py +0 -0
  475. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_virtual_clock.py +0 -0
  476. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_virtual_export.py +0 -0
  477. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_virtual_fourier.py +0 -0
  478. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_virtual_localizer.py +0 -0
  479. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_virtual_sequences.py +0 -0
  480. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_wire.py +0 -0
  481. {pulserver-0.2.2 → pulserver-0.4.0}/tests/test_zoo_evaluation.py +0 -0
@@ -0,0 +1,19 @@
1
+ labels: ["idea"]
2
+ body:
3
+ - type: textarea
4
+ id: idea
5
+ attributes:
6
+ label: The idea
7
+ description: |
8
+ A capability, an interface or a direction you think pulserver should take,
9
+ before it is concrete enough to be a feature request.
10
+ validations:
11
+ required: true
12
+
13
+ - type: textarea
14
+ id: context
15
+ attributes:
16
+ label: Where it comes from
17
+ description: |
18
+ The experiment that prompted it, and any paper or implementation that
19
+ already does something like it.
@@ -0,0 +1,24 @@
1
+ labels: ["question"]
2
+ body:
3
+ - type: textarea
4
+ id: question
5
+ attributes:
6
+ label: What you are trying to do
7
+ description: |
8
+ The sequence plugin, reconstruction or scanner workflow, and where you got stuck. If a result looks wrong, say what you
9
+ expected and why.
10
+ validations:
11
+ required: true
12
+
13
+ - type: textarea
14
+ id: code
15
+ attributes:
16
+ label: What you have so far
17
+ description: The call you are making, if there is one.
18
+ render: python
19
+
20
+ - type: input
21
+ id: version
22
+ attributes:
23
+ label: pulserver version
24
+ placeholder: "0.0.x, or the commit you are on"
@@ -0,0 +1,24 @@
1
+ name: Documentation
2
+ description: An error, an omission, or an unanswered question in the documentation.
3
+ labels: ["documentation"]
4
+ body:
5
+ - type: input
6
+ id: page
7
+ attributes:
8
+ label: Page
9
+ description: URL of the page, or the docstring's object name.
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: problem
14
+ attributes:
15
+ label: Problem
16
+ description: >-
17
+ The passage that is wrong, unclear or missing, and what the implementation,
18
+ a test, pypulseqpp, the ISMRMRD specification or the literature says instead.
19
+ validations:
20
+ required: true
21
+ - type: textarea
22
+ id: proposal
23
+ attributes:
24
+ label: Proposed wording
@@ -30,7 +30,7 @@ jobs:
30
30
  with:
31
31
  fetch-depth: 0 # setuptools_scm reads the tags
32
32
 
33
- - uses: pypa/cibuildwheel@v4.2.1
33
+ - uses: pypa/cibuildwheel@v4.3.1
34
34
  env:
35
35
  CIBW_BUILD: ${{ inputs.cibw-build }}
36
36
  CIBW_SKIP: "*-musllinux_*"
@@ -1,6 +1,5 @@
1
1
  # pulserver — agent instructions
2
2
 
3
- `CLAUDE.md` and `GEMINI.md` import this file. Edit this file only.
4
3
  `SKILLS.md` indexes the skills under `.claude/skills/`: the procedures for
5
4
  building and testing the package and for writing documentation. This page
6
5
  states the rules; a skill states how a recurring task is carried out under
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulserver
3
- Version: 0.2.2
3
+ Version: 0.4.0
4
4
  Summary: Orchestrator for MR acquisitions: sequence design, scanner preparation and reconstruction.
5
5
  Keywords: mri,pulseq,mrd,ismrmrd,reconstruction,scanner
6
6
  Author-Email: Matteo Cencini <matteo.cencini@gmail.com>
@@ -21,7 +21,7 @@ Project-URL: Documentation, https://pulserver.github.io/pulserver/
21
21
  Project-URL: Issues, https://github.com/pulserver/pulserver/issues
22
22
  Project-URL: Source, https://github.com/pulserver/pulserver
23
23
  Requires-Python: >=3.10
24
- Requires-Dist: pypulseqpp>=0.0.40
24
+ Requires-Dist: pypulseqpp>=0.0.42
25
25
  Requires-Dist: numpy>=2.2.6
26
26
  Requires-Dist: ismrmrd>=1.15.0
27
27
  Requires-Dist: pydicom>=3.0.2
@@ -36,7 +36,7 @@ Requires-Dist: pytest>=9.1.1; extra == "dev"
36
36
  Requires-Dist: pytest-cov>=7.1.0; extra == "dev"
37
37
  Requires-Dist: pytest-xdist>=3; extra == "dev"
38
38
  Requires-Dist: coverage>=7.16.2; extra == "dev"
39
- Requires-Dist: ruff==0.16.10; extra == "dev"
39
+ Requires-Dist: ruff==0.17.0; extra == "dev"
40
40
  Requires-Dist: pre-commit>=4.6.2; extra == "dev"
41
41
  Requires-Dist: build; extra == "dev"
42
42
  Provides-Extra: doc
@@ -23,6 +23,7 @@ described in {doc}`../user-guide/running`, and the identity of a design in
23
23
 
24
24
  | Object | Description |
25
25
  | --- | --- |
26
- | {obj}`~pulserver.host.DesignStore` | The designs under one directory, each in `<id>/` and immutable once written. |
26
+ | {obj}`~pulserver.host.DesignStore` | The designs of one scan, each in `<root>/<scan>/<id>/` and immutable once written. |
27
+ | {obj}`~pulserver.host.prune` | Remove scan directories of a store root, least recently used first. |
27
28
  | {obj}`~pulserver.host.design_identity` | SHA-256 of what a design depends on: plugin, limits, resolved protocol and source. |
28
29
  | {obj}`~pulserver.host.design_id` | Identifier of a design: the first 18 hexadecimal digits of its identity. |
@@ -5,15 +5,15 @@ Conceptual background is in {doc}`../explanations/index` and procedures in the
5
5
 
6
6
  | Page | Module | Contents |
7
7
  | --- | --- | --- |
8
- | {doc}`protocol` | `pulserver.protocol` | Protocol entries, presets and the protocol text blocks. |
9
- | {doc}`design` | `pulserver.design` | {class}`~pulserver.design.SequencePlugin` and its UI entries. |
10
- | {doc}`host` | `pulserver.host` | Design calls and the design store. |
11
- | {doc}`ir` | `pulserver.ir` | Segmentation into the IR cache, and its playout. |
12
- | {doc}`proxy` | `pulserver.proxy` | Reconstruction proxy, design lookup and MRD enrichment. |
13
- | {doc}`recon` | `pulserver.recon` | {class}`~pulserver.recon.ReconPlugin`, its context, buffers and results. |
14
- | {doc}`mrd` | `pulserver.mrd` | MRD acquisitions, header entries, images and sequence definitions. |
15
- | {doc}`validate` | `pulserver.validate` | Playout validation against a recording or the IR cache. |
16
- | {doc}`virtual` | `pulserver.virtual` | Phantoms, the Fourier engine, the scan clock and the reconstruction client. |
8
+ | {doc}`protocol` | `pulserver.protocol` | Protocol entries, presets and the protocol text blocks |
9
+ | {doc}`design` | `pulserver.design` | {class}`~pulserver.design.SequencePlugin` and its UI entries |
10
+ | {doc}`host` | `pulserver.host` | Design calls and the design store |
11
+ | {doc}`ir` | `pulserver.ir` | Segmentation into the IR cache, and its playout |
12
+ | {doc}`proxy` | `pulserver.proxy` | Reconstruction proxy, design lookup and MRD enrichment |
13
+ | {doc}`recon` | `pulserver.recon` | {class}`~pulserver.recon.ReconPlugin`, its context, buffers and results |
14
+ | {doc}`mrd` | `pulserver.mrd` | MRD acquisitions, header entries, images and sequence definitions |
15
+ | {doc}`validate` | `pulserver.validate` | Playout validation against a recording or the IR cache |
16
+ | {doc}`virtual` | `pulserver.virtual` | Phantoms, the Fourier engine, the scan clock and the reconstruction client |
17
17
 
18
18
  The C library a scanner interpreter links is documented in its public headers,
19
19
  [`src/c/include/pulseg/`](https://github.com/pulserver/pulserver/tree/main/src/c/include/pulseg),
@@ -43,6 +43,7 @@ and fields of a series in {doc}`../user-guide/reconstruction-client`.
43
43
  | --- | --- |
44
44
  | {obj}`~pulserver.proxy.DesignCache` | The designs of a store, the most recently read kept tabulated. |
45
45
  | {obj}`~pulserver.proxy.Design` | A stored design as the reconstruction side reads it. |
46
+ | {obj}`~pulserver.proxy.SCAN_PARAMETER` | Header user parameter naming the scan a series was played in. |
46
47
  | {obj}`~pulserver.proxy.DESIGN_PARAMETER` | Header user parameter naming the design a series was played from. |
47
48
  | {obj}`~pulserver.proxy.DesignIntake` | HTTP endpoint receiving pushed designs into the store the proxy reads. |
48
49
 
@@ -70,3 +70,4 @@ sensitivity maps, noise prewhitening and coil compression are the subject of
70
70
  | {obj}`~pulserver.recon.ReconData` | The readouts of one reconstruction unit: imaging and calibration k-space, counters and waveforms. |
71
71
  | {obj}`~pulserver.recon.ReconBuffer` | K-space of one encoding space, filled one acquisition at a time, with the acquisition nearest the k-space centre. |
72
72
  | {obj}`~pulserver.recon.ReconResult` | Image array the runtime packages as an MRD image or DICOM dataset, with the acquisition its geometry is taken from and the rescale of its DICOM pixels. |
73
+ | {obj}`~pulserver.recon.figure_rgb` | Return a matplotlib figure drawn to the pixels of an RGB result, sent as a DICOM secondary capture. |
@@ -333,7 +333,7 @@ A separate example is justified when it studies something across objects, or goe
333
333
 
334
334
  The examples landing page carries a **Course** table and a **Tours** table. When examples fall into categories, each category gets a landing page the documentation owns, carrying one or two factual sentences and a table of what is below it. A table is preferred to a wall of thumbnails once a category holds more than a handful of examples, because a reader looking for one sequence or one module reads names rather than pictures.
335
335
 
336
- Every landing table, in every section, has two columns or, on the API landing page, three: the linked page (and its module), then **Contents**. A Contents cell is a short technical noun phrase naming what the page holds (*Single-shot EPI: blurring along the echo train and Nyquist ghosting from gradient delays.*), never a question, an instruction or a narrative sentence.
336
+ Every landing table, in every section, has two columns or, on the API landing page, three: the linked page (and its module), then **Contents**. A Contents cell is a short technical noun phrase naming what the page holds (*Single-shot EPI: blurring along the echo train and Nyquist ghosting from gradient delays*), with no closing period, never a question, an instruction or a narrative sentence.
337
337
 
338
338
  Global navigation carries the gallery and its categories, to the depth at which a category is still something a reader would look for on its own. Below that depth, an example is reached from the table on its category's page and from cross-references, not from the navigation tree.
339
339
 
@@ -5,13 +5,13 @@ conventions, and the implementation design behind the explanations.
5
5
 
6
6
  | Page | Contents |
7
7
  | --- | --- |
8
- | {doc}`installation` | Prerequisites, the editable installation, pre-commit hooks and the documentation build. |
9
- | {doc}`workflow` | Forks, branches, pull requests, continuous integration and the code of conduct. |
10
- | {doc}`style` | Ruff, tests, C89 and code conventions, and the KomaMRI simulation. |
11
- | {doc}`documentation` | Documentation types and scientific writing. |
12
- | {doc}`terminology` | Scanner, protocol, Pulseq and MRD terminology, units and layers. |
13
- | {doc}`internals/index` | The IR cache, the protocol text blocks, the reconstruction proxy, calibration, SAR ratios and the virtual scanner. |
14
- | {doc}`releases` | Versioning, wheels, PyPI and the published documentation. |
8
+ | {doc}`installation` | Prerequisites, the editable installation, pre-commit hooks and the documentation build |
9
+ | {doc}`workflow` | Forks, branches, pull requests, continuous integration and the code of conduct |
10
+ | {doc}`style` | Ruff, tests, C89 and code conventions; KomaMRI simulation |
11
+ | {doc}`documentation` | Documentation types and scientific writing |
12
+ | {doc}`terminology` | Scanner, protocol, Pulseq and MRD terminology, units and layers |
13
+ | {doc}`internals/index` | IR cache, protocol text blocks, reconstruction proxy, calibration, SAR ratios, virtual scanner |
14
+ | {doc}`releases` | Versioning, wheels, PyPI and the published documentation |
15
15
 
16
16
  ```{toctree}
17
17
  :hidden:
@@ -6,12 +6,12 @@ authors.
6
6
 
7
7
  | Page | Contents |
8
8
  | --- | --- |
9
- | {doc}`calibration` | Prewhitening, coil compression, sensitivity maps and the reuse of stored maps. |
10
- | {doc}`ir-cache` | Conversion passes, waves, playout stages, the heaviest repetition, the cache file and the C89 library. |
11
- | {doc}`protocol-wire` | RF layout, protocol keys and values, and the protocol text blocks. |
12
- | {doc}`reconstruction-proxy` | Reconstruction units, image headers, enrichment and trajectory rules, readout placement and workers. |
13
- | {doc}`sar-ratios` | pTx SAR ratios from VOPs against a reference pulse. |
14
- | {doc}`virtual-scanner` | Played trajectory, signal model, coils, Fourier engine, export, test coverage and scan clock. |
9
+ | {doc}`calibration` | Prewhitening, coil compression, sensitivity maps and the reuse of stored maps |
10
+ | {doc}`ir-cache` | Conversion passes, waves, playout stages, the heaviest repetition, the cache file and the C89 library |
11
+ | {doc}`protocol-wire` | RF layout, protocol keys and values, and the protocol text blocks |
12
+ | {doc}`reconstruction-proxy` | Reconstruction units, image headers, enrichment and trajectory rules, readout placement and workers |
13
+ | {doc}`sar-ratios` | pTx SAR ratios from VOPs against a reference pulse |
14
+ | {doc}`virtual-scanner` | Played trajectory, signal model, coils, Fourier engine, export, test coverage and scan clock |
15
15
 
16
16
  ```{toctree}
17
17
  :hidden:
@@ -227,9 +227,14 @@ the models show none of the dielectric effects of a wavelength comparable to
227
227
  the head.
228
228
 
229
229
  A pulse plays on every transmit channel, weighted by the coil's default shim,
230
- the unit weights that bring the channels into phase at the isocentre, where the
231
- pulse then has its nominal amplitude: each cube sees the transmit field
232
- $b^+(\mathbf{r}) = \sum_c w_c\,s^+_c(\mathbf{r})$, for the weights $w_c$.
230
+ the weights of magnitude $1/\sqrt{N}$ for $N$ channels that bring the channels
231
+ into phase at the isocentre, where the pulse then has its nominal amplitude:
232
+ each cube sees the transmit field
233
+ $b^+(\mathbf{r}) = \sum_c w_c\,s^+_c(\mathbf{r})$, for the weights $w_c$. The
234
+ squares of the weights sum to 1, so the channels together carry the power of
235
+ one channel at the pulse's amplitude, and an RF shim is written in the same
236
+ normalisation: a circularly polarised shim of $N$ channels has weights of
237
+ magnitude $1/\sqrt{N}$.
233
238
 
234
239
  A console given field maps takes the coils, and the subject's field, from
235
240
  electromagnetic and susceptibility models of BrainWeb's head instead
@@ -506,8 +511,8 @@ The maps' transmit coils come with the VOPs mariepy compresses from the same
506
511
  fields, and every design is made under those of the exam's transmit coil: its
507
512
  limits name the VOP file, the default shim, the drive of every channel per
508
513
  hertz of a pulse's amplitude with which the channels' fields reach that
509
- amplitude at the isocentre, $2 / (\gamma \sum_c |B^-_c(\mathbf{0})|)$ in the
510
- maps' unit of drive, and the head and local SAR limits of IEC 60601-2-33's
514
+ amplitude at the isocentre through the default shim,
515
+ $2\sqrt{N} / (\gamma \sum_c |B^-_c(\mathbf{0})|)$ in the maps' unit of drive, and the head and local SAR limits of IEC 60601-2-33's
511
516
  normal operating mode. The IR cache then reports each subsequence's SAR against
512
517
  the reference pulse in that coil ({doc}`../../explanations/safety-checks`).
513
518
 
@@ -70,7 +70,8 @@ estimate; the design the interpreter plays is the stored one.
70
70
  **Storage.** A *design* is one generated or imported chain with its IR cache,
71
71
  immutable once written. Its *identity* is the hash of what it depends on; its
72
72
  *identifier* is the first 18 hexadecimal digits of the identity. The *design
73
- store* is the directory holding every design. A *design call* is one `list`,
73
+ store* is the directory holding one directory per *scan*, named by whatever
74
+ plays it, and a scan's directory holds the design the scan plays. A *design call* is one `list`,
74
75
  `validate`, `generate` or `import` of an interpreter host process; no call
75
76
  keeps state beyond the designs it stores. A design is *pushed* to the *design intake*, the
76
77
  proxy's HTTP endpoint writing its store, as a *bundle* of the files of its
@@ -10,12 +10,12 @@ everything you see is computed by the code on the page.
10
10
 
11
11
  | Lesson | Contents |
12
12
  | --- | --- |
13
- | {doc}`1. Your first scan </generated/gallery/01-course/01_protocol_to_image>` | An acquisition on the virtual scanner, from protocol to image. |
14
- | {doc}`2. Your sequence in the scanner UI </generated/gallery/01-course/02_sequence_plugin>` | Sequence plugin, protocol entries and `evaluate`. |
15
- | {doc}`3. What the scanner plays </generated/gallery/01-course/03_scanner_representation>` | Safety checks, repetition, virtual segments and segment instances. |
16
- | {doc}`4. What your recon receives </generated/gallery/01-course/04_reconstruction_plugin>` | MRD enrichment: counters, flags, encoding spaces and trajectory. |
17
- | {doc}`5. Your recon plugin </generated/gallery/01-course/05_recon_plugin>` | Reconstruction units, inverse FFT and `pics`. |
18
- | {doc}`6. Test your pair on the virtual scanner </generated/gallery/01-course/06_testing_on_the_virtual_scanner>` | Flip-angle series against the closed-form signal. |
13
+ | {doc}`1. Your first scan </generated/gallery/01-course/01_protocol_to_image>` | Acquisition on the virtual scanner, from protocol to image |
14
+ | {doc}`2. Your sequence in the scanner UI </generated/gallery/01-course/02_sequence_plugin>` | Sequence plugin, protocol entries and `evaluate` |
15
+ | {doc}`3. What the scanner plays </generated/gallery/01-course/03_scanner_representation>` | Safety checks, repetition, virtual segments and segment instances |
16
+ | {doc}`4. What your recon receives </generated/gallery/01-course/04_reconstruction_plugin>` | MRD enrichment: counters, flags, encoding spaces and trajectory |
17
+ | {doc}`5. Your recon plugin </generated/gallery/01-course/05_recon_plugin>` | Reconstruction units, inverse FFT and `pics` |
18
+ | {doc}`6. Test your pair on the virtual scanner </generated/gallery/01-course/06_testing_on_the_virtual_scanner>` | Flip-angle series against the closed-form signal |
19
19
 
20
20
  By the end you have two files, a sequence plugin and a recon plugin, that run
21
21
  unchanged on a real scanner through its interpreter
@@ -1,7 +1,7 @@
1
1
  # Examples
2
2
 
3
- Executable pages, run when the documentation is built, so every figure and
4
- every printed number on them is produced by the code as it stands.
3
+ Executed when the documentation is built: every figure and number comes from
4
+ the code on the page.
5
5
 
6
6
  The concepts these pages rely on are in {doc}`/explanations/index`, and the
7
7
  interfaces they call are documented in {doc}`/api/index`.
@@ -12,22 +12,22 @@ The shortest path from a protocol to a reconstructed image, read in order.
12
12
 
13
13
  | Lesson | Contents |
14
14
  | --- | --- |
15
- | {doc}`/generated/gallery/01-course/01_protocol_to_image` | An acquisition on the virtual scanner, from protocol to image. |
16
- | {doc}`/generated/gallery/01-course/02_sequence_plugin` | Sequence plugin, protocol entries and `evaluate`. |
17
- | {doc}`/generated/gallery/01-course/03_scanner_representation` | Safety checks, repetition, virtual segments and segment instances. |
18
- | {doc}`/generated/gallery/01-course/04_reconstruction_plugin` | MRD enrichment: counters, flags, encoding spaces and trajectory. |
19
- | {doc}`/generated/gallery/01-course/05_recon_plugin` | Reconstruction units, inverse FFT and `pics`. |
20
- | {doc}`/generated/gallery/01-course/06_testing_on_the_virtual_scanner` | Flip-angle series against the closed-form signal. |
15
+ | {doc}`/generated/gallery/01-course/01_protocol_to_image` | Acquisition on the virtual scanner, from protocol to image |
16
+ | {doc}`/generated/gallery/01-course/02_sequence_plugin` | Sequence plugin, protocol entries and `evaluate` |
17
+ | {doc}`/generated/gallery/01-course/03_scanner_representation` | Safety checks, repetition, virtual segments and segment instances |
18
+ | {doc}`/generated/gallery/01-course/04_reconstruction_plugin` | MRD enrichment: counters, flags, encoding spaces and trajectory |
19
+ | {doc}`/generated/gallery/01-course/05_recon_plugin` | Reconstruction units, inverse FFT and `pics` |
20
+ | {doc}`/generated/gallery/01-course/06_testing_on_the_virtual_scanner` | Flip-angle series against the closed-form signal |
21
21
 
22
22
  ## Tours
23
23
 
24
- Applications, advanced branches and specialised workflows, each standalone.
24
+ Standalone examples beyond the Course; each names the lessons it assumes.
25
25
 
26
26
  | Tour | Contents |
27
27
  | --- | --- |
28
- | {doc}`/generated/gallery/02-tours/01_protocol_resolution` | Bandwidth quantization and minimum echo time. |
29
- | {doc}`/generated/gallery/02-tours/02_segmentation` | Repetition, virtual segments and subsequences; segment count against scan length. |
30
- | {doc}`/generated/gallery/02-tours/03_fov_offset_enrichment` | Field-of-view offset in the IR cache and its phase in MRD enrichment. |
28
+ | {doc}`/generated/gallery/02-tours/01_protocol_resolution` | Bandwidth quantization and minimum echo time |
29
+ | {doc}`/generated/gallery/02-tours/02_segmentation` | Repetition, virtual segments and subsequences; segment count against scan length |
30
+ | {doc}`/generated/gallery/02-tours/03_fov_offset_enrichment` | Field-of-view offset in the IR cache and its phase in MRD enrichment |
31
31
 
32
32
  ```{toctree}
33
33
  :hidden:
@@ -1,13 +1,12 @@
1
1
  # Tours
2
2
 
3
- Applications, advanced branches and specialised workflows. Each Tour stands
4
- alone and states the lessons of the {doc}`course` it assumes.
3
+ Standalone examples beyond the {doc}`course`. Each names the lessons it assumes.
5
4
 
6
5
  | Tour | Contents |
7
6
  | --- | --- |
8
- | {doc}`/generated/gallery/02-tours/01_protocol_resolution` | Bandwidth quantization and minimum echo time. |
9
- | {doc}`/generated/gallery/02-tours/02_segmentation` | Repetition, virtual segments and subsequences; segment count against scan length. |
10
- | {doc}`/generated/gallery/02-tours/03_fov_offset_enrichment` | Field-of-view offset in the IR cache and its phase in MRD enrichment. |
7
+ | {doc}`/generated/gallery/02-tours/01_protocol_resolution` | Bandwidth quantization and minimum echo time |
8
+ | {doc}`/generated/gallery/02-tours/02_segmentation` | Repetition, virtual segments and subsequences; segment count against scan length |
9
+ | {doc}`/generated/gallery/02-tours/03_fov_offset_enrichment` | Field-of-view offset in the IR cache and its phase in MRD enrichment |
11
10
 
12
11
  ```{toctree}
13
12
  :hidden:
@@ -36,9 +36,9 @@ both on the virtual scanner.
36
36
  - **Writes a design whole or not at all, once, and never modifies it.**
37
37
 
38
38
  Code: {mod}`pulserver.host`. Tests: *a design being written is invisible until it is whole*; *two processes designing one protocol at once store it once*; *a stored design holds the files its manifest records and no other* (`test_design_service.py`).
39
- - **Prunes the store least recently used first.**
39
+ - **Keeps one design per scan, and prunes whole scans least recently used first.**
40
40
 
41
- Code: `pulserver design prune`. Tests: *pruning removes the designs unused for longest first*; *a design found again is used again*; *pruning keeps a design used within the day whatever the limits* (`test_design_service.py`).
41
+ Code: {class}`~pulserver.host.DesignStore`, {func}`~pulserver.host.prune`. Tests: *a design committed to a scan replaces the scan's previous design*; *pruning removes the scans unused for longest first*; *a scan whose design is found again is used again*; *pruning keeps a scan used within the day whatever the limits* (`test_design_service.py`).
42
42
  - **Pushes each design to a proxy on another computer, which stores it only if every file matches the manifest.**
43
43
 
44
44
  Code: {class}`~pulserver.proxy.DesignIntake`. Tests: *a generation pushes the design it replies*; *the intake refuses a tampered bundle with the reason* (`test_design_push.py`).
@@ -90,16 +90,23 @@ below $2^{24}$ exactly.
90
90
 
91
91
  ```text
92
92
  designs/
93
- 3f9c0a1b2c3d4e5f60/
94
- sequence.seq first file of the NextSequence chain, binary Pulseq
95
- sequence_main.seq the remaining files, when there are prescans
96
- sequence.pseg IR cache
97
- resolved.protocol
98
- manifest.json identity and identifier, limits, package versions,
93
+ 29258/ one scan, named by whatever plays it
94
+ 3f9c0a1b2c3d4e5f60/ the scan's design
95
+ sequence.seq first file of the NextSequence chain, binary Pulseq
96
+ sequence_main.seq the remaining files, when there are prescans
97
+ sequence.pseg IR cache
98
+ resolved.protocol
99
+ manifest.json identity and identifier, limits, package versions,
99
100
  creation time, plugin and source, scan time,
100
101
  field-of-view offset, SHA-256 of every file
102
+ motion.buf the poses of a scan corrected for motion
101
103
  ```
102
104
 
105
+ A design is reused while its scan holds it; a design call that resolves to
106
+ another design stores it in place of the scan's previous one. The scanner's
107
+ reconstruction client names the scan and the design in the MRD header, and the
108
+ proxy reads the design from `<store>/<scan>/<id>/`.
109
+
103
110
  The proxy reads the Pulseq files, not the cache: the cache is derived for
104
111
  playout, and the Pulseq files are the design of record.
105
112
 
@@ -1,24 +1,22 @@
1
1
  # Explanations
2
2
 
3
- Conceptual background for the interfaces documented in {doc}`../api/index` and
4
- used in the {doc}`user guide <../user-guide/index>`. These pages state the
5
- components, the representations exchanged between them and the conventions the
6
- rest of the documentation assumes.
3
+ The concepts behind pulserver, one page each, in the order of a scan.
4
+ Interfaces are in the {doc}`API reference <../api/index>`, procedures in the
5
+ {doc}`user guide <../user-guide/index>`.
7
6
 
8
7
  | Page | Contents |
9
8
  | --- | --- |
10
- | {doc}`architecture` | Design calls, reconstruction proxy and the design store. |
11
- | {doc}`protocol` | Prescription, resolved protocol, units and wire precision. |
12
- | {doc}`safety-checks` | Checks run before a design is stored, and those computed by the vendor's routines. |
13
- | {doc}`scanner-representation` | Base blocks, virtual segments, segment instances and the execution stream. |
14
- | {doc}`raw-data` | Counters, flags, encoding spaces, trajectory and field-of-view phase. |
15
- | {doc}`reconstruction-session` | MRD streaming, design lookup, workers and slots, forwarding and DICOM. |
16
- | {doc}`reconstruction` | Reconstruction units, results and the exam's calibration context. |
17
- | {doc}`virtual-scanner` | Virtual interpreter, Fourier engine and reconstruction client. |
9
+ | {doc}`architecture` | Design calls, reconstruction proxy and the design store |
10
+ | {doc}`protocol` | Prescription, resolved protocol, units and wire precision |
11
+ | {doc}`safety-checks` | Checks run before a design is stored, and those computed by the vendor's routines |
12
+ | {doc}`scanner-representation` | Base blocks, virtual segments, segment instances and the execution stream |
13
+ | {doc}`raw-data` | Counters, flags, encoding spaces, trajectory and field-of-view phase |
14
+ | {doc}`reconstruction-session` | MRD streaming, design lookup, workers and slots, forwarding and DICOM |
15
+ | {doc}`reconstruction` | Reconstruction units, results and the exam's calibration context |
16
+ | {doc}`virtual-scanner` | Virtual interpreter, Fourier engine and reconstruction client |
18
17
 
19
- Implementation detail -- the cache layout, the wire format, the proxy's
20
- buffers and workers, and the virtual scanner's Fourier engine -- is in
21
- {doc}`../developer-guide/internals/index`.
18
+ Layouts, wire formats and numerical methods are in the
19
+ {doc}`internals <../developer-guide/internals/index>`.
22
20
 
23
21
  ```{toctree}
24
22
  :hidden:
@@ -0,0 +1,15 @@
1
+ # Miscellaneous
2
+
3
+ | Page | Contents |
4
+ | --- | --- |
5
+ | {doc}`license` | MIT licence; notices for adapted code, BrainWeb data and artwork |
6
+ | {doc}`related` | Related projects |
7
+ | {doc}`contributors` | Maintainers and contributors |
8
+
9
+ ```{toctree}
10
+ :hidden:
11
+
12
+ license
13
+ related
14
+ contributors
15
+ ```
@@ -6,11 +6,11 @@ interfaces, units and defaults in {doc}`../api/index`.
6
6
 
7
7
  | Page | Contents |
8
8
  | --- | --- |
9
- | {doc}`running` | Design calls, design server, reconstruction proxy and server, playout validation. |
10
- | {doc}`scanner-sequences` | Sequence plugins, protocol entries and evaluation. |
11
- | {doc}`reconstruction-plugins` | Reconstruction plugins and offline reconstruction. |
12
- | {doc}`reconstruction-client` | Messages and header of a reconstruction client. |
13
- | {doc}`virtual-scanner` | Phantom scans through a stored design, the proxy and a plugin. |
9
+ | {doc}`running` | Design calls, design server, reconstruction proxy and server, playout validation |
10
+ | {doc}`scanner-sequences` | Sequence plugins, protocol entries and evaluation |
11
+ | {doc}`reconstruction-plugins` | Reconstruction plugins and offline reconstruction |
12
+ | {doc}`reconstruction-client` | Messages and header of a reconstruction client |
13
+ | {doc}`virtual-scanner` | Phantom scans through a stored design, the proxy and a plugin |
14
14
 
15
15
  ```{toctree}
16
16
  :hidden:
@@ -42,18 +42,50 @@ connection, so the client can finish sending and read the reason.
42
42
 
43
43
  | Element | Requirement | Use |
44
44
  | --- | --- | --- |
45
+ | `pulserver_scan`, a `userParameterString` | Required | The scan the design is stored for: the `--scan` of the design call, one directory name of the design store |
45
46
  | `pulserver_design`, a `userParameterString` | Required | The identifier of the design the interpreter plays, from the `GENERATED` or `IMPORTED` reply: 18 hexadecimal digits, which are three 24-bit integers of six digits each |
46
47
  | `experimentalConditions.H1resonanceFrequency_Hz` | Required by the MRD schema | DICOM `ImagingFrequency` |
47
48
  | `acquisitionSystemInformation.receiverChannels` | Optional | The coil count of a reconstruction buffer laid out before its first acquisition |
48
49
  | `ExamID`, a `userParameterString`, or else `studyInformation.studyInstanceUID`, or else `studyInformation.studyID` | Optional | The exam; the series of one exam share its exam cache, and a series without one is an exam of its own |
49
50
  | `fov_offset_mm`, a `userParameterString` | Optional | The position of the field-of-view centre, three millimetres along the logical readout, phase and slice axes separated by spaces; a difference from the offset the design was converted at is applied to the samples as a receive phase. Without it, the converted offset |
50
51
  | `subjectInformation`, `studyInformation`, `measurementInformation`, `acquisitionSystemInformation` | Optional | Copied into the DICOM datasets; `relativeTablePosition` is not |
51
- | `measurementInformation.measurementID` | A non-negative integer when `systemVendor` names GE | The DICOM series number on a GE system |
52
+ | `measurementInformation.measurementID` | A non-negative integer when `systemVendor` names GE | The DICOM series number on a GE system: of the first series the reconstruction returns, and `100 × measurementID + k` of the `k`-th after it |
53
+ | `dicom:<attribute>`, a `userParameterString` | Optional | A DICOM attribute of every image ({ref}`dicom-attributes`) |
52
54
  | `encoding` | Optional | Replaced by one encoding space per subsequence, and one more for the navigator readouts of a subsequence that has them. The reconstruction space is the sequence's matrix size and field of view, one slice deep for a stack of 2D slices; the encoded space of a Cartesian space has the readout widened to the full echo, oversampling included, and its field of view in proportion. The encoding limits are the extremes of the counters the readouts reach, centred on the k-space centre line and partition the sequence defines. A matrix size or field of view the sequence does not define is kept from the client's encoding at the same index |
53
55
  | `sequenceParameters` | Optional | TR, TE, TI and flip angles replaced by those the sequence defines; TR and TE it does not define are measured by pypulseqpp's `test_report_dict`, flip angles it does not define are the distinct values of `rf_flip_angles` |
54
56
 
55
- A header that the ISMRMRD schema does not accept, or that names no design of
56
- the store, is refused before any acquisition is read.
57
+ A header that the ISMRMRD schema does not accept, or that names no design the
58
+ store holds for its scan, is refused before any acquisition is read.
59
+
60
+ (dicom-attributes)=
61
+ ### DICOM attributes
62
+
63
+ A client states the DICOM attributes the MRD header has no element for as
64
+ `userParameterString` entries named `dicom:<attribute>`. The DICOM builder
65
+ reads them once, with the rest of the header, into the attributes every image
66
+ of the series starts from; an entry whose value names a quantity of the image
67
+ is filled in for each image instead. An image's own meta attributes take
68
+ precedence over both. `<attribute>` is one of:
69
+
70
+ | Form | Example | Resolved by |
71
+ | --- | --- | --- |
72
+ | A keyword of the DICOM standard | `dicom:ImagedNucleus` = `23Na` | pydicom's dictionary |
73
+ | An explicit tag and value representation | `dicom:(0011,1011)FL` = `{location}` | Itself; a private group's creator is one more entry, `dicom:(0011,0010)LO` |
74
+ | A keyword of a private dictionary | `dicom:PulseSequenceLabel` = `pulserver` | The file `dicom:dictionary` names, in MATLAB's format, one `(gggg,eeee) VR Keyword VM` line per attribute |
75
+
76
+ A value separates multiple values with `\` and may name, in braces, a quantity
77
+ of the image it is written into; `{{` and `}}` are literal braces:
78
+
79
+ | Name | Value |
80
+ | --- | --- |
81
+ | `slice_location` | The image centre along the plane normal, in mm: the `SliceLocation` written by default |
82
+ | `location` | The image centre along the patient axis the normal lies closest to, in mm, positive towards right, anterior or superior; for an oblique plane, along the normal turned towards those |
83
+ | `location_letter` | The side `location` lies on: `R` or `L`, `A` or `P`, `S` or `I`, and `+` or `-` for an oblique plane |
84
+ | `instance_number`, `series_number` | The image's `InstanceNumber` and `SeriesNumber` |
85
+
86
+ An attribute that resolves to no tag, for want of the dictionary, is logged and
87
+ left out. `pulserver replay --dicom-dictionary` names another dictionary for a
88
+ series replayed where the header's is not.
57
89
 
58
90
  ## Acquisitions
59
91
 
@@ -284,7 +284,7 @@ receives carries the message. `required=False` returns `None` instead of
284
284
  raising.
285
285
 
286
286
  (dicom-pixel-values)=
287
- ## DICOM pixel values
287
+ ## DICOM output
288
288
 
289
289
  A DICOM dataset stores integer pixels, made when a result with `dicom=True` is
290
290
  converted from the image the plugin returned. The dataset's rescale maps them
@@ -331,6 +331,32 @@ with one mapping per DICOM series, a series being the images that share
331
331
 
332
332
  `RescaleType` is `US`, unspecified: the units are those of the reconstruction.
333
333
 
334
+ A DICOM image is written in the radiological display orientation of the plane
335
+ it lies closest to: an axial image with the patient's right on the left and
336
+ anterior at the top, a coronal one with the right on the left and superior at
337
+ the top, a sagittal one with anterior on the left and superior at the top. Its
338
+ pixels are flipped and transposed to that orientation, never resampled; the MRD
339
+ image keeps the orientation the reconstruction returned.
340
+
341
+ Each `series_index` is a DICOM series of its own. The first to arrive takes the
342
+ series identity the header states; each later one a series UID derived from it
343
+ and, on a GE system, the series number `100 × measurementID + k` for the
344
+ `k`-th after the first.
345
+
346
+ A plot, a fit or a report reaches the scanner as an RGB result: a `(y, x, 3)`
347
+ array of values from 0 to 255, which {func}`~pulserver.recon.figure_rgb` draws
348
+ from a matplotlib figure, stored as a DICOM secondary capture.
349
+
350
+ ```python
351
+ return recon.ReconResult(
352
+ recon.figure_rgb(figure),
353
+ image_type="rgb",
354
+ series_index=10,
355
+ dicom=True,
356
+ attributes={"SeriesDescription": "T1 fit"},
357
+ )
358
+ ```
359
+
334
360
  ## Diffusion tables
335
361
 
336
362
  The proxy states the diffusion table a design names in the header's
@@ -365,12 +391,17 @@ process ID, level and logger name.
365
391
  {meth}`~pulserver.recon.ReconPlugin.run` reconstructs an ISMRMRD HDF5 file in
366
392
  the calling process, through the same hooks. A file recorded as the scanner
367
393
  sends it, such as `pulserver scan --mrd raw.h5` or the proxy's `--save-data`
368
- writes, is enriched from its design store first:
394
+ writes, is enriched first from the design it was played from, found in a design
395
+ store or given as its sequence file, with its manifest beside it:
369
396
 
370
397
  ```python
371
398
  images = PLUGIN.run("raw.h5", store="designs")
399
+ images = PLUGIN.run("raw.h5", design="designs/scan/9c74a8aa28527cf231/sequence.seq")
372
400
  ```
373
401
 
402
+ `pulserver replay` does the same from the command line
403
+ ({ref}`series-replay`).
404
+
374
405
  Calling the plugin on an {class}`~pulserver.mrd.AcquisitionBucket` runs
375
406
  `startup`, passes every acquisition to `receive`, reconstructs the units still
376
407
  open, runs `finish`, and returns the last output. A header need only describe