From f7d03c5c11fd16bd0925e418823d6285e2664504 Mon Sep 17 00:00:00 2001 From: Weiwei Date: Mon, 16 Nov 2015 12:47:45 -0600 Subject: [PATCH] hanging protocols first commit --- Packages/hangingprotocols/package.js | 17 ++++ Packages/hangingprotocols/server/imageset.js | 20 +++++ Packages/hangingprotocols/server/match.js | 46 +++++++++++ Packages/hangingprotocols/server/namespace.js | 1 + Packages/hangingprotocols/server/select.js | 77 +++++++++++++++++++ 5 files changed, 161 insertions(+) create mode 100755 Packages/hangingprotocols/package.js create mode 100755 Packages/hangingprotocols/server/imageset.js create mode 100755 Packages/hangingprotocols/server/match.js create mode 100755 Packages/hangingprotocols/server/namespace.js create mode 100755 Packages/hangingprotocols/server/select.js diff --git a/Packages/hangingprotocols/package.js b/Packages/hangingprotocols/package.js new file mode 100755 index 000000000..53ceb71a4 --- /dev/null +++ b/Packages/hangingprotocols/package.js @@ -0,0 +1,17 @@ +Package.describe({ + name: "weiwei:hangingprotocols", + summary: "DICOM Haning Protocols", + version: '0.0.1' +}); + +Package.onUse(function (api) { + api.use("weiwei:dicomservices"); + + api.addFiles('server/namespace.js', 'server'); + + api.export("DICOMHP", 'server'); +}); + +Package.onTest(function (api){ + api.use(["weiwei:hangingprotocols"]); +}); \ No newline at end of file diff --git a/Packages/hangingprotocols/server/imageset.js b/Packages/hangingprotocols/server/imageset.js new file mode 100755 index 000000000..501b6723f --- /dev/null +++ b/Packages/hangingprotocols/server/imageset.js @@ -0,0 +1,20 @@ +DICOMHP.imageSet = function(setNumber, category) { + this.setNumber = setNumber; + this.category = category; +}; + +DICOMHP.imageSet.prototype.setRelativeTime = function(time) { + this.relativeTime = time; +}; + +DICOMHP.imageSet.prototype.setTimeUnits = function(units) { + this.timeUnits = units; +}; + +DICOMHP.imageSet.prototype.setPriorValue = function(priorValue) { + this.priorValue = priorValue; +}; + +DICOMHP.imageSet.prototype.retrieve = function(studyInstanceId) { + +}; \ No newline at end of file diff --git a/Packages/hangingprotocols/server/match.js b/Packages/hangingprotocols/server/match.js new file mode 100755 index 000000000..8b75a2a25 --- /dev/null +++ b/Packages/hangingprotocols/server/match.js @@ -0,0 +1,46 @@ +DICOMHP.match = function(studyInstanceUID) { + var metadata = DICOMService.retrieveMetadata(studyInstanceUID); + if (!metadata) { + return []; + } + var params = {"00080016" : "1.2.840.10008.5.1.4.38.1"}, modalities = metadata["00080061"].Value[0], + modalityMatch = null; + + if (modalities) { + modalityMatch = []; + modalities.split('\\').forEach(function(modality){ + if (modality && modality != 'SC') { + modalityMatch.push(modality); + } + }); + } + var firstInstance = DICOMService.retrieveMetadata(studyInstanceUID, null, null, {limit : 1}), + lateralityMatch = null; + + if (firstInstance.length > 0) { + lateralityMatch = firstInstance[0]["00200060"].Value[0]; + } + + // since orthanc doesn't support sequence matching + var allProtocols = DICOMService.searchForInstances(null, null, params); + if (allProtocols.length < 1) { + return []; + } + var matchedPrtocols = []; + allProtocols.forEach(function(protocol) { + var definitionSequence = protocol["0072000C"].Value; + definitionSequence.forEach(function(definition){ + var defModality = definition["00080060"].Value[0]; + if (defModality && modalityMatch && modalityMatch.indexOf(defModality) != -1) { + matchedPrtocols.push(protocol); + return; + } + var defLaterality = definition["00200060"].Value[0]; + if (defLaterality && (defLaterality == lateralityMatch)) { + matchedPrtocols.push(protocol); + return; + } + }); + }); + return matchedPrtocols; +}; \ No newline at end of file diff --git a/Packages/hangingprotocols/server/namespace.js b/Packages/hangingprotocols/server/namespace.js new file mode 100755 index 000000000..c99b179b9 --- /dev/null +++ b/Packages/hangingprotocols/server/namespace.js @@ -0,0 +1 @@ +DICOMHP = {}; \ No newline at end of file diff --git a/Packages/hangingprotocols/server/select.js b/Packages/hangingprotocols/server/select.js new file mode 100755 index 000000000..e3295665a --- /dev/null +++ b/Packages/hangingprotocols/server/select.js @@ -0,0 +1,77 @@ +DICOMHP.select = function(hpInstance) { + var imageSetsSequence = hpInstance["00720020"].Value; + if (!imageSetsSequence) { + return []; + } + var matchedImageSets = []; + imageSetsSequence.forEach(function(imageSet) { + var selectorSequence = imageSet["00720022"].Value; + selectorSequence.forEach(function(selector){ + var usageFlag = selector["00720024"].Value[0], + selectorAttribute = selector["00720026"].Value[0], + selectorAttributeVR = selector["00720050"].Value[0], + selectorAttributeValue = null; + + if (selectorAttributeVR == 'SQ') { + return; + } else if (selectorAttributeVR == 'AT') { + selectorAttributeValue = selector["00720060"].Value[0]; + } else if (selectorAttributeVR == 'CS') { + selectorAttributeValue = selector["00720062"].Value[0]; + } else if (selectorAttributeVR == 'IS') { + selectorAttributeValue = selector["00720064"].Value[0]; + } else if (selectorAttributeVR == 'LO') { + selectorAttributeValue = selector["00720066"].Value[0]; + } else if (selectorAttributeVR == 'LT') { + selectorAttributeValue = selector["00720068"].Value[0]; + } else if (selectorAttributeVR == 'PN') { + selectorAttributeValue = selector["0072006A"].Value[0]; + } else if (selectorAttributeVR == 'SH') { + selectorAttributeValue = selector["0072006C"].Value[0]; + } else if (selectorAttributeVR == 'ST') { + selectorAttributeValue = selector["0072006E"].Value[0]; + } else if (selectorAttributeVR == 'UT') { + selectorAttributeValue = selector["00720070"].Value[0]; + } else if (selectorAttributeVR == 'DS') { + selectorAttributeValue = selector["00720072"].Value[0]; + } else if (selectorAttributeVR == 'FD') { + selectorAttributeValue = selector["00720074"].Value[0]; + } else if (selectorAttributeVR == 'FL') { + selectorAttributeValue = selector["00720076"].Value[0]; + } else if (selectorAttributeVR == 'UL') { + selectorAttributeValue = selector["00720078"].Value[0]; + } else if (selectorAttributeVR == 'US') { + selectorAttributeValue = selector["0072007A"].Value[0]; + } else if (selectorAttributeVR == 'SL') { + selectorAttributeValue = selector["0072007C"].Value[0]; + } else if (selectorAttributeVR == 'SS') { + selectorAttributeValue = selector["0072007E"].Value[0]; + } + + if (selectorAttributeValue !== null) { + + } + }); + + var timeBasedImageSetsSequence = imageSet["00720030"].Value; + timeBasedImageSetsSequence.forEach(function(timeImageSet){ + var setNumber = timeImageSet["00720032"].Value[0], selectorCategory = timeImageSet["00720034"].Value[0]; + + var mImageSet = new DICOMHP.imageSet(setNumber, selectorCategory); + if (selectorCategory == 'RELATIVE_TIME') { + var relativeTime = timeImageSet["00720038"].Value[0], timeUnits = timeImageSet["0072003A"].Value[0]; + + mImageSet.setRelativeTime(relativeTime); + mImageSet.setTimeUnits(timeUnits); + } else if (selectorCategory == 'ABSTRACT_PRIOR') { + var priorValue = timeImageSet["0072003C"].Value[0]; + + mImageSet.setPriorValue(priorValue); + } + + matchedImageSets.push(mImageSet); + }); + }); + + return matchedImageSets; +}; \ No newline at end of file