@cornerstonejs/adapters 2.0.0-beta.23 → 2.0.0-beta.25
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.
- package/dist/esm/adapters/Cornerstone/ParametricMap.d.ts +7 -0
- package/dist/esm/adapters/Cornerstone/ParametricMap.js +216 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +2 -19
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +6 -79
- package/dist/esm/adapters/Cornerstone/index.d.ts +8 -1
- package/dist/esm/adapters/Cornerstone/index.js +5 -1
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.d.ts +3 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.js +11 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/index.d.ts +1 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/index.js +1 -0
- package/dist/esm/adapters/Cornerstone3D/index.d.ts +5 -1
- package/dist/esm/adapters/Cornerstone3D/index.js +7 -3
- package/dist/esm/adapters/helpers/checkIfPerpendicular.d.ts +9 -0
- package/dist/esm/adapters/helpers/checkIfPerpendicular.js +15 -0
- package/dist/esm/adapters/helpers/checkOrientation.d.ts +1 -0
- package/dist/esm/adapters/helpers/checkOrientation.js +24 -0
- package/dist/esm/adapters/helpers/compareArrays.d.ts +9 -0
- package/dist/esm/adapters/helpers/compareArrays.js +24 -0
- package/dist/esm/adapters/helpers/getDatasetsFromImages.d.ts +9 -0
- package/dist/esm/adapters/helpers/getDatasetsFromImages.js +41 -0
- package/dist/esm/adapters/index.d.ts +13 -1
- package/dist/esm/adapters/index.js +8 -3
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/node_modules/lodash.clonedeep/index.js +1692 -0
- package/dist/umd/adapters.umd.js +378 -145
- package/dist/umd/adapters.umd.js.map +1 -1
- package/package.json +14 -8
package/dist/umd/adapters.umd.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('dcmjs'), require('buffer'), require('ndarray'), require('gl-matrix'), require('@cornerstonejs/tools')) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', 'dcmjs', 'buffer', 'ndarray', 'gl-matrix', '@cornerstonejs/tools'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Adapters = {}, global.dcmjs, global.buffer, global.ndarray, global.glMatrix, global.cornerstoneTools));
|
|
5
|
-
})(this, (function (exports, dcmjs, buffer, ndarray, glMatrix, tools) { 'use strict';
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('dcmjs'), require('buffer'), require('ndarray'), require('lodash.clonedeep'), require('gl-matrix'), require('@cornerstonejs/tools')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', 'dcmjs', 'buffer', 'ndarray', 'lodash.clonedeep', 'gl-matrix', '@cornerstonejs/tools'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Adapters = {}, global.dcmjs, global.buffer, global.ndarray, global._.cloneDeep, global.glMatrix, global.cornerstoneTools));
|
|
5
|
+
})(this, (function (exports, dcmjs, buffer, ndarray, lodash_clonedeep, glMatrix, tools) { 'use strict';
|
|
6
6
|
|
|
7
7
|
function _arrayLikeToArray(r, a) {
|
|
8
8
|
(null == a || a > r.length) && (a = r.length);
|
|
@@ -562,10 +562,10 @@
|
|
|
562
562
|
var TID1500$1 = dcmjs.utilities.TID1500,
|
|
563
563
|
addAccessors$1 = dcmjs.utilities.addAccessors;
|
|
564
564
|
var StructuredReport$1 = dcmjs.derivations.StructuredReport;
|
|
565
|
-
var Normalizer$
|
|
565
|
+
var Normalizer$6 = dcmjs.normalizers.Normalizer;
|
|
566
566
|
var TID1500MeasurementReport$1 = TID1500$1.TID1500MeasurementReport,
|
|
567
567
|
TID1501MeasurementGroup$1 = TID1500$1.TID1501MeasurementGroup;
|
|
568
|
-
var DicomMetaDictionary$
|
|
568
|
+
var DicomMetaDictionary$6 = dcmjs.data.DicomMetaDictionary;
|
|
569
569
|
var FINDING$2 = {
|
|
570
570
|
CodingSchemeDesignator: "DCM",
|
|
571
571
|
CodeValue: "121071"
|
|
@@ -696,7 +696,7 @@
|
|
|
696
696
|
ReferencedSOPClassUID: sopCommonModule.sopClassUID,
|
|
697
697
|
ReferencedSOPInstanceUID: sopCommonModule.sopInstanceUID
|
|
698
698
|
};
|
|
699
|
-
if (Normalizer$
|
|
699
|
+
if (Normalizer$6.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)) {
|
|
700
700
|
ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
|
|
701
701
|
}
|
|
702
702
|
|
|
@@ -737,7 +737,7 @@
|
|
|
737
737
|
vr: "UI"
|
|
738
738
|
},
|
|
739
739
|
ImplementationClassUID: {
|
|
740
|
-
Value: [DicomMetaDictionary$
|
|
740
|
+
Value: [DicomMetaDictionary$6.uid()],
|
|
741
741
|
// TODO: could be git hash or other valid id
|
|
742
742
|
vr: "UI"
|
|
743
743
|
},
|
|
@@ -1793,6 +1793,44 @@
|
|
|
1793
1793
|
};
|
|
1794
1794
|
MeasurementReport$1.registerTool(RectangleRoi);
|
|
1795
1795
|
|
|
1796
|
+
var DicomMessage$3 = dcmjs.data.DicomMessage,
|
|
1797
|
+
DicomMetaDictionary$5 = dcmjs.data.DicomMetaDictionary;
|
|
1798
|
+
var Normalizer$5 = dcmjs.normalizers.Normalizer;
|
|
1799
|
+
/**
|
|
1800
|
+
* Convert an array of cornerstone images into datasets
|
|
1801
|
+
*
|
|
1802
|
+
* @param images - An array of the cornerstone image objects
|
|
1803
|
+
* @param isMultiframe - Whether the images are multiframe
|
|
1804
|
+
* @param options - Options object that may contain:
|
|
1805
|
+
* - SpecificCharacterSet: character set to be set to each dataset
|
|
1806
|
+
*/
|
|
1807
|
+
function getDatasetsFromImages(images, isMultiframe, options) {
|
|
1808
|
+
var datasets = [];
|
|
1809
|
+
if (isMultiframe) {
|
|
1810
|
+
var image = images[0];
|
|
1811
|
+
var arrayBuffer = image.data.byteArray.buffer;
|
|
1812
|
+
var dicomData = DicomMessage$3.readFile(arrayBuffer);
|
|
1813
|
+
var dataset = DicomMetaDictionary$5.naturalizeDataset(dicomData.dict);
|
|
1814
|
+
dataset._meta = DicomMetaDictionary$5.namifyDataset(dicomData.meta);
|
|
1815
|
+
datasets.push(dataset);
|
|
1816
|
+
} else {
|
|
1817
|
+
for (var i = 0; i < images.length; i++) {
|
|
1818
|
+
var _image = images[i];
|
|
1819
|
+
var _arrayBuffer = _image.data.byteArray.buffer;
|
|
1820
|
+
var _dicomData = DicomMessage$3.readFile(_arrayBuffer);
|
|
1821
|
+
var _dataset = DicomMetaDictionary$5.naturalizeDataset(_dicomData.dict);
|
|
1822
|
+
_dataset._meta = DicomMetaDictionary$5.namifyDataset(_dicomData.meta);
|
|
1823
|
+
datasets.push(_dataset);
|
|
1824
|
+
}
|
|
1825
|
+
}
|
|
1826
|
+
if (options !== null && options !== void 0 && options.SpecificCharacterSet) {
|
|
1827
|
+
datasets.forEach(function (dataset) {
|
|
1828
|
+
return dataset.SpecificCharacterSet = options.SpecificCharacterSet;
|
|
1829
|
+
});
|
|
1830
|
+
}
|
|
1831
|
+
return Normalizer$5.normalizeToDataset(datasets);
|
|
1832
|
+
}
|
|
1833
|
+
|
|
1796
1834
|
var _utilities$orientatio$1 = dcmjs.utilities.orientation,
|
|
1797
1835
|
rotateDirectionCosinesInPlane$1 = _utilities$orientatio$1.rotateDirectionCosinesInPlane,
|
|
1798
1836
|
flipIOP$1 = _utilities$orientatio$1.flipImageOrientationPatient,
|
|
@@ -1800,13 +1838,13 @@
|
|
|
1800
1838
|
rotateMatrix902D$1 = _utilities$orientatio$1.rotateMatrix902D;
|
|
1801
1839
|
var datasetToBlob = dcmjs.utilities.datasetToBlob,
|
|
1802
1840
|
BitArray$2 = dcmjs.utilities.BitArray,
|
|
1803
|
-
DicomMessage$
|
|
1804
|
-
DicomMetaDictionary$
|
|
1805
|
-
var Normalizer$
|
|
1841
|
+
DicomMessage$2 = dcmjs.utilities.DicomMessage,
|
|
1842
|
+
DicomMetaDictionary$4 = dcmjs.utilities.DicomMetaDictionary;
|
|
1843
|
+
var Normalizer$4 = dcmjs.normalizers.Normalizer;
|
|
1806
1844
|
var SegmentationDerivation$2 = dcmjs.derivations.Segmentation;
|
|
1807
1845
|
var Segmentation$5 = {
|
|
1808
1846
|
generateSegmentation: generateSegmentation$3,
|
|
1809
|
-
generateToolState: generateToolState$
|
|
1847
|
+
generateToolState: generateToolState$5
|
|
1810
1848
|
};
|
|
1811
1849
|
|
|
1812
1850
|
/**
|
|
@@ -1926,25 +1964,7 @@
|
|
|
1926
1964
|
* @returns {Object} The Seg derived dataSet.
|
|
1927
1965
|
*/
|
|
1928
1966
|
function _createSegFromImages$1(images, isMultiframe, options) {
|
|
1929
|
-
var
|
|
1930
|
-
if (isMultiframe) {
|
|
1931
|
-
var image = images[0];
|
|
1932
|
-
var arrayBuffer = image.data.byteArray.buffer;
|
|
1933
|
-
var dicomData = DicomMessage$1.readFile(arrayBuffer);
|
|
1934
|
-
var dataset = DicomMetaDictionary$3.naturalizeDataset(dicomData.dict);
|
|
1935
|
-
dataset._meta = DicomMetaDictionary$3.namifyDataset(dicomData.meta);
|
|
1936
|
-
datasets.push(dataset);
|
|
1937
|
-
} else {
|
|
1938
|
-
for (var i = 0; i < images.length; i++) {
|
|
1939
|
-
var _image = images[i];
|
|
1940
|
-
var _arrayBuffer = _image.data.byteArray.buffer;
|
|
1941
|
-
var _dicomData = DicomMessage$1.readFile(_arrayBuffer);
|
|
1942
|
-
var _dataset = DicomMetaDictionary$3.naturalizeDataset(_dicomData.dict);
|
|
1943
|
-
_dataset._meta = DicomMetaDictionary$3.namifyDataset(_dicomData.meta);
|
|
1944
|
-
datasets.push(_dataset);
|
|
1945
|
-
}
|
|
1946
|
-
}
|
|
1947
|
-
var multiframe = Normalizer$3.normalizeToDataset(datasets);
|
|
1967
|
+
var multiframe = getDatasetsFromImages(images, isMultiframe);
|
|
1948
1968
|
return new SegmentationDerivation$2([multiframe], options);
|
|
1949
1969
|
}
|
|
1950
1970
|
|
|
@@ -1958,11 +1978,11 @@
|
|
|
1958
1978
|
* @returns {Object} The toolState and an object from which the
|
|
1959
1979
|
* segment metadata can be derived.
|
|
1960
1980
|
*/
|
|
1961
|
-
function generateToolState$
|
|
1962
|
-
var dicomData = DicomMessage$
|
|
1963
|
-
var dataset = DicomMetaDictionary$
|
|
1964
|
-
dataset._meta = DicomMetaDictionary$
|
|
1965
|
-
var multiframe = Normalizer$
|
|
1981
|
+
function generateToolState$5(imageIds, arrayBuffer, metadataProvider) {
|
|
1982
|
+
var dicomData = DicomMessage$2.readFile(arrayBuffer);
|
|
1983
|
+
var dataset = DicomMetaDictionary$4.naturalizeDataset(dicomData.dict);
|
|
1984
|
+
dataset._meta = DicomMetaDictionary$4.namifyDataset(dicomData.meta);
|
|
1985
|
+
var multiframe = Normalizer$4.normalizeToDataset([dataset]);
|
|
1966
1986
|
var imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
1967
1987
|
if (!imagePlaneModule) {
|
|
1968
1988
|
console.warn("Insufficient metadata, imagePlaneModule missing.");
|
|
@@ -2077,7 +2097,7 @@
|
|
|
2077
2097
|
function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider) {
|
|
2078
2098
|
var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
|
|
2079
2099
|
ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
2080
|
-
return ReferencedFrameNumber ? getImageIdOfReferencedFrame$
|
|
2100
|
+
return ReferencedFrameNumber ? getImageIdOfReferencedFrame$2(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
|
|
2081
2101
|
}
|
|
2082
2102
|
|
|
2083
2103
|
/**
|
|
@@ -2111,7 +2131,7 @@
|
|
|
2111
2131
|
* from the cornerstone imageIds.
|
|
2112
2132
|
* @return {String} The imageId that corresponds to the sopInstanceUid.
|
|
2113
2133
|
*/
|
|
2114
|
-
function getImageIdOfReferencedFrame$
|
|
2134
|
+
function getImageIdOfReferencedFrame$2(sopInstanceUid, frameNumber, imageIds, metadataProvider) {
|
|
2115
2135
|
var imageId = imageIds.find(function (imageId) {
|
|
2116
2136
|
var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
|
|
2117
2137
|
if (!sopCommonModule) {
|
|
@@ -2216,6 +2236,61 @@
|
|
|
2216
2236
|
};
|
|
2217
2237
|
}
|
|
2218
2238
|
|
|
2239
|
+
/**
|
|
2240
|
+
* Returns true if iop1 and iop2 are perpendicular within a tolerance.
|
|
2241
|
+
*
|
|
2242
|
+
* @param iop1 - First ImageOrientationPatient
|
|
2243
|
+
* @param iop2 - Second ImageOrientationPatient
|
|
2244
|
+
* @param tolerance - Tolerance
|
|
2245
|
+
* @returns True if iop1 and iop2 are equal.
|
|
2246
|
+
*/
|
|
2247
|
+
function checkIfPerpendicular(iop1, iop2, tolerance) {
|
|
2248
|
+
var absDotColumnCosines = Math.abs(iop1[0] * iop2[0] + iop1[1] * iop2[1] + iop1[2] * iop2[2]);
|
|
2249
|
+
var absDotRowCosines = Math.abs(iop1[3] * iop2[3] + iop1[4] * iop2[4] + iop1[5] * iop2[5]);
|
|
2250
|
+
return (absDotColumnCosines < tolerance || Math.abs(absDotColumnCosines - 1) < tolerance) && (absDotRowCosines < tolerance || Math.abs(absDotRowCosines - 1) < tolerance);
|
|
2251
|
+
}
|
|
2252
|
+
|
|
2253
|
+
var nearlyEqual = dcmjs.utilities.orientation.nearlyEqual;
|
|
2254
|
+
/**
|
|
2255
|
+
* Returns true if array1 and array2 are equal within a tolerance.
|
|
2256
|
+
*
|
|
2257
|
+
* @param array1 - First array
|
|
2258
|
+
* @param array2 - Second array
|
|
2259
|
+
* @param tolerance - Tolerance
|
|
2260
|
+
* @returns True if array1 and array2 are equal.
|
|
2261
|
+
*/
|
|
2262
|
+
function compareArrays(array1, array2, tolerance) {
|
|
2263
|
+
if (array1.length !== array2.length) {
|
|
2264
|
+
return false;
|
|
2265
|
+
}
|
|
2266
|
+
for (var i = 0; i < array1.length; ++i) {
|
|
2267
|
+
if (!nearlyEqual(array1[i], array2[i], tolerance)) {
|
|
2268
|
+
return false;
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
return true;
|
|
2272
|
+
}
|
|
2273
|
+
|
|
2274
|
+
function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) {
|
|
2275
|
+
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
|
|
2276
|
+
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence;
|
|
2277
|
+
var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
|
|
2278
|
+
// Check if in plane.
|
|
2279
|
+
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0];
|
|
2280
|
+
var iop = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
|
|
2281
|
+
var inPlane = validOrientations.some(function (operation) {
|
|
2282
|
+
return compareArrays(iop, operation, tolerance);
|
|
2283
|
+
});
|
|
2284
|
+
if (inPlane) {
|
|
2285
|
+
return "Planar";
|
|
2286
|
+
}
|
|
2287
|
+
if (checkIfPerpendicular(iop, validOrientations[0], tolerance) && sourceDataDimensions.includes(multiframe.Rows) && sourceDataDimensions.includes(multiframe.Columns)) {
|
|
2288
|
+
// Perpendicular and fits on same grid.
|
|
2289
|
+
return "Perpendicular";
|
|
2290
|
+
}
|
|
2291
|
+
return "Oblique";
|
|
2292
|
+
}
|
|
2293
|
+
|
|
2219
2294
|
/**
|
|
2220
2295
|
* Cornerstone adapters events
|
|
2221
2296
|
*/
|
|
@@ -2237,12 +2312,11 @@
|
|
|
2237
2312
|
rotateDirectionCosinesInPlane = _utilities$orientatio.rotateDirectionCosinesInPlane,
|
|
2238
2313
|
flipIOP = _utilities$orientatio.flipImageOrientationPatient,
|
|
2239
2314
|
flipMatrix2D = _utilities$orientatio.flipMatrix2D,
|
|
2240
|
-
rotateMatrix902D = _utilities$orientatio.rotateMatrix902D
|
|
2241
|
-
nearlyEqual = _utilities$orientatio.nearlyEqual;
|
|
2315
|
+
rotateMatrix902D = _utilities$orientatio.rotateMatrix902D;
|
|
2242
2316
|
var BitArray$1 = dcmjs.data.BitArray,
|
|
2243
|
-
DicomMessage = dcmjs.data.DicomMessage,
|
|
2244
|
-
DicomMetaDictionary$
|
|
2245
|
-
var Normalizer$
|
|
2317
|
+
DicomMessage$1 = dcmjs.data.DicomMessage,
|
|
2318
|
+
DicomMetaDictionary$3 = dcmjs.data.DicomMetaDictionary;
|
|
2319
|
+
var Normalizer$3 = dcmjs.normalizers.Normalizer;
|
|
2246
2320
|
var SegmentationDerivation$1 = dcmjs.derivations.Segmentation;
|
|
2247
2321
|
var _utilities$compressio = dcmjs.utilities.compression,
|
|
2248
2322
|
encode = _utilities$compressio.encode,
|
|
@@ -2387,27 +2461,7 @@
|
|
|
2387
2461
|
* @returns {Object} The Seg derived dataSet.
|
|
2388
2462
|
*/
|
|
2389
2463
|
function _createSegFromImages(images, isMultiframe, options) {
|
|
2390
|
-
var
|
|
2391
|
-
if (isMultiframe) {
|
|
2392
|
-
var image = images[0];
|
|
2393
|
-
var arrayBuffer = image.data.byteArray.buffer;
|
|
2394
|
-
var dicomData = DicomMessage.readFile(arrayBuffer);
|
|
2395
|
-
var dataset = DicomMetaDictionary$2.naturalizeDataset(dicomData.dict);
|
|
2396
|
-
dataset._meta = DicomMetaDictionary$2.namifyDataset(dicomData.meta);
|
|
2397
|
-
dataset.SpecificCharacterSet = "ISO_IR 192";
|
|
2398
|
-
datasets.push(dataset);
|
|
2399
|
-
} else {
|
|
2400
|
-
for (var i = 0; i < images.length; i++) {
|
|
2401
|
-
var _image = images[i];
|
|
2402
|
-
var _arrayBuffer = _image.data.byteArray.buffer;
|
|
2403
|
-
var _dicomData = DicomMessage.readFile(_arrayBuffer);
|
|
2404
|
-
var _dataset = DicomMetaDictionary$2.naturalizeDataset(_dicomData.dict);
|
|
2405
|
-
_dataset._meta = DicomMetaDictionary$2.namifyDataset(_dicomData.meta);
|
|
2406
|
-
_dataset.SpecificCharacterSet = "ISO_IR 192";
|
|
2407
|
-
datasets.push(_dataset);
|
|
2408
|
-
}
|
|
2409
|
-
}
|
|
2410
|
-
var multiframe = Normalizer$2.normalizeToDataset(datasets);
|
|
2464
|
+
var multiframe = getDatasetsFromImages(images, isMultiframe);
|
|
2411
2465
|
return new SegmentationDerivation$1([multiframe], options);
|
|
2412
2466
|
}
|
|
2413
2467
|
|
|
@@ -2426,8 +2480,8 @@
|
|
|
2426
2480
|
* @return {[][][]} 3D list containing the track of segments per frame for each labelMap
|
|
2427
2481
|
* (available only for the overlapping case).
|
|
2428
2482
|
*/
|
|
2429
|
-
function generateToolState$
|
|
2430
|
-
return _generateToolState.apply(this, arguments);
|
|
2483
|
+
function generateToolState$4(_x, _x2, _x3, _x4) {
|
|
2484
|
+
return _generateToolState$1.apply(this, arguments);
|
|
2431
2485
|
} // function insertPixelDataPerpendicular(
|
|
2432
2486
|
// segmentsOnFrame,
|
|
2433
2487
|
// labelmapBuffer,
|
|
@@ -2579,17 +2633,17 @@
|
|
|
2579
2633
|
*
|
|
2580
2634
|
* @returns {String} Returns the imageId
|
|
2581
2635
|
*/
|
|
2582
|
-
function _generateToolState() {
|
|
2583
|
-
_generateToolState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(imageIds, arrayBuffer, metadataProvider, options) {
|
|
2636
|
+
function _generateToolState$1() {
|
|
2637
|
+
_generateToolState$1 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(imageIds, arrayBuffer, metadataProvider, options) {
|
|
2584
2638
|
var _options$skipOverlapp, skipOverlapping, _options$tolerance, tolerance, _options$TypedArrayCo, TypedArrayConstructor, _options$maxBytesPerC, maxBytesPerChunk, eventTarget, triggerEvent, dicomData, dataset, multiframe, imagePlaneModule, generalSeriesModule, SeriesInstanceUID, ImageOrientationPatient, validOrientations, sliceLength, segMetadata, TransferSyntaxUID, pixelData, pixelDataChunks, rleEncodedFrames, orientation, sopUIDImageIdIndexMap, overlapping, insertFunction, segmentsOnFrameArray, segmentsOnFrame, arrayBufferLength, labelmapBufferArray, imageIdMaps, segmentsPixelIndices, overlappingSegments, centroidXYZ;
|
|
2585
2639
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
2586
2640
|
while (1) switch (_context.prev = _context.next) {
|
|
2587
2641
|
case 0:
|
|
2588
2642
|
_options$skipOverlapp = options.skipOverlapping, skipOverlapping = _options$skipOverlapp === void 0 ? false : _options$skipOverlapp, _options$tolerance = options.tolerance, tolerance = _options$tolerance === void 0 ? 1e-3 : _options$tolerance, _options$TypedArrayCo = options.TypedArrayConstructor, TypedArrayConstructor = _options$TypedArrayCo === void 0 ? Uint8Array : _options$TypedArrayCo, _options$maxBytesPerC = options.maxBytesPerChunk, maxBytesPerChunk = _options$maxBytesPerC === void 0 ? 199000000 : _options$maxBytesPerC, eventTarget = options.eventTarget, triggerEvent = options.triggerEvent;
|
|
2589
|
-
dicomData = DicomMessage.readFile(arrayBuffer);
|
|
2590
|
-
dataset = DicomMetaDictionary$
|
|
2591
|
-
dataset._meta = DicomMetaDictionary$
|
|
2592
|
-
multiframe = Normalizer$
|
|
2643
|
+
dicomData = DicomMessage$1.readFile(arrayBuffer);
|
|
2644
|
+
dataset = DicomMetaDictionary$3.naturalizeDataset(dicomData.dict);
|
|
2645
|
+
dataset._meta = DicomMetaDictionary$3.namifyDataset(dicomData.meta);
|
|
2646
|
+
multiframe = Normalizer$3.normalizeToDataset([dataset]);
|
|
2593
2647
|
imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
2594
2648
|
generalSeriesModule = metadataProvider.get("generalSeriesModule", imageIds[0]);
|
|
2595
2649
|
SeriesInstanceUID = generalSeriesModule.seriesInstanceUID;
|
|
@@ -2648,7 +2702,7 @@
|
|
|
2648
2702
|
if (overlapping) {
|
|
2649
2703
|
insertFunction = insertOverlappingPixelDataPlanar;
|
|
2650
2704
|
} else {
|
|
2651
|
-
insertFunction = insertPixelDataPlanar;
|
|
2705
|
+
insertFunction = insertPixelDataPlanar$1;
|
|
2652
2706
|
}
|
|
2653
2707
|
return _context.abrupt("break", 37);
|
|
2654
2708
|
case 35:
|
|
@@ -2714,9 +2768,9 @@
|
|
|
2714
2768
|
}
|
|
2715
2769
|
}, _callee);
|
|
2716
2770
|
}));
|
|
2717
|
-
return _generateToolState.apply(this, arguments);
|
|
2771
|
+
return _generateToolState$1.apply(this, arguments);
|
|
2718
2772
|
}
|
|
2719
|
-
function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
|
|
2773
|
+
function findReferenceSourceImageId$1(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
|
|
2720
2774
|
var imageId = undefined;
|
|
2721
2775
|
if (!multiframe) {
|
|
2722
2776
|
return imageId;
|
|
@@ -2757,12 +2811,12 @@
|
|
|
2757
2811
|
frameSourceImageSequence = SourceImageSequence[frameSegment];
|
|
2758
2812
|
}
|
|
2759
2813
|
if (frameSourceImageSequence) {
|
|
2760
|
-
imageId = getImageIdOfSourceImageBySourceImageSequence(frameSourceImageSequence, sopUIDImageIdIndexMap);
|
|
2814
|
+
imageId = getImageIdOfSourceImageBySourceImageSequence$1(frameSourceImageSequence, sopUIDImageIdIndexMap);
|
|
2761
2815
|
}
|
|
2762
2816
|
if (imageId === undefined && ReferencedSeriesSequence) {
|
|
2763
2817
|
var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence) ? ReferencedSeriesSequence[0] : ReferencedSeriesSequence;
|
|
2764
2818
|
var ReferencedSeriesInstanceUID = referencedSeriesSequence.SeriesInstanceUID;
|
|
2765
|
-
imageId = getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
|
|
2819
|
+
imageId = getImageIdOfSourceImagebyGeometry$1(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
|
|
2766
2820
|
}
|
|
2767
2821
|
return imageId;
|
|
2768
2822
|
}
|
|
@@ -2799,7 +2853,7 @@
|
|
|
2799
2853
|
console.warn("Could not retrieve the segment index for frame segment " + frameSegment + ", skipping this frame.");
|
|
2800
2854
|
return 0; // continue
|
|
2801
2855
|
}
|
|
2802
|
-
var imageId = findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
2856
|
+
var imageId = findReferenceSourceImageId$1(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
2803
2857
|
if (!imageId) {
|
|
2804
2858
|
console.warn("Image not present in stack, can't import frame : " + frameSegment + ".");
|
|
2805
2859
|
return 0; // continue
|
|
@@ -2908,7 +2962,7 @@
|
|
|
2908
2962
|
if (!alignedPixelDataI) {
|
|
2909
2963
|
throw new Error("Individual SEG frames are out of plane with respect to the first SEG frame. " + "This is not yet supported. Aborting segmentation loading.");
|
|
2910
2964
|
}
|
|
2911
|
-
var imageId = findReferenceSourceImageId(multiframe, _i2, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
2965
|
+
var imageId = findReferenceSourceImageId$1(multiframe, _i2, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
2912
2966
|
if (!imageId) {
|
|
2913
2967
|
console.warn("Image not present in stack, can't import frame : " + _i2 + ".");
|
|
2914
2968
|
i = _i2;
|
|
@@ -2976,7 +3030,7 @@
|
|
|
2976
3030
|
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[frame];
|
|
2977
3031
|
return PerFrameFunctionalGroups && PerFrameFunctionalGroups.SegmentIdentificationSequence ? PerFrameFunctionalGroups.SegmentIdentificationSequence.ReferencedSegmentNumber : SharedFunctionalGroupsSequence.SegmentIdentificationSequence ? SharedFunctionalGroupsSequence.SegmentIdentificationSequence.ReferencedSegmentNumber : undefined;
|
|
2978
3032
|
};
|
|
2979
|
-
function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, eventTarget, triggerEvent) {
|
|
3033
|
+
function insertPixelDataPlanar$1(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, eventTarget, triggerEvent) {
|
|
2980
3034
|
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
|
|
2981
3035
|
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
2982
3036
|
Rows = multiframe.Rows,
|
|
@@ -3011,7 +3065,7 @@
|
|
|
3011
3065
|
if (!segmentsPixelIndices.has(segmentIndex)) {
|
|
3012
3066
|
segmentsPixelIndices.set(segmentIndex, {});
|
|
3013
3067
|
}
|
|
3014
|
-
var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
3068
|
+
var imageId = findReferenceSourceImageId$1(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
3015
3069
|
if (!imageId) {
|
|
3016
3070
|
console.warn("Image not present in stack, can't import frame : " + i + ".");
|
|
3017
3071
|
continue;
|
|
@@ -3067,41 +3121,6 @@
|
|
|
3067
3121
|
processInChunks();
|
|
3068
3122
|
});
|
|
3069
3123
|
}
|
|
3070
|
-
function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) {
|
|
3071
|
-
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
|
|
3072
|
-
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence;
|
|
3073
|
-
var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
|
|
3074
|
-
|
|
3075
|
-
// Check if in plane.
|
|
3076
|
-
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0];
|
|
3077
|
-
var iop = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
|
|
3078
|
-
var inPlane = validOrientations.some(function (operation) {
|
|
3079
|
-
return compareArrays(iop, operation, tolerance);
|
|
3080
|
-
});
|
|
3081
|
-
if (inPlane) {
|
|
3082
|
-
return "Planar";
|
|
3083
|
-
}
|
|
3084
|
-
if (checkIfPerpendicular(iop, validOrientations[0], tolerance) && sourceDataDimensions.includes(multiframe.Rows) && sourceDataDimensions.includes(multiframe.Columns)) {
|
|
3085
|
-
// Perpendicular and fits on same grid.
|
|
3086
|
-
return "Perpendicular";
|
|
3087
|
-
}
|
|
3088
|
-
return "Oblique";
|
|
3089
|
-
}
|
|
3090
|
-
|
|
3091
|
-
/**
|
|
3092
|
-
* checkIfPerpendicular - Returns true if iop1 and iop2 are perpendicular
|
|
3093
|
-
* within a tolerance.
|
|
3094
|
-
*
|
|
3095
|
-
* @param {Number[6]} iop1 An ImageOrientationPatient array.
|
|
3096
|
-
* @param {Number[6]} iop2 An ImageOrientationPatient array.
|
|
3097
|
-
* @param {Number} tolerance.
|
|
3098
|
-
* @return {Boolean} True if iop1 and iop2 are equal.
|
|
3099
|
-
*/
|
|
3100
|
-
function checkIfPerpendicular(iop1, iop2, tolerance) {
|
|
3101
|
-
var absDotColumnCosines = Math.abs(iop1[0] * iop2[0] + iop1[1] * iop2[1] + iop1[2] * iop2[2]);
|
|
3102
|
-
var absDotRowCosines = Math.abs(iop1[3] * iop2[3] + iop1[4] * iop2[4] + iop1[5] * iop2[5]);
|
|
3103
|
-
return (absDotColumnCosines < tolerance || Math.abs(absDotColumnCosines - 1) < tolerance) && (absDotRowCosines < tolerance || Math.abs(absDotRowCosines - 1) < tolerance);
|
|
3104
|
-
}
|
|
3105
3124
|
|
|
3106
3125
|
/**
|
|
3107
3126
|
* unpackPixelData - Unpacks bit packed pixelData if the Segmentation is BINARY.
|
|
@@ -3164,10 +3183,10 @@
|
|
|
3164
3183
|
* @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
|
|
3165
3184
|
* @return {String} The corresponding imageId.
|
|
3166
3185
|
*/
|
|
3167
|
-
function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
|
|
3186
|
+
function getImageIdOfSourceImageBySourceImageSequence$1(SourceImageSequence, sopUIDImageIdIndexMap) {
|
|
3168
3187
|
var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
|
|
3169
3188
|
ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
3170
|
-
return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
|
|
3189
|
+
return ReferencedFrameNumber ? getImageIdOfReferencedFrame$1(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
|
|
3171
3190
|
}
|
|
3172
3191
|
|
|
3173
3192
|
/**
|
|
@@ -3182,7 +3201,7 @@
|
|
|
3182
3201
|
*
|
|
3183
3202
|
* @return {String} The corresponding imageId.
|
|
3184
3203
|
*/
|
|
3185
|
-
function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
|
|
3204
|
+
function getImageIdOfSourceImagebyGeometry$1(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
|
|
3186
3205
|
if (ReferencedSeriesInstanceUID === undefined || PerFrameFunctionalGroup.PlanePositionSequence === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient === undefined) {
|
|
3187
3206
|
return undefined;
|
|
3188
3207
|
}
|
|
@@ -3207,7 +3226,7 @@
|
|
|
3207
3226
|
* @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
|
|
3208
3227
|
* @return {String} The imageId that corresponds to the sopInstanceUid.
|
|
3209
3228
|
*/
|
|
3210
|
-
function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
|
|
3229
|
+
function getImageIdOfReferencedFrame$1(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
|
|
3211
3230
|
var imageId = sopUIDImageIdIndexMap[sopInstanceUid];
|
|
3212
3231
|
if (!imageId) {
|
|
3213
3232
|
return;
|
|
@@ -3289,27 +3308,6 @@
|
|
|
3289
3308
|
return rotateMatrix902D(rotateMatrix902D(rotateMatrix902D(pixelData2D)));
|
|
3290
3309
|
}
|
|
3291
3310
|
}
|
|
3292
|
-
|
|
3293
|
-
/**
|
|
3294
|
-
* compareArrays - Returns true if array1 and array2 are equal
|
|
3295
|
-
* within a tolerance.
|
|
3296
|
-
*
|
|
3297
|
-
* @param {Number[]} array1 - An array.
|
|
3298
|
-
* @param {Number[]} array2 - An array.
|
|
3299
|
-
* @param {Number} tolerance.
|
|
3300
|
-
* @return {Boolean} True if array1 and array2 are equal.
|
|
3301
|
-
*/
|
|
3302
|
-
function compareArrays(array1, array2, tolerance) {
|
|
3303
|
-
if (array1.length != array2.length) {
|
|
3304
|
-
return false;
|
|
3305
|
-
}
|
|
3306
|
-
for (var i = 0; i < array1.length; ++i) {
|
|
3307
|
-
if (!nearlyEqual(array1[i], array2[i], tolerance)) {
|
|
3308
|
-
return false;
|
|
3309
|
-
}
|
|
3310
|
-
}
|
|
3311
|
-
return true;
|
|
3312
|
-
}
|
|
3313
3311
|
function getSegmentMetadata(multiframe, seriesInstanceUid) {
|
|
3314
3312
|
var segmentSequence = multiframe.SegmentSequence;
|
|
3315
3313
|
var data = [];
|
|
@@ -3423,13 +3421,13 @@
|
|
|
3423
3421
|
}
|
|
3424
3422
|
var Segmentation$4 = {
|
|
3425
3423
|
generateSegmentation: generateSegmentation$2,
|
|
3426
|
-
generateToolState: generateToolState$
|
|
3424
|
+
generateToolState: generateToolState$4,
|
|
3427
3425
|
fillSegmentation: fillSegmentation$1
|
|
3428
3426
|
};
|
|
3429
3427
|
|
|
3430
3428
|
var Segmentation$3 = {
|
|
3431
3429
|
generateSegmentation: generateSegmentation$1,
|
|
3432
|
-
generateToolState: generateToolState$
|
|
3430
|
+
generateToolState: generateToolState$3,
|
|
3433
3431
|
fillSegmentation: fillSegmentation
|
|
3434
3432
|
};
|
|
3435
3433
|
|
|
@@ -3470,7 +3468,7 @@
|
|
|
3470
3468
|
* @returns {Object} The toolState and an object from which the
|
|
3471
3469
|
* segment metadata can be derived.
|
|
3472
3470
|
*/
|
|
3473
|
-
function generateToolState$
|
|
3471
|
+
function generateToolState$3(imageIds, arrayBuffer, metadataProvider) {
|
|
3474
3472
|
var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
3475
3473
|
var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
|
|
3476
3474
|
var cornerstoneToolsVersion = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 4;
|
|
@@ -3502,6 +3500,216 @@
|
|
|
3502
3500
|
console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
3503
3501
|
}
|
|
3504
3502
|
|
|
3503
|
+
var DicomMessage = dcmjs.data.DicomMessage,
|
|
3504
|
+
DicomMetaDictionary$2 = dcmjs.data.DicomMetaDictionary;
|
|
3505
|
+
var Normalizer$2 = dcmjs.normalizers.Normalizer;
|
|
3506
|
+
function generateToolState$2(_x, _x2, _x3) {
|
|
3507
|
+
return _generateToolState.apply(this, arguments);
|
|
3508
|
+
}
|
|
3509
|
+
function _generateToolState() {
|
|
3510
|
+
_generateToolState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(imageIds, arrayBuffer, metadataProvider) {
|
|
3511
|
+
var tolerance,
|
|
3512
|
+
dicomData,
|
|
3513
|
+
dataset,
|
|
3514
|
+
multiframe,
|
|
3515
|
+
imagePlaneModule,
|
|
3516
|
+
ImageOrientationPatient,
|
|
3517
|
+
validOrientations,
|
|
3518
|
+
pixelData,
|
|
3519
|
+
orientation,
|
|
3520
|
+
sopUIDImageIdIndexMap,
|
|
3521
|
+
orientationText,
|
|
3522
|
+
imageIdMaps,
|
|
3523
|
+
_args = arguments;
|
|
3524
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
3525
|
+
while (1) switch (_context.prev = _context.next) {
|
|
3526
|
+
case 0:
|
|
3527
|
+
tolerance = _args.length > 3 && _args[3] !== undefined ? _args[3] : 1e-3;
|
|
3528
|
+
dicomData = DicomMessage.readFile(arrayBuffer);
|
|
3529
|
+
dataset = DicomMetaDictionary$2.naturalizeDataset(dicomData.dict);
|
|
3530
|
+
dataset._meta = DicomMetaDictionary$2.namifyDataset(dicomData.meta);
|
|
3531
|
+
multiframe = Normalizer$2.normalizeToDataset([dataset]);
|
|
3532
|
+
imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
3533
|
+
if (!imagePlaneModule) {
|
|
3534
|
+
console.warn("Insufficient metadata, imagePlaneModule missing.");
|
|
3535
|
+
}
|
|
3536
|
+
ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines) ? [].concat(_toConsumableArray(imagePlaneModule.rowCosines), _toConsumableArray(imagePlaneModule.columnCosines)) : [imagePlaneModule.rowCosines.x, imagePlaneModule.rowCosines.y, imagePlaneModule.rowCosines.z, imagePlaneModule.columnCosines.x, imagePlaneModule.columnCosines.y, imagePlaneModule.columnCosines.z]; // It currently supports parametric maps with same orientation
|
|
3537
|
+
validOrientations = [ImageOrientationPatient];
|
|
3538
|
+
pixelData = getPixelData(multiframe);
|
|
3539
|
+
orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length], tolerance); // Pre-compute the sop UID to imageId index map so that in the for loop
|
|
3540
|
+
// we don't have to call metadataProvider.get() for each imageId over
|
|
3541
|
+
// and over again.
|
|
3542
|
+
sopUIDImageIdIndexMap = imageIds.reduce(function (acc, imageId) {
|
|
3543
|
+
var _metadataProvider$get = metadataProvider.get("generalImageModule", imageId),
|
|
3544
|
+
sopInstanceUID = _metadataProvider$get.sopInstanceUID;
|
|
3545
|
+
acc[sopInstanceUID] = imageId;
|
|
3546
|
+
return acc;
|
|
3547
|
+
}, {});
|
|
3548
|
+
if (!(orientation !== "Planar")) {
|
|
3549
|
+
_context.next = 15;
|
|
3550
|
+
break;
|
|
3551
|
+
}
|
|
3552
|
+
orientationText = {
|
|
3553
|
+
Perpendicular: "orthogonal",
|
|
3554
|
+
Oblique: "oblique"
|
|
3555
|
+
};
|
|
3556
|
+
throw new Error("Parametric maps ".concat(orientationText[orientation], " to the acquisition plane of the source data are not yet supported."));
|
|
3557
|
+
case 15:
|
|
3558
|
+
// Pre-compute the indices and metadata so that we don't have to call
|
|
3559
|
+
// a function for each imageId in the for loop.
|
|
3560
|
+
imageIdMaps = imageIds.reduce(function (acc, curr, index) {
|
|
3561
|
+
acc.indices[curr] = index;
|
|
3562
|
+
acc.metadata[curr] = metadataProvider.get("instance", curr);
|
|
3563
|
+
return acc;
|
|
3564
|
+
}, {
|
|
3565
|
+
indices: {},
|
|
3566
|
+
metadata: {}
|
|
3567
|
+
});
|
|
3568
|
+
_context.next = 18;
|
|
3569
|
+
return insertPixelDataPlanar(pixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps);
|
|
3570
|
+
case 18:
|
|
3571
|
+
return _context.abrupt("return", {
|
|
3572
|
+
pixelData: pixelData
|
|
3573
|
+
});
|
|
3574
|
+
case 19:
|
|
3575
|
+
case "end":
|
|
3576
|
+
return _context.stop();
|
|
3577
|
+
}
|
|
3578
|
+
}, _callee);
|
|
3579
|
+
}));
|
|
3580
|
+
return _generateToolState.apply(this, arguments);
|
|
3581
|
+
}
|
|
3582
|
+
function insertPixelDataPlanar(sourcePixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps) {
|
|
3583
|
+
var targetPixelData = new sourcePixelData.constructor(sourcePixelData.length);
|
|
3584
|
+
var PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
3585
|
+
Rows = multiframe.Rows,
|
|
3586
|
+
Columns = multiframe.Columns;
|
|
3587
|
+
var sliceLength = Columns * Rows;
|
|
3588
|
+
var numSlices = PerFrameFunctionalGroupsSequence.length;
|
|
3589
|
+
for (var i = 0; i < numSlices; i++) {
|
|
3590
|
+
var sourceSliceDataView = new sourcePixelData.constructor(sourcePixelData.buffer, i * sliceLength, sliceLength);
|
|
3591
|
+
var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
3592
|
+
if (!imageId) {
|
|
3593
|
+
console.warn("Image not present in stack, can't import frame : " + i + ".");
|
|
3594
|
+
continue;
|
|
3595
|
+
}
|
|
3596
|
+
var sourceImageMetadata = imageIdMaps.metadata[imageId];
|
|
3597
|
+
if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
|
|
3598
|
+
throw new Error("Parametric map have different geometry dimensions (Rows and Columns) " + "respect to the source image reference frame. This is not yet supported.");
|
|
3599
|
+
}
|
|
3600
|
+
var imageIdIndex = imageIdMaps.indices[imageId];
|
|
3601
|
+
var byteOffset = sliceLength * imageIdIndex * targetPixelData.BYTES_PER_ELEMENT;
|
|
3602
|
+
var targetSliceDataView = new targetPixelData.constructor(targetPixelData.buffer, byteOffset, sliceLength);
|
|
3603
|
+
// Copy from source to target which works for parametric maps with same orientation.
|
|
3604
|
+
// TODO: Find a dataset with parametric map in a different orientation and add finish this implementation
|
|
3605
|
+
targetSliceDataView.set(sourceSliceDataView);
|
|
3606
|
+
}
|
|
3607
|
+
return targetPixelData;
|
|
3608
|
+
}
|
|
3609
|
+
function getPixelData(multiframe) {
|
|
3610
|
+
var TypedArrayClass;
|
|
3611
|
+
var data;
|
|
3612
|
+
if (multiframe.PixelData) {
|
|
3613
|
+
var _multiframe$PixelRepr;
|
|
3614
|
+
var validTypedArrays = multiframe.BitsAllocated === 16 ? [Uint16Array, Int16Array] : [Uint32Array, Int32Array];
|
|
3615
|
+
TypedArrayClass = validTypedArrays[(_multiframe$PixelRepr = multiframe.PixelRepresentation) !== null && _multiframe$PixelRepr !== void 0 ? _multiframe$PixelRepr : 0];
|
|
3616
|
+
data = multiframe.PixelData;
|
|
3617
|
+
} else if (multiframe.FloatPixelData) {
|
|
3618
|
+
TypedArrayClass = Float32Array;
|
|
3619
|
+
data = multiframe.FloatPixelData;
|
|
3620
|
+
} else if (multiframe.DoubleFloatPixelData) {
|
|
3621
|
+
TypedArrayClass = Float64Array;
|
|
3622
|
+
data = multiframe.DoubleFloatPixelData;
|
|
3623
|
+
}
|
|
3624
|
+
if (data === undefined) {
|
|
3625
|
+
dcmjs.log.error("This parametric map pixel data is undefined.");
|
|
3626
|
+
}
|
|
3627
|
+
if (Array.isArray(data)) {
|
|
3628
|
+
data = data[0];
|
|
3629
|
+
}
|
|
3630
|
+
return new TypedArrayClass(data);
|
|
3631
|
+
}
|
|
3632
|
+
function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
|
|
3633
|
+
var imageId = undefined;
|
|
3634
|
+
if (!multiframe) {
|
|
3635
|
+
return imageId;
|
|
3636
|
+
}
|
|
3637
|
+
var FrameOfReferenceUID = multiframe.FrameOfReferenceUID,
|
|
3638
|
+
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
3639
|
+
SourceImageSequence = multiframe.SourceImageSequence,
|
|
3640
|
+
ReferencedSeriesSequence = multiframe.ReferencedSeriesSequence;
|
|
3641
|
+
if (!PerFrameFunctionalGroupsSequence || PerFrameFunctionalGroupsSequence.length === 0) {
|
|
3642
|
+
return imageId;
|
|
3643
|
+
}
|
|
3644
|
+
var PerFrameFunctionalGroup = PerFrameFunctionalGroupsSequence[frameSegment];
|
|
3645
|
+
if (!PerFrameFunctionalGroup) {
|
|
3646
|
+
return imageId;
|
|
3647
|
+
}
|
|
3648
|
+
var frameSourceImageSequence = undefined;
|
|
3649
|
+
if (PerFrameFunctionalGroup.DerivationImageSequence) {
|
|
3650
|
+
var DerivationImageSequence = PerFrameFunctionalGroup.DerivationImageSequence;
|
|
3651
|
+
if (Array.isArray(DerivationImageSequence)) {
|
|
3652
|
+
if (DerivationImageSequence.length !== 0) {
|
|
3653
|
+
DerivationImageSequence = DerivationImageSequence[0];
|
|
3654
|
+
} else {
|
|
3655
|
+
DerivationImageSequence = undefined;
|
|
3656
|
+
}
|
|
3657
|
+
}
|
|
3658
|
+
if (DerivationImageSequence) {
|
|
3659
|
+
frameSourceImageSequence = DerivationImageSequence.SourceImageSequence;
|
|
3660
|
+
if (Array.isArray(frameSourceImageSequence)) {
|
|
3661
|
+
if (frameSourceImageSequence.length !== 0) {
|
|
3662
|
+
frameSourceImageSequence = frameSourceImageSequence[0];
|
|
3663
|
+
} else {
|
|
3664
|
+
frameSourceImageSequence = undefined;
|
|
3665
|
+
}
|
|
3666
|
+
}
|
|
3667
|
+
}
|
|
3668
|
+
} else if (SourceImageSequence && SourceImageSequence.length !== 0) {
|
|
3669
|
+
console.warn("DerivationImageSequence not present, using SourceImageSequence assuming SEG has the same geometry as the source image.");
|
|
3670
|
+
frameSourceImageSequence = SourceImageSequence[frameSegment];
|
|
3671
|
+
}
|
|
3672
|
+
if (frameSourceImageSequence) {
|
|
3673
|
+
imageId = getImageIdOfSourceImageBySourceImageSequence(frameSourceImageSequence, sopUIDImageIdIndexMap);
|
|
3674
|
+
}
|
|
3675
|
+
if (imageId === undefined && ReferencedSeriesSequence) {
|
|
3676
|
+
var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence) ? ReferencedSeriesSequence[0] : ReferencedSeriesSequence;
|
|
3677
|
+
var ReferencedSeriesInstanceUID = referencedSeriesSequence.SeriesInstanceUID;
|
|
3678
|
+
imageId = getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
|
|
3679
|
+
}
|
|
3680
|
+
return imageId;
|
|
3681
|
+
}
|
|
3682
|
+
function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
|
|
3683
|
+
var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
|
|
3684
|
+
ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
3685
|
+
return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
|
|
3686
|
+
}
|
|
3687
|
+
function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
|
|
3688
|
+
if (ReferencedSeriesInstanceUID === undefined || PerFrameFunctionalGroup.PlanePositionSequence === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient === undefined) {
|
|
3689
|
+
return undefined;
|
|
3690
|
+
}
|
|
3691
|
+
for (var imageIdsIndex = 0; imageIdsIndex < imageIds.length; ++imageIdsIndex) {
|
|
3692
|
+
var sourceImageMetadata = metadataProvider.get("instance", imageIds[imageIdsIndex]);
|
|
3693
|
+
if (sourceImageMetadata === undefined || sourceImageMetadata.ImagePositionPatient === undefined || sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID || sourceImageMetadata.SeriesInstanceUID !== ReferencedSeriesInstanceUID) {
|
|
3694
|
+
continue;
|
|
3695
|
+
}
|
|
3696
|
+
if (compareArrays(PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient, sourceImageMetadata.ImagePositionPatient, tolerance)) {
|
|
3697
|
+
return imageIds[imageIdsIndex];
|
|
3698
|
+
}
|
|
3699
|
+
}
|
|
3700
|
+
}
|
|
3701
|
+
function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
|
|
3702
|
+
var imageId = sopUIDImageIdIndexMap[sopInstanceUid];
|
|
3703
|
+
if (!imageId) {
|
|
3704
|
+
return;
|
|
3705
|
+
}
|
|
3706
|
+
var imageIdFrameNumber = Number(imageId.split("frame=")[1]);
|
|
3707
|
+
return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
|
|
3708
|
+
}
|
|
3709
|
+
var ParametricMapObj = {
|
|
3710
|
+
generateToolState: generateToolState$2
|
|
3711
|
+
};
|
|
3712
|
+
|
|
3505
3713
|
var CornerstoneSR = {
|
|
3506
3714
|
Length: Length$1,
|
|
3507
3715
|
FreehandRoi: FreehandRoi,
|
|
@@ -3517,6 +3725,9 @@
|
|
|
3517
3725
|
var CornerstoneSEG = {
|
|
3518
3726
|
Segmentation: Segmentation$3
|
|
3519
3727
|
};
|
|
3728
|
+
var CornerstonePMAP = {
|
|
3729
|
+
ParametricMap: ParametricMapObj
|
|
3730
|
+
};
|
|
3520
3731
|
|
|
3521
3732
|
var CORNERSTONE_3D_TAG = "Cornerstone3DTools@^0.1.0";
|
|
3522
3733
|
|
|
@@ -5151,7 +5362,7 @@
|
|
|
5151
5362
|
* list containing the track of segments per frame
|
|
5152
5363
|
* list containing the track of segments per frame for each labelMap (available only for the overlapping case).
|
|
5153
5364
|
*/
|
|
5154
|
-
function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
5365
|
+
function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
|
|
5155
5366
|
var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
5156
5367
|
var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
|
|
5157
5368
|
return generateToolStateCornerstoneLegacy(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
|
|
@@ -5161,6 +5372,19 @@
|
|
|
5161
5372
|
__proto__: null,
|
|
5162
5373
|
generateLabelMaps2DFrom3D: generateLabelMaps2DFrom3D,
|
|
5163
5374
|
generateSegmentation: generateSegmentation,
|
|
5375
|
+
generateToolState: generateToolState$1
|
|
5376
|
+
});
|
|
5377
|
+
|
|
5378
|
+
var ParametricMap$1 = CornerstonePMAP.ParametricMap;
|
|
5379
|
+
var generateToolStateCornerstone = ParametricMap$1.generateToolState;
|
|
5380
|
+
function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
5381
|
+
var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
5382
|
+
var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
|
|
5383
|
+
return generateToolStateCornerstone(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
|
|
5384
|
+
}
|
|
5385
|
+
|
|
5386
|
+
var ParametricMap = /*#__PURE__*/Object.freeze({
|
|
5387
|
+
__proto__: null,
|
|
5164
5388
|
generateToolState: generateToolState
|
|
5165
5389
|
});
|
|
5166
5390
|
|
|
@@ -5525,6 +5749,9 @@
|
|
|
5525
5749
|
var Cornerstone3DSEG = {
|
|
5526
5750
|
Segmentation: Segmentation$1
|
|
5527
5751
|
};
|
|
5752
|
+
var Cornerstone3DPMAP = {
|
|
5753
|
+
ParametricMap: ParametricMap
|
|
5754
|
+
};
|
|
5528
5755
|
var Cornerstone3DRT = {
|
|
5529
5756
|
RTSS: RTSS
|
|
5530
5757
|
};
|
|
@@ -5724,11 +5951,17 @@
|
|
|
5724
5951
|
Cornerstone3D: Cornerstone3DSEG,
|
|
5725
5952
|
VTKjs: VTKjsSEG
|
|
5726
5953
|
};
|
|
5954
|
+
var adaptersPMAP = {
|
|
5955
|
+
Cornerstone: CornerstonePMAP,
|
|
5956
|
+
Cornerstone3D: Cornerstone3DPMAP
|
|
5957
|
+
// VTKjs: VTKjsPMAP
|
|
5958
|
+
};
|
|
5727
5959
|
var adaptersRT = {
|
|
5728
5960
|
Cornerstone3D: Cornerstone3DRT
|
|
5729
5961
|
};
|
|
5730
5962
|
|
|
5731
5963
|
exports.Enums = index;
|
|
5964
|
+
exports.adaptersPMAP = adaptersPMAP;
|
|
5732
5965
|
exports.adaptersRT = adaptersRT;
|
|
5733
5966
|
exports.adaptersSEG = adaptersSEG;
|
|
5734
5967
|
exports.adaptersSR = adaptersSR;
|