@cornerstonejs/adapters 2.0.0-beta.8 → 2.0.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.
Files changed (138) hide show
  1. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +493 -0
  2. package/dist/esm/adapters/Cornerstone/Angle.d.ts +42 -0
  3. package/dist/esm/adapters/Cornerstone/Angle.js +93 -0
  4. package/dist/esm/adapters/Cornerstone/ArrowAnnotate.d.ts +49 -0
  5. package/dist/esm/adapters/Cornerstone/ArrowAnnotate.js +97 -0
  6. package/dist/esm/adapters/Cornerstone/Bidirectional.d.ts +89 -0
  7. package/dist/esm/adapters/Cornerstone/Bidirectional.js +170 -0
  8. package/dist/esm/adapters/Cornerstone/CircleRoi.d.ts +58 -0
  9. package/dist/esm/adapters/Cornerstone/CircleRoi.js +115 -0
  10. package/dist/esm/adapters/Cornerstone/CobbAngle.d.ts +49 -0
  11. package/dist/esm/adapters/Cornerstone/CobbAngle.js +98 -0
  12. package/dist/esm/adapters/Cornerstone/EllipticalRoi.d.ts +57 -0
  13. package/dist/esm/adapters/Cornerstone/EllipticalRoi.js +178 -0
  14. package/dist/esm/adapters/Cornerstone/FreehandRoi.d.ts +42 -0
  15. package/dist/esm/adapters/Cornerstone/FreehandRoi.js +89 -0
  16. package/dist/esm/adapters/Cornerstone/Length.d.ts +39 -0
  17. package/dist/esm/adapters/Cornerstone/Length.js +82 -0
  18. package/dist/esm/adapters/Cornerstone/MeasurementReport.d.ts +29 -0
  19. package/dist/esm/adapters/Cornerstone/MeasurementReport.js +276 -0
  20. package/dist/esm/adapters/Cornerstone/ParametricMap.d.ts +7 -0
  21. package/dist/esm/adapters/Cornerstone/ParametricMap.js +210 -0
  22. package/dist/esm/adapters/Cornerstone/RectangleRoi.d.ts +44 -0
  23. package/dist/esm/adapters/Cornerstone/RectangleRoi.js +97 -0
  24. package/dist/esm/adapters/Cornerstone/Segmentation.d.ts +7 -0
  25. package/dist/esm/adapters/Cornerstone/Segmentation.js +73 -0
  26. package/dist/esm/adapters/Cornerstone/Segmentation_3X.d.ts +13 -0
  27. package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +411 -0
  28. package/dist/esm/adapters/Cornerstone/Segmentation_4X.d.ts +13 -0
  29. package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +1152 -0
  30. package/dist/esm/adapters/Cornerstone/cornerstone4Tag.d.ts +2 -0
  31. package/dist/esm/adapters/Cornerstone/cornerstone4Tag.js +3 -0
  32. package/dist/esm/adapters/Cornerstone/index.d.ts +34 -0
  33. package/dist/esm/adapters/Cornerstone/index.js +33 -0
  34. package/dist/esm/adapters/Cornerstone3D/Angle.js +109 -0
  35. package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.d.ts +35 -0
  36. package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.js +123 -0
  37. package/dist/esm/adapters/Cornerstone3D/Bidirectional.js +147 -0
  38. package/dist/{types → esm}/adapters/Cornerstone3D/CircleROI.d.ts +0 -7
  39. package/dist/esm/adapters/Cornerstone3D/CircleROI.js +96 -0
  40. package/dist/esm/adapters/Cornerstone3D/CobbAngle.js +113 -0
  41. package/dist/esm/adapters/Cornerstone3D/CodingScheme.d.ts +9 -0
  42. package/dist/esm/adapters/Cornerstone3D/CodingScheme.js +15 -0
  43. package/dist/esm/adapters/Cornerstone3D/EllipticalROI.js +160 -0
  44. package/dist/esm/adapters/Cornerstone3D/Length.d.ts +41 -0
  45. package/dist/esm/adapters/Cornerstone3D/Length.js +101 -0
  46. package/dist/{types → esm}/adapters/Cornerstone3D/MeasurementReport.d.ts +1 -8
  47. package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +281 -0
  48. package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.d.ts +3 -0
  49. package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.js +11 -0
  50. package/dist/esm/adapters/Cornerstone3D/ParametricMap/index.d.ts +1 -0
  51. package/dist/esm/adapters/Cornerstone3D/ParametricMap/index.js +1 -0
  52. package/dist/{types → esm}/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +0 -2
  53. package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +126 -0
  54. package/dist/esm/adapters/Cornerstone3D/Probe.d.ts +33 -0
  55. package/dist/esm/adapters/Cornerstone3D/Probe.js +87 -0
  56. package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.d.ts +67 -0
  57. package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.js +175 -0
  58. package/dist/esm/adapters/Cornerstone3D/RTStruct/index.js +6 -0
  59. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.d.ts +13 -0
  60. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.js +22 -0
  61. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTROIObservationsSequence.d.ts +6 -0
  62. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTROIObservationsSequence.js +10 -0
  63. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTSeriesModule.d.ts +4 -0
  64. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTSeriesModule.js +9 -0
  65. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.d.ts +11 -0
  66. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.js +22 -0
  67. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.d.ts +4 -0
  68. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.js +27 -0
  69. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.d.ts +7 -0
  70. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.js +12 -0
  71. package/dist/esm/adapters/Cornerstone3D/RectangleROI.js +94 -0
  72. package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.d.ts +0 -6
  73. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.js +34 -0
  74. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.d.ts +2 -0
  75. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.js +29 -0
  76. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.d.ts +2 -0
  77. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.js +9 -0
  78. package/dist/esm/adapters/Cornerstone3D/Segmentation/index.js +3 -0
  79. package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.js +93 -0
  80. package/dist/esm/adapters/Cornerstone3D/cornerstone3DTag.d.ts +2 -0
  81. package/dist/esm/adapters/Cornerstone3D/cornerstone3DTag.js +3 -0
  82. package/dist/{types → esm}/adapters/Cornerstone3D/index.d.ts +18 -6
  83. package/dist/esm/adapters/Cornerstone3D/index.js +45 -0
  84. package/dist/esm/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.js +18 -0
  85. package/dist/esm/adapters/VTKjs/Segmentation.d.ts +3 -0
  86. package/dist/esm/adapters/VTKjs/Segmentation.js +186 -0
  87. package/dist/esm/adapters/VTKjs/index.d.ts +5 -0
  88. package/dist/esm/adapters/VTKjs/index.js +7 -0
  89. package/dist/{types → esm}/adapters/enums/Events.d.ts +0 -6
  90. package/dist/esm/adapters/enums/Events.js +7 -0
  91. package/dist/esm/adapters/enums/index.js +1 -0
  92. package/dist/esm/adapters/helpers/checkIfPerpendicular.d.ts +1 -0
  93. package/dist/esm/adapters/helpers/checkIfPerpendicular.js +7 -0
  94. package/dist/esm/adapters/helpers/checkOrientation.d.ts +1 -0
  95. package/dist/esm/adapters/helpers/checkOrientation.js +22 -0
  96. package/dist/esm/adapters/helpers/codeMeaningEquals.d.ts +2 -0
  97. package/dist/esm/adapters/helpers/codeMeaningEquals.js +7 -0
  98. package/dist/esm/adapters/helpers/compareArrays.d.ts +1 -0
  99. package/dist/esm/adapters/helpers/compareArrays.js +16 -0
  100. package/dist/esm/adapters/helpers/downloadDICOMData.d.ts +5 -0
  101. package/dist/esm/adapters/helpers/downloadDICOMData.js +26 -0
  102. package/dist/esm/adapters/helpers/getDatasetsFromImages.d.ts +1 -0
  103. package/dist/esm/adapters/helpers/getDatasetsFromImages.js +33 -0
  104. package/dist/esm/adapters/helpers/graphicTypeEquals.d.ts +2 -0
  105. package/dist/esm/adapters/helpers/graphicTypeEquals.js +7 -0
  106. package/dist/esm/adapters/helpers/index.js +4 -0
  107. package/dist/esm/adapters/helpers/toArray.js +5 -0
  108. package/dist/esm/adapters/index.d.ts +66 -0
  109. package/dist/esm/adapters/index.js +24 -0
  110. package/dist/esm/index.d.ts +2 -0
  111. package/dist/esm/index.js +5 -0
  112. package/dist/umd/adapters.umd.js +5769 -0
  113. package/dist/umd/adapters.umd.js.map +1 -0
  114. package/package.json +47 -11
  115. package/dist/adapters.es.js +0 -5585
  116. package/dist/adapters.es.js.map +0 -1
  117. package/dist/types/adapters/Cornerstone/index.d.ts +0 -16
  118. package/dist/types/adapters/Cornerstone3D/RTStruct/RTSS.d.ts +0 -26
  119. package/dist/types/adapters/Cornerstone3D/Segmentation/generateSegmentation.d.ts +0 -8
  120. package/dist/types/adapters/Cornerstone3D/Segmentation/generateToolState.d.ts +0 -16
  121. package/dist/types/adapters/VTKjs/index.d.ts +0 -4
  122. package/dist/types/adapters/helpers/codeMeaningEquals.d.ts +0 -9
  123. package/dist/types/adapters/helpers/downloadDICOMData.d.ts +0 -10
  124. package/dist/types/adapters/helpers/graphicTypeEquals.d.ts +0 -7
  125. package/dist/types/adapters/index.d.ts +0 -49
  126. package/dist/types/index.d.ts +0 -2
  127. /package/dist/{types → esm}/adapters/Cornerstone3D/Angle.d.ts +0 -0
  128. /package/dist/{types → esm}/adapters/Cornerstone3D/Bidirectional.d.ts +0 -0
  129. /package/dist/{types → esm}/adapters/Cornerstone3D/CobbAngle.d.ts +0 -0
  130. /package/dist/{types → esm}/adapters/Cornerstone3D/EllipticalROI.d.ts +0 -0
  131. /package/dist/{types → esm}/adapters/Cornerstone3D/RTStruct/index.d.ts +0 -0
  132. /package/dist/{types → esm}/adapters/Cornerstone3D/RectangleROI.d.ts +0 -0
  133. /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/index.d.ts +0 -0
  134. /package/dist/{types → esm}/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +0 -0
  135. /package/dist/{types → esm}/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.d.ts +0 -0
  136. /package/dist/{types → esm}/adapters/enums/index.d.ts +0 -0
  137. /package/dist/{types → esm}/adapters/helpers/index.d.ts +0 -0
  138. /package/dist/{types → esm}/adapters/helpers/toArray.d.ts +0 -0
