arrayview 0.27.0__py3-none-any.whl → 0.27.2__py3-none-any.whl
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.
- arrayview/_routes_rendering.py +3 -0
- arrayview/_routes_websocket.py +3 -0
- arrayview/_stdio_server.py +3 -0
- arrayview/_synthetic_mri.py +18 -1
- arrayview/_viewer.html +806 -84
- {arrayview-0.27.0.dist-info → arrayview-0.27.2.dist-info}/METADATA +1 -1
- {arrayview-0.27.0.dist-info → arrayview-0.27.2.dist-info}/RECORD +10 -10
- {arrayview-0.27.0.dist-info → arrayview-0.27.2.dist-info}/WHEEL +0 -0
- {arrayview-0.27.0.dist-info → arrayview-0.27.2.dist-info}/entry_points.txt +0 -0
- {arrayview-0.27.0.dist-info → arrayview-0.27.2.dist-info}/licenses/LICENSE +0 -0
arrayview/_routes_rendering.py
CHANGED
|
@@ -25,6 +25,7 @@ from arrayview._render import (
|
|
|
25
25
|
)
|
|
26
26
|
from arrayview._session import HEAVY_OP_LIMIT_BYTES, SESSIONS
|
|
27
27
|
from arrayview._synthetic_mri import (
|
|
28
|
+
_qmri_adjust_vmin_vmax,
|
|
28
29
|
qmri_display_slice,
|
|
29
30
|
render_qmri_mosaic_rgba,
|
|
30
31
|
synthetic_qmri_slice,
|
|
@@ -256,6 +257,8 @@ def register_rendering_routes(app, *, get_session_or_404) -> None:
|
|
|
256
257
|
vmin_override=vmin_override,
|
|
257
258
|
vmax_override=vmax_override,
|
|
258
259
|
)
|
|
260
|
+
if qmri_role:
|
|
261
|
+
vmin, vmax = _qmri_adjust_vmin_vmax(vmin, vmax, qmri_role)
|
|
259
262
|
render_ms = (time.perf_counter() - render_t0) * 1000.0
|
|
260
263
|
encode_t0 = time.perf_counter()
|
|
261
264
|
img = _pil_image().fromarray(rgba[:, :, :3], mode="RGB")
|
arrayview/_routes_websocket.py
CHANGED
|
@@ -31,6 +31,7 @@ from arrayview._session import (
|
|
|
31
31
|
)
|
|
32
32
|
from arrayview._vectorfield import _compute_vfield_arrows
|
|
33
33
|
from arrayview._synthetic_mri import (
|
|
34
|
+
_qmri_adjust_vmin_vmax,
|
|
34
35
|
qmri_display_slice,
|
|
35
36
|
render_qmri_mosaic_rgba,
|
|
36
37
|
synthetic_qmri_slice,
|
|
@@ -319,6 +320,8 @@ def register_websocket_routes(app) -> None:
|
|
|
319
320
|
vmin_override=vmin_override,
|
|
320
321
|
vmax_override=vmax_override,
|
|
321
322
|
)
|
|
323
|
+
if qmri_role:
|
|
324
|
+
vmin, vmax = _qmri_adjust_vmin_vmax(vmin, vmax, qmri_role)
|
|
322
325
|
|
|
323
326
|
overlay_sid = msg.get("overlay_sid")
|
|
324
327
|
overlay_colors = msg.get("overlay_colors")
|
arrayview/_stdio_server.py
CHANGED
|
@@ -52,6 +52,7 @@ from arrayview._render import (
|
|
|
52
52
|
)
|
|
53
53
|
from arrayview._session import SESSIONS, Session
|
|
54
54
|
from arrayview._synthetic_mri import (
|
|
55
|
+
_qmri_adjust_vmin_vmax,
|
|
55
56
|
qmri_display_slice,
|
|
56
57
|
render_qmri_mosaic_rgba,
|
|
57
58
|
synthetic_qmri_slice,
|
|
@@ -638,6 +639,8 @@ def _build_slice_payload(msg: dict) -> bytes:
|
|
|
638
639
|
session, raw, complex_mode, dr, log_scale,
|
|
639
640
|
vmin_override=vmin_override, vmax_override=vmax_override,
|
|
640
641
|
)
|
|
642
|
+
if qmri_role:
|
|
643
|
+
vmin, vmax = _qmri_adjust_vmin_vmax(vmin, vmax, qmri_role)
|
|
641
644
|
|
|
642
645
|
# Overlay compositing
|
|
643
646
|
overlay_sid = msg.get("overlay_sid")
|
arrayview/_synthetic_mri.py
CHANGED
|
@@ -48,7 +48,8 @@ def normalize_relaxation_ms(data: np.ndarray, role: str | None = None) -> np.nda
|
|
|
48
48
|
if finite.size == 0:
|
|
49
49
|
return arr
|
|
50
50
|
central = float(np.nanmedian(finite))
|
|
51
|
-
|
|
51
|
+
seconds_threshold = 10.0 if role == "t1" else 5.0
|
|
52
|
+
if 0.0 < central <= seconds_threshold:
|
|
52
53
|
return (arr * np.float32(1000.0)).astype(np.float32)
|
|
53
54
|
return arr
|
|
54
55
|
|
|
@@ -145,6 +146,21 @@ def synthetic_window(data: np.ndarray, contrast: str) -> tuple[float, float]:
|
|
|
145
146
|
return vmin, vmax
|
|
146
147
|
|
|
147
148
|
|
|
149
|
+
def _qmri_adjust_vmin_vmax(vmin: float, vmax: float, role: str) -> tuple[float, float]:
|
|
150
|
+
"""Adjust vmin/vmax for display according to qMRI role conventions."""
|
|
151
|
+
if not role:
|
|
152
|
+
return vmin, vmax
|
|
153
|
+
if role in ("t1", "t2"):
|
|
154
|
+
return 0.0, float(int(np.ceil(vmax)))
|
|
155
|
+
if role == "pd":
|
|
156
|
+
return 0.0, vmax
|
|
157
|
+
if role == "b1":
|
|
158
|
+
return round(float(vmin), 2), round(float(vmax), 2)
|
|
159
|
+
if role == "phase":
|
|
160
|
+
return -3.14, 3.14
|
|
161
|
+
return vmin, vmax
|
|
162
|
+
|
|
163
|
+
|
|
148
164
|
def render_qmri_mosaic_rgba(
|
|
149
165
|
session,
|
|
150
166
|
dim_x: int,
|
|
@@ -174,6 +190,7 @@ def render_qmri_mosaic_rgba(
|
|
|
174
190
|
else:
|
|
175
191
|
vmin = float(np.percentile(all_data, 1))
|
|
176
192
|
vmax = float(np.percentile(all_data, 99))
|
|
193
|
+
vmin, vmax = _qmri_adjust_vmin_vmax(vmin, vmax, role)
|
|
177
194
|
grid, _, _ = _build_mosaic_grid(
|
|
178
195
|
all_data, session.shape[dim_z], cols=mosaic_cols
|
|
179
196
|
) if mosaic_cols is not None else _build_mosaic_grid(all_data, session.shape[dim_z])
|