dcmjs 0.19.4 → 0.19.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -36,7 +36,7 @@ _Parts of DICOM that dcmjs will focus on:_
36
36
 
37
37
  _Parts of DICOM that dcmjs *will not* focus on:_
38
38
 
39
- - DIMSE (legacy networking like C-FIND, C-MOVE, etc). See the [dicom-dimse project](https://github.com/PantelisGeorgiadis/dcmjs-dimse) for that.
39
+ - DIMSE (legacy networking like C-STORE, C-FIND, C-MOVE, etc). See the [dcmjs-dimse project](https://github.com/PantelisGeorgiadis/dcmjs-dimse) for that.
40
40
  - Physical Media (optical disks). See [this FAQ](https://www.dclunie.com/medical-image-faq/html/index.html) if you need to work with those.
41
41
 
42
42
  # Usage
package/build/dcmjs.es.js CHANGED
@@ -2642,6 +2642,13 @@ function () {
2642
2642
  value: function isPixelDataTag() {
2643
2643
  return this.is(0x7fe00010);
2644
2644
  }
2645
+ }, {
2646
+ key: "isPrivateCreator",
2647
+ value: function isPrivateCreator() {
2648
+ var group = this.group();
2649
+ var element = this.element();
2650
+ return group % 2 === 1 && element < 0x100 && element > 0x00;
2651
+ }
2645
2652
  }, {
2646
2653
  key: "write",
2647
2654
  value: function write(stream, vrType, values, syntax, writeOptions) {
@@ -2746,7 +2753,8 @@ var addAccessors = function addAccessors(dest, src) {
2746
2753
  },
2747
2754
  set: function set(v) {
2748
2755
  src[key] = v;
2749
- }
2756
+ },
2757
+ configurable: true
2750
2758
  });
2751
2759
  });
2752
2760
  };
