-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Description
When loading a DWI (Diffusion-Weighted Imaging) series with multiple b-values, the viewer
only displays instances from the first b-value group (first timepoint). The remaining
instances are silently discarded.
Concrete example: A DWI series with 84 instances across 3 b-values (28 per b-value)
only shows 28 instances (b=0). The 56 instances with higher b-values are completely hidden
from the user with no warning or indication.
This is clinically significant — high b-value images are essential for diagnostic evaluation
(e.g., detecting restricted diffusion in stroke, tumor assessment).
Root Cause
The issue is in getSopClassHandlerModule.js → getDisplaySetInfo():
getDynamicVolumeInfo()calls Cornerstone'ssplitImageIdsBy4DTags- When a splitting tag (e.g.,
SiemensPrivateBValue) is found, it returnsisDynamicVolume: true - OHIF then only uses
timePoints[0]instances for the display set - All other timepoints are discarded
Cornerstone: getDynamicVolumeInfo()
→ Found SiemensPrivateBValue tag
→ 3 different b-values detected
→ isDynamicVolume: true
→ timePoints: [[28 images], [28 images], [28 images]]
OHIF: getDisplaySetInfo()
→ isDynamicVolume === true
→ Takes only timePoints[0] → 28 instances
→ Result: User sees 28/84 slices
There is no configuration option in getDynamicVolumeInfo or splitImageIdsBy4DTags
to disable this behavior. The functions don't accept any config parameter to opt out of
4D splitting.
Affected Tags
These tags from splitImageIdsBy4DTags trigger the grouping:
DiffusionBValue,PhilipsPrivateBValue,SiemensPrivateBValue,GEPrivateBValue(DWI)EchoTime,EchoNumber(Multi-echo MRI)TriggerTime(Cardiac gated)TemporalPositionIdentifier(4D temporal)PetFrameReferenceTime(PET dynamic)
Steps to Reproduce
- Load a DWI series containing multiple b-values (e.g., b0, b500, b1000)
- The series should have a vendor-specific b-value tag (e.g., Siemens, Philips, GE)
- Open the study in the viewer
- Check the instance count — only 1/N of the total instances are shown (where N = number of distinct b-values)
- The same behavior can be verified on the OHIF V3 demo with any multi-b-value DWI dataset
The current behavior
When a DWI series with multiple b-values is loaded, getDynamicVolumeInfo() detects
the series as a 4D dynamic volume based on vendor-specific DICOM tags
(e.g., SiemensPrivateBValue). The getDisplaySetInfo() function in
getSopClassHandlerModule.js then takes only the first timepoint (timePoints[0])
and discards all remaining instances.
For example, a DWI series with 84 total instances (3 b-values × 28 slices each)
only displays 28 slices (the first b-value group). The other 56 instances with
higher b-values are silently dropped — no warning, no UI indicator, no way for
the user to access them.
This behavior is also reproducible on the OHIF V3 demo.
There is no configuration option to disable this 4D splitting. The
splitImageIdsBy4DTags and getDynamicVolumeInfo functions do not accept
any parameter to opt out.
The expected behavior
Option A (Preferred): Add a configuration option (e.g., skipDynamicVolumeGrouping)
to bypass 4D splitting for these series types, displaying all instances as a single stack.
Option B: If dynamic volume grouping is kept, provide a UI mechanism to switch between
timepoints/b-values so users can access ALL instances, not just the first group.
System Information
System:
OS: Windows 11 10.0.26200
CPU: (12) x64 AMD Ryzen 5 7530U with Radeon Graphics
Memory: 12.66 GB / 38.83 GB
Binaries:
Node: 22.18.0 - C:\Program Files\nodejs\node.EXE
Yarn: 1.22.22 - C:\Users\HaticeSaike\AppData\Roaming\npm\yarn.CMD
npm: 10.9.3 - C:\Program Files\nodejs\npm.CMD
Browsers:
Chrome: 145.0.7632.117
Edge: Chromium (140.0.3485.54)
Internet Explorer: 11.0.26100.7309
The series thumbnail (left) shows 84 instances, but the viewport (bottom-right)
only allows scrolling through 28 instances (I: 15/28).
The remaining 56 instances (higher b-values) are silently dropped.
I noticed #4351 was resolved by PR #4575 (showing cine player for dynamic data),
which allows switching between b-values. However, our use case requires viewing
all instances as a single scrollable stack rather than switching between
timepoints — this is the standard clinical workflow for DWI evaluation.
The cine player approach still limits visibility to one b-value group at a time.
A config option like skipDynamicVolumeGrouping would allow deployments to choose
the behavior that best fits their clinical needs.