@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.
Files changed (28) hide show
  1. package/dist/esm/adapters/Cornerstone/ParametricMap.d.ts +7 -0
  2. package/dist/esm/adapters/Cornerstone/ParametricMap.js +216 -0
  3. package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +2 -19
  4. package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +6 -79
  5. package/dist/esm/adapters/Cornerstone/index.d.ts +8 -1
  6. package/dist/esm/adapters/Cornerstone/index.js +5 -1
  7. package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.d.ts +3 -0
  8. package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.js +11 -0
  9. package/dist/esm/adapters/Cornerstone3D/ParametricMap/index.d.ts +1 -0
  10. package/dist/esm/adapters/Cornerstone3D/ParametricMap/index.js +1 -0
  11. package/dist/esm/adapters/Cornerstone3D/index.d.ts +5 -1
  12. package/dist/esm/adapters/Cornerstone3D/index.js +7 -3
  13. package/dist/esm/adapters/helpers/checkIfPerpendicular.d.ts +9 -0
  14. package/dist/esm/adapters/helpers/checkIfPerpendicular.js +15 -0
  15. package/dist/esm/adapters/helpers/checkOrientation.d.ts +1 -0
  16. package/dist/esm/adapters/helpers/checkOrientation.js +24 -0
  17. package/dist/esm/adapters/helpers/compareArrays.d.ts +9 -0
  18. package/dist/esm/adapters/helpers/compareArrays.js +24 -0
  19. package/dist/esm/adapters/helpers/getDatasetsFromImages.d.ts +9 -0
  20. package/dist/esm/adapters/helpers/getDatasetsFromImages.js +41 -0
  21. package/dist/esm/adapters/index.d.ts +13 -1
  22. package/dist/esm/adapters/index.js +8 -3
  23. package/dist/esm/index.d.ts +2 -2
  24. package/dist/esm/index.js +1 -1
  25. package/dist/esm/node_modules/lodash.clonedeep/index.js +1692 -0
  26. package/dist/umd/adapters.umd.js +378 -145
  27. package/dist/umd/adapters.umd.js.map +1 -1
  28. package/package.json +14 -8
@@ -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$4 = dcmjs.normalizers.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$4 = dcmjs.data.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$4.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)) {
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$4.uid()],
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$1 = dcmjs.utilities.DicomMessage,
1804
- DicomMetaDictionary$3 = dcmjs.utilities.DicomMetaDictionary;
1805
- var Normalizer$3 = dcmjs.normalizers.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$3
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 datasets = [];
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$3(imageIds, arrayBuffer, metadataProvider) {
1962
- var dicomData = DicomMessage$1.readFile(arrayBuffer);
1963
- var dataset = DicomMetaDictionary$3.naturalizeDataset(dicomData.dict);
1964
- dataset._meta = DicomMetaDictionary$3.namifyDataset(dicomData.meta);
1965
- var multiframe = Normalizer$3.normalizeToDataset([dataset]);
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$1(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
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$1(sopInstanceUid, frameNumber, imageIds, metadataProvider) {
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$2 = dcmjs.data.DicomMetaDictionary;
2245
- var Normalizer$2 = dcmjs.normalizers.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 datasets = [];
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$2(_x, _x2, _x3, _x4) {
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$2.naturalizeDataset(dicomData.dict);
2591
- dataset._meta = DicomMetaDictionary$2.namifyDataset(dicomData.meta);
2592
- multiframe = Normalizer$2.normalizeToDataset([dataset]);
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$2,
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$1,
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$1(imageIds, arrayBuffer, metadataProvider) {
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;