From 2d479cd3cad09a3595b7084644d4d585bc879b9c Mon Sep 17 00:00:00 2001 From: alekschernof Date: Wed, 18 Dec 2024 15:08:11 +0300 Subject: [PATCH 1/2] feat(vr): Save original non-standard VR if not equal VR in custom dictionary and use saved VR in processing denaturalizeDataset function --- src/DicomMetaDictionary.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/DicomMetaDictionary.js b/src/DicomMetaDictionary.js index af68b0d7..03656bb0 100644 --- a/src/DicomMetaDictionary.js +++ b/src/DicomMetaDictionary.js @@ -126,6 +126,10 @@ class DicomMetaDictionary { // when the vr is data-dependent, keep track of the original type naturalDataset._vrMap[naturalName] = data.vr; } + if (data.vr !== entry.vr) { + // save origin vr if it different that in dictionary + naturalDataset._vrMap[naturalName] = data.vr; + } } if (data.Value === undefined) { @@ -217,9 +221,13 @@ class DicomMetaDictionary { return; } // process this one entry - var dataItem = ValueRepresentation.addTagAccessors({ - vr: entry.vr - }); + const vr = + dataset._vrMap && dataset._vrMap[naturalName] + ? dataset._vrMap[naturalName] + : entry.vr; + + var dataItem = ValueRepresentation.addTagAccessors({ vr }); + dataItem.Value = dataset[naturalName]; if (dataValue !== null) { From 51ac8cd24b97e0f98295868252e423012f804f9b Mon Sep 17 00:00:00 2001 From: alekschernof Date: Thu, 19 Dec 2024 16:52:41 +0300 Subject: [PATCH 2/2] feat(vr): Add test for saved non standard VR --- test/data.test.js | 130 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/test/data.test.js b/test/data.test.js index 560eab3a..a5ba9288 100644 --- a/test/data.test.js +++ b/test/data.test.js @@ -1462,6 +1462,136 @@ describe("test_un_vr", () => { }); }); +describe("Save original non-standard VR and check dataset after denaturalized", () => { + const dicomTagsWithNonStandardVr = { + dict: { + "00283010": { + vr: "SQ", + Value: [ + { + "00283002": { + vr: "US", + Value: [0, 0, 16] + }, + "00283003": { + vr: "LO", + Value: ["NORMAL"] + }, + "00283006": { + vr: "OW", // US by standard + Value: [new ArrayBuffer()] + } + }, + { + "00283002": { + vr: "US", + Value: [0, 0, 16] + }, + "00283003": { + vr: "LO", + Value: ["HARDER"] + }, + "00283006": { + vr: "OW", // US by standard + Value: [new ArrayBuffer()] + } + }, + { + "00283002": { + vr: "US", + Value: [0, 0, 16] + }, + "00283003": { + vr: "LO", + Value: ["SOFTER"] + }, + "00283006": { + vr: "OW", // US by standard + Value: [new ArrayBuffer()] + } + } + ] + }, + "00180015": { + vr: "CS", + Value: ["CHEST"] + }, + "00080060": { + vr: "CS", + Value: ["DX"] + }, + "00100010": { + vr: "PN", + Value: [ + { + Alphabetic: "Qure Two" + } + ] + }, + "00100020": { + vr: "LO", + Value: ["ENM1-M0012260"] + }, + "00100040": { + vr: "CS", + Value: ["M"] + }, + "00104000": { + vr: "LO", // LT by standard + Value: ["Patient comment"] + } + } + }; + + const addedCustomDictionaryNameMap = { + LUTData: { + tag: "(0028,3006)", + vr: "US", + name: "LUTData", + vm: "1-n", + version: "DICOM" + }, + LUTDescriptor: { + tag: "(0028,3002)", + vr: "US", + name: "LUTDescriptor", + vm: "3", + version: "DICOM" + } + }; + + for (const key in addedCustomDictionaryNameMap) { + const element = addedCustomDictionaryNameMap[key]; + DicomMetaDictionary.dictionary[element.tag] = element; + } + DicomMetaDictionary._generateNameMap(); + + const dataset = dcmjs.data.DicomMetaDictionary.naturalizeDataset( + dicomTagsWithNonStandardVr.dict + ); + + expect(Object.keys(dataset._vrMap)).toContain("PatientComments"); + expect(dataset._vrMap.PatientComments).not.toEqual( + DicomMetaDictionary.nameMap.PatientComments.vr + ); + expect(dataset._vrMap.PatientComments).toEqual("LO"); + + dataset.VOILUTSequence.forEach(sequenceItem => { + expect(sequenceItem._vrMap).toBeDefined(); + expect(Object.keys(sequenceItem._vrMap).length).toBe(1); + expect(sequenceItem._vrMap.LUTData).toBe("OW"); // saved origin vr in _vrMap (by standard in addedCustomDictionaryNameMap is US) + }); + + const denaturalizedDataset = + dcmjs.data.DicomMetaDictionary.denaturalizeDataset(dataset); + + expect(denaturalizedDataset["00104000"].vr).toBe("LO"); + + denaturalizedDataset["00283010"].Value.forEach(sequenceItem => { + expect(sequenceItem["00283006"].vr).toBe("OW"); + }); +}); + it.each([ [1.0, "1"], [0.0, "0"],