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.
@@ -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")
@@ -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")
@@ -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")
@@ -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
- if 0.0 < central <= 5.0:
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])