@@ -0,0 +1,276 @@
1
+ import { createClass as _createClass, classCallCheck as _classCallCheck } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { utilities, derivations, normalizers, data } from 'dcmjs';
3
+ import { toArray } from '../helpers/toArray.js';
4
+ import { codeMeaningEquals } from '../helpers/codeMeaningEquals.js';
5
+ import '../helpers/downloadDICOMData.js';
6
+
7
+ var TID1500 = utilities.TID1500,
8
+ addAccessors = utilities.addAccessors;
9
+ var StructuredReport = derivations.StructuredReport;
10
+ var Normalizer = normalizers.Normalizer;
11
+ var TID1500MeasurementReport = TID1500.TID1500MeasurementReport,
12
+ TID1501MeasurementGroup = TID1500.TID1501MeasurementGroup;
13
+ var DicomMetaDictionary = data.DicomMetaDictionary;
14
+ var FINDING = {
15
+ CodingSchemeDesignator: "DCM",
16
+ CodeValue: "121071"
17
+ };
18
+ var FINDING_SITE = {
19
+ CodingSchemeDesignator: "SCT",
20
+ CodeValue: "363698007"
21
+ };
22
+ var FINDING_SITE_OLD = {
23
+ CodingSchemeDesignator: "SRT",
24
+ CodeValue: "G-C0E3"
25
+ };
26
+ var codeValueMatch = function codeValueMatch(group, code, oldCode) {
27
+ var ConceptNameCodeSequence = group.ConceptNameCodeSequence;
28
+ if (!ConceptNameCodeSequence) {
29
+ return;
30
+ }
31
+ var CodingSchemeDesignator = ConceptNameCodeSequence.CodingSchemeDesignator,
32
+ CodeValue = ConceptNameCodeSequence.CodeValue;
33
+ return CodingSchemeDesignator == code.CodingSchemeDesignator && CodeValue == code.CodeValue || oldCode && CodingSchemeDesignator == oldCode.CodingSchemeDesignator && CodeValue == oldCode.CodeValue;
34
+ };
35
+ function getTID300ContentItem(tool, toolType, ReferencedSOPSequence, toolClass) {
36
+ var args = toolClass.getTID300RepresentationArguments(tool);
37
+ args.ReferencedSOPSequence = ReferencedSOPSequence;
38
+ var TID300Measurement = new toolClass.TID300Representation(args);
39
+ return TID300Measurement;
40
+ }
41
+ function getMeasurementGroup(toolType, toolData, ReferencedSOPSequence) {
42
+ var toolTypeData = toolData[toolType];
43
+ var toolClass = MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolType];
44
+ if (!toolTypeData || !toolTypeData.data || !toolTypeData.data.length || !toolClass) {
45
+ return;
46
+ }
47
+
48
+ // Loop through the array of tool instances
49
+ // for this tool
50
+ var Measurements = toolTypeData.data.map(function (tool) {
51
+ return getTID300ContentItem(tool, toolType, ReferencedSOPSequence, toolClass);
52
+ });
53
+ return new TID1501MeasurementGroup(Measurements);
54
+ }
55
+ var MeasurementReport = /*#__PURE__*/function () {
56
+ function MeasurementReport() {
57
+ _classCallCheck(this, MeasurementReport);
58
+ }
59
+ return _createClass(MeasurementReport, null, [{
60
+ key: "getSetupMeasurementData",
61
+ value: function getSetupMeasurementData(MeasurementGroup) {
62
+ var ContentSequence = MeasurementGroup.ContentSequence;
63
+ var contentSequenceArr = toArray(ContentSequence);
64
+ var findingGroup = contentSequenceArr.find(function (group) {
65
+ return codeValueMatch(group, FINDING);
66
+ });
67
+ var findingSiteGroups = contentSequenceArr.filter(function (group) {
68
+ return codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD);
69
+ }) || [];
70
+ var NUMGroup = contentSequenceArr.find(function (group) {
71
+ return group.ValueType === "NUM";
72
+ });
73
+ var SCOORDGroup = toArray(NUMGroup.ContentSequence).find(function (group) {
74
+ return group.ValueType === "SCOORD";
75
+ });
76
+ var ReferencedSOPSequence = SCOORDGroup.ContentSequence.ReferencedSOPSequence;
77
+ var ReferencedSOPInstanceUID = ReferencedSOPSequence.ReferencedSOPInstanceUID,
78
+ ReferencedFrameNumber = ReferencedSOPSequence.ReferencedFrameNumber;
79
+ var defaultState = {
80
+ sopInstanceUid: ReferencedSOPInstanceUID,
81
+ frameIndex: ReferencedFrameNumber || 1,
82
+ complete: true,
83
+ finding: findingGroup ? addAccessors(findingGroup.ConceptCodeSequence) : undefined,
84
+ findingSites: findingSiteGroups.map(function (fsg) {
85
+ return addAccessors(fsg.ConceptCodeSequence);
86
+ })
87
+ };
88
+ if (defaultState.finding) {
89
+ defaultState.description = defaultState.finding.CodeMeaning;
90
+ }
91
+ var findingSite = defaultState.findingSites && defaultState.findingSites[0];
92
+ if (findingSite) {
93
+ defaultState.location = findingSite[0] && findingSite[0].CodeMeaning || findingSite.CodeMeaning;
94
+ }
95
+ return {
96
+ defaultState: defaultState,
97
+ findingGroup: findingGroup,
98
+ findingSiteGroups: findingSiteGroups,
99
+ NUMGroup: NUMGroup,
100
+ SCOORDGroup: SCOORDGroup,
101
+ ReferencedSOPSequence: ReferencedSOPSequence,
102
+ ReferencedSOPInstanceUID: ReferencedSOPInstanceUID,
103
+ ReferencedFrameNumber: ReferencedFrameNumber
104
+ };
105
+ }
106
+ }, {
107
+ key: "generateReport",
108
+ value: function generateReport(toolState, metadataProvider, options) {
109
+ // ToolState for array of imageIDs to a Report
110
+ // Assume Cornerstone metadata provider has access to Study / Series / Sop Instance UID
111
+
112
+ var allMeasurementGroups = [];
113
+ var firstImageId = Object.keys(toolState)[0];
114
+ if (!firstImageId) {
115
+ throw new Error("No measurements provided.");
116
+ }
117
+
118
+ /* Patient ID
119
+ Warning - Missing attribute or value that would be needed to build DICOMDIR - Patient ID
120
+ Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Date
121
+ Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Time
122
+ Warning - Missing attribute or value that would be needed to build DICOMDIR - Study ID
123
+ */
124
+ var generalSeriesModule = metadataProvider.get("generalSeriesModule", firstImageId);
125
+
126
+ //const sopCommonModule = metadataProvider.get('sopCommonModule', firstImageId);
127
+
128
+ // NOTE: We are getting the Series and Study UIDs from the first imageId of the toolState
129
+ // which means that if the toolState is for multiple series, the report will have the incorrect
130
+ // SeriesInstanceUIDs
131
+ var studyInstanceUID = generalSeriesModule.studyInstanceUID,
132
+ seriesInstanceUID = generalSeriesModule.seriesInstanceUID;
133
+
134
+ // Loop through each image in the toolData
135
+ Object.keys(toolState).forEach(function (imageId) {
136
+ var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
137
+ var frameNumber = metadataProvider.get("frameNumber", imageId);
138
+ var toolData = toolState[imageId];
139
+ var toolTypes = Object.keys(toolData);
140
+ var ReferencedSOPSequence = {
141
+ ReferencedSOPClassUID: sopCommonModule.sopClassUID,
142
+ ReferencedSOPInstanceUID: sopCommonModule.sopInstanceUID
143
+ };
144
+ if (Normalizer.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)) {
145
+ ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
146
+ }
147
+
148
+ // Loop through each tool type for the image
149
+ var measurementGroups = [];
150
+ toolTypes.forEach(function (toolType) {
151
+ var group = getMeasurementGroup(toolType, toolData, ReferencedSOPSequence);
152
+ if (group) {
153
+ measurementGroups.push(group);
154
+ }
155
+ });
156
+ allMeasurementGroups = allMeasurementGroups.concat(measurementGroups);
157
+ });
158
+ var _MeasurementReport = new TID1500MeasurementReport({
159
+ TID1501MeasurementGroups: allMeasurementGroups
160
+ }, options);
161
+
162
+ // TODO: what is the correct metaheader
163
+ // http://dicom.nema.org/medical/Dicom/current/output/chtml/part10/chapter_7.html
164
+ // TODO: move meta creation to happen in derivations.js
165
+ var fileMetaInformationVersionArray = new Uint8Array(2);
166
+ fileMetaInformationVersionArray[1] = 1;
167
+ var derivationSourceDataset = {
168
+ StudyInstanceUID: studyInstanceUID,
169
+ SeriesInstanceUID: seriesInstanceUID
170
+ //SOPInstanceUID: sopInstanceUID, // TODO: Necessary?
171
+ //SOPClassUID: sopClassUID,
172
+ };
173
+ var _meta = {
174
+ FileMetaInformationVersion: {
175
+ Value: [fileMetaInformationVersionArray.buffer],
176
+ vr: "OB"
177
+ },
178
+ //MediaStorageSOPClassUID
179
+ //MediaStorageSOPInstanceUID: sopCommonModule.sopInstanceUID,
180
+ TransferSyntaxUID: {
181
+ Value: ["1.2.840.10008.1.2.1"],
182
+ vr: "UI"
183
+ },
184
+ ImplementationClassUID: {
185
+ Value: [DicomMetaDictionary.uid()],
186
+ // TODO: could be git hash or other valid id
187
+ vr: "UI"
188
+ },
189
+ ImplementationVersionName: {
190
+ Value: ["dcmjs"],
191
+ vr: "SH"
192
+ }
193
+ };
194
+ var _vrMap = {
195
+ PixelData: "OW"
196
+ };
197
+ derivationSourceDataset._meta = _meta;
198
+ derivationSourceDataset._vrMap = _vrMap;
199
+ var report = new StructuredReport([derivationSourceDataset]);
200
+ var contentItem = _MeasurementReport.contentItem(derivationSourceDataset);
201
+
202
+ // Merge the derived dataset with the content from the Measurement Report
203
+ report.dataset = Object.assign(report.dataset, contentItem);
204
+ report.dataset._meta = _meta;
205
+ report.dataset.SpecificCharacterSet = "ISO_IR 192";
206
+ return report;
207
+ }
208
+
209
+ /**
210
+ * Generate Cornerstone tool state from dataset
211
+ * @param {object} dataset dataset
212
+ * @param {object} hooks
213
+ * @param {function} hooks.getToolClass Function to map dataset to a tool class
214
+ * @returns
215
+ */
216
+ }, {
217
+ key: "generateToolState",
218
+ value: function generateToolState(dataset) {
219
+ var hooks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
220
+ // For now, bail out if the dataset is not a TID1500 SR with length measurements
221
+ if (dataset.ContentTemplateSequence.TemplateIdentifier !== "1500") {
222
+ throw new Error("This package can currently only interpret DICOM SR TID 1500");
223
+ }
224
+ var REPORT = "Imaging Measurements";
225
+ var GROUP = "Measurement Group";
226
+ var TRACKING_IDENTIFIER = "Tracking Identifier";
227
+
228
+ // Identify the Imaging Measurements
229
+ var imagingMeasurementContent = toArray(dataset.ContentSequence).find(codeMeaningEquals(REPORT));
230
+
231
+ // Retrieve the Measurements themselves
232
+ var measurementGroups = toArray(imagingMeasurementContent.ContentSequence).filter(codeMeaningEquals(GROUP));
233
+
234
+ // For each of the supported measurement types, compute the measurement data
235
+ var measurementData = {};
236
+ var cornerstoneToolClasses = MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;
237
+ var registeredToolClasses = [];
238
+ Object.keys(cornerstoneToolClasses).forEach(function (key) {
239
+ registeredToolClasses.push(cornerstoneToolClasses[key]);
240
+ measurementData[key] = [];
241
+ });
242
+ measurementGroups.forEach(function (measurementGroup) {
243
+ var measurementGroupContentSequence = toArray(measurementGroup.ContentSequence);
244
+ var TrackingIdentifierGroup = measurementGroupContentSequence.find(function (contentItem) {
245
+ return contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_IDENTIFIER;
246
+ });
247
+ var TrackingIdentifierValue = TrackingIdentifierGroup.TextValue;
248
+ var toolClass = hooks.getToolClass ? hooks.getToolClass(measurementGroup, dataset, registeredToolClasses) : registeredToolClasses.find(function (tc) {
249
+ return tc.isValidCornerstoneTrackingIdentifier(TrackingIdentifierValue);
250
+ });
251
+ if (toolClass) {
252
+ var measurement = toolClass.getMeasurementData(measurementGroup);
253
+ console.log("=== ".concat(toolClass.toolType, " ==="));
254
+ console.log(measurement);
255
+ measurementData[toolClass.toolType].push(measurement);
256
+ }
257
+ });
258
+
259
+ // NOTE: There is no way of knowing the cornerstone imageIds as that could be anything.
260
+ // That is up to the consumer to derive from the SOPInstanceUIDs.
261
+ return measurementData;
262
+ }
263
+ }, {
264
+ key: "registerTool",
265
+ value: function registerTool(toolClass) {
266
+ MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[toolClass.utilityToolType] = toolClass;
267
+ MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolClass.toolType] = toolClass;
268
+ MeasurementReport.MEASUREMENT_BY_TOOLTYPE[toolClass.toolType] = toolClass.utilityToolType;
269
+ }
270
+ }]);
271
+ }();
272
+ MeasurementReport.MEASUREMENT_BY_TOOLTYPE = {};
273
+ MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE = {};
274
+ MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE = {};
275
+
276
+ export { MeasurementReport as default };
@@ -0,0 +1,7 @@
1
+ declare function generateToolState(imageIds: any, arrayBuffer: any, metadataProvider: any, tolerance?: number): Promise<{
2
+ pixelData: any;
3
+ }>;
4
+ declare const ParametricMapObj: {
5
+ generateToolState: typeof generateToolState;
6
+ };
7
+ export { ParametricMapObj as default, ParametricMapObj as ParametricMap };
@@ -0,0 +1,210 @@
1
+ import { asyncToGenerator as _asyncToGenerator, regeneratorRuntime as _regeneratorRuntime, toConsumableArray as _toConsumableArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { data, normalizers, log } from 'dcmjs';
3
+ import checkOrientation from '../helpers/checkOrientation.js';
4
+ import compareArrays from '../helpers/compareArrays.js';
5
+
6
+ var DicomMessage = data.DicomMessage,
7
+ DicomMetaDictionary = data.DicomMetaDictionary;
8
+ var Normalizer = normalizers.Normalizer;
9
+ function generateToolState(_x, _x2, _x3) {
10
+ return _generateToolState.apply(this, arguments);
11
+ }
12
+ function _generateToolState() {
13
+ _generateToolState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(imageIds, arrayBuffer, metadataProvider) {
14
+ var tolerance,
15
+ dicomData,
16
+ dataset,
17
+ multiframe,
18
+ imagePlaneModule,
19
+ ImageOrientationPatient,
20
+ validOrientations,
21
+ pixelData,
22
+ orientation,
23
+ sopUIDImageIdIndexMap,
24
+ orientationText,
25
+ imageIdMaps,
26
+ _args = arguments;
27
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
28
+ while (1) switch (_context.prev = _context.next) {
29
+ case 0:
30
+ tolerance = _args.length > 3 && _args[3] !== undefined ? _args[3] : 1e-3;
31
+ dicomData = DicomMessage.readFile(arrayBuffer);
32
+ dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
33
+ dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
34
+ multiframe = Normalizer.normalizeToDataset([dataset]);
35
+ imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
36
+ if (!imagePlaneModule) {
37
+ console.warn("Insufficient metadata, imagePlaneModule missing.");
38
+ }
39
+ 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];
40
+ validOrientations = [ImageOrientationPatient];
41
+ pixelData = getPixelData(multiframe);
42
+ orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length], tolerance);
43
+ sopUIDImageIdIndexMap = imageIds.reduce(function (acc, imageId) {
44
+ var _metadataProvider$get = metadataProvider.get("generalImageModule", imageId),
45
+ sopInstanceUID = _metadataProvider$get.sopInstanceUID;
46
+ acc[sopInstanceUID] = imageId;
47
+ return acc;
48
+ }, {});
49
+ if (!(orientation !== "Planar")) {
50
+ _context.next = 15;
51
+ break;
52
+ }
53
+ orientationText = {
54
+ Perpendicular: "orthogonal",
55
+ Oblique: "oblique"
56
+ };
57
+ throw new Error("Parametric maps ".concat(orientationText[orientation], " to the acquisition plane of the source data are not yet supported."));
58
+ case 15:
59
+ imageIdMaps = imageIds.reduce(function (acc, curr, index) {
60
+ acc.indices[curr] = index;
61
+ acc.metadata[curr] = metadataProvider.get("instance", curr);
62
+ return acc;
63
+ }, {
64
+ indices: {},
65
+ metadata: {}
66
+ });
67
+ _context.next = 18;
68
+ return insertPixelDataPlanar(pixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps);
69
+ case 18:
70
+ return _context.abrupt("return", {
71
+ pixelData: pixelData
72
+ });
73
+ case 19:
74
+ case "end":
75
+ return _context.stop();
76
+ }
77
+ }, _callee);
78
+ }));
79
+ return _generateToolState.apply(this, arguments);
80
+ }
81
+ function insertPixelDataPlanar(sourcePixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps) {
82
+ var targetPixelData = new sourcePixelData.constructor(sourcePixelData.length);
83
+ var PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
84
+ Rows = multiframe.Rows,
85
+ Columns = multiframe.Columns;
86
+ var sliceLength = Columns * Rows;
87
+ var numSlices = PerFrameFunctionalGroupsSequence.length;
88
+ for (var i = 0; i < numSlices; i++) {
89
+ var sourceSliceDataView = new sourcePixelData.constructor(sourcePixelData.buffer, i * sliceLength, sliceLength);
90
+ var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
91
+ if (!imageId) {
92
+ console.warn("Image not present in stack, can't import frame : " + i + ".");
93
+ continue;
94
+ }
95
+ var sourceImageMetadata = imageIdMaps.metadata[imageId];
96
+ if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
97
+ throw new Error("Parametric map have different geometry dimensions (Rows and Columns) " + "respect to the source image reference frame. This is not yet supported.");
98
+ }
99
+ var imageIdIndex = imageIdMaps.indices[imageId];
100
+ var byteOffset = sliceLength * imageIdIndex * targetPixelData.BYTES_PER_ELEMENT;
101
+ var targetSliceDataView = new targetPixelData.constructor(targetPixelData.buffer, byteOffset, sliceLength);
102
+ targetSliceDataView.set(sourceSliceDataView);
103
+ }
104
+ return targetPixelData;
105
+ }
106
+ function getPixelData(multiframe) {
107
+ var TypedArrayClass;
108
+ var data;
109
+ if (multiframe.PixelData) {
110
+ var _multiframe$PixelRepr;
111
+ var validTypedArrays = multiframe.BitsAllocated === 16 ? [Uint16Array, Int16Array] : [Uint32Array, Int32Array];
112
+ TypedArrayClass = validTypedArrays[(_multiframe$PixelRepr = multiframe.PixelRepresentation) !== null && _multiframe$PixelRepr !== void 0 ? _multiframe$PixelRepr : 0];
113
+ data = multiframe.PixelData;
114
+ } else if (multiframe.FloatPixelData) {
115
+ TypedArrayClass = Float32Array;
116
+ data = multiframe.FloatPixelData;
117
+ } else if (multiframe.DoubleFloatPixelData) {
118
+ TypedArrayClass = Float64Array;
119
+ data = multiframe.DoubleFloatPixelData;
120
+ }
121
+ if (data === undefined) {
122
+ log.error("This parametric map pixel data is undefined.");
123
+ }
124
+ if (Array.isArray(data)) {
125
+ data = data[0];
126
+ }
127
+ return new TypedArrayClass(data);
128
+ }
129
+ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
130
+ var imageId = undefined;
131
+ if (!multiframe) {
132
+ return imageId;
133
+ }
134
+ var FrameOfReferenceUID = multiframe.FrameOfReferenceUID,
135
+ PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
136
+ SourceImageSequence = multiframe.SourceImageSequence,
137
+ ReferencedSeriesSequence = multiframe.ReferencedSeriesSequence;
138
+ if (!PerFrameFunctionalGroupsSequence || PerFrameFunctionalGroupsSequence.length === 0) {
139
+ return imageId;
140
+ }
141
+ var PerFrameFunctionalGroup = PerFrameFunctionalGroupsSequence[frameSegment];
142
+ if (!PerFrameFunctionalGroup) {
143
+ return imageId;
144
+ }
145
+ var frameSourceImageSequence = undefined;
146
+ if (PerFrameFunctionalGroup.DerivationImageSequence) {
147
+ var DerivationImageSequence = PerFrameFunctionalGroup.DerivationImageSequence;
148
+ if (Array.isArray(DerivationImageSequence)) {
149
+ if (DerivationImageSequence.length !== 0) {
150
+ DerivationImageSequence = DerivationImageSequence[0];
151
+ } else {
152
+ DerivationImageSequence = undefined;
153
+ }
154
+ }
155
+ if (DerivationImageSequence) {
156
+ frameSourceImageSequence = DerivationImageSequence.SourceImageSequence;
157
+ if (Array.isArray(frameSourceImageSequence)) {
158
+ if (frameSourceImageSequence.length !== 0) {
159
+ frameSourceImageSequence = frameSourceImageSequence[0];
160
+ } else {
161
+ frameSourceImageSequence = undefined;
162
+ }
163
+ }
164
+ }
165
+ } else if (SourceImageSequence && SourceImageSequence.length !== 0) {
166
+ console.warn("DerivationImageSequence not present, using SourceImageSequence assuming SEG has the same geometry as the source image.");
167
+ frameSourceImageSequence = SourceImageSequence[frameSegment];
168
+ }
169
+ if (frameSourceImageSequence) {
170
+ imageId = getImageIdOfSourceImageBySourceImageSequence(frameSourceImageSequence, sopUIDImageIdIndexMap);
171
+ }
172
+ if (imageId === undefined && ReferencedSeriesSequence) {
173
+ var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence) ? ReferencedSeriesSequence[0] : ReferencedSeriesSequence;
174
+ var ReferencedSeriesInstanceUID = referencedSeriesSequence.SeriesInstanceUID;
175
+ imageId = getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
176
+ }
177
+ return imageId;
178
+ }
179
+ function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
180
+ var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
181
+ ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
182
+ return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
183
+ }
184
+ function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
185
+ if (ReferencedSeriesInstanceUID === undefined || PerFrameFunctionalGroup.PlanePositionSequence === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient === undefined) {
186
+ return undefined;
187
+ }
188
+ for (var imageIdsIndex = 0; imageIdsIndex < imageIds.length; ++imageIdsIndex) {
189
+ var sourceImageMetadata = metadataProvider.get("instance", imageIds[imageIdsIndex]);
190
+ if (sourceImageMetadata === undefined || sourceImageMetadata.ImagePositionPatient === undefined || sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID || sourceImageMetadata.SeriesInstanceUID !== ReferencedSeriesInstanceUID) {
191
+ continue;
192
+ }
193
+ if (compareArrays(PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient, sourceImageMetadata.ImagePositionPatient, tolerance)) {
194
+ return imageIds[imageIdsIndex];
195
+ }
196
+ }
197
+ }
198
+ function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
199
+ var imageId = sopUIDImageIdIndexMap[sopInstanceUid];
200
+ if (!imageId) {
201
+ return;
202
+ }
203
+ var imageIdFrameNumber = Number(imageId.split("frame=")[1]);
204
+ return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
205
+ }
206
+ var ParametricMapObj = {
207
+ generateToolState: generateToolState
208
+ };
209
+
210
+ export { ParametricMapObj as ParametricMap, ParametricMapObj as default };
@@ -0,0 +1,44 @@
1
+ export default RectangleRoi;
2
+ declare class RectangleRoi {
3
+ static getMeasurementData(MeasurementGroup: any): {
4
+ toolType: string;
5
+ handles: {
6
+ start: {};
7
+ end: {};
8
+ textBox: {
9
+ active: boolean;
10
+ hasMoved: boolean;
11
+ movesIndependently: boolean;
12
+ drawnIndependently: boolean;
13
+ allowedOutsideImage: boolean;
14
+ hasBoundingBox: boolean;
15
+ };
16
+ initialRotation: number;
17
+ };
18
+ cachedStats: {
19
+ area: any;
20
+ };
21
+ color: any;
22
+ invalidated: boolean;
23
+ sopInstanceUid: any;
24
+ frameIndex: any;
25
+ complete: boolean;
26
+ finding: any;
27
+ findingSites: any[];
28
+ };
29
+ static getTID300RepresentationArguments(tool: any): {
30
+ points: any[];
31
+ area: any;
32
+ perimeter: any;
33
+ trackingIdentifierTextValue: string;
34
+ finding: any;
35
+ findingSites: any;
36
+ };
37
+ }
38
+ declare namespace RectangleRoi {
39
+ export let toolType: string;
40
+ export let utilityToolType: string;
41
+ export { TID300Polyline as TID300Representation };
42
+ export function isValidCornerstoneTrackingIdentifier(TrackingIdentifier: any): boolean;
43
+ }
44
+ declare const TID300Polyline: any;
@@ -0,0 +1,97 @@
1
+ import { slicedToArray as _slicedToArray, createClass as _createClass, objectSpread2 as _objectSpread2, classCallCheck as _classCallCheck } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { utilities } from 'dcmjs';
3
+ import MeasurementReport from './MeasurementReport.js';
4
+ import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
5
+
6
+ var TID300Polyline = utilities.TID300.Polyline;
7
+ var RectangleRoi = /*#__PURE__*/function () {
8
+ function RectangleRoi() {
9
+ _classCallCheck(this, RectangleRoi);
10
+ }
11
+ return _createClass(RectangleRoi, null, [{
12
+ key: "getMeasurementData",
13
+ value: function getMeasurementData(MeasurementGroup) {
14
+ var _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup),
15
+ defaultState = _MeasurementReport$ge.defaultState,
16
+ SCOORDGroup = _MeasurementReport$ge.SCOORDGroup,
17
+ NUMGroup = _MeasurementReport$ge.NUMGroup;
18
+ var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
19
+ toolType: RectangleRoi.toolType,
20
+ handles: {
21
+ start: {},
22
+ end: {},
23
+ textBox: {
24
+ active: false,
25
+ hasMoved: false,
26
+ movesIndependently: false,
27
+ drawnIndependently: true,
28
+ allowedOutsideImage: true,
29
+ hasBoundingBox: true
30
+ },
31
+ initialRotation: 0
32
+ },
33
+ cachedStats: {
34
+ area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0
35
+ },
36
+ color: undefined,
37
+ invalidated: true
38
+ });
39
+ var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 6);
40
+ state.handles.start.x = _SCOORDGroup$GraphicD[0];
41
+ state.handles.start.y = _SCOORDGroup$GraphicD[1];
42
+ _SCOORDGroup$GraphicD[2];
43
+ _SCOORDGroup$GraphicD[3];
44
+ state.handles.end.x = _SCOORDGroup$GraphicD[4];
45
+ state.handles.end.y = _SCOORDGroup$GraphicD[5];
46
+ return state;
47
+ }
48
+ }, {
49
+ key: "getTID300RepresentationArguments",
50
+ value: function getTID300RepresentationArguments(tool) {
51
+ var finding = tool.finding,
52
+ findingSites = tool.findingSites,
53
+ _tool$cachedStats = tool.cachedStats,
54
+ cachedStats = _tool$cachedStats === void 0 ? {} : _tool$cachedStats,
55
+ handles = tool.handles;
56
+ var start = handles.start,
57
+ end = handles.end;
58
+ var points = [start, {
59
+ x: start.x,
60
+ y: end.y
61
+ }, end, {
62
+ x: end.x,
63
+ y: start.y
64
+ }];
65
+ var area = cachedStats.area,
66
+ perimeter = cachedStats.perimeter;
67
+ var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:RectangleRoi";
68
+ return {
69
+ points: points,
70
+ area: area,
71
+ perimeter: perimeter,
72
+ trackingIdentifierTextValue: trackingIdentifierTextValue,
73
+ finding: finding,
74
+ findingSites: findingSites || []
75
+ };
76
+ }
77
+ }]);
78
+ }();
79
+ RectangleRoi.toolType = "RectangleRoi";
80
+ RectangleRoi.utilityToolType = "RectangleRoi";
81
+ RectangleRoi.TID300Representation = TID300Polyline;
82
+ RectangleRoi.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
83
+ if (!TrackingIdentifier.includes(":")) {
84
+ return false;
85
+ }
86
+ var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
87
+ _TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
88
+ cornerstone4Tag = _TrackingIdentifier$s2[0],
89
+ toolType = _TrackingIdentifier$s2[1];
90
+ if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
91
+ return false;
92
+ }
93
+ return toolType === RectangleRoi.toolType;
94
+ };
95
+ MeasurementReport.registerTool(RectangleRoi);
96
+
97
+ export { RectangleRoi as default };
@@ -0,0 +1,7 @@
1
+ export function generateSegmentation(images: object[], labelmaps3DorBrushData: any | any[], options?: {
2
+ includeSliceSpacing: boolean;
3
+ }, cornerstoneToolsVersion?: number): any;
4
+ export function generateToolState(imageIds: string[], arrayBuffer: ArrayBuffer, metadataProvider: any, skipOverlapping?: boolean, tolerance?: number, cornerstoneToolsVersion?: number): any;
5
+ export function fillSegmentation(segmentation: object[], inputLabelmaps3D: any | any[], options?: {
6
+ includeSliceSpacing: boolean;
7
+ }, cornerstoneToolsVersion?: number): Blob;