@@ -2910,6 +2918,7 @@ function () {
2910
2918
  var sqZero = naturalDataset[naturalName][0];
2911
2919
 
2912
2920
  if (sqZero && _typeof(sqZero) === "object" && !sqZero.length) {
2921
+ naturalDataset[naturalName] = _toConsumableArray(naturalDataset[naturalName]);
2913
2922
  addAccessors(naturalDataset[naturalName], sqZero);
2914
2923
  } else {
2915
2924
  naturalDataset[naturalName] = sqZero;
@@ -3271,6 +3280,8 @@ function () {
3271
3280
  vrType = "OW";
3272
3281
  } else if (vrType == "xs") {
3273
3282
  vrType = "US";
3283
+ } else if (tag.isPrivateCreator()) {
3284
+ vrType = "LO";
3274
3285
  } else {
3275
3286
  vrType = "UN";
3276
3287
  }
@@ -12417,33 +12428,45 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
12417
12428
  }
12418
12429
  /**
12419
12430
  * Find the reference frame of the segmentation frame in the source data.
12420
- * @returns {string} Returns the imageId
12431
+ *
12432
+ * @param {Object} multiframe dicom metadata
12433
+ * @param {Int} frameSegment frame dicom index
12434
+ * @param {String[]} imageIds A list of imageIds.
12435
+ * @param {Object} metadataProvider A Cornerstone metadataProvider to query
12436
+ * metadata from imageIds.
12437
+ * @param {Float} tolerance The tolerance parameter
12438
+ *
12439
+ * @returns {String} Returns the imageId
12421
12440
  */
12422
12441
 
12423
12442
 
12424
- function findReferenceSourceImageId(SourceImageSequence, imageIds, metadataProvider, PerFrameFunctionalGroups, frameOfReferenceUID, tolerance) {
12425
- var imageId = getImageIdOfSourceImage$1(SourceImageSequence, imageIds, metadataProvider);
12443
+ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance) {
12444
+ var FrameOfReferenceUID = multiframe.FrameOfReferenceUID,
12445
+ PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
12446
+ SourceImageSequence = multiframe.SourceImageSequence,
12447
+ ReferencedSeriesSequence = multiframe.ReferencedSeriesSequence;
12448
+ var PerFrameFunctionalGroup = PerFrameFunctionalGroupsSequence[frameSegment];
12449
+ var imageId = undefined;
12426
12450
 
12427
- if (!imageId) {
12428
- /** not found, we can do a check with the PlanePositionSequence.
12429
- * (WARNING!) However, if more than a source series is present,
12430
- * this logic can find the wrong frame
12431
- * (i.e. two source series, with the same frameOfReferenceUID,
12432
- * that have each a frame with the same ImagePositionPatient of PlanePositionSequence).
12433
- */
12434
- if (PerFrameFunctionalGroups.PlanePositionSequence !== undefined && PerFrameFunctionalGroups.PlanePositionSequence[0] !== undefined && PerFrameFunctionalGroups.PlanePositionSequence[0].ImagePositionPatient !== undefined) {
12435
- for (var _i5 = 0; _i5 < imageIds.length; ++_i5) {
12436
- var sourceImageMetadata = cornerstone.metaData.get("instance", imageIds[_i5]);
12451
+ if (ReferencedSeriesSequence) {
12452
+ var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence) ? ReferencedSeriesSequence[0] : ReferencedSeriesSequence;
12453
+ var ReferencedSeriesInstanceUID = referencedSeriesSequence.SeriesInstanceUID;
12454
+ imageId = getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, tolerance);
12455
+ }
12437
12456
 
12438
- if (sourceImageMetadata === undefined || sourceImageMetadata.ImagePositionPatient === undefined || sourceImageMetadata.FrameOfReferenceUID !== frameOfReferenceUID) {
12439
- continue;
12440
- }
12457
+ if (imageId === undefined) {
12458
+ var sourceImageSequence;
12441
12459
 
12442
- if (compareArrays(PerFrameFunctionalGroups.PlanePositionSequence[0].ImagePositionPatient, sourceImageMetadata.ImagePositionPatient, tolerance)) {
12443
- return imageIds[_i5];
12444
- }
12445
- }
12460
+ if (SourceImageSequence) {
12461
+ sourceImageSequence = multiframe.SourceImageSequence[frameSegment];
12462
+ } else if (PerFrameFunctionalGroup.DerivationImageSequence) {
12463
+ var DerivationImageSequence = PerFrameFunctionalGroup.DerivationImageSequence;
12464
+ DerivationImageSequence = Array.isArray(DerivationImageSequence) ? DerivationImageSequence[0] : DerivationImageSequence;
12465
+ sourceImageSequence = DerivationImageSequence.SourceImageSequence;
12466
+ sourceImageSequence = Array.isArray(sourceImageSequence) ? sourceImageSequence[0] : sourceImageSequence;
12446
12467
  }
12468
+
12469
+ imageId = getImageIdOfSourceImagebySourceImageSequence(sourceImageSequence, imageIds, metadataProvider);
12447
12470
  }
12448
12471
 
12449
12472
  return imageId;
@@ -12486,20 +12509,7 @@ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations
12486
12509
  return "continue";
12487
12510
  }
12488
12511
 
12489
- var SourceImageSequence = void 0;
12490
-
12491
- if (multiframe.SourceImageSequence) {
12492
- SourceImageSequence = multiframe.SourceImageSequence[frameSegment];
12493
- } else {
12494
- SourceImageSequence = PerFrameFunctionalGroups.DerivationImageSequence.SourceImageSequence;
12495
- }
12496
-
12497
- if (!SourceImageSequence) {
12498
- console.warn("Source Image Sequence information missing: individual SEG frames are out of plane, this is not yet supported, skipping this frame.");
12499
- return "continue";
12500
- }
12501
-
12502
- var imageId = findReferenceSourceImageId(SourceImageSequence, imageIds, metadataProvider, PerFrameFunctionalGroups, multiframe.FrameOfReferenceUID, tolerance);
12512
+ var imageId = findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance);
12503
12513
 
