simind-python-connector 2.0.0__tar.gz → 2.0.2__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.
- simind_python_connector-2.0.2/.github/workflows/containers.yml +52 -0
- simind_python_connector-2.0.2/.github/workflows/docs.yml +49 -0
- simind_python_connector-2.0.2/.github/workflows/publish.yml +47 -0
- simind_python_connector-2.0.2/.github/workflows/tests.yml +91 -0
- simind_python_connector-2.0.2/.readthedocs.yaml +19 -0
- simind_python_connector-2.0.2/.zenodo.json +35 -0
- simind_python_connector-2.0.2/CHANGELOG.md +626 -0
- simind_python_connector-2.0.2/CITATION.cff +26 -0
- simind_python_connector-2.0.2/MANIFEST.in +66 -0
- simind_python_connector-2.0.2/PKG-INFO +130 -0
- simind_python_connector-2.0.2/README.md +79 -0
- simind_python_connector-2.0.2/docker/README.md +94 -0
- simind_python_connector-2.0.2/docker/compose.yaml +76 -0
- simind_python_connector-2.0.2/docker/constraints.txt +6 -0
- simind_python_connector-2.0.2/docker/import_guard/sitecustomize.py +52 -0
- simind_python_connector-2.0.2/docker/python/Dockerfile +40 -0
- simind_python_connector-2.0.2/docker/python/install_mpich_compat.sh +24 -0
- simind_python_connector-2.0.2/docker/pytomography/Dockerfile +47 -0
- simind_python_connector-2.0.2/docker/sirf/Dockerfile +44 -0
- simind_python_connector-2.0.2/docker/stir/Dockerfile +48 -0
- simind_python_connector-2.0.2/docs/LICENSE +195 -0
- simind_python_connector-2.0.2/docs/_docs.py +291 -0
- simind_python_connector-2.0.2/docs/_static/.gitkeep +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/.gitkeep +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/basic_simulation/basic_simulation.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/cil_rdp_svrg/reconstructions.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/cil_rdp_svrg/recovery.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/cil_scatter/reconstructions.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/cil_scatter/recovery.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/density_conversion/density_conversion.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/mc_scatter_osem/reconstructions.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/mc_scatter_osem/recovery.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/multi_window/multi_window.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/phantom_library/phantom_library.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/pytomography_osem/pytomography_osem.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/residual_correction/reconstructions.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/residual_correction/recovery.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/scatter_normalisation/recovery.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/scatter_normalisation/scale_scatter.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/scattwin_vs_penetrate/decomposition.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/sirf_osem/sirf_osem.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/stir_osem/stir_osem.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/y90_ct_conversion/maps.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/y90_ct_conversion/registration.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/y90_effective_energy/attenuation_maps.png +0 -0
- simind_python_connector-2.0.2/docs/_static/examples/y90_effective_energy/detected_spectrum.png +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/docs/api.rst +39 -11
- simind_python_connector-2.0.2/docs/backends.rst +80 -0
- simind_python_connector-2.0.2/docs/changelog.rst +786 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/docs/conf.py +10 -2
- simind_python_connector-2.0.2/docs/contributing.rst +98 -0
- simind_python_connector-2.0.2/docs/datasets.rst +62 -0
- simind_python_connector-2.0.2/docs/example_pages/_template.rst.txt +19 -0
- simind_python_connector-2.0.2/docs/example_pages/basic_simulation.rst +19 -0
- simind_python_connector-2.0.2/docs/example_pages/cil_rdp_svrg.rst +31 -0
- simind_python_connector-2.0.2/docs/example_pages/cil_scatter.rst +29 -0
- simind_python_connector-2.0.2/docs/example_pages/custom_configuration.rst +11 -0
- simind_python_connector-2.0.2/docs/example_pages/density_conversion.rst +18 -0
- simind_python_connector-2.0.2/docs/example_pages/dicom_recipe.rst +36 -0
- simind_python_connector-2.0.2/docs/example_pages/index.rst +44 -0
- simind_python_connector-2.0.2/docs/example_pages/mc_scatter_osem.rst +29 -0
- simind_python_connector-2.0.2/docs/example_pages/multi_window.rst +21 -0
- simind_python_connector-2.0.2/docs/example_pages/phantom_library.rst +18 -0
- simind_python_connector-2.0.2/docs/example_pages/pytomography_osem.rst +21 -0
- simind_python_connector-2.0.2/docs/example_pages/residual_correction.rst +33 -0
- simind_python_connector-2.0.2/docs/example_pages/scatter_normalisation.rst +39 -0
- simind_python_connector-2.0.2/docs/example_pages/scattwin_vs_penetrate.rst +21 -0
- simind_python_connector-2.0.2/docs/example_pages/sirf_osem.rst +21 -0
- simind_python_connector-2.0.2/docs/example_pages/stir_osem.rst +21 -0
- simind_python_connector-2.0.2/docs/example_pages/y90_ct_conversion.rst +46 -0
- simind_python_connector-2.0.2/docs/example_pages/y90_effective_energy.rst +29 -0
- simind_python_connector-2.0.2/docs/example_pages.json +114 -0
- simind_python_connector-2.0.2/docs/examples/README.rst +5 -0
- simind_python_connector-2.0.2/docs/examples/_nema.py +572 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2/docs}/examples/_python_connector_helpers.py +3 -2
- simind_python_connector-2.0.2/docs/examples/_scatter_normalisation.py +49 -0
- simind_python_connector-2.0.2/docs/examples/_y90.py +220 -0
- simind_python_connector-2.0.2/docs/examples/_y90_spectrum.py +151 -0
- simind_python_connector-2.0.2/docs/examples/backends/plot_07a_stir_adaptor_osem.py +159 -0
- simind_python_connector-2.0.2/docs/examples/backends/plot_07b_sirf_adaptor_osem.py +153 -0
- simind_python_connector-2.0.2/docs/examples/backends/plot_07c_pytomography_adaptor_osem.py +159 -0
- simind_python_connector-2.0.2/docs/examples/cil/README.rst +2 -0
- simind_python_connector-2.0.2/docs/examples/cil/plot_14_cil_scatter.py +203 -0
- simind_python_connector-2.0.2/docs/examples/cil/plot_15_cil_rdp_svrg.py +259 -0
- simind_python_connector-2.0.2/docs/examples/getting_started/plot_01_basic_simulation.py +109 -0
- simind_python_connector-2.0.2/docs/examples/getting_started/plot_03_multi_window.py +130 -0
- simind_python_connector-2.0.2/docs/examples/getting_started/plot_04_custom_config.py +42 -0
- simind_python_connector-2.0.2/docs/examples/getting_started/plot_05_scattwin_vs_penetrate_comparison.py +193 -0
- simind_python_connector-2.0.2/docs/examples/getting_started/plot_06_schneider_density_conversion.py +101 -0
- simind_python_connector-2.0.2/docs/examples/mc_scatter/README.rst +2 -0
- simind_python_connector-2.0.2/docs/examples/mc_scatter/plot_11_mc_scatter_osem.py +200 -0
- simind_python_connector-2.0.2/docs/examples/mc_scatter/plot_12_scatter_normalisation.py +266 -0
- simind_python_connector-2.0.2/docs/examples/mc_scatter/plot_13_residual_correction.py +252 -0
- simind_python_connector-2.0.2/docs/examples/phantoms/README.rst +2 -0
- simind_python_connector-2.0.2/docs/examples/phantoms/plot_09_phantom_library.py +88 -0
- simind_python_connector-2.0.2/docs/examples/real_data/README.rst +21 -0
- simind_python_connector-2.0.2/docs/examples/real_data/plot_17_y90_effective_energy.py +308 -0
- simind_python_connector-2.0.2/docs/geometry.rst +161 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/docs/index.rst +20 -4
- simind_python_connector-2.0.2/docs/installation.rst +92 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/docs/intro.rst +5 -11
- simind_python_connector-2.0.2/docs/normalisation.rst +178 -0
- simind_python_connector-2.0.2/docs/phantoms.rst +122 -0
- simind_python_connector-2.0.2/docs/reconstruction.rst +226 -0
- simind_python_connector-2.0.2/docs/simind_validation.md +191 -0
- simind_python_connector-2.0.2/docs/spectub_cache_interference.md +13 -0
- simind_python_connector-2.0.2/docs/testing.rst +124 -0
- simind_python_connector-2.0.2/docs/tutorial.rst +121 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/docs/usage.rst +83 -4
- simind_python_connector-2.0.2/examples/README.rst +5 -0
- simind_python_connector-2.0.2/examples/_nema.py +572 -0
- {simind_python_connector-2.0.0/docs → simind_python_connector-2.0.2}/examples/_python_connector_helpers.py +3 -2
- simind_python_connector-2.0.2/examples/_scatter_normalisation.py +49 -0
- simind_python_connector-2.0.2/examples/_y90.py +220 -0
- simind_python_connector-2.0.2/examples/_y90_spectrum.py +151 -0
- simind_python_connector-2.0.2/examples/backends/plot_07a_stir_adaptor_osem.py +159 -0
- simind_python_connector-2.0.2/examples/backends/plot_07b_sirf_adaptor_osem.py +153 -0
- simind_python_connector-2.0.2/examples/backends/plot_07c_pytomography_adaptor_osem.py +159 -0
- simind_python_connector-2.0.2/examples/cil/README.rst +2 -0
- simind_python_connector-2.0.2/examples/cil/plot_14_cil_scatter.py +203 -0
- simind_python_connector-2.0.2/examples/cil/plot_15_cil_rdp_svrg.py +259 -0
- simind_python_connector-2.0.2/examples/getting_started/plot_01_basic_simulation.py +109 -0
- simind_python_connector-2.0.2/examples/getting_started/plot_03_multi_window.py +130 -0
- simind_python_connector-2.0.2/examples/getting_started/plot_04_custom_config.py +42 -0
- simind_python_connector-2.0.2/examples/getting_started/plot_05_scattwin_vs_penetrate_comparison.py +193 -0
- simind_python_connector-2.0.2/examples/getting_started/plot_06_schneider_density_conversion.py +101 -0
- simind_python_connector-2.0.2/examples/mc_scatter/README.rst +2 -0
- simind_python_connector-2.0.2/examples/mc_scatter/plot_11_mc_scatter_osem.py +200 -0
- simind_python_connector-2.0.2/examples/mc_scatter/plot_12_scatter_normalisation.py +266 -0
- simind_python_connector-2.0.2/examples/mc_scatter/plot_13_residual_correction.py +252 -0
- simind_python_connector-2.0.2/examples/phantoms/README.rst +2 -0
- simind_python_connector-2.0.2/examples/phantoms/plot_09_phantom_library.py +88 -0
- simind_python_connector-2.0.2/examples/real_data/README.rst +21 -0
- simind_python_connector-2.0.2/examples/real_data/plot_17_y90_effective_energy.py +308 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/pyproject.toml +34 -6
- simind_python_connector-2.0.2/scripts/check_docs.py +52 -0
- simind_python_connector-2.0.2/scripts/check_simind_mpi.py +81 -0
- simind_python_connector-2.0.2/scripts/check_wheel_resources.py +116 -0
- simind_python_connector-2.0.2/scripts/fix.sh +14 -0
- simind_python_connector-2.0.2/scripts/make_y90_bundle.py +112 -0
- simind_python_connector-2.0.2/scripts/prepare_release.py +229 -0
- simind_python_connector-2.0.2/scripts/release.sh +97 -0
- simind_python_connector-2.0.2/scripts/run_all_examples.py +261 -0
- simind_python_connector-2.0.2/scripts/run_container_examples.sh +291 -0
- simind_python_connector-2.0.2/scripts/run_container_validation.sh +348 -0
- simind_python_connector-2.0.2/scripts/run_validation.sh +120 -0
- simind_python_connector-2.0.2/scripts/validation_report.py +120 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/__init__.py +3 -3
- simind_python_connector-2.0.2/simind_python_connector/builders/_native.py +92 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/builders/acquisition_builder.py +97 -104
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/builders/image_builder.py +16 -72
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/configs/__init__.py +10 -4
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/connectors/__init__.py +0 -2
- simind_python_connector-2.0.2/simind_python_connector/connectors/_native_adaptor.py +471 -0
- simind_python_connector-2.0.2/simind_python_connector/connectors/python_connector.py +1387 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/connectors/pytomography_adaptor.py +94 -28
- simind_python_connector-2.0.2/simind_python_connector/connectors/sirf_adaptor.py +43 -0
- simind_python_connector-2.0.2/simind_python_connector/connectors/stir_adaptor.py +45 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/converters/__init__.py +2 -2
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/converters/attenuation.py +48 -51
- simind_python_connector-2.0.2/simind_python_connector/converters/simind_to_stir.py +473 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/core/config.py +432 -123
- simind_python_connector-2.0.2/simind_python_connector/core/executor.py +358 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/core/types.py +16 -25
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/data/__init__.py +3 -3
- simind_python_connector-2.0.2/simind_python_connector/data/bone.atn +178 -0
- simind_python_connector-2.0.2/simind_python_connector/data/h2o.atn +84 -0
- simind_python_connector-2.0.2/simind_python_connector/datasets.py +67 -0
- simind_python_connector-2.0.2/simind_python_connector/normalisation.py +90 -0
- simind_python_connector-2.0.2/simind_python_connector/phantoms.py +390 -0
- simind_python_connector-2.0.2/simind_python_connector/recon/__init__.py +43 -0
- simind_python_connector-2.0.2/simind_python_connector/recon/cil.py +185 -0
- simind_python_connector-2.0.2/simind_python_connector/recon/corrections.py +192 -0
- simind_python_connector-2.0.2/simind_python_connector/recon/diagnostics.py +41 -0
- simind_python_connector-2.0.2/simind_python_connector/recon/osem.py +63 -0
- simind_python_connector-2.0.2/simind_python_connector/recon/projector.py +141 -0
- simind_python_connector-2.0.2/simind_python_connector/recon/updates.py +88 -0
- simind_python_connector-2.0.2/simind_python_connector/utils/__init__.py +69 -0
- simind_python_connector-2.0.2/simind_python_connector/utils/interfile.py +690 -0
- simind_python_connector-2.0.2/simind_python_connector/utils/projection_metrics.py +153 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/utils/simind_utils.py +23 -28
- simind_python_connector-2.0.2/simind_python_connector.egg-info/SOURCES.txt +276 -0
- simind_python_connector-2.0.2/tests/conftest.py +53 -0
- simind_python_connector-2.0.2/tests/fixtures/golden/circular.hs +37 -0
- simind_python_connector-2.0.2/tests/fixtures/golden/ignored_substrings.hs +5 -0
- simind_python_connector-2.0.2/tests/fixtures/golden/orbit.hs +39 -0
- simind_python_connector-2.0.2/tests/fixtures/golden/penetrate_component_12.hs +8 -0
- simind_python_connector-2.0.2/tests/fixtures/minimal_variable_sections.smc +36 -0
- simind_python_connector-2.0.2/tests/recon/__init__.py +0 -0
- simind_python_connector-2.0.2/tests/recon/conftest.py +138 -0
- simind_python_connector-2.0.2/tests/recon/fakes.py +93 -0
- simind_python_connector-2.0.2/tests/recon/test_cil_functions.py +46 -0
- simind_python_connector-2.0.2/tests/recon/test_cil_sirf.py +250 -0
- simind_python_connector-2.0.2/tests/recon/test_corrections.py +636 -0
- simind_python_connector-2.0.2/tests/recon/test_diagnostics.py +60 -0
- simind_python_connector-2.0.2/tests/recon/test_import_boundary.py +38 -0
- simind_python_connector-2.0.2/tests/recon/test_osem_sirf.py +152 -0
- simind_python_connector-2.0.2/tests/recon/test_projector.py +193 -0
- simind_python_connector-2.0.2/tests/recon/test_residual.py +77 -0
- simind_python_connector-2.0.2/tests/recon/test_residual_cil.py +52 -0
- simind_python_connector-2.0.2/tests/recon/test_residual_sirf.py +137 -0
- simind_python_connector-2.0.2/tests/recon/test_updates.py +146 -0
- simind_python_connector-2.0.2/tests/test_acquisition_builder_unit.py +350 -0
- simind_python_connector-2.0.2/tests/test_attenuation_utils.py +68 -0
- simind_python_connector-2.0.2/tests/test_builders_lifetime.py +74 -0
- simind_python_connector-2.0.2/tests/test_builders_native.py +162 -0
- simind_python_connector-2.0.2/tests/test_configure_phantom.py +404 -0
- simind_python_connector-2.0.2/tests/test_connector_backend_separation.py +199 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/tests/test_container_library_isolation.py +8 -1
- simind_python_connector-2.0.2/tests/test_container_scripts.py +392 -0
- simind_python_connector-2.0.2/tests/test_converter_golden.py +128 -0
- simind_python_connector-2.0.2/tests/test_datasets.py +71 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/tests/test_dicom_builder.py +66 -7
- simind_python_connector-2.0.2/tests/test_docs_check.py +179 -0
- simind_python_connector-2.0.2/tests/test_energy_window_filename_simind.py +34 -0
- simind_python_connector-2.0.2/tests/test_examples_backend_separation.py +60 -0
- simind_python_connector-2.0.2/tests/test_examples_navigation.py +56 -0
- simind_python_connector-2.0.2/tests/test_executor.py +604 -0
- simind_python_connector-2.0.2/tests/test_ground_truth_sirf.py +38 -0
- simind_python_connector-2.0.2/tests/test_image_builder_unit.py +108 -0
- simind_python_connector-2.0.2/tests/test_import_side_effects.py +31 -0
- simind_python_connector-2.0.2/tests/test_interfile.py +1334 -0
- simind_python_connector-2.0.2/tests/test_make_y90_bundle.py +82 -0
- simind_python_connector-2.0.2/tests/test_marker_policy.py +66 -0
- simind_python_connector-2.0.2/tests/test_measured_geometry_simind.py +252 -0
- simind_python_connector-2.0.2/tests/test_native_adaptors.py +1460 -0
- simind_python_connector-2.0.2/tests/test_nema_examples.py +437 -0
- simind_python_connector-2.0.2/tests/test_nema_phantom.py +95 -0
- simind_python_connector-2.0.2/tests/test_non_square_slices_simind.py +62 -0
- simind_python_connector-2.0.2/tests/test_normalisation.py +98 -0
- simind_python_connector-2.0.2/tests/test_packaging_resources.py +168 -0
- simind_python_connector-2.0.2/tests/test_phantoms.py +102 -0
- simind_python_connector-2.0.2/tests/test_phantoms_simind.py +249 -0
- simind_python_connector-2.0.2/tests/test_projection_metrics.py +186 -0
- simind_python_connector-2.0.2/tests/test_python_connector.py +3618 -0
- simind_python_connector-2.0.2/tests/test_pytomography_adaptor.py +625 -0
- simind_python_connector-2.0.2/tests/test_release_regressions_simind.py +309 -0
- simind_python_connector-2.0.2/tests/test_release_tools.py +779 -0
- simind_python_connector-2.0.2/tests/test_runtime_switches.py +191 -0
- simind_python_connector-2.0.2/tests/test_scatter_normalisation_options.py +38 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/tests/test_schneider_density.py +24 -0
- simind_python_connector-2.0.2/tests/test_simind_mpi.py +29 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/tests/test_simind_to_stir_converter.py +355 -31
- simind_python_connector-2.0.2/tests/test_simulation_config.py +548 -0
- simind_python_connector-2.0.2/tests/test_template_geometry_sirf.py +97 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/tests/test_utils_small.py +1 -29
- simind_python_connector-2.0.2/tests/test_validation_framework.py +150 -0
- simind_python_connector-2.0.2/tests/test_voxelise.py +130 -0
- simind_python_connector-2.0.2/tests/test_y90_ct_conversion.py +235 -0
- simind_python_connector-2.0.2/tests/test_y90_spectra.py +252 -0
- simind_python_connector-2.0.2/tests/validation/__init__.py +0 -0
- simind_python_connector-2.0.2/tests/validation/conftest.py +142 -0
- simind_python_connector-2.0.2/tests/validation/test_activity.py +98 -0
- simind_python_connector-2.0.2/tests/validation/test_anisotropic_voxels.py +110 -0
- simind_python_connector-2.0.2/tests/validation/test_backend_agreement.py +274 -0
- simind_python_connector-2.0.2/tests/validation/test_cil.py +288 -0
- simind_python_connector-2.0.2/tests/validation/test_interfile.py +130 -0
- simind_python_connector-2.0.2/tests/validation/test_measured_geometry.py +81 -0
- simind_python_connector-2.0.2/tests/validation/test_mpi.py +188 -0
- simind_python_connector-2.0.2/tests/validation/test_mu_map.py +168 -0
- simind_python_connector-2.0.2/tests/validation/test_phantoms.py +276 -0
- simind_python_connector-2.0.2/tests/validation/test_recon.py +417 -0
- simind_python_connector-2.0.2/tests/validation/test_runtime_switches.py +278 -0
- simind_python_connector-2.0.2/tests/validation/test_scale_to_reference.py +188 -0
- simind_python_connector-2.0.2/tests/validation/test_versions.py +70 -0
- simind_python_connector-2.0.2/uv.lock +2474 -0
- simind_python_connector-2.0.0/MANIFEST.in +0 -13
- simind_python_connector-2.0.0/PKG-INFO +0 -283
- simind_python_connector-2.0.0/README.md +0 -240
- simind_python_connector-2.0.0/docs/backends.rst +0 -56
- simind_python_connector-2.0.0/docs/changelog.rst +0 -380
- simind_python_connector-2.0.0/docs/connector_modernization_plan.rst +0 -45
- simind_python_connector-2.0.0/docs/contributing.rst +0 -46
- simind_python_connector-2.0.0/docs/examples/01_basic_simulation.py +0 -93
- simind_python_connector-2.0.0/docs/examples/02_runtime_switch_comparison.py +0 -108
- simind_python_connector-2.0.0/docs/examples/03_multi_window.py +0 -120
- simind_python_connector-2.0.0/docs/examples/04_custom_config.py +0 -228
- simind_python_connector-2.0.0/docs/examples/05_scattwin_vs_penetrate_comparison.py +0 -473
- simind_python_connector-2.0.0/docs/examples/06_schneider_density_conversion.py +0 -322
- simind_python_connector-2.0.0/docs/examples/07A_stir_adaptor_osem.py +0 -211
- simind_python_connector-2.0.0/docs/examples/07B_sirf_adaptor_osem.py +0 -193
- simind_python_connector-2.0.0/docs/examples/07C_pytomography_adaptor_osem.py +0 -184
- simind_python_connector-2.0.0/docs/examples/08A_stir_adaptor_from_dicom.py +0 -64
- simind_python_connector-2.0.0/docs/examples/08B_sirf_adaptor_from_dicom.py +0 -64
- simind_python_connector-2.0.0/docs/examples/08C_pytomography_adaptor_from_dicom.py +0 -82
- simind_python_connector-2.0.0/docs/examples.rst +0 -125
- simind_python_connector-2.0.0/docs/geometry.rst +0 -64
- simind_python_connector-2.0.0/docs/installation.rst +0 -130
- simind_python_connector-2.0.0/docs/testing.rst +0 -236
- simind_python_connector-2.0.0/examples/01_basic_simulation.py +0 -93
- simind_python_connector-2.0.0/examples/02_runtime_switch_comparison.py +0 -108
- simind_python_connector-2.0.0/examples/03_multi_window.py +0 -120
- simind_python_connector-2.0.0/examples/04_custom_config.py +0 -228
- simind_python_connector-2.0.0/examples/05_scattwin_vs_penetrate_comparison.py +0 -473
- simind_python_connector-2.0.0/examples/06_schneider_density_conversion.py +0 -322
- simind_python_connector-2.0.0/examples/07A_stir_adaptor_osem.py +0 -211
- simind_python_connector-2.0.0/examples/07B_sirf_adaptor_osem.py +0 -193
- simind_python_connector-2.0.0/examples/07C_pytomography_adaptor_osem.py +0 -184
- simind_python_connector-2.0.0/examples/08A_stir_adaptor_from_dicom.py +0 -64
- simind_python_connector-2.0.0/examples/08B_sirf_adaptor_from_dicom.py +0 -64
- simind_python_connector-2.0.0/examples/08C_pytomography_adaptor_from_dicom.py +0 -82
- simind_python_connector-2.0.0/requirements-dev.txt +0 -23
- simind_python_connector-2.0.0/requirements.txt +0 -10
- simind_python_connector-2.0.0/simind_python_connector/backends/__init__.py +0 -487
- simind_python_connector-2.0.0/simind_python_connector/backends/base.py +0 -387
- simind_python_connector-2.0.0/simind_python_connector/backends/sirf_backend.py +0 -309
- simind_python_connector-2.0.0/simind_python_connector/backends/stir_backend.py +0 -395
- simind_python_connector-2.0.0/simind_python_connector/connectors/_spacing.py +0 -75
- simind_python_connector-2.0.0/simind_python_connector/connectors/python_connector.py +0 -447
- simind_python_connector-2.0.0/simind_python_connector/connectors/sirf_adaptor.py +0 -167
- simind_python_connector-2.0.0/simind_python_connector/connectors/stir_adaptor.py +0 -167
- simind_python_connector-2.0.0/simind_python_connector/converters/dicom_to_stir.py +0 -3
- simind_python_connector-2.0.0/simind_python_connector/converters/simind_to_stir.py +0 -771
- simind_python_connector-2.0.0/simind_python_connector/core/executor.py +0 -125
- simind_python_connector-2.0.0/simind_python_connector/data/bone.atn +0 -187
- simind_python_connector-2.0.0/simind_python_connector/data/h2o.atn +0 -92
- simind_python_connector-2.0.0/simind_python_connector/utils/__init__.py +0 -120
- simind_python_connector-2.0.0/simind_python_connector/utils/backend_access.py +0 -121
- simind_python_connector-2.0.0/simind_python_connector/utils/import_helpers.py +0 -78
- simind_python_connector-2.0.0/simind_python_connector/utils/interfile_numpy.py +0 -205
- simind_python_connector-2.0.0/simind_python_connector/utils/interfile_parser.py +0 -177
- simind_python_connector-2.0.0/simind_python_connector/utils/io_utils.py +0 -14
- simind_python_connector-2.0.0/simind_python_connector/utils/sirf_stir_utils.py +0 -194
- simind_python_connector-2.0.0/simind_python_connector/utils/stir_utils.py +0 -490
- simind_python_connector-2.0.0/simind_python_connector.egg-info/PKG-INFO +0 -283
- simind_python_connector-2.0.0/simind_python_connector.egg-info/SOURCES.txt +0 -126
- simind_python_connector-2.0.0/simind_python_connector.egg-info/dependency_links.txt +0 -1
- simind_python_connector-2.0.0/simind_python_connector.egg-info/requires.txt +0 -19
- simind_python_connector-2.0.0/simind_python_connector.egg-info/top_level.txt +0 -1
- simind_python_connector-2.0.0/tests/conftest.py +0 -128
- simind_python_connector-2.0.0/tests/test_acquisition_builder_unit.py +0 -227
- simind_python_connector-2.0.0/tests/test_arithmetic_operations.py +0 -106
- simind_python_connector-2.0.0/tests/test_attenuation_utils.py +0 -116
- simind_python_connector-2.0.0/tests/test_backends.py +0 -367
- simind_python_connector-2.0.0/tests/test_connector_backend_separation.py +0 -118
- simind_python_connector-2.0.0/tests/test_connectors_base.py +0 -27
- simind_python_connector-2.0.0/tests/test_container_scripts.py +0 -290
- simind_python_connector-2.0.0/tests/test_example_config_profile.py +0 -40
- simind_python_connector-2.0.0/tests/test_examples_backend_separation.py +0 -74
- simind_python_connector-2.0.0/tests/test_executor.py +0 -217
- simind_python_connector-2.0.0/tests/test_geometry_isolation_forward_projection.py +0 -352
- simind_python_connector-2.0.0/tests/test_image_builder_unit.py +0 -113
- simind_python_connector-2.0.0/tests/test_interfile_numpy.py +0 -295
- simind_python_connector-2.0.0/tests/test_interfile_parser.py +0 -41
- simind_python_connector-2.0.0/tests/test_legacy_surface_policy.py +0 -20
- simind_python_connector-2.0.0/tests/test_marker_policy.py +0 -117
- simind_python_connector-2.0.0/tests/test_native_adaptors.py +0 -485
- simind_python_connector-2.0.0/tests/test_osem_geometry_diagnostics.py +0 -363
- simind_python_connector-2.0.0/tests/test_package_identity.py +0 -18
- simind_python_connector-2.0.0/tests/test_packaging_resources.py +0 -113
- simind_python_connector-2.0.0/tests/test_python_connector.py +0 -615
- simind_python_connector-2.0.0/tests/test_pytomography_adaptor.py +0 -275
- simind_python_connector-2.0.0/tests/test_simulation_config.py +0 -208
- simind_python_connector-2.0.0/tests/test_sirf_stir_utils.py +0 -56
- simind_python_connector-2.0.0/tests/test_stir_utils_backend_choice_unit.py +0 -78
- simind_python_connector-2.0.0/tests/test_utils.py +0 -134
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/LICENSE +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/setup.cfg +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/builders/__init__.py +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/configs/AnyScan.yaml +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/configs/Discovery670.yaml +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/configs/Example.yaml +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/configs/MLD001_SCAN0.yaml +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/configs/input.smc +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/connectors/base.py +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/core/__init__.py +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/simind_python_connector/data/Schneider2000.json +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/tests/__init__.py +0 -0
- {simind_python_connector-2.0.0 → simind_python_connector-2.0.2}/tests/test_integration.py +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: Container tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
schedule:
|
|
6
|
+
- cron: "0 3 * * 1"
|
|
7
|
+
pull_request:
|
|
8
|
+
paths:
|
|
9
|
+
- "simind_python_connector/recon/**"
|
|
10
|
+
- "simind_python_connector/connectors/**"
|
|
11
|
+
- "simind_python_connector/builders/**"
|
|
12
|
+
- "simind_python_connector/utils/interfile.py"
|
|
13
|
+
- "docker/**"
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
sirf:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
- uses: docker/setup-buildx-action@v3
|
|
21
|
+
- uses: docker/build-push-action@v6
|
|
22
|
+
with:
|
|
23
|
+
context: .
|
|
24
|
+
file: docker/sirf/Dockerfile
|
|
25
|
+
tags: simind-python-connector/sirf:ci
|
|
26
|
+
load: true
|
|
27
|
+
cache-from: type=gha,scope=sirf
|
|
28
|
+
cache-to: type=gha,mode=max,scope=sirf
|
|
29
|
+
- name: SIRF and CIL tests
|
|
30
|
+
run: >
|
|
31
|
+
docker run --rm -e CI=true -v "$PWD:/workspace" -w /workspace
|
|
32
|
+
simind-python-connector/sirf:ci
|
|
33
|
+
python -m pytest -q -m "(requires_sirf or requires_cil) and not requires_simind"
|
|
34
|
+
|
|
35
|
+
stir:
|
|
36
|
+
runs-on: ubuntu-latest
|
|
37
|
+
steps:
|
|
38
|
+
- uses: actions/checkout@v4
|
|
39
|
+
- uses: docker/setup-buildx-action@v3
|
|
40
|
+
- uses: docker/build-push-action@v6
|
|
41
|
+
with:
|
|
42
|
+
context: .
|
|
43
|
+
file: docker/stir/Dockerfile
|
|
44
|
+
tags: simind-python-connector/stir:ci
|
|
45
|
+
load: true
|
|
46
|
+
cache-from: type=gha,scope=stir
|
|
47
|
+
cache-to: type=gha,mode=max,scope=stir
|
|
48
|
+
- name: STIR tests
|
|
49
|
+
run: >
|
|
50
|
+
docker run --rm -e CI=true -v "$PWD:/workspace" -w /workspace
|
|
51
|
+
simind-python-connector/stir:ci
|
|
52
|
+
python -m pytest -q -m "requires_stir and not requires_simind"
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
name: Documentation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main, develop, "release/**" ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main, develop, "release/**" ]
|
|
8
|
+
workflow_call:
|
|
9
|
+
inputs:
|
|
10
|
+
ref:
|
|
11
|
+
description: Ref (for example a release tag) to check out and document
|
|
12
|
+
required: false
|
|
13
|
+
type: string
|
|
14
|
+
default: ""
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
docs:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
with:
|
|
22
|
+
ref: ${{ inputs.ref || github.ref }}
|
|
23
|
+
- name: Set up Python
|
|
24
|
+
uses: actions/setup-python@v5
|
|
25
|
+
with:
|
|
26
|
+
python-version: "3.10"
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: |
|
|
29
|
+
python -m pip install --upgrade pip
|
|
30
|
+
pip install -e ".[dev]"
|
|
31
|
+
- name: Check the tag matches the documented version
|
|
32
|
+
run: |
|
|
33
|
+
# Python 3.10 (matched to Read the Docs) predates the TOML parser in
|
|
34
|
+
# the standard library, so read [project] version with pathlib/re.
|
|
35
|
+
version=$(python -c 'import pathlib, re; text = pathlib.Path("pyproject.toml").read_text(encoding="utf-8"); project = re.search(r"(?ms)^\[project\].*?(?=^\[|\Z)", text).group(0); print(re.search(r"(?m)^version\s*=\s*\"([^\"]+)\"", project).group(1))')
|
|
36
|
+
if [[ "$GITHUB_REF_NAME" == v* ]] && [ "$GITHUB_REF_NAME" != "v${version}" ]; then
|
|
37
|
+
echo "Tag $GITHUB_REF_NAME does not match version v${version}"
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
- name: Build the documentation
|
|
41
|
+
run: |
|
|
42
|
+
python -m sphinx -b html -W --keep-going docs docs/_build/html
|
|
43
|
+
- name: Check authored documentation inventory and figures
|
|
44
|
+
run: python scripts/check_docs.py --html-dir docs/_build/html
|
|
45
|
+
- name: Upload the built documentation
|
|
46
|
+
uses: actions/upload-artifact@v4
|
|
47
|
+
with:
|
|
48
|
+
name: documentation
|
|
49
|
+
path: docs/_build/html
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
tests:
|
|
9
|
+
uses: ./.github/workflows/tests.yml
|
|
10
|
+
with:
|
|
11
|
+
ref: ${{ github.event.release.tag_name }}
|
|
12
|
+
|
|
13
|
+
docs:
|
|
14
|
+
uses: ./.github/workflows/docs.yml
|
|
15
|
+
with:
|
|
16
|
+
ref: ${{ github.event.release.tag_name }}
|
|
17
|
+
|
|
18
|
+
publish:
|
|
19
|
+
needs: [tests, docs]
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
permissions:
|
|
22
|
+
id-token: write
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
with:
|
|
26
|
+
ref: ${{ github.event.release.tag_name }}
|
|
27
|
+
- name: Set up Python
|
|
28
|
+
uses: actions/setup-python@v5
|
|
29
|
+
with:
|
|
30
|
+
python-version: "3.12"
|
|
31
|
+
- name: Check the tag matches the package version
|
|
32
|
+
run: |
|
|
33
|
+
version=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])")
|
|
34
|
+
if [ "$GITHUB_REF_NAME" != "v${version}" ]; then
|
|
35
|
+
echo "Tag $GITHUB_REF_NAME does not match version v${version}"
|
|
36
|
+
exit 1
|
|
37
|
+
fi
|
|
38
|
+
- name: Install build dependencies
|
|
39
|
+
run: |
|
|
40
|
+
python -m pip install --upgrade pip
|
|
41
|
+
pip install build twine
|
|
42
|
+
- name: Build package
|
|
43
|
+
run: python -m build
|
|
44
|
+
- name: Check package
|
|
45
|
+
run: twine check dist/*
|
|
46
|
+
- name: Publish to PyPI
|
|
47
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main, develop, "release/**" ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main, develop, "release/**" ]
|
|
8
|
+
workflow_call:
|
|
9
|
+
inputs:
|
|
10
|
+
ref:
|
|
11
|
+
description: Ref (for example a release tag) to check out and test
|
|
12
|
+
required: false
|
|
13
|
+
type: string
|
|
14
|
+
default: ""
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
test:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
strategy:
|
|
20
|
+
matrix:
|
|
21
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
with:
|
|
25
|
+
ref: ${{ inputs.ref || github.ref }}
|
|
26
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
27
|
+
uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: ${{ matrix.python-version }}
|
|
30
|
+
- name: Install dependencies
|
|
31
|
+
run: |
|
|
32
|
+
python -m pip install --upgrade pip
|
|
33
|
+
pip install -e ".[dev]"
|
|
34
|
+
- name: Lint and format check with ruff
|
|
35
|
+
run: |
|
|
36
|
+
ruff check .
|
|
37
|
+
ruff format --check .
|
|
38
|
+
- name: Check authored documentation inventory
|
|
39
|
+
run: python scripts/check_docs.py
|
|
40
|
+
- name: Run CI-friendly tests
|
|
41
|
+
run: |
|
|
42
|
+
python -m pytest -m "not integration and not requires_sirf and not requires_stir and not requires_simind and not requires_pytomography and not requires_cil and not ci_skip and not validation" --cov=simind_python_connector --cov-report=xml
|
|
43
|
+
- name: Upload coverage to Codecov
|
|
44
|
+
uses: codecov/codecov-action@v4
|
|
45
|
+
with:
|
|
46
|
+
file: ./coverage.xml
|
|
47
|
+
flags: unittests
|
|
48
|
+
name: codecov-umbrella
|
|
49
|
+
fail_ci_if_error: false
|
|
50
|
+
|
|
51
|
+
build:
|
|
52
|
+
runs-on: ubuntu-latest
|
|
53
|
+
steps:
|
|
54
|
+
- uses: actions/checkout@v4
|
|
55
|
+
with:
|
|
56
|
+
ref: ${{ inputs.ref || github.ref }}
|
|
57
|
+
- name: Set up Python
|
|
58
|
+
uses: actions/setup-python@v5
|
|
59
|
+
with:
|
|
60
|
+
python-version: "3.10"
|
|
61
|
+
- name: Install build dependencies
|
|
62
|
+
run: |
|
|
63
|
+
python -m pip install --upgrade pip
|
|
64
|
+
pip install build twine
|
|
65
|
+
- name: Build package
|
|
66
|
+
run: |
|
|
67
|
+
python -m build
|
|
68
|
+
- name: Check package
|
|
69
|
+
run: |
|
|
70
|
+
twine check dist/*
|
|
71
|
+
- name: Smoke-test wheel resources outside the checkout
|
|
72
|
+
run: |
|
|
73
|
+
repo="$GITHUB_WORKSPACE"
|
|
74
|
+
venv="$(mktemp -d)/wheel-env"
|
|
75
|
+
python -m venv "$venv"
|
|
76
|
+
"$venv/bin/python" -m pip install --quiet dist/*.whl
|
|
77
|
+
workdir="$(mktemp -d)"
|
|
78
|
+
cd "$workdir"
|
|
79
|
+
"$venv/bin/python" "$repo/scripts/check_wheel_resources.py" --repo "$repo"
|
|
80
|
+
|
|
81
|
+
container-core:
|
|
82
|
+
runs-on: ubuntu-latest
|
|
83
|
+
steps:
|
|
84
|
+
- uses: actions/checkout@v4
|
|
85
|
+
with:
|
|
86
|
+
ref: ${{ inputs.ref || github.ref }}
|
|
87
|
+
- name: Core container validation
|
|
88
|
+
run: bash scripts/run_container_validation.sh --only-core
|
|
89
|
+
|
|
90
|
+
- name: Core container examples (SIMIND optional)
|
|
91
|
+
run: bash scripts/run_container_examples.sh --only-core
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
|
|
3
|
+
build:
|
|
4
|
+
os: ubuntu-22.04
|
|
5
|
+
tools:
|
|
6
|
+
python: "3.10"
|
|
7
|
+
|
|
8
|
+
sphinx:
|
|
9
|
+
configuration: docs/conf.py
|
|
10
|
+
# Fail the public deployment on any warning (including a duplicate object
|
|
11
|
+
# description) so it matches the docs job in .github/workflows/docs.yml.
|
|
12
|
+
fail_on_warning: true
|
|
13
|
+
|
|
14
|
+
python:
|
|
15
|
+
install:
|
|
16
|
+
- method: pip
|
|
17
|
+
path: .
|
|
18
|
+
extra_requirements:
|
|
19
|
+
- dev
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "simind-python-connector: Python SIMIND Monte Carlo connector with STIR/SIRF/PyTomography adaptors",
|
|
3
|
+
"upload_type": "software",
|
|
4
|
+
"description": "A Python package providing SIMIND Monte Carlo simulation connector with adaptors for STIR/SIRF and PyTomography reconstruction frameworks. Enables Python-driven SIMIND simulations and data processing workflows.",
|
|
5
|
+
"creators": [
|
|
6
|
+
{
|
|
7
|
+
"name": "Porter, Sam",
|
|
8
|
+
"affiliation": "University College London",
|
|
9
|
+
"orcid": "0000-0002-1815-4716"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "Varzakis, Efstathios (Stahis)",
|
|
13
|
+
"affiliation": "University College London",
|
|
14
|
+
"orcid": "0000-0003-3503-7754"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "Thielemans, Kris",
|
|
18
|
+
"affiliation": "University College London",
|
|
19
|
+
"orcid": "0000-0001-6353-9538"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"keywords": [
|
|
23
|
+
"SPECT",
|
|
24
|
+
"Monte Carlo",
|
|
25
|
+
"medical imaging",
|
|
26
|
+
"SIMIND",
|
|
27
|
+
"SIRF",
|
|
28
|
+
"STIR",
|
|
29
|
+
"PyTomography",
|
|
30
|
+
"Python"
|
|
31
|
+
],
|
|
32
|
+
"access_right": "open",
|
|
33
|
+
"license": "apache-2.0",
|
|
34
|
+
"version": "2.0.2"
|
|
35
|
+
}
|