@cornerstonejs/adapters 1.82.7 → 1.83.1

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.
@@ -558,10 +558,10 @@ var index$1 = /*#__PURE__*/Object.freeze({
558
558
  var TID1500$1 = utilities.TID1500,
559
559
  addAccessors$1 = utilities.addAccessors;
560
560
  var StructuredReport$1 = derivations.StructuredReport;
561
- var Normalizer$4 = normalizers.Normalizer;
561
+ var Normalizer$6 = normalizers.Normalizer;
562
562
  var TID1500MeasurementReport$1 = TID1500$1.TID1500MeasurementReport,
563
563
  TID1501MeasurementGroup$1 = TID1500$1.TID1501MeasurementGroup;
564
- var DicomMetaDictionary$4 = data.DicomMetaDictionary;
564
+ var DicomMetaDictionary$6 = data.DicomMetaDictionary;
565
565
  var FINDING$2 = {
566
566
  CodingSchemeDesignator: "DCM",
567
567
  CodeValue: "121071"
@@ -690,7 +690,7 @@ var MeasurementReport$1 = /*#__PURE__*/function () {
690
690
  ReferencedSOPClassUID: sopCommonModule.sopClassUID,
691
691
  ReferencedSOPInstanceUID: sopCommonModule.sopInstanceUID
692
692
  };
693
- if (Normalizer$4.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)) {
693
+ if (Normalizer$6.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)) {
694
694
  ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
695
695
  }
696
696
 
@@ -731,7 +731,7 @@ var MeasurementReport$1 = /*#__PURE__*/function () {
731
731
  vr: "UI"
732
732
  },
733
733
  ImplementationClassUID: {
734
- Value: [DicomMetaDictionary$4.uid()],
734
+ Value: [DicomMetaDictionary$6.uid()],
735
735
  // TODO: could be git hash or other valid id
736
736
  vr: "UI"
737
737
  },
@@ -1787,6 +1787,44 @@ RectangleRoi.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier
1787
1787
  };
1788
1788
  MeasurementReport$1.registerTool(RectangleRoi);
1789
1789
 
1790
+ var DicomMessage$3 = data.DicomMessage, DicomMetaDictionary$5 = data.DicomMetaDictionary;
1791
+ var Normalizer$5 = normalizers.Normalizer;
1792
+ /**
1793
+ * Convert an array of cornerstone images into datasets
1794
+ *
1795
+ * @param images - An array of the cornerstone image objects
1796
+ * @param isMultiframe - Whether the images are multiframe
1797
+ * @param options - Options object that may contain:
1798
+ * - SpecificCharacterSet: character set to be set to each dataset
1799
+ */
1800
+ function getDatasetsFromImages(images, isMultiframe, options) {
1801
+ var datasets = [];
1802
+ if (isMultiframe) {
1803
+ var image = images[0];
1804
+ var arrayBuffer = image.data.byteArray.buffer;
1805
+ var dicomData = DicomMessage$3.readFile(arrayBuffer);
1806
+ var dataset = DicomMetaDictionary$5.naturalizeDataset(dicomData.dict);
1807
+ dataset._meta = DicomMetaDictionary$5.namifyDataset(dicomData.meta);
1808
+ datasets.push(dataset);
1809
+ }
1810
+ else {
1811
+ for (var i = 0; i < images.length; i++) {
1812
+ var image = images[i];
1813
+ var arrayBuffer = image.data.byteArray.buffer;
1814
+ var dicomData = DicomMessage$3.readFile(arrayBuffer);
1815
+ var dataset = DicomMetaDictionary$5.naturalizeDataset(dicomData.dict);
1816
+ dataset._meta = DicomMetaDictionary$5.namifyDataset(dicomData.meta);
1817
+ datasets.push(dataset);
1818
+ }
1819
+ }
1820
+ if (options === null || options === void 0 ? void 0 : options.SpecificCharacterSet) {
1821
+ datasets.forEach(function (dataset) {
1822
+ return (dataset.SpecificCharacterSet = options.SpecificCharacterSet);
1823
+ });
1824
+ }
1825
+ return Normalizer$5.normalizeToDataset(datasets);
1826
+ }
1827
+
1790
1828
  var _utilities$orientatio$1 = utilities.orientation,
1791
1829
  rotateDirectionCosinesInPlane$1 = _utilities$orientatio$1.rotateDirectionCosinesInPlane,
1792
1830
  flipIOP$1 = _utilities$orientatio$1.flipImageOrientationPatient,
@@ -1794,13 +1832,13 @@ var _utilities$orientatio$1 = utilities.orientation,
1794
1832
  rotateMatrix902D$1 = _utilities$orientatio$1.rotateMatrix902D;
1795
1833
  var datasetToBlob = utilities.datasetToBlob,
1796
1834
  BitArray$2 = utilities.BitArray,
1797
- DicomMessage$1 = utilities.DicomMessage,
1798
- DicomMetaDictionary$3 = utilities.DicomMetaDictionary;
1799
- var Normalizer$3 = normalizers.Normalizer;
1835
+ DicomMessage$2 = utilities.DicomMessage,
1836
+ DicomMetaDictionary$4 = utilities.DicomMetaDictionary;
1837
+ var Normalizer$4 = normalizers.Normalizer;
1800
1838
  var SegmentationDerivation$2 = derivations.Segmentation;
1801
1839
  var Segmentation$5 = {
1802
1840
  generateSegmentation: generateSegmentation$3,
1803
- generateToolState: generateToolState$3
1841
+ generateToolState: generateToolState$5
1804
1842
  };
1805
1843
 
1806
1844
  /**
@@ -1920,25 +1958,7 @@ function _getSegCount(seg, segments) {
1920
1958
  * @returns {Object} The Seg derived dataSet.
1921
1959
  */
1922
1960
  function _createSegFromImages$1(images, isMultiframe, options) {
1923
- var datasets = [];
1924
- if (isMultiframe) {
1925
- var image = images[0];
1926
- var arrayBuffer = image.data.byteArray.buffer;
1927
- var dicomData = DicomMessage$1.readFile(arrayBuffer);
1928
- var dataset = DicomMetaDictionary$3.naturalizeDataset(dicomData.dict);
1929
- dataset._meta = DicomMetaDictionary$3.namifyDataset(dicomData.meta);
1930
- datasets.push(dataset);
1931
- } else {
1932
- for (var i = 0; i < images.length; i++) {
1933
- var _image = images[i];
1934
- var _arrayBuffer = _image.data.byteArray.buffer;
1935
- var _dicomData = DicomMessage$1.readFile(_arrayBuffer);
1936
- var _dataset = DicomMetaDictionary$3.naturalizeDataset(_dicomData.dict);
1937
- _dataset._meta = DicomMetaDictionary$3.namifyDataset(_dicomData.meta);
1938
- datasets.push(_dataset);
1939
- }
1940
- }
1941
- var multiframe = Normalizer$3.normalizeToDataset(datasets);
1961
+ var multiframe = getDatasetsFromImages(images, isMultiframe);
1942
1962
  return new SegmentationDerivation$2([multiframe], options);
1943
1963
  }
1944
1964
 
@@ -1952,11 +1972,11 @@ function _createSegFromImages$1(images, isMultiframe, options) {
1952
1972
  * @returns {Object} The toolState and an object from which the
1953
1973
  * segment metadata can be derived.
1954
1974
  */
1955
- function generateToolState$3(imageIds, arrayBuffer, metadataProvider) {
1956
- var dicomData = DicomMessage$1.readFile(arrayBuffer);
1957
- var dataset = DicomMetaDictionary$3.naturalizeDataset(dicomData.dict);
1958
- dataset._meta = DicomMetaDictionary$3.namifyDataset(dicomData.meta);
1959
- var multiframe = Normalizer$3.normalizeToDataset([dataset]);
1975
+ function generateToolState$5(imageIds, arrayBuffer, metadataProvider) {
1976
+ var dicomData = DicomMessage$2.readFile(arrayBuffer);
1977
+ var dataset = DicomMetaDictionary$4.naturalizeDataset(dicomData.dict);
1978
+ dataset._meta = DicomMetaDictionary$4.namifyDataset(dicomData.meta);
1979
+ var multiframe = Normalizer$4.normalizeToDataset([dataset]);
1960
1980
  var imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
1961
1981
  if (!imagePlaneModule) {
1962
1982
  console.warn("Insufficient metadata, imagePlaneModule missing.");
@@ -2071,7 +2091,7 @@ function addImageIdSpecificBrushToolState(toolState, imageId, segmentIndex, pixe
2071
2091
  function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider) {
2072
2092
  var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
2073
2093
  ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
2074
- return ReferencedFrameNumber ? getImageIdOfReferencedFrame$1(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
2094
+ return ReferencedFrameNumber ? getImageIdOfReferencedFrame$2(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
2075
2095
  }
2076
2096
 
2077
2097
  /**
@@ -2105,7 +2125,7 @@ function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds,
2105
2125
  * from the cornerstone imageIds.
2106
2126
  * @return {String} The imageId that corresponds to the sopInstanceUid.
2107
2127
  */
2108
- function getImageIdOfReferencedFrame$1(sopInstanceUid, frameNumber, imageIds, metadataProvider) {
2128
+ function getImageIdOfReferencedFrame$2(sopInstanceUid, frameNumber, imageIds, metadataProvider) {
2109
2129
  var imageId = imageIds.find(function (imageId) {
2110
2130
  var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
2111
2131
  if (!sopCommonModule) {
@@ -2210,6 +2230,70 @@ function getSegmentMetadata$1(multiframe) {
2210
2230
  };
2211
2231
  }
2212
2232
 
2233
+ /**
2234
+ * Returns true if iop1 and iop2 are perpendicular within a tolerance.
2235
+ *
2236
+ * @param iop1 - First ImageOrientationPatient
2237
+ * @param iop2 - Second ImageOrientationPatient
2238
+ * @param tolerance - Tolerance
2239
+ * @returns True if iop1 and iop2 are equal.
2240
+ */
2241
+ function checkIfPerpendicular(iop1, iop2, tolerance) {
2242
+ var absDotColumnCosines = Math.abs(iop1[0] * iop2[0] + iop1[1] * iop2[1] + iop1[2] * iop2[2]);
2243
+ var absDotRowCosines = Math.abs(iop1[3] * iop2[3] + iop1[4] * iop2[4] + iop1[5] * iop2[5]);
2244
+ return ((absDotColumnCosines < tolerance ||
2245
+ Math.abs(absDotColumnCosines - 1) < tolerance) &&
2246
+ (absDotRowCosines < tolerance ||
2247
+ Math.abs(absDotRowCosines - 1) < tolerance));
2248
+ }
2249
+
2250
+ var nearlyEqual = utilities.orientation.nearlyEqual;
2251
+ /**
2252
+ * Returns true if array1 and array2 are equal within a tolerance.
2253
+ *
2254
+ * @param array1 - First array
2255
+ * @param array2 - Second array
2256
+ * @param tolerance - Tolerance
2257
+ * @returns True if array1 and array2 are equal.
2258
+ */
2259
+ function compareArrays(array1, array2, tolerance) {
2260
+ if (array1.length !== array2.length) {
2261
+ return false;
2262
+ }
2263
+ for (var i = 0; i < array1.length; ++i) {
2264
+ if (!nearlyEqual(array1[i], array2[i], tolerance)) {
2265
+ return false;
2266
+ }
2267
+ }
2268
+ return true;
2269
+ }
2270
+
2271
+ function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) {
2272
+ var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence, PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence;
2273
+ var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence
2274
+ ? SharedFunctionalGroupsSequence.PlaneOrientationSequence
2275
+ .ImageOrientationPatient
2276
+ : undefined;
2277
+ // Check if in plane.
2278
+ var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0];
2279
+ var iop = sharedImageOrientationPatient ||
2280
+ PerFrameFunctionalGroups.PlaneOrientationSequence
2281
+ .ImageOrientationPatient;
2282
+ var inPlane = validOrientations.some(function (operation) {
2283
+ return compareArrays(iop, operation, tolerance);
2284
+ });
2285
+ if (inPlane) {
2286
+ return "Planar";
2287
+ }
2288
+ if (checkIfPerpendicular(iop, validOrientations[0], tolerance) &&
2289
+ sourceDataDimensions.includes(multiframe.Rows) &&
2290
+ sourceDataDimensions.includes(multiframe.Columns)) {
2291
+ // Perpendicular and fits on same grid.
2292
+ return "Perpendicular";
2293
+ }
2294
+ return "Oblique";
2295
+ }
2296
+
2213
2297
  /**
2214
2298
  * Cornerstone adapters events
2215
2299
  */
@@ -2231,12 +2315,11 @@ var _utilities$orientatio = utilities.orientation,
2231
2315
  rotateDirectionCosinesInPlane = _utilities$orientatio.rotateDirectionCosinesInPlane,
2232
2316
  flipIOP = _utilities$orientatio.flipImageOrientationPatient,
2233
2317
  flipMatrix2D = _utilities$orientatio.flipMatrix2D,
2234
- rotateMatrix902D = _utilities$orientatio.rotateMatrix902D,
2235
- nearlyEqual = _utilities$orientatio.nearlyEqual;
2318
+ rotateMatrix902D = _utilities$orientatio.rotateMatrix902D;
2236
2319
  var BitArray$1 = data.BitArray,
2237
- DicomMessage = data.DicomMessage,
2238
- DicomMetaDictionary$2 = data.DicomMetaDictionary;
2239
- var Normalizer$2 = normalizers.Normalizer;
2320
+ DicomMessage$1 = data.DicomMessage,
2321
+ DicomMetaDictionary$3 = data.DicomMetaDictionary;
2322
+ var Normalizer$3 = normalizers.Normalizer;
2240
2323
  var SegmentationDerivation$1 = derivations.Segmentation;
2241
2324
  var _utilities$compressio = utilities.compression,
2242
2325
  encode = _utilities$compressio.encode,
@@ -2381,27 +2464,7 @@ function _getLabelmapsFromReferencedFrameIndicies(labelmap3D, referencedFrameInd
2381
2464
  * @returns {Object} The Seg derived dataSet.
2382
2465
  */
2383
2466
  function _createSegFromImages(images, isMultiframe, options) {
2384
- var datasets = [];
2385
- if (isMultiframe) {
2386
- var image = images[0];
2387
- var arrayBuffer = image.data.byteArray.buffer;
2388
- var dicomData = DicomMessage.readFile(arrayBuffer);
2389
- var dataset = DicomMetaDictionary$2.naturalizeDataset(dicomData.dict);
2390
- dataset._meta = DicomMetaDictionary$2.namifyDataset(dicomData.meta);
2391
- dataset.SpecificCharacterSet = "ISO_IR 192";
2392
- datasets.push(dataset);
2393
- } else {
2394
- for (var i = 0; i < images.length; i++) {
2395
- var _image = images[i];
2396
- var _arrayBuffer = _image.data.byteArray.buffer;
2397
- var _dicomData = DicomMessage.readFile(_arrayBuffer);
2398
- var _dataset = DicomMetaDictionary$2.naturalizeDataset(_dicomData.dict);
2399
- _dataset._meta = DicomMetaDictionary$2.namifyDataset(_dicomData.meta);
2400
- _dataset.SpecificCharacterSet = "ISO_IR 192";
2401
- datasets.push(_dataset);
2402
- }
2403
- }
2404
- var multiframe = Normalizer$2.normalizeToDataset(datasets);
2467
+ var multiframe = getDatasetsFromImages(images, isMultiframe);
2405
2468
  return new SegmentationDerivation$1([multiframe], options);
2406
2469
  }
2407
2470
 
@@ -2420,7 +2483,7 @@ function _createSegFromImages(images, isMultiframe, options) {
2420
2483
  * @return {[][][]} 3D list containing the track of segments per frame for each labelMap
2421
2484
  * (available only for the overlapping case).
2422
2485
  */
2423
- function generateToolState$2(_x, _x2, _x3, _x4) {
2486
+ function generateToolState$4(_x, _x2, _x3, _x4) {
2424
2487
  return _generateToolState.apply(this, arguments);
2425
2488
  } // function insertPixelDataPerpendicular(
2426
2489
  // segmentsOnFrame,
@@ -2580,10 +2643,10 @@ function _generateToolState() {
2580
2643
  while (1) switch (_context.prev = _context.next) {
2581
2644
  case 0:
2582
2645
  _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;
2583
- dicomData = DicomMessage.readFile(arrayBuffer);
2584
- dataset = DicomMetaDictionary$2.naturalizeDataset(dicomData.dict);
2585
- dataset._meta = DicomMetaDictionary$2.namifyDataset(dicomData.meta);
2586
- multiframe = Normalizer$2.normalizeToDataset([dataset]);
2646
+ dicomData = DicomMessage$1.readFile(arrayBuffer);
2647
+ dataset = DicomMetaDictionary$3.naturalizeDataset(dicomData.dict);
2648
+ dataset._meta = DicomMetaDictionary$3.namifyDataset(dicomData.meta);
2649
+ multiframe = Normalizer$3.normalizeToDataset([dataset]);
2587
2650
  imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
2588
2651
  generalSeriesModule = metadataProvider.get("generalSeriesModule", imageIds[0]);
2589
2652
  SeriesInstanceUID = generalSeriesModule.seriesInstanceUID;
@@ -2642,7 +2705,7 @@ function _generateToolState() {
2642
2705
  if (overlapping) {
2643
2706
  insertFunction = insertOverlappingPixelDataPlanar;
2644
2707
  } else {
2645
- insertFunction = insertPixelDataPlanar;
2708
+ insertFunction = insertPixelDataPlanar$1;
2646
2709
  }
2647
2710
  return _context.abrupt("break", 37);
2648
2711
  case 35:
@@ -2710,7 +2773,7 @@ function _generateToolState() {
2710
2773
  }));
2711
2774
  return _generateToolState.apply(this, arguments);
2712
2775
  }
2713
- function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
2776
+ function findReferenceSourceImageId$1(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
2714
2777
  var imageId = undefined;
2715
2778
  if (!multiframe) {
2716
2779
  return imageId;
@@ -2751,12 +2814,12 @@ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadata
2751
2814
  frameSourceImageSequence = SourceImageSequence[frameSegment];
2752
2815
  }
2753
2816
  if (frameSourceImageSequence) {
2754
- imageId = getImageIdOfSourceImageBySourceImageSequence(frameSourceImageSequence, sopUIDImageIdIndexMap);
2817
+ imageId = getImageIdOfSourceImageBySourceImageSequence$1(frameSourceImageSequence, sopUIDImageIdIndexMap);
2755
2818
  }
2756
2819
  if (imageId === undefined && ReferencedSeriesSequence) {
2757
2820
  var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence) ? ReferencedSeriesSequence[0] : ReferencedSeriesSequence;
2758
2821
  var ReferencedSeriesInstanceUID = referencedSeriesSequence.SeriesInstanceUID;
2759
- imageId = getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
2822
+ imageId = getImageIdOfSourceImagebyGeometry$1(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
2760
2823
  }
2761
2824
  return imageId;
2762
2825
  }
@@ -2793,7 +2856,7 @@ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations
2793
2856
  console.warn("Could not retrieve the segment index for frame segment " + frameSegment + ", skipping this frame.");
2794
2857
  return 0; // continue
2795
2858
  }
2796
- var imageId = findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
2859
+ var imageId = findReferenceSourceImageId$1(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
2797
2860
  if (!imageId) {
2798
2861
  console.warn("Image not present in stack, can't import frame : " + frameSegment + ".");
2799
2862
  return 0; // continue
@@ -2902,7 +2965,7 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
2902
2965
  if (!alignedPixelDataI) {
2903
2966
  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.");
2904
2967
  }
2905
- var imageId = findReferenceSourceImageId(multiframe, _i2, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
2968
+ var imageId = findReferenceSourceImageId$1(multiframe, _i2, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
2906
2969
  if (!imageId) {
2907
2970
  console.warn("Image not present in stack, can't import frame : " + _i2 + ".");
2908
2971
  i = _i2;
@@ -2970,7 +3033,7 @@ var getSegmentIndex = function getSegmentIndex(multiframe, frame) {
2970
3033
  var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[frame];
2971
3034
  return PerFrameFunctionalGroups && PerFrameFunctionalGroups.SegmentIdentificationSequence ? PerFrameFunctionalGroups.SegmentIdentificationSequence.ReferencedSegmentNumber : SharedFunctionalGroupsSequence.SegmentIdentificationSequence ? SharedFunctionalGroupsSequence.SegmentIdentificationSequence.ReferencedSegmentNumber : undefined;
2972
3035
  };
2973
- function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, eventTarget, triggerEvent) {
3036
+ function insertPixelDataPlanar$1(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, eventTarget, triggerEvent) {
2974
3037
  var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
2975
3038
  PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
2976
3039
  Rows = multiframe.Rows,
@@ -3005,7 +3068,7 @@ function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBu
3005
3068
  if (!segmentsPixelIndices.has(segmentIndex)) {
3006
3069
  segmentsPixelIndices.set(segmentIndex, {});
3007
3070
  }
3008
- var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
3071
+ var imageId = findReferenceSourceImageId$1(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
3009
3072
  if (!imageId) {
3010
3073
  console.warn("Image not present in stack, can't import frame : " + i + ".");
3011
3074
  continue;
@@ -3061,41 +3124,6 @@ function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBu
3061
3124
  processInChunks();
3062
3125
  });
3063
3126
  }
3064
- function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) {
3065
- var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
3066
- PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence;
3067
- var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
3068
-
3069
- // Check if in plane.
3070
- var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0];
3071
- var iop = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
3072
- var inPlane = validOrientations.some(function (operation) {
3073
- return compareArrays(iop, operation, tolerance);
3074
- });
3075
- if (inPlane) {
3076
- return "Planar";
3077
- }
3078
- if (checkIfPerpendicular(iop, validOrientations[0], tolerance) && sourceDataDimensions.includes(multiframe.Rows) && sourceDataDimensions.includes(multiframe.Columns)) {
3079
- // Perpendicular and fits on same grid.
3080
- return "Perpendicular";
3081
- }
3082
- return "Oblique";
3083
- }
3084
-
3085
- /**
3086
- * checkIfPerpendicular - Returns true if iop1 and iop2 are perpendicular
3087
- * within a tolerance.
3088
- *
3089
- * @param {Number[6]} iop1 An ImageOrientationPatient array.
3090
- * @param {Number[6]} iop2 An ImageOrientationPatient array.
3091
- * @param {Number} tolerance.
3092
- * @return {Boolean} True if iop1 and iop2 are equal.
3093
- */
3094
- function checkIfPerpendicular(iop1, iop2, tolerance) {
3095
- var absDotColumnCosines = Math.abs(iop1[0] * iop2[0] + iop1[1] * iop2[1] + iop1[2] * iop2[2]);
3096
- var absDotRowCosines = Math.abs(iop1[3] * iop2[3] + iop1[4] * iop2[4] + iop1[5] * iop2[5]);
3097
- return (absDotColumnCosines < tolerance || Math.abs(absDotColumnCosines - 1) < tolerance) && (absDotRowCosines < tolerance || Math.abs(absDotRowCosines - 1) < tolerance);
3098
- }
3099
3127
 
3100
3128
  /**
3101
3129
  * unpackPixelData - Unpacks bit packed pixelData if the Segmentation is BINARY.
@@ -3158,10 +3186,10 @@ function getUnpackedChunks(data, maxBytesPerChunk) {
3158
3186
  * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
3159
3187
  * @return {String} The corresponding imageId.
3160
3188
  */
3161
- function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
3189
+ function getImageIdOfSourceImageBySourceImageSequence$1(SourceImageSequence, sopUIDImageIdIndexMap) {
3162
3190
  var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
3163
3191
  ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
3164
- return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
3192
+ return ReferencedFrameNumber ? getImageIdOfReferencedFrame$1(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
3165
3193
  }
3166
3194
 
3167
3195
  /**
@@ -3176,7 +3204,7 @@ function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUI
3176
3204
  *
3177
3205
  * @return {String} The corresponding imageId.
3178
3206
  */
3179
- function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
3207
+ function getImageIdOfSourceImagebyGeometry$1(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
3180
3208
  if (ReferencedSeriesInstanceUID === undefined || PerFrameFunctionalGroup.PlanePositionSequence === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient === undefined) {
3181
3209
  return undefined;
3182
3210
  }
@@ -3201,7 +3229,7 @@ function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfR
3201
3229
  * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
3202
3230
  * @return {String} The imageId that corresponds to the sopInstanceUid.
3203
3231
  */
3204
- function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
3232
+ function getImageIdOfReferencedFrame$1(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
3205
3233
  var imageId = sopUIDImageIdIndexMap[sopInstanceUid];
3206
3234
  if (!imageId) {
3207
3235
  return;
@@ -3283,27 +3311,6 @@ function alignPixelDataWithSourceData(pixelData2D, iop, orientations, tolerance)
3283
3311
  return rotateMatrix902D(rotateMatrix902D(rotateMatrix902D(pixelData2D)));
3284
3312
  }
3285
3313
  }
3286
-
3287
- /**
3288
- * compareArrays - Returns true if array1 and array2 are equal
3289
- * within a tolerance.
3290
- *
3291
- * @param {Number[]} array1 - An array.
3292
- * @param {Number[]} array2 - An array.
3293
- * @param {Number} tolerance.
3294
- * @return {Boolean} True if array1 and array2 are equal.
3295
- */
3296
- function compareArrays(array1, array2, tolerance) {
3297
- if (array1.length != array2.length) {
3298
- return false;
3299
- }
3300
- for (var i = 0; i < array1.length; ++i) {
3301
- if (!nearlyEqual(array1[i], array2[i], tolerance)) {
3302
- return false;
3303
- }
3304
- }
3305
- return true;
3306
- }
3307
3314
  function getSegmentMetadata(multiframe, seriesInstanceUid) {
3308
3315
  var segmentSequence = multiframe.SegmentSequence;
3309
3316
  var data = [];
@@ -3417,13 +3424,13 @@ function calculateCentroid(imageIdIndexBufferIndex, multiframe) {
3417
3424
  }
3418
3425
  var Segmentation$4 = {
3419
3426
  generateSegmentation: generateSegmentation$2,
3420
- generateToolState: generateToolState$2,
3427
+ generateToolState: generateToolState$4,
3421
3428
  fillSegmentation: fillSegmentation$1
3422
3429
  };
3423
3430
 
3424
3431
  var Segmentation$3 = {
3425
3432
  generateSegmentation: generateSegmentation$1,
3426
- generateToolState: generateToolState$1,
3433
+ generateToolState: generateToolState$3,
3427
3434
  fillSegmentation: fillSegmentation
3428
3435
  };
3429
3436
 
@@ -3464,7 +3471,7 @@ function generateSegmentation$1(images, labelmaps3DorBrushData) {
3464
3471
  * @returns {Object} The toolState and an object from which the
3465
3472
  * segment metadata can be derived.
3466
3473
  */
3467
- function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
3474
+ function generateToolState$3(imageIds, arrayBuffer, metadataProvider) {
3468
3475
  var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
3469
3476
  var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
3470
3477
  var cornerstoneToolsVersion = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 4;
@@ -3496,22 +3503,6 @@ function fillSegmentation(segmentation, inputLabelmaps3D) {
3496
3503
  console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
3497
3504
  }
3498
3505
 
3499
- var CornerstoneSR = {
3500
- Length: Length$1,
3501
- FreehandRoi: FreehandRoi,
3502
- Bidirectional: Bidirectional$1,
3503
- EllipticalRoi: EllipticalRoi,
3504
- CircleRoi: CircleRoi,
3505
- ArrowAnnotate: ArrowAnnotate$1,
3506
- MeasurementReport: MeasurementReport$1,
3507
- CobbAngle: CobbAngle$1,
3508
- Angle: Angle$1,
3509
- RectangleRoi: RectangleRoi
3510
- };
3511
- var CornerstoneSEG = {
3512
- Segmentation: Segmentation$3
3513
- };
3514
-
3515
3506
  /******************************************************************************
3516
3507
  Copyright (c) Microsoft Corporation.
3517
3508
 
@@ -3538,6 +3529,121 @@ var __assign = function () {
3538
3529
  };
3539
3530
  return __assign.apply(this, arguments);
3540
3531
  };
3532
+ function __awaiter(thisArg, _arguments, P, generator) {
3533
+ function adopt(value) {
3534
+ return value instanceof P ? value : new P(function (resolve) {
3535
+ resolve(value);
3536
+ });
3537
+ }
3538
+ return new (P || (P = Promise))(function (resolve, reject) {
3539
+ function fulfilled(value) {
3540
+ try {
3541
+ step(generator.next(value));
3542
+ } catch (e) {
3543
+ reject(e);
3544
+ }
3545
+ }
3546
+ function rejected(value) {
3547
+ try {
3548
+ step(generator["throw"](value));
3549
+ } catch (e) {
3550
+ reject(e);
3551
+ }
3552
+ }
3553
+ function step(result) {
3554
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
3555
+ }
3556
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
3557
+ });
3558
+ }
3559
+ function __generator(thisArg, body) {
3560
+ var _ = {
3561
+ label: 0,
3562
+ sent: function () {
3563
+ if (t[0] & 1) throw t[1];
3564
+ return t[1];
3565
+ },
3566
+ trys: [],
3567
+ ops: []
3568
+ },
3569
+ f,
3570
+ y,
3571
+ t,
3572
+ g;
3573
+ return g = {
3574
+ next: verb(0),
3575
+ "throw": verb(1),
3576
+ "return": verb(2)
3577
+ }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {
3578
+ return this;
3579
+ }), g;
3580
+ function verb(n) {
3581
+ return function (v) {
3582
+ return step([n, v]);
3583
+ };
3584
+ }
3585
+ function step(op) {
3586
+ if (f) throw new TypeError("Generator is already executing.");
3587
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
3588
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
3589
+ if (y = 0, t) op = [op[0] & 2, t.value];
3590
+ switch (op[0]) {
3591
+ case 0:
3592
+ case 1:
3593
+ t = op;
3594
+ break;
3595
+ case 4:
3596
+ _.label++;
3597
+ return {
3598
+ value: op[1],
3599
+ done: false
3600
+ };
3601
+ case 5:
3602
+ _.label++;
3603
+ y = op[1];
3604
+ op = [0];
3605
+ continue;
3606
+ case 7:
3607
+ op = _.ops.pop();
3608
+ _.trys.pop();
3609
+ continue;
3610
+ default:
3611
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
3612
+ _ = 0;
3613
+ continue;
3614
+ }
3615
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
3616
+ _.label = op[1];
3617
+ break;
3618
+ }
3619
+ if (op[0] === 6 && _.label < t[1]) {
3620
+ _.label = t[1];
3621
+ t = op;
3622
+ break;
3623
+ }
3624
+ if (t && _.label < t[2]) {
3625
+ _.label = t[2];
3626
+ _.ops.push(op);
3627
+ break;
3628
+ }
3629
+ if (t[2]) _.ops.pop();
3630
+ _.trys.pop();
3631
+ continue;
3632
+ }
3633
+ op = body.call(thisArg, _);
3634
+ } catch (e) {
3635
+ op = [6, e];
3636
+ y = 0;
3637
+ } finally {
3638
+ f = t = 0;
3639
+ }
3640
+ if (op[0] & 5) throw op[1];
3641
+ return {
3642
+ value: op[0] ? op[1] : void 0,
3643
+ done: true
3644
+ };
3645
+ }
3646
+ }
3541
3647
  function __spreadArray(to, from, pack) {
3542
3648
  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3543
3649
  if (ar || !(i in from)) {
@@ -3552,6 +3658,228 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
3552
3658
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
3553
3659
  };
3554
3660
 
3661
+ var DicomMessage = data.DicomMessage, DicomMetaDictionary$2 = data.DicomMetaDictionary;
3662
+ var Normalizer$2 = normalizers.Normalizer;
3663
+ function generateToolState$2(imageIds, arrayBuffer, metadataProvider, tolerance) {
3664
+ if (tolerance === void 0) { tolerance = 1e-3; }
3665
+ return __awaiter(this, void 0, void 0, function () {
3666
+ var dicomData, dataset, multiframe, imagePlaneModule, ImageOrientationPatient, validOrientations, pixelData, orientation, sopUIDImageIdIndexMap, orientationText, imageIdMaps;
3667
+ return __generator(this, function (_a) {
3668
+ switch (_a.label) {
3669
+ case 0:
3670
+ dicomData = DicomMessage.readFile(arrayBuffer);
3671
+ dataset = DicomMetaDictionary$2.naturalizeDataset(dicomData.dict);
3672
+ dataset._meta = DicomMetaDictionary$2.namifyDataset(dicomData.meta);
3673
+ multiframe = Normalizer$2.normalizeToDataset([dataset]);
3674
+ imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
3675
+ if (!imagePlaneModule) {
3676
+ console.warn("Insufficient metadata, imagePlaneModule missing.");
3677
+ }
3678
+ ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines)
3679
+ ? __spreadArray(__spreadArray([], imagePlaneModule.rowCosines, true), imagePlaneModule.columnCosines, true) : [
3680
+ imagePlaneModule.rowCosines.x,
3681
+ imagePlaneModule.rowCosines.y,
3682
+ imagePlaneModule.rowCosines.z,
3683
+ imagePlaneModule.columnCosines.x,
3684
+ imagePlaneModule.columnCosines.y,
3685
+ imagePlaneModule.columnCosines.z
3686
+ ];
3687
+ validOrientations = [ImageOrientationPatient];
3688
+ pixelData = getPixelData(multiframe);
3689
+ orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length], tolerance);
3690
+ sopUIDImageIdIndexMap = imageIds.reduce(function (acc, imageId) {
3691
+ var sopInstanceUID = metadataProvider.get("generalImageModule", imageId).sopInstanceUID;
3692
+ acc[sopInstanceUID] = imageId;
3693
+ return acc;
3694
+ }, {});
3695
+ if (orientation !== "Planar") {
3696
+ orientationText = {
3697
+ Perpendicular: "orthogonal",
3698
+ Oblique: "oblique"
3699
+ };
3700
+ throw new Error("Parametric maps ".concat(orientationText[orientation], " to the acquisition plane of the source data are not yet supported."));
3701
+ }
3702
+ imageIdMaps = imageIds.reduce(function (acc, curr, index) {
3703
+ acc.indices[curr] = index;
3704
+ acc.metadata[curr] = metadataProvider.get("instance", curr);
3705
+ return acc;
3706
+ }, { indices: {}, metadata: {} });
3707
+ return [4 /*yield*/, insertPixelDataPlanar(pixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps)];
3708
+ case 1:
3709
+ _a.sent();
3710
+ return [2 /*return*/, { pixelData: pixelData }];
3711
+ }
3712
+ });
3713
+ });
3714
+ }
3715
+ function insertPixelDataPlanar(sourcePixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps) {
3716
+ var targetPixelData = new sourcePixelData.constructor(sourcePixelData.length);
3717
+ var PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence, Rows = multiframe.Rows, Columns = multiframe.Columns;
3718
+ var sliceLength = Columns * Rows;
3719
+ var numSlices = PerFrameFunctionalGroupsSequence.length;
3720
+ for (var i = 0; i < numSlices; i++) {
3721
+ var sourceSliceDataView = new sourcePixelData.constructor(sourcePixelData.buffer, i * sliceLength, sliceLength);
3722
+ var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
3723
+ if (!imageId) {
3724
+ console.warn("Image not present in stack, can't import frame : " + i + ".");
3725
+ continue;
3726
+ }
3727
+ var sourceImageMetadata = imageIdMaps.metadata[imageId];
3728
+ if (Rows !== sourceImageMetadata.Rows ||
3729
+ Columns !== sourceImageMetadata.Columns) {
3730
+ throw new Error("Parametric map have different geometry dimensions (Rows and Columns) " +
3731
+ "respect to the source image reference frame. This is not yet supported.");
3732
+ }
3733
+ var imageIdIndex = imageIdMaps.indices[imageId];
3734
+ var byteOffset = sliceLength * imageIdIndex * targetPixelData.BYTES_PER_ELEMENT;
3735
+ var targetSliceDataView = new targetPixelData.constructor(targetPixelData.buffer, byteOffset, sliceLength);
3736
+ // Copy from source to target which works for parametric maps with same orientation.
3737
+ // TODO: Find a dataset with parametric map in a different orientation and add finish this implementation
3738
+ targetSliceDataView.set(sourceSliceDataView);
3739
+ }
3740
+ return targetPixelData;
3741
+ }
3742
+ function getPixelData(multiframe) {
3743
+ var _a;
3744
+ var TypedArrayClass;
3745
+ var data;
3746
+ if (multiframe.PixelData) {
3747
+ var validTypedArrays = multiframe.BitsAllocated === 16
3748
+ ? [Uint16Array, Int16Array]
3749
+ : [Uint32Array, Int32Array];
3750
+ TypedArrayClass = validTypedArrays[(_a = multiframe.PixelRepresentation) !== null && _a !== void 0 ? _a : 0];
3751
+ data = multiframe.PixelData;
3752
+ }
3753
+ else if (multiframe.FloatPixelData) {
3754
+ TypedArrayClass = Float32Array;
3755
+ data = multiframe.FloatPixelData;
3756
+ }
3757
+ else if (multiframe.DoubleFloatPixelData) {
3758
+ TypedArrayClass = Float64Array;
3759
+ data = multiframe.DoubleFloatPixelData;
3760
+ }
3761
+ if (data === undefined) {
3762
+ log.error("This parametric map pixel data is undefined.");
3763
+ }
3764
+ if (Array.isArray(data)) {
3765
+ data = data[0];
3766
+ }
3767
+ return new TypedArrayClass(data);
3768
+ }
3769
+ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
3770
+ var imageId = undefined;
3771
+ if (!multiframe) {
3772
+ return imageId;
3773
+ }
3774
+ var FrameOfReferenceUID = multiframe.FrameOfReferenceUID, PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence, SourceImageSequence = multiframe.SourceImageSequence, ReferencedSeriesSequence = multiframe.ReferencedSeriesSequence;
3775
+ if (!PerFrameFunctionalGroupsSequence ||
3776
+ PerFrameFunctionalGroupsSequence.length === 0) {
3777
+ return imageId;
3778
+ }
3779
+ var PerFrameFunctionalGroup = PerFrameFunctionalGroupsSequence[frameSegment];
3780
+ if (!PerFrameFunctionalGroup) {
3781
+ return imageId;
3782
+ }
3783
+ var frameSourceImageSequence = undefined;
3784
+ if (PerFrameFunctionalGroup.DerivationImageSequence) {
3785
+ var DerivationImageSequence = PerFrameFunctionalGroup.DerivationImageSequence;
3786
+ if (Array.isArray(DerivationImageSequence)) {
3787
+ if (DerivationImageSequence.length !== 0) {
3788
+ DerivationImageSequence = DerivationImageSequence[0];
3789
+ }
3790
+ else {
3791
+ DerivationImageSequence = undefined;
3792
+ }
3793
+ }
3794
+ if (DerivationImageSequence) {
3795
+ frameSourceImageSequence =
3796
+ DerivationImageSequence.SourceImageSequence;
3797
+ if (Array.isArray(frameSourceImageSequence)) {
3798
+ if (frameSourceImageSequence.length !== 0) {
3799
+ frameSourceImageSequence = frameSourceImageSequence[0];
3800
+ }
3801
+ else {
3802
+ frameSourceImageSequence = undefined;
3803
+ }
3804
+ }
3805
+ }
3806
+ }
3807
+ else if (SourceImageSequence && SourceImageSequence.length !== 0) {
3808
+ console.warn("DerivationImageSequence not present, using SourceImageSequence assuming SEG has the same geometry as the source image.");
3809
+ frameSourceImageSequence = SourceImageSequence[frameSegment];
3810
+ }
3811
+ if (frameSourceImageSequence) {
3812
+ imageId = getImageIdOfSourceImageBySourceImageSequence(frameSourceImageSequence, sopUIDImageIdIndexMap);
3813
+ }
3814
+ if (imageId === undefined && ReferencedSeriesSequence) {
3815
+ var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence)
3816
+ ? ReferencedSeriesSequence[0]
3817
+ : ReferencedSeriesSequence;
3818
+ var ReferencedSeriesInstanceUID = referencedSeriesSequence.SeriesInstanceUID;
3819
+ imageId = getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
3820
+ }
3821
+ return imageId;
3822
+ }
3823
+ function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
3824
+ var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID, ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
3825
+ return ReferencedFrameNumber
3826
+ ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap)
3827
+ : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
3828
+ }
3829
+ function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
3830
+ if (ReferencedSeriesInstanceUID === undefined ||
3831
+ PerFrameFunctionalGroup.PlanePositionSequence === undefined ||
3832
+ PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined ||
3833
+ PerFrameFunctionalGroup.PlanePositionSequence[0]
3834
+ .ImagePositionPatient === undefined) {
3835
+ return undefined;
3836
+ }
3837
+ for (var imageIdsIndex = 0; imageIdsIndex < imageIds.length; ++imageIdsIndex) {
3838
+ var sourceImageMetadata = metadataProvider.get("instance", imageIds[imageIdsIndex]);
3839
+ if (sourceImageMetadata === undefined ||
3840
+ sourceImageMetadata.ImagePositionPatient === undefined ||
3841
+ sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID ||
3842
+ sourceImageMetadata.SeriesInstanceUID !==
3843
+ ReferencedSeriesInstanceUID) {
3844
+ continue;
3845
+ }
3846
+ if (compareArrays(PerFrameFunctionalGroup.PlanePositionSequence[0]
3847
+ .ImagePositionPatient, sourceImageMetadata.ImagePositionPatient, tolerance)) {
3848
+ return imageIds[imageIdsIndex];
3849
+ }
3850
+ }
3851
+ }
3852
+ function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
3853
+ var imageId = sopUIDImageIdIndexMap[sopInstanceUid];
3854
+ if (!imageId) {
3855
+ return;
3856
+ }
3857
+ var imageIdFrameNumber = Number(imageId.split("frame=")[1]);
3858
+ return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
3859
+ }
3860
+ var ParametricMapObj = {
3861
+ generateToolState: generateToolState$2
3862
+ };
3863
+
3864
+ var CornerstoneSR = {
3865
+ Length: Length$1,
3866
+ FreehandRoi: FreehandRoi,
3867
+ Bidirectional: Bidirectional$1,
3868
+ EllipticalRoi: EllipticalRoi,
3869
+ CircleRoi: CircleRoi,
3870
+ ArrowAnnotate: ArrowAnnotate$1,
3871
+ MeasurementReport: MeasurementReport$1,
3872
+ CobbAngle: CobbAngle$1,
3873
+ Angle: Angle$1,
3874
+ RectangleRoi: RectangleRoi
3875
+ };
3876
+ var CornerstoneSEG = {
3877
+ Segmentation: Segmentation$3
3878
+ };
3879
+ var CornerstonePMAP = {
3880
+ ParametricMap: ParametricMapObj
3881
+ };
3882
+
3555
3883
  var CORNERSTONE_3D_TAG = "Cornerstone3DTools@^0.1.0";
3556
3884
 
3557
3885
  // This is a custom coding scheme defined to store some annotations from Cornerstone.
@@ -5035,7 +5363,7 @@ var generateToolStateCornerstoneLegacy = Segmentation$2.generateToolState;
5035
5363
  * list containing the track of segments per frame
5036
5364
  * list containing the track of segments per frame for each labelMap (available only for the overlapping case).
5037
5365
  */
5038
- function generateToolState(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance) {
5366
+ function generateToolState$1(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance) {
5039
5367
  if (skipOverlapping === void 0) { skipOverlapping = false; }
5040
5368
  if (tolerance === void 0) { tolerance = 1e-3; }
5041
5369
  return generateToolStateCornerstoneLegacy(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
@@ -5045,6 +5373,19 @@ var Segmentation$1 = /*#__PURE__*/Object.freeze({
5045
5373
  __proto__: null,
5046
5374
  generateLabelMaps2DFrom3D: generateLabelMaps2DFrom3D,
5047
5375
  generateSegmentation: generateSegmentation,
5376
+ generateToolState: generateToolState$1
5377
+ });
5378
+
5379
+ var ParametricMap$1 = CornerstonePMAP.ParametricMap;
5380
+ var generateToolStateCornerstone = ParametricMap$1.generateToolState;
5381
+ function generateToolState(imageIds, arrayBuffer, metadataProvider) {
5382
+ var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
5383
+ var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
5384
+ return generateToolStateCornerstone(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
5385
+ }
5386
+
5387
+ var ParametricMap = /*#__PURE__*/Object.freeze({
5388
+ __proto__: null,
5048
5389
  generateToolState: generateToolState
5049
5390
  });
5050
5391
 
@@ -5379,6 +5720,9 @@ var Cornerstone3DSR = {
5379
5720
  var Cornerstone3DSEG = {
5380
5721
  Segmentation: Segmentation$1
5381
5722
  };
5723
+ var Cornerstone3DPMAP = {
5724
+ ParametricMap: ParametricMap
5725
+ };
5382
5726
  var Cornerstone3DRT = {
5383
5727
  RTSS: RTSS
5384
5728
  };
@@ -5578,9 +5922,14 @@ var adaptersSEG = {
5578
5922
  Cornerstone3D: Cornerstone3DSEG,
5579
5923
  VTKjs: VTKjsSEG
5580
5924
  };
5925
+ var adaptersPMAP = {
5926
+ Cornerstone: CornerstonePMAP,
5927
+ Cornerstone3D: Cornerstone3DPMAP
5928
+ // VTKjs: VTKjsPMAP
5929
+ };
5581
5930
  var adaptersRT = {
5582
5931
  Cornerstone3D: Cornerstone3DRT
5583
5932
  };
5584
5933
 
5585
- export { index as Enums, adaptersRT, adaptersSEG, adaptersSR, index$1 as helpers };
5934
+ export { index as Enums, adaptersPMAP, adaptersRT, adaptersSEG, adaptersSR, index$1 as helpers };
5586
5935
  //# sourceMappingURL=adapters.es.js.map