multimodars 0.2.3__tar.gz → 0.3.1__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 (151) hide show
  1. {multimodars-0.2.3 → multimodars-0.3.1}/.github/workflows/CI.yml +47 -17
  2. {multimodars-0.2.3 → multimodars-0.3.1}/.gitignore +13 -1
  3. multimodars-0.3.1/.pre-commit-config.yaml +52 -0
  4. multimodars-0.3.1/CHANGELOG.md +167 -0
  5. {multimodars-0.2.3 → multimodars-0.3.1}/Cargo.lock +139 -27
  6. {multimodars-0.2.3 → multimodars-0.3.1}/Cargo.toml +2 -2
  7. multimodars-0.3.1/PKG-INFO +156 -0
  8. multimodars-0.3.1/README.md +131 -0
  9. multimodars-0.3.1/ROADMAP.MD +92 -0
  10. {multimodars-0.2.3 → multimodars-0.3.1}/multimodars/__init__.py +50 -2
  11. {multimodars-0.2.3 → multimodars-0.3.1}/multimodars/_converters.py +82 -6
  12. multimodars-0.3.1/multimodars/_processing.py +1426 -0
  13. multimodars-0.3.1/multimodars/ccta/__init__.py +466 -0
  14. multimodars-0.3.1/multimodars/ccta/debug_plots.py +207 -0
  15. multimodars-0.3.1/multimodars/ccta/fixing_functions.py +239 -0
  16. multimodars-0.3.1/multimodars/ccta/labeling.py +571 -0
  17. multimodars-0.3.1/multimodars/ccta/manipulating.py +975 -0
  18. {multimodars-0.2.3 → multimodars-0.3.1}/multimodars/multimodars.pyi +184 -169
  19. {multimodars-0.2.3 → multimodars-0.3.1}/pyproject.toml +22 -3
  20. {multimodars-0.2.3 → multimodars-0.3.1}/src/ccta/adjust_mesh/label_coronary.rs +1 -3
  21. {multimodars-0.2.3 → multimodars-0.3.1}/src/ccta/adjust_mesh/scale_coronary.rs +128 -83
  22. {multimodars-0.2.3 → multimodars-0.3.1}/src/ccta/binding/ccta_py.rs +114 -23
  23. {multimodars-0.2.3 → multimodars-0.3.1}/src/ccta/mod.rs +0 -1
  24. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/binding/align.rs +6 -6
  25. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/binding/classes.rs +85 -10
  26. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/binding/entry.rs +186 -195
  27. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/binding/mod.rs +264 -327
  28. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/centerline_align/align_algorithms.rs +4 -4
  29. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/centerline_align/mod.rs +20 -26
  30. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/io/geometry.rs +91 -26
  31. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/io/input.rs +14 -15
  32. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/io/integrity_check.rs +18 -21
  33. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/io/mod.rs +3 -6
  34. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/io/output.rs +1 -1
  35. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/processing/align_between.rs +29 -22
  36. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/processing/align_within.rs +71 -27
  37. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/processing/postprocessing.rs +3 -9
  38. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/processing/preprocessing.rs +65 -27
  39. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/processing/process_utils.rs +2 -4
  40. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/processing/wall.rs +11 -19
  41. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/to_object/interpolation.rs +8 -8
  42. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/to_object/mod.rs +1 -0
  43. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/to_object/texture.rs +1 -1
  44. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/to_object/write_mtl.rs +5 -5
  45. multimodars-0.2.3/src/intravascular/utils/utils.rs → multimodars-0.3.1/src/intravascular/utils/general_utils.rs +4 -4
  46. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/utils/mod.rs +1 -1
  47. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/utils/test_utils.rs +11 -11
  48. {multimodars-0.2.3 → multimodars-0.3.1}/src/lib.rs +5 -2
  49. multimodars-0.3.1/tests/test_ccta.py +657 -0
  50. multimodars-0.2.3/.pre-commit-config.yaml +0 -38
  51. multimodars-0.2.3/CHANGELOG.md +0 -83
  52. multimodars-0.2.3/PKG-INFO +0 -281
  53. multimodars-0.2.3/README.md +0 -249
  54. multimodars-0.2.3/ROADMAP.MD +0 -63
  55. multimodars-0.2.3/docs/Makefile +0 -20
  56. multimodars-0.2.3/docs/_static/.gitkeep +0 -0
  57. multimodars-0.2.3/docs/api/adjust_ccta.rst +0 -9
  58. multimodars-0.2.3/docs/api/centerline.rst +0 -6
  59. multimodars-0.2.3/docs/api/classes/PyCenterline.rst +0 -12
  60. multimodars-0.2.3/docs/api/classes/PyCenterlinePoint.rst +0 -12
  61. multimodars-0.2.3/docs/api/classes/PyContour.rst +0 -12
  62. multimodars-0.2.3/docs/api/classes/PyContourPoint.rst +0 -12
  63. multimodars-0.2.3/docs/api/classes/PyFrame.rst +0 -12
  64. multimodars-0.2.3/docs/api/classes/PyGeometry.rst +0 -12
  65. multimodars-0.2.3/docs/api/classes/PyGeometryPair.rst +0 -12
  66. multimodars-0.2.3/docs/api/classes/PyInputData.rst +0 -12
  67. multimodars-0.2.3/docs/api/classes/PyRecord.rst +0 -11
  68. multimodars-0.2.3/docs/api/classes/index.rst +0 -16
  69. multimodars-0.2.3/docs/api/converters_and_wrappers.rst +0 -9
  70. multimodars-0.2.3/docs/api/core.rst +0 -8
  71. multimodars-0.2.3/docs/api/index.rst +0 -14
  72. multimodars-0.2.3/docs/api/processing.rst +0 -11
  73. multimodars-0.2.3/docs/api/utilities.rst +0 -4
  74. multimodars-0.2.3/docs/build.sh +0 -13
  75. multimodars-0.2.3/docs/changelog.md +0 -2
  76. multimodars-0.2.3/docs/conf.py +0 -73
  77. multimodars-0.2.3/docs/figures/Alignment3p.png +0 -0
  78. multimodars-0.2.3/docs/figures/animation_stress_induced_systolic_deformation.gif +0 -0
  79. multimodars-0.2.3/docs/figures/anomalous_labeling.jpg +0 -0
  80. multimodars-0.2.3/docs/figures/initial_labeling.jpg +0 -0
  81. multimodars-0.2.3/docs/figures/scaling.jpg +0 -0
  82. multimodars-0.2.3/docs/index.rst +0 -69
  83. multimodars-0.2.3/docs/installation.rst +0 -53
  84. multimodars-0.2.3/docs/make.bat +0 -35
  85. multimodars-0.2.3/docs/tutorial_ccta.rst +0 -163
  86. multimodars-0.2.3/docs/tutorial_intravascular.rst +0 -391
  87. multimodars-0.2.3/multimodars/ccta/__init__.py +0 -1
  88. multimodars-0.2.3/multimodars/ccta/adjust_ccta.py +0 -1007
  89. multimodars-0.2.3/src/ccta/io/input.rs +0 -220
  90. multimodars-0.2.3/src/ccta/io/mod.rs +0 -1
  91. {multimodars-0.2.3 → multimodars-0.3.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  92. {multimodars-0.2.3 → multimodars-0.3.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  93. {multimodars-0.2.3 → multimodars-0.3.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  94. {multimodars-0.2.3 → multimodars-0.3.1}/.github/workflows/draft-pdf.yml +0 -0
  95. {multimodars-0.2.3 → multimodars-0.3.1}/.readthedocs.yaml +0 -0
  96. {multimodars-0.2.3 → multimodars-0.3.1}/CONTRIBUTING.md +0 -0
  97. {multimodars-0.2.3 → multimodars-0.3.1}/LICENSE +0 -0
  98. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/idealized_geometry/branch_diastolic_contours.csv +0 -0
  99. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/idealized_geometry/branch_systolic_contours.csv +0 -0
  100. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/idealized_geometry/calcium_diastolic_contours.csv +0 -0
  101. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/idealized_geometry/calcium_systolic_contours.csv +0 -0
  102. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/idealized_geometry/diastolic_contours.csv +0 -0
  103. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/idealized_geometry/diastolic_reference_points.csv +0 -0
  104. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/idealized_geometry/eem_diastolic_contours.csv +0 -0
  105. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/idealized_geometry/eem_systolic_contours.csv +0 -0
  106. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/idealized_geometry/systolic_contours.csv +0 -0
  107. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/idealized_geometry/systolic_reference_points.csv +0 -0
  108. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_full/branch_diastolic_contours.csv +0 -0
  109. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_full/branch_systolic_contours.csv +0 -0
  110. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_full/calcium_diastolic_contours.csv +0 -0
  111. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_full/calcium_systolic_contours.csv +0 -0
  112. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_full/diastolic_contours.csv +0 -0
  113. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_full/diastolic_reference_points.csv +0 -0
  114. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_full/eem_diastolic_contours.csv +0 -0
  115. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_full/eem_systolic_contours.csv +0 -0
  116. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_full/systolic_contours.csv +0 -0
  117. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_full/systolic_reference_points.csv +0 -0
  118. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_rest/combined_sorted_manual.csv +0 -0
  119. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_rest/diastolic_contours.csv +0 -0
  120. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_rest/diastolic_reference_points.csv +0 -0
  121. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_rest/systolic_contours.csv +0 -0
  122. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_rest/systolic_reference_points.csv +0 -0
  123. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_stress/combined_sorted_manual.csv +0 -0
  124. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_stress/diastolic_contours.csv +0 -0
  125. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_stress/diastolic_reference_points.csv +0 -0
  126. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_stress/systolic_contours.csv +0 -0
  127. {multimodars-0.2.3 → multimodars-0.3.1}/data/fixtures/ivus_stress/systolic_reference_points.csv +0 -0
  128. {multimodars-0.2.3 → multimodars-0.3.1}/media/coronary_artery_disease.jpg +0 -0
  129. {multimodars-0.2.3 → multimodars-0.3.1}/media/dynamic_lumen_changes.png +0 -0
  130. {multimodars-0.2.3 → multimodars-0.3.1}/media/multimoda-rs.jpg +0 -0
  131. {multimodars-0.2.3 → multimodars-0.3.1}/multimodars/io/__init__.py +0 -0
  132. {multimodars-0.2.3 → multimodars-0.3.1}/multimodars/io/read_geometrical.py +0 -0
  133. {multimodars-0.2.3 → multimodars-0.3.1}/multimodars/io/write_geometries.py +0 -0
  134. {multimodars-0.2.3 → multimodars-0.3.1}/multimodars/py.typed +0 -0
  135. {multimodars-0.2.3 → multimodars-0.3.1}/paper/REVIEWER1.md +0 -0
  136. {multimodars-0.2.3 → multimodars-0.3.1}/paper/bibliography.bib +0 -0
  137. {multimodars-0.2.3 → multimodars-0.3.1}/paper/figures/Figure1.jpg +0 -0
  138. {multimodars-0.2.3 → multimodars-0.3.1}/paper/figures/Figure2.jpg +0 -0
  139. {multimodars-0.2.3 → multimodars-0.3.1}/paper/figures/Figure3.png +0 -0
  140. {multimodars-0.2.3 → multimodars-0.3.1}/paper/figures/Figure4.jpg +0 -0
  141. {multimodars-0.2.3 → multimodars-0.3.1}/paper/paper.md +0 -0
  142. {multimodars-0.2.3 → multimodars-0.3.1}/src/ccta/adjust_mesh/mod.rs +0 -0
  143. {multimodars-0.2.3 → multimodars-0.3.1}/src/ccta/binding/mod.rs +0 -0
  144. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/centerline_align/preprocessing.rs +0 -0
  145. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/mod.rs +0 -0
  146. {multimodars-0.2.3 → multimodars-0.3.1}/src/intravascular/processing/mod.rs +0 -0
  147. {multimodars-0.2.3 → multimodars-0.3.1}/tests/conftest.py +0 -0
  148. {multimodars-0.2.3 → multimodars-0.3.1}/tests/test_converters.py +0 -0
  149. {multimodars-0.2.3 → multimodars-0.3.1}/tests/test_core.py +0 -0
  150. {multimodars-0.2.3 → multimodars-0.3.1}/tests/test_wrappers.py +0 -0
  151. {multimodars-0.2.3 → multimodars-0.3.1}/tests/tests_todo.md +0 -0
@@ -19,6 +19,31 @@ permissions:
19
19
  contents: read
20
20
 
21
21
  jobs:
22
+ notebook-tests:
23
+ name: Notebook tests
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - uses: actions/checkout@v6
27
+ - uses: actions/setup-python@v6
28
+ with:
29
+ python-version: 3.12.x
30
+ - name: Install Rust
31
+ uses: dtolnay/rust-toolchain@stable
32
+ - name: Install system dependencies
33
+ # pymeshlab loads MeshLab filter plugins as shared libraries at import time via
34
+ # load_default_plugins(). On bare Linux runners this requires libopengl0 to be
35
+ # present; without it the call silently fails (PyMeshLabException is caught in
36
+ # pymeshlab's __init__.py) and MeshSet is left with no filter methods, causing
37
+ # AttributeError on any filter call such as meshing_close_holes().
38
+ run: sudo apt-get install -y libopengl0
39
+ - name: Install dependencies
40
+ run: |
41
+ python -m pip install --upgrade pip
42
+ pip install -e '.[meshlab]'
43
+ pip install --group dev
44
+ - name: Run notebook tests
45
+ run: pytest --nbmake docs/notebooks/
46
+
22
47
  python-compat:
23
48
  name: Python ${{ matrix.python-version }} compatibility
24
49
  runs-on: ubuntu-latest
@@ -27,8 +52,8 @@ jobs:
27
52
  matrix:
28
53
  python-version: ['3.10', '3.11', '3.12', '3.13']
29
54
  steps:
30
- - uses: actions/checkout@v4
31
- - uses: actions/setup-python@v5
55
+ - uses: actions/checkout@v6
56
+ - uses: actions/setup-python@v6
32
57
  with:
33
58
  python-version: ${{ matrix.python-version }}
34
59
  - name: Install Rust
@@ -36,7 +61,8 @@ jobs:
36
61
  - name: Install Python deps
37
62
  run: |
38
63
  python -m pip install --upgrade pip
39
- pip install -e .[test]
64
+ pip install -e .
65
+ pip install --group test
40
66
  - name: Run Python tests
41
67
  run: pytest
42
68
 
@@ -50,16 +76,17 @@ jobs:
50
76
  - runner: ubuntu-latest
51
77
  target: aarch64
52
78
  steps:
53
- - uses: actions/checkout@v4
79
+ - uses: actions/checkout@v6
54
80
 
55
- - uses: actions/setup-python@v5
81
+ - uses: actions/setup-python@v6
56
82
  with:
57
83
  python-version: 3.12.x
58
84
 
59
85
  - name: Install Python deps
60
86
  run: |
61
87
  python -m pip install --upgrade pip
62
- pip install -e .[test,docs,maturin]
88
+ pip install -e .
89
+ pip install --group test
63
90
 
64
91
  - name: run Python tests
65
92
  run: pytest
@@ -102,14 +129,15 @@ jobs:
102
129
  - runner: ubuntu-latest
103
130
  target: armv7
104
131
  steps:
105
- - uses: actions/checkout@v4
106
- - uses: actions/setup-python@v5
132
+ - uses: actions/checkout@v6
133
+ - uses: actions/setup-python@v6
107
134
  with:
108
135
  python-version: 3.12.x
109
136
  - name: Install Python deps
110
137
  run: |
111
138
  python -m pip install --upgrade pip
112
- pip install -e .[test,docs,maturin]
139
+ pip install -e .
140
+ pip install --group test
113
141
  - name: run Python tests
114
142
  run: pytest
115
143
  - name: Format Python code
@@ -139,15 +167,16 @@ jobs:
139
167
  - runner: windows-latest
140
168
  target: x64
141
169
  steps:
142
- - uses: actions/checkout@v4
143
- - uses: actions/setup-python@v5
170
+ - uses: actions/checkout@v6
171
+ - uses: actions/setup-python@v6
144
172
  with:
145
173
  python-version: 3.12.x
146
174
  architecture: ${{ matrix.platform.target }}
147
175
  - name: Install Python deps
148
176
  run: |
149
177
  python -m pip install --upgrade pip
150
- pip install -e .[test,docs,maturin]
178
+ pip install -e .
179
+ pip install --group test
151
180
  - name: run Python tests
152
181
  run: pytest
153
182
  - name: Format Python code
@@ -179,14 +208,15 @@ jobs:
179
208
  target: aarch64
180
209
  arch: arm64
181
210
  steps:
182
- - uses: actions/checkout@v4
183
- - uses: actions/setup-python@v5
211
+ - uses: actions/checkout@v6
212
+ - uses: actions/setup-python@v6
184
213
  with:
185
214
  python-version: 3.12.x
186
215
  - name: Install Python deps
187
216
  run: |
188
217
  python -m pip install --upgrade pip
189
- pip install -e .[test,docs,maturin]
218
+ pip install -e .
219
+ pip install --group test
190
220
  - name: run Python tests
191
221
  run: pytest
192
222
  - name: Format Python code
@@ -210,7 +240,7 @@ jobs:
210
240
  sdist:
211
241
  runs-on: ubuntu-latest
212
242
  steps:
213
- - uses: actions/checkout@v4
243
+ - uses: actions/checkout@v6
214
244
  - name: Build sdist
215
245
  uses: PyO3/maturin-action@v1
216
246
  with:
@@ -226,7 +256,7 @@ jobs:
226
256
  name: Release
227
257
  runs-on: ubuntu-latest
228
258
  if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}
229
- needs: [linux, musllinux, windows, macos, sdist]
259
+ needs: [linux, musllinux, windows, macos, sdist, python-compat]
230
260
  permissions:
231
261
  id-token: write
232
262
  contents: write
@@ -5,7 +5,19 @@
5
5
  /paper/old
6
6
  .VSCodeCounter
7
7
  /test
8
- /examples
8
+ examples/__pycache__/
9
+ examples/logs/
10
+ examples/data/output/
11
+ examples/data/test/
12
+ examples/data/logs/
13
+ # generated/intermediate STL outputs in data root
14
+ examples/data/all.stl
15
+ examples/data/all_wall.stl
16
+ examples/data/fixed_mesh.stl
17
+ examples/data/prefixed_mesh.stl
18
+ examples/data/lca.stl
19
+ examples/data/rca.stl
20
+ examples/data/aorta.stl
9
21
 
10
22
  # Byte-compiled / optimized / DLL files
11
23
  __pycache__/
@@ -0,0 +1,52 @@
1
+ repos:
2
+ - repo: local
3
+ hooks:
4
+ # - id: pytest
5
+ # name: Run pytest
6
+ # entry: pytest
7
+ # language: system
8
+ # types: [python]
9
+ # pass_filenames: false
10
+
11
+ - id: rust-fmt
12
+ name: Rust format
13
+ entry: cargo fmt --all
14
+ language: system
15
+ types: [rust]
16
+ pass_filenames: false
17
+
18
+ - id: rust-clippy
19
+ name: Rust clippy
20
+ entry: cargo clippy --all-targets --all-features -- -D warnings
21
+ language: system
22
+ types: [rust]
23
+ pass_filenames: false
24
+
25
+ # - id: rust-test
26
+ # name: Rust unit tests
27
+ # entry: cargo test --lib # --quiet
28
+ # language: system
29
+ # types: [rust]
30
+ # pass_filenames: false
31
+
32
+ - id: python-black
33
+ name: Black formatting
34
+ entry: black
35
+ language: system
36
+ types: [python]
37
+ require_serial: true
38
+ args: [--quiet, --target-version, py312]
39
+
40
+ - id: python-ruff
41
+ name: Ruff linting
42
+ entry: ruff check
43
+ language: system
44
+ types: [python]
45
+ args: [--fix]
46
+
47
+ - id: python-mypy
48
+ name: Mypy type checking
49
+ entry: mypy multimodars --ignore-missing-imports
50
+ language: system
51
+ types: [python]
52
+ pass_filenames: false
@@ -0,0 +1,167 @@
1
+ # Changelog multimodars
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ This project adheres to [Semantic Versioning](https://semver.org/).
5
+
6
+ ## [0.3.1] - 2026-05-04
7
+
8
+ ### Added
9
+ - Example data and Jupyter notebooks are now included directly in the repository under
10
+ `examples/` — no longer distributed as a release attachment. Both tutorials link to
11
+ the `examples/` directory and cross-reference the rendered notebook pages.
12
+ - CCTA and intravascular Jupyter notebooks (`docs/notebooks/`) are now rendered and served
13
+ in the documentation via `myst-nb`, accessible as `:doc:` references from the tutorials.
14
+ - Detailed explanation of the rolling-sphere and ray-casting labeling algorithms added to
15
+ the CCTA tutorial, including annotated figures.
16
+
17
+ ### Changed
18
+ - README condensed: developer-setup section added, key workflow images included, installation
19
+ and quickstart sections tightened.
20
+ - `plotly` added as a documentation dependency for interactive notebook figures.
21
+ - Improved all print statements in the whole package.
22
+
23
+ ### Fixed
24
+ - CI pipeline now correctly installs optional dependency groups required for the full test
25
+ suite.
26
+ - Notebook tests no longer fail with `AttributeError: MeshSet has no attribute
27
+ 'meshing_close_holes'` on bare Linux runners. pymeshlab silently skips plugin loading when
28
+ `libopengl0` is absent, leaving `MeshSet` with no filter methods; the CI now installs
29
+ `libopengl0` before the notebook test job runs.
30
+
31
+ ### Performance
32
+ - Rust labeling step migrated to `par_iter()` for parallel vertex classification, reducing
33
+ wall time on large meshes.
34
+
35
+ ## [0.3.0] - 2026-04-30
36
+
37
+ ### Added
38
+ - `stitch_ccta_to_intravascular()`: fuses an aligned intravascular `PyGeometry` with a CCTA
39
+ trimesh by triangulating a patch between the open boundary ring of the CCTA mesh and the
40
+ proximal/distal contour of the intravascular geometry. Supports two boundary-ring alignment
41
+ modes (`"nearest_iv"` and `"highest_z"`) for proximal and distal ends independently.
42
+ - `fix_and_remesh_stitched_mesh()`: repairs the stitched surface (non-manifold edges/vertices,
43
+ open holes) and applies isotropic remeshing via `pymeshlab`. Requires the optional
44
+ `multimodars[meshlab]` extra.
45
+ - `manual_hole_fill()`: flat-fills remaining open holes in a trimesh after automatic repair.
46
+ - `remove_labeled_points_from_mesh()`: deletes one or more labeled vertex regions from the mesh, remaps faces, and returns the open boundary ring as `"boundary_points"` for downstream stitching.
47
+ - `keep_labeled_points_from_mesh()`: retains only the vertices of a specified labeled region,
48
+ discarding all others.
49
+ - `sync_results_to_mesh()`: refreshes all coordinate lists in the results dictionary after
50
+ `scale_region_centerline_morphing()` moves vertices, keeping labels consistent with the
51
+ updated mesh.
52
+ - `find_aortic_wall_scaling()`: computes the optimal radial scaling factor for the aortic wall
53
+ region by minimising the distance to the first intravascular frame whose lumen elliptic ratio
54
+ drops below 1.3 (transition from intramural to free-segment lumen).
55
+ - `export_section_stl()`: exports the full mesh or a labeled sub-region (`"all"`, `"aorta"`,
56
+ `"rca"`, `"lca"`) as an STL file.
57
+ - `plot_results_key()`: opens an interactive 3-D trimesh scene visualising selected labeled
58
+ regions with colour coding (yellow = aorta, blue = RCA, green = LCA, red = removed/intramural,
59
+ cyan = proximal, magenta = distal, orange = anomalous).
60
+ - Tests for all new CCTA functions.
61
+ - `mypy` added to pre-commit hooks for static type checking.
62
+
63
+ ### Changed
64
+ - Rust-side CCTA STL reader (`src/ccta/io/input.rs`) removed; mesh I/O is now handled
65
+ entirely via Python `trimesh`, eliminating the `stl_io` dependency.
66
+ - `pymeshlab` and `pyglet` are now optional dependencies; the core package installs without
67
+ them. Install extras with `pip install 'multimodars[meshlab]'`.
68
+ - Debug-plot helpers moved to a dedicated `ccta.debug_plots` module.
69
+ - CCTA Python module refactored into focused sub-modules (`labeling`, `manipulating`,
70
+ `fixing_functions`, `debug_plots`).
71
+ - Parameter order updated in several CCTA API calls for consistency.
72
+ - `diastole` argument removed from functions where it was not used.
73
+ - Labeling of aorta boundary points improved to avoid incorrect assignment at mesh edges.
74
+ - Type stubs updated and extended to cover all new public functions.
75
+ - Clippy lints applied across the Rust codebase (non-breaking).
76
+
77
+ ### Fixed
78
+ - 3-D area and elliptic ratio calculation corrected for non-planar contours.
79
+ - Mesh face normals corrected after stitching to ensure consistent outward orientation.
80
+
81
+ ### Documentation
82
+ - CCTA tutorial completely rewritten to cover the full stitching workflow:
83
+ `remove_labeled_points_from_mesh` → `stitch_ccta_to_intravascular` →
84
+ `fix_and_remesh_stitched_mesh` → Taubin smoothing → `export_section_stl` → re-labeling.
85
+ - Intravascular tutorial reviewed and completed: section numbering corrected (1–7),
86
+ CSV-vs-numpy workflow note added, column descriptions with units added to data tables,
87
+ Sphinx cross-references added throughout, `translate()` tuple-argument bug fixed.
88
+
89
+
90
+ ## [0.2.3] - 2026-03-06
91
+
92
+ ### Added
93
+ - Type stubs for the Rust-implemented interface (via maturin)
94
+ - `PyFrame.get_frame_at_z`: retrieve a frame by its z position
95
+ - `PyFrame.get_frame_at_index`: retrieve a frame by its index
96
+ - `PyFrame.replace_frame`: replace an existing frame with another
97
+
98
+ ### Changed
99
+ - CI pipeline now tests against Python 3.10 through 3.13
100
+ - Updated documentation to reflect the current interface and Python version requirements
101
+ - Added direct download links to example data in the README and documentation
102
+ - Migrated to modern NumPy-style type annotations throughout the Python codebase
103
+ - All imports are now top-level across all Python modules
104
+
105
+ ## [0.2.2] - 2026-03-03
106
+
107
+ ### Changed
108
+ - Uploaded new example data
109
+ - Updated docs to match the new example data
110
+
111
+ ## [0.2.1] - 2026-01-12
112
+
113
+ ### Changed
114
+ - Automatic version update based on Cargo.toml
115
+
116
+ ## [0.2.0] - 2026-01-11
117
+
118
+ ### Added
119
+ - Functionality to read in CCTA .stl files and label them according to centerline object
120
+ - Functionality to label the CCTA geometry additionally by an aligned intravascular aligned geometry.
121
+ - Functionality to better align intravascular geometry to a centerline using additionally the CCTA vertices `align_combined`
122
+ - Functionality to radially scale different regions radially to their corresponding centerline
123
+ - Algorihtm for finding the best radial scaling factor for distal and proximal region compared to the aligned geometry
124
+ - Algorithm for finding the best radial scaling factor for the aorta to minimize the distance between "wall" of `PyGeometry` object and the identified intramural vertices
125
+
126
+ ### Changed
127
+ - Updated documentation to include a tutorial for the new functionality
128
+ - Reduced the amount of testing data to reduce size of the package
129
+ - Removed the examples folder from the repository and coupled to release (.zip file)
130
+
131
+ ## [0.1.2] - 2025-11-21
132
+
133
+ ### Changed
134
+ - intravascular::processing::align_within::fill_holes() now does not panic with gaps > 2
135
+ frames, but instead still fixes the holes and returns a warning to the user to check integrity of the data.
136
+
137
+ ## [0.1.1] - 2025-11-17
138
+
139
+ ### Changed
140
+ - Update documentation to match new functionality
141
+
142
+ ## [0.1.0] - 2025-11-17
143
+
144
+ ### Added
145
+ - Fill-holes functionality: when a geometry has a large gap between frames,
146
+ up to two frames will be inserted to improve continuity.
147
+ - Geometry integrity tests: after aligning frames within a geometry,
148
+ several integrity checks are performed before continuing the pipeline.
149
+ - `InputData`: the entire pipeline can be driven from an `InputData` object
150
+ that includes coordinates for different contours.
151
+ - Enum for contour types: `Lumen`, `EEM`, `sidebranch`, `calcification`,
152
+ `wall`, `catheter`.
153
+ - `PyFrame` struct: each frame can hold multiple contour types which are
154
+ processed in parallel.
155
+
156
+ ### Changed
157
+ - Full architecture refactor:
158
+ - Raw data is read and ordered into a `Geometry` struct.
159
+ - The `Geometry` struct undergoes integrity checks to ensure data quality.
160
+ - Alignment is performed first *within* geometries, then *between* geometries.
161
+ - Modules are loosely coupled to improve maintainability.
162
+ - Parallelization model updated: each geometry is processed in parallel;
163
+ within-geometry alignment runs first, then between-geometry alignment runs in parallel.
164
+ - Multiple bug fixes in the alignment algorithms.
165
+
166
+ ### Fixed
167
+ - Various stability and indexing bugs discovered during alignment testing.
@@ -161,12 +161,6 @@ version = "1.23.1"
161
161
  source = "registry+https://github.com/rust-lang/crates.io-index"
162
162
  checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422"
163
163
 
164
- [[package]]
165
- name = "byteorder"
166
- version = "1.5.0"
167
- source = "registry+https://github.com/rust-lang/crates.io-index"
168
- checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
169
-
170
164
  [[package]]
171
165
  name = "byteorder-lite"
172
166
  version = "0.1.0"
@@ -197,6 +191,19 @@ version = "1.1.0"
197
191
  source = "registry+https://github.com/rust-lang/crates.io-index"
198
192
  checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
199
193
 
194
+ [[package]]
195
+ name = "console"
196
+ version = "0.15.11"
197
+ source = "registry+https://github.com/rust-lang/crates.io-index"
198
+ checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8"
199
+ dependencies = [
200
+ "encode_unicode",
201
+ "libc",
202
+ "once_cell",
203
+ "unicode-width",
204
+ "windows-sys",
205
+ ]
206
+
200
207
  [[package]]
201
208
  name = "core2"
202
209
  version = "0.4.0"
@@ -304,6 +311,12 @@ version = "1.15.0"
304
311
  source = "registry+https://github.com/rust-lang/crates.io-index"
305
312
  checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
306
313
 
314
+ [[package]]
315
+ name = "encode_unicode"
316
+ version = "1.0.0"
317
+ source = "registry+https://github.com/rust-lang/crates.io-index"
318
+ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
319
+
307
320
  [[package]]
308
321
  name = "equator"
309
322
  version = "0.4.2"
@@ -390,15 +403,6 @@ dependencies = [
390
403
  "miniz_oxide",
391
404
  ]
392
405
 
393
- [[package]]
394
- name = "float-cmp"
395
- version = "0.10.0"
396
- source = "registry+https://github.com/rust-lang/crates.io-index"
397
- checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8"
398
- dependencies = [
399
- "num-traits",
400
- ]
401
-
402
406
  [[package]]
403
407
  name = "getrandom"
404
408
  version = "0.3.4"
@@ -590,6 +594,19 @@ dependencies = [
590
594
  "hashbrown",
591
595
  ]
592
596
 
597
+ [[package]]
598
+ name = "indicatif"
599
+ version = "0.17.11"
600
+ source = "registry+https://github.com/rust-lang/crates.io-index"
601
+ checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235"
602
+ dependencies = [
603
+ "console",
604
+ "number_prefix",
605
+ "portable-atomic",
606
+ "unicode-width",
607
+ "web-time",
608
+ ]
609
+
593
610
  [[package]]
594
611
  name = "indoc"
595
612
  version = "2.0.6"
@@ -632,6 +649,16 @@ dependencies = [
632
649
  "libc",
633
650
  ]
634
651
 
652
+ [[package]]
653
+ name = "js-sys"
654
+ version = "0.3.82"
655
+ source = "registry+https://github.com/rust-lang/crates.io-index"
656
+ checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
657
+ dependencies = [
658
+ "once_cell",
659
+ "wasm-bindgen",
660
+ ]
661
+
635
662
  [[package]]
636
663
  name = "lebe"
637
664
  version = "0.5.3"
@@ -726,18 +753,18 @@ dependencies = [
726
753
 
727
754
  [[package]]
728
755
  name = "multimodars"
729
- version = "0.2.3"
756
+ version = "0.3.1"
730
757
  dependencies = [
731
758
  "anyhow",
732
759
  "approx",
733
760
  "crossbeam",
734
761
  "csv",
735
762
  "image",
763
+ "indicatif",
736
764
  "nalgebra",
737
765
  "pyo3",
738
766
  "rayon",
739
767
  "serde",
740
- "stl_io",
741
768
  "toml",
742
769
  ]
743
770
 
@@ -864,6 +891,12 @@ dependencies = [
864
891
  "autocfg",
865
892
  ]
866
893
 
894
+ [[package]]
895
+ name = "number_prefix"
896
+ version = "0.4.0"
897
+ source = "registry+https://github.com/rust-lang/crates.io-index"
898
+ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
899
+
867
900
  [[package]]
868
901
  name = "once_cell"
869
902
  version = "1.21.3"
@@ -1255,16 +1288,6 @@ version = "1.2.1"
1255
1288
  source = "registry+https://github.com/rust-lang/crates.io-index"
1256
1289
  checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
1257
1290
 
1258
- [[package]]
1259
- name = "stl_io"
1260
- version = "0.10.0"
1261
- source = "registry+https://github.com/rust-lang/crates.io-index"
1262
- checksum = "da63e75b86345156b191c021b3ce2a13b973941ecdb8c70d6f00cbbfe0076ed7"
1263
- dependencies = [
1264
- "byteorder",
1265
- "float-cmp",
1266
- ]
1267
-
1268
1291
  [[package]]
1269
1292
  name = "syn"
1270
1293
  version = "2.0.104"
@@ -1367,6 +1390,12 @@ version = "1.0.18"
1367
1390
  source = "registry+https://github.com/rust-lang/crates.io-index"
1368
1391
  checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
1369
1392
 
1393
+ [[package]]
1394
+ name = "unicode-width"
1395
+ version = "0.2.2"
1396
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1397
+ checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
1398
+
1370
1399
  [[package]]
1371
1400
  name = "unindent"
1372
1401
  version = "0.2.4"
@@ -1438,6 +1467,16 @@ dependencies = [
1438
1467
  "unicode-ident",
1439
1468
  ]
1440
1469
 
1470
+ [[package]]
1471
+ name = "web-time"
1472
+ version = "1.1.0"
1473
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1474
+ checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
1475
+ dependencies = [
1476
+ "js-sys",
1477
+ "wasm-bindgen",
1478
+ ]
1479
+
1441
1480
  [[package]]
1442
1481
  name = "weezl"
1443
1482
  version = "0.1.11"
@@ -1454,6 +1493,79 @@ dependencies = [
1454
1493
  "safe_arch",
1455
1494
  ]
1456
1495
 
1496
+ [[package]]
1497
+ name = "windows-sys"
1498
+ version = "0.59.0"
1499
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1500
+ checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
1501
+ dependencies = [
1502
+ "windows-targets",
1503
+ ]
1504
+
1505
+ [[package]]
1506
+ name = "windows-targets"
1507
+ version = "0.52.6"
1508
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1509
+ checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
1510
+ dependencies = [
1511
+ "windows_aarch64_gnullvm",
1512
+ "windows_aarch64_msvc",
1513
+ "windows_i686_gnu",
1514
+ "windows_i686_gnullvm",
1515
+ "windows_i686_msvc",
1516
+ "windows_x86_64_gnu",
1517
+ "windows_x86_64_gnullvm",
1518
+ "windows_x86_64_msvc",
1519
+ ]
1520
+
1521
+ [[package]]
1522
+ name = "windows_aarch64_gnullvm"
1523
+ version = "0.52.6"
1524
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1525
+ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
1526
+
1527
+ [[package]]
1528
+ name = "windows_aarch64_msvc"
1529
+ version = "0.52.6"
1530
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1531
+ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
1532
+
1533
+ [[package]]
1534
+ name = "windows_i686_gnu"
1535
+ version = "0.52.6"
1536
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1537
+ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
1538
+
1539
+ [[package]]
1540
+ name = "windows_i686_gnullvm"
1541
+ version = "0.52.6"
1542
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1543
+ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
1544
+
1545
+ [[package]]
1546
+ name = "windows_i686_msvc"
1547
+ version = "0.52.6"
1548
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1549
+ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
1550
+
1551
+ [[package]]
1552
+ name = "windows_x86_64_gnu"
1553
+ version = "0.52.6"
1554
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1555
+ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
1556
+
1557
+ [[package]]
1558
+ name = "windows_x86_64_gnullvm"
1559
+ version = "0.52.6"
1560
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1561
+ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
1562
+
1563
+ [[package]]
1564
+ name = "windows_x86_64_msvc"
1565
+ version = "0.52.6"
1566
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1567
+ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
1568
+
1457
1569
  [[package]]
1458
1570
  name = "winnow"
1459
1571
  version = "0.7.13"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "multimodars"
3
- version = "0.2.3"
3
+ version = "0.3.1"
4
4
  edition = "2021"
5
5
  license = "MIT"
6
6
  readme = "README.md"
@@ -20,4 +20,4 @@ rayon = "1.7.1"
20
20
  crossbeam = "0.8.4"
21
21
  anyhow = "1.0.100"
22
22
  approx = "0.5"
23
- stl_io = "0.10.0"
23
+ indicatif = "0.17"