* Re IDC #2604: show series (with unsupported modalities) on slides panel and on tag explorer
This commit is contained in:
parent
460fdeb534
commit
65505d9bce
@ -57,9 +57,10 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let metadata;
|
let metadata;
|
||||||
const isImageStack = activeDisplaySet instanceof ImageSet;
|
const isImageStack =
|
||||||
|
activeDisplaySet instanceof ImageSet &&
|
||||||
|
activeDisplaySet.isModalitySupported === true;
|
||||||
|
|
||||||
let selectedInstanceValue;
|
|
||||||
let instanceList;
|
let instanceList;
|
||||||
|
|
||||||
if (isImageStack) {
|
if (isImageStack) {
|
||||||
@ -91,7 +92,7 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
|
|||||||
setInstanceList(instanceList);
|
setInstanceList(instanceList);
|
||||||
setDisplaySetList(newDisplaySetList);
|
setDisplaySetList(newDisplaySetList);
|
||||||
setIsImageStack(isImageStack);
|
setIsImageStack(isImageStack);
|
||||||
}, [activeDisplaySetInstanceUID, activeInstance]);
|
}, [activeDisplaySetInstanceUID, activeInstance, displaySets]);
|
||||||
|
|
||||||
const selectedDisplaySetValue = displaySetList.find(
|
const selectedDisplaySetValue = displaySetList.find(
|
||||||
ds => ds.value === activeDisplaySetInstanceUID
|
ds => ds.value === activeDisplaySetInstanceUID
|
||||||
|
|||||||
@ -1,6 +1,4 @@
|
|||||||
import cornerstone from 'cornerstone-core';
|
import cornerstone from 'cornerstone-core';
|
||||||
import cornerstoneTools from 'cornerstone-tools';
|
|
||||||
|
|
||||||
import getImageId from '../utils/getImageId.js';
|
import getImageId from '../utils/getImageId.js';
|
||||||
|
|
||||||
const noop = () => {};
|
const noop = () => {};
|
||||||
@ -94,7 +92,11 @@ export class StudyPrefetcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.element = element;
|
this.element = element;
|
||||||
|
try {
|
||||||
this.enabledElement = cornerstone.getEnabledElement(element);
|
this.enabledElement = cornerstone.getEnabledElement(element);
|
||||||
|
} catch {
|
||||||
|
throw new Error('Failed to find the enabled element');
|
||||||
|
}
|
||||||
|
|
||||||
this.stopPrefetching();
|
this.stopPrefetching();
|
||||||
this.prefetchDisplaySets(displaySetInstanceUID);
|
this.prefetchDisplaySets(displaySetInstanceUID);
|
||||||
@ -114,7 +116,11 @@ export class StudyPrefetcher {
|
|||||||
* @param {number} timeout
|
* @param {number} timeout
|
||||||
*/
|
*/
|
||||||
prefetchDisplaySetsAsync(element, timeout) {
|
prefetchDisplaySetsAsync(element, timeout) {
|
||||||
|
try {
|
||||||
this.enabledElement = cornerstone.getEnabledElement(element);
|
this.enabledElement = cornerstone.getEnabledElement(element);
|
||||||
|
} catch {
|
||||||
|
throw new Error('Failed to find the enabled element');
|
||||||
|
}
|
||||||
timeout = timeout || this.options.prefetchDisplaySetsTimeout;
|
timeout = timeout || this.options.prefetchDisplaySetsTimeout;
|
||||||
clearTimeout(this.prefetchDisplaySetsHandler);
|
clearTimeout(this.prefetchDisplaySetsHandler);
|
||||||
this.prefetchDisplaySetsHandler = setTimeout(() => {
|
this.prefetchDisplaySetsHandler = setTimeout(() => {
|
||||||
|
|||||||
@ -9,7 +9,10 @@ import { SeriesMetadata } from './SeriesMetadata';
|
|||||||
import { api } from 'dicomweb-client';
|
import { api } from 'dicomweb-client';
|
||||||
// - createStacks
|
// - createStacks
|
||||||
import { isImage } from '../../utils/isImage';
|
import { isImage } from '../../utils/isImage';
|
||||||
import { isDisplaySetReconstructable, isSpacingUniform } from '../../utils/isDisplaySetReconstructable';
|
import {
|
||||||
|
isDisplaySetReconstructable,
|
||||||
|
isSpacingUniform,
|
||||||
|
} from '../../utils/isDisplaySetReconstructable';
|
||||||
import errorHandler from '../../errorHandler';
|
import errorHandler from '../../errorHandler';
|
||||||
import isLowPriorityModality from '../../utils/isLowPriorityModality';
|
import isLowPriorityModality from '../../utils/isLowPriorityModality';
|
||||||
import getXHRRetryRequestHook from '../../utils/xhrRetryRequestHook';
|
import getXHRRetryRequestHook from '../../utils/xhrRetryRequestHook';
|
||||||
@ -159,16 +162,38 @@ class StudyMetadata extends Metadata {
|
|||||||
// series into another display set.
|
// series into another display set.
|
||||||
const stackableInstances = [];
|
const stackableInstances = [];
|
||||||
series.forEachInstance(instance => {
|
series.forEachInstance(instance => {
|
||||||
|
let displaySet;
|
||||||
|
|
||||||
// All imaging modalities must have a valid value for SOPClassUID (x00080016) or Rows (x00280010)
|
// All imaging modalities must have a valid value for SOPClassUID (x00080016) or Rows (x00280010)
|
||||||
if (
|
if (
|
||||||
!isImage(instance.getTagValue('SOPClassUID')) &&
|
!isImage(instance.getTagValue('SOPClassUID')) &&
|
||||||
!instance.getTagValue('Rows')
|
!instance.getTagValue('Rows')
|
||||||
) {
|
) {
|
||||||
return;
|
// we set an empty display and we add a isModalitySupported variable to
|
||||||
}
|
// print a warning that the modality is not supported in the thumbnail.
|
||||||
|
const displaySet = new ImageSet([]);
|
||||||
let displaySet;
|
const seriesData = series.getData();
|
||||||
|
displaySet.setAttributes({
|
||||||
|
displaySetInstanceUID: displaySet.uid,
|
||||||
|
SeriesDate: seriesData.SeriesDate,
|
||||||
|
SeriesTime: seriesData.SeriesTime,
|
||||||
|
SeriesInstanceUID: series.getSeriesInstanceUID(),
|
||||||
|
SeriesNumber: instance.getTagValue('SeriesNumber'),
|
||||||
|
SeriesDescription: instance.getTagValue('SeriesDescription'),
|
||||||
|
numImageFrames: instance.getTagValue('NumberOfFrames'),
|
||||||
|
frameRate: instance.getTagValue('FrameTime'),
|
||||||
|
Modality: instance.getTagValue('Modality'),
|
||||||
|
isMultiFrame: false,
|
||||||
|
StudyInstanceUID: study.getStudyInstanceUID(), // Include the study instance UID
|
||||||
|
InstanceNumber: instance.getTagValue('InstanceNumber'), // Include the instance number
|
||||||
|
AcquisitionDatetime: instance.getTagValue('AcquisitionDateTime'), // Include the acquisition datetime
|
||||||
|
isReconstructable: false,
|
||||||
|
isModalitySupported: false,
|
||||||
|
metadata: instance.getData().metadata,
|
||||||
|
});
|
||||||
|
|
||||||
|
displaySets.push(displaySet);
|
||||||
|
} else {
|
||||||
if (isMultiFrame(instance)) {
|
if (isMultiFrame(instance)) {
|
||||||
displaySet = makeDisplaySet(series, [instance]);
|
displaySet = makeDisplaySet(series, [instance]);
|
||||||
|
|
||||||
@ -195,6 +220,7 @@ class StudyMetadata extends Metadata {
|
|||||||
} else {
|
} else {
|
||||||
stackableInstances.push(instance);
|
stackableInstances.push(instance);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (stackableInstances.length) {
|
if (stackableInstances.length) {
|
||||||
@ -227,7 +253,6 @@ class StudyMetadata extends Metadata {
|
|||||||
displaySets.map(displaySet => this._derivedDisplaySets.push(displaySet));
|
displaySets.map(displaySet => this._derivedDisplaySets.push(displaySet));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the source display set of the derivated display set.
|
* Returns the source display set of the derivated display set.
|
||||||
* @param {object} derivatedDisplaySet
|
* @param {object} derivatedDisplaySet
|
||||||
@ -242,40 +267,45 @@ class StudyMetadata extends Metadata {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const otherDisplaySets = allDisplaySets.filter(
|
const otherDisplaySets = allDisplaySets.filter(
|
||||||
ds => ds.displaySetInstanceUID !== derivatedDisplaySet.displaySetInstanceUID
|
ds =>
|
||||||
|
ds.displaySetInstanceUID !== derivatedDisplaySet.displaySetInstanceUID
|
||||||
);
|
);
|
||||||
|
|
||||||
const { metadata } = derivatedDisplaySet;
|
const { metadata } = derivatedDisplaySet;
|
||||||
|
|
||||||
let referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSourceImageSequence
|
let referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSourceImageSequence(
|
||||||
(metadata, otherDisplaySets);
|
metadata,
|
||||||
|
otherDisplaySets
|
||||||
|
);
|
||||||
|
|
||||||
let noReferencedSeriesAvailable = !referencedSeriesInstanceUIDs ||
|
let noReferencedSeriesAvailable =
|
||||||
|
!referencedSeriesInstanceUIDs ||
|
||||||
referencedSeriesInstanceUIDs.length === 0;
|
referencedSeriesInstanceUIDs.length === 0;
|
||||||
if (noReferencedSeriesAvailable) {
|
if (noReferencedSeriesAvailable) {
|
||||||
referencedSeriesInstanceUIDs =
|
referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence(
|
||||||
_findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence
|
metadata
|
||||||
(metadata);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
noReferencedSeriesAvailable = !referencedSeriesInstanceUIDs ||
|
noReferencedSeriesAvailable =
|
||||||
|
!referencedSeriesInstanceUIDs ||
|
||||||
referencedSeriesInstanceUIDs.length === 0;
|
referencedSeriesInstanceUIDs.length === 0;
|
||||||
if (noReferencedSeriesAvailable) {
|
if (noReferencedSeriesAvailable) {
|
||||||
referencedSeriesInstanceUIDs =
|
referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromReferencedImageSequence(
|
||||||
_findReferencedSeriesInstanceUIDsFromReferencedImageSequence
|
metadata,
|
||||||
(metadata, otherDisplaySets);
|
otherDisplaySets
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const referencedSeriesAvailable = referencedSeriesInstanceUIDs &&
|
const referencedSeriesAvailable =
|
||||||
referencedSeriesInstanceUIDs.length !== 0;
|
referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0;
|
||||||
if (referencedSeriesAvailable) {
|
if (referencedSeriesAvailable) {
|
||||||
const referencedDisplaySet = otherDisplaySets.find(ds =>
|
const referencedDisplaySet = otherDisplaySets.find(ds =>
|
||||||
referencedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID)
|
referencedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID)
|
||||||
);
|
);
|
||||||
;
|
|
||||||
return referencedDisplaySet;
|
return referencedDisplaySet;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of derived datasets in the study, filtered by the given filter.
|
* Returns a list of derived datasets in the study, filtered by the given filter.
|
||||||
@ -303,7 +333,10 @@ class StudyMetadata extends Metadata {
|
|||||||
if (referencedSeriesInstanceUID) {
|
if (referencedSeriesInstanceUID) {
|
||||||
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
|
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
|
||||||
displaySet => {
|
displaySet => {
|
||||||
return StudyMetadata.getReferencedDisplaySet(displaySet, [this]).SeriesInstanceUID === referencedSeriesInstanceUID;
|
return (
|
||||||
|
StudyMetadata.getReferencedDisplaySet(displaySet, [this])
|
||||||
|
.SeriesInstanceUID === referencedSeriesInstanceUID
|
||||||
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -311,8 +344,7 @@ class StudyMetadata extends Metadata {
|
|||||||
if (referencedFrameOfReferenceUID) {
|
if (referencedFrameOfReferenceUID) {
|
||||||
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
|
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
|
||||||
displaySet =>
|
displaySet =>
|
||||||
displaySet.FrameOfReferenceUID ===
|
displaySet.FrameOfReferenceUID === referencedFrameOfReferenceUID
|
||||||
referencedFrameOfReferenceUID
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -497,8 +529,10 @@ class StudyMetadata extends Metadata {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._displaySets.some(ds =>
|
if (
|
||||||
ds.displaySetInstanceUID === displaySet.displaySetInstanceUID)
|
this._displaySets.some(
|
||||||
|
ds => ds.displaySetInstanceUID === displaySet.displaySetInstanceUID
|
||||||
|
)
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -867,8 +901,9 @@ const makeDisplaySet = (series, instances) => {
|
|||||||
imageSet.sortByImagePositionPatient();
|
imageSet.sortByImagePositionPatient();
|
||||||
|
|
||||||
// check if the spacing is uniform and update isReconstructable
|
// check if the spacing is uniform and update isReconstructable
|
||||||
const datasetIs4D = displayReconstructableInfo.reconstructionIssues.find
|
const datasetIs4D = displayReconstructableInfo.reconstructionIssues.find(
|
||||||
(issue => issue === ReconstructionIssues.DATASET_4D);
|
issue => issue === ReconstructionIssues.DATASET_4D
|
||||||
|
);
|
||||||
displaySpacingInfo = isSpacingUniform(imageSet.images, datasetIs4D);
|
displaySpacingInfo = isSpacingUniform(imageSet.images, datasetIs4D);
|
||||||
imageSet.isReconstructable = displaySpacingInfo.isUniform;
|
imageSet.isReconstructable = displaySpacingInfo.isUniform;
|
||||||
|
|
||||||
@ -881,11 +916,15 @@ const makeDisplaySet = (series, instances) => {
|
|||||||
|
|
||||||
if (!imageSet.displayReconstructableInfo) {
|
if (!imageSet.displayReconstructableInfo) {
|
||||||
// It is not reconstrabale Save type of warning
|
// It is not reconstrabale Save type of warning
|
||||||
imageSet.reconstructionIssues = displaySpacingInfo ?
|
imageSet.reconstructionIssues = displaySpacingInfo
|
||||||
displayReconstructableInfo.reconstructionIssues.concat(displaySpacingInfo.reconstructionIssues) :
|
? displayReconstructableInfo.reconstructionIssues.concat(
|
||||||
displayReconstructableInfo.reconstructionIssues;
|
displaySpacingInfo.reconstructionIssues
|
||||||
|
)
|
||||||
|
: displayReconstructableInfo.reconstructionIssues;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
imageSet.isModalitySupported = true;
|
||||||
|
|
||||||
return imageSet;
|
return imageSet;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -968,24 +1007,22 @@ function _getDisplaySetFromSopClassModule(
|
|||||||
* @param {object} derivatedDisplaySet.metadata
|
* @param {object} derivatedDisplaySet.metadata
|
||||||
* @return {array[string]} referenced series instance UIDs.
|
* @return {array[string]} referenced series instance UIDs.
|
||||||
*/
|
*/
|
||||||
function _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence (
|
function _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence(
|
||||||
metadata,
|
metadata
|
||||||
) {
|
) {
|
||||||
if (!metadata.ReferencedSeriesSequence) {
|
if (!metadata.ReferencedSeriesSequence) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let referencedSeriesInstanceUIDs;
|
let referencedSeriesInstanceUIDs;
|
||||||
const ReferencedSeriesSequence = _toArray(
|
const ReferencedSeriesSequence = _toArray(metadata.ReferencedSeriesSequence);
|
||||||
metadata.ReferencedSeriesSequence
|
|
||||||
);
|
|
||||||
|
|
||||||
referencedSeriesInstanceUIDs = ReferencedSeriesSequence.map(
|
referencedSeriesInstanceUIDs = ReferencedSeriesSequence.map(
|
||||||
ReferencedSeries => ReferencedSeries.SeriesInstanceUID
|
ReferencedSeries => ReferencedSeries.SeriesInstanceUID
|
||||||
);
|
);
|
||||||
|
|
||||||
return referencedSeriesInstanceUIDs;
|
return referencedSeriesInstanceUIDs;
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the referenced series instance UIDs by searching the information in the
|
* Returns the referenced series instance UIDs by searching the information in the
|
||||||
@ -994,7 +1031,7 @@ function _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence (
|
|||||||
* @param {array[object]} displaysets
|
* @param {array[object]} displaysets
|
||||||
* @return {array[string]} referenced series instance UIDs.
|
* @return {array[string]} referenced series instance UIDs.
|
||||||
*/
|
*/
|
||||||
function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence (
|
function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence(
|
||||||
metadata,
|
metadata,
|
||||||
displaySets
|
displaySets
|
||||||
) {
|
) {
|
||||||
@ -1015,13 +1052,16 @@ function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence (
|
|||||||
ReferencedSOPInstanceUID
|
ReferencedSOPInstanceUID
|
||||||
);
|
);
|
||||||
|
|
||||||
if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) {
|
if (
|
||||||
|
referencedSeriesInstanceUIDs &&
|
||||||
|
referencedSeriesInstanceUIDs.length !== 0
|
||||||
|
) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return referencedSeriesInstanceUIDs;
|
return referencedSeriesInstanceUIDs;
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the referenced series instance UIDs by searching the information in the
|
* Returns the referenced series instance UIDs by searching the information in the
|
||||||
@ -1030,7 +1070,7 @@ function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence (
|
|||||||
* @param {array[object]} displaysets
|
* @param {array[object]} displaysets
|
||||||
* @return {array[string]} referenced series instance UIDs.
|
* @return {array[string]} referenced series instance UIDs.
|
||||||
*/
|
*/
|
||||||
function _findReferencedSeriesInstanceUIDsFromSourceImageSequence (
|
function _findReferencedSeriesInstanceUIDsFromSourceImageSequence(
|
||||||
metadata,
|
metadata,
|
||||||
displaySets
|
displaySets
|
||||||
) {
|
) {
|
||||||
@ -1040,9 +1080,7 @@ function _findReferencedSeriesInstanceUIDsFromSourceImageSequence (
|
|||||||
SourceImageSequence = metadata.SourceImageSequence;
|
SourceImageSequence = metadata.SourceImageSequence;
|
||||||
} else {
|
} else {
|
||||||
const { PerFrameFunctionalGroupsSequence } = metadata;
|
const { PerFrameFunctionalGroupsSequence } = metadata;
|
||||||
const firstFunctionalGroups = _toArray(
|
const firstFunctionalGroups = _toArray(PerFrameFunctionalGroupsSequence)[0];
|
||||||
PerFrameFunctionalGroupsSequence
|
|
||||||
)[0];
|
|
||||||
if (firstFunctionalGroups) {
|
if (firstFunctionalGroups) {
|
||||||
const { DerivationImageSequence } = firstFunctionalGroups;
|
const { DerivationImageSequence } = firstFunctionalGroups;
|
||||||
SourceImageSequence = DerivationImageSequence;
|
SourceImageSequence = DerivationImageSequence;
|
||||||
@ -1062,13 +1100,16 @@ function _findReferencedSeriesInstanceUIDsFromSourceImageSequence (
|
|||||||
displaySets,
|
displaySets,
|
||||||
ReferencedSOPInstanceUID
|
ReferencedSOPInstanceUID
|
||||||
);
|
);
|
||||||
if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) {
|
if (
|
||||||
|
referencedSeriesInstanceUIDs &&
|
||||||
|
referencedSeriesInstanceUIDs.length !== 0
|
||||||
|
) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return referencedSeriesInstanceUIDs;
|
return referencedSeriesInstanceUIDs;
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the referenced series instance UIDs by searching the information in the
|
* Returns the referenced series instance UIDs by searching the information in the
|
||||||
@ -1077,7 +1118,7 @@ function _findReferencedSeriesInstanceUIDsFromSourceImageSequence (
|
|||||||
* @param {string} SOPInstanceUID
|
* @param {string} SOPInstanceUID
|
||||||
* @return {array[string]} referenced series instance UIDs.
|
* @return {array[string]} referenced series instance UIDs.
|
||||||
*/
|
*/
|
||||||
function _findReferencedSeriesInstanceUIDsFromSOPInstanceUID (
|
function _findReferencedSeriesInstanceUIDsFromSOPInstanceUID(
|
||||||
displaySets,
|
displaySets,
|
||||||
SOPInstanceUID
|
SOPInstanceUID
|
||||||
) {
|
) {
|
||||||
@ -1098,10 +1139,10 @@ function _findReferencedSeriesInstanceUIDsFromSOPInstanceUID (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
function _toArray(arrayOrObject) {
|
function _toArray(arrayOrObject) {
|
||||||
return Array.isArray(arrayOrObject) ? arrayOrObject : [arrayOrObject];
|
return Array.isArray(arrayOrObject) ? arrayOrObject : [arrayOrObject];
|
||||||
}
|
}
|
||||||
|
|
||||||
export {StudyMetadata};
|
export { StudyMetadata };
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
import { ReconstructionIssues } from './../enums.js';
|
import { ReconstructionIssues } from './../enums.js';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if a series is reconstructable to a 3D volume.
|
* Checks if a series is reconstructable to a 3D volume.
|
||||||
*
|
*
|
||||||
@ -78,7 +77,9 @@ function processSingleframe(instances) {
|
|||||||
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESDIMENSIONS);
|
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESDIMENSIONS);
|
||||||
} else if (SamplesPerPixel !== firstImageSamplesPerPixel) {
|
} else if (SamplesPerPixel !== firstImageSamplesPerPixel) {
|
||||||
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESCOMPONENTS);
|
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESCOMPONENTS);
|
||||||
} else if (!_isSameArray(ImageOrientationPatient, firstImageOrientationPatient)) {
|
} else if (
|
||||||
|
!_isSameArray(ImageOrientationPatient, firstImageOrientationPatient)
|
||||||
|
) {
|
||||||
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESORIENTATION);
|
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESORIENTATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +93,10 @@ function processSingleframe(instances) {
|
|||||||
reconstructionIssues.push(ReconstructionIssues.DATASET_4D);
|
reconstructionIssues.push(ReconstructionIssues.DATASET_4D);
|
||||||
}
|
}
|
||||||
|
|
||||||
return { value: reconstructionIssues.length === 0 ? true : false, reconstructionIssues };
|
return {
|
||||||
|
value: reconstructionIssues.length === 0 ? true : false,
|
||||||
|
reconstructionIssues,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -116,14 +120,12 @@ function isSpacingUniform(instances, datasetIs4D) {
|
|||||||
// If spacing is on a uniform grid but we are missing frames,
|
// If spacing is on a uniform grid but we are missing frames,
|
||||||
// Allow reconstruction, but pass back the number of missing frames.
|
// Allow reconstruction, but pass back the number of missing frames.
|
||||||
if (n > 2) {
|
if (n > 2) {
|
||||||
const lastIpp = instances[n - 1].getData().metadata
|
const lastIpp = instances[n - 1].getData().metadata.ImagePositionPatient;
|
||||||
.ImagePositionPatient;
|
|
||||||
|
|
||||||
// We can't reconstruct if we are missing ImagePositionPatient values
|
// We can't reconstruct if we are missing ImagePositionPatient values
|
||||||
if (firstImagePositionPatient && lastIpp) {
|
if (firstImagePositionPatient && lastIpp) {
|
||||||
const averageSpacingBetweenFrames =
|
const averageSpacingBetweenFrames =
|
||||||
_getPerpendicularDistance(firstImagePositionPatient, lastIpp) /
|
_getPerpendicularDistance(firstImagePositionPatient, lastIpp) / (n - 1);
|
||||||
(n - 1);
|
|
||||||
|
|
||||||
let previousImagePositionPatient = firstImagePositionPatient;
|
let previousImagePositionPatient = firstImagePositionPatient;
|
||||||
|
|
||||||
@ -136,7 +138,7 @@ function isSpacingUniform(instances, datasetIs4D) {
|
|||||||
previousImagePositionPatient
|
previousImagePositionPatient
|
||||||
);
|
);
|
||||||
|
|
||||||
if (datasetIs4D && spacingBetweenFrames < 1.e-3) {
|
if (datasetIs4D && spacingBetweenFrames < 1e-3) {
|
||||||
// the dataset is 4D, if the distance is zero, means that we are
|
// the dataset is 4D, if the distance is zero, means that we are
|
||||||
// checking the 4th dimension. Do not return, since we want still to
|
// checking the 4th dimension. Do not return, since we want still to
|
||||||
// check the 3rd dimension spacing.
|
// check the 3rd dimension spacing.
|
||||||
@ -164,10 +166,13 @@ function isSpacingUniform(instances, datasetIs4D) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return { isUniform: reconstructionIssues.length === 0 ? true : false, missingFrames, reconstructionIssues };
|
return {
|
||||||
|
isUniform: reconstructionIssues.length === 0 ? true : false,
|
||||||
|
missingFrames,
|
||||||
|
reconstructionIssues,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if 4D dataset.
|
* Check if 4D dataset.
|
||||||
*
|
*
|
||||||
@ -181,7 +186,7 @@ function isSpacingUniform(instances, datasetIs4D) {
|
|||||||
*
|
*
|
||||||
* @returns {boolean} dataset4D value.
|
* @returns {boolean} dataset4D value.
|
||||||
*/
|
*/
|
||||||
function _isDataset4D(instances) {
|
function _isDataset4D(instances) {
|
||||||
const n = instances.length;
|
const n = instances.length;
|
||||||
for (let ii = 0; ii < n; ++ii) {
|
for (let ii = 0; ii < n; ++ii) {
|
||||||
const instanceMetadataControl = instances[ii].getData().metadata;
|
const instanceMetadataControl = instances[ii].getData().metadata;
|
||||||
@ -204,7 +209,12 @@ function isSpacingUniform(instances, datasetIs4D) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_isSameArray(instanceMetadataControl.ImagePositionPatient, instanceMetadata.ImagePositionPatient)) {
|
if (
|
||||||
|
_isSameArray(
|
||||||
|
instanceMetadataControl.ImagePositionPatient,
|
||||||
|
instanceMetadata.ImagePositionPatient
|
||||||
|
)
|
||||||
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -272,4 +282,4 @@ function _getPerpendicularDistance(a, b) {
|
|||||||
|
|
||||||
const constructableModalities = ['MR', 'CT', 'PT', 'NM'];
|
const constructableModalities = ['MR', 'CT', 'PT', 'NM'];
|
||||||
|
|
||||||
export {isDisplaySetReconstructable, isSpacingUniform};
|
export { isDisplaySetReconstructable, isSpacingUniform };
|
||||||
|
|||||||
@ -163,11 +163,6 @@ function Thumbnail(props) {
|
|||||||
displaySetInstanceUID,
|
displaySetInstanceUID,
|
||||||
imageId,
|
imageId,
|
||||||
imageSrc,
|
imageSrc,
|
||||||
numImageFrames,
|
|
||||||
SeriesDescription,
|
|
||||||
SeriesNumber,
|
|
||||||
hasWarnings,
|
|
||||||
hasDerivedDisplaySets,
|
|
||||||
StudyInstanceUID,
|
StudyInstanceUID,
|
||||||
onClick,
|
onClick,
|
||||||
onDoubleClick,
|
onDoubleClick,
|
||||||
|
|||||||
@ -14,13 +14,11 @@ const mapDispatchToProps = (dispatch, ownProps) => {
|
|||||||
displaySetInstanceUID
|
displaySetInstanceUID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { LoggerService, UINotificationService } = servicesManager.services;
|
||||||
|
|
||||||
if (displaySet.isDerived) {
|
if (displaySet.isDerived) {
|
||||||
const { Modality } = displaySet;
|
const { Modality } = displaySet;
|
||||||
if (Modality === 'SEG' && servicesManager) {
|
if (Modality === 'SEG' && servicesManager) {
|
||||||
const {
|
|
||||||
LoggerService,
|
|
||||||
UINotificationService,
|
|
||||||
} = servicesManager.services;
|
|
||||||
const onDisplaySetLoadFailureHandler = error => {
|
const onDisplaySetLoadFailureHandler = error => {
|
||||||
LoggerService.error({ error, message: error.message });
|
LoggerService.error({ error, message: error.message });
|
||||||
UINotificationService.show({
|
UINotificationService.show({
|
||||||
@ -55,14 +53,42 @@ const mapDispatchToProps = (dispatch, ownProps) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!displaySet) {
|
if (!displaySet) {
|
||||||
throw new Error(
|
const error = new Error(
|
||||||
`Referenced series for ${Modality} dataset not present.`
|
`Referenced series for ${Modality} dataset not present.`
|
||||||
);
|
);
|
||||||
|
const message = `Referenced series for ${Modality} dataset not present.`;
|
||||||
|
LoggerService.error({ error, message });
|
||||||
|
UINotificationService.show({
|
||||||
|
autoClose: false,
|
||||||
|
title: 'Fail to load series',
|
||||||
|
message,
|
||||||
|
type: 'error',
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!displaySet) {
|
if (!displaySet) {
|
||||||
throw new Error('Source data not present');
|
const error = new Error('Source data not present');
|
||||||
|
const message = 'Source data not present';
|
||||||
|
LoggerService.error({ error, message });
|
||||||
|
UINotificationService.show({
|
||||||
|
autoClose: false,
|
||||||
|
title: 'Fail to load series',
|
||||||
|
message,
|
||||||
|
type: 'error',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (displaySet.isModalitySupported === false) {
|
||||||
|
const error = new Error('Modality not supported');
|
||||||
|
const message = 'Modality not supported';
|
||||||
|
LoggerService.error({ error, message });
|
||||||
|
UINotificationService.show({
|
||||||
|
autoClose: false,
|
||||||
|
title: 'Fail to load series',
|
||||||
|
message,
|
||||||
|
type: 'error',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
dispatch(setActiveViewportSpecificData(displaySet));
|
dispatch(setActiveViewportSpecificData(displaySet));
|
||||||
|
|||||||
@ -540,6 +540,10 @@ const _checkForSeriesInconsistencesWarnings = async function(
|
|||||||
'The datasets is missing frames: ' + displaySet.missingFrames + '.'
|
'The datasets is missing frames: ' + displaySet.missingFrames + '.'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (displaySet.isModalitySupported === false) {
|
||||||
|
inconsistencyWarnings.push('The datasets modality is not supported.');
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const segMetadata = displaySet.metadata;
|
const segMetadata = displaySet.metadata;
|
||||||
if (!segMetadata) {
|
if (!segMetadata) {
|
||||||
|
|||||||
@ -139,10 +139,11 @@ class ViewerMain extends Component {
|
|||||||
displaySetInstanceUID
|
displaySetInstanceUID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { LoggerService, UINotificationService } = servicesManager.services;
|
||||||
|
|
||||||
if (displaySet.isDerived) {
|
if (displaySet.isDerived) {
|
||||||
const { Modality } = displaySet;
|
const { Modality } = displaySet;
|
||||||
if (Modality === 'SEG' && servicesManager) {
|
if (Modality === 'SEG' && servicesManager) {
|
||||||
const {LoggerService, UINotificationService} = servicesManager.services;
|
|
||||||
const onDisplaySetLoadFailureHandler = error => {
|
const onDisplaySetLoadFailureHandler = error => {
|
||||||
LoggerService.error({ error, message: error.message });
|
LoggerService.error({ error, message: error.message });
|
||||||
UINotificationService.show({
|
UINotificationService.show({
|
||||||
@ -153,24 +154,41 @@ class ViewerMain extends Component {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const {referencedDisplaySet} = displaySet.getSourceDisplaySet(
|
const { referencedDisplaySet } = displaySet.getSourceDisplaySet(
|
||||||
this.props.studies,
|
this.props.studies,
|
||||||
true,
|
true,
|
||||||
onDisplaySetLoadFailureHandler
|
onDisplaySetLoadFailureHandler
|
||||||
);
|
);
|
||||||
displaySet = referencedDisplaySet;
|
displaySet = referencedDisplaySet;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
displaySet = displaySet.getSourceDisplaySet(this.props.studies);
|
displaySet = displaySet.getSourceDisplaySet(this.props.studies);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!displaySet) {
|
if (!displaySet) {
|
||||||
throw new Error(
|
const error = new Error('Source data not present');
|
||||||
`Referenced series for ${Modality} dataset not present.`
|
const message = 'Source data not present';
|
||||||
);
|
LoggerService.error({ error, message });
|
||||||
|
UINotificationService.show({
|
||||||
|
autoClose: false,
|
||||||
|
title: 'Fail to load series',
|
||||||
|
message,
|
||||||
|
type: 'error',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (displaySet.isModalitySupported === false) {
|
||||||
|
const error = new Error('Modality not supported');
|
||||||
|
const message = 'Modality not supported';
|
||||||
|
LoggerService.error({ error, message });
|
||||||
|
UINotificationService.show({
|
||||||
|
autoClose: false,
|
||||||
|
title: 'Fail to load series',
|
||||||
|
message,
|
||||||
|
type: 'error',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.props.setViewportSpecificData(viewportIndex, displaySet);
|
this.props.setViewportSpecificData(viewportIndex, displaySet);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user