diff --git a/.vscode/settings.json b/.vscode/settings.json index 7f147e3a1..4b51e8899 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -82,6 +82,7 @@ "Reslices", "roadmap", "ROADMAPS", + "rtstruct", "Segmentations", "semibold", "sitk", diff --git a/extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx b/extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx index e2448cd2d..59bfda9b4 100644 --- a/extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx +++ b/extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx @@ -169,7 +169,7 @@ function OHIFCornerstoneRTViewport(props: withAppTypes) { {...props} displaySets={[referencedDisplaySet, rtDisplaySet]} viewportOptions={{ - viewportType: 'stack', + viewportType: viewportOptions.viewportType, toolGroupId: toolGroupId, orientation: viewportOptions.orientation, viewportId: viewportOptions.viewportId, diff --git a/extensions/default/src/utils/layerConfigurationUtils.ts b/extensions/default/src/utils/layerConfigurationUtils.ts index 917fd80e9..44bad77e9 100644 --- a/extensions/default/src/utils/layerConfigurationUtils.ts +++ b/extensions/default/src/utils/layerConfigurationUtils.ts @@ -67,9 +67,21 @@ export function configureViewportForLayerAddition(params: { // If a viewport type was already set do not reset it. if (!viewport.viewportOptions.viewportType) { - // Do not force volume for SEG and RTSTRUCT if there is only one display set - if (requestedLayerDisplaySet.isOverlayDisplaySet && currentDisplaySetUIDs.length === 1) { - viewport.viewportOptions.viewportType = 'stack'; + // Special handling for overlay display sets + if (requestedLayerDisplaySet.isOverlayDisplaySet) { + // Do not force volume for SEG and RTSTRUCT if it and all the current display sets are for the same display set + const isSameDisplaySet = currentDisplaySetUIDs.every(uid => { + const currentDisplaySet = displaySetService.getDisplaySetByUID(uid); + return currentDisplaySet.isOverlayDisplaySet + ? currentDisplaySet.referencedDisplaySetInstanceUID === + requestedLayerDisplaySet.referencedDisplaySetInstanceUID + : uid === requestedLayerDisplaySet.referencedDisplaySetInstanceUID; + }); + if (isSameDisplaySet) { + viewport.viewportOptions.viewportType = 'stack'; + } else { + viewport.viewportOptions.viewportType = 'volume'; + } } else { viewport.viewportOptions.viewportType = 'volume'; } diff --git a/tests/MPRThenRTOverlayNoHydration.spec.ts b/tests/MPRThenRTOverlayNoHydration.spec.ts new file mode 100644 index 000000000..633789dcf --- /dev/null +++ b/tests/MPRThenRTOverlayNoHydration.spec.ts @@ -0,0 +1,41 @@ +import { test } from 'playwright-test-coverage'; +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.6.1.4.1.5962.99.1.2968617883.1314880426.1493322302363.3.0'; + const mode = 'viewer'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay menu', async ({ + page, +}) => { + await page.getByTestId('side-panel-header-right').click(); + + await page.getByTestId('Layout').click(); + await page.getByTestId('MPR').click(); + + await page.waitForTimeout(5000); + await checkForScreenshot( + page, + page, + screenShotPaths.mprThenRTOverlayNoHydration.mprPreRTOverlayNoHydration + ); + + // Hover over the middle/sagittal viewport so that the data overlay menu is available. + await page.locator('css=div[data-viewportid="mpr-sagittal"]').hover(); + await page.getByTestId('dataOverlayMenu-mpr-sagittal-btn').click(); + await page.getByTestId('AddSegmentationDataOverlay-mpr-sagittal').click(); + await page.getByText('SELECT A SEGMENTATION').click(); + await page.getByTestId('ARIA RadOnc Structure Sets').click(); + + // Hide the overlay menu. + await page.getByTestId('dataOverlayMenu-mpr-sagittal-btn').click(); + + await page.waitForTimeout(5000); + await checkForScreenshot( + page, + page, + screenShotPaths.mprThenRTOverlayNoHydration.mprPostRTOverlayNoHydration + ); +}); diff --git a/tests/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts b/tests/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts new file mode 100644 index 000000000..64af43251 --- /dev/null +++ b/tests/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts @@ -0,0 +1,38 @@ +import { test } from 'playwright-test-coverage'; +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; +import { press } from './utils/keyboardUtils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.2.840.113619.2.290.3.3767434740.226.1600859119.501'; + const mode = 'segmentation'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should overlay an unhydrated RTSTRUCT over a display set that the RTSTRUCT does NOT reference', async ({ + page, +}) => { + await page.getByTestId('dataOverlayMenu-default-btn').click(); + await page.getByTestId('AddSegmentationDataOverlay-default').click(); + await page.getByText('SELECT A SEGMENTATION').click(); + await page.getByTestId('Contours on PET').click(); + + // Hide the overlay menu. + await page.getByTestId('dataOverlayMenu-default-btn').click(); + + await page.waitForTimeout(5000); + await checkForScreenshot( + page, + page, + screenShotPaths.rtDataOverlayForUnreferencedDisplaySetNoHydration.overlayFirstImage + ); + + // Navigate to the middle image of the default viewport. + await press({ page, key: 'ArrowDown', nTimes: 23 }); + + await page.waitForTimeout(5000); + await checkForScreenshot( + page, + page, + screenShotPaths.rtDataOverlayForUnreferencedDisplaySetNoHydration.overlayMiddleImage + ); +}); diff --git a/tests/RTDataOverlayNoHydrationThenMPR.spec.ts b/tests/RTDataOverlayNoHydrationThenMPR.spec.ts new file mode 100644 index 000000000..389a57464 --- /dev/null +++ b/tests/RTDataOverlayNoHydrationThenMPR.spec.ts @@ -0,0 +1,38 @@ +import { test } from 'playwright-test-coverage'; +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.6.1.4.1.5962.99.1.2968617883.1314880426.1493322302363.3.0'; + const mode = 'viewer'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay menu', async ({ + page, +}) => { + await page.getByTestId('side-panel-header-right').click(); + await page.getByTestId('dataOverlayMenu-default-btn').click(); + await page.getByTestId('AddSegmentationDataOverlay-default').click(); + await page.getByText('SELECT A SEGMENTATION').click(); + await page.getByTestId('ARIA RadOnc Structure Sets').click(); + + // Hide the overlay menu. + await page.getByTestId('dataOverlayMenu-default-btn').click(); + + await page.waitForTimeout(5000); + await checkForScreenshot( + page, + page, + screenShotPaths.rtDataOverlayNoHydrationThenMPR.rtDataOverlayNoHydrationPreMPR + ); + + await page.getByTestId('Layout').click(); + await page.getByTestId('MPR').click(); + + await page.waitForTimeout(5000); + await checkForScreenshot( + page, + page, + screenShotPaths.rtDataOverlayNoHydrationThenMPR.rtDataOverlayNoHydrationPostMPR + ); +}); diff --git a/tests/RTHydrationFromMPR.spec.ts b/tests/RTHydrationFromMPR.spec.ts new file mode 100644 index 000000000..fae1ffadf --- /dev/null +++ b/tests/RTHydrationFromMPR.spec.ts @@ -0,0 +1,42 @@ +import { test } from 'playwright-test-coverage'; +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.6.1.4.1.5962.99.1.2968617883.1314880426.1493322302363.3.0'; + const mode = 'viewer'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should hydrate an RTSTRUCT from MPR', async ({ page }) => { + await page.getByTestId('side-panel-header-right').click(); + + await page.getByTestId('Layout').click(); + await page.getByTestId('MPR').click(); + + await page.waitForTimeout(5000); + + await checkForScreenshot(page, page, screenShotPaths.rtHydrationFromMPR.mprBeforeRT); + + await page.getByTestId('study-browser-thumbnail-no-image').dblclick(); + + await page.waitForTimeout(5000); + + await checkForScreenshot(page, page, screenShotPaths.rtHydrationFromMPR.mprAfterRT); + + await page.getByTestId('yes-hydrate-btn').click(); + + await page.waitForTimeout(5000); + + await checkForScreenshot(page, page, screenShotPaths.rtHydrationFromMPR.mprAfterRTHydrated); + + await page.getByTestId('Layout').click(); + await page.getByTestId('Axial Primary').click(); + + await page.waitForTimeout(5000); + + await checkForScreenshot( + page, + page, + screenShotPaths.rtHydrationFromMPR.mprAfterRTHydratedAfterLayoutChange + ); +}); diff --git a/tests/RTHydrationThenMPR.spec.ts b/tests/RTHydrationThenMPR.spec.ts new file mode 100644 index 000000000..440a4d13c --- /dev/null +++ b/tests/RTHydrationThenMPR.spec.ts @@ -0,0 +1,28 @@ +import { test } from 'playwright-test-coverage'; +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.6.1.4.1.5962.99.1.2968617883.1314880426.1493322302363.3.0'; + const mode = 'viewer'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should hydrate an RTSTRUCT and then launch MPR', async ({ page }) => { + await page.getByTestId('side-panel-header-right').click(); + await page.getByTestId('study-browser-thumbnail-no-image').dblclick(); + + await page.getByTestId('yes-hydrate-btn').click(); + + await page.waitForTimeout(5000); + await checkForScreenshot(page, page, screenShotPaths.rtHydrationThenMPR.rtPostHydration); + + await page.getByTestId('Layout').click(); + await page.getByTestId('Axial Primary').click(); + + await page.waitForTimeout(5000); + await checkForScreenshot( + page, + page, + screenShotPaths.rtHydrationThenMPR.rtPostHydrationMPRAxialPrimary + ); +}); diff --git a/tests/RTNoHydrationThenMPR.spec.ts b/tests/RTNoHydrationThenMPR.spec.ts new file mode 100644 index 000000000..71006aead --- /dev/null +++ b/tests/RTNoHydrationThenMPR.spec.ts @@ -0,0 +1,22 @@ +import { test } from 'playwright-test-coverage'; +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.6.1.4.1.5962.99.1.2968617883.1314880426.1493322302363.3.0'; + const mode = 'viewer'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should launch MPR with unhydrated RTSTRUCT', async ({ page }) => { + await page.getByTestId('side-panel-header-right').click(); + await page.getByTestId('study-browser-thumbnail-no-image').dblclick(); + + await page.waitForTimeout(5000); + await checkForScreenshot(page, page, screenShotPaths.rtNoHydrationThenMPR.rtNoHydrationPreMPR); + + await page.getByTestId('Layout').click(); + await page.getByTestId('MPR').click(); + + await page.waitForTimeout(5000); + await checkForScreenshot(page, page, screenShotPaths.rtNoHydrationThenMPR.rtNoHydrationPostMPR); +}); diff --git a/tests/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts b/tests/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts new file mode 100644 index 000000000..ce2b684a9 --- /dev/null +++ b/tests/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts @@ -0,0 +1,38 @@ +import { test } from 'playwright-test-coverage'; +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; +import { press } from './utils/keyboardUtils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.6.1.4.1.14519.5.2.1.1706.8374.643249677828306008300337414785'; + const mode = 'segmentation'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should overlay an unhydrated SEG over a display set that the SEG does NOT reference', async ({ + page, +}) => { + await page.getByTestId('dataOverlayMenu-default-btn').click(); + await page.getByTestId('AddSegmentationDataOverlay-default').click(); + await page.getByText('SELECT A SEGMENTATION').click(); + await page.getByTestId('Segmentation').click(); + + // Hide the overlay menu. + await page.getByTestId('dataOverlayMenu-default-btn').click(); + + await page.waitForTimeout(5000); + await checkForScreenshot( + page, + page, + screenShotPaths.segDataOverlayForUnreferencedDisplaySetNoHydration.overlayFirstImage + ); + + // Navigate to the middle image of the default viewport. + await press({ page, key: 'ArrowDown', nTimes: 9 }); + + await page.waitForTimeout(5000); + await checkForScreenshot( + page, + page, + screenShotPaths.segDataOverlayForUnreferencedDisplaySetNoHydration.overlayMiddleImage + ); +}); diff --git a/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPostRTOverlayNoHydration.png b/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPostRTOverlayNoHydration.png new file mode 100644 index 000000000..181839d0a Binary files /dev/null and b/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPostRTOverlayNoHydration.png differ diff --git a/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPreRTOverlayNoHydration.png b/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPreRTOverlayNoHydration.png new file mode 100644 index 000000000..ce94c3bbb Binary files /dev/null and b/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPreRTOverlayNoHydration.png differ diff --git a/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png b/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png new file mode 100644 index 000000000..231df8c8d Binary files /dev/null and b/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png differ diff --git a/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png b/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png new file mode 100644 index 000000000..30654c0e4 Binary files /dev/null and b/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png differ diff --git a/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPostMpr.png b/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPostMpr.png new file mode 100644 index 000000000..d507a1bef Binary files /dev/null and b/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPostMpr.png differ diff --git a/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPreMpr.png b/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPreMpr.png new file mode 100644 index 000000000..1005f2a65 Binary files /dev/null and b/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPreMpr.png differ diff --git a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRT.png b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRT.png new file mode 100644 index 000000000..b85a4d88d Binary files /dev/null and b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRT.png differ diff --git a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydrated.png b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydrated.png new file mode 100644 index 000000000..c3422d0a1 Binary files /dev/null and b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydrated.png differ diff --git a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydratedAfterLayoutChange.png b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydratedAfterLayoutChange.png new file mode 100644 index 000000000..b6db95ff0 Binary files /dev/null and b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydratedAfterLayoutChange.png differ diff --git a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprBeforeRT.png b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprBeforeRT.png new file mode 100644 index 000000000..ce94c3bbb Binary files /dev/null and b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprBeforeRT.png differ diff --git a/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydration.png b/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydration.png new file mode 100644 index 000000000..76d0e0004 Binary files /dev/null and b/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydration.png differ diff --git a/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydrationMPRAxialPrimary.png b/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydrationMPRAxialPrimary.png new file mode 100644 index 000000000..0ddc408a4 Binary files /dev/null and b/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydrationMPRAxialPrimary.png differ diff --git a/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPostMpr.png b/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPostMpr.png new file mode 100644 index 000000000..a9f5f903a Binary files /dev/null and b/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPostMpr.png differ diff --git a/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPreMpr.png b/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPreMpr.png new file mode 100644 index 000000000..e83f34b53 Binary files /dev/null and b/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPreMpr.png differ diff --git a/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png b/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png new file mode 100644 index 000000000..ea0e0a45f Binary files /dev/null and b/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png differ diff --git a/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png b/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png new file mode 100644 index 000000000..cfcef4517 Binary files /dev/null and b/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png differ diff --git a/tests/utils/keyboardUtils.ts b/tests/utils/keyboardUtils.ts new file mode 100644 index 000000000..d7f92882c --- /dev/null +++ b/tests/utils/keyboardUtils.ts @@ -0,0 +1,26 @@ +import { Page } from '@playwright/test'; + +/** + * PressParams defines the parameters for the press function. + * @property {Page} page - The Playwright page on which to perform the key press. + * @property {string} key - The key to be pressed. + * @property {number} [nTimes=1] - The number of times to press the key (default is 1). + * @property {unknown} [options={}] - Additional options for the key press. + */ +type PressParams = { + page: Page; + key: string; + nTimes?: number; + options?: unknown; +}; + +/** + * Convenience function to press a key multiple times on a Playwright page. + */ +export const press = async (params: PressParams) => { + const { page, key, nTimes = 1, options = {} } = params; + + for (let i = 0; i < nTimes; i += 1) { + await page.keyboard.press(key, options); + } +}; diff --git a/tests/utils/screenShotPaths.ts b/tests/utils/screenShotPaths.ts index 59e3ef60b..591836876 100644 --- a/tests/utils/screenShotPaths.ts +++ b/tests/utils/screenShotPaths.ts @@ -69,6 +69,28 @@ const screenShotPaths = { reset: { resetDisplayedCorrectly: 'resetDisplayedCorrectly.png', }, + rtDataOverlayForUnreferencedDisplaySetNoHydration: { + overlayFirstImage: 'overlayFirstImage.png', + overlayMiddleImage: 'overlayMiddleImage.png', + }, + rtDataOverlayNoHydrationThenMPR: { + rtDataOverlayNoHydrationPreMPR: 'rtDataOverlayNoHydrationPreMpr.png', + rtDataOverlayNoHydrationPostMPR: 'rtDataOverlayNoHydrationPostMpr.png', + }, + rtHydrationFromMPR: { + mprBeforeRT: 'mprBeforeRT.png', + mprAfterRT: 'mprAfterRT.png', + mprAfterRTHydrated: 'mprAfterRTHydrated.png', + mprAfterRTHydratedAfterLayoutChange: 'mprAfterRTHydratedAfterLayoutChange.png', + }, + rtHydrationThenMPR: { + rtPostHydration: 'rtPostHydration.png', + rtPostHydrationMPRAxialPrimary: 'rtPostHydrationMPRAxialPrimary.png', + }, + rtNoHydrationThenMPR: { + rtNoHydrationPreMPR: 'rtNoHydrationPreMpr.png', + rtNoHydrationPostMPR: 'rtNoHydrationPostMpr.png', + }, srHydration: { srPostHydration: 'srPostHydration.png', srPreHydration: 'srPreHydration.png', @@ -93,10 +115,18 @@ const screenShotPaths = { segNoHydrationPreMPR: 'segNoHydrationPreMpr.png', segNoHydrationPostMPR: 'segNoHydrationPostMpr.png', }, + segDataOverlayForUnreferencedDisplaySetNoHydration: { + overlayFirstImage: 'overlayFirstImage.png', + overlayMiddleImage: 'overlayMiddleImage.png', + }, segDataOverlayNoHydrationThenMPR: { segDataOverlayNoHydrationPreMPR: 'segDataOverlayNoHydrationPreMpr.png', segDataOverlayNoHydrationPostMPR: 'segDataOverlayNoHydrationPostMpr.png', }, + mprThenRTOverlayNoHydration: { + mprPreRTOverlayNoHydration: 'mprPreRTOverlayNoHydration.png', + mprPostRTOverlayNoHydration: 'mprPostRTOverlayNoHydration.png', + }, mprThenSEGOverlayNoHydration: { mprPreSEGOverlayNoHydration: 'mprPreSEGOverlayNoHydration.png', mprPostSEGOverlayNoHydration: 'mprPostSEGOverlayNoHydration.png',