12504
12514
  if (!imageId) {
12505
12515
  console.warn("Image not present in stack, can't import frame : " + i + ".");
@@ -12540,8 +12550,8 @@ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations
12540
12550
 
12541
12551
  var temp2DArray = new Uint16Array(sliceLength).fill(0);
12542
12552
 
12543
- for (var _i6 = 0; _i6 < role.length; ++_i6) {
12544
- var _frameSegment = role[_i6];
12553
+ for (var _i5 = 0; _i5 < role.length; ++_i5) {
12554
+ var _frameSegment = role[_i5];
12545
12555
  var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[_frameSegment];
12546
12556
  var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
12547
12557
  var pixelDataI2D = ndarray(new Uint8Array(pixelData.buffer, _frameSegment * sliceLength, sliceLength), [Rows, Columns]);
@@ -12610,44 +12620,32 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
12610
12620
  var numberOfSegs = multiframe.SegmentSequence.length;
12611
12621
 
12612
12622
  for (var segmentIndexToProcess = 1; segmentIndexToProcess <= numberOfSegs; ++segmentIndexToProcess) {
12613
- var _loop4 = function _loop4(groupsLen, _i8) {
12614
- var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[_i8];
12615
- var segmentIndex = getSegmentIndex(multiframe, _i8);
12623
+ var _loop4 = function _loop4(groupsLen, _i7) {
12624
+ var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[_i7];
12625
+ var segmentIndex = getSegmentIndex(multiframe, _i7);
12616
12626
 
12617
12627
  if (segmentIndex === undefined) {
12618
12628
  throw new Error("Could not retrieve the segment index. Aborting segmentation loading.");
12619
12629
  }
12620
12630
 
12621
12631
  if (segmentIndex !== segmentIndexToProcess) {
12622
- _i7 = _i8;
12632
+ _i6 = _i7;
12623
12633
  return "continue";
12624
12634
  }
12625
12635
 
12626
12636
  var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
12627
- var pixelDataI2D = ndarray(new Uint8Array(pixelData.buffer, _i8 * sliceLength, sliceLength), [Rows, Columns]);
12637
+ var pixelDataI2D = ndarray(new Uint8Array(pixelData.buffer, _i7 * sliceLength, sliceLength), [Rows, Columns]);
12628
12638
  var alignedPixelDataI = alignPixelDataWithSourceData$1(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
12629
12639
 
12630
12640
  if (!alignedPixelDataI) {
12631
12641
  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.");
12632
12642
  }
12633
12643
 
12634
- var SourceImageSequence = undefined;
12635
-
12636
- if (multiframe.SourceImageSequence) {
12637
- SourceImageSequence = multiframe.SourceImageSequence[_i8];
12638
- } else {
12639
- SourceImageSequence = PerFrameFunctionalGroups.DerivationImageSequence.SourceImageSequence;
12640
- }
12641
-
12642
- if (!SourceImageSequence) {
12643
- throw new Error("Source Image Sequence information missing: individual SEG frames are out of plane. " + "This is not yet supported. Aborting segmentation loading.");
12644
- }
12645
-
12646
- var imageId = findReferenceSourceImageId(SourceImageSequence, imageIds, metadataProvider, PerFrameFunctionalGroups, multiframe.FrameOfReferenceUID, tolerance);
12644
+ var imageId = findReferenceSourceImageId(multiframe, _i7, imageIds, metadataProvider, tolerance);
12647
12645
 
12648
12646
  if (!imageId) {
12649
- console.warn("Image not present in stack, can't import frame : " + _i8 + ".");
12650
- _i7 = _i8;
12647
+ console.warn("Image not present in stack, can't import frame : " + _i7 + ".");
12648
+ _i6 = _i7;
12651
12649
  return "continue";
12652
12650
  }
12653
12651
 
@@ -12679,7 +12677,7 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
12679
12677
 
12680
12678
  tempBuffer = labelmapBufferArray[m].slice(0);
12681
12679
  tempSegmentsOnFrame = lodash_clonedeep(segmentsOnFrameArray[m]);
12682
- _i8 = 0;
12680
+ _i7 = 0;
12683
12681
  break;
12684
12682
  } else {
12685
12683
  labelmap2DView[j] = segmentIndex;
@@ -12702,11 +12700,11 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
12702
12700
  segmentsOnFrame[imageIdIndex].push(segmentIndex);
12703
12701
  }
12704
12702
 
12705
- _i7 = _i8;
12703
+ _i6 = _i7;
12706
12704
  };
12707
12705
 
12708
- for (var _i7 = 0, groupsLen = PerFrameFunctionalGroupsSequence.length; _i7 < groupsLen; ++_i7) {
12709
- var _ret2 = _loop4(groupsLen, _i7);
12706
+ for (var _i6 = 0, groupsLen = PerFrameFunctionalGroupsSequence.length; _i6 < groupsLen; ++_i6) {
12707
+ var _ret2 = _loop4(groupsLen, _i6);
12710
12708
 
12711
12709
  if (_ret2 === "continue") continue;
12712
12710
  }
@@ -12735,38 +12733,26 @@ function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBu
12735
12733
  var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
12736
12734
  var sliceLength = Columns * Rows;
12737
12735
 
12738
- var _loop5 = function _loop5(groupsLen, _i9) {
12739
- var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[_i9];
12736
+ var _loop5 = function _loop5(groupsLen, _i8) {
12737
+ var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[_i8];
12740
12738
  var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
12741
- var pixelDataI2D = ndarray(new Uint8Array(pixelData.buffer, _i9 * sliceLength, sliceLength), [Rows, Columns]);
12739
+ var pixelDataI2D = ndarray(new Uint8Array(pixelData.buffer, _i8 * sliceLength, sliceLength), [Rows, Columns]);
12742
12740
  var alignedPixelDataI = alignPixelDataWithSourceData$1(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
12743
12741
 
12744
12742
  if (!alignedPixelDataI) {
12745
12743
  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.");
12746
12744
  }
12747
12745
 
12748
- var segmentIndex = getSegmentIndex(multiframe, _i9);
12746
+ var segmentIndex = getSegmentIndex(multiframe, _i8);
12749
12747
 
12750
12748
  if (segmentIndex === undefined) {
12751
12749
  throw new Error("Could not retrieve the segment index. Aborting segmentation loading.");
12752
12750
  }
12753
12751
 
12754
- var SourceImageSequence = undefined;
12755
-
12756
- if (multiframe.SourceImageSequence) {
12757
- SourceImageSequence = multiframe.SourceImageSequence[_i9];
12758
- } else {
12759
- SourceImageSequence = PerFrameFunctionalGroups.DerivationImageSequence.SourceImageSequence;
12760
- }
12761
-
12762
- if (!SourceImageSequence) {
12763
- throw new Error("Source Image Sequence information missing: individual SEG frames are out of plane. " + "This is not yet supported. Aborting segmentation loading.");
12764
- }
12765
-
12766
- var imageId = findReferenceSourceImageId(SourceImageSequence, imageIds, metadataProvider, PerFrameFunctionalGroups, multiframe.FrameOfReferenceUID, tolerance);
12752
+ var imageId = findReferenceSourceImageId(multiframe, _i8, imageIds, metadataProvider, tolerance);
12767
12753
 
12768
12754
  if (!imageId) {
12769
- console.warn("Image not present in stack, can't import frame : " + _i9 + ".");
12755
+ console.warn("Image not present in stack, can't import frame : " + _i8 + ".");
12770
12756
  return "continue";
12771
12757
  }
12772
12758
 
@@ -12802,8 +12788,8 @@ function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBu
12802
12788
  }
12803
12789
  };
12804
12790
 
12805
- for (var _i9 = 0, groupsLen = PerFrameFunctionalGroupsSequence.length; _i9 < groupsLen; ++_i9) {
12806
- var _ret3 = _loop5(groupsLen, _i9);
12791
+ for (var _i8 = 0, groupsLen = PerFrameFunctionalGroupsSequence.length; _i8 < groupsLen; ++_i8) {
12792
+ var _ret3 = _loop5(groupsLen, _i8);
12807
12793
 
12808
12794
  if (_ret3 === "continue") continue;
12809
12795
  }
@@ -12888,21 +12874,51 @@ function unpackPixelData$1(multiframe) {
12888
12874
  return pixelData;
12889
12875
  }
12890
12876
  /**
12891
- * getImageIdOfSourceImage - Returns the Cornerstone imageId of the source image.
12877
+ * getImageIdOfSourceImagebySourceImageSequence - Returns the Cornerstone imageId of the source image.
12892
12878
  *
12893
- * @param {Object} SourceImageSequence Sequence describing the source image.
12894
- * @param {String[]} imageIds A list of imageIds.
12895
- * @param {Object} metadataProvider A Cornerstone metadataProvider to query
12896
- * metadata from imageIds.
12897
- * @return {String} The corresponding imageId.
12879
+ * @param {Object} SourceImageSequence Sequence describing the source image.
12880
+ * @param {String[]} imageIds A list of imageIds.
12881
+ * @param {Object} metadataProvider A Cornerstone metadataProvider to query
12882
+ * metadata from imageIds.
12883
+ * @return {String} The corresponding imageId.
12898
12884
  */
12899
12885
 
12900
12886
 
12901
- function getImageIdOfSourceImage$1(SourceImageSequence, imageIds, metadataProvider) {
12887
+ function getImageIdOfSourceImagebySourceImageSequence(SourceImageSequence, imageIds, metadataProvider) {
12902
12888
  var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
12903
12889
  ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
12904
12890
  return ReferencedFrameNumber ? getImageIdOfReferencedFrame$1(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance$1(ReferencedSOPInstanceUID, imageIds, metadataProvider);
12905
12891
  }
12892
+ /**
12893
+ * getImageIdOfSourceImagebyGeometry - Returns the Cornerstone imageId of the source image.
12894
+ *
12895
+ * @param {String} ReferencedSeriesInstanceUID Referenced series of the source image.
12896
+ * @param {String} FrameOfReferenceUID Frame of reference.
12897
+ * @param {Object} PerFrameFunctionalGroup Sequence describing segmentation reference attributes per frame.
12898
+ * @param {String[]} imageIds A list of imageIds.
12899
+ * @param {Float} tolerance The tolerance parameter
12900
+ *
12901
+ * @return {String} The corresponding imageId.
12902
+ */
12903
+
12904
+
12905
+ function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, tolerance) {
12906
+ if (ReferencedSeriesInstanceUID === undefined || PerFrameFunctionalGroup.PlanePositionSequence === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient === undefined) {
12907
+ return undefined;
12908
+ }
12909
+
12910
+ for (var imageIdsIndexc = 0; imageIdsIndexc < imageIds.length; ++imageIdsIndexc) {
12911
+ var sourceImageMetadata = cornerstone.metaData.get("instance", imageIds[imageIdsIndexc]);
12912
+
12913
+ if (sourceImageMetadata === undefined || sourceImageMetadata.ImagePositionPatient === undefined || sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID || sourceImageMetadata.SeriesInstanceUID !== ReferencedSeriesInstanceUID) {
12914
+ continue;
12915
+ }
12916
+
12917
+ if (compareArrays(PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient, sourceImageMetadata.ImagePositionPatient, tolerance)) {
12918
+ return imageIds[imageIdsIndexc];
12919
+ }
12920
+ }
12921
+ }
12906
12922
  /**
12907
12923
  * getImageIdOfReferencedSingleFramedSOPInstance - Returns the imageId
12908
12924
  * corresponding to the specified sopInstanceUid for single-frame images.
@@ -13037,8 +13053,8 @@ function compareArrays(array1, array2, tolerance) {
13037
13053
  return false;
13038
13054
  }
13039
13055
 
13040
- for (var _i10 = 0; _i10 < array1.length; ++_i10) {
13041
- if (!nearlyEqual(array1[_i10], array2[_i10], tolerance)) {
13056
+ for (var _i9 = 0; _i9 < array1.length; ++_i9) {
13057
+ if (!nearlyEqual(array1[_i9], array2[_i9], tolerance)) {
13042
13058
  return false;
13043
13059
  }
13044
13060
  }