ohif-viewer/modes/tmtv
Bill Wallace dbb8b1526e
feat: Add support for labelmap seg images in any supported tsuid (also for compressed bitmap) (#5806)
* feat: Update to use pnpm (#6031) [simulated squash-merge]

* feat: load DICOM SEG images via imageLoader

* feat: load DICOM SEG images via imageLoader

* PR review fixes

* Test fragment of compressed multiframes

* fix: Removed dependencies incorrectly

* Update frame as a targetted change to avoid stripping remaining params

* lock

* Update test to agree with the missing representation branch

* test(contour): contour color change coverage (#6042)

* test(contour): contour interactions delete segment (#6069)

---------

Co-authored-by: Bill Wallace <wayfarer3130@gmail.com>

* chore(version): Update package versions to 3.13.0-beta.98 [skip ci]

* feat(testing): OHIF Test Agent Skills (#5993)

* chore(version): Update package versions to 3.13.0-beta.99 [skip ci]

* test(contour): Add the ContourSegmentToggleLock.spec.ts test file to test contour locking (#6072)

* chore(version): Update package versions to 3.13.0-beta.100 [skip ci]

* chore(testing): Flock lock for playwright tests; Pin node version for OHIF; add more workers (#6099)

* update Cypress apt deps for Ubuntu Noble (drop libgconf-2-4, libasound2→libasound2t64)

* chore(version): Update package versions to 3.13.0-beta.101 [skip ci]

* Debug fixes

* perf(seg): pass explicit frame decode concurrency (16) to SEG loader

Pass an explicit concurrency value (SEG_FRAME_DECODE_CONCURRENCY = 16) into
createFromDicomSegImageId rather than relying on the adapter default, so the
SEG frame fetch/decode parallelism is set at the call site and is ready to
become configurable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(behaviours): add behaviours section + multiframe Part 10 prefetch proposal

Start a "Behaviours" docs section for documenting how the system and UI behave
end-to-end (observed behaviours, design proposals, and failure modes), with an
index README and a Docusaurus category.

First entry is the proposal for loading a multiframe SEG as a single Part 10
instance: prefetch the whole instance (gated by loadMultiframeAsPart10RaceTimeMs),
parse it with dcmjs (handling multipart/related vs raw DICOM), and register the
per-frame compressed pixels into the Cornerstone3D core image cache (the single
uniform frame registry) so the per-frame load path is served locally while the
standard decode path is unchanged. Best-effort: falls back to per-frame fetches
on any failure.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Pre-cache the image data using a full part10 file for performance

* Add customizations to specify type of segmentation save

* Add clearcache of the cacheData

* Bump @cornerstonejs/* pins 5.1.3 -> 5.4.10 to match libs/@cornerstonejs base

libs/@cornerstonejs (fix/use-imageLoader-for-seg) is based on the released
cs3d 5.4.10 (merge-base with origin/main is the 5.4.10 version bump), so pin
OHIF to that release. The local branch changes still reach the app via the
cs3d:link symlinks; these pins keep the lockfile/npm fallback aligned.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Fix seg OOM

* fix: file meta garbage element, bogus NumberOfFrames, unguarded source-map-loader

- dicomWriter: drop the naturalized meta.TransferSyntaxUID assignment that
  dcmjs wrote as a garbage (0000,0000) element into every saved file's meta
  group (download / clipboard / local wadouri blob / local store); keep the
  hex 00020010 assignment, which is required for string-form _meta fallbacks.
- registerNaturalizedDatasetForLocalWadouri: keep the computed frame count
  local so single-frame IODs (SR, RTSTRUCT) no longer gain a bogus
  NumberOfFrames element in their serialized form.
- rsbuild.config: resolve source-map-loader opportunistically (it is not a
  project dependency; the rule only serves the gitignored cs3d-link
  workflow) so fresh clones no longer crash at config load.
- Regression tests for both writer fixes (mutation-checked).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* PR review comment fixes

* Update versions

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: diattamo <mmddiatta@gmail.com>
Co-authored-by: ohif-bot <danny.ri.brown+ohif-bot@gmail.com>
Co-authored-by: Joe Boccanfuso <109477394+jbocce@users.noreply.github.com>
2026-07-09 20:54:23 -04:00
..
.webpack feat: Update to use pnpm (#6031) 2026-06-12 16:04:56 -04:00
assets feat: cornerstone3D stack and volume viewports (#2787) 2022-07-27 12:39:04 -04:00
src Revert "feat: Add extensibility for tmtv and segmentation modes" 2026-07-08 14:11:24 -04:00
babel.config.js feat: cornerstone3D stack and volume viewports (#2787) 2022-07-27 12:39:04 -04:00
CHANGELOG.md chore(version): Update package versions to 3.13.0-beta.89 [skip ci] 2026-06-10 00:29:36 +00:00
LICENSE feat: cornerstone3D stack and volume viewports (#2787) 2022-07-27 12:39:04 -04:00
package.json feat: Add support for labelmap seg images in any supported tsuid (also for compressed bitmap) (#5806) 2026-07-09 20:54:23 -04:00
README.md feat: new Total Metabolic Tumor Volume tmtv (#2866) 2022-08-17 15:13:59 -04:00

Total Metabolic Tumor Volume

Introduction

Total Metabolic Tumor Volume (TMTV) workflow mode enables quantitatively measurement of a tumor volume in a patient's body. This mode is accessible in any study that has a PT and CT image series as you can see below

modeValid

Note: If the study does not have a PT and CT image series, the TMTV workflow mode will not be available and will become grayed out.

Layout

The designed layout for the viewports follows a predefined hanging protocol which will place 10 viewports containing CT, PT, Fusion and Maximum Intensity Projection (MIP) PT scenes.

The hanging protocol will match the CT and PT displaySets based on series description. In terms of PT displaySets, the hanging protocol will match the PT displaySet that has attenuated corrected PET image data.

As seen in the image below, the first row contains CT volume in 3 different views of Axial, Sagittal and Coronal. The second row contains PT volume in the same views as the first row. The last row contains the fusion volume and the viewport to the right is a MIP of the PT Volume in the Sagittal view.

modeLayout

Synchronization

The viewports in the 3 rows are synchronized both for the Camera and WindowLevel. It means that when you interact with the CT viewport (pan, zoom, scroll), the PT and Fusion viewports will be synchronized to the same view. In addition to camera synchronization, the window level of the CT viewport will be synchronized with the fusion viewport.

MIP

The tools that are activated on each viewport is unique to its data. For instance, the mouse scroll tool for PT, CT and Fusion viewports are scrolling through the image data (in different directions); however, the mouse scroll tool for the MIP viewport will rotate the camera to match the usecase for the MIP.

Panels

There are two panels that are available in the TMTV workflow mode and we will discuss them in detail below.

SUV Panel

This panel shows the PT metadata derived from the matched PT displaySet. The user can edit/change the metadata if needed, and by reloading the data the new metadata will be applied to the PT volume.

ROI Threshold Panel

The ROI Threshold panel is a panel that allows the user to use the RectangleROIStartEnd tool from Cornerstone to define and edit a region of interest. Then, the user can apply a threshold to the pixels in the ROI and save the result as a segmentation volume.

By applying each threshold to the ROI, the Total Metabolic Tumor Volume (TMTV), and the SUV Peak values will get calculated for the labelmap segments and shown in the panel.

Export Report

Finally, the results can be saved in the CSV format. The RectangleROI annotations can also be extracted as a dicom RT Structure Set and saved as a DICOM file.

Video Tutorial

Below you can see a video tutorial on how to use the TMTV workflow mode.

https://user-images.githubusercontent.com/7490180/171065443-35369fba-e955-48ac-94da-d262e0fccb6b.mp4