diff --git a/LesionTracker/.gagarin/.gitignore b/LesionTracker/.gagarin/.gitignore deleted file mode 100644 index 408303742..000000000 --- a/LesionTracker/.gagarin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -local diff --git a/LesionTracker/.meteor/packages b/LesionTracker/.meteor/packages index e62f8de5a..4786bac69 100644 --- a/LesionTracker/.meteor/packages +++ b/LesionTracker/.meteor/packages @@ -41,7 +41,6 @@ ohif:cornerstone-settings ohif:viewerbase ohif:studies ohif:study-list -ohif:dicom-services ohif:hanging-protocols ohif:metadata diff --git a/LesionTracker/.meteor/versions b/LesionTracker/.meteor/versions index e1488d5dd..9539121c6 100644 --- a/LesionTracker/.meteor/versions +++ b/LesionTracker/.meteor/versions @@ -92,8 +92,6 @@ ohif:core@0.0.1 ohif:cornerstone@0.0.1 ohif:cornerstone-settings@0.0.1 ohif:design@0.0.1 -ohif:dicom-services@0.0.1 -ohif:dicomweb-client@0.0.1 ohif:hanging-protocols@0.0.1 ohif:header@0.0.1 ohif:hotkeys@0.0.1 @@ -143,7 +141,6 @@ tracker@1.2.0 ui@1.0.13 underscore@1.0.10 url@1.2.0 -validatejs@0.0.1 webapp@1.6.2 webapp-hashing@1.0.9 zuuk:stale-session@1.0.8 diff --git a/LesionTracker/client/components/app/app.html b/LesionTracker/client/components/app/app.html index ad36371ca..8b020bafc 100644 --- a/LesionTracker/client/components/app/app.html +++ b/LesionTracker/client/components/app/app.html @@ -14,6 +14,9 @@ {{/if}} {{/section}} {{#section 'headerMenu'}} + + INVESTIGATIONAL USE ONLY + {{userName}} -
-
- + {{#if paginationButtonsEnabled}} +
+
+ +
-
+ {{/if}}
{{/form}} diff --git a/Packages/ohif-core/client/components/paginationArea/paginationArea.js b/Packages/ohif-core/client/components/paginationArea/paginationArea.js index 908499aee..c3d482f29 100644 --- a/Packages/ohif-core/client/components/paginationArea/paginationArea.js +++ b/Packages/ohif-core/client/components/paginationArea/paginationArea.js @@ -1,8 +1,6 @@ import { Template } from 'meteor/templating'; import { SimpleSchema } from 'meteor/aldeed:simple-schema'; -import 'twbs-pagination'; - -const visiblePages = 10; +import { $ } from 'meteor/jquery'; Template.paginationArea.onCreated(function() { const instance = Template.instance(); @@ -19,60 +17,66 @@ Template.paginationArea.onCreated(function() { Template.paginationArea.onRendered(() => { const instance = Template.instance(); - instance.$paginationControl = instance.$('.pagination-control'); // Track changes on recordCount and rowsPerPage instance.autorun(() => { const recordCount = instance.data.recordCount.get(); const rowsPerPage = instance.data.rowsPerPage.get(); + const currentPage = instance.data.currentPage.get(); - // Destroy plugin if exists - if (instance.$paginationControl.data().twbsPagination) { - instance.$paginationControl.twbsPagination('destroy'); - } + Meteor.defer(() => { + const prevButton = instance.$('.prev')[0]; + const nextButton = instance.$('.next')[0]; + if (!prevButton || !nextButton) { + return; + } - if (recordCount && rowsPerPage) { - const totalPages = Math.ceil(recordCount / rowsPerPage); + // Enable if there are potentially more records, otherwise disable it + if (recordCount >= rowsPerPage) { + nextButton.classList.remove('disabled'); + } else { + nextButton.classList.add('disabled'); + } - // Initialize plugin - instance.$paginationControl.twbsPagination({ - totalPages, - visiblePages, - onPageClick: (event, page) => { - // Update currentPage - // Decrease page by 1 to set currentPage - // Since reactive table current page index starts by 0 - instance.data.currentPage.set(page - 1); - } - }); - } + // Enable the previous button if it is not the first page, otherwise disable it + if (currentPage > 0) { + prevButton.classList.remove('disabled'); + } else { + prevButton.classList.add('disabled'); + } + }); }); }); -Template.paginationArea.onDestroyed(() => { - const instance = Template.instance(); - if (instance.$paginationControl.data().twbsPagination) { - instance.$paginationControl.twbsPagination('destroy'); - } -}); - Template.paginationArea.helpers({ - recordCount() { + paginationButtonsEnabled() { const instance = Template.instance(); - return instance.data.recordCount.get(); - }, - isRowsPerPageSelected(rowsPerPage) { - const instance = Template.instance(); - return rowsPerPage === instance.data.rowsPerPage.get(); + const recordCount = instance.data.recordCount.get(); + const rowsPerPage = instance.data.rowsPerPage.get(); + const currentPage = instance.data.currentPage.get(); + + // Show pagination if it is not first page or there are potentially more records + return currentPage > 0 || recordCount >= rowsPerPage; } }); Template.paginationArea.events({ + 'click .prev > a'(event, instance) { + const currentPage = instance.data.currentPage.get(); + instance.data.currentPage.set(currentPage - 1); + }, + + 'click .next > a'(event, instance) { + const currentPage = instance.data.currentPage.get(); + instance.data.currentPage.set(currentPage + 1); + }, + 'change [data-key=rowsPerPage]'(event, instance) { const rowsPerPage = $(event.currentTarget).data('component').value(); // Update rowsPerPage instance.data.rowsPerPage.set(parseInt(rowsPerPage, 10)); + instance.data.currentPage.set(0); } }); diff --git a/Packages/ohif-core/client/components/paginationArea/paginationArea.styl b/Packages/ohif-core/client/components/paginationArea/paginationArea.styl index 3614f8442..ba174e885 100644 --- a/Packages/ohif-core/client/components/paginationArea/paginationArea.styl +++ b/Packages/ohif-core/client/components/paginationArea/paginationArea.styl @@ -18,7 +18,7 @@ select width: 42px - .page-number + .page-buttons margin: 0 text-align: right @@ -29,28 +29,34 @@ margin: 0 li + display: table-cell + padding: 5px 2px + a padding: 4px 8px theme('background-color', '$primaryBackgroundColor') theme('border-color', '$uiGray') theme('background-color', '$uiGrayDarkest') color: white - padding: 4px 8px + text-decoration: none &:hover theme('color', '$activeColor') - .active - a - theme('background-color', '$uiGray') - border-color: #ddd - color: white + .active + a + theme('background-color', '$uiGray') + border-color: #ddd + color: white .disabled + cursor: not-allowed + a, a:hover, a:focus, a:active theme('background-color', '$uiGrayDarkest') theme('border-color', '$uiGray') theme('color', '$uiGrayLight') + pointer-events: none &:not(.disabled):hover a theme('background-color', '$uiGrayDark') diff --git a/Packages/ohif-core/client/ui/handleError.js b/Packages/ohif-core/client/ui/handleError.js index b419d7e58..7d09d2a91 100644 --- a/Packages/ohif-core/client/ui/handleError.js +++ b/Packages/ohif-core/client/ui/handleError.js @@ -29,6 +29,7 @@ OHIF.ui.handleError = error => { cancelClass: 'btn-secondary' }, error || {}); + OHIF.log.error(error); // TODO: Find a better way to handle errors instead of displaying a dialog for all of them. // OHIF.ui.showDialog('dialogForm', data); }; diff --git a/Packages/ohif-core/client/ui/popover/display.js b/Packages/ohif-core/client/ui/popover/display.js index d53473678..2bd5bd9c4 100644 --- a/Packages/ohif-core/client/ui/popover/display.js +++ b/Packages/ohif-core/client/ui/popover/display.js @@ -52,25 +52,33 @@ OHIF.ui.showPopover = (templateName, popoverData, options={}) => { const popoverOptions = Object.assign({} , defaults, options); popoverOptions.content = Blaze.toHTMLWithData(template, popoverData); + if (popoverOptions.hideOnClick) { + $element.click(function() { + $(this).popover('hide'); + }); + } + $element.popover(popoverOptions); - $element.one('shown.bs.popover', function(event) { - const popoverId = $element.attr('aria-describedby'); - const popover = document.getElementById(popoverId); - const $popover = $(popover); - const $popoverContent = $popover.find('.popover-content'); - const dismissPopover = () => $element.popover('hide'); + if (popoverOptions.trigger !== 'hover') { + $element.one('shown.bs.popover', function(event) { + const popoverId = $element.attr('aria-describedby'); + const popover = document.getElementById(popoverId); + const $popover = $(popover); + const $popoverContent = $popover.find('.popover-content'); + const dismissPopover = () => $element.popover('hide'); - $popoverContent.html(''); + $popoverContent.html(''); - const view = Blaze.renderWithData(template, templateData, $popoverContent[0]); - $element.one('hidden.bs.popover', () => { - Blaze.remove(view); - $element.popover('destroy'); + const view = Blaze.renderWithData(template, templateData, $popoverContent[0]); + $element.one('hidden.bs.popover', () => { + Blaze.remove(view); + $element.popover('destroy'); + }); + + promise.then(dismissPopover).catch(dismissPopover); }); - - promise.then(dismissPopover).catch(dismissPopover); - }); + } if (popoverOptions.trigger === 'manual') { $element.popover('show'); diff --git a/Packages/ohif-core/main.js b/Packages/ohif-core/main.js index 90a0d542a..f79be869c 100644 --- a/Packages/ohif-core/main.js +++ b/Packages/ohif-core/main.js @@ -11,6 +11,7 @@ const OHIF = { viewer: {}, cornerstone: {}, user: {}, + DICOMWeb: {}, // Temporarily added }; // Expose the OHIF object to the client if it is on development mode diff --git a/Packages/ohif-core/package.js b/Packages/ohif-core/package.js index 1970ca2b1..7bbe87316 100644 --- a/Packages/ohif-core/package.js +++ b/Packages/ohif-core/package.js @@ -1,5 +1,5 @@ Npm.depends({ - 'twbs-pagination': '1.4.1' + 'isomorphic-base64': '1.0.2', }); Package.describe({ @@ -9,7 +9,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('standard-app-packages'); @@ -44,5 +44,4 @@ Package.onUse(function(api) { // Client and server imports api.addFiles('both/index.js', ['client', 'server']); - }); diff --git a/Packages/ohif-cornerstone-settings/imports/client/lib/classes/MetadataProvider.js b/Packages/ohif-cornerstone-settings/imports/client/lib/classes/MetadataProvider.js index 159f6ce69..1ad16af11 100644 --- a/Packages/ohif-cornerstone-settings/imports/client/lib/classes/MetadataProvider.js +++ b/Packages/ohif-cornerstone-settings/imports/client/lib/classes/MetadataProvider.js @@ -42,9 +42,10 @@ export class MetadataProvider { const seriesMetadata = data.series; const studyMetadata = data.study; const numImages = data.numImages; - const metadata = {}; + metadata.frameNumber = data.frameNumber; + metadata.study = { accessionNumber: studyMetadata.accessionNumber, patientId: studyMetadata.patientId, diff --git a/Packages/ohif-cornerstone-settings/package.js b/Packages/ohif-cornerstone-settings/package.js index a83f9bf88..df937dbb1 100644 --- a/Packages/ohif-cornerstone-settings/package.js +++ b/Packages/ohif-cornerstone-settings/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.5'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('ohif:cornerstone'); diff --git a/Packages/ohif-cornerstone/package.js b/Packages/ohif-cornerstone/package.js index 06e62f875..12761ca03 100644 --- a/Packages/ohif-cornerstone/package.js +++ b/Packages/ohif-cornerstone/package.js @@ -11,11 +11,11 @@ Npm.depends({ 'cornerstone-math': '0.1.6', 'dicom-parser': '1.8.0', 'cornerstone-wado-image-loader': '2.1.4', - 'dcmjs': '0.1.5' + 'dcmjs': '0.2.1' }); Package.onUse(function(api) { - api.versionsFrom('1.5'); + api.versionsFrom('1.7'); api.use('ecmascript'); diff --git a/Packages/ohif-design/package.js b/Packages/ohif-design/package.js index e4908627a..88fd0e93a 100644 --- a/Packages/ohif-design/package.js +++ b/Packages/ohif-design/package.js @@ -16,7 +16,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4.2.3'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('standard-app-packages'); diff --git a/Packages/ohif-dicom-services/package.js b/Packages/ohif-dicom-services/package.js deleted file mode 100755 index 7fae860dd..000000000 --- a/Packages/ohif-dicom-services/package.js +++ /dev/null @@ -1,27 +0,0 @@ -Package.describe({ - name: 'ohif:dicom-services', - summary: 'DICOM Services: DIMSE C-Service functions', - version: '0.0.1' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.4'); - - api.use('http'); - api.use('ecmascript'); - - // DIMSE functions - api.addFiles('server/DIMSE/require.js', 'server'); - api.addFiles('server/DIMSE/constants.js', 'server'); - api.addFiles('server/DIMSE/elements_data.js', 'server'); - api.addFiles('server/DIMSE/Field.js', 'server'); - api.addFiles('server/DIMSE/RWStream.js', 'server'); - api.addFiles('server/DIMSE/Data.js', 'server'); - api.addFiles('server/DIMSE/Message.js', 'server'); - api.addFiles('server/DIMSE/PDU.js', 'server'); - api.addFiles('server/DIMSE/CSocket.js', 'server'); - api.addFiles('server/DIMSE/Connection.js', 'server'); - api.addFiles('server/DIMSE/DIMSE.js', 'server'); - - api.export('DIMSE', 'server'); -}); diff --git a/Packages/ohif-dicom-services/server/DIMSE/CSocket.js b/Packages/ohif-dicom-services/server/DIMSE/CSocket.js deleted file mode 100755 index a5434e0f7..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/CSocket.js +++ /dev/null @@ -1,657 +0,0 @@ -import { OHIF } from 'meteor/ohif:core'; - -var EventEmitter = Npm.require('events').EventEmitter; - -function time() { - return Math.floor(Date.now() / 1000); -} - -function getRandomInt(min, max) { - return Math.floor(Math.random() * (max - min)) + min; -} - -var Envelope = function(command, dataset) { - EventEmitter.call(this); - this.command = command; - this.dataset = dataset; -}; - -util.inherits(Envelope, EventEmitter); - -CSocket = function(socket, options) { - EventEmitter.call(this); - this.socket = socket; - this.negotiatedContexts = {}; - this.receiving = null; - this.receiveLength = null; - this.minRecv = null; - this.lastReceived = null; - this.presentationContexts = []; - this.associated = false; - this.pendingPDVs = null; - this.connected = false; - this.started = null; - this.intervalId = null; - this.lastCommand = null; - this.lastSent = null; - this.messages = {}; - this.messageIdCounter = 0; - this.callingAe = null; - this.calledAe = null; - this.id = getRandomInt(1000, 9999); - this.options = options; - - var o = this; - this.socket.on('connect', function() { - OHIF.log.info('Connect'); - o.ready(); - }); - - this.socket.on('data', function(data) { - o.received(data); - }); - - this.socket.on('error', function(socketError) { - OHIF.log.error('There was an error with DIMSE connection socket.'); - OHIF.log.error(socketError.stack); - OHIF.log.trace(); - - o.emit('error', new Meteor.Error('server-internal-error', socketError.message)); - }); - - this.socket.on('timeout', function(socketError) { - OHIF.log.error('The connection timed out. The server is not responding.'); - OHIF.log.error(socketError.stack); - OHIF.log.trace(); - - o.emit('error', new Meteor.Error('server-connection-error', socketError.message)); - }); - - this.socket.on('close', function() { - if (o.intervalId) { - clearInterval(o.intervalId); - } - - o.connected = false; - OHIF.log.info('Connection closed'); - o.emit('close'); - }); - - this.on('released', function() { - this.released(); - }); - - this.on('aborted', function(pdu) { - OHIF.log.warn('Association aborted with reason ' + pdu.reason); - this.released(); - }); - - this.on('message', function(pdvs) { - this.receivedMessage(pdvs); - }); -}; - -util.inherits(CSocket, EventEmitter); - -CSocket.prototype.setCallingAE = function(ae) { - this.callingAe = ae; -}; - -CSocket.prototype.setCalledAe = function(ae) { - this.calledAe = ae; -}; - -CSocket.prototype.associate = function() { - var associateRQ = new AssociateRQ(); - associateRQ.setCalledAETitle(this.calledAe); - associateRQ.setCallingAETitle(this.callingAe); - associateRQ.setApplicationContextItem(new ApplicationContextItem()); - - var contextItems = []; - this.presentationContexts.forEach(function(context) { - var contextItem = new PresentationContextItem(), - syntaxes = []; - - context.transferSyntaxes.forEach(function(transferSyntax) { - var transfer = new TransferSyntaxItem(); - transfer.setTransferSyntaxName(transferSyntax); - syntaxes.push(transfer); - }); - contextItem.setTransferSyntaxesItems(syntaxes); - contextItem.setPresentationContextID(context.id); - - var abstractItem = new AbstractSyntaxItem(); - abstractItem.setAbstractSyntaxName(context.abstractSyntax); - contextItem.setAbstractSyntaxItem(abstractItem); - contextItems.push(contextItem); - }); - associateRQ.setPresentationContextItems(contextItems); - - var maxLengthItem = new MaximumLengthItem(), - classUIDItem = new ImplementationClassUIDItem(), - versionItem = new ImplementationVersionNameItem(); - - classUIDItem.setImplementationClassUID(C.IMPLEM_UID); - versionItem.setImplementationVersionName(C.IMPLEM_VERSION); - var packageSize = this.options.maxPackageSize ? this.options.maxPackageSize : C.DEFAULT_MAX_PACKAGE_SIZE; - maxLengthItem.setMaximumLengthReceived(packageSize); - - var userInfo = new UserInformationItem(); - userInfo.setUserDataItems([maxLengthItem, classUIDItem, versionItem]); - - associateRQ.setUserInformationItem(userInfo); - - this.send(associateRQ); -}; - -CSocket.prototype.getContext = function(id) { - for (var k in this.presentationContexts) { - var ctx = this.presentationContexts[k]; - if (id === ctx.id) { - return ctx; - } - } - - return null; -}; - -CSocket.prototype.getSyntax = function(contextId) { - if (!this.negotiatedContexts[contextId]) return null; - - return this.negotiatedContexts[contextId].transferSyntax; -}; - -CSocket.prototype.getContextByUID = function(uid) { - for (var k in this.negotiatedContexts) { - var ctx = this.negotiatedContexts[k]; - if (ctx.abstractSyntax === uid) { - return ctx; - } - } - - return null; -}; - -CSocket.prototype.getContextId = function(contextId) { - if (!this.negotiatedContexts[contextId]) { - return null; - } - - return this.negotiatedContexts[contextId].id; -}; - -CSocket.prototype.setPresentationContexts = function(uids) { - var contexts = [], - id = 0; - uids.forEach(function(uid) { - id++; - if (typeof uid === 'string') { - contexts.push({ - id: id, - abstractSyntax: uid, - transferSyntaxes: [C.IMPLICIT_LITTLE_ENDIAN, C.EXPLICIT_LITTLE_ENDIAN, C.EXPLICIT_BIG_ENDIAN] - }); - } else { - contexts.push({ - id: id, - abstractSyntax: uid.context, - transferSyntaxes: uid.syntaxes - }); - } - }); - this.presentationContexts = contexts; -}; - -CSocket.prototype.newMessageId = function() { - return (++this.messageIdCounter) % 65536; -}; - -CSocket.prototype.resetReceive = function() { - this.receiving = this.receiveLength = null; -}; - -CSocket.prototype.send = function(pdu, afterCbk) { - //console.log('SEND PDU-TYPE: ', pdu.type); - var toSend = pdu.buffer(); - //console.log('send buffer', toSend.toString('hex')); - return this.socket.write(toSend, afterCbk ? afterCbk : null); -}; - -CSocket.prototype.release = function() { - var releaseRQ = new ReleaseRQ(); - this.send(releaseRQ); -}; - -CSocket.prototype.released = function() { - this.socket.end(); -}; - -CSocket.prototype.ready = function() { - OHIF.log.info('Connection established'); - this.connected = true; - this.started = time(); - - var o = this; - if (this.options.idle) { - this.intervalId = setInterval(function() { - o.checkIdle(); - }, 3000); - } -}; - -CSocket.prototype.checkIdle = function() { - var current = time(), - idl = this.options.idle; - - if (!this.lastReceived && (current - this.started >= idl)) { - this.idleClose(); - } else if (this.lastReceived && (current - this.lastReceived >= idl)) { - this.idleClose(); - } -}; - -CSocket.prototype.idleClose = function() { - OHIF.log.info('Exceed idle time, closing connection'); - this.release(); -}; - -CSocket.prototype.received = function(data) { - do { - data = this.process(data); - } while (data !== null); - this.lastReceived = time(); -}; - -CSocket.prototype.process = function(data) { - if (this.receiving === null) { - if (this.minRecv) { - data = Buffer.concat([this.minRecv, data], this.minRecv.length + data.length); - this.minRecv = null; - } - - if (data.length < 6) { - this.minRecv = data; - return null; - } - - var stream = new ReadStream(data); - var type = stream.read(C.TYPE_UINT8); - stream.increment(1); - var len = stream.read(C.TYPE_UINT32), - cmp = data.length - 6; - if (len > cmp) { - this.receiving = data; - this.receiveLength = len; - } else { - var process = data, - remaining = null; - if (len < cmp) { - process = data.slice(0, len + 6); - remaining = data.slice(len + 6, cmp + 6); - } - - this.resetReceive(); - this.interpret(new ReadStream(process), this); - if (remaining) { - return remaining; - } - } - } else { - OHIF.log.info('Data received'); - var newData = Buffer.concat([this.receiving, data], this.receiving.length + data.length), - pduLength = newData.length - 6; - - if (pduLength < this.receiveLength) { - this.receiving = newData; - } else { - var remaining = null; - if (pduLength > this.receiveLength) { - remaining = newData.slice(this.receiveLength + 6, pduLength + 6); - newData = newData.slice(0, this.receiveLength + 6); - } - - this.resetReceive(); - this.interpret(new ReadStream(newData)); - if (remaining) { - return remaining; - } - } - } - - return null; -}; - -CSocket.prototype.interpret = function(stream) { - var pdatas = [], - size = stream.size(), - o = this; - while (stream.offset < size) { - var pdu = PDU.createByStream(stream); - //console.log("Received PDU-TYPE " + PDU.typeToString(pdu.type)); - if (pdu.is(C.ITEM_TYPE_PDU_ASSOCIATE_AC)) { - pdu.presentationContextItems.forEach(function(ctx) { - var requested = o.getContext(ctx.presentationContextID); - if (!requested) { - throw 'Accepted presentation context not found'; - } - - o.negotiatedContexts[ctx.presentationContextID] = { - id: ctx.presentationContextID, - transferSyntax: ctx.transferSyntaxesItems[0].transferSyntaxName, - abstractSyntax: requested.abstractSyntax - }; - }); - - //console.log('Accepted'); - this.associated = true; - this.emit('associated', pdu); - } else if (pdu.is(C.ITEM_TYPE_PDU_ASSOCIATE_RQ)) { - var accepd = new AssociateAC(); - - pdu.presentationContextItems.forEach(function(ctx) { - - }); - } else if (pdu.is(C.ITEM_TYPE_PDU_RELEASE_RP)) { - //console.log('Released'); - this.associated = false; - this.emit('released'); - } else if (pdu.is(C.ITEM_TYPE_PDU_AABORT)) { - //console.log('Aborted'); - this.emit('aborted', pdu); - } else if (pdu.is(C.ITEM_TYPE_PDU_PDATA)) { - pdatas.push(pdu); - } - } - - if (pdatas) { - var pdvs = this.pendingPDVs ? this.pendingPDVs : []; - pdatas.forEach(function(pdata) { - pdvs = pdvs.concat(pdata.presentationDataValueItems); - }); - this.pendingPDVs = null; - var i = 0, - count = pdvs.length; - while (i < count) { - if (!pdvs[i].isLast) { - var j = i + 1; - while (j < count) { - pdvs[i].messageStream.concat(pdvs[j].messageStream); - if (pdvs[j++].isLast) { - pdvs[i].isLast = true; - break; - } - } - - if (pdvs[i].isLast) { - this.emit('message', pdvs[i]); - } else { - this.pendingPDVs = [pdvs[i]]; - } - - i = j; - } else { - this.emit('message', pdvs[i++]); - } - } - } -}; - -CSocket.prototype.receivedMessage = function(pdv) { - var syntax = this.getSyntax(pdv.contextId), - msg = DicomMessage.read(pdv.messageStream, pdv.type, syntax, this.options.vr); - - if (msg.isCommand()) { - this.lastCommand = msg; - - if (msg.isResponse()) { - var replyId = msg.respondedTo(), - listener = this.messages[replyId].listener; - - if (msg.is(C.COMMAND_C_GET_RSP) || msg.is(C.COMMAND_C_MOVE_RSP)) { - //console.log('remaining', msg.getNumOfRemainingSubOperations(), msg.getNumOfCompletedSubOperations()); - } - - if (msg.failure()) { - OHIF.log.info('message failed with status ', msg.getStatus().toString(16)); - } - - listener.emit('response', msg); - if (msg.isFinal()) { - if (listener) { - listener.emit('end', msg); - - if (!msg.haveData()) - delete this.messages[replyId]; - } - - if (msg.is(C.COMMAND_C_GET_RSP)) { - if (!msg.getNumOfRemainingSubOperations()) { - if (this.lastGets && this.lastGets.length > 0) this.lastGets.shift(); - } - } - } - } else { - /*if (msg.is(0x01)) { - console.log('ae title ', msg.getValue(0x00001031)) - }*/ - } - - } else { - if (!this.lastCommand) { - throw 'Only dataset?'; - } else if (!this.lastCommand.haveData()) { - throw "Last command didn't indicate presence of data"; - } - - if (this.lastCommand.isResponse()) { - var replyId = this.lastCommand.respondedTo(); - if (this.messages[replyId].listener) { - var flag = this.lastCommand.failure() ? true : false; - - this.messages[replyId].listener.emit('result', msg, flag); - - if (this.lastCommand.failure()) { - delete this.messages[replyId]; - } - } - } else { - if (this.lastCommand.is(C.COMMAND_C_STORE_RQ)) { - var moveMessageId = this.lastCommand.getMoveMessageId(), - useId = moveMessageId; - if (!moveMessageId) { - //!! Going to deprecate now - //kinda hacky but we know this c-store is came from a c-get - if (this.lastGets.length > 0) { - useId = this.lastGets[0]; - } else { - throw 'Where does this c-store came from?'; - } - } else{ - OHIF.log.info('move ', moveMessageId); - } - - //this.storeResponse(useId, msg); - } - } - } -}; - -CSocket.prototype.wrapToPData = function(message, context) { - var useContext = message.contextUID ? message.contextUID : context; - var ctx = this.getContextByUID(useContext); - - var pdata = new PDataTF(), - pdv = new PresentationDataValueItem(ctx.id); - pdv.setMessage(message); - pdata.setPresentationDataValueItems([pdv]); - return pdata; -}; - -CSocket.prototype.sendMessage = function(context, command, dataset) { - var nContext = this.getContextByUID(context), - syntax = nContext.transferSyntax, - cid = nContext.id, - messageId = this.newMessageId(), - msgData = {}; - - msgData.listener = new Envelope(command); - - var o = this; - msgData.listener.on('cancel', function() { - var cancelMessage = null; - if (this.command.is(C.COMMAND_C_FIND_RQ) || this.command.is(C.COMMAND_C_MOVE_RQ)) { - cancelMessage = new CCancelRQ(); - - cancelMessage.setReplyMessageId(this.command.messageId); - cancelMessage.setSyntax(C.IMPLICIT_LITTLE_ENDIAN); - - o.send(o.wrapToPData(cancelMessage, this.command.contextUID)); - } - }); - - command.setSyntax(C.IMPLICIT_LITTLE_ENDIAN); - command.setContextId(context); - command.setMessageId(messageId); - if (dataset) { - command.setDataSetPresent(C.DATA_SET_PRESENT); - } - - this.lastSent = command; - if (command.is(C.COMMAND_C_GET_RQ)) { - this.lastGets.push(messageId); - } - - var pdata = this.wrapToPData(command); - - msgData.command = command; - this.messages[messageId] = msgData; - OHIF.log.info('Sending command ' + command.typeString()); - this.send(pdata); - if (dataset && typeof dataset === 'object') { - dataset.setSyntax(syntax); - var dsData = new PDataTF(), - dPdv = new PresentationDataValueItem(cid); - - dPdv.setMessage(dataset); - dsData.setPresentationDataValueItems([dPdv]); - this.send(dsData); - } - - return msgData.listener; -}; - -CSocket.prototype.sendPData = function(pdv, after) { - var pdata = new PDataTF(); - pdata.setPresentationDataValueItems([pdv]); - //console.log('Sending pdata'); - //console.log(pdata.totalLength()); - this.send(pdata, after); -}; - -CSocket.prototype.verify = function() { - this.setPresentationContexts([C.SOP_VERIFICATION]); - this.startAssociationRequest(function() { - //associated, we can release now - this.release(); - }); -}; - -CSocket.prototype.wrapMessage = function(data) { - if (data) { - var datasetMessage = new DataSetMessage(); - datasetMessage.setElements(data); - return datasetMessage; - } else { - return data; - } -}; - -CSocket.prototype.find = function(params, options) { - return this.sendMessage(options.context, new CFindRQ(), this.wrapMessage(params)); -}; - -CSocket.prototype.move = function(destination, params, options) { - var moveMessage = new CMoveRQ(); - moveMessage.setDestination(destination); - - return this.sendMessage(options.context, moveMessage, this.wrapMessage(params)); -}; - -CSocket.prototype.storeInstance = function(sopClassUID, sopInstanceUID, options) { - var storeMessage = new CStoreRQ(); - storeMessage.setAffectedSOPInstanceUID(sopInstanceUID); - storeMessage.setAffectedSOPClassUID(sopClassUID); - - return this.sendMessage(sopClassUID, storeMessage, true); -}; - -CSocket.prototype.moveInstances = function(destination, params, options) { - var sendParams = Object.assign({ - 0x00080052: C.QUERY_RETRIEVE_LEVEL_IMAGE, - }, params); - options = Object.assign({ - context: C.SOP_STUDY_ROOT_MOVE - }, options); - - return this.move(destination, sendParams, options); -}; - -CSocket.prototype.findPatients = function(params, options) { - var sendParams = Object.assign({ - 0x00080052: C.QUERY_RETRIEVE_LEVEL_PATIENT, - 0x00100010: '', - 0x00100020: '', - 0x00100030: '', - 0x00100040: '', - }, params); - options = Object.assign({ - context: C.SOP_PATIENT_ROOT_FIND - }, options); - - return this.find(sendParams, options); -}; - -CSocket.prototype.findStudies = function(params, options) { - var sendParams = Object.assign({ - 0x00080052: C.QUERY_RETRIEVE_LEVEL_STUDY, - 0x00080020: '', - 0x00100010: '', - 0x00080061: '', - 0x0020000D: '' - }, params); - options = Object.assign({ - context: C.SOP_STUDY_ROOT_FIND - }, options); - - return this.find(sendParams, options); -}; - -CSocket.prototype.findSeries = function(params, options) { - var sendParams = Object.assign({ - 0x00080052: C.QUERY_RETRIEVE_LEVEL_SERIES, - 0x00080020: '', - 0x0020000E: '', - 0x0008103E: '', - 0x0020000D: '' - }, params); - options = Object.assign({ - context: C.SOP_STUDY_ROOT_FIND - }, options); - - return this.find(sendParams, options); -}; - -CSocket.prototype.findInstances = function(params, options) { - var sendParams = Object.assign({ - 0x00080052: C.QUERY_RETRIEVE_LEVEL_IMAGE, - 0x00080020: '', - 0x0020000E: '', - 0x0008103E: '', - 0x0020000D: '' - }, params); - options = Object.assign({ - context: C.SOP_STUDY_ROOT_FIND - }, options); - - return this.find(sendParams, options); -}; diff --git a/Packages/ohif-dicom-services/server/DIMSE/Connection.js b/Packages/ohif-dicom-services/server/DIMSE/Connection.js deleted file mode 100755 index 865c6eb4e..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/Connection.js +++ /dev/null @@ -1,291 +0,0 @@ -import { _ } from 'meteor/underscore'; -import { OHIF } from 'meteor/ohif:core'; - -// Uses NodeJS 'net' -// https://nodejs.org/api/net.html -var net = Npm.require('net'); -var Socket = net.Socket; - -Connection = function(options) { - EventEmitter.call(this); - this.options = Object.assign({ - maxPackageSize: C.DEFAULT_MAX_PACKAGE_SIZE, - idle: false, - reconnect: true, - vr: { - split: true - } - }, options); - - this.reset(); -}; - -util.inherits(Connection, EventEmitter); - -var StoreHandle = function() { - EventEmitter.call(this); -}; - -util.inherits(StoreHandle, EventEmitter); - -Connection.prototype.reset = function() { - this.defaultPeer = null; - this.defaultServer = null; - - _.each(this.peers, peerInfo => { - _.each(peerInfo.sockets, socket => socket.emit('close')); - }); - - this.peers = {}; -}; - -Connection.prototype.addPeer = function(options) { - if (!options.aeTitle || !options.host || !options.port) { - return false; - } - - var peer = { - host: options.host, - port: options.port, - sockets: {} - }; - - this.peers[options.aeTitle] = peer; - if (options.default) { - if (options.server) { - this.defaultServer = options.aeTitle; - } else { - this.defaultPeer = options.aeTitle; - } - } - - if (options.server) { - //start listening - peer.server = net.createServer(); - peer.server.listen(options.port, options.host, function() { - OHIF.log.info('listening on', this.address()); - }); - peer.server.on('error', function(err) { - OHIF.log.info('server error', err); - }); - peer.server.on('connection', nativeSocket => { - //incoming connections - var socket = new CSocket(nativeSocket, this.options); - this.addSocket(options.aeTitle, socket); - - //close server on close socket - socket.on('close', function() { - peer.server.close(); - }); - }); - } -}; - -Connection.prototype.selectPeer = function(aeTitle) { - if (!aeTitle || !this.peers[aeTitle]) { - throw 'No such peer'; - } - - return this.peers[aeTitle]; -}; - -Connection.prototype._sendFile = function(socket, sHandle, file, maxSend, metaLength, list) { - var fileNameText = typeof file.file === 'string' ? file.file : 'buffer'; - OHIF.log.info(`Sending file ${fileNameText}`); - var useContext = socket.getContextByUID(file.context); - var self = this; - - PDU.generatePDatas(useContext.id, file.file, maxSend, null, metaLength, function(err, handle) { - if (err) { - OHIF.log.info('Error while sending file'); - return; - } - - var processNext = function() { - var next = list.shift(); - if (next) { - self._sendFile(socket, sHandle, next, maxSend, metaLength, list); - } else { - socket.release(); - } - }; - - var store = socket.storeInstance(useContext.abstractSyntax, file.uid); - handle.on('pdv', function(pdv) { - socket.sendPData(pdv); - }); - handle.on('error', function(err) { - sHandle.emit('file', err, fileNameText); - processNext(); - }); - store.on('response', function(msg) { - var statusText = msg.getStatus().toString(16); - OHIF.log.info('STORE reponse with status', statusText); - var error = null; - if (msg.failure()) { - error = new Error(statusText); - } - - sHandle.emit('file', error, fileNameText); - processNext(); - }); - }); -}; - -Connection.prototype.storeInstances = function(fileList) { - var contexts = {}; - var read = 0; - var length = fileList.length; - var toSend = []; - var self = this; - var handle = new StoreHandle(); - var lastProcessedMetaLength; - - fileList.forEach(function(bufferOrFile) { - var fileNameText = typeof bufferOrFile === 'string' ? bufferOrFile : 'buffer'; - DicomMessage.readMetaHeader(bufferOrFile, function(err, metaMessage, metaLength) { - read++; - if (err) { - handle.emit('file', err, fileNameText); - if (read === length && toSend.length > 0 && lastProcessedMetaLength) { - sendProcessedFiles(self, contexts, toSend, handle, lastProcessedMetaLength); - } - - return; - } - - OHIF.log.info(`Dicom file ${(typeof bufferOrFile === 'string' ? bufferOrFile : 'buffer')} found`); - lastProcessedMetaLength = metaLength; - var syntax = metaMessage.getValue(0x00020010); - var sopClassUID = metaMessage.getValue(0x00020002); - var instanceUID = metaMessage.getValue(0x00020003); - - if (!contexts[sopClassUID]) { - contexts[sopClassUID] = []; - } - - if (syntax && contexts[sopClassUID].indexOf(syntax) === -1) { - contexts[sopClassUID].push(syntax); - } - - toSend.push({ - file: bufferOrFile, - context: sopClassUID, - uid: instanceUID - }); - - if (read === length) { - sendProcessedFiles(self, contexts, toSend, handle, metaLength); - } - }); - }); - return handle; -}; - -// Starts to send dcm files -sendProcessedFiles = function(self, contexts, toSend, handle, metaLength) { - var useContexts = []; - _.each(contexts, (useSyntaxes, context) => { - if (useSyntaxes.length > 0) { - useContexts.push({ - context: context, - syntaxes: useSyntaxes - }); - } else { - throw 'No syntax specified for context ' + context; - } - }); - - self.associate({ - contexts: useContexts - }, function(ac) { - var maxSend = ac.getMaxSize(); - var next = toSend.shift(); - self._sendFile(this, handle, next, maxSend, metaLength, toSend); - - }); -}; - -Connection.prototype.storeResponse = function(messageId, msg) { - var rq = this.messages[messageId]; - - if (rq.listener[2]) { - var status = rq.listener[2].call(this, msg); - if (status !== undefined && status !== null && rq.command.store) { - //store ok, ready to send c-store-rsp - var storeSr = rq.command.store; - var replyMessage = storeSr.replyWith(status); - replyMessage.setAffectedSOPInstanceUID(this.lastCommand.getSOPInstanceUID()); - replyMessage.setReplyMessageId(this.lastCommand.messageId); - this.sendMessage(replyMessage, null, null, storeSr); - } else { - throw 'Missing store status'; - } - } -}; - -Connection.prototype.allClosed = function() { - var allClosed = true; - for (var i in this.peers) { - if (Object.keys(peers[i].sockets).length > 0) { - allClosed = false; - break; - } - } - - return allClosed; -}; - -Connection.prototype.addSocket = function(hostAE, socket) { - var peerInfo = this.selectPeer(hostAE); - - peerInfo.sockets[socket.id] = socket; - - socket.on('close', function() { - if (peerInfo.sockets[this.id]) { - delete peerInfo.sockets[this.id]; - } - }); -}; - -Connection.prototype.associate = function(options, callback) { - const self = this; - var hostAE = options.hostAE ? options.hostAE : this.defaultPeer; - var sourceAE = options.sourceAE ? options.sourceAE : this.defaultServer; - - if (!hostAE || !sourceAE) { - throw 'Peers not provided or no defaults in settings'; - } - - var peerInfo = this.selectPeer(hostAE); - var nativeSocket = new Socket(); - - var socket = new CSocket(nativeSocket, this.options); - - if (callback) { - socket.once('associated', callback); - } - - OHIF.log.info('Starting Connection...'); - - socket.setCalledAe(hostAE); - socket.setCallingAE(sourceAE); - - nativeSocket.connect({ - host: peerInfo.host, - port: peerInfo.port - }, () => { - //connected - this.addSocket(hostAE, socket); - - if (options.contexts) { - socket.setPresentationContexts(options.contexts); - } else { - throw new Meteor.Error('Contexts must be specified'); - } - - socket.associate(); - }); - - return socket; -}; diff --git a/Packages/ohif-dicom-services/server/DIMSE/DIMSE.js b/Packages/ohif-dicom-services/server/DIMSE/DIMSE.js deleted file mode 100755 index e299f8f0f..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/DIMSE.js +++ /dev/null @@ -1,368 +0,0 @@ -import { OHIF } from 'meteor/ohif:core'; - -var Future = Npm.require('fibers/future'); - -DIMSE = { - connection: new Connection({ - vr: { - split: false - } - }) -}; - -var conn = DIMSE.connection; - -var getInstanceRetrievalParams = function(studyInstanceUID, seriesInstanceUID) { - return { - 0x0020000D: studyInstanceUID ? studyInstanceUID : '', - 0x0020000E: (studyInstanceUID && seriesInstanceUID) ? seriesInstanceUID : '', - 0x00080005: '', // specificCharacterSet - 0x00080020: '', // studyDate - 0x00080030: '', // studyDescription - 0x00080090: '', // referringPhysicianName - 0x00100010: '', // patientName - 0x00100020: '', // patientId - 0x00100030: '', // patientBirthDate - 0x00100040: '', // patientSex - 0x00200010: '', // studyId - 0x0008103E: '', // seriesDescription - 0x00200011: '', // seriesNumber - 0x00080080: '', // institutionName - 0x00080016: '', // sopClassUid - 0x00080018: '', // sopInstanceUid - 0x00080060: '', // modality - 0x00200013: '', // instanceNumber - 0x00280010: '', // rows - 0x00280011: '', // columns - 0x00280100: '', // bitsAllocated - 0x00280101: '', // bitsStored - 0x00280102: '', // highBit - 0x00280103: '', // pixelRepresentation - 0x00280004: '', // photometricInterpretation - 0x0008002A: '', // acquisitionDatetime - 0x00280008: '', // numFrames - //0x00280009: '', // frameIncrementPointer // This appears to be breaking Orthanc DIMSE connections - 0x00181063: '', // frameTime - 0x00181065: '', // frameTimeVector - 0x00281052: '', // rescaleIntercept - 0x00281053: '', // rescaleSlope - 0x00280002: '', // samplesPerPixel - 0x00180050: '', // sliceThickness - 0x00201041: '', // sliceLocation - //0x00189327: '', // tablePosition // This appears to be breaking Orthanc DIMSE connections - 0x00281050: '', // windowCenter - 0x00281051: '', // windowWidth - 0x00280030: '', // pixelSpacing - 0x00200062: '', // laterality - 0x00185101: '', // viewPosition - 0x00080008: '', // imageType - 0x00200032: '', // imagePositionPatient - 0x00200037: '', // imageOrientationPatient - 0x00200052: '', // frameOfReferenceUID - 0x00282110: '', // lossyImageCompression - 0x00282112: '', // lossyImageCompressionRatio - 0x00282114: '', // lossyImageCompressionMethod, - 0x00180088: '' // spacingBetweenSlices - - // Orthanc has a bug here so we can't retrieve sequences at the moment - // https://groups.google.com/forum/#!topic/orthanc-users/ghKJfvtnK8Y - //0x00282111: '', // derivationDescription - //0x00082112: '' // sourceImageSequence - }; -}; - -DIMSE.associate = function(contexts, callback, options) { - var defaults = { - contexts: contexts - }; - options = Object.assign(defaults, options); - - OHIF.log.info('Associating...'); - - const socket = conn.associate(options, function(pdu) { - // associated - OHIF.log.info('==Associated'); - callback.call(this, null, pdu); - }); - - socket.on('error', function (error) { - callback(error, null); - }); - - socket.on('timeout', function (error) { - callback(error, null); - }); -}; - -DIMSE.retrievePatients = function(params, options) { - //var start = new Date(); - var future = new Future; - DIMSE.associate([C.SOP_PATIENT_ROOT_FIND], function(error, pdu) { - if (error) { - OHIF.log.error('Could not retrieve patients'); - OHIF.log.trace(); - - return future.return([]); - } - - var defaultParams = { - 0x00100010: '', - 0x00100020: '', - 0x00100030: '', - 0x00100040: '', - 0x00101010: '', - 0x00101040: '' - }; - - var result = this.findPatients(Object.assign(defaultParams, params)), - o = this; - - var patients = []; - result.on('result', function(msg) { - patients.push(msg); - }); - - result.on('end', function() { - o.release(); - }); - - this.on('close', function() { - //var time = new Date() - start;console.log(time + 'ms taken'); - future.return(patients); - }); - }, options); - return future.wait(); -}; - -DIMSE.retrieveStudies = function(params, options) { - //var start = new Date(); - var future = new Future; - DIMSE.associate([C.SOP_STUDY_ROOT_FIND], function(error, pdu) { - if (error) { - OHIF.log.error('Could not retrieve studies'); - OHIF.log.trace(); - - return future.throw(error); - } - - var defaultParams = { - 0x0020000D: '', - 0x00080060: '', - 0x00080005: '', - 0x00080020: '', - 0x00080030: '', - 0x00080090: '', - 0x00100010: '', - 0x00100020: '', - 0x00200010: '', - 0x00100030: '' - }; - - var result = this.findStudies(Object.assign(defaultParams, params)), - o = this; - - var studies = []; - result.on('result', function(msg) { - studies.push(msg); - }); - - result.on('end', function() { - o.release(); - }); - - this.on('close', function() { - //var time = new Date() - start;console.log(time + 'ms taken'); - future.return(studies); - }); - }, options); - return future.wait(); -}; - -DIMSE._retrieveInstancesBySeries = function(conn, series, studyInstanceUID, callback, params) { - var aSeries = series.shift(), - seriesInstanceUID = aSeries.getValue(0x0020000E), - defaultParams = getInstanceRetrievalParams(studyInstanceUID, seriesInstanceUID); - - var result = conn.findInstances(Object.assign(defaultParams, params)), - instances = []; - - result.on('result', function(msg) { - instances.push(msg); - }); - result.on('end', function() { - if (series.length > 0) { - callback(instances, false); - DIMSE._retrieveInstancesBySeries(conn, series, studyInstanceUID, callback, params); - } else { - callback(instances, true); - } - }); -}; - -DIMSE.retrieveInstancesByStudyOnlyMulti = function(studyInstanceUID, params, options) { - if (!studyInstanceUID) { - return []; - } - - var series = DIMSE.retrieveSeries(studyInstanceUID, params, options), - instances = []; - series.forEach(function(seriesData) { - var seriesInstanceUID = seriesData.getValue(0x0020000E); - - var relatedInstances = DIMSE.retrieveInstances(studyInstanceUID, seriesInstanceUID, params, options); - instances = instances.concat(relatedInstances); - }); - return instances; -}; - -DIMSE.retrieveInstancesByStudyOnly = function(studyInstanceUID, params, options) { - if (!studyInstanceUID) { - return []; - } - - var future = new Future; - DIMSE.associate([C.SOP_STUDY_ROOT_FIND], function(error, pdu) { - if (error) { - OHIF.log.error('Could not retrieve Instances By Study'); - OHIF.log.trace(); - - return future.throw(error); - } - - var defaultParams = { - 0x0020000D: studyInstanceUID, - 0x00080005: '', - 0x00080020: '', - 0x00080030: '', - 0x00080090: '', - 0x00100010: '', - 0x00100020: '', - 0x00200010: '', - 0x0008103E: '', - 0x0020000E: '', - 0x00200011: '' - }; - var result = this.findSeries(Object.assign(defaultParams, params)); - var series = []; - var conn = this; - var allInstances = []; - - result.on('result', function(msg) { - series.push(msg); - }); - result.on('end', function() { - if (series.length > 0) { - DIMSE._retrieveInstancesBySeries(conn, series, studyInstanceUID, function(relatedInstances, isEnd) { - allInstances = allInstances.concat(relatedInstances); - if (isEnd) { - conn.release(); - } - }); - } else { - conn.release(); - } - }); - conn.on('close', function() { - future.return(allInstances); - }); - }); - return future.wait(); -}; - -DIMSE.retrieveSeries = function(studyInstanceUID, params, options) { - var future = new Future; - DIMSE.associate([C.SOP_STUDY_ROOT_FIND], function(error, pdu) { - if (error) { - OHIF.log.error('Could not retrieve series'); - OHIF.log.trace(); - - return future.return([]); - } - - var defaultParams = { - 0x0020000D: studyInstanceUID ? studyInstanceUID : '', - 0x00080005: '', - 0x00080020: '', - 0x00080030: '', - 0x00080090: '', - 0x00100010: '', - 0x00100020: '', - 0x00200010: '', - 0x0008103E: '', - 0x0020000E: '', - 0x00200011: '' - }; - - var result = this.findSeries(Object.assign(defaultParams, params)), - o = this; - - var series = []; - result.on('result', function(msg) { - series.push(msg); - }); - - result.on('end', function() { - o.release(); - }); - - this.on('close', function() { - future.return(series); - }); - }, options); - return future.wait(); -}; - -DIMSE.retrieveInstances = function(studyInstanceUID, seriesInstanceUID, params, options) { - var future = new Future; - DIMSE.associate([C.SOP_STUDY_ROOT_FIND], function(error, pdu) { - if (error) { - OHIF.log.error('Could not retrieve instances'); - OHIF.log.trace(); - - return future.throw(error); - } - - var defaultParams = getInstanceRetrievalParams(studyInstanceUID, seriesInstanceUID); - var result = this.findInstances(Object.assign(defaultParams, params)), - o = this; - - var instances = []; - result.on('result', function(msg) { - instances.push(msg); - }); - - result.on('end', function() { - o.release(); - }); - - this.on('close', function() { - future.return(instances); - }); - }, options); - return future.wait(); -}; - -DIMSE.storeInstances = function(fileList, callback) { - var handle = conn.storeInstances(fileList); - handle.on('file', function(err, file) { - callback(err, file); - }); -}; - -DIMSE.moveInstances = function(studyInstanceUID, seriesInstanceUID, sopInstanceUID, sopClassUID, params) { - DIMSE.associate([C.SOP_STUDY_ROOT_MOVE, sopClassUID], function(error) { - if (error) { - OHIF.log.error('Could not move instances'); - OHIF.log.trace(); - - return; - } - - var defaultParams = { - 0x0020000D: studyInstanceUID ? studyInstanceUID : '', - 0x0020000E: seriesInstanceUID ? seriesInstanceUID : '', - 0x00080018: sopInstanceUID ? sopInstanceUID : '' - }; - this.moveInstances('OHIFDCM', Object.assign(defaultParams, params)); - }); -}; diff --git a/Packages/ohif-dicom-services/server/DIMSE/Data.js b/Packages/ohif-dicom-services/server/DIMSE/Data.js deleted file mode 100755 index 68fc3bec5..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/Data.js +++ /dev/null @@ -1,1050 +0,0 @@ -function paddingLeft(paddingValue, string) { - return String(paddingValue + string).slice(-paddingValue.length); -} - -function rtrim(str) { - return str.replace(/\s*$/g, ''); -} - -function ltrim(str) { - return str.replace(/^\s*/g, ''); -} - -function fieldsLength(fields) { - var length = 0; - fields.forEach(function(field) { - length += field.length(); - }); - return length; -} - -Tag = function(value) { - this.value = value; -}; - -Tag.prototype.toString = function() { - return '(' + paddingLeft('0000', this.group().toString(16)) + ',' + - paddingLeft('0000', this.element().toString(16)) + ')'; -}; - -Tag.prototype.is = function(t) { - return this.value === t; -}; - -Tag.prototype.group = function() { - return this.value >>> 16; -}; - -Tag.prototype.element = function() { - return this.value & 0xffff; -}; - -Tag.prototype.isPixelDataTag = function() { - return this.is(0x7fe00010); -} - -tagFromNumbers = function(group, element) { - return new Tag(((group << 16) | element) >>> 0); -}; - -function readTag(stream) { - var group = stream.read(C.TYPE_UINT16), - element = stream.read(C.TYPE_UINT16); - - return tagFromNumbers(group, element); -} - -parseElements = function(stream, syntax) { - var pairs = {}; - stream.reset(); - while (!stream.end()) { - var elem = new DataElement(); - elem.setSyntax(syntax); - elem.readBytes(stream); - pairs[elem.tag.value] = elem; - } - - return pairs; -}; - -ValueRepresentation = function(type) { - this.type = type; - this.multi = false; -}; - -ValueRepresentation.prototype.read = function(stream, length, syntax) { - if (this.fixed && this.maxLength) { - if (!length) { - return this.defaultValue; - } - - if (this.maxLength !== length) { - console.log('Invalid length for fixed length tag, vr ' + this.type + ', length ' + this.maxLength + ' !== ' + length); - } - } - - return this.readBytes(stream, length, syntax); -}; - -ValueRepresentation.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_ASCII, length); -}; - -ValueRepresentation.prototype.readNullPaddedString = function(stream, length) { - if (!length) { - return ''; - } - - var str = stream.read(C.TYPE_ASCII, length - 1); - if (stream.read(C.TYPE_UINT8) !== 0) { - stream.increment(-1); - str += stream.read(C.TYPE_ASCII, 1); - } - - return str; -}; - -ValueRepresentation.prototype.getFields = function(fields) { - var valid = true; - if (this.checkLength) { - valid = this.checkLength(fields); - } else if (this.maxCharLength) { - var check = this.maxCharLength, - length = 0; - fields.forEach(function(field) { - if (typeof field.value === 'string') - length += field.value.length; - }); - valid = length <= check; - } else if (this.maxLength) { - var check = this.maxLength, - length = fieldsLength(fields); - valid = length <= check; - } - - if (!valid) { - throw 'Value exceeds max length'; - } - - //check for odd - var length = fieldsLength(fields); - if (length & 1) { - fields.push(new HexField(this.padByte)); - } - - for (var i = 0;i < fields.length;i++) { - if (fields[i].isNumeric() && (fields[i].value === '' || fields[i].value === null)) { - fields[i] = new StringField(''); - } - } - - return fields; -}; - -ApplicationEntity = function() { - ValueRepresentation.call(this, 'AE'); - this.maxLength = 16; - this.padByte = '20'; -}; - -util.inherits(ApplicationEntity, ValueRepresentation); - -ApplicationEntity.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_ASCII, length).trim(); -}; - -ApplicationEntity.prototype.getFields = function(value) { - return ApplicationEntity.super_.prototype.getFields.call(this, [new FilledField(value, 16)]); -}; - -CodeString = function() { - ValueRepresentation.call(this, 'CS'); - this.maxLength = 16; - this.padByte = '20'; -}; - -util.inherits(CodeString, ValueRepresentation); - -CodeString.prototype.readBytes = function(stream, length) { - var str = this.readNullPaddedString(stream, length); - return str.trim(); -}; - -CodeString.prototype.getFields = function(value) { - return CodeString.super_.prototype.getFields.call(this, [new StringField(value)]); -}; - -AgeString = function() { - ValueRepresentation.call(this, 'AS'); - this.maxLength = 4; - this.padByte = '20'; - this.fixed = true; - this.defaultValue = ''; -}; - -util.inherits(AgeString, ValueRepresentation); - -AgeString.prototype.getFields = function(value) { - var str = ''; - if (value) { - if (value.days) { - str = paddingLeft('000' + value.days) + 'D'; - } else if (value.weeks) { - str = paddingLeft('000' + value.weeks) + 'W'; - } else if (value.months) { - str = paddingLeft('000' + value.months) + 'M'; - } else if (value.years) { - str = paddingLeft('000' + value.years) + 'Y'; - } else { - throw 'Invalid age string'; - } - } - - return AgeString.super_.prototype.getFields.call(this, [new StringField(str)]); -}; - -AttributeTag = function() { - ValueRepresentation.call(this, 'AT'); - this.maxLength = 4; - this.padByte = '00'; - this.fixed = true; -}; - -util.inherits(AttributeTag, ValueRepresentation); - -AttributeTag.prototype.readBytes = function(stream, length) { - var group = stream.read(C.TYPE_UINT16), - element = stream.read(C.TYPE_UINT16); - return tagFromNumbers(group, element); -}; - -AttributeTag.prototype.getFields = function(value) { - if (!value) - return AttributeTag.super_.prototype.getFields.call(this, [new StringField("")]); - - return AttributeTag.super_.prototype.getFields.call(this, [new UInt16Field(value.group()), new UInt16Field(value.element())]); -}; - -DateValue = function() { - ValueRepresentation.call(this, 'DA'); - this.maxLength = 8; - this.padByte = '20'; - this.fixed = true; - this.defaultValue = ''; -}; - -util.inherits(DateValue, ValueRepresentation); - -DateValue.prototype.readBytes = function(stream, length) { - var datestr = stream.read(C.TYPE_ASCII, length); - - var year = parseInt(datestr.substring(0, 4)), - month = parseInt(datestr.substring(4, 6)), - day = parseInt(datestr.substring(6, 8)); - - return datestr;//new Date(year, month, day); -}; - -DateValue.prototype.getFields = function(date) { - var str = null; - if (typeof date === 'object') { - var year = date.getFullYear(), - month = paddingLeft('00', date.getMonth()), - day = paddingLeft('00', date.getDate()); - str = year + month + day; - } else if (date && date.length > 0) { - this.maxLength = 18; - this.fixed = false; - str = date; - } else { - str = ''; - } - - return DateValue.super_.prototype.getFields.call(this, [new StringField(str)]); -}; - -DecimalString = function() { - ValueRepresentation.call(this, 'DS'); - this.maxLength = 16; - this.padByte = '20'; -}; - -util.inherits(DecimalString, ValueRepresentation); - -DecimalString.prototype.readBytes = function(stream, length) { - var str = this.readNullPaddedString(stream, length); - return str.trim(); -}; - -DecimalString.prototype.getFields = function(value) { - var f = parseFloat(value); - return DecimalString.super_.prototype.getFields.call(this, [new StringField(isNaN(f) ? '' : f.toExponential())]); -}; - -DateTime = function() { - ValueRepresentation.call(this, 'DT'); - this.maxLength = 26; - this.padByte = '20'; -}; - -util.inherits(DateTime, ValueRepresentation); - -DateTime.prototype.getFields = function(value) { - if (!value) - return DateTime.super_.prototype.getFields.call(this, [new StringField("")]); - - var year = value.getUTCFullYear(), - month = paddingLeft('00', value.getUTCMonth()), - day = paddingLeft('00', value.getUTCDate()), - hour = paddingLeft('00', value.getUTCHours()), - minute = paddingLeft('00', value.getUTCMinutes()), - second = paddingLeft('00', value.getUTCSeconds()), - millisecond = paddingLeft('000', value.getUTCMilliseconds()); - - return DateTime.super_.prototype.getFields.call(this, [new StringField(year + month + day + hour + minute + second + '.' + millisecond + '+0000')]); -}; - -FloatingPointSingle = function() { - ValueRepresentation.call(this, 'FL'); - this.maxLength = 4; - this.padByte = '00'; - this.fixed = true; - this.defaultValue = 0.0; -}; - -util.inherits(FloatingPointSingle, ValueRepresentation); - -FloatingPointSingle.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_FLOAT); -}; - -FloatingPointSingle.prototype.getFields = function(value) { - return FloatingPointSingle.super_.prototype.getFields.call(this, [new FloatField(value)]); -}; - -FloatingPointDouble = function() { - ValueRepresentation.call(this, 'FD'); - this.maxLength = 8; - this.padByte = '00'; - this.fixed = true; - this.defaultValue = 0.0; -}; - -util.inherits(FloatingPointDouble, ValueRepresentation); - -FloatingPointDouble.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_DOUBLE); -}; - -FloatingPointDouble.prototype.getFields = function(value) { - return FloatingPointDouble.super_.prototype.getFields.call(this, [new DoubleField(value)]); -}; - -IntegerString = function() { - ValueRepresentation.call(this, 'IS'); - this.maxLength = 12; - this.padByte = '20'; -}; - -util.inherits(IntegerString, ValueRepresentation); - -IntegerString.prototype.readBytes = function(stream, length) { - var str = this.readNullPaddedString(stream, length); - return str.trim(); -}; - -IntegerString.prototype.getFields = function(value) { - return IntegerString.super_.prototype.getFields.call(this, [new StringField(value.toString())]); -}; - -LongString = function() { - ValueRepresentation.call(this, 'LO'); - this.maxCharLength = 64; - this.padByte = '20'; -}; - -util.inherits(LongString, ValueRepresentation); - -LongString.prototype.readBytes = function(stream, length) { - var str = this.readNullPaddedString(stream, length); - return str.trim(); -}; - -LongString.prototype.getFields = function(value) { - return LongString.super_.prototype.getFields.call(this, [new StringField(value ? value : '')]); -}; - -LongText = function() { - ValueRepresentation.call(this, 'LT'); - this.maxCharLength = 10240; - this.padByte = '20'; -}; - -util.inherits(LongText, ValueRepresentation); - -LongText.prototype.readBytes = function(stream, length) { - var str = this.readNullPaddedString(stream, length); - return rtrim(str); -}; - -LongText.prototype.getFields = function(value) { - return LongText.super_.prototype.getFields.call(this, [new StringField(value)]); -}; - -PersonName = function() { - ValueRepresentation.call(this, 'PN'); - this.maxLength = null; - this.padByte = '20'; -}; - -util.inherits(PersonName, ValueRepresentation); - -PersonName.prototype.checkLength = function(field) { - var cmps = field[0].value.split(/\^/); - for (var i in cmps) { - var cmp = cmps[i]; - if (cmp.length > 64) return false; - } - - return true; -}; - -PersonName.prototype.readBytes = function(stream, length) { - var str = this.readNullPaddedString(stream, length); - return rtrim(str); -}; - -PersonName.prototype.getFields = function(value) { - var str = null; - if (typeof value === 'string') { - str = value; - } else if (value) { - var fName = value.family || '', - gName = value.given || '', - middle = value.middle || '', - prefix = value.prefix || '', - suffix = value.suffix || ''; - - str = [fName, gName, middle, prefix, suffix].join('^'); - } else str = ''; - - return PersonName.super_.prototype.getFields.call(this, [new StringField(str)]); -}; - -ShortString = function() { - ValueRepresentation.call(this, 'SH'); - this.maxCharLength = 16; - this.padByte = '20'; -}; - -util.inherits(ShortString, ValueRepresentation); - -ShortString.prototype.readBytes = function(stream, length) { - var str = this.readNullPaddedString(stream, length); - return str.trim(); -}; - -ShortString.prototype.getFields = function(value) { - return ShortString.super_.prototype.getFields.call(this, [new StringField(value)]); -}; - -SignedLong = function() { - ValueRepresentation.call(this, 'SL'); - this.maxLength = 4; - this.padByte = '00'; - this.fixed = true; - this.defaultValue = 0; -}; - -util.inherits(SignedLong, ValueRepresentation); - -SignedLong.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_INT32); -}; - -SignedLong.prototype.getFields = function(value) { - return SignedLong.super_.prototype.getFields.call(this, [new Int32Field(value)]); -}; - -SequenceOfItems = function() { - ValueRepresentation.call(this, 'SQ'); - this.maxLength = null; - this.padByte = '00'; -}; - -util.inherits(SequenceOfItems, ValueRepresentation); - -SequenceOfItems.prototype.readBytes = function(stream, sqlength, syntax) { - if (sqlength === 0x0) { - return []; //contains no dataset - } else { - var undefLength = sqlength === 0xffffffff, - elements = [], - read = 0; - - while (true) { - var tag = readTag(stream), - length = null; - read += 4; - - if (tag.is(0xfffee0dd)) { - stream.read(C.TYPE_UINT32); - break; - } else if (!undefLength && (read === sqlength)) { - break; - } else if (tag.is(0xfffee000)) { - length = stream.read(C.TYPE_UINT32); - read += 4; - var itemStream = null, - toRead = 0, - undef = length === 0xffffffff; - - if (undef) { - var stack = 0; - while (1) { - var g = stream.read(C.TYPE_UINT16); - if (g === 0xfffe) { - var ge = stream.read(C.TYPE_UINT16); - if (ge === 0xe00d) { - stack--; - if (stack < 0) { - stream.increment(4); - read += 8; - break; - } else { - toRead += 4; - } - } else if (ge === 0xe000) { - stack++; - toRead += 4; - } else { - toRead += 2; - stream.increment(-2); - } - } else { - toRead += 2; - } - } - } else { - toRead = length; - } - - if (toRead) { - stream.increment(undef ? (-toRead - 8) : 0); - itemStream = stream.more(toRead);//parseElements - read += toRead; - if (undef) - stream.increment(8); - - elements.push(parseElements(itemStream, syntax)); - } - - if (!undefLength && (read === sqlength)) { - break; - } - } - } - - return elements; - } -}; - -SequenceOfItems.prototype.getFields = function(value, syntax) { - var fields = []; - if (value) { - value.forEach(function(message) { - fields.push(new UInt16Field(0xfffe)); - fields.push(new UInt16Field(0xe000)); - fields.push(new UInt32Field(0xffffffff)); - - message.forEach(function(element) { - element.setSyntax(syntax); - fields = fields.concat(element.getFields()); - }); - - fields.push(new UInt16Field(0xfffe)); - fields.push(new UInt16Field(0xe00d)); - fields.push(new UInt32Field(0x00000000)); - }); - } - - fields.push(new UInt16Field(0xfffe)); - fields.push(new UInt16Field(0xe0dd)); - fields.push(new UInt32Field(0x00000000)); - - return SequenceOfItems.super_.prototype.getFields.call(this, fields); -}; - -SignedShort = function() { - ValueRepresentation.call(this, 'SS'); - this.maxLength = 2; - this.padByte = '00'; - this.fixed = true; - this.defaultValue = 0; -}; - -util.inherits(SignedShort, ValueRepresentation); - -SignedShort.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_INT16); -}; - -SignedShort.prototype.getFields = function(value) { - return SignedShort.super_.prototype.getFields.call(this, [new Int16Field(value)]); -}; - -ShortText = function() { - ValueRepresentation.call(this, 'ST'); - this.maxCharLength = 1024; - this.padByte = '20'; -}; - -util.inherits(ShortText, ValueRepresentation); - -ShortText.prototype.readBytes = function(stream, length) { - var str = this.readNullPaddedString(stream, length); - return rtrim(str); -}; - -ShortText.prototype.getFields = function(value) { - return ShortText.super_.prototype.getFields.call(this, [new StringField(value)]); -}; - -TimeValue = function() { - ValueRepresentation.call(this, 'TM'); - this.maxLength = 14; - this.padByte = '20'; -}; - -util.inherits(TimeValue, ValueRepresentation); - -TimeValue.prototype.readBytes = function(stream, length) { - return rtrim(stream.read(C.TYPE_ASCII, length)); -}; - -TimeValue.prototype.getFields = function(date) { - var dateStr = ''; - if (date) { - var hour = paddingLeft('00', date.getHours()), - minute = paddingLeft('00', date.getMinutes()), - second = paddingLeft('00', date.getSeconds()), - millisecond = paddingLeft('000', date.getMilliseconds()); - dateStr = hour + minute + second + '.' + millisecond; - } - - return TimeValue.super_.prototype.getFields.call(this, [new StringField(dateStr)]); -}; - -UnlimitedCharacters = function() { - ValueRepresentation.call(this, 'UC'); - this.maxLength = null; - this.multi = true; - this.padByte = '20'; -}; - -util.inherits(UnlimitedCharacters, ValueRepresentation); - -UnlimitedCharacters.prototype.readBytes = function(stream, length) { - return rtrim(stream.read(C.TYPE_ASCII, length)); -}; - -UnlimitedCharacters.prototype.getFields = function(value) { - return UnlimitedCharacters.super_.prototype.getFields.call(this, [new StringField(value)]); -}; - -UnlimitedText = function() { - ValueRepresentation.call(this, 'UT'); - this.maxLength = null; - this.padByte = '20'; -}; - -util.inherits(UnlimitedText, ValueRepresentation); - -UnlimitedText.prototype.readBytes = function(stream, length) { - return this.readNullPaddedString(stream, length); -}; - -UnlimitedText.prototype.getFields = function(value) { - return UnlimitedText.super_.prototype.getFields.call(this, [new StringField(value)]); -}; - -UnsignedShort = function() { - ValueRepresentation.call(this, 'US'); - this.maxLength = 2; - this.padByte = '00'; - this.fixed = true; - this.defaultValue = 0; -}; - -util.inherits(UnsignedShort, ValueRepresentation); - -UnsignedShort.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_UINT16); -}; - -UnsignedShort.prototype.getFields = function(value) { - return UnsignedShort.super_.prototype.getFields.call(this, [new UInt16Field(value)]); -}; - -UnsignedLong = function() { - ValueRepresentation.call(this, 'UL'); - this.maxLength = 4; - this.padByte = '00'; - this.fixed = true; - this.defaultValue = 0; -}; - -util.inherits(UnsignedLong, ValueRepresentation); - -UnsignedLong.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_UINT32); -}; - -UnsignedLong.prototype.getFields = function(value) { - return UnsignedLong.super_.prototype.getFields.call(this, [new UInt32Field(value)]); -}; - -UniqueIdentifier = function() { - ValueRepresentation.call(this, 'UI'); - this.maxLength = 64; - this.padByte = '00'; -}; - -util.inherits(UniqueIdentifier, ValueRepresentation); - -UniqueIdentifier.prototype.readBytes = function(stream, length) { - return this.readNullPaddedString(stream, length); -}; - -UniqueIdentifier.prototype.getFields = function(value) { - return UniqueIdentifier.super_.prototype.getFields.call(this, [new StringField(value)]); -}; - -UniversalResource = function() { - ValueRepresentation.call(this, 'UR'); - this.maxLength = null; - this.padByte = '20'; -}; - -util.inherits(UniversalResource, ValueRepresentation); - -UniversalResource.prototype.readBytes = function(stream, length) { - return rtrim(stream.read(C.TYPE_ASCII, length)); -}; - -UniversalResource.prototype.getFields = function(value) { - return UniversalResource.super_.prototype.getFields.call(this, [new StringField(value)]); -}; - -UnknownValue = function() { - ValueRepresentation.call(this, 'UN'); - this.maxLength = null; - this.padByte = '00'; -}; - -util.inherits(UnknownValue, ValueRepresentation); - -UnknownValue.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_ASCII, length); -}; - -UnknownValue.prototype.getFields = function(value) { - return UnknownValue.super_.prototype.getFields.call(this, [new StringField(value)]); -}; - -OtherWordString = function() { - ValueRepresentation.call(this, 'OW'); - this.maxLength = null; - this.padByte = '00'; -}; - -util.inherits(OtherWordString, ValueRepresentation); - -OtherWordString.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_ASCII, length); -}; - -OtherWordString.prototype.getFields = function(value) { - return OtherWordString.super_.prototype.getFields.call(this, [new StringField(value)]); -}; - -OtherByteString = function() { - ValueRepresentation.call(this, 'OB'); - this.maxLength = null; - this.padByte = '00'; -}; - -util.inherits(OtherByteString, ValueRepresentation); - -OtherByteString.prototype.readBytes = function(stream, length) { - return stream.read(C.TYPE_HEX, length); -}; - -OtherByteString.prototype.getFields = function(value) { - return OtherByteString.super_.prototype.getFields.call(this, [new HexField(value)]); -}; - -elementByType = function(type, value, syntax) { - var elem = null, - nk = DicomElements.dicomNDict[type]; - if (nk) { - if (nk.vr === 'SQ') { - var sq = []; - if (value) - value.forEach(function(el) { - var values = []; - for (var tag in el) { - values.push(elementByType(tag, el[tag], syntax)); - } - - sq.push(values); - }); - elem = new DataElement(type, nk.vr, nk.vm, sq, false, syntax); - } else { - elem = new DataElement(type, nk.vr, nk.vm, value, false, syntax); - } - } else { - throw 'Unrecognized element type'; - } - - return elem; -}; - -elementDataByTag = function(tag) { - var nk = DicomElements.dicomNDict[tag]; - if (nk) { - return nk; - } - - throw ('Unrecognized tag ' + (tag >>> 0).toString(16)); -}; - -elementKeywordByTag = function(tag) { - try { - var nk = elementDataByTag(tag); - return nk.keyword; - } catch (ex) { - return 'UnknownTag'; - } -}; - -vrByType = function(type) { - var vr = null; - if (type === 'AE') vr = new ApplicationEntity(); - else if (type === 'AS') vr = new AgeString(); - else if (type === 'AT') vr = new AttributeTag(); - else if (type === 'CS') vr = new CodeString(); - else if (type === 'DA') vr = new DateValue(); - else if (type === 'DS') vr = new DecimalString(); - else if (type === 'DT') vr = new DateTime(); - else if (type === 'FL') vr = new FloatingPointSingle(); - else if (type === 'FD') vr = new FloatingPointDouble(); - else if (type === 'IS') vr = new IntegerString(); - else if (type === 'LO') vr = new LongString(); - else if (type === 'LT') vr = new LongText(); - else if (type === 'OB') vr = new OtherByteString(); - else if (type === 'OD') vr = new OtherDoubleString(); - else if (type === 'OF') vr = new OtherFloatString(); - else if (type === 'OW') vr = new OtherWordString(); - else if (type === 'PN') vr = new PersonName(); - else if (type === 'SH') vr = new ShortString(); - else if (type === 'SL') vr = new SignedLong(); - else if (type === 'SQ') vr = new SequenceOfItems(); - else if (type === 'SS') vr = new SignedShort(); - else if (type === 'ST') vr = new ShortText(); - else if (type === 'TM') vr = new TimeValue(); - else if (type === 'UC') vr = new UnlimitedCharacters(); - else if (type === 'UI') vr = new UniqueIdentifier(); - else if (type === 'UL') vr = new UnsignedLong(); - else if (type === 'UN') vr = new UnknownValue(); - else if (type === 'UR') vr = new UniversalResource(); - else if (type === 'US') vr = new UnsignedShort(); - else if (type === 'UT') vr = new UnlimitedText(); - else throw 'Invalid vr type ' + type; - - return vr; -}; - -readElements = function(stream, syntax) { - if (stream.end()) return false; - - var oldEndian = stream.endian; - stream.setEndian(this.endian); - - var group = stream.read(C.TYPE_UINT16), - element = stream.read(C.TYPE_UINT16), - tag = new Tag((group << 16) | element), - length = stream.read(C.TYPE_UINT32); - - stream.setEndian(oldEndian); -}; - -readAElement = function(stream, syntax) { - var elem = newElementWithSyntax(syntax); - elem.readBytes(stream); - return elem; -}; - -newElementWithSyntax = function(syntax) { - var elem = new DataElement(); - elem.setSyntax(syntax); - return elem; -}; - -var explicitVRList = ['OB', 'OW', 'OF', 'SQ', 'UC', 'UR', 'UT', 'UN'], - binaryVRs = ['FL', 'FD', 'SL', 'SS', 'UL', 'US']; - -DataElement = function(tag, vr, vm, value, vvr, syntax, options) { - this.vr = vr ? vrByType(vr) : null; - this.tag = !vvr ? new Tag(tag) : tag; - this.value = value; - this.vm = vm; - this.vvr = vvr ? true : false; - this.setOptions(options); - this.setSyntax(syntax ? syntax : C.IMPLICIT_LITTLE_ENDIAN); -}; - -DataElement.prototype.setOptions = function(options) { - this.options = Object.assign({ - split: true - }, options); -}; - -DataElement.prototype.setSyntax = function(syn) { - this.syntax = syn; - this.implicit = this.syntax === C.IMPLICIT_LITTLE_ENDIAN ? true : false; - this.endian = (this.syntax === C.IMPLICIT_LITTLE_ENDIAN || this.syntax === C.EXPLICIT_LITTLE_ENDIAN) ? C.LITTLE_ENDIAN : C.BIG_ENDIAN; -}; - -DataElement.prototype.getValue = function() { - if (!this.singleValue() && !this.isBinaryNumber()) { - return this.options.split ? this.value.split(String.fromCharCode(0x5c)) : this.value; - } else { - return this.value; - } -}; - -DataElement.prototype.singleValue = function() { - return this.vm === C.VM_SINGLE ? true : false; -}; - -DataElement.prototype.getVMNum = function() { - var num = 1; - switch (this.vm) { - case C.VM_SINGLE : num = 1; break; - case C.VM_TWO : num = 2; break; - case C.VM_THREE : num = 3; break; - case C.VM_FOUR : num = 4; break; - case C.VM_16 : num = 16; break; - default : break; -} - return num; -}; - -DataElement.prototype.isBinaryNumber = function() { - return binaryVRs.indexOf(this.vr.type) !== -1; -}; - -DataElement.prototype.length = function(fields) { - //let fields = this.vr.getFields(this.value); - return fieldsLength(fields); -}; - -DataElement.prototype.readBytes = function(stream) { - var oldEndian = stream.endian; - stream.setEndian(this.endian); - - var group = stream.read(C.TYPE_UINT16), - element = stream.read(C.TYPE_UINT16), - tag = tagFromNumbers(group, element); - - var length = null, vr = null, edata, vm; - - try { - edata = elementDataByTag(tag.value); - vm = edata.vm; - } catch (ex) { - edata = null; - vm = null; - } - - if (this.implicit) { - length = stream.read(C.TYPE_UINT32); - if (!edata) { - if (length == 0xffffffff) { - vr = 'SQ'; - } else if (tag.isPixelDataTag()) { - vr = 'OW'; - } else { - vr = 'UN'; - } - } else { - vr = edata.vr; - } - } else { - vr = stream.read(C.TYPE_ASCII, 2); - if (explicitVRList.indexOf(vr) !== -1) { - stream.increment(2); - length = stream.read(C.TYPE_UINT32); - } else { - length = stream.read(C.TYPE_UINT16); - } - } - - this.vr = vrByType(vr); - this.tag = tag; - this.vm = vm; - //try { - if (this.isBinaryNumber() && length > this.vr.maxLength) { - var times = length / this.vr.maxLength, - i = 0; - this.value = [];//console.log(times, length, this.vr.maxLength);return; - //try { - while (i++ < times) { - this.value.push(this.vr.read(stream, this.vr.maxLength)); - } - //} catch (e) { } - } else { - this.value = this.vr.read(stream, length, this.syntax); - } - //} catch (e) { console.log('error', vr, length); } - - stream.setEndian(oldEndian); -}; - -DataElement.prototype.write = function(stream) { - var oldEndian = stream.endian; - stream.setEndian(this.endian); - - var fields = this.getFields(); - fields.forEach(function(field) { - field.write(stream); - }); - - stream.setEndian(oldEndian); -}; - -DataElement.prototype.getFields = function() { - var fields = [new UInt16Field(this.tag.group()), new UInt16Field(this.tag.element())], - valueFields = this.vr.getFields(this.value, this.syntax), - valueLength = fieldsLength(valueFields), - vrType = this.vr.type; - - if (vrType === 'SQ') { - valueLength = 0xffffffff; - } - - if (this.implicit) { - fields.push(new UInt32Field(valueLength)); - } else { - if (explicitVRList.indexOf(vrType) !== -1) { - fields.push(new StringField(vrType), new ReservedField(2), new UInt32Field(valueLength)); - } else { - fields.push(new StringField(vrType), new UInt16Field(valueLength)); - } - } - - fields = fields.concat(valueFields); - return fields; -}; - diff --git a/Packages/ohif-dicom-services/server/DIMSE/Field.js b/Packages/ohif-dicom-services/server/DIMSE/Field.js deleted file mode 100755 index afa3a2a8f..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/Field.js +++ /dev/null @@ -1,156 +0,0 @@ -Field = function(type, value) { - this.type = type; - this.value = value; -}; - -Field.prototype.length = function() { - return calcLength(this.type, this.value); -}; - -Field.prototype.write = function(stream) { - stream.write(this.type, this.value); -}; - -Field.prototype.isNumeric = function() { - return false; -}; - -BufferField = function(buffer, start, length) { - Field.call(this, C.TYPE_BUFFER, buffer); - this.bufferLength = length; - this.bufferStart = start; -}; - -util.inherits(BufferField, Field); - -BufferField.prototype.length = function() { - return this.bufferLength; -}; - -BufferField.prototype.write = function(stream) { - stream.writeRawBuffer(this.value, this.bufferStart, this.bufferLength); -}; - -StringField = function(str) { - Field.call(this, C.TYPE_ASCII, typeof str == 'string' ? str : ''); -}; - -util.inherits(StringField, Field); - -FilledField = function(value, length) { - Field.call(this, C.TYPE_COMPOSITE, value); - this.fillLength = length; -}; - -util.inherits(FilledField, Field); - -FilledField.prototype.length = function() { - return this.fillLength; -}; - -FilledField.prototype.write = function(stream) { - var len = this.value.length; - if (len < this.fillLength && len >= 0) { - if (len > 0) - stream.write(C.TYPE_ASCII, this.value); - var zeroLength = this.fillLength - len; - stream.write(C.TYPE_HEX, '20'.repeat(zeroLength)); - } else if (len == this.fillLength) { - stream.write(C.TYPE_ASCII, this.value); - } else { - throw 'Length mismatch'; - } -}; - -HexField = function(hex) { - Field.call(this, C.TYPE_HEX, hex); -}; - -util.inherits(HexField, Field); - -ReservedField = function(length) { - length = length || 1; - Field.call(this, C.TYPE_HEX, '00'.repeat(length)); -}; - -util.inherits(ReservedField, Field); - -UInt8Field = function(value) { - Field.call(this, C.TYPE_UINT8, value); -}; - -util.inherits(UInt8Field, Field); - -UInt8Field.prototype.isNumeric = function() { - return true; -}; - -UInt16Field = function(value) { - Field.call(this, C.TYPE_UINT16, value); -}; - -util.inherits(UInt16Field, Field); - -UInt16Field.prototype.isNumeric = function() { - return true; -}; - -UInt32Field = function(value) { - Field.call(this, C.TYPE_UINT32, value); -}; - -util.inherits(UInt32Field, Field); - -UInt32Field.prototype.isNumeric = function() { - return true; -}; - -Int8Field = function(value) { - Field.call(this, C.TYPE_INT8, value); -}; - -util.inherits(Int8Field, Field); - -Int8Field.prototype.isNumeric = function() { - return true; -}; - -Int16Field = function(value) { - Field.call(this, C.TYPE_INT16, value); -}; - -util.inherits(Int16Field, Field); - -Int16Field.prototype.isNumeric = function() { - return true; -}; - -Int32Field = function(value) { - Field.call(this, C.TYPE_INT32, value); -}; - -util.inherits(Int32Field, Field); - -Int32Field.prototype.isNumeric = function() { - return true; -}; - -FloatField = function(value) { - Field.call(this, C.TYPE_FLOAT, value); -}; - -util.inherits(FloatField, Field); - -FloatField.prototype.isNumeric = function() { - return true; -}; - -DoubleField = function(value) { - Field.call(this, C.TYPE_DOUBLE, value); -}; - -util.inherits(DoubleField, Field); - -DoubleField.prototype.isNumeric = function() { - return true; -}; diff --git a/Packages/ohif-dicom-services/server/DIMSE/Message.js b/Packages/ohif-dicom-services/server/DIMSE/Message.js deleted file mode 100755 index 7919a7e1a..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/Message.js +++ /dev/null @@ -1,590 +0,0 @@ -DicomMessage = function(syntax) { - this.syntax = syntax ? syntax : null; - this.type = C.DATA_TYPE_COMMAND; - this.messageId = C.DEFAULT_MESSAGE_ID; - this.elementPairs = {}; -}; - -DicomMessage.prototype.isCommand = function() { - return this.type == C.DATA_TYPE_COMMAND; -}; - -DicomMessage.prototype.setSyntax = function(syntax) { - this.syntax = syntax; - - for (var tag in this.elementPairs) { - this.elementPairs[tag].setSyntax(this.syntax); - } -}; - -DicomMessage.prototype.setMessageId = function(id) { - this.messageId = id; -}; - -DicomMessage.prototype.setReplyMessageId = function(id) { - this.replyMessageId = id; -}; - -DicomMessage.prototype.command = function(cmds) { - cmds.unshift(this.newElement(0x00000800, this.dataSetPresent ? C.DATA_SET_PRESENT : C.DATE_SET_ABSENCE)); - cmds.unshift(this.newElement(0x00000700, this.priority)); - cmds.unshift(this.newElement(0x00000110, this.messageId)); - cmds.unshift(this.newElement(0x00000100, this.commandType)); - cmds.unshift(this.newElement(0x00000002, this.contextUID)); - - var length = 0; - cmds.forEach(function(cmd) { - length += cmd.length(cmd.getFields()); - }); - - cmds.unshift(this.newElement(0x00000000, length)); - return cmds; -}; - -DicomMessage.prototype.response = function(cmds) { - cmds.unshift(this.newElement(0x00000800, this.dataSetPresent ? C.DATA_SET_PRESENT : C.DATE_SET_ABSENCE)); - cmds.unshift(this.newElement(0x00000120, this.replyMessageId)); - cmds.unshift(this.newElement(0x00000100, this.commandType)); - if (this.contextUID) - cmds.unshift(this.newElement(0x00000002, this.contextUID)); - - var length = 0; - cmds.forEach(function(cmd) { - length += cmd.length(cmd.getFields()); - }); - - cmds.unshift(this.newElement(0x00000000, length)); - return cmds; -}; - -DicomMessage.prototype.setElements = function(pairs) { - var p = {}; - for (var tag in pairs) { - p[tag] = this.newElement(tag, pairs[tag]); - } - - this.elementPairs = p; -}; - -DicomMessage.prototype.newElement = function(tag, value) { - return elementByType(tag, value, this.syntax); -}; - -DicomMessage.prototype.setElement = function(key, value) { - this.elementPairs[key] = elementByType(key, value); -}; - -DicomMessage.prototype.setElementPairs = function(pairs) { - this.elementPairs = pairs; -}; - -DicomMessage.prototype.setContextId = function(context) { - this.contextUID = context; -}; - -DicomMessage.prototype.setPriority = function(pri) { - this.priority = pri; -}; - -DicomMessage.prototype.setType = function(type) { - this.type = type; -}; - -DicomMessage.prototype.setDataSetPresent = function(present) { - this.dataSetPresent = present == 0x0101 ? false : true; -}; - -DicomMessage.prototype.haveData = function() { - return this.dataSetPresent; -}; - -DicomMessage.prototype.tags = function() { - return Object.keys(this.elementPairs); -}; - -DicomMessage.prototype.key = function(tag) { - return elementKeywordByTag(tag); -}; - -DicomMessage.prototype.getValue = function(tag) { - return this.elementPairs[tag] ? this.elementPairs[tag].getValue() : null; -}; - -DicomMessage.prototype.affectedSOPClassUID = function() { - return this.getValue(0x00000002); -}; - -DicomMessage.prototype.getMessageId = function() { - return this.getValue(0x00000110); -}; - -DicomMessage.prototype.getFields = function() { - var eles = []; - for (var tag in this.elementPairs) { - eles.push(this.elementPairs[tag]); - } - - return eles; -}; - -DicomMessage.prototype.length = function(elems) { - var len = 0; - elems.forEach(function(elem) { - len += elem.length(elem.getFields()); - }); - return len; -}; - -DicomMessage.prototype.isResponse = function() { - return false; -}; - -DicomMessage.prototype.is = function(type) { - return this.commandType == type; -}; - -DicomMessage.prototype.write = function(stream) { - var fields = this.getFields(), - o = this; - fields.forEach(function(field) { - field.setSyntax(o.syntax); - field.write(stream); - }); -}; - -DicomMessage.prototype.printElements = function(pairs, indent) { - var typeName = ''; - for (var tag in pairs) { - var value = pairs[tag].getValue(); - typeName += (' '.repeat(indent)) + this.key(tag) + ' : '; - if (value instanceof Array) { - var o = this; - value.forEach(function(p) { - if (typeof p == 'object') { - typeName += '[\n' + o.printElements(p, indent + 2) + (' '.repeat(indent)) + ']'; - } else { - typeName += '[' + p + ']'; - } - }); - if (typeName[typeName.length - 1] != '\n') { - typeName += '\n'; - } - } else { - typeName += value + '\n'; - } - } - - return typeName; -}; - -DicomMessage.prototype.typeString = function() { - var typeName = ''; - if (!this.isCommand()) { - typeName = 'DateSet Message'; - } else { - switch (this.commandType) { - case C.COMMAND_C_GET_RSP : typeName = 'C-GET-RSP'; break; - case C.COMMAND_C_MOVE_RSP : typeName = 'C-MOVE-RSP'; break; - case C.COMMAND_C_GET_RQ : typeName = 'C-GET-RQ'; break; - case C.COMMAND_C_STORE_RQ : typeName = 'C-STORE-RQ'; break; - case C.COMMAND_C_FIND_RSP : typeName = 'C-FIND-RSP'; break; - case C.COMMAND_C_MOVE_RQ : typeName = 'C-MOVE-RQ'; break; - case C.COMMAND_C_FIND_RQ : typeName = 'C-FIND-RQ'; break; - case C.COMMAND_C_STORE_RSP : typeName = 'C-STORE-RSP'; break; - } - } - - return typeName; -}; - -DicomMessage.prototype.toString = function() { - var typeName = this.typeString(); - typeName += ' [\n'; - typeName += this.printElements(this.elementPairs, 0); - typeName += ']'; - return typeName; -}; - -DicomMessage.prototype.walkObject = function(pairs) { - var obj = {}, - o = this; - for (var tag in pairs) { - var v = pairs[tag].getValue(), - u = v; - if (v instanceof Array) { - u = []; - v.forEach(function(a) { - if (typeof a == 'object') { - u.push(o.walkObject(a)); - } else u.push(a); - }); - } - - obj[tag] = u; - } - - return obj; -}; - -DicomMessage.prototype.toObject = function() { - return this.walkObject(this.elementPairs); -}; - -DicomMessage.readToPairs = function(stream, syntax, options) { - var pairs = {}; - while (!stream.end()) { - var elem = new DataElement(); - if (options) { - elem.setOptions(options); - } - - elem.setSyntax(syntax); - elem.readBytes(stream); - pairs[elem.tag.value] = elem; - } - - return pairs; -}; - -var fileValid = function(stream) { - return stream.readString(4, C.TYPE_ASCII) == 'DICM'; -}; - -var readMetaStream = function(stream, useSyntax, length, callback) { - var message = new FileMetaMessage(); - message.setElementPairs(DicomMessage.readToPairs(stream, useSyntax)); - if (callback) { - callback(null, message, length); - } - - return message; -}; - -DicomMessage.readMetaHeader = function(bufferOrFile, callback) { - var useSyntax = C.EXPLICIT_LITTLE_ENDIAN; - if (bufferOrFile instanceof Buffer) { - var stream = new ReadStream(bufferOrFile); - stream.reset(); - stream.increment(128); - if (!fileValid(stream)) { - return quitWithError('Invalid a dicom file ', callback); - } - - var el = readAElement(stream, useSyntax), - metaLength = el.value, - metaStream = stream.more(metaLength); - - return readMetaStream(metaStream, useSyntax, metaLength, callback); - } else if (typeof bufferOrFile == 'string') { - fs.open(bufferOrFile, 'r', function(err, fd) { - if (err) { - //fs.closeSync(fd); - return quitWithError('Cannot open file', callback); - } - - var buffer = Buffer.alloc(16); - fs.read(fd, buffer, 0, 16, 128, function(err, bytesRead) { - if (err || bytesRead != 16) { - fs.closeSync(fd); - return quitWithError('Cannot read file', callback); - } - - var stream = new ReadStream(buffer); - if (!fileValid(stream)) { - fs.closeSync(fd); - return quitWithError('Not a dicom file ' + bufferOrFile, callback); - } - - var el = readAElement(stream, useSyntax), - metaLength = el.value, - metaBuffer = Buffer.alloc(metaLength); - - fs.read(fd, metaBuffer, 0, metaLength, 144, function(err, bytesRead) { - fs.closeSync(fd); - if (err || bytesRead != metaLength) { - return quitWithError('Invalid a dicom file ' + bufferOrFile, callback); - } - - var metaStream = new ReadStream(metaBuffer); - return readMetaStream(metaStream, useSyntax, metaLength, callback); - }); - }); - }); - } - - return null; -}; - -DicomMessage.read = function(stream, type, syntax, options) { - var elements = [], - pairs = {}, - useSyntax = type == C.DATA_TYPE_COMMAND ? C.IMPLICIT_LITTLE_ENDIAN : syntax; - stream.reset(); - while (!stream.end()) { - var elem = new DataElement(); - if (options) { - elem.setOptions(options); - } - - elem.setSyntax(useSyntax); - elem.readBytes(stream);//return; - pairs[elem.tag.value] = elem; - } - - var message = null; - if (type == C.DATA_TYPE_COMMAND) { - var cmdType = pairs[0x00000100].value; - - switch (cmdType) { - case 0x8020 : message = new CFindRSP(useSyntax); break; - case 0x8021 : message = new CMoveRSP(useSyntax); break; - case 0x8010 : message = new CGetRSP(useSyntax); break; - case 0x0001 : message = new CStoreRQ(useSyntax); break; - case 0x0020 : message = new CFindRQ(useSyntax); break; - case 0x8001 : message = new CStoreRSP(useSyntax); break; - default : throw 'Unrecognized command type ' + cmdType.toString(16); break; - } - - message.setElementPairs(pairs); - message.setDataSetPresent(message.getValue(0x00000800)); - message.setContextId(message.getValue(0x00000002)); - if (!message.isResponse()) { - message.setMessageId(message.getValue(0x00000110)); - } else { - message.setReplyMessageId(message.getValue(0x00000120)); - } - } else if (type == C.DATA_TYPE_DATA) { - message = new DataSetMessage(useSyntax); - message.setElementPairs(pairs); - } else { - throw 'Unrecognized message type'; - } - - return message; -}; - -DataSetMessage = function(syntax) { - DicomMessage.call(this, syntax); - this.type = C.DATA_TYPE_DATA; -}; - -util.inherits(DataSetMessage, DicomMessage); - -DataSetMessage.prototype.is = function(type) { - return false; -}; - -FileMetaMessage = function(syntax) { - DicomMessage.call(this, syntax); - this.type = null; -}; - -util.inherits(FileMetaMessage, DicomMessage); - -CommandMessage = function(syntax) { - DicomMessage.call(this, syntax); - this.type = C.DATA_TYPE_COMMAND; - this.priority = C.PRIORITY_MEDIUM; - this.dataSetPresent = true; -}; - -util.inherits(CommandMessage, DicomMessage); - -CommandMessage.prototype.getFields = function() { - return this.command(CommandMessage.super_.prototype.getFields.call(this)); -}; - -CommandResponse = function(syntax) { - DicomMessage.call(this, syntax); - this.type = C.DATA_TYPE_COMMAND; - this.dataSetPresent = true; -}; - -util.inherits(CommandResponse, DicomMessage); - -CommandResponse.prototype.isResponse = function() { - return true; -}; - -CommandResponse.prototype.respondedTo = function() { - return this.getValue(0x00000120); -}; - -CommandResponse.prototype.isFinal = function() { - return this.success() || this.failure() || this.cancel(); -}; - -CommandResponse.prototype.warning = function() { - var status = this.getStatus(); - return (status == 0x0001) || (status >> 12 == 0xb); -}; - -CommandResponse.prototype.success = function() { - return this.getStatus() == 0x0000; -}; - -CommandResponse.prototype.failure = function() { - var status = this.getStatus(); - return (status >> 12 == 0xa) || (status >> 12 == 0xc) || (status >> 8 == 0x1); -}; - -CommandResponse.prototype.cancel = function() { - return this.getStatus() == C.STATUS_CANCEL; -}; - -CommandResponse.prototype.pending = function() { - var status = this.getStatus(); - return (status == 0xff00) || (status == 0xff01); -}; - -CommandResponse.prototype.getStatus = function() { - return this.getValue(0x00000900); -}; - -CommandResponse.prototype.setStatus = function(status) { - this.setElement(0x00000900, status); -}; - -// following four methods only available to C-GET-RSP and C-MOVE-RSP -CommandResponse.prototype.getNumOfRemainingSubOperations = function() { - return this.getValue(0x00001020); -}; - -CommandResponse.prototype.getNumOfCompletedSubOperations = function() { - return this.getValue(0x00001021); -}; - -CommandResponse.prototype.getNumOfFailedSubOperations = function() { - return this.getValue(0x00001022); -}; - -CommandResponse.prototype.getNumOfWarningSubOperations = function() { - return this.getValue(0x00001023); -}; -//end - -CommandResponse.prototype.getFields = function() { - return this.response(CommandResponse.super_.prototype.getFields.call(this)); -}; - -CFindRSP = function(syntax) { - CommandResponse.call(this, syntax); - this.commandType = 0x8020; -}; - -util.inherits(CFindRSP, CommandResponse); - -CGetRSP = function(syntax) { - CommandResponse.call(this, syntax); - this.commandType = 0x8010; -}; - -util.inherits(CGetRSP, CommandResponse); - -CMoveRSP = function(syntax) { - CommandResponse.call(this, syntax); - this.commandType = 0x8021; -}; - -util.inherits(CMoveRSP, CommandResponse); - -CFindRQ = function(syntax) { - CommandMessage.call(this, syntax); - this.commandType = 0x20; - this.contextUID = C.SOP_STUDY_ROOT_FIND; -}; - -util.inherits(CFindRQ, CommandMessage); - -CCancelRQ = function(syntax) { - CommandResponse.call(this, syntax); - this.commandType = 0x0fff; - this.contextUID = null; - this.dataSetPresent = false; -}; - -util.inherits(CCancelRQ, CommandResponse); - -CCancelMoveRQ = function(syntax) { - CommandResponse.call(this, syntax); - this.commandType = 0x0fff; - this.contextUID = null; - this.dataSetPresent = false; -}; - -util.inherits(CCancelMoveRQ, CommandResponse); - -CMoveRQ = function(syntax, destination) { - CommandMessage.call(this, syntax); - this.commandType = 0x21; - this.contextUID = C.SOP_STUDY_ROOT_MOVE; - this.setDestination(destination || ''); -}; - -util.inherits(CMoveRQ, CommandMessage); - -CMoveRQ.prototype.setStore = function(cstr) { - this.store = cstr; -}; - -CMoveRQ.prototype.setDestination = function(dest) { - this.setElement(0x00000600, dest); -}; - -CGetRQ = function(syntax) { - CommandMessage.call(this, syntax); - this.commandType = 0x10; - this.contextUID = C.SOP_STUDY_ROOT_GET; - this.store = null; -}; - -util.inherits(CGetRQ, CommandMessage); - -CGetRQ.prototype.setStore = function(cstr) { - this.store = cstr; -}; - -CStoreRQ = function(syntax) { - CommandMessage.call(this, syntax); - this.commandType = 0x01; - this.contextUID = C.SOP_STUDY_ROOT_GET; -}; - -util.inherits(CStoreRQ, CommandMessage); - -CStoreRQ.prototype.getOriginAETitle = function() { - return this.getValue(0x00001030); -}; - -CStoreRQ.prototype.getMoveMessageId = function() { - return this.getValue(0x00001031); -}; - -CStoreRQ.prototype.getAffectedSOPInstanceUID = function() { - return this.getValue(0x00001000); -}; - -CStoreRQ.prototype.setAffectedSOPInstanceUID = function(uid) { - this.setElement(0x00001000, uid); -}; - -CStoreRQ.prototype.setAffectedSOPClassUID = function(uid) { - this.setElement(0x00000002, uid); -}; - -CStoreRSP = function(syntax) { - CommandResponse.call(this, syntax); - this.commandType = 0x8001; - this.contextUID = C.SOP_STUDY_ROOT_GET; - this.dataSetPresent = false; -}; - -util.inherits(CStoreRSP, CommandResponse); - -CStoreRSP.prototype.setAffectedSOPInstanceUID = function(uid) { - this.setElement(0x00001000, uid); -}; - -CStoreRSP.prototype.getAffectedSOPInstanceUID = function(uid) { - return this.getValue(0x00001000); -}; diff --git a/Packages/ohif-dicom-services/server/DIMSE/PDU.js b/Packages/ohif-dicom-services/server/DIMSE/PDU.js deleted file mode 100755 index 027cdf06c..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/PDU.js +++ /dev/null @@ -1,814 +0,0 @@ -PDVHandle = function() { - -} -util.inherits(PDVHandle, EventEmitter); - -PDU = function() { - this.fields = []; - this.lengthBytes = 4; -} - -PDU.prototype.length = function(fields) { - var len = 0; - fields.forEach(function(f) { - len += !f.getFields ? f.length() : f.length(f.getFields()); - }); - return len; -} - -PDU.prototype.is = function(type) { - return this.type == type; -} - -PDU.prototype.getFields = function(fields) { - var len = this.lengthField(fields); - fields.unshift(len); - if (this.type !== null) { - fields.unshift(new ReservedField()); - fields.unshift(new HexField(this.type)); - } - - return fields; -} - -PDU.prototype.lengthField = function(fields) { - if (this.lengthBytes == 4) { - return new UInt32Field(this.length(fields)); - } else if (this.lengthBytes == 2) { - return new UInt16Field(this.length(fields)); - } else { - throw "Invalid length bytes"; - } -} - -PDU.prototype.read = function(stream) { - stream.read(C.TYPE_HEX, 1); - var length = stream.read(C.TYPE_UINT32); - this.readBytes(stream, length); -} - -PDU.prototype.load = function(stream) { - return PDU.createByStream(stream); -} - -PDU.prototype.loadPDV = function(stream, length) { - if (stream.end()) return false; - var bytesRead = 0, pdvs = []; - while (bytesRead < length) { - var plength = stream.read(C.TYPE_UINT32), - pdv = new PresentationDataValueItem(); - pdv.readBytes(stream, plength); - bytesRead += plength + 4; - - pdvs.push(pdv); - } - - return pdvs; -} - -PDU.prototype.loadDicomMessage = function(stream, isCommand, isLast) { - var message = DicomMessage.read(stream, isCommand, isLast); - return message; -} - -PDU.prototype.stream = function() { - var stream = new WriteStream(), - fields = this.getFields(); - - // writing to buffer - fields.forEach(function(field){ - field.write(stream); - }); - - return stream; -} - -PDU.prototype.buffer = function() { - return this.stream().buffer(); -} - -var interpretCommand = function(stream, isLast) { - parseDicomMessage(stream); -} - -mergePDVs = function(pdvs) { - var merges = [], count = pdvs.length, i = 0; - while (i < count) {console.log(pdvs[i].isLast, pdvs[i].type); - if (!pdvs[i].isLast) { - var j = i; - while (!pdvs[j++].isLast && j < count) { - pdvs[i].messageStream.concat(pdvs[j].messageStream); - } - merges.push(pdvs[i]); - i = j; - } else { - merges.push(pdvs[i++]); - } - } - return merges; -} - -PDU.splitPData = function(pdata, maxSize) { - var totalLength = pdata.totalLength(); - if (totalLength > maxSize) { - //split into chunks of pdatas - var chunks = Math.floor(totalLength / maxSize), left = totalLength % maxSize; - - for (var i = 0;i < chunks;i++) { - if (i == chunks - 1) { - if (left < 6) { - //need to move some of the last chunk - } - } - } - } else { - return [pdata]; - } -} - -var readChunk = function(fd, bufferSize, slice, callback) { - var buffer = Buffer.alloc(bufferSize), length = slice.length, start = slice.start; - fs.read(fd, buffer, 0, length, start, function(err, bytesRead) { - callback(err, bytesRead, buffer, slice); - }); -} - -PDU.generatePDatas = function(context, bufferOrFile, maxSize, length, metaLength, callback) { - var total, isFile = false; - if (typeof bufferOrFile == 'string') { - var stats = fs.statSync(bufferOrFile); - total = stats['size']; - isFile = true; - } else if (bufferOrFile instanceof Buffer) { - total = length ? length : bufferOrFile.length; - } - var handler = new PDVHandle(); - - var slices = [], start = metaLength + 144, index = 0; - maxSize -= 6; - while (start < total) { - var sliceLength = maxSize, isLast = false; - if (total - start < maxSize) { - sliceLength = total - start; - isLast = true; - } - slices.push({start : start, length : sliceLength, isLast : isLast, index : index}); - start += sliceLength; - index++; - } - - if (isFile) { - fs.open(bufferOrFile, 'r', function(err, fd) { - if (err) { - //fs.closeSync(fd); - return quitWithError(err, callback); - } else callback(null, handler); - - var after = function(err, bytesRead, buffer, slice) { - if (err) { - fs.closeSync(fd); - handler.emit('error', err); - return; - } - var pdv = new RawDataPDV(context, buffer, 0, slice.length, slice.isLast); - handler.emit('pdv', pdv); - - if (slices.length < 1) { - handler.emit('end'); - fs.closeSync(fd); - } else { - var next = slices.shift(); - readChunk(fd, maxSize, next, after); - } - }; - - var sl = slices.shift(); - readChunk(fd, maxSize, sl, after); - }); - } else { - for (var i = 0;i < slices.length;i++) { - var toSlice = slices[i]; - - var buffer = bufferOrFile.slice(toSlice.start, toSlice.length); - var pdv = new RawDataPDV(context, buffer, 0, toSlice.length, toSlice.isLast); - handler.emit('pdv', pdv); - - if (i == slices.length - 1) { - handler.emit('end'); - } - } - } - - return; -} - -PDU.typeToString = function(type) { - var pdu = null, typeNum = parseInt(type, 16); - //console.log("RECEIVED PDU-TYPE ", typeNum); - switch (typeNum) { - case 0x01 : pdu = 'ASSOCIATE-RQ'; break; - case 0x02 : pdu = 'ASSOCIATE-AC'; break; - case 0x04 : pdu = 'P-DATA-TF'; break; - case 0x06 : pdu = 'RELEASE-RP'; break; - case 0x07 : pdu = 'ASSOCIATE-ABORT'; break; - case 0x10 : pdu = 'APPLICATION-CONTEXT-ITEM'; break; - case 0x20 : pdu = 'PRESENTATION-CONTEXT-ITEM'; break; - case 0x21 : pdu = 'PRESENTATION-CONTEXT-ITEM-AC'; break; - case 0x30 : pdu = 'ABSTRACT-SYNTAX-ITEM'; break; - case 0x40 : pdu = 'TRANSFER-SYNTAX-ITEM'; break; - case 0x50 : pdu = 'USER-INFORMATION-ITEM'; break; - case 0x51 : pdu = 'MAXIMUM-LENGTH-ITEM'; break; - case 0x52 : pdu = 'IMPLEMENTATION-CLASS-UID-ITEM'; break; - case 0x55 : pdu = 'IMPLEMENTATION-VERSION-NAME-ITEM'; break; - default : break; - } - - return pdu; -} - -PDU.createByStream = function(stream) { - if (stream.end()) return null; - - var pduType = stream.read(C.TYPE_HEX, 1), typeNum = parseInt(pduType, 16), pdu = null; - //console.log("RECEIVED PDU-TYPE ", pduType); - switch (typeNum) { - case 0x01 : pdu = new AssociateRQ(); break; - case 0x02 : pdu = new AssociateAC(); break; - case 0x04 : pdu = new PDataTF(); break; - case 0x06 : pdu = new ReleaseRP(); break; - case 0x07 : pdu = new AssociateAbort(); break; - case 0x10 : pdu = new ApplicationContextItem(); break; - case 0x20 : pdu = new PresentationContextItem(); break; - case 0x21 : pdu = new PresentationContextItemAC(); break; - case 0x30 : pdu = new AbstractSyntaxItem(); break; - case 0x40 : pdu = new TransferSyntaxItem(); break; - case 0x50 : pdu = new UserInformationItem(); break; - case 0x51 : pdu = new MaximumLengthItem(); break; - case 0x52 : pdu = new ImplementationClassUIDItem(); break; - case 0x55 : pdu = new ImplementationVersionNameItem(); break; - default : throw "Unrecoginized pdu type " + pduType; break; - } - if (pdu) - pdu.read(stream); - - return pdu; -} - -var nextItemIs = function(stream, pduType) { - if (stream.end()) return false; - - var nextType = stream.read(C.TYPE_HEX, 1); - stream.increment(-1); - return pduType == nextType; -} - -AssociateRQ = function() { - PDU.call(this); - this.type = C.ITEM_TYPE_PDU_ASSOCIATE_RQ; - this.protocolVersion = 1; -} - -util.inherits(AssociateRQ, PDU); - -AssociateRQ.prototype.setProtocolVersion = function(version) { - this.protocolVersion = version; -} - -AssociateRQ.prototype.setCalledAETitle = function(title) { - this.calledAETitle = title; -} - -AssociateRQ.prototype.setCallingAETitle = function(title) { - this.callingAETitle = title; -} - -AssociateRQ.prototype.setApplicationContextItem = function(item) { - this.applicationContextItem = item; -} - -AssociateRQ.prototype.setPresentationContextItems = function(items) { - this.presentationContextItems = items; -} - -AssociateRQ.prototype.setUserInformationItem = function(item) { - this.userInformationItem = item; -} - -AssociateRQ.prototype.allAccepted = function() { - for (var i in this.presentationContextItems) { - var item = this.presentationContextItems[i]; - if (!item.accepted()) return false; - } - return true; -} - -AssociateRQ.prototype.getFields = function() { - var f = [ - new UInt16Field(this.protocolVersion), new ReservedField(2), - new FilledField(this.calledAETitle, 16), new FilledField(this.callingAETitle, 16), - new ReservedField(32), this.applicationContextItem - ]; - this.presentationContextItems.forEach(function(context){ - f.push(context); - }); - f.push(this.userInformationItem); - return AssociateRQ.super_.prototype.getFields.call(this, f); -} - -AssociateRQ.prototype.readBytes = function(stream, length) { - this.type = C.ITEM_TYPE_PDU_ASSOCIATE_RQ; - var version = stream.read(C.TYPE_UINT16); - this.setProtocolVersion(version); - stream.increment(2); - var calledAE = stream.read(C.TYPE_ASCII, 16); - this.setCalledAETitle(calledAE); - var callingAE = stream.read(C.TYPE_ASCII, 16); - this.setCallingAETitle(callingAE); - stream.increment(32); - - var appContext = this.load(stream); - this.setApplicationContextItem(appContext); - - var presContexts = []; - do { - presContexts.push(this.load(stream)); - } while (nextItemIs(stream, C.ITEM_TYPE_PRESENTATION_CONTEXT)); - this.setPresentationContextItems(presContexts); - - var userItem = this.load(stream); - this.setUserInformationItem(userItem); -} - -AssociateRQ.prototype.buffer = function() { - return AssociateRQ.super_.prototype.buffer.call(this); -} - -AssociateAC = function() { - AssociateRQ.call(this); -}; - -util.inherits(AssociateAC, AssociateRQ); - -AssociateAC.prototype.readBytes = function(stream, length) { - this.type = C.ITEM_TYPE_PDU_ASSOCIATE_AC; - var version = stream.read(C.TYPE_UINT16); - this.setProtocolVersion(version); - stream.increment(66); - - var appContext = this.load(stream); - this.setApplicationContextItem(appContext); - - var presContexts = []; - do { - presContexts.push(this.load(stream)); - } while (nextItemIs(stream, C.ITEM_TYPE_PRESENTATION_CONTEXT_AC)); - this.setPresentationContextItems(presContexts); - - var userItem = this.load(stream); - this.setUserInformationItem(userItem); -} - -AssociateAC.prototype.getMaxSize = function() { - var items = this.userInformationItem.userDataItems, length = items.length, size = null; - - for (var i = 0;i < length;i++) { - if (items[i].is(C.ITEM_TYPE_MAXIMUM_LENGTH)) { - size = items[i].maximumLengthReceived; - break; - } - } - return size; -} - -AssociateAbort = function() { - this.type = C.ITEM_TYPE_PDU_AABORT; - this.source = 1; - this.reason = 0; - PDU.call(this); -} - -util.inherits(AssociateAbort, PDU); - -AssociateAbort.prototype.setSource = function(src) { - this.source = src; -} - -AssociateAbort.prototype.setReason = function(reason) { - this.reason = reason; -} - -AssociateAbort.prototype.readBytes = function(stream, length) { - stream.increment(2); - - var source = stream.read(C.TYPE_UINT8); - this.setSource(source); - - var reason = stream.read(C.TYPE_UINT8); - this.setReason(reason); -} - -AssociateAbort.prototype.getFields = function() { - return AssociateAbort.super_.prototype.getFields.call(this, [ - new ReservedField(), new ReservedField(), - new UInt8Field(this.source), new UInt8Field(this.reason) - ]); -} - -ReleaseRQ = function() { - this.type = C.ITEM_TYPE_PDU_RELEASE_RQ; - PDU.call(this); -}; - -util.inherits(ReleaseRQ, PDU); - -ReleaseRQ.prototype.getFields = function() { - return ReleaseRQ.super_.prototype.getFields.call(this, [new ReservedField(4)]); -}; - -ReleaseRP = function() { - this.type = C.ITEM_TYPE_PDU_RELEASE_RP; - PDU.call(this); -} - -util.inherits(ReleaseRP, PDU); - -ReleaseRP.prototype.readBytes = function(stream, length) { - stream.increment(4); -}; - -ReleaseRP.prototype.getFields = function() { - return ReleaseRP.super_.prototype.getFields.call(this, [new ReservedField(4)]); -} - -PDataTF = function() { - this.type = C.ITEM_TYPE_PDU_PDATA; - this.presentationDataValueItems = []; - PDU.call(this); -} -util.inherits(PDataTF, PDU); - -PDataTF.prototype.setPresentationDataValueItems = function(items) { - this.presentationDataValueItems = items ? items : []; -} - -PDataTF.prototype.getFields = function() { - var fields = this.presentationDataValueItems; - - return PDataTF.super_.prototype.getFields.call(this, fields); -} - -PDataTF.prototype.totalLength = function() { - var fields = this.presentationDataValueItems; - - return this.length(fields); -} - -PDataTF.prototype.readBytes = function(stream, length) { - var pdvs = this.loadPDV(stream, length); - //let merges = mergePDVs(pdvs); - - this.setPresentationDataValueItems(pdvs); -} - -Item = function() { - PDU.call(this); - this.lengthBytes = 2; -}; -util.inherits(Item, PDU); - -Item.prototype.read = function(stream) { - stream.read(C.TYPE_HEX, 1); - var length = stream.read(C.TYPE_UINT16); - this.readBytes(stream, length); -} - -Item.prototype.write = function(stream) { - stream.concat(this.stream()); -} - -Item.prototype.getFields = function(fields) { - return Item.super_.prototype.getFields.call(this, fields); -} - -PresentationDataValueItem = function(context) { - this.type = null; - this.isLast = true; - this.dataFragment = null; - this.contextId = context; - this.messageStream = null; - Item.call(this); - - this.lengthBytes = 4; -}; -util.inherits(PresentationDataValueItem, Item); - -PresentationDataValueItem.prototype.setContextId = function(id) { - this.contextId = id; -} - -PresentationDataValueItem.prototype.setFlag = function(flag) { - this.flag = flag; -} - -PresentationDataValueItem.prototype.setPresentationDataValue = function(pdv) { - this.pdv = pdv; -} - -PresentationDataValueItem.prototype.setMessage = function(msg) { - this.dataFragment = msg; -} - -PresentationDataValueItem.prototype.getMessage = function() { - return this.dataFragment; -} - -PresentationDataValueItem.prototype.readBytes = function(stream, length) { - this.contextId = stream.read(C.TYPE_UINT8); - var messageHeader = stream.read(C.TYPE_UINT8); - this.isLast = messageHeader >> 1; - this.type = messageHeader & 1 ? C.DATA_TYPE_COMMAND : C.DATA_TYPE_DATA; - - //load dicom messages - this.messageStream = stream.more(length - 2); -} - -PresentationDataValueItem.prototype.getFields = function() { - var fields = [new UInt8Field(this.contextId)]; - //define header - var messageHeader = (1 & this.dataFragment.type) | ((this.isLast ? 1 : 0) << 1); - fields.push(new UInt8Field(messageHeader)); - - fields.push(this.dataFragment); - - return PresentationDataValueItem.super_.prototype.getFields.call(this, fields); -} - -RawDataPDV = function(context, buffer, start, length, isLast) { - this.type = null; - this.isLast = isLast; - this.dataFragmentBuffer = buffer; - this.bufferStart = start; - this.bufferLength = length; - this.contextId = context; - Item.call(this); - - this.lengthBytes = 4; -}; -util.inherits(RawDataPDV, Item); - -RawDataPDV.prototype.getFields = function() { - var fields = [new UInt8Field(this.contextId)]; - var messageHeader = (this.isLast ? 1 : 0) << 1; - fields.push(new UInt8Field(messageHeader)); - fields.push(new BufferField(this.dataFragmentBuffer, this.bufferStart, this.bufferLength)); - - return RawDataPDV.super_.prototype.getFields.call(this, fields); -} - -ApplicationContextItem = function() { - this.type = C.ITEM_TYPE_APPLICATION_CONTEXT; - this.applicationContextName = C.APPLICATION_CONTEXT_NAME; - Item.call(this); -} -util.inherits(ApplicationContextItem, Item); - -ApplicationContextItem.prototype.setApplicationContextName = function(name) { - this.applicationContextName = name; -} - -ApplicationContextItem.prototype.getFields = function() { - return ApplicationContextItem.super_.prototype.getFields.call(this, [new StringField(this.applicationContextName)]); -} - -ApplicationContextItem.prototype.readBytes = function(stream, length) { - var appContext = stream.read(C.TYPE_ASCII, length); - this.setApplicationContextName(appContext); -} - -ApplicationContextItem.prototype.buffer = function() { - return ApplicationContextItem.super_.prototype.buffer.call(this); -} - -PresentationContextItem = function() { - this.type = C.ITEM_TYPE_PRESENTATION_CONTEXT; - Item.call(this); -}; -util.inherits(PresentationContextItem, Item); - -PresentationContextItem.prototype.setPresentationContextID = function(id) { - this.presentationContextID = id; -} - -PresentationContextItem.prototype.setAbstractSyntaxItem = function(item) { - this.abstractSyntaxItem = item; -} - -PresentationContextItem.prototype.setTransferSyntaxesItems = function(items) { - this.transferSyntaxesItems = items; -} - -PresentationContextItem.prototype.setResultReason = function(reason) { - this.resultReason = reason; -} - -PresentationContextItem.prototype.accepted = function() { - return this.resultReason == 0; -} - -PresentationContextItem.prototype.readBytes = function(stream, length) { - var contextId = stream.read(C.TYPE_UINT8); - this.setPresentationContextID(contextId); - stream.increment(1); - stream.increment(1); - stream.increment(1); - - var abstractItem = this.load(stream); - this.setAbstractSyntaxItem(abstractItem); - - var transContexts = []; - do { - transContexts.push(this.load(stream)); - } while (nextItemIs(stream, C.ITEM_TYPE_TRANSFER_CONTEXT)); - this.setTransferSyntaxesItems(transContexts); -} - -PresentationContextItem.prototype.getFields = function() { - var f = [ - new UInt8Field(this.presentationContextID), - new ReservedField(), new ReservedField(), new ReservedField(), this.abstractSyntaxItem - ]; - this.transferSyntaxesItems.forEach(function(syntaxItem){ - f.push(syntaxItem); - }); - return PresentationContextItem.super_.prototype.getFields.call(this, f); -} - -PresentationContextItem.prototype.buffer = function() { - return PresentationContextItem.super_.prototype.buffer.call(this); -} - -PresentationContextItemAC = function() { - this.type = C.ITEM_TYPE_PRESENTATION_CONTEXT_AC; - Item.call(this); -}; -util.inherits(PresentationContextItemAC, PresentationContextItem); - -PresentationContextItemAC.prototype.readBytes = function(stream, length) { - var contextId = stream.read(C.TYPE_UINT8); - this.setPresentationContextID(contextId); - stream.increment(1); - var resultReason = stream.read(C.TYPE_UINT8); - this.setResultReason(resultReason); - stream.increment(1); - - var transItem = this.load(stream); - this.setTransferSyntaxesItems([transItem]); -} - -AbstractSyntaxItem = function() { - this.type = C.ITEM_TYPE_ABSTRACT_CONTEXT; - Item.call(this); -} -util.inherits(AbstractSyntaxItem, Item); - -AbstractSyntaxItem.prototype.setAbstractSyntaxName = function(name) { - this.abstractSyntaxName = name; -} - -AbstractSyntaxItem.prototype.getFields = function() { - return AbstractSyntaxItem.super_.prototype.getFields.call(this, [new StringField(this.abstractSyntaxName)]); -} - -AbstractSyntaxItem.prototype.buffer = function() { - return AbstractSyntaxItem.super_.prototype.buffer.call(this); -} - -AbstractSyntaxItem.prototype.readBytes = function(stream, length) { - var name = stream.read(C.TYPE_ASCII, length); - this.setAbstractSyntaxName(name); -} - -TransferSyntaxItem = function() { - this.type = C.ITEM_TYPE_TRANSFER_CONTEXT; - Item.call(this); -}; -util.inherits(TransferSyntaxItem, Item); - -TransferSyntaxItem.prototype.setTransferSyntaxName = function(name) { - this.transferSyntaxName = name; -} - -TransferSyntaxItem.prototype.readBytes = function(stream, length) { - var transfer = stream.read(C.TYPE_ASCII, length); - this.setTransferSyntaxName(transfer); -} - -TransferSyntaxItem.prototype.getFields = function() { - return TransferSyntaxItem.super_.prototype.getFields.call(this, [new StringField(this.transferSyntaxName)]); -} - -TransferSyntaxItem.prototype.buffer = function() { - return TransferSyntaxItem.super_.prototype.buffer.call(this); -} - -UserInformationItem = function() { - this.type = C.ITEM_TYPE_USER_INFORMATION; - Item.call(this); -}; -util.inherits(UserInformationItem, Item); - -UserInformationItem.prototype.setUserDataItems = function(items) { - this.userDataItems = items; -} - -UserInformationItem.prototype.readBytes = function(stream, length) { - var items = [], pdu = this.load(stream); - - do { - items.push(pdu); - } while (pdu = this.load(stream)); - this.setUserDataItems(items); -} - -UserInformationItem.prototype.getFields = function() { - var f = []; - this.userDataItems.forEach(function(userData){ - f.push(userData); - }); - return UserInformationItem.super_.prototype.getFields.call(this, f); -} - -UserInformationItem.prototype.buffer = function() { - return UserInformationItem.super_.prototype.buffer.call(this); -} - -ImplementationClassUIDItem = function() { - this.type = C.ITEM_TYPE_IMPLEMENTATION_UID; - Item.call(this); -} -util.inherits(ImplementationClassUIDItem, Item); - -ImplementationClassUIDItem.prototype.setImplementationClassUID = function(id) { - this.implementationClassUID = id; -} - -ImplementationClassUIDItem.prototype.readBytes = function(stream, length) { - var uid = stream.read(C.TYPE_ASCII, length); - this.setImplementationClassUID(uid); -} - -ImplementationClassUIDItem.prototype.getFields = function() { - return ImplementationClassUIDItem.super_.prototype.getFields.call(this, [new StringField(this.implementationClassUID)]); -} - -ImplementationClassUIDItem.prototype.buffer = function() { - return ImplementationClassUIDItem.super_.prototype.buffer.call(this); -} - -ImplementationVersionNameItem = function() { - this.type = C.ITEM_TYPE_IMPLEMENTATION_VERSION; - Item.call(this); -} -util.inherits(ImplementationVersionNameItem, Item); - -ImplementationVersionNameItem.prototype.setImplementationVersionName = function(name) { - this.implementationVersionName = name; -} - -ImplementationVersionNameItem.prototype.readBytes = function(stream, length) { - var name = stream.read(C.TYPE_ASCII, length); - this.setImplementationVersionName(name); -} - -ImplementationVersionNameItem.prototype.getFields = function() { - return ImplementationVersionNameItem.super_.prototype.getFields.call(this, [new StringField(this.implementationVersionName)]); -} - -ImplementationVersionNameItem.prototype.buffer = function() { - return ImplementationVersionNameItem.super_.prototype.buffer.call(this); -} - -MaximumLengthItem = function() { - this.type = C.ITEM_TYPE_MAXIMUM_LENGTH; - this.maximumLengthReceived = 32768; - Item.call(this); -} -util.inherits(MaximumLengthItem, Item); - -MaximumLengthItem.prototype.setMaximumLengthReceived = function(length) { - this.maximumLengthReceived = length; -} - -MaximumLengthItem.prototype.readBytes = function(stream, length) { - var l = stream.read(C.TYPE_UINT32); - this.setMaximumLengthReceived(l); -} - -MaximumLengthItem.prototype.getFields = function() { - return MaximumLengthItem.super_.prototype.getFields.call(this, [new UInt32Field(this.maximumLengthReceived)]); -} - -MaximumLengthItem.prototype.buffer = function() { - return MaximumLengthItem.super_.prototype.buffer.call(this); -} - diff --git a/Packages/ohif-dicom-services/server/DIMSE/RWStream.js b/Packages/ohif-dicom-services/server/DIMSE/RWStream.js deleted file mode 100755 index 618c7599f..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/RWStream.js +++ /dev/null @@ -1,239 +0,0 @@ -var isString = function(type) { - if (type === C.TYPE_ASCII || type === C.TYPE_HEX) { - return true; - } else { - return false; - } -}; - -calcLength = function(type, value) { - var size = NaN; - switch (type) { - case C.TYPE_HEX : size = Buffer.byteLength(value, 'hex'); break; - case C.TYPE_ASCII : size = Buffer.byteLength(value, 'ascii'); break; - case C.TYPE_UINT8 : size = 1; break; - case C.TYPE_UINT16 : size = 2; break; - case C.TYPE_UINT32 : size = 4; break; - case C.TYPE_FLOAT : size = 4; break; - case C.TYPE_DOUBLE : size = 8; break; - case C.TYPE_INT8 : size = 1; break; - case C.TYPE_INT16 : size = 2; break; - case C.TYPE_INT32 : size = 4; break; - default :break; -} - return size; -}; - -var RWStream = function() { - this.endian = C.BIG_ENDIAN; -}; - -RWStream.prototype.setEndian = function(endian) { - this.endian = endian; -}; - -RWStream.prototype.getEncoding = function(type) { - return RWStream.encodings[type]; -}; - -RWStream.prototype.getWriteType = function(type) { - return RWStream.writes[this.endian][type]; -}; - -RWStream.prototype.getReadType = function(type) { - return RWStream.reads[this.endian][type]; -}; - -WriteStream = function() { - RWStream.call(this); - this.defaultBufferSize = 512; //512 bytes - this.rawBuffer = Buffer.alloc(this.defaultBufferSize); - this.offset = 0; - this.contentSize = 0; -}; - -util.inherits(WriteStream, RWStream); - -WriteStream.prototype.increment = function(add) { - this.offset += add; - if (this.offset > this.contentSize) { - this.contentSize = this.offset; - } -}; - -WriteStream.prototype.size = function() { - return this.contentSize; -}; - -WriteStream.prototype.skip = function(amount) { - this.increment(amount); -}; - -WriteStream.prototype.checkSize = function(length) { - if (this.offset + length > this.rawBuffer.length) { - // we need more size, copying old one to new buffer - var oldLength = this.rawBuffer.length, - newBuffer = Buffer.alloc(oldLength + length + (oldLength / 2)); - this.rawBuffer.copy(newBuffer, 0, 0, this.contentSize); - this.rawBuffer = newBuffer; - } -}; - -WriteStream.prototype.writeToBuffer = function(type, value, length) { - if (value === '' || value === null) return; - - this.checkSize(length); - this.rawBuffer[this.getWriteType(type)](value, this.offset); - this.increment(length); -}; - -WriteStream.prototype.writeRawBuffer = function(source, start, length) { - if (!source) return; - this.checkSize(length); - source.copy(this.rawBuffer, this.offset, start, length); - this.increment(length); -}; - -WriteStream.prototype.write = function(type, value) { - if (isString(type)) { - this.writeString(value, type); - } else { - this.writeToBuffer(type, value, calcLength(type)); - } -}; - -WriteStream.prototype.writeString = function(string, type) { - var encoding = this.getEncoding(type), - length = Buffer.byteLength(string, encoding); - this.rawBuffer.write(string, this.offset, length, encoding); - this.increment(length); -}; - -WriteStream.prototype.buffer = function() { - return this.rawBuffer.slice(0, this.contentSize); -}; - -WriteStream.prototype.toReadBuffer = function() { - return new ReadStream(this.buffer()); -}; - -WriteStream.prototype.concat = function(newStream) { - var newSize = this.size() + newStream.size(); - this.rawBuffer = Buffer.concat([this.buffer(), newStream.buffer()], newSize); - this.contentSize = newSize; - this.offset = newSize; -}; - -ReadStream = function(buffer) { - RWStream.call(this); - this.rawBuffer = buffer; - this.offset = 0; -}; - -util.inherits(ReadStream, RWStream); - -ReadStream.prototype.size = function() { - return this.rawBuffer.length; -}; - -ReadStream.prototype.increment = function(add) { - this.offset += add; -}; - -ReadStream.prototype.more = function(length) { - var newBuf = this.rawBuffer.slice(this.offset, this.offset + length); - this.increment(length); - return new ReadStream(newBuf); -}; - -ReadStream.prototype.reset = function() { - this.offset = 0; - return this; -}; - -ReadStream.prototype.end = function() { - return this.offset >= this.size(); -}; - -ReadStream.prototype.readFromBuffer = function(type, length) { - //this.checkSize(length); - //if (this.offset + length > this.rawBuffer.length) throw ("out of bound " + this.offset + "," + length + "," + this.rawBuffer.length); - var value = this.rawBuffer[this.getReadType(type)](this.offset); - this.increment(length); - return value; -}; - -ReadStream.prototype.read = function(type, length) { - var value = null; - if (isString(type)) { - value = this.readString(length, type); - } else { - value = this.readFromBuffer(type, calcLength(type)); - } - - return value; -}; - -ReadStream.prototype.readString = function(length, type) { - var encoding = this.getEncoding(type), - str = this.rawBuffer.toString(encoding, this.offset, this.offset + length); - this.increment(length); - return str; -}; - -ReadStream.prototype.buffer = function() { - return this.rawBuffer; -}; - -ReadStream.prototype.concat = function(newStream) { - var newSize = this.size() + newStream.size(); - this.rawBuffer = Buffer.concat([this.buffer(), newStream.buffer()], newSize); - this.contentSize = newSize; - this.offset = newSize; -}; - -RWStream.writes = {}; -RWStream.writes[C.BIG_ENDIAN] = {}; -RWStream.writes[C.BIG_ENDIAN][C.TYPE_UINT8] = 'writeUInt8'; -RWStream.writes[C.BIG_ENDIAN][C.TYPE_UINT16] = 'writeUInt16BE'; -RWStream.writes[C.BIG_ENDIAN][C.TYPE_UINT32] = 'writeUInt32BE'; -RWStream.writes[C.BIG_ENDIAN][C.TYPE_INT8] = 'writeInt8'; -RWStream.writes[C.BIG_ENDIAN][C.TYPE_INT16] = 'writeInt16BE'; -RWStream.writes[C.BIG_ENDIAN][C.TYPE_INT32] = 'writeInt32BE'; -RWStream.writes[C.BIG_ENDIAN][C.TYPE_FLOAT] = 'writeFloatBE'; -RWStream.writes[C.BIG_ENDIAN][C.TYPE_DOUBLE] = 'writeDoubleBE'; - -RWStream.writes[C.LITTLE_ENDIAN] = {}; -RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_UINT8] = 'writeUInt8'; -RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_UINT16] = 'writeUInt16LE'; -RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_UINT32] = 'writeUInt32LE'; -RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_INT8] = 'writeInt8'; -RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_INT16] = 'writeInt16LE'; -RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_INT32] = 'writeInt32LE'; -RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_FLOAT] = 'writeFloatLE'; -RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_DOUBLE] = 'writeDoubleLE'; - -RWStream.reads = {}; -RWStream.reads[C.BIG_ENDIAN] = {}; -RWStream.reads[C.BIG_ENDIAN][C.TYPE_UINT8] = 'readUInt8'; -RWStream.reads[C.BIG_ENDIAN][C.TYPE_UINT16] = 'readUInt16BE'; -RWStream.reads[C.BIG_ENDIAN][C.TYPE_UINT32] = 'readUInt32BE'; -RWStream.reads[C.BIG_ENDIAN][C.TYPE_INT8] = 'readInt8'; -RWStream.reads[C.BIG_ENDIAN][C.TYPE_INT16] = 'readInt16BE'; -RWStream.reads[C.BIG_ENDIAN][C.TYPE_INT32] = 'readInt32BE'; -RWStream.reads[C.BIG_ENDIAN][C.TYPE_FLOAT] = 'readFloatBE'; -RWStream.reads[C.BIG_ENDIAN][C.TYPE_DOUBLE] = 'readDoubleBE'; - -RWStream.reads[C.LITTLE_ENDIAN] = {}; -RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_UINT8] = 'readUInt8'; -RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_UINT16] = 'readUInt16LE'; -RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_UINT32] = 'readUInt32LE'; -RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_INT8] = 'readInt8'; -RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_INT16] = 'readInt16LE'; -RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_INT32] = 'readInt32LE'; -RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_FLOAT] = 'readFloatLE'; -RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_DOUBLE] = 'readDoubleLE'; - -RWStream.encodings = {}; -RWStream.encodings[C.TYPE_HEX] = 'hex'; -RWStream.encodings[C.TYPE_ASCII] = 'ascii'; diff --git a/Packages/ohif-dicom-services/server/DIMSE/constants.js b/Packages/ohif-dicom-services/server/DIMSE/constants.js deleted file mode 100755 index 26a8c01ae..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/constants.js +++ /dev/null @@ -1,100 +0,0 @@ -C = { - IMPLEM_UID : "1.2.840.0.1.3680045.8.641", - IMPLEM_VERSION : "OHIF-DCM-0.1", - DEFAULT_MAX_PACKAGE_SIZE : 32768, - APPLICATION_CONTEXT_NAME : "1.2.840.10008.3.1.1.1", - PROTOCOL_VERSION : "0001", - ITEM_TYPE_RESERVED : "00", - ITEM_TYPE_APPLICATION_CONTEXT : "10", - ITEM_TYPE_PDU_ASSOCIATE_RQ : "01", - ITEM_TYPE_PDU_ASSOCIATE_AC : "02", - ITEM_TYPE_PDU_PDATA : "04", - ITEM_TYPE_PDU_RELEASE_RQ : "05", - ITEM_TYPE_PDU_RELEASE_RP : "06", - ITEM_TYPE_PDU_AABORT : "07", - ITEM_TYPE_PRESENTATION_CONTEXT : "20", - ITEM_TYPE_PRESENTATION_CONTEXT_AC : "21", - ITEM_TYPE_ABSTRACT_CONTEXT : "30", - ITEM_TYPE_TRANSFER_CONTEXT : "40", - ITEM_TYPE_USER_INFORMATION : "50", - ITEM_TYPE_MAXIMUM_LENGTH : "51", - ITEM_TYPE_IMPLEMENTATION_UID : "52", - ITEM_TYPE_IMPLEMENTATION_VERSION : "55", - IMPLICIT_LITTLE_ENDIAN : "1.2.840.10008.1.2", - EXPLICIT_LITTLE_ENDIAN : "1.2.840.10008.1.2.1", - EXPLICIT_BIG_ENDIAN : "1.2.840.10008.1.2.2", - SOP_PATIENT_ROOT_FIND : "1.2.840.10008.5.1.4.1.2.1.1", - SOP_PATIENT_ROOT_MOVE : "1.2.840.10008.5.1.4.1.2.1.2", - SOP_PATIENT_ROOT_GET : "1.2.840.10008.5.1.4.1.2.1.3", - SOP_STUDY_ROOT_FIND : "1.2.840.10008.5.1.4.1.2.2.1", - SOP_STUDY_ROOT_MOVE : "1.2.840.10008.5.1.4.1.2.2.2", - SOP_STUDY_ROOT_GET : "1.2.840.10008.5.1.4.1.2.2.3", - SOP_VERIFICATION : "1.2.840.10008.1.1", - SOP_HANGING_PROTOCOL_FIND : "1.2.840.10008.5.1.4.38.2", - SOP_MR_IMAGE_STORAGE : "1.2.840.10008.5.1.4.1.1.4", - TYPE_ASCII : 1, - TYPE_HEX : 2, - TYPE_UINT8 : 3, - TYPE_UINT16 : 4, - TYPE_UINT32 : 5, - TYPE_COMPOSITE : 6, - TYPE_FLOAT : 7, - TYPE_DOUBLE : 8, - TYPE_INT8 : 9, - TYPE_INT16 : 10, - TYPE_INT32 : 11, - TYPE_BUFFER : 12, - RESULT_REASON_ACCEPTANCE : 0, - RESULT_REASON_USER_REJECTION : 1, - RESULT_REASON_NO_REASON :2, - RESULT_REASON_ABSTRACT_NOT_SUPPORTED : 3, - RESULT_REASON_TRANSFER_NOT_SUPPORTED : 4, - DEFAULT_MESSAGE_ID : 1, - LITTLE_ENDIAN : 1, - BIG_ENDIAN : 2, - VM_SINGLE :1, - VM_TWO : 3, - VM_THREE : 4, - VM_FOUR : 5, - VM_1N : 6, - VM_2N :7, - VM_3N :8, - VM_6N :9, - VM_3_3N : 10, - VM_2_2N : 11, - VM_16 : 12, - VM_1_2 : 13, - VM_1_3 : 18, - VM_SIX : 14, - VM_NINE : 15, - VM_1_32 : 16, - VM_1_99 : 17, - PRIORITY_LOW : 0x2, - PRIORITY_MEDIUM : 0x0, - PRIORITY_HIGH : 0x1, - DATA_SET_PRESENT : 1, - DATE_SET_ABSENCE : 0x0101, - DATA_TYPE_COMMAND : 1, - DATA_TYPE_DATA : 0, - DATA_IS_LAST : 1, - DATA_NOT_LAST : 0, - SOURCE_SERVICE_USER : 0, - SOURCE_SERVICE_PROVIDER : 2, - QUERY_RETRIEVE_LEVEL_PATIENT : "PATIENT", - QUERY_RETRIEVE_LEVEL_STUDY : "STUDY", - QUERY_RETRIEVE_LEVEL_SERIES : "SERIES", - QUERY_RETRIEVE_LEVEL_IMAGE : "IMAGE", - VALUE_LENGTH_UNDEFINED : 0xffffffff, - STATUS_SUCCESS : 0x0000, - STATUS_CANCEL : 0xfe00, - STATUS_CFIND_CONT_OK : 0xff00, - STATUS_CFIND_CONT_WARN : 0xff01, - COMMAND_C_GET_RSP : 0x8010, - COMMAND_C_MOVE_RSP : 0x8021, - COMMAND_C_GET_RQ : 0x10, - COMMAND_C_STORE_RQ : 0x01, - COMMAND_C_FIND_RSP : 0x8020, - COMMAND_C_MOVE_RQ : 0x21, - COMMAND_C_FIND_RQ : 0x20, - COMMAND_C_STORE_RSP : 0x8001 -}; \ No newline at end of file diff --git a/Packages/ohif-dicom-services/server/DIMSE/elements_data.js b/Packages/ohif-dicom-services/server/DIMSE/elements_data.js deleted file mode 100755 index ce4f1f3d5..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/elements_data.js +++ /dev/null @@ -1,3611 +0,0 @@ -var dicomNDict = { - 0x00020000 : { vr : 'UL', vm : C.VM_SINGLE, keyword : "FileMetaInformationGroupLength" }, - 0x00020001 : { vr : 'OB', vm : C.VM_SINGLE, keyword : "FileMetaInformationVersion" }, - 0x00020002 : { vr : 'UI', vm : C.VM_SINGLE, keyword : "MediaStorageSOPClassUID" }, - 0x00020003 : { vr : 'UI', vm : C.VM_SINGLE, keyword : "MediaStorageSOPInstanceUID" }, - 0x00020010 : { vr : 'UI', vm : C.VM_SINGLE, keyword : "TransferSyntaxUID" }, - 0x00020012 : { vr : 'UI', vm : C.VM_SINGLE, keyword : "ImplementationClassUID" }, - 0x00020013 : { vr : 'SH', vm : C.VM_SINGLE, keyword : "ImplementationVersionName" }, - 0x00020016 : { vr : 'AE', vm : C.VM_SINGLE, keyword : "SourceApplicationEntityTitle" }, - 0x00020100 : { vr : 'UI', vm : C.VM_SINGLE, keyword : "PrivateInformationCreatorUID" }, - 0x00020102 : { vr : 'OB', vm : C.VM_SINGLE, keyword : "PrivateInformation" }, - 0x00080001 : { vr : "UL", vm : C.VM_SINGLE, keyword : "LengthToEnd"}, - 0x00080005 : { vr : "CS", vm : C.VM_1N, keyword : "SpecificCharacterSet"}, - 0x00080006 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LanguageCodeSequence"}, - 0x00080008 : { vr : "CS", vm : C.VM_2N, keyword : "ImageType"}, - 0x00080010 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RecognitionCode"}, - 0x00080012 : { vr : "DA", vm : C.VM_SINGLE, keyword : "InstanceCreationDate"}, - 0x00080013 : { vr : "TM", vm : C.VM_SINGLE, keyword : "InstanceCreationTime"}, - 0x00080014 : { vr : "UI", vm : C.VM_SINGLE, keyword : "InstanceCreatorUID"}, - 0x00080016 : { vr : "UI", vm : C.VM_SINGLE, keyword : "SOPClassUID"}, - 0x00080018 : { vr : "UI", vm : C.VM_SINGLE, keyword : "SOPInstanceUID"}, - 0x0008001A : { vr : "UI", vm : C.VM_1N, keyword : "RelatedGeneralSOPClassUID"}, - 0x0008001B : { vr : "UI", vm : C.VM_SINGLE, keyword : "OriginalSpecializedSOPClassUID"}, - 0x00080020 : { vr : "DA", vm : C.VM_SINGLE, keyword : "StudyDate"}, - 0x00080021 : { vr : "DA", vm : C.VM_SINGLE, keyword : "SeriesDate"}, - 0x00080022 : { vr : "DA", vm : C.VM_SINGLE, keyword : "AcquisitionDate"}, - 0x00080023 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ContentDate"}, - 0x00080024 : { vr : "DA", vm : C.VM_SINGLE, keyword : "OverlayDate"}, - 0x00080025 : { vr : "DA", vm : C.VM_SINGLE, keyword : "CurveDate"}, - 0x0008002A : { vr : "DT", vm : C.VM_SINGLE, keyword : "AcquisitionDateTime"}, - 0x00080030 : { vr : "TM", vm : C.VM_SINGLE, keyword : "StudyTime"}, - 0x00080031 : { vr : "TM", vm : C.VM_SINGLE, keyword : "SeriesTime"}, - 0x00080032 : { vr : "TM", vm : C.VM_SINGLE, keyword : "AcquisitionTime"}, - 0x00080033 : { vr : "TM", vm : C.VM_SINGLE, keyword : "ContentTime"}, - 0x00080034 : { vr : "TM", vm : C.VM_SINGLE, keyword : "OverlayTime"}, - 0x00080035 : { vr : "TM", vm : C.VM_SINGLE, keyword : "CurveTime"}, - 0x00080040 : { vr : "US", vm : C.VM_SINGLE, keyword : "DataSetType"}, - 0x00080041 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DataSetSubtype"}, - 0x00080042 : { vr : "CS", vm : C.VM_SINGLE, keyword : "NuclearMedicineSeriesType"}, - 0x00080050 : { vr : "SH", vm : C.VM_SINGLE, keyword : "AccessionNumber"}, - 0x00080051 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IssuerOfAccessionNumberSequence"}, - 0x00080052 : { vr : "CS", vm : C.VM_SINGLE, keyword : "QueryRetrieveLevel"}, - 0x00080054 : { vr : "AE", vm : C.VM_1N, keyword : "RetrieveAETitle"}, - 0x00080056 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InstanceAvailability"}, - 0x00080058 : { vr : "UI", vm : C.VM_1N, keyword : "FailedSOPInstanceUIDList"}, - 0x00080060 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Modality"}, - 0x00080061 : { vr : "CS", vm : C.VM_1N, keyword : "ModalitiesInStudy"}, - 0x00080062 : { vr : "UI", vm : C.VM_1N, keyword : "SOPClassesInStudy"}, - 0x00080064 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ConversionType"}, - 0x00080068 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PresentationIntentType"}, - 0x00080070 : { vr : "LO", vm : C.VM_SINGLE, keyword : "Manufacturer"}, - 0x00080080 : { vr : "LO", vm : C.VM_SINGLE, keyword : "InstitutionName"}, - 0x00080081 : { vr : "ST", vm : C.VM_SINGLE, keyword : "InstitutionAddress"}, - 0x00080082 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "InstitutionCodeSequence"}, - 0x00080090 : { vr : "PN", vm : C.VM_SINGLE, keyword : "ReferringPhysicianName"}, - 0x00080092 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ReferringPhysicianAddress"}, - 0x00080094 : { vr : "SH", vm : C.VM_1N, keyword : "ReferringPhysicianTelephoneNumbers"}, - 0x00080096 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferringPhysicianIdentificationSequence"}, - 0x00080100 : { vr : "SH", vm : C.VM_SINGLE, keyword : "CodeValue"}, - 0x00080102 : { vr : "SH", vm : C.VM_SINGLE, keyword : "CodingSchemeDesignator"}, - 0x00080103 : { vr : "SH", vm : C.VM_SINGLE, keyword : "CodingSchemeVersion"}, - 0x00080104 : { vr : "LO", vm : C.VM_SINGLE, keyword : "CodeMeaning"}, - 0x00080105 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MappingResource"}, - 0x00080106 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ContextGroupVersion"}, - 0x00080107 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ContextGroupLocalVersion"}, - 0x0008010B : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContextGroupExtensionFlag"}, - 0x0008010C : { vr : "UI", vm : C.VM_SINGLE, keyword : "CodingSchemeUID"}, - 0x0008010D : { vr : "UI", vm : C.VM_SINGLE, keyword : "ContextGroupExtensionCreatorUID"}, - 0x0008010F : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContextIdentifier"}, - 0x00080110 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CodingSchemeIdentificationSequence"}, - 0x00080112 : { vr : "LO", vm : C.VM_SINGLE, keyword : "CodingSchemeRegistry"}, - 0x00080114 : { vr : "ST", vm : C.VM_SINGLE, keyword : "CodingSchemeExternalID"}, - 0x00080115 : { vr : "ST", vm : C.VM_SINGLE, keyword : "CodingSchemeName"}, - 0x00080116 : { vr : "ST", vm : C.VM_SINGLE, keyword : "CodingSchemeResponsibleOrganization"}, - 0x00080117 : { vr : "UI", vm : C.VM_SINGLE, keyword : "ContextUID"}, - 0x00080201 : { vr : "SH", vm : C.VM_SINGLE, keyword : "TimezoneOffsetFromUTC"}, - 0x00081000 : { vr : "AE", vm : C.VM_SINGLE, keyword : "NetworkID"}, - 0x00081010 : { vr : "SH", vm : C.VM_SINGLE, keyword : "StationName"}, - 0x00081030 : { vr : "LO", vm : C.VM_SINGLE, keyword : "StudyDescription"}, - 0x00081032 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProcedureCodeSequence"}, - 0x0008103E : { vr : "LO", vm : C.VM_SINGLE, keyword : "SeriesDescription"}, - 0x0008103F : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SeriesDescriptionCodeSequence"}, - 0x00081040 : { vr : "LO", vm : C.VM_SINGLE, keyword : "InstitutionalDepartmentName"}, - 0x00081048 : { vr : "PN", vm : C.VM_1N, keyword : "PhysiciansOfRecord"}, - 0x00081049 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PhysiciansOfRecordIdentificationSequence"}, - 0x00081050 : { vr : "PN", vm : C.VM_1N, keyword : "PerformingPhysicianName"}, - 0x00081052 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformingPhysicianIdentificationSequence"}, - 0x00081060 : { vr : "PN", vm : C.VM_1N, keyword : "NameOfPhysiciansReadingStudy"}, - 0x00081062 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PhysiciansReadingStudyIdentificationSequence"}, - 0x00081070 : { vr : "PN", vm : C.VM_1N, keyword : "OperatorsName"}, - 0x00081072 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OperatorIdentificationSequence"}, - 0x00081080 : { vr : "LO", vm : C.VM_1N, keyword : "AdmittingDiagnosesDescription"}, - 0x00081084 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AdmittingDiagnosesCodeSequence"}, - 0x00081090 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ManufacturerModelName"}, - 0x00081100 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedResultsSequence"}, - 0x00081110 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedStudySequence"}, - 0x00081111 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedPerformedProcedureStepSequence"}, - 0x00081115 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedSeriesSequence"}, - 0x00081120 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedPatientSequence"}, - 0x00081125 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedVisitSequence"}, - 0x00081130 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedOverlaySequence"}, - 0x00081134 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedStereometricInstanceSequence"}, - 0x0008113A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedWaveformSequence"}, - 0x00081140 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedImageSequence"}, - 0x00081145 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedCurveSequence"}, - 0x0008114A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedInstanceSequence"}, - 0x0008114B : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedRealWorldValueMappingInstanceSequence"}, - 0x00081150 : { vr : "UI", vm : C.VM_SINGLE, keyword : "ReferencedSOPClassUID"}, - 0x00081155 : { vr : "UI", vm : C.VM_SINGLE, keyword : "ReferencedSOPInstanceUID"}, - 0x0008115A : { vr : "UI", vm : C.VM_1N, keyword : "SOPClassesSupported"}, - 0x00081160 : { vr : "IS", vm : C.VM_1N, keyword : "ReferencedFrameNumber"}, - 0x00081161 : { vr : "UL", vm : C.VM_1N, keyword : "SimpleFrameList"}, - 0x00081162 : { vr : "UL", vm : C.VM_3_3N, keyword : "CalculatedFrameList"}, - 0x00081163 : { vr : "FD", vm : C.VM_TWO, keyword : "TimeRange"}, - 0x00081164 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FrameExtractionSequence"}, - 0x00081167 : { vr : "UI", vm : C.VM_SINGLE, keyword : "MultiFrameSourceSOPInstanceUID"}, - 0x00081195 : { vr : "UI", vm : C.VM_SINGLE, keyword : "TransactionUID"}, - 0x00081197 : { vr : "US", vm : C.VM_SINGLE, keyword : "FailureReason"}, - 0x00081198 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FailedSOPSequence"}, - 0x00081199 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedSOPSequence"}, - 0x00081200 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "StudiesContainingOtherReferencedInstancesSequence"}, - 0x00081250 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RelatedSeriesSequence"}, - 0x00082110 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LossyImageCompressionRetired"}, - 0x00082111 : { vr : "ST", vm : C.VM_SINGLE, keyword : "DerivationDescription"}, - 0x00082112 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SourceImageSequence"}, - 0x00082120 : { vr : "SH", vm : C.VM_SINGLE, keyword : "StageName"}, - 0x00082122 : { vr : "IS", vm : C.VM_SINGLE, keyword : "StageNumber"}, - 0x00082124 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfStages"}, - 0x00082127 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ViewName"}, - 0x00082128 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ViewNumber"}, - 0x00082129 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfEventTimers"}, - 0x0008212A : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfViewsInStage"}, - 0x00082130 : { vr : "DS", vm : C.VM_1N, keyword : "EventElapsedTimes"}, - 0x00082132 : { vr : "LO", vm : C.VM_1N, keyword : "EventTimerNames"}, - 0x00082133 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "EventTimerSequence"}, - 0x00082134 : { vr : "FD", vm : C.VM_SINGLE, keyword : "EventTimeOffset"}, - 0x00082135 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "EventCodeSequence"}, - 0x00082142 : { vr : "IS", vm : C.VM_SINGLE, keyword : "StartTrim"}, - 0x00082143 : { vr : "IS", vm : C.VM_SINGLE, keyword : "StopTrim"}, - 0x00082144 : { vr : "IS", vm : C.VM_SINGLE, keyword : "RecommendedDisplayFrameRate"}, - 0x00082200 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TransducerPosition"}, - 0x00082204 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TransducerOrientation"}, - 0x00082208 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AnatomicStructure"}, - 0x00082218 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnatomicRegionSequence"}, - 0x00082220 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnatomicRegionModifierSequence"}, - 0x00082228 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PrimaryAnatomicStructureSequence"}, - 0x00082229 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnatomicStructureSpaceOrRegionSequence"}, - 0x00082230 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PrimaryAnatomicStructureModifierSequence"}, - 0x00082240 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TransducerPositionSequence"}, - 0x00082242 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TransducerPositionModifierSequence"}, - 0x00082244 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TransducerOrientationSequence"}, - 0x00082246 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TransducerOrientationModifierSequence"}, - 0x00082251 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnatomicStructureSpaceOrRegionCodeSequenceTrial"}, - 0x00082253 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnatomicPortalOfEntranceCodeSequenceTrial"}, - 0x00082255 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnatomicApproachDirectionCodeSequenceTrial"}, - 0x00082256 : { vr : "ST", vm : C.VM_SINGLE, keyword : "AnatomicPerspectiveDescriptionTrial"}, - 0x00082257 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnatomicPerspectiveCodeSequenceTrial"}, - 0x00082258 : { vr : "ST", vm : C.VM_SINGLE, keyword : "AnatomicLocationOfExaminingInstrumentDescriptionTrial"}, - 0x00082259 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnatomicLocationOfExaminingInstrumentCodeSequenceTrial"}, - 0x0008225A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial"}, - 0x0008225C : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OnAxisBackgroundAnatomicStructureCodeSequenceTrial"}, - 0x00083001 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AlternateRepresentationSequence"}, - 0x00083010 : { vr : "UI", vm : C.VM_SINGLE, keyword : "IrradiationEventUID"}, - 0x00084000 : { vr : "LT", vm : C.VM_SINGLE, keyword : "IdentifyingComments"}, - 0x00089007 : { vr : "CS", vm : C.VM_FOUR, keyword : "FrameType"}, - 0x00089092 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedImageEvidenceSequence"}, - 0x00089121 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedRawDataSequence"}, - 0x00089123 : { vr : "UI", vm : C.VM_SINGLE, keyword : "CreatorVersionUID"}, - 0x00089124 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DerivationImageSequence"}, - 0x00089154 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SourceImageEvidenceSequence"}, - 0x00089205 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PixelPresentation"}, - 0x00089206 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VolumetricProperties"}, - 0x00089207 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VolumeBasedCalculationTechnique"}, - 0x00089208 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ComplexImageComponent"}, - 0x00089209 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AcquisitionContrast"}, - 0x00089215 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DerivationCodeSequence"}, - 0x00089237 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedPresentationStateSequence"}, - 0x00089410 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedOtherPlaneSequence"}, - 0x00089458 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FrameDisplaySequence"}, - 0x00089459 : { vr : "FL", vm : C.VM_SINGLE, keyword : "RecommendedDisplayFrameRateInFloat"}, - 0x00089460 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SkipFrameRangeFlag"}, - 0x00100010 : { vr : "PN", vm : C.VM_SINGLE, keyword : "PatientName"}, - 0x00100020 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientID"}, - 0x00100021 : { vr : "LO", vm : C.VM_SINGLE, keyword : "IssuerOfPatientID"}, - 0x00100022 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TypeOfPatientID"}, - 0x00100024 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IssuerOfPatientIDQualifiersSequence"}, - 0x00100030 : { vr : "DA", vm : C.VM_SINGLE, keyword : "PatientBirthDate"}, - 0x00100032 : { vr : "TM", vm : C.VM_SINGLE, keyword : "PatientBirthTime"}, - 0x00100040 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PatientSex"}, - 0x00100050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientInsurancePlanCodeSequence"}, - 0x00100101 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientPrimaryLanguageCodeSequence"}, - 0x00100102 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientPrimaryLanguageModifierCodeSequence"}, - 0x00101000 : { vr : "LO", vm : C.VM_1N, keyword : "OtherPatientIDs"}, - 0x00101001 : { vr : "PN", vm : C.VM_1N, keyword : "OtherPatientNames"}, - 0x00101002 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OtherPatientIDsSequence"}, - 0x00101005 : { vr : "PN", vm : C.VM_SINGLE, keyword : "PatientBirthName"}, - 0x00101010 : { vr : "AS", vm : C.VM_SINGLE, keyword : "PatientAge"}, - 0x00101020 : { vr : "DS", vm : C.VM_SINGLE, keyword : "PatientSize"}, - 0x00101021 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientSizeCodeSequence"}, - 0x00101030 : { vr : "DS", vm : C.VM_SINGLE, keyword : "PatientWeight"}, - 0x00101040 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientAddress"}, - 0x00101050 : { vr : "LO", vm : C.VM_1N, keyword : "InsurancePlanIdentification"}, - 0x00101060 : { vr : "PN", vm : C.VM_SINGLE, keyword : "PatientMotherBirthName"}, - 0x00101080 : { vr : "LO", vm : C.VM_SINGLE, keyword : "MilitaryRank"}, - 0x00101081 : { vr : "LO", vm : C.VM_SINGLE, keyword : "BranchOfService"}, - 0x00101090 : { vr : "LO", vm : C.VM_SINGLE, keyword : "MedicalRecordLocator"}, - 0x00102000 : { vr : "LO", vm : C.VM_1N, keyword : "MedicalAlerts"}, - 0x00102110 : { vr : "LO", vm : C.VM_1N, keyword : "Allergies"}, - 0x00102150 : { vr : "LO", vm : C.VM_SINGLE, keyword : "CountryOfResidence"}, - 0x00102152 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RegionOfResidence"}, - 0x00102154 : { vr : "SH", vm : C.VM_1N, keyword : "PatientTelephoneNumbers"}, - 0x00102160 : { vr : "SH", vm : C.VM_SINGLE, keyword : "EthnicGroup"}, - 0x00102180 : { vr : "SH", vm : C.VM_SINGLE, keyword : "Occupation"}, - 0x001021A0 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SmokingStatus"}, - 0x001021B0 : { vr : "LT", vm : C.VM_SINGLE, keyword : "AdditionalPatientHistory"}, - 0x001021C0 : { vr : "US", vm : C.VM_SINGLE, keyword : "PregnancyStatus"}, - 0x001021D0 : { vr : "DA", vm : C.VM_SINGLE, keyword : "LastMenstrualDate"}, - 0x001021F0 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientReligiousPreference"}, - 0x00102201 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientSpeciesDescription"}, - 0x00102202 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientSpeciesCodeSequence"}, - 0x00102203 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PatientSexNeutered"}, - 0x00102210 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AnatomicalOrientationType"}, - 0x00102292 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientBreedDescription"}, - 0x00102293 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientBreedCodeSequence"}, - 0x00102294 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BreedRegistrationSequence"}, - 0x00102295 : { vr : "LO", vm : C.VM_SINGLE, keyword : "BreedRegistrationNumber"}, - 0x00102296 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BreedRegistryCodeSequence"}, - 0x00102297 : { vr : "PN", vm : C.VM_SINGLE, keyword : "ResponsiblePerson"}, - 0x00102298 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ResponsiblePersonRole"}, - 0x00102299 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ResponsibleOrganization"}, - 0x00104000 : { vr : "LT", vm : C.VM_SINGLE, keyword : "PatientComments"}, - 0x00109431 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ExaminedBodyThickness"}, - 0x00120010 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialSponsorName"}, - 0x00120020 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialProtocolID"}, - 0x00120021 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialProtocolName"}, - 0x00120030 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialSiteID"}, - 0x00120031 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialSiteName"}, - 0x00120040 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialSubjectID"}, - 0x00120042 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialSubjectReadingID"}, - 0x00120050 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialTimePointID"}, - 0x00120051 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ClinicalTrialTimePointDescription"}, - 0x00120060 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialCoordinatingCenterName"}, - 0x00120062 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PatientIdentityRemoved"}, - 0x00120063 : { vr : "LO", vm : C.VM_1N, keyword : "DeidentificationMethod"}, - 0x00120064 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DeidentificationMethodCodeSequence"}, - 0x00120071 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialSeriesID"}, - 0x00120072 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialSeriesDescription"}, - 0x00120081 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialProtocolEthicsCommitteeName"}, - 0x00120082 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ClinicalTrialProtocolEthicsCommitteeApprovalNumber"}, - 0x00120083 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ConsentForClinicalTrialUseSequence"}, - 0x00120084 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DistributionType"}, - 0x00120085 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ConsentForDistributionFlag"}, - 0x00140023 : { vr : "ST", vm : C.VM_1N, keyword : "CADFileFormat"}, - 0x00140024 : { vr : "ST", vm : C.VM_1N, keyword : "ComponentReferenceSystem"}, - 0x00140025 : { vr : "ST", vm : C.VM_1N, keyword : "ComponentManufacturingProcedure"}, - 0x00140028 : { vr : "ST", vm : C.VM_1N, keyword : "ComponentManufacturer"}, - 0x00140030 : { vr : "DS", vm : C.VM_1N, keyword : "MaterialThickness"}, - 0x00140032 : { vr : "DS", vm : C.VM_1N, keyword : "MaterialPipeDiameter"}, - 0x00140034 : { vr : "DS", vm : C.VM_1N, keyword : "MaterialIsolationDiameter"}, - 0x00140042 : { vr : "ST", vm : C.VM_1N, keyword : "MaterialGrade"}, - 0x00140044 : { vr : "ST", vm : C.VM_1N, keyword : "MaterialPropertiesFileID"}, - 0x00140045 : { vr : "ST", vm : C.VM_1N, keyword : "MaterialPropertiesFileFormat"}, - 0x00140046 : { vr : "LT", vm : C.VM_SINGLE, keyword : "MaterialNotes"}, - 0x00140050 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ComponentShape"}, - 0x00140052 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CurvatureType"}, - 0x00140054 : { vr : "DS", vm : C.VM_SINGLE, keyword : "OuterDiameter"}, - 0x00140056 : { vr : "DS", vm : C.VM_SINGLE, keyword : "InnerDiameter"}, - 0x00141010 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ActualEnvironmentalConditions"}, - 0x00141020 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ExpiryDate"}, - 0x00141040 : { vr : "ST", vm : C.VM_SINGLE, keyword : "EnvironmentalConditions"}, - 0x00142002 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "EvaluatorSequence"}, - 0x00142004 : { vr : "IS", vm : C.VM_SINGLE, keyword : "EvaluatorNumber"}, - 0x00142006 : { vr : "PN", vm : C.VM_SINGLE, keyword : "EvaluatorName"}, - 0x00142008 : { vr : "IS", vm : C.VM_SINGLE, keyword : "EvaluationAttempt"}, - 0x00142012 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IndicationSequence"}, - 0x00142014 : { vr : "IS", vm : C.VM_SINGLE, keyword : "IndicationNumber"}, - 0x00142016 : { vr : "SH", vm : C.VM_SINGLE, keyword : "IndicationLabel"}, - 0x00142018 : { vr : "ST", vm : C.VM_SINGLE, keyword : "IndicationDescription"}, - 0x0014201A : { vr : "CS", vm : C.VM_1N, keyword : "IndicationType"}, - 0x0014201C : { vr : "CS", vm : C.VM_SINGLE, keyword : "IndicationDisposition"}, - 0x0014201E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IndicationROISequence"}, - 0x00142030 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IndicationPhysicalPropertySequence"}, - 0x00142032 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PropertyLabel"}, - 0x00142202 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CoordinateSystemNumberOfAxes"}, - 0x00142204 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CoordinateSystemAxesSequence"}, - 0x00142206 : { vr : "ST", vm : C.VM_SINGLE, keyword : "CoordinateSystemAxisDescription"}, - 0x00142208 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CoordinateSystemDataSetMapping"}, - 0x0014220A : { vr : "IS", vm : C.VM_SINGLE, keyword : "CoordinateSystemAxisNumber"}, - 0x0014220C : { vr : "CS", vm : C.VM_SINGLE, keyword : "CoordinateSystemAxisType"}, - 0x0014220E : { vr : "CS", vm : C.VM_SINGLE, keyword : "CoordinateSystemAxisUnits"}, - 0x00142210 : { vr : "OB", vm : C.VM_SINGLE, keyword : "CoordinateSystemAxisValues"}, - 0x00142220 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CoordinateSystemTransformSequence"}, - 0x00142222 : { vr : "ST", vm : C.VM_SINGLE, keyword : "TransformDescription"}, - 0x00142224 : { vr : "IS", vm : C.VM_SINGLE, keyword : "TransformNumberOfAxes"}, - 0x00142226 : { vr : "IS", vm : C.VM_1N, keyword : "TransformOrderOfAxes"}, - 0x00142228 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TransformedAxisUnits"}, - 0x0014222A : { vr : "DS", vm : C.VM_1N, keyword : "CoordinateSystemTransformRotationAndScaleMatrix"}, - 0x0014222C : { vr : "DS", vm : C.VM_1N, keyword : "CoordinateSystemTransformTranslationMatrix"}, - 0x00143011 : { vr : "DS", vm : C.VM_SINGLE, keyword : "InternalDetectorFrameTime"}, - 0x00143012 : { vr : "DS", vm : C.VM_SINGLE, keyword : "NumberOfFramesIntegrated"}, - 0x00143020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DetectorTemperatureSequence"}, - 0x00143022 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SensorName"}, - 0x00143024 : { vr : "DS", vm : C.VM_SINGLE, keyword : "HorizontalOffsetOfSensor"}, - 0x00143026 : { vr : "DS", vm : C.VM_SINGLE, keyword : "VerticalOffsetOfSensor"}, - 0x00143028 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SensorTemperature"}, - 0x00143040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DarkCurrentSequence"}, - 0x00143050 : { vr : "OB", vm : C.VM_SINGLE, keyword : "DarkCurrentCounts"}, - 0x00143060 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GainCorrectionReferenceSequence"}, - 0x00143070 : { vr : "OB", vm : C.VM_SINGLE, keyword : "AirCounts"}, - 0x00143071 : { vr : "DS", vm : C.VM_SINGLE, keyword : "KVUsedInGainCalibration"}, - 0x00143072 : { vr : "DS", vm : C.VM_SINGLE, keyword : "MAUsedInGainCalibration"}, - 0x00143073 : { vr : "DS", vm : C.VM_SINGLE, keyword : "NumberOfFramesUsedForIntegration"}, - 0x00143074 : { vr : "LO", vm : C.VM_SINGLE, keyword : "FilterMaterialUsedInGainCalibration"}, - 0x00143075 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FilterThicknessUsedInGainCalibration"}, - 0x00143076 : { vr : "DA", vm : C.VM_SINGLE, keyword : "DateOfGainCalibration"}, - 0x00143077 : { vr : "TM", vm : C.VM_SINGLE, keyword : "TimeOfGainCalibration"}, - 0x00143080 : { vr : "OB", vm : C.VM_SINGLE, keyword : "BadPixelImage"}, - 0x00143099 : { vr : "LT", vm : C.VM_SINGLE, keyword : "CalibrationNotes"}, - 0x00144002 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PulserEquipmentSequence"}, - 0x00144004 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PulserType"}, - 0x00144006 : { vr : "LT", vm : C.VM_SINGLE, keyword : "PulserNotes"}, - 0x00144008 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReceiverEquipmentSequence"}, - 0x0014400A : { vr : "CS", vm : C.VM_SINGLE, keyword : "AmplifierType"}, - 0x0014400C : { vr : "LT", vm : C.VM_SINGLE, keyword : "ReceiverNotes"}, - 0x0014400E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PreAmplifierEquipmentSequence"}, - 0x0014400F : { vr : "LT", vm : C.VM_SINGLE, keyword : "PreAmplifierNotes"}, - 0x00144010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TransmitTransducerSequence"}, - 0x00144011 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReceiveTransducerSequence"}, - 0x00144012 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfElements"}, - 0x00144013 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ElementShape"}, - 0x00144014 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ElementDimensionA"}, - 0x00144015 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ElementDimensionB"}, - 0x00144016 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ElementPitch"}, - 0x00144017 : { vr : "DS", vm : C.VM_SINGLE, keyword : "MeasuredBeamDimensionA"}, - 0x00144018 : { vr : "DS", vm : C.VM_SINGLE, keyword : "MeasuredBeamDimensionB"}, - 0x00144019 : { vr : "DS", vm : C.VM_SINGLE, keyword : "LocationOfMeasuredBeamDiameter"}, - 0x0014401A : { vr : "DS", vm : C.VM_SINGLE, keyword : "NominalFrequency"}, - 0x0014401B : { vr : "DS", vm : C.VM_SINGLE, keyword : "MeasuredCenterFrequency"}, - 0x0014401C : { vr : "DS", vm : C.VM_SINGLE, keyword : "MeasuredBandwidth"}, - 0x00144020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PulserSettingsSequence"}, - 0x00144022 : { vr : "DS", vm : C.VM_SINGLE, keyword : "PulseWidth"}, - 0x00144024 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ExcitationFrequency"}, - 0x00144026 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ModulationType"}, - 0x00144028 : { vr : "DS", vm : C.VM_SINGLE, keyword : "Damping"}, - 0x00144030 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReceiverSettingsSequence"}, - 0x00144031 : { vr : "DS", vm : C.VM_SINGLE, keyword : "AcquiredSoundpathLength"}, - 0x00144032 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AcquisitionCompressionType"}, - 0x00144033 : { vr : "IS", vm : C.VM_SINGLE, keyword : "AcquisitionSampleSize"}, - 0x00144034 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RectifierSmoothing"}, - 0x00144035 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DACSequence"}, - 0x00144036 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DACType"}, - 0x00144038 : { vr : "DS", vm : C.VM_1N, keyword : "DACGainPoints"}, - 0x0014403A : { vr : "DS", vm : C.VM_1N, keyword : "DACTimePoints"}, - 0x0014403C : { vr : "DS", vm : C.VM_1N, keyword : "DACAmplitude"}, - 0x00144040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PreAmplifierSettingsSequence"}, - 0x00144050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TransmitTransducerSettingsSequence"}, - 0x00144051 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReceiveTransducerSettingsSequence"}, - 0x00144052 : { vr : "DS", vm : C.VM_SINGLE, keyword : "IncidentAngle"}, - 0x00144054 : { vr : "ST", vm : C.VM_SINGLE, keyword : "CouplingTechnique"}, - 0x00144056 : { vr : "ST", vm : C.VM_SINGLE, keyword : "CouplingMedium"}, - 0x00144057 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CouplingVelocity"}, - 0x00144058 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CrystalCenterLocationX"}, - 0x00144059 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CrystalCenterLocationZ"}, - 0x0014405A : { vr : "DS", vm : C.VM_SINGLE, keyword : "SoundPathLength"}, - 0x0014405C : { vr : "ST", vm : C.VM_SINGLE, keyword : "DelayLawIdentifier"}, - 0x00144060 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GateSettingsSequence"}, - 0x00144062 : { vr : "DS", vm : C.VM_SINGLE, keyword : "GateThreshold"}, - 0x00144064 : { vr : "DS", vm : C.VM_SINGLE, keyword : "VelocityOfSound"}, - 0x00144070 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CalibrationSettingsSequence"}, - 0x00144072 : { vr : "ST", vm : C.VM_SINGLE, keyword : "CalibrationProcedure"}, - 0x00144074 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ProcedureVersion"}, - 0x00144076 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ProcedureCreationDate"}, - 0x00144078 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ProcedureExpirationDate"}, - 0x0014407A : { vr : "DA", vm : C.VM_SINGLE, keyword : "ProcedureLastModifiedDate"}, - 0x0014407C : { vr : "TM", vm : C.VM_1N, keyword : "CalibrationTime"}, - 0x0014407E : { vr : "DA", vm : C.VM_1N, keyword : "CalibrationDate"}, - 0x00145002 : { vr : "IS", vm : C.VM_SINGLE, keyword : "LINACEnergy"}, - 0x00145004 : { vr : "IS", vm : C.VM_SINGLE, keyword : "LINACOutput"}, - 0x00180010 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ContrastBolusAgent"}, - 0x00180012 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContrastBolusAgentSequence"}, - 0x00180014 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContrastBolusAdministrationRouteSequence"}, - 0x00180015 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BodyPartExamined"}, - 0x00180020 : { vr : "CS", vm : C.VM_1N, keyword : "ScanningSequence"}, - 0x00180021 : { vr : "CS", vm : C.VM_1N, keyword : "SequenceVariant"}, - 0x00180022 : { vr : "CS", vm : C.VM_1N, keyword : "ScanOptions"}, - 0x00180023 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MRAcquisitionType"}, - 0x00180024 : { vr : "SH", vm : C.VM_SINGLE, keyword : "SequenceName"}, - 0x00180025 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AngioFlag"}, - 0x00180026 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "InterventionDrugInformationSequence"}, - 0x00180027 : { vr : "TM", vm : C.VM_SINGLE, keyword : "InterventionDrugStopTime"}, - 0x00180028 : { vr : "DS", vm : C.VM_SINGLE, keyword : "InterventionDrugDose"}, - 0x00180029 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "InterventionDrugCodeSequence"}, - 0x0018002A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AdditionalDrugSequence"}, - 0x00180030 : { vr : "LO", vm : C.VM_1N, keyword : "Radionuclide"}, - 0x00180031 : { vr : "LO", vm : C.VM_SINGLE, keyword : "Radiopharmaceutical"}, - 0x00180032 : { vr : "DS", vm : C.VM_SINGLE, keyword : "EnergyWindowCenterline"}, - 0x00180033 : { vr : "DS", vm : C.VM_1N, keyword : "EnergyWindowTotalWidth"}, - 0x00180034 : { vr : "LO", vm : C.VM_SINGLE, keyword : "InterventionDrugName"}, - 0x00180035 : { vr : "TM", vm : C.VM_SINGLE, keyword : "InterventionDrugStartTime"}, - 0x00180036 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "InterventionSequence"}, - 0x00180037 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TherapyType"}, - 0x00180038 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InterventionStatus"}, - 0x00180039 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TherapyDescription"}, - 0x0018003A : { vr : "ST", vm : C.VM_SINGLE, keyword : "InterventionDescription"}, - 0x00180040 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CineRate"}, - 0x00180042 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InitialCineRunState"}, - 0x00180050 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SliceThickness"}, - 0x00180060 : { vr : "DS", vm : C.VM_SINGLE, keyword : "KVP"}, - 0x00180070 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CountsAccumulated"}, - 0x00180071 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AcquisitionTerminationCondition"}, - 0x00180072 : { vr : "DS", vm : C.VM_SINGLE, keyword : "EffectiveDuration"}, - 0x00180073 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AcquisitionStartCondition"}, - 0x00180074 : { vr : "IS", vm : C.VM_SINGLE, keyword : "AcquisitionStartConditionData"}, - 0x00180075 : { vr : "IS", vm : C.VM_SINGLE, keyword : "AcquisitionTerminationConditionData"}, - 0x00180080 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RepetitionTime"}, - 0x00180081 : { vr : "DS", vm : C.VM_SINGLE, keyword : "EchoTime"}, - 0x00180082 : { vr : "DS", vm : C.VM_SINGLE, keyword : "InversionTime"}, - 0x00180083 : { vr : "DS", vm : C.VM_SINGLE, keyword : "NumberOfAverages"}, - 0x00180084 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ImagingFrequency"}, - 0x00180085 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ImagedNucleus"}, - 0x00180086 : { vr : "IS", vm : C.VM_1N, keyword : "EchoNumbers"}, - 0x00180087 : { vr : "DS", vm : C.VM_SINGLE, keyword : "MagneticFieldStrength"}, - 0x00180088 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SpacingBetweenSlices"}, - 0x00180089 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfPhaseEncodingSteps"}, - 0x00180090 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DataCollectionDiameter"}, - 0x00180091 : { vr : "IS", vm : C.VM_SINGLE, keyword : "EchoTrainLength"}, - 0x00180093 : { vr : "DS", vm : C.VM_SINGLE, keyword : "PercentSampling"}, - 0x00180094 : { vr : "DS", vm : C.VM_SINGLE, keyword : "PercentPhaseFieldOfView"}, - 0x00180095 : { vr : "DS", vm : C.VM_SINGLE, keyword : "PixelBandwidth"}, - 0x00181000 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DeviceSerialNumber"}, - 0x00181002 : { vr : "UI", vm : C.VM_SINGLE, keyword : "DeviceUID"}, - 0x00181003 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DeviceID"}, - 0x00181004 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PlateID"}, - 0x00181005 : { vr : "LO", vm : C.VM_SINGLE, keyword : "GeneratorID"}, - 0x00181006 : { vr : "LO", vm : C.VM_SINGLE, keyword : "GridID"}, - 0x00181007 : { vr : "LO", vm : C.VM_SINGLE, keyword : "CassetteID"}, - 0x00181008 : { vr : "LO", vm : C.VM_SINGLE, keyword : "GantryID"}, - 0x00181010 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SecondaryCaptureDeviceID"}, - 0x00181011 : { vr : "LO", vm : C.VM_SINGLE, keyword : "HardcopyCreationDeviceID"}, - 0x00181012 : { vr : "DA", vm : C.VM_SINGLE, keyword : "DateOfSecondaryCapture"}, - 0x00181014 : { vr : "TM", vm : C.VM_SINGLE, keyword : "TimeOfSecondaryCapture"}, - 0x00181016 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SecondaryCaptureDeviceManufacturer"}, - 0x00181017 : { vr : "LO", vm : C.VM_SINGLE, keyword : "HardcopyDeviceManufacturer"}, - 0x00181018 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SecondaryCaptureDeviceManufacturerModelName"}, - 0x00181019 : { vr : "LO", vm : C.VM_1N, keyword : "SecondaryCaptureDeviceSoftwareVersions"}, - 0x0018101A : { vr : "LO", vm : C.VM_1N, keyword : "HardcopyDeviceSoftwareVersion"}, - 0x0018101B : { vr : "LO", vm : C.VM_SINGLE, keyword : "HardcopyDeviceManufacturerModelName"}, - 0x00181020 : { vr : "LO", vm : C.VM_1N, keyword : "SoftwareVersions"}, - 0x00181022 : { vr : "SH", vm : C.VM_SINGLE, keyword : "VideoImageFormatAcquired"}, - 0x00181023 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DigitalImageFormatAcquired"}, - 0x00181030 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ProtocolName"}, - 0x00181040 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ContrastBolusRoute"}, - 0x00181041 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ContrastBolusVolume"}, - 0x00181042 : { vr : "TM", vm : C.VM_SINGLE, keyword : "ContrastBolusStartTime"}, - 0x00181043 : { vr : "TM", vm : C.VM_SINGLE, keyword : "ContrastBolusStopTime"}, - 0x00181044 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ContrastBolusTotalDose"}, - 0x00181045 : { vr : "IS", vm : C.VM_SINGLE, keyword : "SyringeCounts"}, - 0x00181046 : { vr : "DS", vm : C.VM_1N, keyword : "ContrastFlowRate"}, - 0x00181047 : { vr : "DS", vm : C.VM_1N, keyword : "ContrastFlowDuration"}, - 0x00181048 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContrastBolusIngredient"}, - 0x00181049 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ContrastBolusIngredientConcentration"}, - 0x00181050 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SpatialResolution"}, - 0x00181060 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TriggerTime"}, - 0x00181061 : { vr : "LO", vm : C.VM_SINGLE, keyword : "TriggerSourceOrType"}, - 0x00181062 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NominalInterval"}, - 0x00181063 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FrameTime"}, - 0x00181064 : { vr : "LO", vm : C.VM_SINGLE, keyword : "CardiacFramingType"}, - 0x00181065 : { vr : "DS", vm : C.VM_1N, keyword : "FrameTimeVector"}, - 0x00181066 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FrameDelay"}, - 0x00181067 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ImageTriggerDelay"}, - 0x00181068 : { vr : "DS", vm : C.VM_SINGLE, keyword : "MultiplexGroupTimeOffset"}, - 0x00181069 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TriggerTimeOffset"}, - 0x0018106A : { vr : "CS", vm : C.VM_SINGLE, keyword : "SynchronizationTrigger"}, - 0x0018106C : { vr : "US", vm : C.VM_TWO, keyword : "SynchronizationChannel"}, - 0x0018106E : { vr : "UL", vm : C.VM_SINGLE, keyword : "TriggerSamplePosition"}, - 0x00181070 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalRoute"}, - 0x00181071 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalVolume"}, - 0x00181072 : { vr : "TM", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalStartTime"}, - 0x00181073 : { vr : "TM", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalStopTime"}, - 0x00181074 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RadionuclideTotalDose"}, - 0x00181075 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RadionuclideHalfLife"}, - 0x00181076 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RadionuclidePositronFraction"}, - 0x00181077 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalSpecificActivity"}, - 0x00181078 : { vr : "DT", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalStartDateTime"}, - 0x00181079 : { vr : "DT", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalStopDateTime"}, - 0x00181080 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BeatRejectionFlag"}, - 0x00181081 : { vr : "IS", vm : C.VM_SINGLE, keyword : "LowRRValue"}, - 0x00181082 : { vr : "IS", vm : C.VM_SINGLE, keyword : "HighRRValue"}, - 0x00181083 : { vr : "IS", vm : C.VM_SINGLE, keyword : "IntervalsAcquired"}, - 0x00181084 : { vr : "IS", vm : C.VM_SINGLE, keyword : "IntervalsRejected"}, - 0x00181085 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PVCRejection"}, - 0x00181086 : { vr : "IS", vm : C.VM_SINGLE, keyword : "SkipBeats"}, - 0x00181088 : { vr : "IS", vm : C.VM_SINGLE, keyword : "HeartRate"}, - 0x00181090 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CardiacNumberOfImages"}, - 0x00181094 : { vr : "IS", vm : C.VM_SINGLE, keyword : "TriggerWindow"}, - 0x00181100 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ReconstructionDiameter"}, - 0x00181110 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DistanceSourceToDetector"}, - 0x00181111 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DistanceSourceToPatient"}, - 0x00181114 : { vr : "DS", vm : C.VM_SINGLE, keyword : "EstimatedRadiographicMagnificationFactor"}, - 0x00181120 : { vr : "DS", vm : C.VM_SINGLE, keyword : "GantryDetectorTilt"}, - 0x00181121 : { vr : "DS", vm : C.VM_SINGLE, keyword : "GantryDetectorSlew"}, - 0x00181130 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableHeight"}, - 0x00181131 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTraverse"}, - 0x00181134 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TableMotion"}, - 0x00181135 : { vr : "DS", vm : C.VM_1N, keyword : "TableVerticalIncrement"}, - 0x00181136 : { vr : "DS", vm : C.VM_1N, keyword : "TableLateralIncrement"}, - 0x00181137 : { vr : "DS", vm : C.VM_1N, keyword : "TableLongitudinalIncrement"}, - 0x00181138 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableAngle"}, - 0x0018113A : { vr : "CS", vm : C.VM_SINGLE, keyword : "TableType"}, - 0x00181140 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RotationDirection"}, - 0x00181141 : { vr : "DS", vm : C.VM_SINGLE, keyword : "AngularPosition"}, - 0x00181142 : { vr : "DS", vm : C.VM_1N, keyword : "RadialPosition"}, - 0x00181143 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ScanArc"}, - 0x00181144 : { vr : "DS", vm : C.VM_SINGLE, keyword : "AngularStep"}, - 0x00181145 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CenterOfRotationOffset"}, - 0x00181146 : { vr : "DS", vm : C.VM_1N, keyword : "RotationOffset"}, - 0x00181147 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FieldOfViewShape"}, - 0x00181149 : { vr : "IS", vm : C.VM_1_2, keyword : "FieldOfViewDimensions"}, - 0x00181150 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ExposureTime"}, - 0x00181151 : { vr : "IS", vm : C.VM_SINGLE, keyword : "XRayTubeCurrent"}, - 0x00181152 : { vr : "IS", vm : C.VM_SINGLE, keyword : "Exposure"}, - 0x00181153 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ExposureInuAs"}, - 0x00181154 : { vr : "DS", vm : C.VM_SINGLE, keyword : "AveragePulseWidth"}, - 0x00181155 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RadiationSetting"}, - 0x00181156 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RectificationType"}, - 0x0018115A : { vr : "CS", vm : C.VM_SINGLE, keyword : "RadiationMode"}, - 0x0018115E : { vr : "DS", vm : C.VM_SINGLE, keyword : "ImageAndFluoroscopyAreaDoseProduct"}, - 0x00181160 : { vr : "SH", vm : C.VM_SINGLE, keyword : "FilterType"}, - 0x00181161 : { vr : "LO", vm : C.VM_1N, keyword : "TypeOfFilters"}, - 0x00181162 : { vr : "DS", vm : C.VM_SINGLE, keyword : "IntensifierSize"}, - 0x00181164 : { vr : "DS", vm : C.VM_TWO, keyword : "ImagerPixelSpacing"}, - 0x00181166 : { vr : "CS", vm : C.VM_1N, keyword : "Grid"}, - 0x00181170 : { vr : "IS", vm : C.VM_SINGLE, keyword : "GeneratorPower"}, - 0x00181180 : { vr : "SH", vm : C.VM_SINGLE, keyword : "CollimatorGridName"}, - 0x00181181 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CollimatorType"}, - 0x00181182 : { vr : "IS", vm : C.VM_1_2, keyword : "FocalDistance"}, - 0x00181183 : { vr : "DS", vm : C.VM_1_2, keyword : "XFocusCenter"}, - 0x00181184 : { vr : "DS", vm : C.VM_1_2, keyword : "YFocusCenter"}, - 0x00181190 : { vr : "DS", vm : C.VM_1N, keyword : "FocalSpots"}, - 0x00181191 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AnodeTargetMaterial"}, - 0x001811A0 : { vr : "DS", vm : C.VM_SINGLE, keyword : "BodyPartThickness"}, - 0x001811A2 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CompressionForce"}, - 0x00181200 : { vr : "DA", vm : C.VM_1N, keyword : "DateOfLastCalibration"}, - 0x00181201 : { vr : "TM", vm : C.VM_1N, keyword : "TimeOfLastCalibration"}, - 0x00181210 : { vr : "SH", vm : C.VM_1N, keyword : "ConvolutionKernel"}, - 0x00181240 : { vr : "IS", vm : C.VM_1N, keyword : "UpperLowerPixelValues"}, - 0x00181242 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ActualFrameDuration"}, - 0x00181243 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CountRate"}, - 0x00181244 : { vr : "US", vm : C.VM_SINGLE, keyword : "PreferredPlaybackSequencing"}, - 0x00181250 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ReceiveCoilName"}, - 0x00181251 : { vr : "SH", vm : C.VM_SINGLE, keyword : "TransmitCoilName"}, - 0x00181260 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PlateType"}, - 0x00181261 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PhosphorType"}, - 0x00181300 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ScanVelocity"}, - 0x00181301 : { vr : "CS", vm : C.VM_1N, keyword : "WholeBodyTechnique"}, - 0x00181302 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ScanLength"}, - 0x00181310 : { vr : "US", vm : C.VM_FOUR, keyword : "AcquisitionMatrix"}, - 0x00181312 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InPlanePhaseEncodingDirection"}, - 0x00181314 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FlipAngle"}, - 0x00181315 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VariableFlipAngleFlag"}, - 0x00181316 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SAR"}, - 0x00181318 : { vr : "DS", vm : C.VM_SINGLE, keyword : "dBdt"}, - 0x00181400 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AcquisitionDeviceProcessingDescription"}, - 0x00181401 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AcquisitionDeviceProcessingCode"}, - 0x00181402 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CassetteOrientation"}, - 0x00181403 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CassetteSize"}, - 0x00181404 : { vr : "US", vm : C.VM_SINGLE, keyword : "ExposuresOnPlate"}, - 0x00181405 : { vr : "IS", vm : C.VM_SINGLE, keyword : "RelativeXRayExposure"}, - 0x00181411 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ExposureIndex"}, - 0x00181412 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TargetExposureIndex"}, - 0x00181413 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeviationIndex"}, - 0x00181450 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ColumnAngulation"}, - 0x00181460 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TomoLayerHeight"}, - 0x00181470 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TomoAngle"}, - 0x00181480 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TomoTime"}, - 0x00181490 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TomoType"}, - 0x00181491 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TomoClass"}, - 0x00181495 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfTomosynthesisSourceImages"}, - 0x00181500 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PositionerMotion"}, - 0x00181508 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PositionerType"}, - 0x00181510 : { vr : "DS", vm : C.VM_SINGLE, keyword : "PositionerPrimaryAngle"}, - 0x00181511 : { vr : "DS", vm : C.VM_SINGLE, keyword : "PositionerSecondaryAngle"}, - 0x00181520 : { vr : "DS", vm : C.VM_1N, keyword : "PositionerPrimaryAngleIncrement"}, - 0x00181521 : { vr : "DS", vm : C.VM_1N, keyword : "PositionerSecondaryAngleIncrement"}, - 0x00181530 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DetectorPrimaryAngle"}, - 0x00181531 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DetectorSecondaryAngle"}, - 0x00181600 : { vr : "CS", vm : C.VM_1_3, keyword : "ShutterShape"}, - 0x00181602 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ShutterLeftVerticalEdge"}, - 0x00181604 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ShutterRightVerticalEdge"}, - 0x00181606 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ShutterUpperHorizontalEdge"}, - 0x00181608 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ShutterLowerHorizontalEdge"}, - 0x00181610 : { vr : "IS", vm : C.VM_TWO, keyword : "CenterOfCircularShutter"}, - 0x00181612 : { vr : "IS", vm : C.VM_SINGLE, keyword : "RadiusOfCircularShutter"}, - 0x00181620 : { vr : "IS", vm : C.VM_2_2N, keyword : "VerticesOfThePolygonalShutter"}, - 0x00181622 : { vr : "US", vm : C.VM_SINGLE, keyword : "ShutterPresentationValue"}, - 0x00181623 : { vr : "US", vm : C.VM_SINGLE, keyword : "ShutterOverlayGroup"}, - 0x00181624 : { vr : "US", vm : C.VM_THREE, keyword : "ShutterPresentationColorCIELabValue"}, - 0x00181700 : { vr : "CS", vm : C.VM_1_3, keyword : "CollimatorShape"}, - 0x00181702 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CollimatorLeftVerticalEdge"}, - 0x00181704 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CollimatorRightVerticalEdge"}, - 0x00181706 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CollimatorUpperHorizontalEdge"}, - 0x00181708 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CollimatorLowerHorizontalEdge"}, - 0x00181710 : { vr : "IS", vm : C.VM_TWO, keyword : "CenterOfCircularCollimator"}, - 0x00181712 : { vr : "IS", vm : C.VM_SINGLE, keyword : "RadiusOfCircularCollimator"}, - 0x00181720 : { vr : "IS", vm : C.VM_2_2N, keyword : "VerticesOfThePolygonalCollimator"}, - 0x00181800 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AcquisitionTimeSynchronized"}, - 0x00181801 : { vr : "SH", vm : C.VM_SINGLE, keyword : "TimeSource"}, - 0x00181802 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TimeDistributionProtocol"}, - 0x00181803 : { vr : "LO", vm : C.VM_SINGLE, keyword : "NTPSourceAddress"}, - 0x00182001 : { vr : "IS", vm : C.VM_1N, keyword : "PageNumberVector"}, - 0x00182002 : { vr : "SH", vm : C.VM_1N, keyword : "FrameLabelVector"}, - 0x00182003 : { vr : "DS", vm : C.VM_1N, keyword : "FramePrimaryAngleVector"}, - 0x00182004 : { vr : "DS", vm : C.VM_1N, keyword : "FrameSecondaryAngleVector"}, - 0x00182005 : { vr : "DS", vm : C.VM_1N, keyword : "SliceLocationVector"}, - 0x00182006 : { vr : "SH", vm : C.VM_1N, keyword : "DisplayWindowLabelVector"}, - 0x00182010 : { vr : "DS", vm : C.VM_TWO, keyword : "NominalScannedPixelSpacing"}, - 0x00182020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DigitizingDeviceTransportDirection"}, - 0x00182030 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RotationOfScannedFilm"}, - 0x00183100 : { vr : "CS", vm : C.VM_SINGLE, keyword : "IVUSAcquisition"}, - 0x00183101 : { vr : "DS", vm : C.VM_SINGLE, keyword : "IVUSPullbackRate"}, - 0x00183102 : { vr : "DS", vm : C.VM_SINGLE, keyword : "IVUSGatedRate"}, - 0x00183103 : { vr : "IS", vm : C.VM_SINGLE, keyword : "IVUSPullbackStartFrameNumber"}, - 0x00183104 : { vr : "IS", vm : C.VM_SINGLE, keyword : "IVUSPullbackStopFrameNumber"}, - 0x00183105 : { vr : "IS", vm : C.VM_1N, keyword : "LesionNumber"}, - 0x00184000 : { vr : "LT", vm : C.VM_SINGLE, keyword : "AcquisitionComments"}, - 0x00185000 : { vr : "SH", vm : C.VM_1N, keyword : "OutputPower"}, - 0x00185010 : { vr : "LO", vm : C.VM_1N, keyword : "TransducerData"}, - 0x00185012 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FocusDepth"}, - 0x00185020 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ProcessingFunction"}, - 0x00185021 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PostprocessingFunction"}, - 0x00185022 : { vr : "DS", vm : C.VM_SINGLE, keyword : "MechanicalIndex"}, - 0x00185024 : { vr : "DS", vm : C.VM_SINGLE, keyword : "BoneThermalIndex"}, - 0x00185026 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CranialThermalIndex"}, - 0x00185027 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SoftTissueThermalIndex"}, - 0x00185028 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SoftTissueFocusThermalIndex"}, - 0x00185029 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SoftTissueSurfaceThermalIndex"}, - 0x00185030 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DynamicRange"}, - 0x00185040 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TotalGain"}, - 0x00185050 : { vr : "IS", vm : C.VM_SINGLE, keyword : "DepthOfScanField"}, - 0x00185100 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PatientPosition"}, - 0x00185101 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ViewPosition"}, - 0x00185104 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProjectionEponymousNameCodeSequence"}, - 0x00185210 : { vr : "DS", vm : C.VM_SIX, keyword : "ImageTransformationMatrix"}, - 0x00185212 : { vr : "DS", vm : C.VM_THREE, keyword : "ImageTranslationVector"}, - 0x00186000 : { vr : "DS", vm : C.VM_SINGLE, keyword : "Sensitivity"}, - 0x00186011 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SequenceOfUltrasoundRegions"}, - 0x00186012 : { vr : "US", vm : C.VM_SINGLE, keyword : "RegionSpatialFormat"}, - 0x00186014 : { vr : "US", vm : C.VM_SINGLE, keyword : "RegionDataType"}, - 0x00186016 : { vr : "UL", vm : C.VM_SINGLE, keyword : "RegionFlags"}, - 0x00186018 : { vr : "UL", vm : C.VM_SINGLE, keyword : "RegionLocationMinX0"}, - 0x0018601A : { vr : "UL", vm : C.VM_SINGLE, keyword : "RegionLocationMinY0"}, - 0x0018601C : { vr : "UL", vm : C.VM_SINGLE, keyword : "RegionLocationMaxX1"}, - 0x0018601E : { vr : "UL", vm : C.VM_SINGLE, keyword : "RegionLocationMaxY1"}, - 0x00186020 : { vr : "SL", vm : C.VM_SINGLE, keyword : "ReferencePixelX0"}, - 0x00186022 : { vr : "SL", vm : C.VM_SINGLE, keyword : "ReferencePixelY0"}, - 0x00186024 : { vr : "US", vm : C.VM_SINGLE, keyword : "PhysicalUnitsXDirection"}, - 0x00186026 : { vr : "US", vm : C.VM_SINGLE, keyword : "PhysicalUnitsYDirection"}, - 0x00186028 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ReferencePixelPhysicalValueX"}, - 0x0018602A : { vr : "FD", vm : C.VM_SINGLE, keyword : "ReferencePixelPhysicalValueY"}, - 0x0018602C : { vr : "FD", vm : C.VM_SINGLE, keyword : "PhysicalDeltaX"}, - 0x0018602E : { vr : "FD", vm : C.VM_SINGLE, keyword : "PhysicalDeltaY"}, - 0x00186030 : { vr : "UL", vm : C.VM_SINGLE, keyword : "TransducerFrequency"}, - 0x00186031 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TransducerType"}, - 0x00186032 : { vr : "UL", vm : C.VM_SINGLE, keyword : "PulseRepetitionFrequency"}, - 0x00186034 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DopplerCorrectionAngle"}, - 0x00186036 : { vr : "FD", vm : C.VM_SINGLE, keyword : "SteeringAngle"}, - 0x00186038 : { vr : "UL", vm : C.VM_SINGLE, keyword : "DopplerSampleVolumeXPositionRetired"}, - 0x00186039 : { vr : "SL", vm : C.VM_SINGLE, keyword : "DopplerSampleVolumeXPosition"}, - 0x0018603A : { vr : "UL", vm : C.VM_SINGLE, keyword : "DopplerSampleVolumeYPositionRetired"}, - 0x0018603B : { vr : "SL", vm : C.VM_SINGLE, keyword : "DopplerSampleVolumeYPosition"}, - 0x0018603C : { vr : "UL", vm : C.VM_SINGLE, keyword : "TMLinePositionX0Retired"}, - 0x0018603D : { vr : "SL", vm : C.VM_SINGLE, keyword : "TMLinePositionX0"}, - 0x0018603E : { vr : "UL", vm : C.VM_SINGLE, keyword : "TMLinePositionY0Retired"}, - 0x0018603F : { vr : "SL", vm : C.VM_SINGLE, keyword : "TMLinePositionY0"}, - 0x00186040 : { vr : "UL", vm : C.VM_SINGLE, keyword : "TMLinePositionX1Retired"}, - 0x00186041 : { vr : "SL", vm : C.VM_SINGLE, keyword : "TMLinePositionX1"}, - 0x00186042 : { vr : "UL", vm : C.VM_SINGLE, keyword : "TMLinePositionY1Retired"}, - 0x00186043 : { vr : "SL", vm : C.VM_SINGLE, keyword : "TMLinePositionY1"}, - 0x00186044 : { vr : "US", vm : C.VM_SINGLE, keyword : "PixelComponentOrganization"}, - 0x00186046 : { vr : "UL", vm : C.VM_SINGLE, keyword : "PixelComponentMask"}, - 0x00186048 : { vr : "UL", vm : C.VM_SINGLE, keyword : "PixelComponentRangeStart"}, - 0x0018604A : { vr : "UL", vm : C.VM_SINGLE, keyword : "PixelComponentRangeStop"}, - 0x0018604C : { vr : "US", vm : C.VM_SINGLE, keyword : "PixelComponentPhysicalUnits"}, - 0x0018604E : { vr : "US", vm : C.VM_SINGLE, keyword : "PixelComponentDataType"}, - 0x00186050 : { vr : "UL", vm : C.VM_SINGLE, keyword : "NumberOfTableBreakPoints"}, - 0x00186052 : { vr : "UL", vm : C.VM_1N, keyword : "TableOfXBreakPoints"}, - 0x00186054 : { vr : "FD", vm : C.VM_1N, keyword : "TableOfYBreakPoints"}, - 0x00186056 : { vr : "UL", vm : C.VM_SINGLE, keyword : "NumberOfTableEntries"}, - 0x00186058 : { vr : "UL", vm : C.VM_1N, keyword : "TableOfPixelValues"}, - 0x0018605A : { vr : "FL", vm : C.VM_1N, keyword : "TableOfParameterValues"}, - 0x00186060 : { vr : "FL", vm : C.VM_1N, keyword : "RWaveTimeVector"}, - 0x00187000 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DetectorConditionsNominalFlag"}, - 0x00187001 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DetectorTemperature"}, - 0x00187004 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DetectorType"}, - 0x00187005 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DetectorConfiguration"}, - 0x00187006 : { vr : "LT", vm : C.VM_SINGLE, keyword : "DetectorDescription"}, - 0x00187008 : { vr : "LT", vm : C.VM_SINGLE, keyword : "DetectorMode"}, - 0x0018700A : { vr : "SH", vm : C.VM_SINGLE, keyword : "DetectorID"}, - 0x0018700C : { vr : "DA", vm : C.VM_SINGLE, keyword : "DateOfLastDetectorCalibration"}, - 0x0018700E : { vr : "TM", vm : C.VM_SINGLE, keyword : "TimeOfLastDetectorCalibration"}, - 0x00187010 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ExposuresOnDetectorSinceLastCalibration"}, - 0x00187011 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ExposuresOnDetectorSinceManufactured"}, - 0x00187012 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DetectorTimeSinceLastExposure"}, - 0x00187014 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DetectorActiveTime"}, - 0x00187016 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DetectorActivationOffsetFromExposure"}, - 0x0018701A : { vr : "DS", vm : C.VM_TWO, keyword : "DetectorBinning"}, - 0x00187020 : { vr : "DS", vm : C.VM_TWO, keyword : "DetectorElementPhysicalSize"}, - 0x00187022 : { vr : "DS", vm : C.VM_TWO, keyword : "DetectorElementSpacing"}, - 0x00187024 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DetectorActiveShape"}, - 0x00187026 : { vr : "DS", vm : C.VM_1_2, keyword : "DetectorActiveDimensions"}, - 0x00187028 : { vr : "DS", vm : C.VM_TWO, keyword : "DetectorActiveOrigin"}, - 0x0018702A : { vr : "LO", vm : C.VM_SINGLE, keyword : "DetectorManufacturerName"}, - 0x0018702B : { vr : "LO", vm : C.VM_SINGLE, keyword : "DetectorManufacturerModelName"}, - 0x00187030 : { vr : "DS", vm : C.VM_TWO, keyword : "FieldOfViewOrigin"}, - 0x00187032 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FieldOfViewRotation"}, - 0x00187034 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FieldOfViewHorizontalFlip"}, - 0x00187036 : { vr : "FL", vm : C.VM_TWO, keyword : "PixelDataAreaOriginRelativeToFOV"}, - 0x00187038 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PixelDataAreaRotationAngleRelativeToFOV"}, - 0x00187040 : { vr : "LT", vm : C.VM_SINGLE, keyword : "GridAbsorbingMaterial"}, - 0x00187041 : { vr : "LT", vm : C.VM_SINGLE, keyword : "GridSpacingMaterial"}, - 0x00187042 : { vr : "DS", vm : C.VM_SINGLE, keyword : "GridThickness"}, - 0x00187044 : { vr : "DS", vm : C.VM_SINGLE, keyword : "GridPitch"}, - 0x00187046 : { vr : "IS", vm : C.VM_TWO, keyword : "GridAspectRatio"}, - 0x00187048 : { vr : "DS", vm : C.VM_SINGLE, keyword : "GridPeriod"}, - 0x0018704C : { vr : "DS", vm : C.VM_SINGLE, keyword : "GridFocalDistance"}, - 0x00187050 : { vr : "CS", vm : C.VM_1N, keyword : "FilterMaterial"}, - 0x00187052 : { vr : "DS", vm : C.VM_1N, keyword : "FilterThicknessMinimum"}, - 0x00187054 : { vr : "DS", vm : C.VM_1N, keyword : "FilterThicknessMaximum"}, - 0x00187056 : { vr : "FL", vm : C.VM_1N, keyword : "FilterBeamPathLengthMinimum"}, - 0x00187058 : { vr : "FL", vm : C.VM_1N, keyword : "FilterBeamPathLengthMaximum"}, - 0x00187060 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExposureControlMode"}, - 0x00187062 : { vr : "LT", vm : C.VM_SINGLE, keyword : "ExposureControlModeDescription"}, - 0x00187064 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExposureStatus"}, - 0x00187065 : { vr : "DS", vm : C.VM_SINGLE, keyword : "PhototimerSetting"}, - 0x00188150 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ExposureTimeInuS"}, - 0x00188151 : { vr : "DS", vm : C.VM_SINGLE, keyword : "XRayTubeCurrentInuA"}, - 0x00189004 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContentQualification"}, - 0x00189005 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PulseSequenceName"}, - 0x00189006 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRImagingModifierSequence"}, - 0x00189008 : { vr : "CS", vm : C.VM_SINGLE, keyword : "EchoPulseSequence"}, - 0x00189009 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InversionRecovery"}, - 0x00189010 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FlowCompensation"}, - 0x00189011 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MultipleSpinEcho"}, - 0x00189012 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MultiPlanarExcitation"}, - 0x00189014 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PhaseContrast"}, - 0x00189015 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TimeOfFlightContrast"}, - 0x00189016 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Spoiling"}, - 0x00189017 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SteadyStatePulseSequence"}, - 0x00189018 : { vr : "CS", vm : C.VM_SINGLE, keyword : "EchoPlanarPulseSequence"}, - 0x00189019 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TagAngleFirstAxis"}, - 0x00189020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MagnetizationTransfer"}, - 0x00189021 : { vr : "CS", vm : C.VM_SINGLE, keyword : "T2Preparation"}, - 0x00189022 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BloodSignalNulling"}, - 0x00189024 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SaturationRecovery"}, - 0x00189025 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SpectrallySelectedSuppression"}, - 0x00189026 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SpectrallySelectedExcitation"}, - 0x00189027 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SpatialPresaturation"}, - 0x00189028 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Tagging"}, - 0x00189029 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OversamplingPhase"}, - 0x00189030 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TagSpacingFirstDimension"}, - 0x00189032 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GeometryOfKSpaceTraversal"}, - 0x00189033 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SegmentedKSpaceTraversal"}, - 0x00189034 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RectilinearPhaseEncodeReordering"}, - 0x00189035 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TagThickness"}, - 0x00189036 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PartialFourierDirection"}, - 0x00189037 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CardiacSynchronizationTechnique"}, - 0x00189041 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ReceiveCoilManufacturerName"}, - 0x00189042 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRReceiveCoilSequence"}, - 0x00189043 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReceiveCoilType"}, - 0x00189044 : { vr : "CS", vm : C.VM_SINGLE, keyword : "QuadratureReceiveCoil"}, - 0x00189045 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MultiCoilDefinitionSequence"}, - 0x00189046 : { vr : "LO", vm : C.VM_SINGLE, keyword : "MultiCoilConfiguration"}, - 0x00189047 : { vr : "SH", vm : C.VM_SINGLE, keyword : "MultiCoilElementName"}, - 0x00189048 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MultiCoilElementUsed"}, - 0x00189049 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRTransmitCoilSequence"}, - 0x00189050 : { vr : "LO", vm : C.VM_SINGLE, keyword : "TransmitCoilManufacturerName"}, - 0x00189051 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TransmitCoilType"}, - 0x00189052 : { vr : "FD", vm : C.VM_1_2, keyword : "SpectralWidth"}, - 0x00189053 : { vr : "FD", vm : C.VM_1_2, keyword : "ChemicalShiftReference"}, - 0x00189054 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VolumeLocalizationTechnique"}, - 0x00189058 : { vr : "US", vm : C.VM_SINGLE, keyword : "MRAcquisitionFrequencyEncodingSteps"}, - 0x00189059 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Decoupling"}, - 0x00189060 : { vr : "CS", vm : C.VM_1_2, keyword : "DecoupledNucleus"}, - 0x00189061 : { vr : "FD", vm : C.VM_1_2, keyword : "DecouplingFrequency"}, - 0x00189062 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DecouplingMethod"}, - 0x00189063 : { vr : "FD", vm : C.VM_1_2, keyword : "DecouplingChemicalShiftReference"}, - 0x00189064 : { vr : "CS", vm : C.VM_SINGLE, keyword : "KSpaceFiltering"}, - 0x00189065 : { vr : "CS", vm : C.VM_1_2, keyword : "TimeDomainFiltering"}, - 0x00189066 : { vr : "US", vm : C.VM_1_2, keyword : "NumberOfZeroFills"}, - 0x00189067 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BaselineCorrection"}, - 0x00189069 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ParallelReductionFactorInPlane"}, - 0x00189070 : { vr : "FD", vm : C.VM_SINGLE, keyword : "CardiacRRIntervalSpecified"}, - 0x00189073 : { vr : "FD", vm : C.VM_SINGLE, keyword : "AcquisitionDuration"}, - 0x00189074 : { vr : "DT", vm : C.VM_SINGLE, keyword : "FrameAcquisitionDateTime"}, - 0x00189075 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DiffusionDirectionality"}, - 0x00189076 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DiffusionGradientDirectionSequence"}, - 0x00189077 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ParallelAcquisition"}, - 0x00189078 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ParallelAcquisitionTechnique"}, - 0x00189079 : { vr : "FD", vm : C.VM_1N, keyword : "InversionTimes"}, - 0x00189080 : { vr : "ST", vm : C.VM_SINGLE, keyword : "MetaboliteMapDescription"}, - 0x00189081 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PartialFourier"}, - 0x00189082 : { vr : "FD", vm : C.VM_SINGLE, keyword : "EffectiveEchoTime"}, - 0x00189083 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MetaboliteMapCodeSequence"}, - 0x00189084 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ChemicalShiftSequence"}, - 0x00189085 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CardiacSignalSource"}, - 0x00189087 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DiffusionBValue"}, - 0x00189089 : { vr : "FD", vm : C.VM_THREE, keyword : "DiffusionGradientOrientation"}, - 0x00189090 : { vr : "FD", vm : C.VM_THREE, keyword : "VelocityEncodingDirection"}, - 0x00189091 : { vr : "FD", vm : C.VM_SINGLE, keyword : "VelocityEncodingMinimumValue"}, - 0x00189092 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VelocityEncodingAcquisitionSequence"}, - 0x00189093 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfKSpaceTrajectories"}, - 0x00189094 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CoverageOfKSpace"}, - 0x00189095 : { vr : "UL", vm : C.VM_SINGLE, keyword : "SpectroscopyAcquisitionPhaseRows"}, - 0x00189096 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ParallelReductionFactorInPlaneRetired"}, - 0x00189098 : { vr : "FD", vm : C.VM_1_2, keyword : "TransmitterFrequency"}, - 0x00189100 : { vr : "CS", vm : C.VM_1_2, keyword : "ResonantNucleus"}, - 0x00189101 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FrequencyCorrection"}, - 0x00189103 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRSpectroscopyFOVGeometrySequence"}, - 0x00189104 : { vr : "FD", vm : C.VM_SINGLE, keyword : "SlabThickness"}, - 0x00189105 : { vr : "FD", vm : C.VM_THREE, keyword : "SlabOrientation"}, - 0x00189106 : { vr : "FD", vm : C.VM_THREE, keyword : "MidSlabPosition"}, - 0x00189107 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRSpatialSaturationSequence"}, - 0x00189112 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRTimingAndRelatedParametersSequence"}, - 0x00189114 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MREchoSequence"}, - 0x00189115 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRModifierSequence"}, - 0x00189117 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRDiffusionSequence"}, - 0x00189118 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CardiacSynchronizationSequence"}, - 0x00189119 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRAveragesSequence"}, - 0x00189125 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRFOVGeometrySequence"}, - 0x00189126 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VolumeLocalizationSequence"}, - 0x00189127 : { vr : "UL", vm : C.VM_SINGLE, keyword : "SpectroscopyAcquisitionDataColumns"}, - 0x00189147 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DiffusionAnisotropyType"}, - 0x00189151 : { vr : "DT", vm : C.VM_SINGLE, keyword : "FrameReferenceDateTime"}, - 0x00189152 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRMetaboliteMapSequence"}, - 0x00189155 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ParallelReductionFactorOutOfPlane"}, - 0x00189159 : { vr : "UL", vm : C.VM_SINGLE, keyword : "SpectroscopyAcquisitionOutOfPlanePhaseSteps"}, - 0x00189166 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BulkMotionStatus"}, - 0x00189168 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ParallelReductionFactorSecondInPlane"}, - 0x00189169 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CardiacBeatRejectionTechnique"}, - 0x00189170 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RespiratoryMotionCompensationTechnique"}, - 0x00189171 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RespiratorySignalSource"}, - 0x00189172 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BulkMotionCompensationTechnique"}, - 0x00189173 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BulkMotionSignalSource"}, - 0x00189174 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ApplicableSafetyStandardAgency"}, - 0x00189175 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ApplicableSafetyStandardDescription"}, - 0x00189176 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OperatingModeSequence"}, - 0x00189177 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OperatingModeType"}, - 0x00189178 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OperatingMode"}, - 0x00189179 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SpecificAbsorptionRateDefinition"}, - 0x00189180 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GradientOutputType"}, - 0x00189181 : { vr : "FD", vm : C.VM_SINGLE, keyword : "SpecificAbsorptionRateValue"}, - 0x00189182 : { vr : "FD", vm : C.VM_SINGLE, keyword : "GradientOutput"}, - 0x00189183 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FlowCompensationDirection"}, - 0x00189184 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TaggingDelay"}, - 0x00189185 : { vr : "ST", vm : C.VM_SINGLE, keyword : "RespiratoryMotionCompensationTechniqueDescription"}, - 0x00189186 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RespiratorySignalSourceID"}, - 0x00189195 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ChemicalShiftMinimumIntegrationLimitInHz"}, - 0x00189196 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ChemicalShiftMaximumIntegrationLimitInHz"}, - 0x00189197 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRVelocityEncodingSequence"}, - 0x00189198 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FirstOrderPhaseCorrection"}, - 0x00189199 : { vr : "CS", vm : C.VM_SINGLE, keyword : "WaterReferencedPhaseCorrection"}, - 0x00189200 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MRSpectroscopyAcquisitionType"}, - 0x00189214 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RespiratoryCyclePosition"}, - 0x00189217 : { vr : "FD", vm : C.VM_SINGLE, keyword : "VelocityEncodingMaximumValue"}, - 0x00189218 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TagSpacingSecondDimension"}, - 0x00189219 : { vr : "SS", vm : C.VM_SINGLE, keyword : "TagAngleSecondAxis"}, - 0x00189220 : { vr : "FD", vm : C.VM_SINGLE, keyword : "FrameAcquisitionDuration"}, - 0x00189226 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRImageFrameTypeSequence"}, - 0x00189227 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRSpectroscopyFrameTypeSequence"}, - 0x00189231 : { vr : "US", vm : C.VM_SINGLE, keyword : "MRAcquisitionPhaseEncodingStepsInPlane"}, - 0x00189232 : { vr : "US", vm : C.VM_SINGLE, keyword : "MRAcquisitionPhaseEncodingStepsOutOfPlane"}, - 0x00189234 : { vr : "UL", vm : C.VM_SINGLE, keyword : "SpectroscopyAcquisitionPhaseColumns"}, - 0x00189236 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CardiacCyclePosition"}, - 0x00189239 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SpecificAbsorptionRateSequence"}, - 0x00189240 : { vr : "US", vm : C.VM_SINGLE, keyword : "RFEchoTrainLength"}, - 0x00189241 : { vr : "US", vm : C.VM_SINGLE, keyword : "GradientEchoTrainLength"}, - 0x00189250 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ArterialSpinLabelingContrast"}, - 0x00189251 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MRArterialSpinLabelingSequence"}, - 0x00189252 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ASLTechniqueDescription"}, - 0x00189253 : { vr : "US", vm : C.VM_SINGLE, keyword : "ASLSlabNumber"}, - 0x00189254 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ASLSlabThickness"}, - 0x00189255 : { vr : "FD", vm : C.VM_THREE, keyword : "ASLSlabOrientation"}, - 0x00189256 : { vr : "FD", vm : C.VM_THREE, keyword : "ASLMidSlabPosition"}, - 0x00189257 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ASLContext"}, - 0x00189258 : { vr : "UL", vm : C.VM_SINGLE, keyword : "ASLPulseTrainDuration"}, - 0x00189259 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ASLCrusherFlag"}, - 0x0018925A : { vr : "FD", vm : C.VM_SINGLE, keyword : "ASLCrusherFlow"}, - 0x0018925B : { vr : "LO", vm : C.VM_SINGLE, keyword : "ASLCrusherDescription"}, - 0x0018925C : { vr : "CS", vm : C.VM_SINGLE, keyword : "ASLBolusCutoffFlag"}, - 0x0018925D : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ASLBolusCutoffTimingSequence"}, - 0x0018925E : { vr : "LO", vm : C.VM_SINGLE, keyword : "ASLBolusCutoffTechnique"}, - 0x0018925F : { vr : "UL", vm : C.VM_SINGLE, keyword : "ASLBolusCutoffDelayTime"}, - 0x00189260 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ASLSlabSequence"}, - 0x00189295 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ChemicalShiftMinimumIntegrationLimitInppm"}, - 0x00189296 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ChemicalShiftMaximumIntegrationLimitInppm"}, - 0x00189301 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTAcquisitionTypeSequence"}, - 0x00189302 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AcquisitionType"}, - 0x00189303 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TubeAngle"}, - 0x00189304 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTAcquisitionDetailsSequence"}, - 0x00189305 : { vr : "FD", vm : C.VM_SINGLE, keyword : "RevolutionTime"}, - 0x00189306 : { vr : "FD", vm : C.VM_SINGLE, keyword : "SingleCollimationWidth"}, - 0x00189307 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TotalCollimationWidth"}, - 0x00189308 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTTableDynamicsSequence"}, - 0x00189309 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TableSpeed"}, - 0x00189310 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TableFeedPerRotation"}, - 0x00189311 : { vr : "FD", vm : C.VM_SINGLE, keyword : "SpiralPitchFactor"}, - 0x00189312 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTGeometrySequence"}, - 0x00189313 : { vr : "FD", vm : C.VM_THREE, keyword : "DataCollectionCenterPatient"}, - 0x00189314 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTReconstructionSequence"}, - 0x00189315 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReconstructionAlgorithm"}, - 0x00189316 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ConvolutionKernelGroup"}, - 0x00189317 : { vr : "FD", vm : C.VM_TWO, keyword : "ReconstructionFieldOfView"}, - 0x00189318 : { vr : "FD", vm : C.VM_THREE, keyword : "ReconstructionTargetCenterPatient"}, - 0x00189319 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ReconstructionAngle"}, - 0x00189320 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ImageFilter"}, - 0x00189321 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTExposureSequence"}, - 0x00189322 : { vr : "FD", vm : C.VM_TWO, keyword : "ReconstructionPixelSpacing"}, - 0x00189323 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExposureModulationType"}, - 0x00189324 : { vr : "FD", vm : C.VM_SINGLE, keyword : "EstimatedDoseSaving"}, - 0x00189325 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTXRayDetailsSequence"}, - 0x00189326 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTPositionSequence"}, - 0x00189327 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TablePosition"}, - 0x00189328 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ExposureTimeInms"}, - 0x00189329 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTImageFrameTypeSequence"}, - 0x00189330 : { vr : "FD", vm : C.VM_SINGLE, keyword : "XRayTubeCurrentInmA"}, - 0x00189332 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ExposureInmAs"}, - 0x00189333 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ConstantVolumeFlag"}, - 0x00189334 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FluoroscopyFlag"}, - 0x00189335 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DistanceSourceToDataCollectionCenter"}, - 0x00189337 : { vr : "US", vm : C.VM_SINGLE, keyword : "ContrastBolusAgentNumber"}, - 0x00189338 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContrastBolusIngredientCodeSequence"}, - 0x00189340 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContrastAdministrationProfileSequence"}, - 0x00189341 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContrastBolusUsageSequence"}, - 0x00189342 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContrastBolusAgentAdministered"}, - 0x00189343 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContrastBolusAgentDetected"}, - 0x00189344 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContrastBolusAgentPhase"}, - 0x00189345 : { vr : "FD", vm : C.VM_SINGLE, keyword : "CTDIvol"}, - 0x00189346 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTDIPhantomTypeCodeSequence"}, - 0x00189351 : { vr : "FL", vm : C.VM_SINGLE, keyword : "CalciumScoringMassFactorPatient"}, - 0x00189352 : { vr : "FL", vm : C.VM_THREE, keyword : "CalciumScoringMassFactorDevice"}, - 0x00189353 : { vr : "FL", vm : C.VM_SINGLE, keyword : "EnergyWeightingFactor"}, - 0x00189360 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CTAdditionalXRaySourceSequence"}, - 0x00189401 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProjectionPixelCalibrationSequence"}, - 0x00189402 : { vr : "FL", vm : C.VM_SINGLE, keyword : "DistanceSourceToIsocenter"}, - 0x00189403 : { vr : "FL", vm : C.VM_SINGLE, keyword : "DistanceObjectToTableTop"}, - 0x00189404 : { vr : "FL", vm : C.VM_TWO, keyword : "ObjectPixelSpacingInCenterOfBeam"}, - 0x00189405 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PositionerPositionSequence"}, - 0x00189406 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TablePositionSequence"}, - 0x00189407 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CollimatorShapeSequence"}, - 0x00189410 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PlanesInAcquisition"}, - 0x00189412 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "XAXRFFrameCharacteristicsSequence"}, - 0x00189417 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FrameAcquisitionSequence"}, - 0x00189420 : { vr : "CS", vm : C.VM_SINGLE, keyword : "XRayReceptorType"}, - 0x00189423 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AcquisitionProtocolName"}, - 0x00189424 : { vr : "LT", vm : C.VM_SINGLE, keyword : "AcquisitionProtocolDescription"}, - 0x00189425 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContrastBolusIngredientOpaque"}, - 0x00189426 : { vr : "FL", vm : C.VM_SINGLE, keyword : "DistanceReceptorPlaneToDetectorHousing"}, - 0x00189427 : { vr : "CS", vm : C.VM_SINGLE, keyword : "IntensifierActiveShape"}, - 0x00189428 : { vr : "FL", vm : C.VM_1_2, keyword : "IntensifierActiveDimensions"}, - 0x00189429 : { vr : "FL", vm : C.VM_TWO, keyword : "PhysicalDetectorSize"}, - 0x00189430 : { vr : "FL", vm : C.VM_TWO, keyword : "PositionOfIsocenterProjection"}, - 0x00189432 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FieldOfViewSequence"}, - 0x00189433 : { vr : "LO", vm : C.VM_SINGLE, keyword : "FieldOfViewDescription"}, - 0x00189434 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ExposureControlSensingRegionsSequence"}, - 0x00189435 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExposureControlSensingRegionShape"}, - 0x00189436 : { vr : "SS", vm : C.VM_SINGLE, keyword : "ExposureControlSensingRegionLeftVerticalEdge"}, - 0x00189437 : { vr : "SS", vm : C.VM_SINGLE, keyword : "ExposureControlSensingRegionRightVerticalEdge"}, - 0x00189438 : { vr : "SS", vm : C.VM_SINGLE, keyword : "ExposureControlSensingRegionUpperHorizontalEdge"}, - 0x00189439 : { vr : "SS", vm : C.VM_SINGLE, keyword : "ExposureControlSensingRegionLowerHorizontalEdge"}, - 0x00189440 : { vr : "SS", vm : C.VM_TWO, keyword : "CenterOfCircularExposureControlSensingRegion"}, - 0x00189441 : { vr : "US", vm : C.VM_SINGLE, keyword : "RadiusOfCircularExposureControlSensingRegion"}, - 0x00189442 : { vr : "SS", vm : C.VM_2N, keyword : "VerticesOfThePolygonalExposureControlSensingRegion"}, - 0x00189447 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ColumnAngulationPatient"}, - 0x00189449 : { vr : "FL", vm : C.VM_SINGLE, keyword : "BeamAngle"}, - 0x00189451 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FrameDetectorParametersSequence"}, - 0x00189452 : { vr : "FL", vm : C.VM_SINGLE, keyword : "CalculatedAnatomyThickness"}, - 0x00189455 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CalibrationSequence"}, - 0x00189456 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ObjectThicknessSequence"}, - 0x00189457 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PlaneIdentification"}, - 0x00189461 : { vr : "FL", vm : C.VM_1_2, keyword : "FieldOfViewDimensionsInFloat"}, - 0x00189462 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IsocenterReferenceSystemSequence"}, - 0x00189463 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PositionerIsocenterPrimaryAngle"}, - 0x00189464 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PositionerIsocenterSecondaryAngle"}, - 0x00189465 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PositionerIsocenterDetectorRotationAngle"}, - 0x00189466 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TableXPositionToIsocenter"}, - 0x00189467 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TableYPositionToIsocenter"}, - 0x00189468 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TableZPositionToIsocenter"}, - 0x00189469 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TableHorizontalRotationAngle"}, - 0x00189470 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TableHeadTiltAngle"}, - 0x00189471 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TableCradleTiltAngle"}, - 0x00189472 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FrameDisplayShutterSequence"}, - 0x00189473 : { vr : "FL", vm : C.VM_SINGLE, keyword : "AcquiredImageAreaDoseProduct"}, - 0x00189474 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CArmPositionerTabletopRelationship"}, - 0x00189476 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "XRayGeometrySequence"}, - 0x00189477 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IrradiationEventIdentificationSequence"}, - 0x00189504 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "XRay3DFrameTypeSequence"}, - 0x00189506 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContributingSourcesSequence"}, - 0x00189507 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "XRay3DAcquisitionSequence"}, - 0x00189508 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PrimaryPositionerScanArc"}, - 0x00189509 : { vr : "FL", vm : C.VM_SINGLE, keyword : "SecondaryPositionerScanArc"}, - 0x00189510 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PrimaryPositionerScanStartAngle"}, - 0x00189511 : { vr : "FL", vm : C.VM_SINGLE, keyword : "SecondaryPositionerScanStartAngle"}, - 0x00189514 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PrimaryPositionerIncrement"}, - 0x00189515 : { vr : "FL", vm : C.VM_SINGLE, keyword : "SecondaryPositionerIncrement"}, - 0x00189516 : { vr : "DT", vm : C.VM_SINGLE, keyword : "StartAcquisitionDateTime"}, - 0x00189517 : { vr : "DT", vm : C.VM_SINGLE, keyword : "EndAcquisitionDateTime"}, - 0x00189524 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ApplicationName"}, - 0x00189525 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ApplicationVersion"}, - 0x00189526 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ApplicationManufacturer"}, - 0x00189527 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AlgorithmType"}, - 0x00189528 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AlgorithmDescription"}, - 0x00189530 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "XRay3DReconstructionSequence"}, - 0x00189531 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ReconstructionDescription"}, - 0x00189538 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerProjectionAcquisitionSequence"}, - 0x00189601 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DiffusionBMatrixSequence"}, - 0x00189602 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DiffusionBValueXX"}, - 0x00189603 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DiffusionBValueXY"}, - 0x00189604 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DiffusionBValueXZ"}, - 0x00189605 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DiffusionBValueYY"}, - 0x00189606 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DiffusionBValueYZ"}, - 0x00189607 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DiffusionBValueZZ"}, - 0x00189701 : { vr : "DT", vm : C.VM_SINGLE, keyword : "DecayCorrectionDateTime"}, - 0x00189715 : { vr : "FD", vm : C.VM_SINGLE, keyword : "StartDensityThreshold"}, - 0x00189716 : { vr : "FD", vm : C.VM_SINGLE, keyword : "StartRelativeDensityDifferenceThreshold"}, - 0x00189717 : { vr : "FD", vm : C.VM_SINGLE, keyword : "StartCardiacTriggerCountThreshold"}, - 0x00189718 : { vr : "FD", vm : C.VM_SINGLE, keyword : "StartRespiratoryTriggerCountThreshold"}, - 0x00189719 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TerminationCountsThreshold"}, - 0x00189720 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TerminationDensityThreshold"}, - 0x00189721 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TerminationRelativeDensityThreshold"}, - 0x00189722 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TerminationTimeThreshold"}, - 0x00189723 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TerminationCardiacTriggerCountThreshold"}, - 0x00189724 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TerminationRespiratoryTriggerCountThreshold"}, - 0x00189725 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DetectorGeometry"}, - 0x00189726 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TransverseDetectorSeparation"}, - 0x00189727 : { vr : "FD", vm : C.VM_SINGLE, keyword : "AxialDetectorDimension"}, - 0x00189729 : { vr : "US", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalAgentNumber"}, - 0x00189732 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PETFrameAcquisitionSequence"}, - 0x00189733 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PETDetectorMotionDetailsSequence"}, - 0x00189734 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PETTableDynamicsSequence"}, - 0x00189735 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PETPositionSequence"}, - 0x00189736 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PETFrameCorrectionFactorsSequence"}, - 0x00189737 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalUsageSequence"}, - 0x00189738 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AttenuationCorrectionSource"}, - 0x00189739 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfIterations"}, - 0x00189740 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfSubsets"}, - 0x00189749 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PETReconstructionSequence"}, - 0x00189751 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PETFrameTypeSequence"}, - 0x00189755 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TimeOfFlightInformationUsed"}, - 0x00189756 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReconstructionType"}, - 0x00189758 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DecayCorrected"}, - 0x00189759 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AttenuationCorrected"}, - 0x00189760 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ScatterCorrected"}, - 0x00189761 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DeadTimeCorrected"}, - 0x00189762 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GantryMotionCorrected"}, - 0x00189763 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PatientMotionCorrected"}, - 0x00189764 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CountLossNormalizationCorrected"}, - 0x00189765 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RandomsCorrected"}, - 0x00189766 : { vr : "CS", vm : C.VM_SINGLE, keyword : "NonUniformRadialSamplingCorrected"}, - 0x00189767 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SensitivityCalibrated"}, - 0x00189768 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DetectorNormalizationCorrection"}, - 0x00189769 : { vr : "CS", vm : C.VM_SINGLE, keyword : "IterativeReconstructionMethod"}, - 0x00189770 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AttenuationCorrectionTemporalRelationship"}, - 0x00189771 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientPhysiologicalStateSequence"}, - 0x00189772 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientPhysiologicalStateCodeSequence"}, - 0x00189801 : { vr : "FD", vm : C.VM_1N, keyword : "DepthsOfFocus"}, - 0x00189803 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ExcludedIntervalsSequence"}, - 0x00189804 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ExclusionStartDatetime"}, - 0x00189805 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ExclusionDuration"}, - 0x00189806 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "USImageDescriptionSequence"}, - 0x00189807 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImageDataTypeSequence"}, - 0x00189808 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DataType"}, - 0x00189809 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TransducerScanPatternCodeSequence"}, - 0x0018980B : { vr : "CS", vm : C.VM_SINGLE, keyword : "AliasedDataType"}, - 0x0018980C : { vr : "CS", vm : C.VM_SINGLE, keyword : "PositionMeasuringDeviceUsed"}, - 0x0018980D : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TransducerGeometryCodeSequence"}, - 0x0018980E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TransducerBeamSteeringCodeSequence"}, - 0x0018980F : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TransducerApplicationCodeSequence"}, - 0x0018A001 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContributingEquipmentSequence"}, - 0x0018A002 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ContributionDateTime"}, - 0x0018A003 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ContributionDescription"}, - 0x0020000D : { vr : "UI", vm : C.VM_SINGLE, keyword : "StudyInstanceUID"}, - 0x0020000E : { vr : "UI", vm : C.VM_SINGLE, keyword : "SeriesInstanceUID"}, - 0x00200010 : { vr : "SH", vm : C.VM_SINGLE, keyword : "StudyID"}, - 0x00200011 : { vr : "IS", vm : C.VM_SINGLE, keyword : "SeriesNumber"}, - 0x00200012 : { vr : "IS", vm : C.VM_SINGLE, keyword : "AcquisitionNumber"}, - 0x00200013 : { vr : "IS", vm : C.VM_SINGLE, keyword : "InstanceNumber"}, - 0x00200014 : { vr : "IS", vm : C.VM_SINGLE, keyword : "IsotopeNumber"}, - 0x00200015 : { vr : "IS", vm : C.VM_SINGLE, keyword : "PhaseNumber"}, - 0x00200016 : { vr : "IS", vm : C.VM_SINGLE, keyword : "IntervalNumber"}, - 0x00200017 : { vr : "IS", vm : C.VM_SINGLE, keyword : "TimeSlotNumber"}, - 0x00200018 : { vr : "IS", vm : C.VM_SINGLE, keyword : "AngleNumber"}, - 0x00200019 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ItemNumber"}, - 0x00200020 : { vr : "CS", vm : C.VM_TWO, keyword : "PatientOrientation"}, - 0x00200022 : { vr : "IS", vm : C.VM_SINGLE, keyword : "OverlayNumber"}, - 0x00200024 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CurveNumber"}, - 0x00200026 : { vr : "IS", vm : C.VM_SINGLE, keyword : "LUTNumber"}, - 0x00200030 : { vr : "DS", vm : C.VM_THREE, keyword : "ImagePosition"}, - 0x00200032 : { vr : "DS", vm : C.VM_THREE, keyword : "ImagePositionPatient"}, - 0x00200035 : { vr : "DS", vm : C.VM_SIX, keyword : "ImageOrientation"}, - 0x00200037 : { vr : "DS", vm : C.VM_SIX, keyword : "ImageOrientationPatient"}, - 0x00200050 : { vr : "DS", vm : C.VM_SINGLE, keyword : "Location"}, - 0x00200052 : { vr : "UI", vm : C.VM_SINGLE, keyword : "FrameOfReferenceUID"}, - 0x00200060 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Laterality"}, - 0x00200062 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageLaterality"}, - 0x00200070 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImageGeometryType"}, - 0x00200080 : { vr : "CS", vm : C.VM_1N, keyword : "MaskingImage"}, - 0x002000AA : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReportNumber"}, - 0x00200100 : { vr : "IS", vm : C.VM_SINGLE, keyword : "TemporalPositionIdentifier"}, - 0x00200105 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfTemporalPositions"}, - 0x00200110 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TemporalResolution"}, - 0x00200200 : { vr : "UI", vm : C.VM_SINGLE, keyword : "SynchronizationFrameOfReferenceUID"}, - 0x00200242 : { vr : "UI", vm : C.VM_SINGLE, keyword : "SOPInstanceUIDOfConcatenationSource"}, - 0x00201000 : { vr : "IS", vm : C.VM_SINGLE, keyword : "SeriesInStudy"}, - 0x00201001 : { vr : "IS", vm : C.VM_SINGLE, keyword : "AcquisitionsInSeries"}, - 0x00201002 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ImagesInAcquisition"}, - 0x00201003 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ImagesInSeries"}, - 0x00201004 : { vr : "IS", vm : C.VM_SINGLE, keyword : "AcquisitionsInStudy"}, - 0x00201005 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ImagesInStudy"}, - 0x00201020 : { vr : "LO", vm : C.VM_1N, keyword : "Reference"}, - 0x00201040 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PositionReferenceIndicator"}, - 0x00201041 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SliceLocation"}, - 0x00201070 : { vr : "IS", vm : C.VM_1N, keyword : "OtherStudyNumbers"}, - 0x00201200 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfPatientRelatedStudies"}, - 0x00201202 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfPatientRelatedSeries"}, - 0x00201204 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfPatientRelatedInstances"}, - 0x00201206 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfStudyRelatedSeries"}, - 0x00201208 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfStudyRelatedInstances"}, - 0x00201209 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfSeriesRelatedInstances"}, - 0x00203401 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ModifyingDeviceID"}, - 0x00203402 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ModifiedImageID"}, - 0x00203403 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ModifiedImageDate"}, - 0x00203404 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ModifyingDeviceManufacturer"}, - 0x00203405 : { vr : "TM", vm : C.VM_SINGLE, keyword : "ModifiedImageTime"}, - 0x00203406 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ModifiedImageDescription"}, - 0x00204000 : { vr : "LT", vm : C.VM_SINGLE, keyword : "ImageComments"}, - 0x00205000 : { vr : "AT", vm : C.VM_1N, keyword : "OriginalImageIdentification"}, - 0x00205002 : { vr : "LO", vm : C.VM_1N, keyword : "OriginalImageIdentificationNomenclature"}, - 0x00209056 : { vr : "SH", vm : C.VM_SINGLE, keyword : "StackID"}, - 0x00209057 : { vr : "UL", vm : C.VM_SINGLE, keyword : "InStackPositionNumber"}, - 0x00209071 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FrameAnatomySequence"}, - 0x00209072 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FrameLaterality"}, - 0x00209111 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FrameContentSequence"}, - 0x00209113 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PlanePositionSequence"}, - 0x00209116 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PlaneOrientationSequence"}, - 0x00209128 : { vr : "UL", vm : C.VM_SINGLE, keyword : "TemporalPositionIndex"}, - 0x00209153 : { vr : "FD", vm : C.VM_SINGLE, keyword : "NominalCardiacTriggerDelayTime"}, - 0x00209154 : { vr : "FL", vm : C.VM_SINGLE, keyword : "NominalCardiacTriggerTimePriorToRPeak"}, - 0x00209155 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ActualCardiacTriggerTimePriorToRPeak"}, - 0x00209156 : { vr : "US", vm : C.VM_SINGLE, keyword : "FrameAcquisitionNumber"}, - 0x00209157 : { vr : "UL", vm : C.VM_1N, keyword : "DimensionIndexValues"}, - 0x00209158 : { vr : "LT", vm : C.VM_SINGLE, keyword : "FrameComments"}, - 0x00209161 : { vr : "UI", vm : C.VM_SINGLE, keyword : "ConcatenationUID"}, - 0x00209162 : { vr : "US", vm : C.VM_SINGLE, keyword : "InConcatenationNumber"}, - 0x00209163 : { vr : "US", vm : C.VM_SINGLE, keyword : "InConcatenationTotalNumber"}, - 0x00209164 : { vr : "UI", vm : C.VM_SINGLE, keyword : "DimensionOrganizationUID"}, - 0x00209165 : { vr : "AT", vm : C.VM_SINGLE, keyword : "DimensionIndexPointer"}, - 0x00209167 : { vr : "AT", vm : C.VM_SINGLE, keyword : "FunctionalGroupPointer"}, - 0x00209213 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DimensionIndexPrivateCreator"}, - 0x00209221 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DimensionOrganizationSequence"}, - 0x00209222 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DimensionIndexSequence"}, - 0x00209228 : { vr : "UL", vm : C.VM_SINGLE, keyword : "ConcatenationFrameOffsetNumber"}, - 0x00209238 : { vr : "LO", vm : C.VM_SINGLE, keyword : "FunctionalGroupPrivateCreator"}, - 0x00209241 : { vr : "FL", vm : C.VM_SINGLE, keyword : "NominalPercentageOfCardiacPhase"}, - 0x00209245 : { vr : "FL", vm : C.VM_SINGLE, keyword : "NominalPercentageOfRespiratoryPhase"}, - 0x00209246 : { vr : "FL", vm : C.VM_SINGLE, keyword : "StartingRespiratoryAmplitude"}, - 0x00209247 : { vr : "CS", vm : C.VM_SINGLE, keyword : "StartingRespiratoryPhase"}, - 0x00209248 : { vr : "FL", vm : C.VM_SINGLE, keyword : "EndingRespiratoryAmplitude"}, - 0x00209249 : { vr : "CS", vm : C.VM_SINGLE, keyword : "EndingRespiratoryPhase"}, - 0x00209250 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RespiratoryTriggerType"}, - 0x00209251 : { vr : "FD", vm : C.VM_SINGLE, keyword : "RRIntervalTimeNominal"}, - 0x00209252 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ActualCardiacTriggerDelayTime"}, - 0x00209253 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RespiratorySynchronizationSequence"}, - 0x00209254 : { vr : "FD", vm : C.VM_SINGLE, keyword : "RespiratoryIntervalTime"}, - 0x00209255 : { vr : "FD", vm : C.VM_SINGLE, keyword : "NominalRespiratoryTriggerDelayTime"}, - 0x00209256 : { vr : "FD", vm : C.VM_SINGLE, keyword : "RespiratoryTriggerDelayThreshold"}, - 0x00209257 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ActualRespiratoryTriggerDelayTime"}, - 0x00209301 : { vr : "FD", vm : C.VM_THREE, keyword : "ImagePositionVolume"}, - 0x00209302 : { vr : "FD", vm : C.VM_SIX, keyword : "ImageOrientationVolume"}, - 0x00209307 : { vr : "CS", vm : C.VM_SINGLE, keyword : "UltrasoundAcquisitionGeometry"}, - 0x00209308 : { vr : "FD", vm : C.VM_THREE, keyword : "ApexPosition"}, - 0x00209309 : { vr : "FD", vm : C.VM_16, keyword : "VolumeToTransducerMappingMatrix"}, - 0x0020930A : { vr : "FD", vm : C.VM_16, keyword : "VolumeToTableMappingMatrix"}, - 0x0020930C : { vr : "CS", vm : C.VM_SINGLE, keyword : "PatientFrameOfReferenceSource"}, - 0x0020930D : { vr : "FD", vm : C.VM_SINGLE, keyword : "TemporalPositionTimeOffset"}, - 0x0020930E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PlanePositionVolumeSequence"}, - 0x0020930F : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PlaneOrientationVolumeSequence"}, - 0x00209310 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TemporalPositionSequence"}, - 0x00209311 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DimensionOrganizationType"}, - 0x00209312 : { vr : "UI", vm : C.VM_SINGLE, keyword : "VolumeFrameOfReferenceUID"}, - 0x00209313 : { vr : "UI", vm : C.VM_SINGLE, keyword : "TableFrameOfReferenceUID"}, - 0x00209421 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DimensionDescriptionLabel"}, - 0x00209450 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientOrientationInFrameSequence"}, - 0x00209453 : { vr : "LO", vm : C.VM_SINGLE, keyword : "FrameLabel"}, - 0x00209518 : { vr : "US", vm : C.VM_1N, keyword : "AcquisitionIndex"}, - 0x00209529 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContributingSOPInstancesReferenceSequence"}, - 0x00209536 : { vr : "US", vm : C.VM_SINGLE, keyword : "ReconstructionIndex"}, - 0x00220001 : { vr : "US", vm : C.VM_SINGLE, keyword : "LightPathFilterPassThroughWavelength"}, - 0x00220002 : { vr : "US", vm : C.VM_TWO, keyword : "LightPathFilterPassBand"}, - 0x00220003 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImagePathFilterPassThroughWavelength"}, - 0x00220004 : { vr : "US", vm : C.VM_TWO, keyword : "ImagePathFilterPassBand"}, - 0x00220005 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PatientEyeMovementCommanded"}, - 0x00220006 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientEyeMovementCommandCodeSequence"}, - 0x00220007 : { vr : "FL", vm : C.VM_SINGLE, keyword : "SphericalLensPower"}, - 0x00220008 : { vr : "FL", vm : C.VM_SINGLE, keyword : "CylinderLensPower"}, - 0x00220009 : { vr : "FL", vm : C.VM_SINGLE, keyword : "CylinderAxis"}, - 0x0022000A : { vr : "FL", vm : C.VM_SINGLE, keyword : "EmmetropicMagnification"}, - 0x0022000B : { vr : "FL", vm : C.VM_SINGLE, keyword : "IntraOcularPressure"}, - 0x0022000C : { vr : "FL", vm : C.VM_SINGLE, keyword : "HorizontalFieldOfView"}, - 0x0022000D : { vr : "CS", vm : C.VM_SINGLE, keyword : "PupilDilated"}, - 0x0022000E : { vr : "FL", vm : C.VM_SINGLE, keyword : "DegreeOfDilation"}, - 0x00220010 : { vr : "FL", vm : C.VM_SINGLE, keyword : "StereoBaselineAngle"}, - 0x00220011 : { vr : "FL", vm : C.VM_SINGLE, keyword : "StereoBaselineDisplacement"}, - 0x00220012 : { vr : "FL", vm : C.VM_SINGLE, keyword : "StereoHorizontalPixelOffset"}, - 0x00220013 : { vr : "FL", vm : C.VM_SINGLE, keyword : "StereoVerticalPixelOffset"}, - 0x00220014 : { vr : "FL", vm : C.VM_SINGLE, keyword : "StereoRotation"}, - 0x00220015 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AcquisitionDeviceTypeCodeSequence"}, - 0x00220016 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IlluminationTypeCodeSequence"}, - 0x00220017 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LightPathFilterTypeStackCodeSequence"}, - 0x00220018 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImagePathFilterTypeStackCodeSequence"}, - 0x00220019 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LensesCodeSequence"}, - 0x0022001A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ChannelDescriptionCodeSequence"}, - 0x0022001B : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RefractiveStateSequence"}, - 0x0022001C : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MydriaticAgentCodeSequence"}, - 0x0022001D : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RelativeImagePositionCodeSequence"}, - 0x0022001E : { vr : "FL", vm : C.VM_SINGLE, keyword : "CameraAngleOfView"}, - 0x00220020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "StereoPairsSequence"}, - 0x00220021 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LeftImageSequence"}, - 0x00220022 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RightImageSequence"}, - 0x00220030 : { vr : "FL", vm : C.VM_SINGLE, keyword : "AxialLengthOfTheEye"}, - 0x00220031 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicFrameLocationSequence"}, - 0x00220032 : { vr : "FL", vm : C.VM_2_2N, keyword : "ReferenceCoordinates"}, - 0x00220035 : { vr : "FL", vm : C.VM_SINGLE, keyword : "DepthSpatialResolution"}, - 0x00220036 : { vr : "FL", vm : C.VM_SINGLE, keyword : "MaximumDepthDistortion"}, - 0x00220037 : { vr : "FL", vm : C.VM_SINGLE, keyword : "AlongScanSpatialResolution"}, - 0x00220038 : { vr : "FL", vm : C.VM_SINGLE, keyword : "MaximumAlongScanDistortion"}, - 0x00220039 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OphthalmicImageOrientation"}, - 0x00220041 : { vr : "FL", vm : C.VM_SINGLE, keyword : "DepthOfTransverseImage"}, - 0x00220042 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MydriaticAgentConcentrationUnitsSequence"}, - 0x00220048 : { vr : "FL", vm : C.VM_SINGLE, keyword : "AcrossScanSpatialResolution"}, - 0x00220049 : { vr : "FL", vm : C.VM_SINGLE, keyword : "MaximumAcrossScanDistortion"}, - 0x0022004E : { vr : "DS", vm : C.VM_SINGLE, keyword : "MydriaticAgentConcentration"}, - 0x00220055 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IlluminationWaveLength"}, - 0x00220056 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IlluminationPower"}, - 0x00220057 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IlluminationBandwidth"}, - 0x00220058 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MydriaticAgentSequence"}, - 0x00221007 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialMeasurementsRightEyeSequence"}, - 0x00221008 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialMeasurementsLeftEyeSequence"}, - 0x00221010 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthMeasurementsType"}, - 0x00221019 : { vr : "FL", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLength"}, - 0x00221024 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LensStatusCodeSequence"}, - 0x00221025 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VitreousStatusCodeSequence"}, - 0x00221028 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IOLFormulaCodeSequence"}, - 0x00221029 : { vr : "LO", vm : C.VM_SINGLE, keyword : "IOLFormulaDetail"}, - 0x00221033 : { vr : "FL", vm : C.VM_SINGLE, keyword : "KeratometerIndex"}, - 0x00221035 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SourceOfOphthalmicAxialLengthCodeSequence"}, - 0x00221037 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TargetRefraction"}, - 0x00221039 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RefractiveProcedureOccurred"}, - 0x00221040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RefractiveSurgeryTypeCodeSequence"}, - 0x00221044 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicUltrasoundAxialMeasurementsTypeCodeSequence"}, - 0x00221050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthMeasurementsSequence"}, - 0x00221053 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IOLPower"}, - 0x00221054 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PredictedRefractiveError"}, - 0x00221059 : { vr : "FL", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthVelocity"}, - 0x00221065 : { vr : "LO", vm : C.VM_SINGLE, keyword : "LensStatusDescription"}, - 0x00221066 : { vr : "LO", vm : C.VM_SINGLE, keyword : "VitreousStatusDescription"}, - 0x00221090 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IOLPowerSequence"}, - 0x00221092 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LensConstantSequence"}, - 0x00221093 : { vr : "LO", vm : C.VM_SINGLE, keyword : "IOLManufacturer"}, - 0x00221094 : { vr : "LO", vm : C.VM_SINGLE, keyword : "LensConstantDescription"}, - 0x00221096 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "KeratometryMeasurementTypeCodeSequence"}, - 0x00221100 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedOphthalmicAxialMeasurementsSequence"}, - 0x00221101 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence"}, - 0x00221103 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RefractiveErrorBeforeRefractiveSurgeryCodeSequence"}, - 0x00221121 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IOLPowerForExactEmmetropia"}, - 0x00221122 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IOLPowerForExactTargetRefraction"}, - 0x00221125 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnteriorChamberDepthDefinitionCodeSequence"}, - 0x00221130 : { vr : "FL", vm : C.VM_SINGLE, keyword : "LensThickness"}, - 0x00221131 : { vr : "FL", vm : C.VM_SINGLE, keyword : "AnteriorChamberDepth"}, - 0x00221132 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SourceOfLensThicknessDataCodeSequence"}, - 0x00221133 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SourceOfAnteriorChamberDepthDataCodeSequence"}, - 0x00221135 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SourceOfRefractiveErrorDataCodeSequence"}, - 0x00221140 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthMeasurementModified"}, - 0x00221150 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthDataSourceCodeSequence"}, - 0x00221153 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthAcquisitionMethodCodeSequence"}, - 0x00221155 : { vr : "FL", vm : C.VM_SINGLE, keyword : "SignalToNoiseRatio"}, - 0x00221159 : { vr : "LO", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthDataSourceDescription"}, - 0x00221210 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthMeasurementsTotalLengthSequence"}, - 0x00221211 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthMeasurementsSegmentalLengthSequence"}, - 0x00221212 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthMeasurementsLengthSummationSequence"}, - 0x00221220 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "UltrasoundOphthalmicAxialLengthMeasurementsSequence"}, - 0x00221225 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OpticalOphthalmicAxialLengthMeasurementsSequence"}, - 0x00221230 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "UltrasoundSelectedOphthalmicAxialLengthSequence"}, - 0x00221250 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthSelectionMethodCodeSequence"}, - 0x00221255 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OpticalSelectedOphthalmicAxialLengthSequence"}, - 0x00221257 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SelectedSegmentalOphthalmicAxialLengthSequence"}, - 0x00221260 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SelectedTotalOphthalmicAxialLengthSequence"}, - 0x00221262 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthQualityMetricSequence"}, - 0x00221273 : { vr : "LO", vm : C.VM_SINGLE, keyword : "OphthalmicAxialLengthQualityMetricTypeDescription"}, - 0x00221300 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IntraocularLensCalculationsRightEyeSequence"}, - 0x00221310 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IntraocularLensCalculationsLeftEyeSequence"}, - 0x00221330 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedOphthalmicAxialLengthMeasurementQCImageSequence"}, - 0x00240010 : { vr : "FL", vm : C.VM_SINGLE, keyword : "VisualFieldHorizontalExtent"}, - 0x00240011 : { vr : "FL", vm : C.VM_SINGLE, keyword : "VisualFieldVerticalExtent"}, - 0x00240012 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VisualFieldShape"}, - 0x00240016 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScreeningTestModeCodeSequence"}, - 0x00240018 : { vr : "FL", vm : C.VM_SINGLE, keyword : "MaximumStimulusLuminance"}, - 0x00240020 : { vr : "FL", vm : C.VM_SINGLE, keyword : "BackgroundLuminance"}, - 0x00240021 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "StimulusColorCodeSequence"}, - 0x00240024 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BackgroundIlluminationColorCodeSequence"}, - 0x00240025 : { vr : "FL", vm : C.VM_SINGLE, keyword : "StimulusArea"}, - 0x00240028 : { vr : "FL", vm : C.VM_SINGLE, keyword : "StimulusPresentationTime"}, - 0x00240032 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FixationSequence"}, - 0x00240033 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FixationMonitoringCodeSequence"}, - 0x00240034 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VisualFieldCatchTrialSequence"}, - 0x00240035 : { vr : "US", vm : C.VM_SINGLE, keyword : "FixationCheckedQuantity"}, - 0x00240036 : { vr : "US", vm : C.VM_SINGLE, keyword : "PatientNotProperlyFixatedQuantity"}, - 0x00240037 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PresentedVisualStimuliDataFlag"}, - 0x00240038 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfVisualStimuli"}, - 0x00240039 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExcessiveFixationLossesDataFlag"}, - 0x00240040 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExcessiveFixationLosses"}, - 0x00240042 : { vr : "US", vm : C.VM_SINGLE, keyword : "StimuliRetestingQuantity"}, - 0x00240044 : { vr : "LT", vm : C.VM_SINGLE, keyword : "CommentsOnPatientPerformanceOfVisualField"}, - 0x00240045 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FalseNegativesEstimateFlag"}, - 0x00240046 : { vr : "FL", vm : C.VM_SINGLE, keyword : "FalseNegativesEstimate"}, - 0x00240048 : { vr : "US", vm : C.VM_SINGLE, keyword : "NegativeCatchTrialsQuantity"}, - 0x00240050 : { vr : "US", vm : C.VM_SINGLE, keyword : "FalseNegativesQuantity"}, - 0x00240051 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExcessiveFalseNegativesDataFlag"}, - 0x00240052 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExcessiveFalseNegatives"}, - 0x00240053 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FalsePositivesEstimateFlag"}, - 0x00240054 : { vr : "FL", vm : C.VM_SINGLE, keyword : "FalsePositivesEstimate"}, - 0x00240055 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CatchTrialsDataFlag"}, - 0x00240056 : { vr : "US", vm : C.VM_SINGLE, keyword : "PositiveCatchTrialsQuantity"}, - 0x00240057 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TestPointNormalsDataFlag"}, - 0x00240058 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TestPointNormalsSequence"}, - 0x00240059 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GlobalDeviationProbabilityNormalsFlag"}, - 0x00240060 : { vr : "US", vm : C.VM_SINGLE, keyword : "FalsePositivesQuantity"}, - 0x00240061 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExcessiveFalsePositivesDataFlag"}, - 0x00240062 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExcessiveFalsePositives"}, - 0x00240063 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VisualFieldTestNormalsFlag"}, - 0x00240064 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ResultsNormalsSequence"}, - 0x00240065 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AgeCorrectedSensitivityDeviationAlgorithmSequence"}, - 0x00240066 : { vr : "FL", vm : C.VM_SINGLE, keyword : "GlobalDeviationFromNormal"}, - 0x00240067 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GeneralizedDefectSensitivityDeviationAlgorithmSequence"}, - 0x00240068 : { vr : "FL", vm : C.VM_SINGLE, keyword : "LocalizedDeviationfromNormal"}, - 0x00240069 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientReliabilityIndicator"}, - 0x00240070 : { vr : "FL", vm : C.VM_SINGLE, keyword : "VisualFieldMeanSensitivity"}, - 0x00240071 : { vr : "FL", vm : C.VM_SINGLE, keyword : "GlobalDeviationProbability"}, - 0x00240072 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LocalDeviationProbabilityNormalsFlag"}, - 0x00240073 : { vr : "FL", vm : C.VM_SINGLE, keyword : "LocalizedDeviationProbability"}, - 0x00240074 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShortTermFluctuationCalculated"}, - 0x00240075 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ShortTermFluctuation"}, - 0x00240076 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShortTermFluctuationProbabilityCalculated"}, - 0x00240077 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ShortTermFluctuationProbability"}, - 0x00240078 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CorrectedLocalizedDeviationFromNormalCalculated"}, - 0x00240079 : { vr : "FL", vm : C.VM_SINGLE, keyword : "CorrectedLocalizedDeviationFromNormal"}, - 0x00240080 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CorrectedLocalizedDeviationFromNormalProbabilityCalculated"}, - 0x00240081 : { vr : "FL", vm : C.VM_SINGLE, keyword : "CorrectedLocalizedDeviationFromNormalProbability"}, - 0x00240083 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GlobalDeviationProbabilitySequence"}, - 0x00240085 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LocalizedDeviationProbabilitySequence"}, - 0x00240086 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FovealSensitivityMeasured"}, - 0x00240087 : { vr : "FL", vm : C.VM_SINGLE, keyword : "FovealSensitivity"}, - 0x00240088 : { vr : "FL", vm : C.VM_SINGLE, keyword : "VisualFieldTestDuration"}, - 0x00240089 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VisualFieldTestPointSequence"}, - 0x00240090 : { vr : "FL", vm : C.VM_SINGLE, keyword : "VisualFieldTestPointXCoordinate"}, - 0x00240091 : { vr : "FL", vm : C.VM_SINGLE, keyword : "VisualFieldTestPointYCoordinate"}, - 0x00240092 : { vr : "FL", vm : C.VM_SINGLE, keyword : "AgeCorrectedSensitivityDeviationValue"}, - 0x00240093 : { vr : "CS", vm : C.VM_SINGLE, keyword : "StimulusResults"}, - 0x00240094 : { vr : "FL", vm : C.VM_SINGLE, keyword : "SensitivityValue"}, - 0x00240095 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RetestStimulusSeen"}, - 0x00240096 : { vr : "FL", vm : C.VM_SINGLE, keyword : "RetestSensitivityValue"}, - 0x00240097 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VisualFieldTestPointNormalsSequence"}, - 0x00240098 : { vr : "FL", vm : C.VM_SINGLE, keyword : "QuantifiedDefect"}, - 0x00240100 : { vr : "FL", vm : C.VM_SINGLE, keyword : "AgeCorrectedSensitivityDeviationProbabilityValue"}, - 0x00240102 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GeneralizedDefectCorrectedSensitivityDeviationFlag"}, - 0x00240103 : { vr : "FL", vm : C.VM_SINGLE, keyword : "GeneralizedDefectCorrectedSensitivityDeviationValue"}, - 0x00240104 : { vr : "FL", vm : C.VM_SINGLE, keyword : "GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue"}, - 0x00240105 : { vr : "FL", vm : C.VM_SINGLE, keyword : "MinimumSensitivityValue"}, - 0x00240106 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BlindSpotLocalized"}, - 0x00240107 : { vr : "FL", vm : C.VM_SINGLE, keyword : "BlindSpotXCoordinate"}, - 0x00240108 : { vr : "FL", vm : C.VM_SINGLE, keyword : "BlindSpotYCoordinate"}, - 0x00240110 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VisualAcuityMeasurementSequence"}, - 0x00240112 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RefractiveParametersUsedOnPatientSequence"}, - 0x00240113 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MeasurementLaterality"}, - 0x00240114 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicPatientClinicalInformationLeftEyeSequence"}, - 0x00240115 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OphthalmicPatientClinicalInformationRightEyeSequence"}, - 0x00240117 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FovealPointNormativeDataFlag"}, - 0x00240118 : { vr : "FL", vm : C.VM_SINGLE, keyword : "FovealPointProbabilityValue"}, - 0x00240120 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ScreeningBaselineMeasured"}, - 0x00240122 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScreeningBaselineMeasuredSequence"}, - 0x00240124 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ScreeningBaselineType"}, - 0x00240126 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ScreeningBaselineValue"}, - 0x00240202 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AlgorithmSource"}, - 0x00240306 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DataSetName"}, - 0x00240307 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DataSetVersion"}, - 0x00240308 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DataSetSource"}, - 0x00240309 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DataSetDescription"}, - 0x00240317 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VisualFieldTestReliabilityGlobalIndexSequence"}, - 0x00240320 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VisualFieldGlobalResultsIndexSequence"}, - 0x00240325 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DataObservationSequence"}, - 0x00240338 : { vr : "CS", vm : C.VM_SINGLE, keyword : "IndexNormalsFlag"}, - 0x00240341 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IndexProbability"}, - 0x00240344 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IndexProbabilitySequence"}, - 0x00280002 : { vr : "US", vm : C.VM_SINGLE, keyword : "SamplesPerPixel"}, - 0x00280003 : { vr : "US", vm : C.VM_SINGLE, keyword : "SamplesPerPixelUsed"}, - 0x00280004 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PhotometricInterpretation"}, - 0x00280005 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageDimensions"}, - 0x00280006 : { vr : "US", vm : C.VM_SINGLE, keyword : "PlanarConfiguration"}, - 0x00280008 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfFrames"}, - 0x00280009 : { vr : "AT", vm : C.VM_1N, keyword : "FrameIncrementPointer"}, - 0x0028000A : { vr : "AT", vm : C.VM_1N, keyword : "FrameDimensionPointer"}, - 0x00280010 : { vr : "US", vm : C.VM_SINGLE, keyword : "Rows"}, - 0x00280011 : { vr : "US", vm : C.VM_SINGLE, keyword : "Columns"}, - 0x00280012 : { vr : "US", vm : C.VM_SINGLE, keyword : "Planes"}, - 0x00280014 : { vr : "US", vm : C.VM_SINGLE, keyword : "UltrasoundColorDataPresent"}, - 0x00280030 : { vr : "DS", vm : C.VM_TWO, keyword : "PixelSpacing"}, - 0x00280031 : { vr : "DS", vm : C.VM_TWO, keyword : "ZoomFactor"}, - 0x00280032 : { vr : "DS", vm : C.VM_TWO, keyword : "ZoomCenter"}, - 0x00280034 : { vr : "IS", vm : C.VM_TWO, keyword : "PixelAspectRatio"}, - 0x00280040 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageFormat"}, - 0x00280050 : { vr : "LO", vm : C.VM_1N, keyword : "ManipulatedImage"}, - 0x00280051 : { vr : "CS", vm : C.VM_1N, keyword : "CorrectedImage"}, - 0x0028005F : { vr : "LO", vm : C.VM_SINGLE, keyword : "CompressionRecognitionCode"}, - 0x00280060 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CompressionCode"}, - 0x00280061 : { vr : "SH", vm : C.VM_SINGLE, keyword : "CompressionOriginator"}, - 0x00280062 : { vr : "LO", vm : C.VM_SINGLE, keyword : "CompressionLabel"}, - 0x00280063 : { vr : "SH", vm : C.VM_SINGLE, keyword : "CompressionDescription"}, - 0x00280065 : { vr : "CS", vm : C.VM_1N, keyword : "CompressionSequence"}, - 0x00280066 : { vr : "AT", vm : C.VM_1N, keyword : "CompressionStepPointers"}, - 0x00280068 : { vr : "US", vm : C.VM_SINGLE, keyword : "RepeatInterval"}, - 0x00280069 : { vr : "US", vm : C.VM_SINGLE, keyword : "BitsGrouped"}, - 0x00280070 : { vr : "US", vm : C.VM_1N, keyword : "PerimeterTable"}, - 0x00280071 : { vr : "US", vm : C.VM_SINGLE, keyword : "PerimeterValue"}, - 0x00280080 : { vr : "US", vm : C.VM_SINGLE, keyword : "PredictorRows"}, - 0x00280081 : { vr : "US", vm : C.VM_SINGLE, keyword : "PredictorColumns"}, - 0x00280082 : { vr : "US", vm : C.VM_1N, keyword : "PredictorConstants"}, - 0x00280090 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BlockedPixels"}, - 0x00280091 : { vr : "US", vm : C.VM_SINGLE, keyword : "BlockRows"}, - 0x00280092 : { vr : "US", vm : C.VM_SINGLE, keyword : "BlockColumns"}, - 0x00280093 : { vr : "US", vm : C.VM_SINGLE, keyword : "RowOverlap"}, - 0x00280094 : { vr : "US", vm : C.VM_SINGLE, keyword : "ColumnOverlap"}, - 0x00280100 : { vr : "US", vm : C.VM_SINGLE, keyword : "BitsAllocated"}, - 0x00280101 : { vr : "US", vm : C.VM_SINGLE, keyword : "BitsStored"}, - 0x00280102 : { vr : "US", vm : C.VM_SINGLE, keyword : "HighBit"}, - 0x00280103 : { vr : "US", vm : C.VM_SINGLE, keyword : "PixelRepresentation"}, - 0x00280104 : { vr : "US", vm : C.VM_SINGLE, keyword : "SmallestValidPixelValue"}, - 0x00280105 : { vr : "US", vm : C.VM_SINGLE, keyword : "LargestValidPixelValue"}, - 0x00280106 : { vr : "US", vm : C.VM_SINGLE, keyword : "SmallestImagePixelValue"}, - 0x00280107 : { vr : "US", vm : C.VM_SINGLE, keyword : "LargestImagePixelValue"}, - 0x00280108 : { vr : "US", vm : C.VM_SINGLE, keyword : "SmallestPixelValueInSeries"}, - 0x00280109 : { vr : "US", vm : C.VM_SINGLE, keyword : "LargestPixelValueInSeries"}, - 0x00280110 : { vr : "US", vm : C.VM_SINGLE, keyword : "SmallestImagePixelValueInPlane"}, - 0x00280111 : { vr : "US", vm : C.VM_SINGLE, keyword : "LargestImagePixelValueInPlane"}, - 0x00280120 : { vr : "US", vm : C.VM_SINGLE, keyword : "PixelPaddingValue"}, - 0x00280121 : { vr : "US", vm : C.VM_SINGLE, keyword : "PixelPaddingRangeLimit"}, - 0x00280200 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageLocation"}, - 0x00280300 : { vr : "CS", vm : C.VM_SINGLE, keyword : "QualityControlImage"}, - 0x00280301 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BurnedInAnnotation"}, - 0x00280302 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RecognizableVisualFeatures"}, - 0x00280303 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LongitudinalTemporalInformationModified"}, - 0x00280400 : { vr : "LO", vm : C.VM_SINGLE, keyword : "TransformLabel"}, - 0x00280401 : { vr : "LO", vm : C.VM_SINGLE, keyword : "TransformVersionNumber"}, - 0x00280402 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfTransformSteps"}, - 0x00280403 : { vr : "LO", vm : C.VM_1N, keyword : "SequenceOfCompressedData"}, - 0x00280404 : { vr : "AT", vm : C.VM_1N, keyword : "DetailsOfCoefficients"}, - 0x00280700 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DCTLabel"}, - 0x00280701 : { vr : "CS", vm : C.VM_1N, keyword : "DataBlockDescription"}, - 0x00280702 : { vr : "AT", vm : C.VM_1N, keyword : "DataBlock"}, - 0x00280710 : { vr : "US", vm : C.VM_SINGLE, keyword : "NormalizationFactorFormat"}, - 0x00280720 : { vr : "US", vm : C.VM_SINGLE, keyword : "ZonalMapNumberFormat"}, - 0x00280721 : { vr : "AT", vm : C.VM_1N, keyword : "ZonalMapLocation"}, - 0x00280722 : { vr : "US", vm : C.VM_SINGLE, keyword : "ZonalMapFormat"}, - 0x00280730 : { vr : "US", vm : C.VM_SINGLE, keyword : "AdaptiveMapFormat"}, - 0x00280740 : { vr : "US", vm : C.VM_SINGLE, keyword : "CodeNumberFormat"}, - 0x00280A02 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PixelSpacingCalibrationType"}, - 0x00280A04 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PixelSpacingCalibrationDescription"}, - 0x00281040 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PixelIntensityRelationship"}, - 0x00281041 : { vr : "SS", vm : C.VM_SINGLE, keyword : "PixelIntensityRelationshipSign"}, - 0x00281050 : { vr : "DS", vm : C.VM_1N, keyword : "WindowCenter"}, - 0x00281051 : { vr : "DS", vm : C.VM_1N, keyword : "WindowWidth"}, - 0x00281052 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RescaleIntercept"}, - 0x00281053 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RescaleSlope"}, - 0x00281054 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RescaleType"}, - 0x00281055 : { vr : "LO", vm : C.VM_1N, keyword : "WindowCenterWidthExplanation"}, - 0x00281056 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VOILUTFunction"}, - 0x00281080 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GrayScale"}, - 0x00281090 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RecommendedViewingMode"}, - 0x00281100 : { vr : "US", vm : C.VM_THREE, keyword : "GrayLookupTableDescriptor"}, - 0x00281101 : { vr : "US", vm : C.VM_THREE, keyword : "RedPaletteColorLookupTableDescriptor"}, - 0x00281102 : { vr : "US", vm : C.VM_THREE, keyword : "GreenPaletteColorLookupTableDescriptor"}, - 0x00281103 : { vr : "US", vm : C.VM_THREE, keyword : "BluePaletteColorLookupTableDescriptor"}, - 0x00281104 : { vr : "US", vm : C.VM_THREE, keyword : "AlphaPaletteColorLookupTableDescriptor"}, - 0x00281111 : { vr : "US", vm : C.VM_FOUR, keyword : "LargeRedPaletteColorLookupTableDescriptor"}, - 0x00281112 : { vr : "US", vm : C.VM_FOUR, keyword : "LargeGreenPaletteColorLookupTableDescriptor"}, - 0x00281113 : { vr : "US", vm : C.VM_FOUR, keyword : "LargeBluePaletteColorLookupTableDescriptor"}, - 0x00281199 : { vr : "UI", vm : C.VM_SINGLE, keyword : "PaletteColorLookupTableUID"}, - 0x00281200 : { vr : "US", vm : C.VM_1N, keyword : "GrayLookupTableData"}, - 0x00281201 : { vr : "OW", vm : C.VM_SINGLE, keyword : "RedPaletteColorLookupTableData"}, - 0x00281202 : { vr : "OW", vm : C.VM_SINGLE, keyword : "GreenPaletteColorLookupTableData"}, - 0x00281203 : { vr : "OW", vm : C.VM_SINGLE, keyword : "BluePaletteColorLookupTableData"}, - 0x00281204 : { vr : "OW", vm : C.VM_SINGLE, keyword : "AlphaPaletteColorLookupTableData"}, - 0x00281211 : { vr : "OW", vm : C.VM_SINGLE, keyword : "LargeRedPaletteColorLookupTableData"}, - 0x00281212 : { vr : "OW", vm : C.VM_SINGLE, keyword : "LargeGreenPaletteColorLookupTableData"}, - 0x00281213 : { vr : "OW", vm : C.VM_SINGLE, keyword : "LargeBluePaletteColorLookupTableData"}, - 0x00281214 : { vr : "UI", vm : C.VM_SINGLE, keyword : "LargePaletteColorLookupTableUID"}, - 0x00281221 : { vr : "OW", vm : C.VM_SINGLE, keyword : "SegmentedRedPaletteColorLookupTableData"}, - 0x00281222 : { vr : "OW", vm : C.VM_SINGLE, keyword : "SegmentedGreenPaletteColorLookupTableData"}, - 0x00281223 : { vr : "OW", vm : C.VM_SINGLE, keyword : "SegmentedBluePaletteColorLookupTableData"}, - 0x00281300 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BreastImplantPresent"}, - 0x00281350 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PartialView"}, - 0x00281351 : { vr : "ST", vm : C.VM_SINGLE, keyword : "PartialViewDescription"}, - 0x00281352 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PartialViewCodeSequence"}, - 0x0028135A : { vr : "CS", vm : C.VM_SINGLE, keyword : "SpatialLocationsPreserved"}, - 0x00281401 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DataFrameAssignmentSequence"}, - 0x00281402 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DataPathAssignment"}, - 0x00281403 : { vr : "US", vm : C.VM_SINGLE, keyword : "BitsMappedToColorLookupTable"}, - 0x00281404 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BlendingLUT1Sequence"}, - 0x00281405 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BlendingLUT1TransferFunction"}, - 0x00281406 : { vr : "FD", vm : C.VM_SINGLE, keyword : "BlendingWeightConstant"}, - 0x00281407 : { vr : "US", vm : C.VM_THREE, keyword : "BlendingLookupTableDescriptor"}, - 0x00281408 : { vr : "OW", vm : C.VM_SINGLE, keyword : "BlendingLookupTableData"}, - 0x0028140B : { vr : "SQ", vm : C.VM_SINGLE, keyword : "EnhancedPaletteColorLookupTableSequence"}, - 0x0028140C : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BlendingLUT2Sequence"}, - 0x0028140D : { vr : "CS", vm : C.VM_SINGLE, keyword : "BlendingLUT2TransferFunction"}, - 0x0028140E : { vr : "CS", vm : C.VM_SINGLE, keyword : "DataPathID"}, - 0x0028140F : { vr : "CS", vm : C.VM_SINGLE, keyword : "RGBLUTTransferFunction"}, - 0x00281410 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AlphaLUTTransferFunction"}, - 0x00282000 : { vr : "OB", vm : C.VM_SINGLE, keyword : "ICCProfile"}, - 0x00282110 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LossyImageCompression"}, - 0x00282112 : { vr : "DS", vm : C.VM_1N, keyword : "LossyImageCompressionRatio"}, - 0x00282114 : { vr : "CS", vm : C.VM_1N, keyword : "LossyImageCompressionMethod"}, - 0x00283000 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ModalityLUTSequence"}, - 0x00283002 : { vr : "US", vm : C.VM_THREE, keyword : "LUTDescriptor"}, - 0x00283003 : { vr : "LO", vm : C.VM_SINGLE, keyword : "LUTExplanation"}, - 0x00283004 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ModalityLUTType"}, - 0x00283006 : { vr : "US", vm : C.VM_1N, keyword : "LUTData"}, - 0x00283010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VOILUTSequence"}, - 0x00283110 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SoftcopyVOILUTSequence"}, - 0x00284000 : { vr : "LT", vm : C.VM_SINGLE, keyword : "ImagePresentationComments"}, - 0x00285000 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BiPlaneAcquisitionSequence"}, - 0x00286010 : { vr : "US", vm : C.VM_SINGLE, keyword : "RepresentativeFrameNumber"}, - 0x00286020 : { vr : "US", vm : C.VM_1N, keyword : "FrameNumbersOfInterest"}, - 0x00286022 : { vr : "LO", vm : C.VM_1N, keyword : "FrameOfInterestDescription"}, - 0x00286023 : { vr : "CS", vm : C.VM_1N, keyword : "FrameOfInterestType"}, - 0x00286030 : { vr : "US", vm : C.VM_1N, keyword : "MaskPointers"}, - 0x00286040 : { vr : "US", vm : C.VM_1N, keyword : "RWavePointer"}, - 0x00286100 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MaskSubtractionSequence"}, - 0x00286101 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MaskOperation"}, - 0x00286102 : { vr : "US", vm : C.VM_2_2N, keyword : "ApplicableFrameRange"}, - 0x00286110 : { vr : "US", vm : C.VM_1N, keyword : "MaskFrameNumbers"}, - 0x00286112 : { vr : "US", vm : C.VM_SINGLE, keyword : "ContrastFrameAveraging"}, - 0x00286114 : { vr : "FL", vm : C.VM_TWO, keyword : "MaskSubPixelShift"}, - 0x00286120 : { vr : "SS", vm : C.VM_SINGLE, keyword : "TIDOffset"}, - 0x00286190 : { vr : "ST", vm : C.VM_SINGLE, keyword : "MaskOperationExplanation"}, - 0x00287FE0 : { vr : "UT", vm : C.VM_SINGLE, keyword : "PixelDataProviderURL"}, - 0x00289001 : { vr : "UL", vm : C.VM_SINGLE, keyword : "DataPointRows"}, - 0x00289002 : { vr : "UL", vm : C.VM_SINGLE, keyword : "DataPointColumns"}, - 0x00289003 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SignalDomainColumns"}, - 0x00289099 : { vr : "US", vm : C.VM_SINGLE, keyword : "LargestMonochromePixelValue"}, - 0x00289108 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DataRepresentation"}, - 0x00289110 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PixelMeasuresSequence"}, - 0x00289132 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FrameVOILUTSequence"}, - 0x00289145 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PixelValueTransformationSequence"}, - 0x00289235 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SignalDomainRows"}, - 0x00289411 : { vr : "FL", vm : C.VM_SINGLE, keyword : "DisplayFilterPercentage"}, - 0x00289415 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FramePixelShiftSequence"}, - 0x00289416 : { vr : "US", vm : C.VM_SINGLE, keyword : "SubtractionItemID"}, - 0x00289422 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PixelIntensityRelationshipLUTSequence"}, - 0x00289443 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FramePixelDataPropertiesSequence"}, - 0x00289444 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GeometricalProperties"}, - 0x00289445 : { vr : "FL", vm : C.VM_SINGLE, keyword : "GeometricMaximumDistortion"}, - 0x00289446 : { vr : "CS", vm : C.VM_1N, keyword : "ImageProcessingApplied"}, - 0x00289454 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MaskSelectionMode"}, - 0x00289474 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LUTFunction"}, - 0x00289478 : { vr : "FL", vm : C.VM_SINGLE, keyword : "MaskVisibilityPercentage"}, - 0x00289501 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PixelShiftSequence"}, - 0x00289502 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RegionPixelShiftSequence"}, - 0x00289503 : { vr : "SS", vm : C.VM_2_2N, keyword : "VerticesOfTheRegion"}, - 0x00289505 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MultiFramePresentationSequence"}, - 0x00289506 : { vr : "US", vm : C.VM_2_2N, keyword : "PixelShiftFrameRange"}, - 0x00289507 : { vr : "US", vm : C.VM_2_2N, keyword : "LUTFrameRange"}, - 0x00289520 : { vr : "DS", vm : C.VM_16, keyword : "ImageToEquipmentMappingMatrix"}, - 0x00289537 : { vr : "CS", vm : C.VM_SINGLE, keyword : "EquipmentCoordinateSystemIdentification"}, - 0x0032000A : { vr : "CS", vm : C.VM_SINGLE, keyword : "StudyStatusID"}, - 0x0032000C : { vr : "CS", vm : C.VM_SINGLE, keyword : "StudyPriorityID"}, - 0x00320012 : { vr : "LO", vm : C.VM_SINGLE, keyword : "StudyIDIssuer"}, - 0x00320032 : { vr : "DA", vm : C.VM_SINGLE, keyword : "StudyVerifiedDate"}, - 0x00320033 : { vr : "TM", vm : C.VM_SINGLE, keyword : "StudyVerifiedTime"}, - 0x00320034 : { vr : "DA", vm : C.VM_SINGLE, keyword : "StudyReadDate"}, - 0x00320035 : { vr : "TM", vm : C.VM_SINGLE, keyword : "StudyReadTime"}, - 0x00321000 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ScheduledStudyStartDate"}, - 0x00321001 : { vr : "TM", vm : C.VM_SINGLE, keyword : "ScheduledStudyStartTime"}, - 0x00321010 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ScheduledStudyStopDate"}, - 0x00321011 : { vr : "TM", vm : C.VM_SINGLE, keyword : "ScheduledStudyStopTime"}, - 0x00321020 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ScheduledStudyLocation"}, - 0x00321021 : { vr : "AE", vm : C.VM_1N, keyword : "ScheduledStudyLocationAETitle"}, - 0x00321030 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ReasonForStudy"}, - 0x00321031 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RequestingPhysicianIdentificationSequence"}, - 0x00321032 : { vr : "PN", vm : C.VM_SINGLE, keyword : "RequestingPhysician"}, - 0x00321033 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RequestingService"}, - 0x00321034 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RequestingServiceCodeSequence"}, - 0x00321040 : { vr : "DA", vm : C.VM_SINGLE, keyword : "StudyArrivalDate"}, - 0x00321041 : { vr : "TM", vm : C.VM_SINGLE, keyword : "StudyArrivalTime"}, - 0x00321050 : { vr : "DA", vm : C.VM_SINGLE, keyword : "StudyCompletionDate"}, - 0x00321051 : { vr : "TM", vm : C.VM_SINGLE, keyword : "StudyCompletionTime"}, - 0x00321055 : { vr : "CS", vm : C.VM_SINGLE, keyword : "StudyComponentStatusID"}, - 0x00321060 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RequestedProcedureDescription"}, - 0x00321064 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RequestedProcedureCodeSequence"}, - 0x00321070 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RequestedContrastAgent"}, - 0x00324000 : { vr : "LT", vm : C.VM_SINGLE, keyword : "StudyComments"}, - 0x00380004 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedPatientAliasSequence"}, - 0x00380008 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VisitStatusID"}, - 0x00380010 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AdmissionID"}, - 0x00380011 : { vr : "LO", vm : C.VM_SINGLE, keyword : "IssuerOfAdmissionID"}, - 0x00380014 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IssuerOfAdmissionIDSequence"}, - 0x00380016 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RouteOfAdmissions"}, - 0x0038001A : { vr : "DA", vm : C.VM_SINGLE, keyword : "ScheduledAdmissionDate"}, - 0x0038001B : { vr : "TM", vm : C.VM_SINGLE, keyword : "ScheduledAdmissionTime"}, - 0x0038001C : { vr : "DA", vm : C.VM_SINGLE, keyword : "ScheduledDischargeDate"}, - 0x0038001D : { vr : "TM", vm : C.VM_SINGLE, keyword : "ScheduledDischargeTime"}, - 0x0038001E : { vr : "LO", vm : C.VM_SINGLE, keyword : "ScheduledPatientInstitutionResidence"}, - 0x00380020 : { vr : "DA", vm : C.VM_SINGLE, keyword : "AdmittingDate"}, - 0x00380021 : { vr : "TM", vm : C.VM_SINGLE, keyword : "AdmittingTime"}, - 0x00380030 : { vr : "DA", vm : C.VM_SINGLE, keyword : "DischargeDate"}, - 0x00380032 : { vr : "TM", vm : C.VM_SINGLE, keyword : "DischargeTime"}, - 0x00380040 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DischargeDiagnosisDescription"}, - 0x00380044 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DischargeDiagnosisCodeSequence"}, - 0x00380050 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SpecialNeeds"}, - 0x00380060 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ServiceEpisodeID"}, - 0x00380061 : { vr : "LO", vm : C.VM_SINGLE, keyword : "IssuerOfServiceEpisodeID"}, - 0x00380062 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ServiceEpisodeDescription"}, - 0x00380064 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IssuerOfServiceEpisodeIDSequence"}, - 0x00380100 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PertinentDocumentsSequence"}, - 0x00380300 : { vr : "LO", vm : C.VM_SINGLE, keyword : "CurrentPatientLocation"}, - 0x00380400 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientInstitutionResidence"}, - 0x00380500 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientState"}, - 0x00380502 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientClinicalTrialParticipationSequence"}, - 0x00384000 : { vr : "LT", vm : C.VM_SINGLE, keyword : "VisitComments"}, - 0x003A0004 : { vr : "CS", vm : C.VM_SINGLE, keyword : "WaveformOriginality"}, - 0x003A0005 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfWaveformChannels"}, - 0x003A0010 : { vr : "UL", vm : C.VM_SINGLE, keyword : "NumberOfWaveformSamples"}, - 0x003A001A : { vr : "DS", vm : C.VM_SINGLE, keyword : "SamplingFrequency"}, - 0x003A0020 : { vr : "SH", vm : C.VM_SINGLE, keyword : "MultiplexGroupLabel"}, - 0x003A0200 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ChannelDefinitionSequence"}, - 0x003A0202 : { vr : "IS", vm : C.VM_SINGLE, keyword : "WaveformChannelNumber"}, - 0x003A0203 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ChannelLabel"}, - 0x003A0205 : { vr : "CS", vm : C.VM_1N, keyword : "ChannelStatus"}, - 0x003A0208 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ChannelSourceSequence"}, - 0x003A0209 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ChannelSourceModifiersSequence"}, - 0x003A020A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SourceWaveformSequence"}, - 0x003A020C : { vr : "LO", vm : C.VM_SINGLE, keyword : "ChannelDerivationDescription"}, - 0x003A0210 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ChannelSensitivity"}, - 0x003A0211 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ChannelSensitivityUnitsSequence"}, - 0x003A0212 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ChannelSensitivityCorrectionFactor"}, - 0x003A0213 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ChannelBaseline"}, - 0x003A0214 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ChannelTimeSkew"}, - 0x003A0215 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ChannelSampleSkew"}, - 0x003A0218 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ChannelOffset"}, - 0x003A021A : { vr : "US", vm : C.VM_SINGLE, keyword : "WaveformBitsStored"}, - 0x003A0220 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FilterLowFrequency"}, - 0x003A0221 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FilterHighFrequency"}, - 0x003A0222 : { vr : "DS", vm : C.VM_SINGLE, keyword : "NotchFilterFrequency"}, - 0x003A0223 : { vr : "DS", vm : C.VM_SINGLE, keyword : "NotchFilterBandwidth"}, - 0x003A0230 : { vr : "FL", vm : C.VM_SINGLE, keyword : "WaveformDataDisplayScale"}, - 0x003A0231 : { vr : "US", vm : C.VM_THREE, keyword : "WaveformDisplayBackgroundCIELabValue"}, - 0x003A0240 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "WaveformPresentationGroupSequence"}, - 0x003A0241 : { vr : "US", vm : C.VM_SINGLE, keyword : "PresentationGroupNumber"}, - 0x003A0242 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ChannelDisplaySequence"}, - 0x003A0244 : { vr : "US", vm : C.VM_THREE, keyword : "ChannelRecommendedDisplayCIELabValue"}, - 0x003A0245 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ChannelPosition"}, - 0x003A0246 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DisplayShadingFlag"}, - 0x003A0247 : { vr : "FL", vm : C.VM_SINGLE, keyword : "FractionalChannelDisplayScale"}, - 0x003A0248 : { vr : "FL", vm : C.VM_SINGLE, keyword : "AbsoluteChannelDisplayScale"}, - 0x003A0300 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MultiplexedAudioChannelsDescriptionCodeSequence"}, - 0x003A0301 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ChannelIdentificationCode"}, - 0x003A0302 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ChannelMode"}, - 0x00400001 : { vr : "AE", vm : C.VM_1N, keyword : "ScheduledStationAETitle"}, - 0x00400002 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepStartDate"}, - 0x00400003 : { vr : "TM", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepStartTime"}, - 0x00400004 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepEndDate"}, - 0x00400005 : { vr : "TM", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepEndTime"}, - 0x00400006 : { vr : "PN", vm : C.VM_SINGLE, keyword : "ScheduledPerformingPhysicianName"}, - 0x00400007 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepDescription"}, - 0x00400008 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledProtocolCodeSequence"}, - 0x00400009 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepID"}, - 0x0040000A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "StageCodeSequence"}, - 0x0040000B : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledPerformingPhysicianIdentificationSequence"}, - 0x00400010 : { vr : "SH", vm : C.VM_1N, keyword : "ScheduledStationName"}, - 0x00400011 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepLocation"}, - 0x00400012 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PreMedication"}, - 0x00400020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepStatus"}, - 0x00400026 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OrderPlacerIdentifierSequence"}, - 0x00400027 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OrderFillerIdentifierSequence"}, - 0x00400031 : { vr : "UT", vm : C.VM_SINGLE, keyword : "LocalNamespaceEntityID"}, - 0x00400032 : { vr : "UT", vm : C.VM_SINGLE, keyword : "UniversalEntityID"}, - 0x00400033 : { vr : "CS", vm : C.VM_SINGLE, keyword : "UniversalEntityIDType"}, - 0x00400035 : { vr : "CS", vm : C.VM_SINGLE, keyword : "IdentifierTypeCode"}, - 0x00400036 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AssigningFacilitySequence"}, - 0x00400039 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AssigningJurisdictionCodeSequence"}, - 0x0040003A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AssigningAgencyOrDepartmentCodeSequence"}, - 0x00400100 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepSequence"}, - 0x00400220 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedNonImageCompositeSOPInstanceSequence"}, - 0x00400241 : { vr : "AE", vm : C.VM_SINGLE, keyword : "PerformedStationAETitle"}, - 0x00400242 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PerformedStationName"}, - 0x00400243 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PerformedLocation"}, - 0x00400244 : { vr : "DA", vm : C.VM_SINGLE, keyword : "PerformedProcedureStepStartDate"}, - 0x00400245 : { vr : "TM", vm : C.VM_SINGLE, keyword : "PerformedProcedureStepStartTime"}, - 0x00400250 : { vr : "DA", vm : C.VM_SINGLE, keyword : "PerformedProcedureStepEndDate"}, - 0x00400251 : { vr : "TM", vm : C.VM_SINGLE, keyword : "PerformedProcedureStepEndTime"}, - 0x00400252 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PerformedProcedureStepStatus"}, - 0x00400253 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PerformedProcedureStepID"}, - 0x00400254 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PerformedProcedureStepDescription"}, - 0x00400255 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PerformedProcedureTypeDescription"}, - 0x00400260 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformedProtocolCodeSequence"}, - 0x00400261 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PerformedProtocolType"}, - 0x00400270 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledStepAttributesSequence"}, - 0x00400275 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RequestAttributesSequence"}, - 0x00400280 : { vr : "ST", vm : C.VM_SINGLE, keyword : "CommentsOnThePerformedProcedureStep"}, - 0x00400281 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformedProcedureStepDiscontinuationReasonCodeSequence"}, - 0x00400293 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "QuantitySequence"}, - 0x00400294 : { vr : "DS", vm : C.VM_SINGLE, keyword : "Quantity"}, - 0x00400295 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MeasuringUnitsSequence"}, - 0x00400296 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BillingItemSequence"}, - 0x00400300 : { vr : "US", vm : C.VM_SINGLE, keyword : "TotalTimeOfFluoroscopy"}, - 0x00400301 : { vr : "US", vm : C.VM_SINGLE, keyword : "TotalNumberOfExposures"}, - 0x00400302 : { vr : "US", vm : C.VM_SINGLE, keyword : "EntranceDose"}, - 0x00400303 : { vr : "US", vm : C.VM_1_2, keyword : "ExposedArea"}, - 0x00400306 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DistanceSourceToEntrance"}, - 0x00400307 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DistanceSourceToSupport"}, - 0x0040030E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ExposureDoseSequence"}, - 0x00400310 : { vr : "ST", vm : C.VM_SINGLE, keyword : "CommentsOnRadiationDose"}, - 0x00400312 : { vr : "DS", vm : C.VM_SINGLE, keyword : "XRayOutput"}, - 0x00400314 : { vr : "DS", vm : C.VM_SINGLE, keyword : "HalfValueLayer"}, - 0x00400316 : { vr : "DS", vm : C.VM_SINGLE, keyword : "OrganDose"}, - 0x00400318 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OrganExposed"}, - 0x00400320 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BillingProcedureStepSequence"}, - 0x00400321 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FilmConsumptionSequence"}, - 0x00400324 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BillingSuppliesAndDevicesSequence"}, - 0x00400330 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedProcedureStepSequence"}, - 0x00400340 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformedSeriesSequence"}, - 0x00400400 : { vr : "LT", vm : C.VM_SINGLE, keyword : "CommentsOnTheScheduledProcedureStep"}, - 0x00400440 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProtocolContextSequence"}, - 0x00400441 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContentItemModifierSequence"}, - 0x00400500 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledSpecimenSequence"}, - 0x0040050A : { vr : "LO", vm : C.VM_SINGLE, keyword : "SpecimenAccessionNumber"}, - 0x00400512 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ContainerIdentifier"}, - 0x00400513 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IssuerOfTheContainerIdentifierSequence"}, - 0x00400515 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AlternateContainerIdentifierSequence"}, - 0x00400518 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContainerTypeCodeSequence"}, - 0x0040051A : { vr : "LO", vm : C.VM_SINGLE, keyword : "ContainerDescription"}, - 0x00400520 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContainerComponentSequence"}, - 0x00400550 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SpecimenSequence"}, - 0x00400551 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SpecimenIdentifier"}, - 0x00400552 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SpecimenDescriptionSequenceTrial"}, - 0x00400553 : { vr : "ST", vm : C.VM_SINGLE, keyword : "SpecimenDescriptionTrial"}, - 0x00400554 : { vr : "UI", vm : C.VM_SINGLE, keyword : "SpecimenUID"}, - 0x00400555 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AcquisitionContextSequence"}, - 0x00400556 : { vr : "ST", vm : C.VM_SINGLE, keyword : "AcquisitionContextDescription"}, - 0x0040059A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SpecimenTypeCodeSequence"}, - 0x00400560 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SpecimenDescriptionSequence"}, - 0x00400562 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IssuerOfTheSpecimenIdentifierSequence"}, - 0x00400600 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SpecimenShortDescription"}, - 0x00400602 : { vr : "UT", vm : C.VM_SINGLE, keyword : "SpecimenDetailedDescription"}, - 0x00400610 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SpecimenPreparationSequence"}, - 0x00400612 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SpecimenPreparationStepContentItemSequence"}, - 0x00400620 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SpecimenLocalizationContentItemSequence"}, - 0x004006FA : { vr : "LO", vm : C.VM_SINGLE, keyword : "SlideIdentifier"}, - 0x0040071A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImageCenterPointCoordinatesSequence"}, - 0x0040072A : { vr : "DS", vm : C.VM_SINGLE, keyword : "XOffsetInSlideCoordinateSystem"}, - 0x0040073A : { vr : "DS", vm : C.VM_SINGLE, keyword : "YOffsetInSlideCoordinateSystem"}, - 0x0040074A : { vr : "DS", vm : C.VM_SINGLE, keyword : "ZOffsetInSlideCoordinateSystem"}, - 0x004008D8 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PixelSpacingSequence"}, - 0x004008DA : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CoordinateSystemAxisCodeSequence"}, - 0x004008EA : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MeasurementUnitsCodeSequence"}, - 0x004009F8 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VitalStainCodeSequenceTrial"}, - 0x00401001 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RequestedProcedureID"}, - 0x00401002 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ReasonForTheRequestedProcedure"}, - 0x00401003 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RequestedProcedurePriority"}, - 0x00401004 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientTransportArrangements"}, - 0x00401005 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RequestedProcedureLocation"}, - 0x00401006 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PlacerOrderNumberProcedure"}, - 0x00401007 : { vr : "SH", vm : C.VM_SINGLE, keyword : "FillerOrderNumberProcedure"}, - 0x00401008 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ConfidentialityCode"}, - 0x00401009 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ReportingPriority"}, - 0x0040100A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReasonForRequestedProcedureCodeSequence"}, - 0x00401010 : { vr : "PN", vm : C.VM_1N, keyword : "NamesOfIntendedRecipientsOfResults"}, - 0x00401011 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IntendedRecipientsOfResultsIdentificationSequence"}, - 0x00401012 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReasonForPerformedProcedureCodeSequence"}, - 0x00401060 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RequestedProcedureDescriptionTrial"}, - 0x00401101 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PersonIdentificationCodeSequence"}, - 0x00401102 : { vr : "ST", vm : C.VM_SINGLE, keyword : "PersonAddress"}, - 0x00401103 : { vr : "LO", vm : C.VM_1N, keyword : "PersonTelephoneNumbers"}, - 0x00401400 : { vr : "LT", vm : C.VM_SINGLE, keyword : "RequestedProcedureComments"}, - 0x00402001 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ReasonForTheImagingServiceRequest"}, - 0x00402004 : { vr : "DA", vm : C.VM_SINGLE, keyword : "IssueDateOfImagingServiceRequest"}, - 0x00402005 : { vr : "TM", vm : C.VM_SINGLE, keyword : "IssueTimeOfImagingServiceRequest"}, - 0x00402006 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PlacerOrderNumberImagingServiceRequestRetired"}, - 0x00402007 : { vr : "SH", vm : C.VM_SINGLE, keyword : "FillerOrderNumberImagingServiceRequestRetired"}, - 0x00402008 : { vr : "PN", vm : C.VM_SINGLE, keyword : "OrderEnteredBy"}, - 0x00402009 : { vr : "SH", vm : C.VM_SINGLE, keyword : "OrderEntererLocation"}, - 0x00402010 : { vr : "SH", vm : C.VM_SINGLE, keyword : "OrderCallbackPhoneNumber"}, - 0x00402016 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PlacerOrderNumberImagingServiceRequest"}, - 0x00402017 : { vr : "LO", vm : C.VM_SINGLE, keyword : "FillerOrderNumberImagingServiceRequest"}, - 0x00402400 : { vr : "LT", vm : C.VM_SINGLE, keyword : "ImagingServiceRequestComments"}, - 0x00403001 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ConfidentialityConstraintOnPatientDataDescription"}, - 0x00404001 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GeneralPurposeScheduledProcedureStepStatus"}, - 0x00404002 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GeneralPurposePerformedProcedureStepStatus"}, - 0x00404003 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GeneralPurposeScheduledProcedureStepPriority"}, - 0x00404004 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledProcessingApplicationsCodeSequence"}, - 0x00404005 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepStartDateTime"}, - 0x00404006 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MultipleCopiesFlag"}, - 0x00404007 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformedProcessingApplicationsCodeSequence"}, - 0x00404009 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "HumanPerformerCodeSequence"}, - 0x00404010 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepModificationDateTime"}, - 0x00404011 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ExpectedCompletionDateTime"}, - 0x00404015 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ResultingGeneralPurposePerformedProcedureStepsSequence"}, - 0x00404016 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedGeneralPurposeScheduledProcedureStepSequence"}, - 0x00404018 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledWorkitemCodeSequence"}, - 0x00404019 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformedWorkitemCodeSequence"}, - 0x00404020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InputAvailabilityFlag"}, - 0x00404021 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "InputInformationSequence"}, - 0x00404022 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RelevantInformationSequence"}, - 0x00404023 : { vr : "UI", vm : C.VM_SINGLE, keyword : "ReferencedGeneralPurposeScheduledProcedureStepTransactionUID"}, - 0x00404025 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledStationNameCodeSequence"}, - 0x00404026 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledStationClassCodeSequence"}, - 0x00404027 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledStationGeographicLocationCodeSequence"}, - 0x00404028 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformedStationNameCodeSequence"}, - 0x00404029 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformedStationClassCodeSequence"}, - 0x00404030 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformedStationGeographicLocationCodeSequence"}, - 0x00404031 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RequestedSubsequentWorkitemCodeSequence"}, - 0x00404032 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "NonDICOMOutputCodeSequence"}, - 0x00404033 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OutputInformationSequence"}, - 0x00404034 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledHumanPerformersSequence"}, - 0x00404035 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ActualHumanPerformersSequence"}, - 0x00404036 : { vr : "LO", vm : C.VM_SINGLE, keyword : "HumanPerformerOrganization"}, - 0x00404037 : { vr : "PN", vm : C.VM_SINGLE, keyword : "HumanPerformerName"}, - 0x00404040 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RawDataHandling"}, - 0x00404041 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InputReadinessState"}, - 0x00404050 : { vr : "DT", vm : C.VM_SINGLE, keyword : "PerformedProcedureStepStartDateTime"}, - 0x00404051 : { vr : "DT", vm : C.VM_SINGLE, keyword : "PerformedProcedureStepEndDateTime"}, - 0x00404052 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ProcedureStepCancellationDateTime"}, - 0x00408302 : { vr : "DS", vm : C.VM_SINGLE, keyword : "EntranceDoseInmGy"}, - 0x00409094 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedImageRealWorldValueMappingSequence"}, - 0x00409096 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RealWorldValueMappingSequence"}, - 0x00409098 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PixelValueMappingCodeSequence"}, - 0x00409210 : { vr : "SH", vm : C.VM_SINGLE, keyword : "LUTLabel"}, - 0x00409211 : { vr : "US", vm : C.VM_SINGLE, keyword : "RealWorldValueLastValueMapped"}, - 0x00409212 : { vr : "FD", vm : C.VM_1N, keyword : "RealWorldValueLUTData"}, - 0x00409216 : { vr : "US", vm : C.VM_SINGLE, keyword : "RealWorldValueFirstValueMapped"}, - 0x00409224 : { vr : "FD", vm : C.VM_SINGLE, keyword : "RealWorldValueIntercept"}, - 0x00409225 : { vr : "FD", vm : C.VM_SINGLE, keyword : "RealWorldValueSlope"}, - 0x0040A007 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FindingsFlagTrial"}, - 0x0040A010 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RelationshipType"}, - 0x0040A020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FindingsSequenceTrial"}, - 0x0040A021 : { vr : "UI", vm : C.VM_SINGLE, keyword : "FindingsGroupUIDTrial"}, - 0x0040A022 : { vr : "UI", vm : C.VM_SINGLE, keyword : "ReferencedFindingsGroupUIDTrial"}, - 0x0040A023 : { vr : "DA", vm : C.VM_SINGLE, keyword : "FindingsGroupRecordingDateTrial"}, - 0x0040A024 : { vr : "TM", vm : C.VM_SINGLE, keyword : "FindingsGroupRecordingTimeTrial"}, - 0x0040A026 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FindingsSourceCategoryCodeSequenceTrial"}, - 0x0040A027 : { vr : "LO", vm : C.VM_SINGLE, keyword : "VerifyingOrganization"}, - 0x0040A028 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DocumentingOrganizationIdentifierCodeSequenceTrial"}, - 0x0040A030 : { vr : "DT", vm : C.VM_SINGLE, keyword : "VerificationDateTime"}, - 0x0040A032 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ObservationDateTime"}, - 0x0040A040 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ValueType"}, - 0x0040A043 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ConceptNameCodeSequence"}, - 0x0040A047 : { vr : "LO", vm : C.VM_SINGLE, keyword : "MeasurementPrecisionDescriptionTrial"}, - 0x0040A050 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContinuityOfContent"}, - 0x0040A057 : { vr : "CS", vm : C.VM_1N, keyword : "UrgencyOrPriorityAlertsTrial"}, - 0x0040A060 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SequencingIndicatorTrial"}, - 0x0040A066 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DocumentIdentifierCodeSequenceTrial"}, - 0x0040A067 : { vr : "PN", vm : C.VM_SINGLE, keyword : "DocumentAuthorTrial"}, - 0x0040A068 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DocumentAuthorIdentifierCodeSequenceTrial"}, - 0x0040A070 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IdentifierCodeSequenceTrial"}, - 0x0040A073 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VerifyingObserverSequence"}, - 0x0040A074 : { vr : "OB", vm : C.VM_SINGLE, keyword : "ObjectBinaryIdentifierTrial"}, - 0x0040A075 : { vr : "PN", vm : C.VM_SINGLE, keyword : "VerifyingObserverName"}, - 0x0040A076 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DocumentingObserverIdentifierCodeSequenceTrial"}, - 0x0040A078 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AuthorObserverSequence"}, - 0x0040A07A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ParticipantSequence"}, - 0x0040A07C : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CustodialOrganizationSequence"}, - 0x0040A080 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ParticipationType"}, - 0x0040A082 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ParticipationDateTime"}, - 0x0040A084 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ObserverType"}, - 0x0040A085 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProcedureIdentifierCodeSequenceTrial"}, - 0x0040A088 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VerifyingObserverIdentificationCodeSequence"}, - 0x0040A089 : { vr : "OB", vm : C.VM_SINGLE, keyword : "ObjectDirectoryBinaryIdentifierTrial"}, - 0x0040A090 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "EquivalentCDADocumentSequence"}, - 0x0040A0B0 : { vr : "US", vm : C.VM_2_2N, keyword : "ReferencedWaveformChannels"}, - 0x0040A110 : { vr : "DA", vm : C.VM_SINGLE, keyword : "DateOfDocumentOrVerbalTransactionTrial"}, - 0x0040A112 : { vr : "TM", vm : C.VM_SINGLE, keyword : "TimeOfDocumentCreationOrVerbalTransactionTrial"}, - 0x0040A120 : { vr : "DT", vm : C.VM_SINGLE, keyword : "DateTime"}, - 0x0040A121 : { vr : "DA", vm : C.VM_SINGLE, keyword : "Date"}, - 0x0040A122 : { vr : "TM", vm : C.VM_SINGLE, keyword : "Time"}, - 0x0040A123 : { vr : "PN", vm : C.VM_SINGLE, keyword : "PersonName"}, - 0x0040A124 : { vr : "UI", vm : C.VM_SINGLE, keyword : "UID"}, - 0x0040A125 : { vr : "CS", vm : C.VM_TWO, keyword : "ReportStatusIDTrial"}, - 0x0040A130 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TemporalRangeType"}, - 0x0040A132 : { vr : "UL", vm : C.VM_1N, keyword : "ReferencedSamplePositions"}, - 0x0040A136 : { vr : "US", vm : C.VM_1N, keyword : "ReferencedFrameNumbers"}, - 0x0040A138 : { vr : "DS", vm : C.VM_1N, keyword : "ReferencedTimeOffsets"}, - 0x0040A13A : { vr : "DT", vm : C.VM_1N, keyword : "ReferencedDateTime"}, - 0x0040A160 : { vr : "UT", vm : C.VM_SINGLE, keyword : "TextValue"}, - 0x0040A167 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ObservationCategoryCodeSequenceTrial"}, - 0x0040A168 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ConceptCodeSequence"}, - 0x0040A16A : { vr : "ST", vm : C.VM_SINGLE, keyword : "BibliographicCitationTrial"}, - 0x0040A170 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PurposeOfReferenceCodeSequence"}, - 0x0040A171 : { vr : "UI", vm : C.VM_SINGLE, keyword : "ObservationUIDTrial"}, - 0x0040A172 : { vr : "UI", vm : C.VM_SINGLE, keyword : "ReferencedObservationUIDTrial"}, - 0x0040A173 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReferencedObservationClassTrial"}, - 0x0040A174 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReferencedObjectObservationClassTrial"}, - 0x0040A180 : { vr : "US", vm : C.VM_SINGLE, keyword : "AnnotationGroupNumber"}, - 0x0040A192 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ObservationDateTrial"}, - 0x0040A193 : { vr : "TM", vm : C.VM_SINGLE, keyword : "ObservationTimeTrial"}, - 0x0040A194 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MeasurementAutomationTrial"}, - 0x0040A195 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ModifierCodeSequence"}, - 0x0040A224 : { vr : "ST", vm : C.VM_SINGLE, keyword : "IdentificationDescriptionTrial"}, - 0x0040A290 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CoordinatesSetGeometricTypeTrial"}, - 0x0040A296 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AlgorithmCodeSequenceTrial"}, - 0x0040A297 : { vr : "ST", vm : C.VM_SINGLE, keyword : "AlgorithmDescriptionTrial"}, - 0x0040A29A : { vr : "SL", vm : C.VM_2_2N, keyword : "PixelCoordinatesSetTrial"}, - 0x0040A300 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MeasuredValueSequence"}, - 0x0040A301 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "NumericValueQualifierCodeSequence"}, - 0x0040A307 : { vr : "PN", vm : C.VM_SINGLE, keyword : "CurrentObserverTrial"}, - 0x0040A30A : { vr : "DS", vm : C.VM_1N, keyword : "NumericValue"}, - 0x0040A313 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedAccessionSequenceTrial"}, - 0x0040A33A : { vr : "ST", vm : C.VM_SINGLE, keyword : "ReportStatusCommentTrial"}, - 0x0040A340 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProcedureContextSequenceTrial"}, - 0x0040A352 : { vr : "PN", vm : C.VM_SINGLE, keyword : "VerbalSourceTrial"}, - 0x0040A353 : { vr : "ST", vm : C.VM_SINGLE, keyword : "AddressTrial"}, - 0x0040A354 : { vr : "LO", vm : C.VM_SINGLE, keyword : "TelephoneNumberTrial"}, - 0x0040A358 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VerbalSourceIdentifierCodeSequenceTrial"}, - 0x0040A360 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PredecessorDocumentsSequence"}, - 0x0040A370 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedRequestSequence"}, - 0x0040A372 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformedProcedureCodeSequence"}, - 0x0040A375 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CurrentRequestedProcedureEvidenceSequence"}, - 0x0040A380 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReportDetailSequenceTrial"}, - 0x0040A385 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PertinentOtherEvidenceSequence"}, - 0x0040A390 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "HL7StructuredDocumentReferenceSequence"}, - 0x0040A402 : { vr : "UI", vm : C.VM_SINGLE, keyword : "ObservationSubjectUIDTrial"}, - 0x0040A403 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ObservationSubjectClassTrial"}, - 0x0040A404 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ObservationSubjectTypeCodeSequenceTrial"}, - 0x0040A491 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CompletionFlag"}, - 0x0040A492 : { vr : "LO", vm : C.VM_SINGLE, keyword : "CompletionFlagDescription"}, - 0x0040A493 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VerificationFlag"}, - 0x0040A494 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ArchiveRequested"}, - 0x0040A496 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PreliminaryFlag"}, - 0x0040A504 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContentTemplateSequence"}, - 0x0040A525 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IdenticalDocumentsSequence"}, - 0x0040A600 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ObservationSubjectContextFlagTrial"}, - 0x0040A601 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ObserverContextFlagTrial"}, - 0x0040A603 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ProcedureContextFlagTrial"}, - 0x0040A730 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContentSequence"}, - 0x0040A731 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RelationshipSequenceTrial"}, - 0x0040A732 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RelationshipTypeCodeSequenceTrial"}, - 0x0040A744 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LanguageCodeSequenceTrial"}, - 0x0040A992 : { vr : "ST", vm : C.VM_SINGLE, keyword : "UniformResourceLocatorTrial"}, - 0x0040B020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "WaveformAnnotationSequence"}, - 0x0040DB00 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TemplateIdentifier"}, - 0x0040DB06 : { vr : "DT", vm : C.VM_SINGLE, keyword : "TemplateVersion"}, - 0x0040DB07 : { vr : "DT", vm : C.VM_SINGLE, keyword : "TemplateLocalVersion"}, - 0x0040DB0B : { vr : "CS", vm : C.VM_SINGLE, keyword : "TemplateExtensionFlag"}, - 0x0040DB0C : { vr : "UI", vm : C.VM_SINGLE, keyword : "TemplateExtensionOrganizationUID"}, - 0x0040DB0D : { vr : "UI", vm : C.VM_SINGLE, keyword : "TemplateExtensionCreatorUID"}, - 0x0040DB73 : { vr : "UL", vm : C.VM_1N, keyword : "ReferencedContentItemIdentifier"}, - 0x0040E001 : { vr : "ST", vm : C.VM_SINGLE, keyword : "HL7InstanceIdentifier"}, - 0x0040E004 : { vr : "DT", vm : C.VM_SINGLE, keyword : "HL7DocumentEffectiveTime"}, - 0x0040E006 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "HL7DocumentTypeCodeSequence"}, - 0x0040E008 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DocumentClassCodeSequence"}, - 0x0040E010 : { vr : "UT", vm : C.VM_SINGLE, keyword : "RetrieveURI"}, - 0x0040E011 : { vr : "UI", vm : C.VM_SINGLE, keyword : "RetrieveLocationUID"}, - 0x0040E020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TypeOfInstances"}, - 0x0040E021 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DICOMRetrievalSequence"}, - 0x0040E022 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DICOMMediaRetrievalSequence"}, - 0x0040E023 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "WADORetrievalSequence"}, - 0x0040E024 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "XDSRetrievalSequence"}, - 0x0040E030 : { vr : "UI", vm : C.VM_SINGLE, keyword : "RepositoryUniqueID"}, - 0x0040E031 : { vr : "UI", vm : C.VM_SINGLE, keyword : "HomeCommunityID"}, - 0x00420010 : { vr : "ST", vm : C.VM_SINGLE, keyword : "DocumentTitle"}, - 0x00420011 : { vr : "OB", vm : C.VM_SINGLE, keyword : "EncapsulatedDocument"}, - 0x00420012 : { vr : "LO", vm : C.VM_SINGLE, keyword : "MIMETypeOfEncapsulatedDocument"}, - 0x00420013 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SourceInstanceSequence"}, - 0x00420014 : { vr : "LO", vm : C.VM_1N, keyword : "ListOfMIMETypes"}, - 0x00440001 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ProductPackageIdentifier"}, - 0x00440002 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SubstanceAdministrationApproval"}, - 0x00440003 : { vr : "LT", vm : C.VM_SINGLE, keyword : "ApprovalStatusFurtherDescription"}, - 0x00440004 : { vr : "DT", vm : C.VM_SINGLE, keyword : "ApprovalStatusDateTime"}, - 0x00440007 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProductTypeCodeSequence"}, - 0x00440008 : { vr : "LO", vm : C.VM_1N, keyword : "ProductName"}, - 0x00440009 : { vr : "LT", vm : C.VM_SINGLE, keyword : "ProductDescription"}, - 0x0044000A : { vr : "LO", vm : C.VM_SINGLE, keyword : "ProductLotIdentifier"}, - 0x0044000B : { vr : "DT", vm : C.VM_SINGLE, keyword : "ProductExpirationDateTime"}, - 0x00440010 : { vr : "DT", vm : C.VM_SINGLE, keyword : "SubstanceAdministrationDateTime"}, - 0x00440011 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SubstanceAdministrationNotes"}, - 0x00440012 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SubstanceAdministrationDeviceID"}, - 0x00440013 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProductParameterSequence"}, - 0x00440019 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SubstanceAdministrationParameterSequence"}, - 0x00460012 : { vr : "LO", vm : C.VM_SINGLE, keyword : "LensDescription"}, - 0x00460014 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RightLensSequence"}, - 0x00460015 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LeftLensSequence"}, - 0x00460016 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "UnspecifiedLateralityLensSequence"}, - 0x00460018 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CylinderSequence"}, - 0x00460028 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PrismSequence"}, - 0x00460030 : { vr : "FD", vm : C.VM_SINGLE, keyword : "HorizontalPrismPower"}, - 0x00460032 : { vr : "CS", vm : C.VM_SINGLE, keyword : "HorizontalPrismBase"}, - 0x00460034 : { vr : "FD", vm : C.VM_SINGLE, keyword : "VerticalPrismPower"}, - 0x00460036 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VerticalPrismBase"}, - 0x00460038 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LensSegmentType"}, - 0x00460040 : { vr : "FD", vm : C.VM_SINGLE, keyword : "OpticalTransmittance"}, - 0x00460042 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ChannelWidth"}, - 0x00460044 : { vr : "FD", vm : C.VM_SINGLE, keyword : "PupilSize"}, - 0x00460046 : { vr : "FD", vm : C.VM_SINGLE, keyword : "CornealSize"}, - 0x00460050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AutorefractionRightEyeSequence"}, - 0x00460052 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AutorefractionLeftEyeSequence"}, - 0x00460060 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DistancePupillaryDistance"}, - 0x00460062 : { vr : "FD", vm : C.VM_SINGLE, keyword : "NearPupillaryDistance"}, - 0x00460063 : { vr : "FD", vm : C.VM_SINGLE, keyword : "IntermediatePupillaryDistance"}, - 0x00460064 : { vr : "FD", vm : C.VM_SINGLE, keyword : "OtherPupillaryDistance"}, - 0x00460070 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "KeratometryRightEyeSequence"}, - 0x00460071 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "KeratometryLeftEyeSequence"}, - 0x00460074 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SteepKeratometricAxisSequence"}, - 0x00460075 : { vr : "FD", vm : C.VM_SINGLE, keyword : "RadiusOfCurvature"}, - 0x00460076 : { vr : "FD", vm : C.VM_SINGLE, keyword : "KeratometricPower"}, - 0x00460077 : { vr : "FD", vm : C.VM_SINGLE, keyword : "KeratometricAxis"}, - 0x00460080 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FlatKeratometricAxisSequence"}, - 0x00460092 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BackgroundColor"}, - 0x00460094 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Optotype"}, - 0x00460095 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OptotypePresentation"}, - 0x00460097 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SubjectiveRefractionRightEyeSequence"}, - 0x00460098 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SubjectiveRefractionLeftEyeSequence"}, - 0x00460100 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AddNearSequence"}, - 0x00460101 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AddIntermediateSequence"}, - 0x00460102 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AddOtherSequence"}, - 0x00460104 : { vr : "FD", vm : C.VM_SINGLE, keyword : "AddPower"}, - 0x00460106 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ViewingDistance"}, - 0x00460121 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VisualAcuityTypeCodeSequence"}, - 0x00460122 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VisualAcuityRightEyeSequence"}, - 0x00460123 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VisualAcuityLeftEyeSequence"}, - 0x00460124 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "VisualAcuityBothEyesOpenSequence"}, - 0x00460125 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ViewingDistanceType"}, - 0x00460135 : { vr : "SS", vm : C.VM_TWO, keyword : "VisualAcuityModifiers"}, - 0x00460137 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DecimalVisualAcuity"}, - 0x00460139 : { vr : "LO", vm : C.VM_SINGLE, keyword : "OptotypeDetailedDefinition"}, - 0x00460145 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedRefractiveMeasurementsSequence"}, - 0x00460146 : { vr : "FD", vm : C.VM_SINGLE, keyword : "SpherePower"}, - 0x00460147 : { vr : "FD", vm : C.VM_SINGLE, keyword : "CylinderPower"}, - 0x00480001 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ImagedVolumeWidth"}, - 0x00480002 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ImagedVolumeHeight"}, - 0x00480003 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ImagedVolumeDepth"}, - 0x00480006 : { vr : "UL", vm : C.VM_SINGLE, keyword : "TotalPixelMatrixColumns"}, - 0x00480007 : { vr : "UL", vm : C.VM_SINGLE, keyword : "TotalPixelMatrixRows"}, - 0x00480008 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TotalPixelMatrixOriginSequence"}, - 0x00480010 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SpecimenLabelInImage"}, - 0x00480011 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FocusMethod"}, - 0x00480012 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExtendedDepthOfField"}, - 0x00480013 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfFocalPlanes"}, - 0x00480014 : { vr : "FL", vm : C.VM_SINGLE, keyword : "DistanceBetweenFocalPlanes"}, - 0x00480015 : { vr : "US", vm : C.VM_THREE, keyword : "RecommendedAbsentPixelCIELabValue"}, - 0x00480100 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IlluminatorTypeCodeSequence"}, - 0x00480102 : { vr : "DS", vm : C.VM_SIX, keyword : "ImageOrientationSlide"}, - 0x00480105 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OpticalPathSequence"}, - 0x00480106 : { vr : "SH", vm : C.VM_SINGLE, keyword : "OpticalPathIdentifier"}, - 0x00480107 : { vr : "ST", vm : C.VM_SINGLE, keyword : "OpticalPathDescription"}, - 0x00480108 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IlluminationColorCodeSequence"}, - 0x00480110 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SpecimenReferenceSequence"}, - 0x00480111 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CondenserLensPower"}, - 0x00480112 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ObjectiveLensPower"}, - 0x00480113 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ObjectiveLensNumericalAperture"}, - 0x00480120 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PaletteColorLookupTableSequence"}, - 0x00480200 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedImageNavigationSequence"}, - 0x00480201 : { vr : "US", vm : C.VM_TWO, keyword : "TopLeftHandCornerOfLocalizerArea"}, - 0x00480202 : { vr : "US", vm : C.VM_TWO, keyword : "BottomRightHandCornerOfLocalizerArea"}, - 0x00480207 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OpticalPathIdentificationSequence"}, - 0x0048021A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PlanePositionSlideSequence"}, - 0x0048021E : { vr : "SL", vm : C.VM_SINGLE, keyword : "RowPositionInTotalImagePixelMatrix"}, - 0x0048021F : { vr : "SL", vm : C.VM_SINGLE, keyword : "ColumnPositionInTotalImagePixelMatrix"}, - 0x00480301 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PixelOriginInterpretation"}, - 0x00500004 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CalibrationImage"}, - 0x00500010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DeviceSequence"}, - 0x00500012 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContainerComponentTypeCodeSequence"}, - 0x00500013 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ContainerComponentThickness"}, - 0x00500014 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeviceLength"}, - 0x00500015 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ContainerComponentWidth"}, - 0x00500016 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeviceDiameter"}, - 0x00500017 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DeviceDiameterUnits"}, - 0x00500018 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeviceVolume"}, - 0x00500019 : { vr : "DS", vm : C.VM_SINGLE, keyword : "InterMarkerDistance"}, - 0x0050001A : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContainerComponentMaterial"}, - 0x0050001B : { vr : "LO", vm : C.VM_SINGLE, keyword : "ContainerComponentID"}, - 0x0050001C : { vr : "FD", vm : C.VM_SINGLE, keyword : "ContainerComponentLength"}, - 0x0050001D : { vr : "FD", vm : C.VM_SINGLE, keyword : "ContainerComponentDiameter"}, - 0x0050001E : { vr : "LO", vm : C.VM_SINGLE, keyword : "ContainerComponentDescription"}, - 0x00500020 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DeviceDescription"}, - 0x00520001 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ContrastBolusIngredientPercentByVolume"}, - 0x00520002 : { vr : "FD", vm : C.VM_SINGLE, keyword : "OCTFocalDistance"}, - 0x00520003 : { vr : "FD", vm : C.VM_SINGLE, keyword : "BeamSpotSize"}, - 0x00520004 : { vr : "FD", vm : C.VM_SINGLE, keyword : "EffectiveRefractiveIndex"}, - 0x00520006 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OCTAcquisitionDomain"}, - 0x00520007 : { vr : "FD", vm : C.VM_SINGLE, keyword : "OCTOpticalCenterWavelength"}, - 0x00520008 : { vr : "FD", vm : C.VM_SINGLE, keyword : "AxialResolution"}, - 0x00520009 : { vr : "FD", vm : C.VM_SINGLE, keyword : "RangingDepth"}, - 0x00520011 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ALineRate"}, - 0x00520012 : { vr : "US", vm : C.VM_SINGLE, keyword : "ALinesPerFrame"}, - 0x00520013 : { vr : "FD", vm : C.VM_SINGLE, keyword : "CatheterRotationalRate"}, - 0x00520014 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ALinePixelSpacing"}, - 0x00520016 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ModeOfPercutaneousAccessSequence"}, - 0x00520025 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IntravascularOCTFrameTypeSequence"}, - 0x00520026 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OCTZOffsetApplied"}, - 0x00520027 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IntravascularFrameContentSequence"}, - 0x00520028 : { vr : "FD", vm : C.VM_SINGLE, keyword : "IntravascularLongitudinalDistance"}, - 0x00520029 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IntravascularOCTFrameContentSequence"}, - 0x00520030 : { vr : "SS", vm : C.VM_SINGLE, keyword : "OCTZOffsetCorrection"}, - 0x00520031 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CatheterDirectionOfRotation"}, - 0x00520033 : { vr : "FD", vm : C.VM_SINGLE, keyword : "SeamLineLocation"}, - 0x00520034 : { vr : "FD", vm : C.VM_SINGLE, keyword : "FirstALineLocation"}, - 0x00520036 : { vr : "US", vm : C.VM_SINGLE, keyword : "SeamLineIndex"}, - 0x00520038 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfPaddedAlines"}, - 0x00520039 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InterpolationType"}, - 0x0052003A : { vr : "CS", vm : C.VM_SINGLE, keyword : "RefractiveIndexApplied"}, - 0x00540010 : { vr : "US", vm : C.VM_1N, keyword : "EnergyWindowVector"}, - 0x00540011 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfEnergyWindows"}, - 0x00540012 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "EnergyWindowInformationSequence"}, - 0x00540013 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "EnergyWindowRangeSequence"}, - 0x00540014 : { vr : "DS", vm : C.VM_SINGLE, keyword : "EnergyWindowLowerLimit"}, - 0x00540015 : { vr : "DS", vm : C.VM_SINGLE, keyword : "EnergyWindowUpperLimit"}, - 0x00540016 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalInformationSequence"}, - 0x00540017 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ResidualSyringeCounts"}, - 0x00540018 : { vr : "SH", vm : C.VM_SINGLE, keyword : "EnergyWindowName"}, - 0x00540020 : { vr : "US", vm : C.VM_1N, keyword : "DetectorVector"}, - 0x00540021 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfDetectors"}, - 0x00540022 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DetectorInformationSequence"}, - 0x00540030 : { vr : "US", vm : C.VM_1N, keyword : "PhaseVector"}, - 0x00540031 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfPhases"}, - 0x00540032 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PhaseInformationSequence"}, - 0x00540033 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfFramesInPhase"}, - 0x00540036 : { vr : "IS", vm : C.VM_SINGLE, keyword : "PhaseDelay"}, - 0x00540038 : { vr : "IS", vm : C.VM_SINGLE, keyword : "PauseBetweenFrames"}, - 0x00540039 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PhaseDescription"}, - 0x00540050 : { vr : "US", vm : C.VM_1N, keyword : "RotationVector"}, - 0x00540051 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfRotations"}, - 0x00540052 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RotationInformationSequence"}, - 0x00540053 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfFramesInRotation"}, - 0x00540060 : { vr : "US", vm : C.VM_1N, keyword : "RRIntervalVector"}, - 0x00540061 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfRRIntervals"}, - 0x00540062 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GatedInformationSequence"}, - 0x00540063 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DataInformationSequence"}, - 0x00540070 : { vr : "US", vm : C.VM_1N, keyword : "TimeSlotVector"}, - 0x00540071 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfTimeSlots"}, - 0x00540072 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TimeSlotInformationSequence"}, - 0x00540073 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TimeSlotTime"}, - 0x00540080 : { vr : "US", vm : C.VM_1N, keyword : "SliceVector"}, - 0x00540081 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfSlices"}, - 0x00540090 : { vr : "US", vm : C.VM_1N, keyword : "AngularViewVector"}, - 0x00540100 : { vr : "US", vm : C.VM_1N, keyword : "TimeSliceVector"}, - 0x00540101 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfTimeSlices"}, - 0x00540200 : { vr : "DS", vm : C.VM_SINGLE, keyword : "StartAngle"}, - 0x00540202 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TypeOfDetectorMotion"}, - 0x00540210 : { vr : "IS", vm : C.VM_1N, keyword : "TriggerVector"}, - 0x00540211 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfTriggersInPhase"}, - 0x00540220 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ViewCodeSequence"}, - 0x00540222 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ViewModifierCodeSequence"}, - 0x00540300 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RadionuclideCodeSequence"}, - 0x00540302 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AdministrationRouteCodeSequence"}, - 0x00540304 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RadiopharmaceuticalCodeSequence"}, - 0x00540306 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CalibrationDataSequence"}, - 0x00540308 : { vr : "US", vm : C.VM_SINGLE, keyword : "EnergyWindowNumber"}, - 0x00540400 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ImageID"}, - 0x00540410 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientOrientationCodeSequence"}, - 0x00540412 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientOrientationModifierCodeSequence"}, - 0x00540414 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientGantryRelationshipCodeSequence"}, - 0x00540500 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SliceProgressionDirection"}, - 0x00541000 : { vr : "CS", vm : C.VM_TWO, keyword : "SeriesType"}, - 0x00541001 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Units"}, - 0x00541002 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CountsSource"}, - 0x00541004 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReprojectionMethod"}, - 0x00541006 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SUVType"}, - 0x00541100 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RandomsCorrectionMethod"}, - 0x00541101 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AttenuationCorrectionMethod"}, - 0x00541102 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DecayCorrection"}, - 0x00541103 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ReconstructionMethod"}, - 0x00541104 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DetectorLinesOfResponseUsed"}, - 0x00541105 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ScatterCorrectionMethod"}, - 0x00541200 : { vr : "DS", vm : C.VM_SINGLE, keyword : "AxialAcceptance"}, - 0x00541201 : { vr : "IS", vm : C.VM_TWO, keyword : "AxialMash"}, - 0x00541202 : { vr : "IS", vm : C.VM_SINGLE, keyword : "TransverseMash"}, - 0x00541203 : { vr : "DS", vm : C.VM_TWO, keyword : "DetectorElementSize"}, - 0x00541210 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CoincidenceWindowWidth"}, - 0x00541220 : { vr : "CS", vm : C.VM_1N, keyword : "SecondaryCountsType"}, - 0x00541300 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FrameReferenceTime"}, - 0x00541310 : { vr : "IS", vm : C.VM_SINGLE, keyword : "PrimaryPromptsCountsAccumulated"}, - 0x00541311 : { vr : "IS", vm : C.VM_1N, keyword : "SecondaryCountsAccumulated"}, - 0x00541320 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SliceSensitivityFactor"}, - 0x00541321 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DecayFactor"}, - 0x00541322 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DoseCalibrationFactor"}, - 0x00541323 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ScatterFractionFactor"}, - 0x00541324 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeadTimeFactor"}, - 0x00541330 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageIndex"}, - 0x00541400 : { vr : "CS", vm : C.VM_1N, keyword : "CountsIncluded"}, - 0x00541401 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DeadTimeCorrectionFlag"}, - 0x00603000 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "HistogramSequence"}, - 0x00603002 : { vr : "US", vm : C.VM_SINGLE, keyword : "HistogramNumberOfBins"}, - 0x00603004 : { vr : "US", vm : C.VM_SINGLE, keyword : "HistogramFirstBinValue"}, - 0x00603006 : { vr : "US", vm : C.VM_SINGLE, keyword : "HistogramLastBinValue"}, - 0x00603008 : { vr : "US", vm : C.VM_SINGLE, keyword : "HistogramBinWidth"}, - 0x00603010 : { vr : "LO", vm : C.VM_SINGLE, keyword : "HistogramExplanation"}, - 0x00603020 : { vr : "UL", vm : C.VM_1N, keyword : "HistogramData"}, - 0x00620001 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SegmentationType"}, - 0x00620002 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SegmentSequence"}, - 0x00620003 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SegmentedPropertyCategoryCodeSequence"}, - 0x00620004 : { vr : "US", vm : C.VM_SINGLE, keyword : "SegmentNumber"}, - 0x00620005 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SegmentLabel"}, - 0x00620006 : { vr : "ST", vm : C.VM_SINGLE, keyword : "SegmentDescription"}, - 0x00620008 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SegmentAlgorithmType"}, - 0x00620009 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SegmentAlgorithmName"}, - 0x0062000A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SegmentIdentificationSequence"}, - 0x0062000B : { vr : "US", vm : C.VM_1N, keyword : "ReferencedSegmentNumber"}, - 0x0062000C : { vr : "US", vm : C.VM_SINGLE, keyword : "RecommendedDisplayGrayscaleValue"}, - 0x0062000D : { vr : "US", vm : C.VM_THREE, keyword : "RecommendedDisplayCIELabValue"}, - 0x0062000E : { vr : "US", vm : C.VM_SINGLE, keyword : "MaximumFractionalValue"}, - 0x0062000F : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SegmentedPropertyTypeCodeSequence"}, - 0x00620010 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SegmentationFractionalType"}, - 0x00640002 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DeformableRegistrationSequence"}, - 0x00640003 : { vr : "UI", vm : C.VM_SINGLE, keyword : "SourceFrameOfReferenceUID"}, - 0x00640005 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DeformableRegistrationGridSequence"}, - 0x00640007 : { vr : "UL", vm : C.VM_THREE, keyword : "GridDimensions"}, - 0x00640008 : { vr : "FD", vm : C.VM_THREE, keyword : "GridResolution"}, - 0x00640009 : { vr : "OF", vm : C.VM_SINGLE, keyword : "VectorGridData"}, - 0x0064000F : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PreDeformationMatrixRegistrationSequence"}, - 0x00640010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PostDeformationMatrixRegistrationSequence"}, - 0x00660001 : { vr : "UL", vm : C.VM_SINGLE, keyword : "NumberOfSurfaces"}, - 0x00660002 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SurfaceSequence"}, - 0x00660003 : { vr : "UL", vm : C.VM_SINGLE, keyword : "SurfaceNumber"}, - 0x00660004 : { vr : "LT", vm : C.VM_SINGLE, keyword : "SurfaceComments"}, - 0x00660009 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SurfaceProcessing"}, - 0x0066000A : { vr : "FL", vm : C.VM_SINGLE, keyword : "SurfaceProcessingRatio"}, - 0x0066000B : { vr : "LO", vm : C.VM_SINGLE, keyword : "SurfaceProcessingDescription"}, - 0x0066000C : { vr : "FL", vm : C.VM_SINGLE, keyword : "RecommendedPresentationOpacity"}, - 0x0066000D : { vr : "CS", vm : C.VM_SINGLE, keyword : "RecommendedPresentationType"}, - 0x0066000E : { vr : "CS", vm : C.VM_SINGLE, keyword : "FiniteVolume"}, - 0x00660010 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Manifold"}, - 0x00660011 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SurfacePointsSequence"}, - 0x00660012 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SurfacePointsNormalsSequence"}, - 0x00660013 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SurfaceMeshPrimitivesSequence"}, - 0x00660015 : { vr : "UL", vm : C.VM_SINGLE, keyword : "NumberOfSurfacePoints"}, - 0x00660016 : { vr : "OF", vm : C.VM_SINGLE, keyword : "PointCoordinatesData"}, - 0x00660017 : { vr : "FL", vm : C.VM_THREE, keyword : "PointPositionAccuracy"}, - 0x00660018 : { vr : "FL", vm : C.VM_SINGLE, keyword : "MeanPointDistance"}, - 0x00660019 : { vr : "FL", vm : C.VM_SINGLE, keyword : "MaximumPointDistance"}, - 0x0066001A : { vr : "FL", vm : C.VM_SIX, keyword : "PointsBoundingBoxCoordinates"}, - 0x0066001B : { vr : "FL", vm : C.VM_THREE, keyword : "AxisOfRotation"}, - 0x0066001C : { vr : "FL", vm : C.VM_THREE, keyword : "CenterOfRotation"}, - 0x0066001E : { vr : "UL", vm : C.VM_SINGLE, keyword : "NumberOfVectors"}, - 0x0066001F : { vr : "US", vm : C.VM_SINGLE, keyword : "VectorDimensionality"}, - 0x00660020 : { vr : "FL", vm : C.VM_1N, keyword : "VectorAccuracy"}, - 0x00660021 : { vr : "OF", vm : C.VM_SINGLE, keyword : "VectorCoordinateData"}, - 0x00660023 : { vr : "OW", vm : C.VM_SINGLE, keyword : "TrianglePointIndexList"}, - 0x00660024 : { vr : "OW", vm : C.VM_SINGLE, keyword : "EdgePointIndexList"}, - 0x00660025 : { vr : "OW", vm : C.VM_SINGLE, keyword : "VertexPointIndexList"}, - 0x00660026 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TriangleStripSequence"}, - 0x00660027 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TriangleFanSequence"}, - 0x00660028 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LineSequence"}, - 0x00660029 : { vr : "OW", vm : C.VM_SINGLE, keyword : "PrimitivePointIndexList"}, - 0x0066002A : { vr : "UL", vm : C.VM_SINGLE, keyword : "SurfaceCount"}, - 0x0066002B : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedSurfaceSequence"}, - 0x0066002C : { vr : "UL", vm : C.VM_SINGLE, keyword : "ReferencedSurfaceNumber"}, - 0x0066002D : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SegmentSurfaceGenerationAlgorithmIdentificationSequence"}, - 0x0066002E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SegmentSurfaceSourceInstanceSequence"}, - 0x0066002F : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AlgorithmFamilyCodeSequence"}, - 0x00660030 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AlgorithmNameCodeSequence"}, - 0x00660031 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AlgorithmVersion"}, - 0x00660032 : { vr : "LT", vm : C.VM_SINGLE, keyword : "AlgorithmParameters"}, - 0x00660034 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FacetSequence"}, - 0x00660035 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SurfaceProcessingAlgorithmIdentificationSequence"}, - 0x00660036 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AlgorithmName"}, - 0x00686210 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImplantSize"}, - 0x00686221 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImplantTemplateVersion"}, - 0x00686222 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReplacedImplantTemplateSequence"}, - 0x00686223 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImplantType"}, - 0x00686224 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DerivationImplantTemplateSequence"}, - 0x00686225 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OriginalImplantTemplateSequence"}, - 0x00686226 : { vr : "DT", vm : C.VM_SINGLE, keyword : "EffectiveDateTime"}, - 0x00686230 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImplantTargetAnatomySequence"}, - 0x00686260 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "InformationFromManufacturerSequence"}, - 0x00686265 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "NotificationFromManufacturerSequence"}, - 0x00686270 : { vr : "DT", vm : C.VM_SINGLE, keyword : "InformationIssueDateTime"}, - 0x00686280 : { vr : "ST", vm : C.VM_SINGLE, keyword : "InformationSummary"}, - 0x006862A0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImplantRegulatoryDisapprovalCodeSequence"}, - 0x006862A5 : { vr : "FD", vm : C.VM_SINGLE, keyword : "OverallTemplateSpatialTolerance"}, - 0x006862C0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "HPGLDocumentSequence"}, - 0x006862D0 : { vr : "US", vm : C.VM_SINGLE, keyword : "HPGLDocumentID"}, - 0x006862D5 : { vr : "LO", vm : C.VM_SINGLE, keyword : "HPGLDocumentLabel"}, - 0x006862E0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ViewOrientationCodeSequence"}, - 0x006862F0 : { vr : "FD", vm : C.VM_NINE, keyword : "ViewOrientationModifier"}, - 0x006862F2 : { vr : "FD", vm : C.VM_SINGLE, keyword : "HPGLDocumentScaling"}, - 0x00686300 : { vr : "OB", vm : C.VM_SINGLE, keyword : "HPGLDocument"}, - 0x00686310 : { vr : "US", vm : C.VM_SINGLE, keyword : "HPGLContourPenNumber"}, - 0x00686320 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "HPGLPenSequence"}, - 0x00686330 : { vr : "US", vm : C.VM_SINGLE, keyword : "HPGLPenNumber"}, - 0x00686340 : { vr : "LO", vm : C.VM_SINGLE, keyword : "HPGLPenLabel"}, - 0x00686345 : { vr : "ST", vm : C.VM_SINGLE, keyword : "HPGLPenDescription"}, - 0x00686346 : { vr : "FD", vm : C.VM_TWO, keyword : "RecommendedRotationPoint"}, - 0x00686347 : { vr : "FD", vm : C.VM_FOUR, keyword : "BoundingRectangle"}, - 0x00686350 : { vr : "US", vm : C.VM_1N, keyword : "ImplantTemplate3DModelSurfaceNumber"}, - 0x00686360 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SurfaceModelDescriptionSequence"}, - 0x00686380 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SurfaceModelLabel"}, - 0x00686390 : { vr : "FD", vm : C.VM_SINGLE, keyword : "SurfaceModelScalingFactor"}, - 0x006863A0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MaterialsCodeSequence"}, - 0x006863A4 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CoatingMaterialsCodeSequence"}, - 0x006863A8 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImplantTypeCodeSequence"}, - 0x006863AC : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FixationMethodCodeSequence"}, - 0x006863B0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MatingFeatureSetsSequence"}, - 0x006863C0 : { vr : "US", vm : C.VM_SINGLE, keyword : "MatingFeatureSetID"}, - 0x006863D0 : { vr : "LO", vm : C.VM_SINGLE, keyword : "MatingFeatureSetLabel"}, - 0x006863E0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MatingFeatureSequence"}, - 0x006863F0 : { vr : "US", vm : C.VM_SINGLE, keyword : "MatingFeatureID"}, - 0x00686400 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MatingFeatureDegreeOfFreedomSequence"}, - 0x00686410 : { vr : "US", vm : C.VM_SINGLE, keyword : "DegreeOfFreedomID"}, - 0x00686420 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DegreeOfFreedomType"}, - 0x00686430 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TwoDMatingFeatureCoordinatesSequence"}, - 0x00686440 : { vr : "US", vm : C.VM_SINGLE, keyword : "ReferencedHPGLDocumentID"}, - 0x00686450 : { vr : "FD", vm : C.VM_TWO, keyword : "TwoDMatingPoint"}, - 0x00686460 : { vr : "FD", vm : C.VM_FOUR, keyword : "TwoDMatingAxes"}, - 0x00686470 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TwoDDegreeOfFreedomSequence"}, - 0x00686490 : { vr : "FD", vm : C.VM_THREE, keyword : "ThreeDDegreeOfFreedomAxis"}, - 0x006864A0 : { vr : "FD", vm : C.VM_TWO, keyword : "RangeOfFreedom"}, - 0x006864C0 : { vr : "FD", vm : C.VM_THREE, keyword : "ThreeDMatingPoint"}, - 0x006864D0 : { vr : "FD", vm : C.VM_NINE, keyword : "ThreeDMatingAxes"}, - 0x006864F0 : { vr : "FD", vm : C.VM_THREE, keyword : "TwoDDegreeOfFreedomAxis"}, - 0x00686500 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PlanningLandmarkPointSequence"}, - 0x00686510 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PlanningLandmarkLineSequence"}, - 0x00686520 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PlanningLandmarkPlaneSequence"}, - 0x00686530 : { vr : "US", vm : C.VM_SINGLE, keyword : "PlanningLandmarkID"}, - 0x00686540 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PlanningLandmarkDescription"}, - 0x00686545 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PlanningLandmarkIdentificationCodeSequence"}, - 0x00686550 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TwoDPointCoordinatesSequence"}, - 0x00686560 : { vr : "FD", vm : C.VM_TWO, keyword : "TwoDPointCoordinates"}, - 0x00686590 : { vr : "FD", vm : C.VM_THREE, keyword : "ThreeDPointCoordinates"}, - 0x006865A0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TwoDLineCoordinatesSequence"}, - 0x006865B0 : { vr : "FD", vm : C.VM_FOUR, keyword : "TwoDLineCoordinates"}, - 0x006865D0 : { vr : "FD", vm : C.VM_SIX, keyword : "ThreeDLineCoordinates"}, - 0x006865E0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TwoDPlaneCoordinatesSequence"}, - 0x006865F0 : { vr : "FD", vm : C.VM_FOUR, keyword : "TwoDPlaneIntersection"}, - 0x00686610 : { vr : "FD", vm : C.VM_THREE, keyword : "ThreeDPlaneOrigin"}, - 0x00686620 : { vr : "FD", vm : C.VM_THREE, keyword : "ThreeDPlaneNormal"}, - 0x00700001 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GraphicAnnotationSequence"}, - 0x00700002 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GraphicLayer"}, - 0x00700003 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BoundingBoxAnnotationUnits"}, - 0x00700004 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AnchorPointAnnotationUnits"}, - 0x00700005 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GraphicAnnotationUnits"}, - 0x00700006 : { vr : "ST", vm : C.VM_SINGLE, keyword : "UnformattedTextValue"}, - 0x00700008 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TextObjectSequence"}, - 0x00700009 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GraphicObjectSequence"}, - 0x00700010 : { vr : "FL", vm : C.VM_TWO, keyword : "BoundingBoxTopLeftHandCorner"}, - 0x00700011 : { vr : "FL", vm : C.VM_TWO, keyword : "BoundingBoxBottomRightHandCorner"}, - 0x00700012 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BoundingBoxTextHorizontalJustification"}, - 0x00700014 : { vr : "FL", vm : C.VM_TWO, keyword : "AnchorPoint"}, - 0x00700015 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AnchorPointVisibility"}, - 0x00700020 : { vr : "US", vm : C.VM_SINGLE, keyword : "GraphicDimensions"}, - 0x00700021 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfGraphicPoints"}, - 0x00700022 : { vr : "FL", vm : C.VM_2N, keyword : "GraphicData"}, - 0x00700023 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GraphicType"}, - 0x00700024 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GraphicFilled"}, - 0x00700040 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ImageRotationRetired"}, - 0x00700041 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageHorizontalFlip"}, - 0x00700042 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageRotation"}, - 0x00700050 : { vr : "US", vm : C.VM_TWO, keyword : "DisplayedAreaTopLeftHandCornerTrial"}, - 0x00700051 : { vr : "US", vm : C.VM_TWO, keyword : "DisplayedAreaBottomRightHandCornerTrial"}, - 0x00700052 : { vr : "SL", vm : C.VM_TWO, keyword : "DisplayedAreaTopLeftHandCorner"}, - 0x00700053 : { vr : "SL", vm : C.VM_TWO, keyword : "DisplayedAreaBottomRightHandCorner"}, - 0x0070005A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DisplayedAreaSelectionSequence"}, - 0x00700060 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GraphicLayerSequence"}, - 0x00700062 : { vr : "IS", vm : C.VM_SINGLE, keyword : "GraphicLayerOrder"}, - 0x00700066 : { vr : "US", vm : C.VM_SINGLE, keyword : "GraphicLayerRecommendedDisplayGrayscaleValue"}, - 0x00700067 : { vr : "US", vm : C.VM_THREE, keyword : "GraphicLayerRecommendedDisplayRGBValue"}, - 0x00700068 : { vr : "LO", vm : C.VM_SINGLE, keyword : "GraphicLayerDescription"}, - 0x00700080 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContentLabel"}, - 0x00700081 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ContentDescription"}, - 0x00700082 : { vr : "DA", vm : C.VM_SINGLE, keyword : "PresentationCreationDate"}, - 0x00700083 : { vr : "TM", vm : C.VM_SINGLE, keyword : "PresentationCreationTime"}, - 0x00700084 : { vr : "PN", vm : C.VM_SINGLE, keyword : "ContentCreatorName"}, - 0x00700086 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContentCreatorIdentificationCodeSequence"}, - 0x00700087 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AlternateContentDescriptionSequence"}, - 0x00700100 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PresentationSizeMode"}, - 0x00700101 : { vr : "DS", vm : C.VM_TWO, keyword : "PresentationPixelSpacing"}, - 0x00700102 : { vr : "IS", vm : C.VM_TWO, keyword : "PresentationPixelAspectRatio"}, - 0x00700103 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PresentationPixelMagnificationRatio"}, - 0x00700207 : { vr : "LO", vm : C.VM_SINGLE, keyword : "GraphicGroupLabel"}, - 0x00700208 : { vr : "ST", vm : C.VM_SINGLE, keyword : "GraphicGroupDescription"}, - 0x00700209 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CompoundGraphicSequence"}, - 0x00700226 : { vr : "UL", vm : C.VM_SINGLE, keyword : "CompoundGraphicInstanceID"}, - 0x00700227 : { vr : "LO", vm : C.VM_SINGLE, keyword : "FontName"}, - 0x00700228 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FontNameType"}, - 0x00700229 : { vr : "LO", vm : C.VM_SINGLE, keyword : "CSSFontName"}, - 0x00700230 : { vr : "FD", vm : C.VM_SINGLE, keyword : "RotationAngle"}, - 0x00700231 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TextStyleSequence"}, - 0x00700232 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LineStyleSequence"}, - 0x00700233 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FillStyleSequence"}, - 0x00700234 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GraphicGroupSequence"}, - 0x00700241 : { vr : "US", vm : C.VM_THREE, keyword : "TextColorCIELabValue"}, - 0x00700242 : { vr : "CS", vm : C.VM_SINGLE, keyword : "HorizontalAlignment"}, - 0x00700243 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VerticalAlignment"}, - 0x00700244 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShadowStyle"}, - 0x00700245 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ShadowOffsetX"}, - 0x00700246 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ShadowOffsetY"}, - 0x00700247 : { vr : "US", vm : C.VM_THREE, keyword : "ShadowColorCIELabValue"}, - 0x00700248 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Underlined"}, - 0x00700249 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Bold"}, - 0x00700250 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Italic"}, - 0x00700251 : { vr : "US", vm : C.VM_THREE, keyword : "PatternOnColorCIELabValue"}, - 0x00700252 : { vr : "US", vm : C.VM_THREE, keyword : "PatternOffColorCIELabValue"}, - 0x00700253 : { vr : "FL", vm : C.VM_SINGLE, keyword : "LineThickness"}, - 0x00700254 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LineDashingStyle"}, - 0x00700255 : { vr : "UL", vm : C.VM_SINGLE, keyword : "LinePattern"}, - 0x00700256 : { vr : "OB", vm : C.VM_SINGLE, keyword : "FillPattern"}, - 0x00700257 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FillMode"}, - 0x00700258 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ShadowOpacity"}, - 0x00700261 : { vr : "FL", vm : C.VM_SINGLE, keyword : "GapLength"}, - 0x00700262 : { vr : "FL", vm : C.VM_SINGLE, keyword : "DiameterOfVisibility"}, - 0x00700273 : { vr : "FL", vm : C.VM_TWO, keyword : "RotationPoint"}, - 0x00700274 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TickAlignment"}, - 0x00700278 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShowTickLabel"}, - 0x00700279 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TickLabelAlignment"}, - 0x00700282 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CompoundGraphicUnits"}, - 0x00700284 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PatternOnOpacity"}, - 0x00700285 : { vr : "FL", vm : C.VM_SINGLE, keyword : "PatternOffOpacity"}, - 0x00700287 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MajorTicksSequence"}, - 0x00700288 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TickPosition"}, - 0x00700289 : { vr : "SH", vm : C.VM_SINGLE, keyword : "TickLabel"}, - 0x00700294 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CompoundGraphicType"}, - 0x00700295 : { vr : "UL", vm : C.VM_SINGLE, keyword : "GraphicGroupID"}, - 0x00700306 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShapeType"}, - 0x00700308 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RegistrationSequence"}, - 0x00700309 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MatrixRegistrationSequence"}, - 0x0070030A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MatrixSequence"}, - 0x0070030C : { vr : "CS", vm : C.VM_SINGLE, keyword : "FrameOfReferenceTransformationMatrixType"}, - 0x0070030D : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RegistrationTypeCodeSequence"}, - 0x0070030F : { vr : "ST", vm : C.VM_SINGLE, keyword : "FiducialDescription"}, - 0x00700310 : { vr : "SH", vm : C.VM_SINGLE, keyword : "FiducialIdentifier"}, - 0x00700311 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FiducialIdentifierCodeSequence"}, - 0x00700312 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ContourUncertaintyRadius"}, - 0x00700314 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "UsedFiducialsSequence"}, - 0x00700318 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GraphicCoordinatesDataSequence"}, - 0x0070031A : { vr : "UI", vm : C.VM_SINGLE, keyword : "FiducialUID"}, - 0x0070031C : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FiducialSetSequence"}, - 0x0070031E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FiducialSequence"}, - 0x00700401 : { vr : "US", vm : C.VM_THREE, keyword : "GraphicLayerRecommendedDisplayCIELabValue"}, - 0x00700402 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BlendingSequence"}, - 0x00700403 : { vr : "FL", vm : C.VM_SINGLE, keyword : "RelativeOpacity"}, - 0x00700404 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedSpatialRegistrationSequence"}, - 0x00700405 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BlendingPosition"}, - 0x00720002 : { vr : "SH", vm : C.VM_SINGLE, keyword : "HangingProtocolName"}, - 0x00720004 : { vr : "LO", vm : C.VM_SINGLE, keyword : "HangingProtocolDescription"}, - 0x00720006 : { vr : "CS", vm : C.VM_SINGLE, keyword : "HangingProtocolLevel"}, - 0x00720008 : { vr : "LO", vm : C.VM_SINGLE, keyword : "HangingProtocolCreator"}, - 0x0072000A : { vr : "DT", vm : C.VM_SINGLE, keyword : "HangingProtocolCreationDateTime"}, - 0x0072000C : { vr : "SQ", vm : C.VM_SINGLE, keyword : "HangingProtocolDefinitionSequence"}, - 0x0072000E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "HangingProtocolUserIdentificationCodeSequence"}, - 0x00720010 : { vr : "LO", vm : C.VM_SINGLE, keyword : "HangingProtocolUserGroupName"}, - 0x00720012 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SourceHangingProtocolSequence"}, - 0x00720014 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfPriorsReferenced"}, - 0x00720020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImageSetsSequence"}, - 0x00720022 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImageSetSelectorSequence"}, - 0x00720024 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageSetSelectorUsageFlag"}, - 0x00720026 : { vr : "AT", vm : C.VM_SINGLE, keyword : "SelectorAttribute"}, - 0x00720028 : { vr : "US", vm : C.VM_SINGLE, keyword : "SelectorValueNumber"}, - 0x00720030 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TimeBasedImageSetsSequence"}, - 0x00720032 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageSetNumber"}, - 0x00720034 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageSetSelectorCategory"}, - 0x00720038 : { vr : "US", vm : C.VM_TWO, keyword : "RelativeTime"}, - 0x0072003A : { vr : "CS", vm : C.VM_SINGLE, keyword : "RelativeTimeUnits"}, - 0x0072003C : { vr : "SS", vm : C.VM_TWO, keyword : "AbstractPriorValue"}, - 0x0072003E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AbstractPriorCodeSequence"}, - 0x00720040 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImageSetLabel"}, - 0x00720050 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SelectorAttributeVR"}, - 0x00720052 : { vr : "AT", vm : C.VM_1N, keyword : "SelectorSequencePointer"}, - 0x00720054 : { vr : "LO", vm : C.VM_1N, keyword : "SelectorSequencePointerPrivateCreator"}, - 0x00720056 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SelectorAttributePrivateCreator"}, - 0x00720060 : { vr : "AT", vm : C.VM_1N, keyword : "SelectorATValue"}, - 0x00720062 : { vr : "CS", vm : C.VM_1N, keyword : "SelectorCSValue"}, - 0x00720064 : { vr : "IS", vm : C.VM_1N, keyword : "SelectorISValue"}, - 0x00720066 : { vr : "LO", vm : C.VM_1N, keyword : "SelectorLOValue"}, - 0x00720068 : { vr : "LT", vm : C.VM_SINGLE, keyword : "SelectorLTValue"}, - 0x0072006A : { vr : "PN", vm : C.VM_1N, keyword : "SelectorPNValue"}, - 0x0072006C : { vr : "SH", vm : C.VM_1N, keyword : "SelectorSHValue"}, - 0x0072006E : { vr : "ST", vm : C.VM_SINGLE, keyword : "SelectorSTValue"}, - 0x00720070 : { vr : "UT", vm : C.VM_SINGLE, keyword : "SelectorUTValue"}, - 0x00720072 : { vr : "DS", vm : C.VM_1N, keyword : "SelectorDSValue"}, - 0x00720074 : { vr : "FD", vm : C.VM_1N, keyword : "SelectorFDValue"}, - 0x00720076 : { vr : "FL", vm : C.VM_1N, keyword : "SelectorFLValue"}, - 0x00720078 : { vr : "UL", vm : C.VM_1N, keyword : "SelectorULValue"}, - 0x0072007A : { vr : "US", vm : C.VM_1N, keyword : "SelectorUSValue"}, - 0x0072007C : { vr : "SL", vm : C.VM_1N, keyword : "SelectorSLValue"}, - 0x0072007E : { vr : "SS", vm : C.VM_1N, keyword : "SelectorSSValue"}, - 0x00720080 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SelectorCodeSequenceValue"}, - 0x00720100 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfScreens"}, - 0x00720102 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "NominalScreenDefinitionSequence"}, - 0x00720104 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfVerticalPixels"}, - 0x00720106 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfHorizontalPixels"}, - 0x00720108 : { vr : "FD", vm : C.VM_FOUR, keyword : "DisplayEnvironmentSpatialPosition"}, - 0x0072010A : { vr : "US", vm : C.VM_SINGLE, keyword : "ScreenMinimumGrayscaleBitDepth"}, - 0x0072010C : { vr : "US", vm : C.VM_SINGLE, keyword : "ScreenMinimumColorBitDepth"}, - 0x0072010E : { vr : "US", vm : C.VM_SINGLE, keyword : "ApplicationMaximumRepaintTime"}, - 0x00720200 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DisplaySetsSequence"}, - 0x00720202 : { vr : "US", vm : C.VM_SINGLE, keyword : "DisplaySetNumber"}, - 0x00720203 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DisplaySetLabel"}, - 0x00720204 : { vr : "US", vm : C.VM_SINGLE, keyword : "DisplaySetPresentationGroup"}, - 0x00720206 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DisplaySetPresentationGroupDescription"}, - 0x00720208 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PartialDataDisplayHandling"}, - 0x00720210 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SynchronizedScrollingSequence"}, - 0x00720212 : { vr : "US", vm : C.VM_2N, keyword : "DisplaySetScrollingGroup"}, - 0x00720214 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "NavigationIndicatorSequence"}, - 0x00720216 : { vr : "US", vm : C.VM_SINGLE, keyword : "NavigationDisplaySet"}, - 0x00720218 : { vr : "US", vm : C.VM_1N, keyword : "ReferenceDisplaySets"}, - 0x00720300 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImageBoxesSequence"}, - 0x00720302 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageBoxNumber"}, - 0x00720304 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageBoxLayoutType"}, - 0x00720306 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageBoxTileHorizontalDimension"}, - 0x00720308 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageBoxTileVerticalDimension"}, - 0x00720310 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageBoxScrollDirection"}, - 0x00720312 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageBoxSmallScrollType"}, - 0x00720314 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageBoxSmallScrollAmount"}, - 0x00720316 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageBoxLargeScrollType"}, - 0x00720318 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageBoxLargeScrollAmount"}, - 0x00720320 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageBoxOverlapPriority"}, - 0x00720330 : { vr : "FD", vm : C.VM_SINGLE, keyword : "CineRelativeToRealTime"}, - 0x00720400 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FilterOperationsSequence"}, - 0x00720402 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FilterByCategory"}, - 0x00720404 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FilterByAttributePresence"}, - 0x00720406 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FilterByOperator"}, - 0x00720420 : { vr : "US", vm : C.VM_THREE, keyword : "StructuredDisplayBackgroundCIELabValue"}, - 0x00720421 : { vr : "US", vm : C.VM_THREE, keyword : "EmptyImageBoxCIELabValue"}, - 0x00720422 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "StructuredDisplayImageBoxSequence"}, - 0x00720424 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "StructuredDisplayTextBoxSequence"}, - 0x00720427 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedFirstFrameSequence"}, - 0x00720430 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImageBoxSynchronizationSequence"}, - 0x00720432 : { vr : "US", vm : C.VM_2N, keyword : "SynchronizedImageBoxList"}, - 0x00720434 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TypeOfSynchronization"}, - 0x00720500 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BlendingOperationType"}, - 0x00720510 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReformattingOperationType"}, - 0x00720512 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ReformattingThickness"}, - 0x00720514 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ReformattingInterval"}, - 0x00720516 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReformattingOperationInitialViewDirection"}, - 0x00720520 : { vr : "CS", vm : C.VM_1N, keyword : "ThreeDRenderingType"}, - 0x00720600 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SortingOperationsSequence"}, - 0x00720602 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SortByCategory"}, - 0x00720604 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SortingDirection"}, - 0x00720700 : { vr : "CS", vm : C.VM_TWO, keyword : "DisplaySetPatientOrientation"}, - 0x00720702 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VOIType"}, - 0x00720704 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PseudoColorType"}, - 0x00720705 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PseudoColorPaletteInstanceReferenceSequence"}, - 0x00720706 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShowGrayscaleInverted"}, - 0x00720710 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShowImageTrueSizeFlag"}, - 0x00720712 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShowGraphicAnnotationFlag"}, - 0x00720714 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShowPatientDemographicsFlag"}, - 0x00720716 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShowAcquisitionTechniquesFlag"}, - 0x00720717 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DisplaySetHorizontalJustification"}, - 0x00720718 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DisplaySetVerticalJustification"}, - 0x00740120 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ContinuationStartMeterset"}, - 0x00740121 : { vr : "FD", vm : C.VM_SINGLE, keyword : "ContinuationEndMeterset"}, - 0x00741000 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ProcedureStepState"}, - 0x00741002 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProcedureStepProgressInformationSequence"}, - 0x00741004 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ProcedureStepProgress"}, - 0x00741006 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ProcedureStepProgressDescription"}, - 0x00741008 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProcedureStepCommunicationsURISequence"}, - 0x0074100a : { vr : "ST", vm : C.VM_SINGLE, keyword : "ContactURI"}, - 0x0074100c : { vr : "LO", vm : C.VM_SINGLE, keyword : "ContactDisplayName"}, - 0x0074100e : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProcedureStepDiscontinuationReasonCodeSequence"}, - 0x00741020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BeamTaskSequence"}, - 0x00741022 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BeamTaskType"}, - 0x00741024 : { vr : "IS", vm : C.VM_SINGLE, keyword : "BeamOrderIndexTrial"}, - 0x00741026 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TableTopVerticalAdjustedPosition"}, - 0x00741027 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TableTopLongitudinalAdjustedPosition"}, - 0x00741028 : { vr : "FD", vm : C.VM_SINGLE, keyword : "TableTopLateralAdjustedPosition"}, - 0x0074102A : { vr : "FD", vm : C.VM_SINGLE, keyword : "PatientSupportAdjustedAngle"}, - 0x0074102B : { vr : "FD", vm : C.VM_SINGLE, keyword : "TableTopEccentricAdjustedAngle"}, - 0x0074102C : { vr : "FD", vm : C.VM_SINGLE, keyword : "TableTopPitchAdjustedAngle"}, - 0x0074102D : { vr : "FD", vm : C.VM_SINGLE, keyword : "TableTopRollAdjustedAngle"}, - 0x00741030 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DeliveryVerificationImageSequence"}, - 0x00741032 : { vr : "CS", vm : C.VM_SINGLE, keyword : "VerificationImageTiming"}, - 0x00741034 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DoubleExposureFlag"}, - 0x00741036 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DoubleExposureOrdering"}, - 0x00741038 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DoubleExposureMetersetTrial"}, - 0x0074103A : { vr : "DS", vm : C.VM_FOUR, keyword : "DoubleExposureFieldDeltaTrial"}, - 0x00741040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RelatedReferenceRTImageSequence"}, - 0x00741042 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GeneralMachineVerificationSequence"}, - 0x00741044 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ConventionalMachineVerificationSequence"}, - 0x00741046 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonMachineVerificationSequence"}, - 0x00741048 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FailedAttributesSequence"}, - 0x0074104A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OverriddenAttributesSequence"}, - 0x0074104C : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ConventionalControlPointVerificationSequence"}, - 0x0074104E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonControlPointVerificationSequence"}, - 0x00741050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AttributeOccurrenceSequence"}, - 0x00741052 : { vr : "AT", vm : C.VM_SINGLE, keyword : "AttributeOccurrencePointer"}, - 0x00741054 : { vr : "UL", vm : C.VM_SINGLE, keyword : "AttributeItemSelector"}, - 0x00741056 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AttributeOccurrencePrivateCreator"}, - 0x00741057 : { vr : "IS", vm : C.VM_1N, keyword : "SelectorSequencePointerItems"}, - 0x00741200 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ScheduledProcedureStepPriority"}, - 0x00741202 : { vr : "LO", vm : C.VM_SINGLE, keyword : "WorklistLabel"}, - 0x00741204 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ProcedureStepLabel"}, - 0x00741210 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ScheduledProcessingParametersSequence"}, - 0x00741212 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerformedProcessingParametersSequence"}, - 0x00741216 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "UnifiedProcedureStepPerformedProcedureSequence"}, - 0x00741220 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RelatedProcedureStepSequence"}, - 0x00741222 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ProcedureStepRelationshipType"}, - 0x00741224 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReplacedProcedureStepSequence"}, - 0x00741230 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DeletionLock"}, - 0x00741234 : { vr : "AE", vm : C.VM_SINGLE, keyword : "ReceivingAE"}, - 0x00741236 : { vr : "AE", vm : C.VM_SINGLE, keyword : "RequestingAE"}, - 0x00741238 : { vr : "LT", vm : C.VM_SINGLE, keyword : "ReasonForCancellation"}, - 0x00741242 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SCPStatus"}, - 0x00741244 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SubscriptionListStatus"}, - 0x00741246 : { vr : "CS", vm : C.VM_SINGLE, keyword : "UnifiedProcedureStepListStatus"}, - 0x00741324 : { vr : "UL", vm : C.VM_SINGLE, keyword : "BeamOrderIndex"}, - 0x00741338 : { vr : "FD", vm : C.VM_SINGLE, keyword : "DoubleExposureMeterset"}, - 0x0074133A : { vr : "FD", vm : C.VM_FOUR, keyword : "DoubleExposureFieldDelta"}, - 0x00760001 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImplantAssemblyTemplateName"}, - 0x00760003 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImplantAssemblyTemplateIssuer"}, - 0x00760006 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImplantAssemblyTemplateVersion"}, - 0x00760008 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReplacedImplantAssemblyTemplateSequence"}, - 0x0076000A : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImplantAssemblyTemplateType"}, - 0x0076000C : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OriginalImplantAssemblyTemplateSequence"}, - 0x0076000E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DerivationImplantAssemblyTemplateSequence"}, - 0x00760010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImplantAssemblyTemplateTargetAnatomySequence"}, - 0x00760020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProcedureTypeCodeSequence"}, - 0x00760030 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SurgicalTechnique"}, - 0x00760032 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ComponentTypesSequence"}, - 0x00760034 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ComponentTypeCodeSequence"}, - 0x00760036 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExclusiveComponentType"}, - 0x00760038 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MandatoryComponentType"}, - 0x00760040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ComponentSequence"}, - 0x00760055 : { vr : "US", vm : C.VM_SINGLE, keyword : "ComponentID"}, - 0x00760060 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ComponentAssemblySequence"}, - 0x00760070 : { vr : "US", vm : C.VM_SINGLE, keyword : "Component1ReferencedID"}, - 0x00760080 : { vr : "US", vm : C.VM_SINGLE, keyword : "Component1ReferencedMatingFeatureSetID"}, - 0x00760090 : { vr : "US", vm : C.VM_SINGLE, keyword : "Component1ReferencedMatingFeatureID"}, - 0x007600A0 : { vr : "US", vm : C.VM_SINGLE, keyword : "Component2ReferencedID"}, - 0x007600B0 : { vr : "US", vm : C.VM_SINGLE, keyword : "Component2ReferencedMatingFeatureSetID"}, - 0x007600C0 : { vr : "US", vm : C.VM_SINGLE, keyword : "Component2ReferencedMatingFeatureID"}, - 0x00780001 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupName"}, - 0x00780010 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupDescription"}, - 0x00780020 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupIssuer"}, - 0x00780024 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupVersion"}, - 0x00780026 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReplacedImplantTemplateGroupSequence"}, - 0x00780028 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupTargetAnatomySequence"}, - 0x0078002A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupMembersSequence"}, - 0x0078002E : { vr : "US", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupMemberID"}, - 0x00780050 : { vr : "FD", vm : C.VM_THREE, keyword : "ThreeDImplantTemplateGroupMemberMatchingPoint"}, - 0x00780060 : { vr : "FD", vm : C.VM_NINE, keyword : "ThreeDImplantTemplateGroupMemberMatchingAxes"}, - 0x00780070 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupMemberMatching2DCoordinatesSequence"}, - 0x00780090 : { vr : "FD", vm : C.VM_TWO, keyword : "TwoDImplantTemplateGroupMemberMatchingPoint"}, - 0x007800A0 : { vr : "FD", vm : C.VM_FOUR, keyword : "TwoDImplantTemplateGroupMemberMatchingAxes"}, - 0x007800B0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupVariationDimensionSequence"}, - 0x007800B2 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupVariationDimensionName"}, - 0x007800B4 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupVariationDimensionRankSequence"}, - 0x007800B6 : { vr : "US", vm : C.VM_SINGLE, keyword : "ReferencedImplantTemplateGroupMemberID"}, - 0x007800B8 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImplantTemplateGroupVariationDimensionRank"}, - 0x00880130 : { vr : "SH", vm : C.VM_SINGLE, keyword : "StorageMediaFileSetID"}, - 0x00880140 : { vr : "UI", vm : C.VM_SINGLE, keyword : "StorageMediaFileSetUID"}, - 0x00880200 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IconImageSequence"}, - 0x00880904 : { vr : "LO", vm : C.VM_SINGLE, keyword : "TopicTitle"}, - 0x00880906 : { vr : "ST", vm : C.VM_SINGLE, keyword : "TopicSubject"}, - 0x00880910 : { vr : "LO", vm : C.VM_SINGLE, keyword : "TopicAuthor"}, - 0x00880912 : { vr : "LO", vm : C.VM_1_32, keyword : "TopicKeywords"}, - 0x01000410 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SOPInstanceStatus"}, - 0x01000420 : { vr : "DT", vm : C.VM_SINGLE, keyword : "SOPAuthorizationDateTime"}, - 0x01000424 : { vr : "LT", vm : C.VM_SINGLE, keyword : "SOPAuthorizationComment"}, - 0x01000426 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AuthorizationEquipmentCertificationNumber"}, - 0x04000005 : { vr : "US", vm : C.VM_SINGLE, keyword : "MACIDNumber"}, - 0x04000010 : { vr : "UI", vm : C.VM_SINGLE, keyword : "MACCalculationTransferSyntaxUID"}, - 0x04000015 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MACAlgorithm"}, - 0x04000020 : { vr : "AT", vm : C.VM_1N, keyword : "DataElementsSigned"}, - 0x04000100 : { vr : "UI", vm : C.VM_SINGLE, keyword : "DigitalSignatureUID"}, - 0x04000105 : { vr : "DT", vm : C.VM_SINGLE, keyword : "DigitalSignatureDateTime"}, - 0x04000110 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CertificateType"}, - 0x04000115 : { vr : "OB", vm : C.VM_SINGLE, keyword : "CertificateOfSigner"}, - 0x04000120 : { vr : "OB", vm : C.VM_SINGLE, keyword : "Signature"}, - 0x04000305 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CertifiedTimestampType"}, - 0x04000310 : { vr : "OB", vm : C.VM_SINGLE, keyword : "CertifiedTimestamp"}, - 0x04000401 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DigitalSignaturePurposeCodeSequence"}, - 0x04000402 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedDigitalSignatureSequence"}, - 0x04000403 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedSOPInstanceMACSequence"}, - 0x04000404 : { vr : "OB", vm : C.VM_SINGLE, keyword : "MAC"}, - 0x04000500 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "EncryptedAttributesSequence"}, - 0x04000510 : { vr : "UI", vm : C.VM_SINGLE, keyword : "EncryptedContentTransferSyntaxUID"}, - 0x04000520 : { vr : "OB", vm : C.VM_SINGLE, keyword : "EncryptedContent"}, - 0x04000550 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ModifiedAttributesSequence"}, - 0x04000561 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OriginalAttributesSequence"}, - 0x04000562 : { vr : "DT", vm : C.VM_SINGLE, keyword : "AttributeModificationDateTime"}, - 0x04000563 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ModifyingSystem"}, - 0x04000564 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SourceOfPreviousValues"}, - 0x04000565 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReasonForTheAttributeModification"}, - 0x20000010 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfCopies"}, - 0x2000001E : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PrinterConfigurationSequence"}, - 0x20000020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PrintPriority"}, - 0x20000030 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MediumType"}, - 0x20000040 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FilmDestination"}, - 0x20000050 : { vr : "LO", vm : C.VM_SINGLE, keyword : "FilmSessionLabel"}, - 0x20000060 : { vr : "IS", vm : C.VM_SINGLE, keyword : "MemoryAllocation"}, - 0x20000061 : { vr : "IS", vm : C.VM_SINGLE, keyword : "MaximumMemoryAllocation"}, - 0x20000062 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ColorImagePrintingFlag"}, - 0x20000063 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CollationFlag"}, - 0x20000065 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AnnotationFlag"}, - 0x20000067 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageOverlayFlag"}, - 0x20000069 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PresentationLUTFlag"}, - 0x2000006A : { vr : "CS", vm : C.VM_SINGLE, keyword : "ImageBoxPresentationLUTFlag"}, - 0x200000A0 : { vr : "US", vm : C.VM_SINGLE, keyword : "MemoryBitDepth"}, - 0x200000A1 : { vr : "US", vm : C.VM_SINGLE, keyword : "PrintingBitDepth"}, - 0x200000A2 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MediaInstalledSequence"}, - 0x200000A4 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OtherMediaAvailableSequence"}, - 0x200000A8 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SupportedImageDisplayFormatsSequence"}, - 0x20000500 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedFilmBoxSequence"}, - 0x20000510 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedStoredPrintSequence"}, - 0x20100010 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ImageDisplayFormat"}, - 0x20100030 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AnnotationDisplayFormatID"}, - 0x20100040 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FilmOrientation"}, - 0x20100050 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FilmSizeID"}, - 0x20100052 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PrinterResolutionID"}, - 0x20100054 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DefaultPrinterResolutionID"}, - 0x20100060 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MagnificationType"}, - 0x20100080 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SmoothingType"}, - 0x201000A6 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DefaultMagnificationType"}, - 0x201000A7 : { vr : "CS", vm : C.VM_1N, keyword : "OtherMagnificationTypesAvailable"}, - 0x201000A8 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DefaultSmoothingType"}, - 0x201000A9 : { vr : "CS", vm : C.VM_1N, keyword : "OtherSmoothingTypesAvailable"}, - 0x20100100 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BorderDensity"}, - 0x20100110 : { vr : "CS", vm : C.VM_SINGLE, keyword : "EmptyImageDensity"}, - 0x20100120 : { vr : "US", vm : C.VM_SINGLE, keyword : "MinDensity"}, - 0x20100130 : { vr : "US", vm : C.VM_SINGLE, keyword : "MaxDensity"}, - 0x20100140 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Trim"}, - 0x20100150 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ConfigurationInformation"}, - 0x20100152 : { vr : "LT", vm : C.VM_SINGLE, keyword : "ConfigurationInformationDescription"}, - 0x20100154 : { vr : "IS", vm : C.VM_SINGLE, keyword : "MaximumCollatedFilms"}, - 0x2010015E : { vr : "US", vm : C.VM_SINGLE, keyword : "Illumination"}, - 0x20100160 : { vr : "US", vm : C.VM_SINGLE, keyword : "ReflectedAmbientLight"}, - 0x20100376 : { vr : "DS", vm : C.VM_TWO, keyword : "PrinterPixelSpacing"}, - 0x20100500 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedFilmSessionSequence"}, - 0x20100510 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedImageBoxSequence"}, - 0x20100520 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedBasicAnnotationBoxSequence"}, - 0x20200010 : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageBoxPosition"}, - 0x20200020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "Polarity"}, - 0x20200030 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RequestedImageSize"}, - 0x20200040 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RequestedDecimateCropBehavior"}, - 0x20200050 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RequestedResolutionID"}, - 0x202000A0 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RequestedImageSizeFlag"}, - 0x202000A2 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DecimateCropResult"}, - 0x20200110 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BasicGrayscaleImageSequence"}, - 0x20200111 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BasicColorImageSequence"}, - 0x20200130 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedImageOverlayBoxSequence"}, - 0x20200140 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedVOILUTBoxSequence"}, - 0x20300010 : { vr : "US", vm : C.VM_SINGLE, keyword : "AnnotationPosition"}, - 0x20300020 : { vr : "LO", vm : C.VM_SINGLE, keyword : "TextString"}, - 0x20400010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedOverlayPlaneSequence"}, - 0x20400011 : { vr : "US", vm : C.VM_1_99, keyword : "ReferencedOverlayPlaneGroups"}, - 0x20400020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OverlayPixelDataSequence"}, - 0x20400060 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlayMagnificationType"}, - 0x20400070 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlaySmoothingType"}, - 0x20400072 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlayOrImageMagnification"}, - 0x20400074 : { vr : "US", vm : C.VM_SINGLE, keyword : "MagnifyToNumberOfColumns"}, - 0x20400080 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlayForegroundDensity"}, - 0x20400082 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlayBackgroundDensity"}, - 0x20400090 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlayMode"}, - 0x20400100 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ThresholdDensity"}, - 0x20400500 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedImageBoxSequenceRetired"}, - 0x20500010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PresentationLUTSequence"}, - 0x20500020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PresentationLUTShape"}, - 0x20500500 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedPresentationLUTSequence"}, - 0x21000010 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PrintJobID"}, - 0x21000020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExecutionStatus"}, - 0x21000030 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ExecutionStatusInfo"}, - 0x21000040 : { vr : "DA", vm : C.VM_SINGLE, keyword : "CreationDate"}, - 0x21000050 : { vr : "TM", vm : C.VM_SINGLE, keyword : "CreationTime"}, - 0x21000070 : { vr : "AE", vm : C.VM_SINGLE, keyword : "Originator"}, - 0x21000140 : { vr : "AE", vm : C.VM_SINGLE, keyword : "DestinationAE"}, - 0x21000160 : { vr : "SH", vm : C.VM_SINGLE, keyword : "OwnerID"}, - 0x21000170 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfFilms"}, - 0x21000500 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedPrintJobSequencePullStoredPrint"}, - 0x21100010 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PrinterStatus"}, - 0x21100020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PrinterStatusInfo"}, - 0x21100030 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PrinterName"}, - 0x21100099 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PrintQueueID"}, - 0x21200010 : { vr : "CS", vm : C.VM_SINGLE, keyword : "QueueStatus"}, - 0x21200050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PrintJobDescriptionSequence"}, - 0x21200070 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedPrintJobSequence"}, - 0x21300010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PrintManagementCapabilitiesSequence"}, - 0x21300015 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PrinterCharacteristicsSequence"}, - 0x21300030 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FilmBoxContentSequence"}, - 0x21300040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImageBoxContentSequence"}, - 0x21300050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AnnotationContentSequence"}, - 0x21300060 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ImageOverlayBoxContentSequence"}, - 0x21300080 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PresentationLUTContentSequence"}, - 0x213000A0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ProposedStudySequence"}, - 0x213000C0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OriginalImageSequence"}, - 0x22000001 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LabelUsingInformationExtractedFromInstances"}, - 0x22000002 : { vr : "UT", vm : C.VM_SINGLE, keyword : "LabelText"}, - 0x22000003 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LabelStyleSelection"}, - 0x22000004 : { vr : "LT", vm : C.VM_SINGLE, keyword : "MediaDisposition"}, - 0x22000005 : { vr : "LT", vm : C.VM_SINGLE, keyword : "BarcodeValue"}, - 0x22000006 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BarcodeSymbology"}, - 0x22000007 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AllowMediaSplitting"}, - 0x22000008 : { vr : "CS", vm : C.VM_SINGLE, keyword : "IncludeNonDICOMObjects"}, - 0x22000009 : { vr : "CS", vm : C.VM_SINGLE, keyword : "IncludeDisplayApplication"}, - 0x2200000A : { vr : "CS", vm : C.VM_SINGLE, keyword : "PreserveCompositeInstancesAfterMediaCreation"}, - 0x2200000B : { vr : "US", vm : C.VM_SINGLE, keyword : "TotalNumberOfPiecesOfMediaCreated"}, - 0x2200000C : { vr : "LO", vm : C.VM_SINGLE, keyword : "RequestedMediaApplicationProfile"}, - 0x2200000D : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedStorageMediaSequence"}, - 0x2200000E : { vr : "AT", vm : C.VM_1N, keyword : "FailureAttributes"}, - 0x2200000F : { vr : "CS", vm : C.VM_SINGLE, keyword : "AllowLossyCompression"}, - 0x22000020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RequestPriority"}, - 0x30020002 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RTImageLabel"}, - 0x30020003 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RTImageName"}, - 0x30020004 : { vr : "ST", vm : C.VM_SINGLE, keyword : "RTImageDescription"}, - 0x3002000A : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReportedValuesOrigin"}, - 0x3002000C : { vr : "CS", vm : C.VM_SINGLE, keyword : "RTImagePlane"}, - 0x3002000D : { vr : "DS", vm : C.VM_THREE, keyword : "XRayImageReceptorTranslation"}, - 0x3002000E : { vr : "DS", vm : C.VM_SINGLE, keyword : "XRayImageReceptorAngle"}, - 0x30020010 : { vr : "DS", vm : C.VM_SIX, keyword : "RTImageOrientation"}, - 0x30020011 : { vr : "DS", vm : C.VM_TWO, keyword : "ImagePlanePixelSpacing"}, - 0x30020012 : { vr : "DS", vm : C.VM_TWO, keyword : "RTImagePosition"}, - 0x30020020 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RadiationMachineName"}, - 0x30020022 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RadiationMachineSAD"}, - 0x30020024 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RadiationMachineSSD"}, - 0x30020026 : { vr : "DS", vm : C.VM_SINGLE, keyword : "RTImageSID"}, - 0x30020028 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceToReferenceObjectDistance"}, - 0x30020029 : { vr : "IS", vm : C.VM_SINGLE, keyword : "FractionNumber"}, - 0x30020030 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ExposureSequence"}, - 0x30020032 : { vr : "DS", vm : C.VM_SINGLE, keyword : "MetersetExposure"}, - 0x30020034 : { vr : "DS", vm : C.VM_FOUR, keyword : "DiaphragmPosition"}, - 0x30020040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FluenceMapSequence"}, - 0x30020041 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FluenceDataSource"}, - 0x30020042 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FluenceDataScale"}, - 0x30020050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PrimaryFluenceModeSequence"}, - 0x30020051 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FluenceMode"}, - 0x30020052 : { vr : "SH", vm : C.VM_SINGLE, keyword : "FluenceModeID"}, - 0x30040001 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DVHType"}, - 0x30040002 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DoseUnits"}, - 0x30040004 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DoseType"}, - 0x30040006 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DoseComment"}, - 0x30040008 : { vr : "DS", vm : C.VM_THREE, keyword : "NormalizationPoint"}, - 0x3004000A : { vr : "CS", vm : C.VM_SINGLE, keyword : "DoseSummationType"}, - 0x3004000C : { vr : "DS", vm : C.VM_2N, keyword : "GridFrameOffsetVector"}, - 0x3004000E : { vr : "DS", vm : C.VM_SINGLE, keyword : "DoseGridScaling"}, - 0x30040010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RTDoseROISequence"}, - 0x30040012 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DoseValue"}, - 0x30040014 : { vr : "CS", vm : C.VM_1_3, keyword : "TissueHeterogeneityCorrection"}, - 0x30040040 : { vr : "DS", vm : C.VM_THREE, keyword : "DVHNormalizationPoint"}, - 0x30040042 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DVHNormalizationDoseValue"}, - 0x30040050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DVHSequence"}, - 0x30040052 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DVHDoseScaling"}, - 0x30040054 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DVHVolumeUnits"}, - 0x30040056 : { vr : "IS", vm : C.VM_SINGLE, keyword : "DVHNumberOfBins"}, - 0x30040058 : { vr : "DS", vm : C.VM_2_2N, keyword : "DVHData"}, - 0x30040060 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DVHReferencedROISequence"}, - 0x30040062 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DVHROIContributionType"}, - 0x30040070 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DVHMinimumDose"}, - 0x30040072 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DVHMaximumDose"}, - 0x30040074 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DVHMeanDose"}, - 0x30060002 : { vr : "SH", vm : C.VM_SINGLE, keyword : "StructureSetLabel"}, - 0x30060004 : { vr : "LO", vm : C.VM_SINGLE, keyword : "StructureSetName"}, - 0x30060006 : { vr : "ST", vm : C.VM_SINGLE, keyword : "StructureSetDescription"}, - 0x30060008 : { vr : "DA", vm : C.VM_SINGLE, keyword : "StructureSetDate"}, - 0x30060009 : { vr : "TM", vm : C.VM_SINGLE, keyword : "StructureSetTime"}, - 0x30060010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedFrameOfReferenceSequence"}, - 0x30060012 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RTReferencedStudySequence"}, - 0x30060014 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RTReferencedSeriesSequence"}, - 0x30060016 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContourImageSequence"}, - 0x30060020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "StructureSetROISequence"}, - 0x30060022 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ROINumber"}, - 0x30060024 : { vr : "UI", vm : C.VM_SINGLE, keyword : "ReferencedFrameOfReferenceUID"}, - 0x30060026 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ROIName"}, - 0x30060028 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ROIDescription"}, - 0x3006002A : { vr : "IS", vm : C.VM_THREE, keyword : "ROIDisplayColor"}, - 0x3006002C : { vr : "DS", vm : C.VM_SINGLE, keyword : "ROIVolume"}, - 0x30060030 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RTRelatedROISequence"}, - 0x30060033 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RTROIRelationship"}, - 0x30060036 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ROIGenerationAlgorithm"}, - 0x30060038 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ROIGenerationDescription"}, - 0x30060039 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ROIContourSequence"}, - 0x30060040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ContourSequence"}, - 0x30060042 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ContourGeometricType"}, - 0x30060044 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ContourSlabThickness"}, - 0x30060045 : { vr : "DS", vm : C.VM_THREE, keyword : "ContourOffsetVector"}, - 0x30060046 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfContourPoints"}, - 0x30060048 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ContourNumber"}, - 0x30060049 : { vr : "IS", vm : C.VM_1N, keyword : "AttachedContours"}, - 0x30060050 : { vr : "DS", vm : C.VM_3_3N, keyword : "ContourData"}, - 0x30060080 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RTROIObservationsSequence"}, - 0x30060082 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ObservationNumber"}, - 0x30060084 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedROINumber"}, - 0x30060085 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ROIObservationLabel"}, - 0x30060086 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RTROIIdentificationCodeSequence"}, - 0x30060088 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ROIObservationDescription"}, - 0x300600A0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RelatedRTROIObservationsSequence"}, - 0x300600A4 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RTROIInterpretedType"}, - 0x300600A6 : { vr : "PN", vm : C.VM_SINGLE, keyword : "ROIInterpreter"}, - 0x300600B0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ROIPhysicalPropertiesSequence"}, - 0x300600B2 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ROIPhysicalProperty"}, - 0x300600B4 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ROIPhysicalPropertyValue"}, - 0x300600B6 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ROIElementalCompositionSequence"}, - 0x300600B7 : { vr : "US", vm : C.VM_SINGLE, keyword : "ROIElementalCompositionAtomicNumber"}, - 0x300600B8 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ROIElementalCompositionAtomicMassFraction"}, - 0x300600C0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FrameOfReferenceRelationshipSequence"}, - 0x300600C2 : { vr : "UI", vm : C.VM_SINGLE, keyword : "RelatedFrameOfReferenceUID"}, - 0x300600C4 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FrameOfReferenceTransformationType"}, - 0x300600C6 : { vr : "DS", vm : C.VM_16, keyword : "FrameOfReferenceTransformationMatrix"}, - 0x300600C8 : { vr : "LO", vm : C.VM_SINGLE, keyword : "FrameOfReferenceTransformationComment"}, - 0x30080010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MeasuredDoseReferenceSequence"}, - 0x30080012 : { vr : "ST", vm : C.VM_SINGLE, keyword : "MeasuredDoseDescription"}, - 0x30080014 : { vr : "CS", vm : C.VM_SINGLE, keyword : "MeasuredDoseType"}, - 0x30080016 : { vr : "DS", vm : C.VM_SINGLE, keyword : "MeasuredDoseValue"}, - 0x30080020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TreatmentSessionBeamSequence"}, - 0x30080021 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TreatmentSessionIonBeamSequence"}, - 0x30080022 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CurrentFractionNumber"}, - 0x30080024 : { vr : "DA", vm : C.VM_SINGLE, keyword : "TreatmentControlPointDate"}, - 0x30080025 : { vr : "TM", vm : C.VM_SINGLE, keyword : "TreatmentControlPointTime"}, - 0x3008002A : { vr : "CS", vm : C.VM_SINGLE, keyword : "TreatmentTerminationStatus"}, - 0x3008002B : { vr : "SH", vm : C.VM_SINGLE, keyword : "TreatmentTerminationCode"}, - 0x3008002C : { vr : "CS", vm : C.VM_SINGLE, keyword : "TreatmentVerificationStatus"}, - 0x30080030 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedTreatmentRecordSequence"}, - 0x30080032 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SpecifiedPrimaryMeterset"}, - 0x30080033 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SpecifiedSecondaryMeterset"}, - 0x30080036 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeliveredPrimaryMeterset"}, - 0x30080037 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeliveredSecondaryMeterset"}, - 0x3008003A : { vr : "DS", vm : C.VM_SINGLE, keyword : "SpecifiedTreatmentTime"}, - 0x3008003B : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeliveredTreatmentTime"}, - 0x30080040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ControlPointDeliverySequence"}, - 0x30080041 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonControlPointDeliverySequence"}, - 0x30080042 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SpecifiedMeterset"}, - 0x30080044 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeliveredMeterset"}, - 0x30080045 : { vr : "FL", vm : C.VM_SINGLE, keyword : "MetersetRateSet"}, - 0x30080046 : { vr : "FL", vm : C.VM_SINGLE, keyword : "MetersetRateDelivered"}, - 0x30080047 : { vr : "FL", vm : C.VM_1N, keyword : "ScanSpotMetersetsDelivered"}, - 0x30080048 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DoseRateDelivered"}, - 0x30080050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TreatmentSummaryCalculatedDoseReferenceSequence"}, - 0x30080052 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CumulativeDoseToDoseReference"}, - 0x30080054 : { vr : "DA", vm : C.VM_SINGLE, keyword : "FirstTreatmentDate"}, - 0x30080056 : { vr : "DA", vm : C.VM_SINGLE, keyword : "MostRecentTreatmentDate"}, - 0x3008005A : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfFractionsDelivered"}, - 0x30080060 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OverrideSequence"}, - 0x30080061 : { vr : "AT", vm : C.VM_SINGLE, keyword : "ParameterSequencePointer"}, - 0x30080062 : { vr : "AT", vm : C.VM_SINGLE, keyword : "OverrideParameterPointer"}, - 0x30080063 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ParameterItemIndex"}, - 0x30080064 : { vr : "IS", vm : C.VM_SINGLE, keyword : "MeasuredDoseReferenceNumber"}, - 0x30080065 : { vr : "AT", vm : C.VM_SINGLE, keyword : "ParameterPointer"}, - 0x30080066 : { vr : "ST", vm : C.VM_SINGLE, keyword : "OverrideReason"}, - 0x30080068 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CorrectedParameterSequence"}, - 0x3008006A : { vr : "FL", vm : C.VM_SINGLE, keyword : "CorrectionValue"}, - 0x30080070 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CalculatedDoseReferenceSequence"}, - 0x30080072 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CalculatedDoseReferenceNumber"}, - 0x30080074 : { vr : "ST", vm : C.VM_SINGLE, keyword : "CalculatedDoseReferenceDescription"}, - 0x30080076 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CalculatedDoseReferenceDoseValue"}, - 0x30080078 : { vr : "DS", vm : C.VM_SINGLE, keyword : "StartMeterset"}, - 0x3008007A : { vr : "DS", vm : C.VM_SINGLE, keyword : "EndMeterset"}, - 0x30080080 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedMeasuredDoseReferenceSequence"}, - 0x30080082 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedMeasuredDoseReferenceNumber"}, - 0x30080090 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedCalculatedDoseReferenceSequence"}, - 0x30080092 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedCalculatedDoseReferenceNumber"}, - 0x300800A0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BeamLimitingDeviceLeafPairsSequence"}, - 0x300800B0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedWedgeSequence"}, - 0x300800C0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedCompensatorSequence"}, - 0x300800D0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedBlockSequence"}, - 0x300800E0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TreatmentSummaryMeasuredDoseReferenceSequence"}, - 0x300800F0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedSnoutSequence"}, - 0x300800F2 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedRangeShifterSequence"}, - 0x300800F4 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedLateralSpreadingDeviceSequence"}, - 0x300800F6 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedRangeModulatorSequence"}, - 0x30080100 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedSourceSequence"}, - 0x30080105 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SourceSerialNumber"}, - 0x30080110 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TreatmentSessionApplicationSetupSequence"}, - 0x30080116 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ApplicationSetupCheck"}, - 0x30080120 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedBrachyAccessoryDeviceSequence"}, - 0x30080122 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedBrachyAccessoryDeviceNumber"}, - 0x30080130 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedChannelSequence"}, - 0x30080132 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SpecifiedChannelTotalTime"}, - 0x30080134 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeliveredChannelTotalTime"}, - 0x30080136 : { vr : "IS", vm : C.VM_SINGLE, keyword : "SpecifiedNumberOfPulses"}, - 0x30080138 : { vr : "IS", vm : C.VM_SINGLE, keyword : "DeliveredNumberOfPulses"}, - 0x3008013A : { vr : "DS", vm : C.VM_SINGLE, keyword : "SpecifiedPulseRepetitionInterval"}, - 0x3008013C : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeliveredPulseRepetitionInterval"}, - 0x30080140 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedSourceApplicatorSequence"}, - 0x30080142 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedSourceApplicatorNumber"}, - 0x30080150 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RecordedChannelShieldSequence"}, - 0x30080152 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedChannelShieldNumber"}, - 0x30080160 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BrachyControlPointDeliveredSequence"}, - 0x30080162 : { vr : "DA", vm : C.VM_SINGLE, keyword : "SafePositionExitDate"}, - 0x30080164 : { vr : "TM", vm : C.VM_SINGLE, keyword : "SafePositionExitTime"}, - 0x30080166 : { vr : "DA", vm : C.VM_SINGLE, keyword : "SafePositionReturnDate"}, - 0x30080168 : { vr : "TM", vm : C.VM_SINGLE, keyword : "SafePositionReturnTime"}, - 0x30080200 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CurrentTreatmentStatus"}, - 0x30080202 : { vr : "ST", vm : C.VM_SINGLE, keyword : "TreatmentStatusComment"}, - 0x30080220 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FractionGroupSummarySequence"}, - 0x30080223 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedFractionNumber"}, - 0x30080224 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FractionGroupType"}, - 0x30080230 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BeamStopperPosition"}, - 0x30080240 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FractionStatusSummarySequence"}, - 0x30080250 : { vr : "DA", vm : C.VM_SINGLE, keyword : "TreatmentDate"}, - 0x30080251 : { vr : "TM", vm : C.VM_SINGLE, keyword : "TreatmentTime"}, - 0x300A0002 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RTPlanLabel"}, - 0x300A0003 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RTPlanName"}, - 0x300A0004 : { vr : "ST", vm : C.VM_SINGLE, keyword : "RTPlanDescription"}, - 0x300A0006 : { vr : "DA", vm : C.VM_SINGLE, keyword : "RTPlanDate"}, - 0x300A0007 : { vr : "TM", vm : C.VM_SINGLE, keyword : "RTPlanTime"}, - 0x300A0009 : { vr : "LO", vm : C.VM_1N, keyword : "TreatmentProtocols"}, - 0x300A000A : { vr : "CS", vm : C.VM_SINGLE, keyword : "PlanIntent"}, - 0x300A000B : { vr : "LO", vm : C.VM_1N, keyword : "TreatmentSites"}, - 0x300A000C : { vr : "CS", vm : C.VM_SINGLE, keyword : "RTPlanGeometry"}, - 0x300A000E : { vr : "ST", vm : C.VM_SINGLE, keyword : "PrescriptionDescription"}, - 0x300A0010 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DoseReferenceSequence"}, - 0x300A0012 : { vr : "IS", vm : C.VM_SINGLE, keyword : "DoseReferenceNumber"}, - 0x300A0013 : { vr : "UI", vm : C.VM_SINGLE, keyword : "DoseReferenceUID"}, - 0x300A0014 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DoseReferenceStructureType"}, - 0x300A0015 : { vr : "CS", vm : C.VM_SINGLE, keyword : "NominalBeamEnergyUnit"}, - 0x300A0016 : { vr : "LO", vm : C.VM_SINGLE, keyword : "DoseReferenceDescription"}, - 0x300A0018 : { vr : "DS", vm : C.VM_THREE, keyword : "DoseReferencePointCoordinates"}, - 0x300A001A : { vr : "DS", vm : C.VM_SINGLE, keyword : "NominalPriorDose"}, - 0x300A0020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "DoseReferenceType"}, - 0x300A0021 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ConstraintWeight"}, - 0x300A0022 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeliveryWarningDose"}, - 0x300A0023 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DeliveryMaximumDose"}, - 0x300A0025 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TargetMinimumDose"}, - 0x300A0026 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TargetPrescriptionDose"}, - 0x300A0027 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TargetMaximumDose"}, - 0x300A0028 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TargetUnderdoseVolumeFraction"}, - 0x300A002A : { vr : "DS", vm : C.VM_SINGLE, keyword : "OrganAtRiskFullVolumeDose"}, - 0x300A002B : { vr : "DS", vm : C.VM_SINGLE, keyword : "OrganAtRiskLimitDose"}, - 0x300A002C : { vr : "DS", vm : C.VM_SINGLE, keyword : "OrganAtRiskMaximumDose"}, - 0x300A002D : { vr : "DS", vm : C.VM_SINGLE, keyword : "OrganAtRiskOverdoseVolumeFraction"}, - 0x300A0040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ToleranceTableSequence"}, - 0x300A0042 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ToleranceTableNumber"}, - 0x300A0043 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ToleranceTableLabel"}, - 0x300A0044 : { vr : "DS", vm : C.VM_SINGLE, keyword : "GantryAngleTolerance"}, - 0x300A0046 : { vr : "DS", vm : C.VM_SINGLE, keyword : "BeamLimitingDeviceAngleTolerance"}, - 0x300A0048 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BeamLimitingDeviceToleranceSequence"}, - 0x300A004A : { vr : "DS", vm : C.VM_SINGLE, keyword : "BeamLimitingDevicePositionTolerance"}, - 0x300A004B : { vr : "FL", vm : C.VM_SINGLE, keyword : "SnoutPositionTolerance"}, - 0x300A004C : { vr : "DS", vm : C.VM_SINGLE, keyword : "PatientSupportAngleTolerance"}, - 0x300A004E : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopEccentricAngleTolerance"}, - 0x300A004F : { vr : "FL", vm : C.VM_SINGLE, keyword : "TableTopPitchAngleTolerance"}, - 0x300A0050 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TableTopRollAngleTolerance"}, - 0x300A0051 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopVerticalPositionTolerance"}, - 0x300A0052 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopLongitudinalPositionTolerance"}, - 0x300A0053 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopLateralPositionTolerance"}, - 0x300A0055 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RTPlanRelationship"}, - 0x300A0070 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FractionGroupSequence"}, - 0x300A0071 : { vr : "IS", vm : C.VM_SINGLE, keyword : "FractionGroupNumber"}, - 0x300A0072 : { vr : "LO", vm : C.VM_SINGLE, keyword : "FractionGroupDescription"}, - 0x300A0078 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfFractionsPlanned"}, - 0x300A0079 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfFractionPatternDigitsPerDay"}, - 0x300A007A : { vr : "IS", vm : C.VM_SINGLE, keyword : "RepeatFractionCycleLength"}, - 0x300A007B : { vr : "LT", vm : C.VM_SINGLE, keyword : "FractionPattern"}, - 0x300A0080 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfBeams"}, - 0x300A0082 : { vr : "DS", vm : C.VM_THREE, keyword : "BeamDoseSpecificationPoint"}, - 0x300A0084 : { vr : "DS", vm : C.VM_SINGLE, keyword : "BeamDose"}, - 0x300A0086 : { vr : "DS", vm : C.VM_SINGLE, keyword : "BeamMeterset"}, - 0x300A0088 : { vr : "FL", vm : C.VM_SINGLE, keyword : "BeamDosePointDepth"}, - 0x300A0089 : { vr : "FL", vm : C.VM_SINGLE, keyword : "BeamDosePointEquivalentDepth"}, - 0x300A008A : { vr : "FL", vm : C.VM_SINGLE, keyword : "BeamDosePointSSD"}, - 0x300A00A0 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfBrachyApplicationSetups"}, - 0x300A00A2 : { vr : "DS", vm : C.VM_THREE, keyword : "BrachyApplicationSetupDoseSpecificationPoint"}, - 0x300A00A4 : { vr : "DS", vm : C.VM_SINGLE, keyword : "BrachyApplicationSetupDose"}, - 0x300A00B0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BeamSequence"}, - 0x300A00B2 : { vr : "SH", vm : C.VM_SINGLE, keyword : "TreatmentMachineName"}, - 0x300A00B3 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PrimaryDosimeterUnit"}, - 0x300A00B4 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceAxisDistance"}, - 0x300A00B6 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BeamLimitingDeviceSequence"}, - 0x300A00B8 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RTBeamLimitingDeviceType"}, - 0x300A00BA : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceToBeamLimitingDeviceDistance"}, - 0x300A00BB : { vr : "FL", vm : C.VM_SINGLE, keyword : "IsocenterToBeamLimitingDeviceDistance"}, - 0x300A00BC : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfLeafJawPairs"}, - 0x300A00BE : { vr : "DS", vm : C.VM_3N, keyword : "LeafPositionBoundaries"}, - 0x300A00C0 : { vr : "IS", vm : C.VM_SINGLE, keyword : "BeamNumber"}, - 0x300A00C2 : { vr : "LO", vm : C.VM_SINGLE, keyword : "BeamName"}, - 0x300A00C3 : { vr : "ST", vm : C.VM_SINGLE, keyword : "BeamDescription"}, - 0x300A00C4 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BeamType"}, - 0x300A00C6 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RadiationType"}, - 0x300A00C7 : { vr : "CS", vm : C.VM_SINGLE, keyword : "HighDoseTechniqueType"}, - 0x300A00C8 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferenceImageNumber"}, - 0x300A00CA : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PlannedVerificationImageSequence"}, - 0x300A00CC : { vr : "LO", vm : C.VM_1N, keyword : "ImagingDeviceSpecificAcquisitionParameters"}, - 0x300A00CE : { vr : "CS", vm : C.VM_SINGLE, keyword : "TreatmentDeliveryType"}, - 0x300A00D0 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfWedges"}, - 0x300A00D1 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "WedgeSequence"}, - 0x300A00D2 : { vr : "IS", vm : C.VM_SINGLE, keyword : "WedgeNumber"}, - 0x300A00D3 : { vr : "CS", vm : C.VM_SINGLE, keyword : "WedgeType"}, - 0x300A00D4 : { vr : "SH", vm : C.VM_SINGLE, keyword : "WedgeID"}, - 0x300A00D5 : { vr : "IS", vm : C.VM_SINGLE, keyword : "WedgeAngle"}, - 0x300A00D6 : { vr : "DS", vm : C.VM_SINGLE, keyword : "WedgeFactor"}, - 0x300A00D7 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TotalWedgeTrayWaterEquivalentThickness"}, - 0x300A00D8 : { vr : "DS", vm : C.VM_SINGLE, keyword : "WedgeOrientation"}, - 0x300A00D9 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IsocenterToWedgeTrayDistance"}, - 0x300A00DA : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceToWedgeTrayDistance"}, - 0x300A00DB : { vr : "FL", vm : C.VM_SINGLE, keyword : "WedgeThinEdgePosition"}, - 0x300A00DC : { vr : "SH", vm : C.VM_SINGLE, keyword : "BolusID"}, - 0x300A00DD : { vr : "ST", vm : C.VM_SINGLE, keyword : "BolusDescription"}, - 0x300A00E0 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfCompensators"}, - 0x300A00E1 : { vr : "SH", vm : C.VM_SINGLE, keyword : "MaterialID"}, - 0x300A00E2 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TotalCompensatorTrayFactor"}, - 0x300A00E3 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CompensatorSequence"}, - 0x300A00E4 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CompensatorNumber"}, - 0x300A00E5 : { vr : "SH", vm : C.VM_SINGLE, keyword : "CompensatorID"}, - 0x300A00E6 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceToCompensatorTrayDistance"}, - 0x300A00E7 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CompensatorRows"}, - 0x300A00E8 : { vr : "IS", vm : C.VM_SINGLE, keyword : "CompensatorColumns"}, - 0x300A00E9 : { vr : "DS", vm : C.VM_TWO, keyword : "CompensatorPixelSpacing"}, - 0x300A00EA : { vr : "DS", vm : C.VM_TWO, keyword : "CompensatorPosition"}, - 0x300A00EB : { vr : "DS", vm : C.VM_1N, keyword : "CompensatorTransmissionData"}, - 0x300A00EC : { vr : "DS", vm : C.VM_1N, keyword : "CompensatorThicknessData"}, - 0x300A00ED : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfBoli"}, - 0x300A00EE : { vr : "CS", vm : C.VM_SINGLE, keyword : "CompensatorType"}, - 0x300A00F0 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfBlocks"}, - 0x300A00F2 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TotalBlockTrayFactor"}, - 0x300A00F3 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TotalBlockTrayWaterEquivalentThickness"}, - 0x300A00F4 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BlockSequence"}, - 0x300A00F5 : { vr : "SH", vm : C.VM_SINGLE, keyword : "BlockTrayID"}, - 0x300A00F6 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceToBlockTrayDistance"}, - 0x300A00F7 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IsocenterToBlockTrayDistance"}, - 0x300A00F8 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BlockType"}, - 0x300A00F9 : { vr : "LO", vm : C.VM_SINGLE, keyword : "AccessoryCode"}, - 0x300A00FA : { vr : "CS", vm : C.VM_SINGLE, keyword : "BlockDivergence"}, - 0x300A00FB : { vr : "CS", vm : C.VM_SINGLE, keyword : "BlockMountingPosition"}, - 0x300A00FC : { vr : "IS", vm : C.VM_SINGLE, keyword : "BlockNumber"}, - 0x300A00FE : { vr : "LO", vm : C.VM_SINGLE, keyword : "BlockName"}, - 0x300A0100 : { vr : "DS", vm : C.VM_SINGLE, keyword : "BlockThickness"}, - 0x300A0102 : { vr : "DS", vm : C.VM_SINGLE, keyword : "BlockTransmission"}, - 0x300A0104 : { vr : "IS", vm : C.VM_SINGLE, keyword : "BlockNumberOfPoints"}, - 0x300A0106 : { vr : "DS", vm : C.VM_2_2N, keyword : "BlockData"}, - 0x300A0107 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ApplicatorSequence"}, - 0x300A0108 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ApplicatorID"}, - 0x300A0109 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ApplicatorType"}, - 0x300A010A : { vr : "LO", vm : C.VM_SINGLE, keyword : "ApplicatorDescription"}, - 0x300A010C : { vr : "DS", vm : C.VM_SINGLE, keyword : "CumulativeDoseReferenceCoefficient"}, - 0x300A010E : { vr : "DS", vm : C.VM_SINGLE, keyword : "FinalCumulativeMetersetWeight"}, - 0x300A0110 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfControlPoints"}, - 0x300A0111 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ControlPointSequence"}, - 0x300A0112 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ControlPointIndex"}, - 0x300A0114 : { vr : "DS", vm : C.VM_SINGLE, keyword : "NominalBeamEnergy"}, - 0x300A0115 : { vr : "DS", vm : C.VM_SINGLE, keyword : "DoseRateSet"}, - 0x300A0116 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "WedgePositionSequence"}, - 0x300A0118 : { vr : "CS", vm : C.VM_SINGLE, keyword : "WedgePosition"}, - 0x300A011A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BeamLimitingDevicePositionSequence"}, - 0x300A011C : { vr : "DS", vm : C.VM_2_2N, keyword : "LeafJawPositions"}, - 0x300A011E : { vr : "DS", vm : C.VM_SINGLE, keyword : "GantryAngle"}, - 0x300A011F : { vr : "CS", vm : C.VM_SINGLE, keyword : "GantryRotationDirection"}, - 0x300A0120 : { vr : "DS", vm : C.VM_SINGLE, keyword : "BeamLimitingDeviceAngle"}, - 0x300A0121 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BeamLimitingDeviceRotationDirection"}, - 0x300A0122 : { vr : "DS", vm : C.VM_SINGLE, keyword : "PatientSupportAngle"}, - 0x300A0123 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PatientSupportRotationDirection"}, - 0x300A0124 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopEccentricAxisDistance"}, - 0x300A0125 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopEccentricAngle"}, - 0x300A0126 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TableTopEccentricRotationDirection"}, - 0x300A0128 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopVerticalPosition"}, - 0x300A0129 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopLongitudinalPosition"}, - 0x300A012A : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopLateralPosition"}, - 0x300A012C : { vr : "DS", vm : C.VM_THREE, keyword : "IsocenterPosition"}, - 0x300A012E : { vr : "DS", vm : C.VM_THREE, keyword : "SurfaceEntryPoint"}, - 0x300A0130 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceToSurfaceDistance"}, - 0x300A0134 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CumulativeMetersetWeight"}, - 0x300A0140 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TableTopPitchAngle"}, - 0x300A0142 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TableTopPitchRotationDirection"}, - 0x300A0144 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TableTopRollAngle"}, - 0x300A0146 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TableTopRollRotationDirection"}, - 0x300A0148 : { vr : "FL", vm : C.VM_SINGLE, keyword : "HeadFixationAngle"}, - 0x300A014A : { vr : "FL", vm : C.VM_SINGLE, keyword : "GantryPitchAngle"}, - 0x300A014C : { vr : "CS", vm : C.VM_SINGLE, keyword : "GantryPitchRotationDirection"}, - 0x300A014E : { vr : "FL", vm : C.VM_SINGLE, keyword : "GantryPitchAngleTolerance"}, - 0x300A0180 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PatientSetupSequence"}, - 0x300A0182 : { vr : "IS", vm : C.VM_SINGLE, keyword : "PatientSetupNumber"}, - 0x300A0183 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientSetupLabel"}, - 0x300A0184 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientAdditionalPosition"}, - 0x300A0190 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "FixationDeviceSequence"}, - 0x300A0192 : { vr : "CS", vm : C.VM_SINGLE, keyword : "FixationDeviceType"}, - 0x300A0194 : { vr : "SH", vm : C.VM_SINGLE, keyword : "FixationDeviceLabel"}, - 0x300A0196 : { vr : "ST", vm : C.VM_SINGLE, keyword : "FixationDeviceDescription"}, - 0x300A0198 : { vr : "SH", vm : C.VM_SINGLE, keyword : "FixationDevicePosition"}, - 0x300A0199 : { vr : "FL", vm : C.VM_SINGLE, keyword : "FixationDevicePitchAngle"}, - 0x300A019A : { vr : "FL", vm : C.VM_SINGLE, keyword : "FixationDeviceRollAngle"}, - 0x300A01A0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ShieldingDeviceSequence"}, - 0x300A01A2 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ShieldingDeviceType"}, - 0x300A01A4 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ShieldingDeviceLabel"}, - 0x300A01A6 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ShieldingDeviceDescription"}, - 0x300A01A8 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ShieldingDevicePosition"}, - 0x300A01B0 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SetupTechnique"}, - 0x300A01B2 : { vr : "ST", vm : C.VM_SINGLE, keyword : "SetupTechniqueDescription"}, - 0x300A01B4 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SetupDeviceSequence"}, - 0x300A01B6 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SetupDeviceType"}, - 0x300A01B8 : { vr : "SH", vm : C.VM_SINGLE, keyword : "SetupDeviceLabel"}, - 0x300A01BA : { vr : "ST", vm : C.VM_SINGLE, keyword : "SetupDeviceDescription"}, - 0x300A01BC : { vr : "DS", vm : C.VM_SINGLE, keyword : "SetupDeviceParameter"}, - 0x300A01D0 : { vr : "ST", vm : C.VM_SINGLE, keyword : "SetupReferenceDescription"}, - 0x300A01D2 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopVerticalSetupDisplacement"}, - 0x300A01D4 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopLongitudinalSetupDisplacement"}, - 0x300A01D6 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TableTopLateralSetupDisplacement"}, - 0x300A0200 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BrachyTreatmentTechnique"}, - 0x300A0202 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BrachyTreatmentType"}, - 0x300A0206 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "TreatmentMachineSequence"}, - 0x300A0210 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SourceSequence"}, - 0x300A0212 : { vr : "IS", vm : C.VM_SINGLE, keyword : "SourceNumber"}, - 0x300A0214 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SourceType"}, - 0x300A0216 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SourceManufacturer"}, - 0x300A0218 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ActiveSourceDiameter"}, - 0x300A021A : { vr : "DS", vm : C.VM_SINGLE, keyword : "ActiveSourceLength"}, - 0x300A0222 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceEncapsulationNominalThickness"}, - 0x300A0224 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceEncapsulationNominalTransmission"}, - 0x300A0226 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SourceIsotopeName"}, - 0x300A0228 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceIsotopeHalfLife"}, - 0x300A0229 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SourceStrengthUnits"}, - 0x300A022A : { vr : "DS", vm : C.VM_SINGLE, keyword : "ReferenceAirKermaRate"}, - 0x300A022B : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceStrength"}, - 0x300A022C : { vr : "DA", vm : C.VM_SINGLE, keyword : "SourceStrengthReferenceDate"}, - 0x300A022E : { vr : "TM", vm : C.VM_SINGLE, keyword : "SourceStrengthReferenceTime"}, - 0x300A0230 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ApplicationSetupSequence"}, - 0x300A0232 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ApplicationSetupType"}, - 0x300A0234 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ApplicationSetupNumber"}, - 0x300A0236 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ApplicationSetupName"}, - 0x300A0238 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ApplicationSetupManufacturer"}, - 0x300A0240 : { vr : "IS", vm : C.VM_SINGLE, keyword : "TemplateNumber"}, - 0x300A0242 : { vr : "SH", vm : C.VM_SINGLE, keyword : "TemplateType"}, - 0x300A0244 : { vr : "LO", vm : C.VM_SINGLE, keyword : "TemplateName"}, - 0x300A0250 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TotalReferenceAirKerma"}, - 0x300A0260 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BrachyAccessoryDeviceSequence"}, - 0x300A0262 : { vr : "IS", vm : C.VM_SINGLE, keyword : "BrachyAccessoryDeviceNumber"}, - 0x300A0263 : { vr : "SH", vm : C.VM_SINGLE, keyword : "BrachyAccessoryDeviceID"}, - 0x300A0264 : { vr : "CS", vm : C.VM_SINGLE, keyword : "BrachyAccessoryDeviceType"}, - 0x300A0266 : { vr : "LO", vm : C.VM_SINGLE, keyword : "BrachyAccessoryDeviceName"}, - 0x300A026A : { vr : "DS", vm : C.VM_SINGLE, keyword : "BrachyAccessoryDeviceNominalThickness"}, - 0x300A026C : { vr : "DS", vm : C.VM_SINGLE, keyword : "BrachyAccessoryDeviceNominalTransmission"}, - 0x300A0280 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ChannelSequence"}, - 0x300A0282 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ChannelNumber"}, - 0x300A0284 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ChannelLength"}, - 0x300A0286 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ChannelTotalTime"}, - 0x300A0288 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SourceMovementType"}, - 0x300A028A : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfPulses"}, - 0x300A028C : { vr : "DS", vm : C.VM_SINGLE, keyword : "PulseRepetitionInterval"}, - 0x300A0290 : { vr : "IS", vm : C.VM_SINGLE, keyword : "SourceApplicatorNumber"}, - 0x300A0291 : { vr : "SH", vm : C.VM_SINGLE, keyword : "SourceApplicatorID"}, - 0x300A0292 : { vr : "CS", vm : C.VM_SINGLE, keyword : "SourceApplicatorType"}, - 0x300A0294 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SourceApplicatorName"}, - 0x300A0296 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceApplicatorLength"}, - 0x300A0298 : { vr : "LO", vm : C.VM_SINGLE, keyword : "SourceApplicatorManufacturer"}, - 0x300A029C : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceApplicatorWallNominalThickness"}, - 0x300A029E : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceApplicatorWallNominalTransmission"}, - 0x300A02A0 : { vr : "DS", vm : C.VM_SINGLE, keyword : "SourceApplicatorStepSize"}, - 0x300A02A2 : { vr : "IS", vm : C.VM_SINGLE, keyword : "TransferTubeNumber"}, - 0x300A02A4 : { vr : "DS", vm : C.VM_SINGLE, keyword : "TransferTubeLength"}, - 0x300A02B0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ChannelShieldSequence"}, - 0x300A02B2 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ChannelShieldNumber"}, - 0x300A02B3 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ChannelShieldID"}, - 0x300A02B4 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ChannelShieldName"}, - 0x300A02B8 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ChannelShieldNominalThickness"}, - 0x300A02BA : { vr : "DS", vm : C.VM_SINGLE, keyword : "ChannelShieldNominalTransmission"}, - 0x300A02C8 : { vr : "DS", vm : C.VM_SINGLE, keyword : "FinalCumulativeTimeWeight"}, - 0x300A02D0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BrachyControlPointSequence"}, - 0x300A02D2 : { vr : "DS", vm : C.VM_SINGLE, keyword : "ControlPointRelativePosition"}, - 0x300A02D4 : { vr : "DS", vm : C.VM_THREE, keyword : "ControlPoint3DPosition"}, - 0x300A02D6 : { vr : "DS", vm : C.VM_SINGLE, keyword : "CumulativeTimeWeight"}, - 0x300A02E0 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CompensatorDivergence"}, - 0x300A02E1 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CompensatorMountingPosition"}, - 0x300A02E2 : { vr : "DS", vm : C.VM_1N, keyword : "SourceToCompensatorDistance"}, - 0x300A02E3 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TotalCompensatorTrayWaterEquivalentThickness"}, - 0x300A02E4 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IsocenterToCompensatorTrayDistance"}, - 0x300A02E5 : { vr : "FL", vm : C.VM_SINGLE, keyword : "CompensatorColumnOffset"}, - 0x300A02E6 : { vr : "FL", vm : C.VM_1N, keyword : "IsocenterToCompensatorDistances"}, - 0x300A02E7 : { vr : "FL", vm : C.VM_SINGLE, keyword : "CompensatorRelativeStoppingPowerRatio"}, - 0x300A02E8 : { vr : "FL", vm : C.VM_SINGLE, keyword : "CompensatorMillingToolDiameter"}, - 0x300A02EA : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonRangeCompensatorSequence"}, - 0x300A02EB : { vr : "LT", vm : C.VM_SINGLE, keyword : "CompensatorDescription"}, - 0x300A0302 : { vr : "IS", vm : C.VM_SINGLE, keyword : "RadiationMassNumber"}, - 0x300A0304 : { vr : "IS", vm : C.VM_SINGLE, keyword : "RadiationAtomicNumber"}, - 0x300A0306 : { vr : "SS", vm : C.VM_SINGLE, keyword : "RadiationChargeState"}, - 0x300A0308 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ScanMode"}, - 0x300A030A : { vr : "FL", vm : C.VM_TWO, keyword : "VirtualSourceAxisDistances"}, - 0x300A030C : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SnoutSequence"}, - 0x300A030D : { vr : "FL", vm : C.VM_SINGLE, keyword : "SnoutPosition"}, - 0x300A030F : { vr : "SH", vm : C.VM_SINGLE, keyword : "SnoutID"}, - 0x300A0312 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfRangeShifters"}, - 0x300A0314 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RangeShifterSequence"}, - 0x300A0316 : { vr : "IS", vm : C.VM_SINGLE, keyword : "RangeShifterNumber"}, - 0x300A0318 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RangeShifterID"}, - 0x300A0320 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RangeShifterType"}, - 0x300A0322 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RangeShifterDescription"}, - 0x300A0330 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfLateralSpreadingDevices"}, - 0x300A0332 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LateralSpreadingDeviceSequence"}, - 0x300A0334 : { vr : "IS", vm : C.VM_SINGLE, keyword : "LateralSpreadingDeviceNumber"}, - 0x300A0336 : { vr : "SH", vm : C.VM_SINGLE, keyword : "LateralSpreadingDeviceID"}, - 0x300A0338 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LateralSpreadingDeviceType"}, - 0x300A033A : { vr : "LO", vm : C.VM_SINGLE, keyword : "LateralSpreadingDeviceDescription"}, - 0x300A033C : { vr : "FL", vm : C.VM_SINGLE, keyword : "LateralSpreadingDeviceWaterEquivalentThickness"}, - 0x300A0340 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfRangeModulators"}, - 0x300A0342 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RangeModulatorSequence"}, - 0x300A0344 : { vr : "IS", vm : C.VM_SINGLE, keyword : "RangeModulatorNumber"}, - 0x300A0346 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RangeModulatorID"}, - 0x300A0348 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RangeModulatorType"}, - 0x300A034A : { vr : "LO", vm : C.VM_SINGLE, keyword : "RangeModulatorDescription"}, - 0x300A034C : { vr : "SH", vm : C.VM_SINGLE, keyword : "BeamCurrentModulationID"}, - 0x300A0350 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PatientSupportType"}, - 0x300A0352 : { vr : "SH", vm : C.VM_SINGLE, keyword : "PatientSupportID"}, - 0x300A0354 : { vr : "LO", vm : C.VM_SINGLE, keyword : "PatientSupportAccessoryCode"}, - 0x300A0356 : { vr : "FL", vm : C.VM_SINGLE, keyword : "FixationLightAzimuthalAngle"}, - 0x300A0358 : { vr : "FL", vm : C.VM_SINGLE, keyword : "FixationLightPolarAngle"}, - 0x300A035A : { vr : "FL", vm : C.VM_SINGLE, keyword : "MetersetRate"}, - 0x300A0360 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RangeShifterSettingsSequence"}, - 0x300A0362 : { vr : "LO", vm : C.VM_SINGLE, keyword : "RangeShifterSetting"}, - 0x300A0364 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IsocenterToRangeShifterDistance"}, - 0x300A0366 : { vr : "FL", vm : C.VM_SINGLE, keyword : "RangeShifterWaterEquivalentThickness"}, - 0x300A0370 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "LateralSpreadingDeviceSettingsSequence"}, - 0x300A0372 : { vr : "LO", vm : C.VM_SINGLE, keyword : "LateralSpreadingDeviceSetting"}, - 0x300A0374 : { vr : "FL", vm : C.VM_SINGLE, keyword : "IsocenterToLateralSpreadingDeviceDistance"}, - 0x300A0380 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RangeModulatorSettingsSequence"}, - 0x300A0382 : { vr : "FL", vm : C.VM_SINGLE, keyword : "RangeModulatorGatingStartValue"}, - 0x300A0384 : { vr : "FL", vm : C.VM_SINGLE, keyword : "RangeModulatorGatingStopValue"}, - 0x300A0386 : { vr : "FL", vm : C.VM_SINGLE, keyword : "RangeModulatorGatingStartWaterEquivalentThickness"}, - 0x300A0388 : { vr : "FL", vm : C.VM_SINGLE, keyword : "RangeModulatorGatingStopWaterEquivalentThickness"}, - 0x300A038A : { vr : "FL", vm : C.VM_SINGLE, keyword : "IsocenterToRangeModulatorDistance"}, - 0x300A0390 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ScanSpotTuneID"}, - 0x300A0392 : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfScanSpotPositions"}, - 0x300A0394 : { vr : "FL", vm : C.VM_1N, keyword : "ScanSpotPositionMap"}, - 0x300A0396 : { vr : "FL", vm : C.VM_1N, keyword : "ScanSpotMetersetWeights"}, - 0x300A0398 : { vr : "FL", vm : C.VM_TWO, keyword : "ScanningSpotSize"}, - 0x300A039A : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfPaintings"}, - 0x300A03A0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonToleranceTableSequence"}, - 0x300A03A2 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonBeamSequence"}, - 0x300A03A4 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonBeamLimitingDeviceSequence"}, - 0x300A03A6 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonBlockSequence"}, - 0x300A03A8 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonControlPointSequence"}, - 0x300A03AA : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonWedgeSequence"}, - 0x300A03AC : { vr : "SQ", vm : C.VM_SINGLE, keyword : "IonWedgePositionSequence"}, - 0x300A0401 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedSetupImageSequence"}, - 0x300A0402 : { vr : "ST", vm : C.VM_SINGLE, keyword : "SetupImageComment"}, - 0x300A0410 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MotionSynchronizationSequence"}, - 0x300A0412 : { vr : "FL", vm : C.VM_THREE, keyword : "ControlPointOrientation"}, - 0x300A0420 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "GeneralAccessorySequence"}, - 0x300A0421 : { vr : "SH", vm : C.VM_SINGLE, keyword : "GeneralAccessoryID"}, - 0x300A0422 : { vr : "ST", vm : C.VM_SINGLE, keyword : "GeneralAccessoryDescription"}, - 0x300A0423 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GeneralAccessoryType"}, - 0x300A0424 : { vr : "IS", vm : C.VM_SINGLE, keyword : "GeneralAccessoryNumber"}, - 0x300A0431 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ApplicatorGeometrySequence"}, - 0x300A0432 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ApplicatorApertureShape"}, - 0x300A0433 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ApplicatorOpening"}, - 0x300A0434 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ApplicatorOpeningX"}, - 0x300A0435 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ApplicatorOpeningY"}, - 0x300A0436 : { vr : "FL", vm : C.VM_SINGLE, keyword : "SourceToApplicatorMountingPositionDistance"}, - 0x300C0002 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedRTPlanSequence"}, - 0x300C0004 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedBeamSequence"}, - 0x300C0006 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedBeamNumber"}, - 0x300C0007 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedReferenceImageNumber"}, - 0x300C0008 : { vr : "DS", vm : C.VM_SINGLE, keyword : "StartCumulativeMetersetWeight"}, - 0x300C0009 : { vr : "DS", vm : C.VM_SINGLE, keyword : "EndCumulativeMetersetWeight"}, - 0x300C000A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedBrachyApplicationSetupSequence"}, - 0x300C000C : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedBrachyApplicationSetupNumber"}, - 0x300C000E : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedSourceNumber"}, - 0x300C0020 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedFractionGroupSequence"}, - 0x300C0022 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedFractionGroupNumber"}, - 0x300C0040 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedVerificationImageSequence"}, - 0x300C0042 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedReferenceImageSequence"}, - 0x300C0050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedDoseReferenceSequence"}, - 0x300C0051 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedDoseReferenceNumber"}, - 0x300C0055 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BrachyReferencedDoseReferenceSequence"}, - 0x300C0060 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedStructureSetSequence"}, - 0x300C006A : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedPatientSetupNumber"}, - 0x300C0080 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedDoseSequence"}, - 0x300C00A0 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedToleranceTableNumber"}, - 0x300C00B0 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedBolusSequence"}, - 0x300C00C0 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedWedgeNumber"}, - 0x300C00D0 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedCompensatorNumber"}, - 0x300C00E0 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedBlockNumber"}, - 0x300C00F0 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedControlPointIndex"}, - 0x300C00F2 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedControlPointSequence"}, - 0x300C00F4 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedStartControlPointIndex"}, - 0x300C00F6 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedStopControlPointIndex"}, - 0x300C0100 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedRangeShifterNumber"}, - 0x300C0102 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedLateralSpreadingDeviceNumber"}, - 0x300C0104 : { vr : "IS", vm : C.VM_SINGLE, keyword : "ReferencedRangeModulatorNumber"}, - 0x300E0002 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ApprovalStatus"}, - 0x300E0004 : { vr : "DA", vm : C.VM_SINGLE, keyword : "ReviewDate"}, - 0x300E0005 : { vr : "TM", vm : C.VM_SINGLE, keyword : "ReviewTime"}, - 0x300E0008 : { vr : "PN", vm : C.VM_SINGLE, keyword : "ReviewerName"}, - 0x40000010 : { vr : "LT", vm : C.VM_SINGLE, keyword : "Arbitrary"}, - 0x40004000 : { vr : "LT", vm : C.VM_SINGLE, keyword : "TextComments"}, - 0x40080040 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ResultsID"}, - 0x40080042 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ResultsIDIssuer"}, - 0x40080050 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ReferencedInterpretationSequence"}, - 0x400800FF : { vr : "CS", vm : C.VM_SINGLE, keyword : "ReportProductionStatusTrial"}, - 0x40080100 : { vr : "DA", vm : C.VM_SINGLE, keyword : "InterpretationRecordedDate"}, - 0x40080101 : { vr : "TM", vm : C.VM_SINGLE, keyword : "InterpretationRecordedTime"}, - 0x40080102 : { vr : "PN", vm : C.VM_SINGLE, keyword : "InterpretationRecorder"}, - 0x40080103 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ReferenceToRecordedSound"}, - 0x40080108 : { vr : "DA", vm : C.VM_SINGLE, keyword : "InterpretationTranscriptionDate"}, - 0x40080109 : { vr : "TM", vm : C.VM_SINGLE, keyword : "InterpretationTranscriptionTime"}, - 0x4008010A : { vr : "PN", vm : C.VM_SINGLE, keyword : "InterpretationTranscriber"}, - 0x4008010B : { vr : "ST", vm : C.VM_SINGLE, keyword : "InterpretationText"}, - 0x4008010C : { vr : "PN", vm : C.VM_SINGLE, keyword : "InterpretationAuthor"}, - 0x40080111 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "InterpretationApproverSequence"}, - 0x40080112 : { vr : "DA", vm : C.VM_SINGLE, keyword : "InterpretationApprovalDate"}, - 0x40080113 : { vr : "TM", vm : C.VM_SINGLE, keyword : "InterpretationApprovalTime"}, - 0x40080114 : { vr : "PN", vm : C.VM_SINGLE, keyword : "PhysicianApprovingInterpretation"}, - 0x40080115 : { vr : "LT", vm : C.VM_SINGLE, keyword : "InterpretationDiagnosisDescription"}, - 0x40080117 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "InterpretationDiagnosisCodeSequence"}, - 0x40080118 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ResultsDistributionListSequence"}, - 0x40080119 : { vr : "PN", vm : C.VM_SINGLE, keyword : "DistributionName"}, - 0x4008011A : { vr : "LO", vm : C.VM_SINGLE, keyword : "DistributionAddress"}, - 0x40080200 : { vr : "SH", vm : C.VM_SINGLE, keyword : "InterpretationID"}, - 0x40080202 : { vr : "LO", vm : C.VM_SINGLE, keyword : "InterpretationIDIssuer"}, - 0x40080210 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InterpretationTypeID"}, - 0x40080212 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InterpretationStatusID"}, - 0x40080300 : { vr : "ST", vm : C.VM_SINGLE, keyword : "Impressions"}, - 0x40084000 : { vr : "ST", vm : C.VM_SINGLE, keyword : "ResultsComments"}, - 0x40100001 : { vr : "CS", vm : C.VM_SINGLE, keyword : "LowEnergyDetectors"}, - 0x40100002 : { vr : "CS", vm : C.VM_SINGLE, keyword : "HighEnergyDetectors"}, - 0x40100004 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DetectorGeometrySequence"}, - 0x40101001 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ThreatROIVoxelSequence"}, - 0x40101004 : { vr : "FL", vm : C.VM_THREE, keyword : "ThreatROIBase"}, - 0x40101005 : { vr : "FL", vm : C.VM_THREE, keyword : "ThreatROIExtents"}, - 0x40101006 : { vr : "OB", vm : C.VM_SINGLE, keyword : "ThreatROIBitmap"}, - 0x40101007 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RouteSegmentID"}, - 0x40101008 : { vr : "CS", vm : C.VM_SINGLE, keyword : "GantryType"}, - 0x40101009 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OOIOwnerType"}, - 0x4010100A : { vr : "SQ", vm : C.VM_SINGLE, keyword : "RouteSegmentSequence"}, - 0x40101010 : { vr : "US", vm : C.VM_SINGLE, keyword : "PotentialThreatObjectID"}, - 0x40101011 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ThreatSequence"}, - 0x40101012 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ThreatCategory"}, - 0x40101013 : { vr : "LT", vm : C.VM_SINGLE, keyword : "ThreatCategoryDescription"}, - 0x40101014 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ATDAbilityAssessment"}, - 0x40101015 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ATDAssessmentFlag"}, - 0x40101016 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ATDAssessmentProbability"}, - 0x40101017 : { vr : "FL", vm : C.VM_SINGLE, keyword : "Mass"}, - 0x40101018 : { vr : "FL", vm : C.VM_SINGLE, keyword : "Density"}, - 0x40101019 : { vr : "FL", vm : C.VM_SINGLE, keyword : "ZEffective"}, - 0x4010101A : { vr : "SH", vm : C.VM_SINGLE, keyword : "BoardingPassID"}, - 0x4010101B : { vr : "FL", vm : C.VM_THREE, keyword : "CenterOfMass"}, - 0x4010101C : { vr : "FL", vm : C.VM_THREE, keyword : "CenterOfPTO"}, - 0x4010101D : { vr : "FL", vm : C.VM_6N, keyword : "BoundingPolygon"}, - 0x4010101E : { vr : "SH", vm : C.VM_SINGLE, keyword : "RouteSegmentStartLocationID"}, - 0x4010101F : { vr : "SH", vm : C.VM_SINGLE, keyword : "RouteSegmentEndLocationID"}, - 0x40101020 : { vr : "CS", vm : C.VM_SINGLE, keyword : "RouteSegmentLocationIDType"}, - 0x40101021 : { vr : "CS", vm : C.VM_1N, keyword : "AbortReason"}, - 0x40101023 : { vr : "FL", vm : C.VM_SINGLE, keyword : "VolumeOfPTO"}, - 0x40101024 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AbortFlag"}, - 0x40101025 : { vr : "DT", vm : C.VM_SINGLE, keyword : "RouteSegmentStartTime"}, - 0x40101026 : { vr : "DT", vm : C.VM_SINGLE, keyword : "RouteSegmentEndTime"}, - 0x40101027 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TDRType"}, - 0x40101028 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InternationalRouteSegment"}, - 0x40101029 : { vr : "LO", vm : C.VM_1N, keyword : "ThreatDetectionAlgorithmandVersion"}, - 0x4010102A : { vr : "SH", vm : C.VM_SINGLE, keyword : "AssignedLocation"}, - 0x4010102B : { vr : "DT", vm : C.VM_SINGLE, keyword : "AlarmDecisionTime"}, - 0x40101031 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AlarmDecision"}, - 0x40101033 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfTotalObjects"}, - 0x40101034 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfAlarmObjects"}, - 0x40101037 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PTORepresentationSequence"}, - 0x40101038 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "ATDAssessmentSequence"}, - 0x40101039 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TIPType"}, - 0x4010103A : { vr : "CS", vm : C.VM_SINGLE, keyword : "DICOSVersion"}, - 0x40101041 : { vr : "DT", vm : C.VM_SINGLE, keyword : "OOIOwnerCreationTime"}, - 0x40101042 : { vr : "CS", vm : C.VM_SINGLE, keyword : "OOIType"}, - 0x40101043 : { vr : "FL", vm : C.VM_THREE, keyword : "OOISize"}, - 0x40101044 : { vr : "CS", vm : C.VM_SINGLE, keyword : "AcquisitionStatus"}, - 0x40101045 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "BasisMaterialsCodeSequence"}, - 0x40101046 : { vr : "CS", vm : C.VM_SINGLE, keyword : "PhantomType"}, - 0x40101047 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "OOIOwnerSequence"}, - 0x40101048 : { vr : "CS", vm : C.VM_SINGLE, keyword : "ScanType"}, - 0x40101051 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ItineraryID"}, - 0x40101052 : { vr : "SH", vm : C.VM_SINGLE, keyword : "ItineraryIDType"}, - 0x40101053 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ItineraryIDAssigningAuthority"}, - 0x40101054 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RouteID"}, - 0x40101055 : { vr : "SH", vm : C.VM_SINGLE, keyword : "RouteIDAssigningAuthority"}, - 0x40101056 : { vr : "CS", vm : C.VM_SINGLE, keyword : "InboundArrivalType"}, - 0x40101058 : { vr : "SH", vm : C.VM_SINGLE, keyword : "CarrierID"}, - 0x40101059 : { vr : "CS", vm : C.VM_SINGLE, keyword : "CarrierIDAssigningAuthority"}, - 0x40101060 : { vr : "FL", vm : C.VM_THREE, keyword : "SourceOrientation"}, - 0x40101061 : { vr : "FL", vm : C.VM_THREE, keyword : "SourcePosition"}, - 0x40101062 : { vr : "FL", vm : C.VM_SINGLE, keyword : "BeltHeight"}, - 0x40101064 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "AlgorithmRoutingCodeSequence"}, - 0x40101067 : { vr : "CS", vm : C.VM_SINGLE, keyword : "TransportClassification"}, - 0x40101068 : { vr : "LT", vm : C.VM_SINGLE, keyword : "OOITypeDescriptor"}, - 0x40101069 : { vr : "FL", vm : C.VM_SINGLE, keyword : "TotalProcessingTime"}, - 0x4010106C : { vr : "OB", vm : C.VM_SINGLE, keyword : "DetectorCalibrationData"}, - 0x4FFE0001 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "MACParametersSequence"}, - 0x52009229 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "SharedFunctionalGroupsSequence"}, - 0x52009230 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "PerFrameFunctionalGroupsSequence"}, - 0x54000100 : { vr : "SQ", vm : C.VM_SINGLE, keyword : "WaveformSequence"}, - 0x54000110 : { vr : "OB", vm : C.VM_SINGLE, keyword : "ChannelMinimumValue"}, - 0x54000112 : { vr : "OB", vm : C.VM_SINGLE, keyword : "ChannelMaximumValue"}, - 0x54001004 : { vr : "US", vm : C.VM_SINGLE, keyword : "WaveformBitsAllocated"}, - 0x54001006 : { vr : "CS", vm : C.VM_SINGLE, keyword : "WaveformSampleInterpretation"}, - 0x5400100A : { vr : "OB", vm : C.VM_SINGLE, keyword : "WaveformPaddingValue"}, - 0x54001010 : { vr : "OB", vm : C.VM_SINGLE, keyword : "WaveformData"}, - 0x56000010 : { vr : "OF", vm : C.VM_SINGLE, keyword : "FirstOrderPhaseCorrectionAngle"}, - 0x56000020 : { vr : "OF", vm : C.VM_SINGLE, keyword : "SpectroscopyData"}, - 0x7FE00010 : { vr : "OW", vm : C.VM_SINGLE, keyword : "PixelData"}, - 0x7FE00020 : { vr : "OW", vm : C.VM_SINGLE, keyword : "CoefficientsSDVN"}, - 0x7FE00030 : { vr : "OW", vm : C.VM_SINGLE, keyword : "CoefficientsSDHN"}, - 0x7FE00040 : { vr : "OW", vm : C.VM_SINGLE, keyword : "CoefficientsSDDN"}, - 0xFFFAFFFA : { vr : "SQ", vm : C.VM_SINGLE, keyword : "DigitalSignaturesSequence"}, - 0xFFFCFFFC : { vr : "OB", vm : C.VM_SINGLE, keyword : "DataSetTrailingPadding"}, - 0xFFFEE000 : { vr : null, vm : C.VM_SINGLE, keyword : "Item"}, - 0xFFFEE00D : { vr : null, vm : C.VM_SINGLE, keyword : "ItemDelimitationItem"}, - 0xFFFEE0DD : { vr : null, vm : C.VM_SINGLE, keyword : "SequenceDelimitationItem"}, - 0x00000000 : { vr : "UL", vm : C.VM_SINGLE, keyword : "CommandGroupLength"}, - 0x00000002 : { vr : "UI", vm : C.VM_SINGLE, keyword : "AffectedSOPClassUID"}, - 0x00000003 : { vr : "UI", vm : C.VM_SINGLE, keyword : "RequestedSOPClassUID"}, - 0x00000100 : { vr : "US", vm : C.VM_SINGLE, keyword : "CommandField"}, - 0x00000110 : { vr : "US", vm : C.VM_SINGLE, keyword : "MessageID"}, - 0x00000120 : { vr : "US", vm : C.VM_SINGLE, keyword : "MessageIDBeingRespondedTo"}, - 0x00000600 : { vr : "AE", vm : C.VM_SINGLE, keyword : "MoveDestination"}, - 0x00000700 : { vr : "US", vm : C.VM_SINGLE, keyword : "Priority"}, - 0x00000800 : { vr : "US", vm : C.VM_SINGLE, keyword : "CommandDataSetType"}, - 0x00000900 : { vr : "US", vm : C.VM_SINGLE, keyword : "Status"}, - 0x00000901 : { vr : "AT", vm : C.VM_1N, keyword : "OffendingElement"}, - 0x00000902 : { vr : "LO", vm : C.VM_SINGLE, keyword : "ErrorComment"}, - 0x00000903 : { vr : "US", vm : C.VM_SINGLE, keyword : "ErrorID"}, - 0x00001000 : { vr : "UI", vm : C.VM_SINGLE, keyword : "AffectedSOPInstanceUID"}, - 0x00001001 : { vr : "UI", vm : C.VM_SINGLE, keyword : "RequestedSOPInstanceUID"}, - 0x00001002 : { vr : "US", vm : C.VM_SINGLE, keyword : "EventTypeID"}, - 0x00001005 : { vr : "AT", vm : C.VM_1N, keyword : "AttributeIdentifierList"}, - 0x00001008 : { vr : "US", vm : C.VM_SINGLE, keyword : "ActionTypeID"}, - 0x00001020 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfRemainingSuboperations"}, - 0x00001021 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfCompletedSuboperations"}, - 0x00001022 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfFailedSuboperations"}, - 0x00001023 : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfWarningSuboperations"}, - 0x00001030 : { vr : "AE", vm : C.VM_SINGLE, keyword : "MoveOriginatorApplicationEntityTitle"}, - 0x00001031 : { vr : "US", vm : C.VM_SINGLE, keyword : "MoveOriginatorMessageID"}, -} - -var dicomVDict = { - "002031xx" : { vr : "CS", vm : C.VM_1N, keyword : "SourceImageIDs"}, - "002804x0" : { vr : "US", vm : C.VM_SINGLE, keyword : "RowsForNthOrderCoefficients"}, - "002804x1" : { vr : "US", vm : C.VM_SINGLE, keyword : "ColumnsForNthOrderCoefficients"}, - "002804x2" : { vr : "LO", vm : C.VM_1N, keyword : "CoefficientCoding"}, - "002804x3" : { vr : "AT", vm : C.VM_1N, keyword : "CoefficientCodingPointers"}, - "002808x0" : { vr : "CS", vm : C.VM_1N, keyword : "CodeLabel"}, - "002808x2" : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfTables"}, - "002808x3" : { vr : "AT", vm : C.VM_1N, keyword : "CodeTableLocation"}, - "002808x4" : { vr : "US", vm : C.VM_SINGLE, keyword : "BitsForCodeWord"}, - "002808x8" : { vr : "AT", vm : C.VM_1N, keyword : "ImageDataLocation"}, - "1000xxx0" : { vr : "US", vm : C.VM_THREE, keyword : "EscapeTriplet"}, - "1000xxx1" : { vr : "US", vm : C.VM_THREE, keyword : "RunLengthTriplet"}, - "1000xxx2" : { vr : "US", vm : C.VM_SINGLE, keyword : "HuffmanTableSize"}, - "1000xxx3" : { vr : "US", vm : C.VM_THREE, keyword : "HuffmanTableTriplet"}, - "1000xxx4" : { vr : "US", vm : C.VM_SINGLE, keyword : "ShiftTableSize"}, - "1000xxx5" : { vr : "US", vm : C.VM_THREE, keyword : "ShiftTableTriplet"}, - "1010xxxx" : { vr : "US", vm : C.VM_1N, keyword : "ZonalMap"}, - "50xx0005" : { vr : "US", vm : C.VM_SINGLE, keyword : "CurveDimensions"}, - "50xx0010" : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfPoints"}, - "50xx0020" : { vr : "CS", vm : C.VM_SINGLE, keyword : "TypeOfData"}, - "50xx0022" : { vr : "LO", vm : C.VM_SINGLE, keyword : "CurveDescription"}, - "50xx0030" : { vr : "SH", vm : C.VM_1N, keyword : "AxisUnits"}, - "50xx0040" : { vr : "SH", vm : C.VM_1N, keyword : "AxisLabels"}, - "50xx0103" : { vr : "US", vm : C.VM_SINGLE, keyword : "DataValueRepresentation"}, - "50xx0104" : { vr : "US", vm : C.VM_1N, keyword : "MinimumCoordinateValue"}, - "50xx0105" : { vr : "US", vm : C.VM_1N, keyword : "MaximumCoordinateValue"}, - "50xx0106" : { vr : "SH", vm : C.VM_1N, keyword : "CurveRange"}, - "50xx0110" : { vr : "US", vm : C.VM_1N, keyword : "CurveDataDescriptor"}, - "50xx0112" : { vr : "US", vm : C.VM_1N, keyword : "CoordinateStartValue"}, - "50xx0114" : { vr : "US", vm : C.VM_1N, keyword : "CoordinateStepValue"}, - "50xx1001" : { vr : "CS", vm : C.VM_SINGLE, keyword : "CurveActivationLayer"}, - "50xx2000" : { vr : "US", vm : C.VM_SINGLE, keyword : "AudioType"}, - "50xx2002" : { vr : "US", vm : C.VM_SINGLE, keyword : "AudioSampleFormat"}, - "50xx2004" : { vr : "US", vm : C.VM_SINGLE, keyword : "NumberOfChannels"}, - "50xx2006" : { vr : "UL", vm : C.VM_SINGLE, keyword : "NumberOfSamples"}, - "50xx2008" : { vr : "UL", vm : C.VM_SINGLE, keyword : "SampleRate"}, - "50xx200A" : { vr : "UL", vm : C.VM_SINGLE, keyword : "TotalTime"}, - "50xx200C" : { vr : "OW", vm : C.VM_SINGLE, keyword : "AudioSampleData"}, - "50xx200E" : { vr : "LT", vm : C.VM_SINGLE, keyword : "AudioComments"}, - "50xx2500" : { vr : "LO", vm : C.VM_SINGLE, keyword : "CurveLabel"}, - "50xx2600" : { vr : "SQ", vm : C.VM_SINGLE, keyword : "CurveReferencedOverlaySequence"}, - "50xx2610" : { vr : "US", vm : C.VM_SINGLE, keyword : "CurveReferencedOverlayGroup"}, - "50xx3000" : { vr : "OW", vm : C.VM_SINGLE, keyword : "CurveData"}, - "60xx0010" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayRows"}, - "60xx0011" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayColumns"}, - "60xx0012" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayPlanes"}, - "60xx0015" : { vr : "IS", vm : C.VM_SINGLE, keyword : "NumberOfFramesInOverlay"}, - "60xx0022" : { vr : "LO", vm : C.VM_SINGLE, keyword : "OverlayDescription"}, - "60xx0040" : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlayType"}, - "60xx0045" : { vr : "LO", vm : C.VM_SINGLE, keyword : "OverlaySubtype"}, - "60xx0050" : { vr : "SS", vm : C.VM_TWO, keyword : "OverlayOrigin"}, - "60xx0051" : { vr : "US", vm : C.VM_SINGLE, keyword : "ImageFrameOrigin"}, - "60xx0052" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayPlaneOrigin"}, - "60xx0060" : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlayCompressionCode"}, - "60xx0061" : { vr : "SH", vm : C.VM_SINGLE, keyword : "OverlayCompressionOriginator"}, - "60xx0062" : { vr : "SH", vm : C.VM_SINGLE, keyword : "OverlayCompressionLabel"}, - "60xx0063" : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlayCompressionDescription"}, - "60xx0066" : { vr : "AT", vm : C.VM_1N, keyword : "OverlayCompressionStepPointers"}, - "60xx0068" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayRepeatInterval"}, - "60xx0069" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayBitsGrouped"}, - "60xx0100" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayBitsAllocated"}, - "60xx0102" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayBitPosition"}, - "60xx0110" : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlayFormat"}, - "60xx0200" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayLocation"}, - "60xx0800" : { vr : "CS", vm : C.VM_1N, keyword : "OverlayCodeLabel"}, - "60xx0802" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayNumberOfTables"}, - "60xx0803" : { vr : "AT", vm : C.VM_1N, keyword : "OverlayCodeTableLocation"}, - "60xx0804" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayBitsForCodeWord"}, - "60xx1001" : { vr : "CS", vm : C.VM_SINGLE, keyword : "OverlayActivationLayer"}, - "60xx1100" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayDescriptorGray"}, - "60xx1101" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayDescriptorRed"}, - "60xx1102" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayDescriptorGreen"}, - "60xx1103" : { vr : "US", vm : C.VM_SINGLE, keyword : "OverlayDescriptorBlue"}, - "60xx1200" : { vr : "US", vm : C.VM_1N, keyword : "OverlaysGray"}, - "60xx1201" : { vr : "US", vm : C.VM_1N, keyword : "OverlaysRed"}, - "60xx1202" : { vr : "US", vm : C.VM_1N, keyword : "OverlaysGreen"}, - "60xx1203" : { vr : "US", vm : C.VM_1N, keyword : "OverlaysBlue"}, - "60xx1301" : { vr : "IS", vm : C.VM_SINGLE, keyword : "ROIArea"}, - "60xx1302" : { vr : "DS", vm : C.VM_SINGLE, keyword : "ROIMean"}, - "60xx1303" : { vr : "DS", vm : C.VM_SINGLE, keyword : "ROIStandardDeviation"}, - "60xx1500" : { vr : "LO", vm : C.VM_SINGLE, keyword : "OverlayLabel"}, - "60xx3000" : { vr : "OB", vm : C.VM_SINGLE, keyword : "OverlayData"}, - "60xx4000" : { vr : "LT", vm : C.VM_SINGLE, keyword : "OverlayComments"}, - "7Fxx0010" : { vr : "OW", vm : C.VM_SINGLE, keyword : "VariablePixelData"}, - "7Fxx0011" : { vr : "US", vm : C.VM_SINGLE, keyword : "VariableNextDataGroup"}, - "7Fxx0020" : { vr : "OW", vm : C.VM_SINGLE, keyword : "VariableCoefficientsSDVN"}, - "7Fxx0030" : { vr : "OW", vm : C.VM_SINGLE, keyword : "VariableCoefficientsSDHN"}, - "7Fxx0040" : { vr : "OW", vm : C.VM_SINGLE, keyword : "VariableCoefficientsSDDN"}, -} - -DicomElements = {dicomNDict : dicomNDict, dicomVDict : dicomVDict} diff --git a/Packages/ohif-dicom-services/server/DIMSE/require.js b/Packages/ohif-dicom-services/server/DIMSE/require.js deleted file mode 100755 index 21540b1e5..000000000 --- a/Packages/ohif-dicom-services/server/DIMSE/require.js +++ /dev/null @@ -1,7 +0,0 @@ -util = Npm.require("util"); -fs = Npm.require('fs'); -EventEmitter = Npm.require('events').EventEmitter; - -quitWithError = function(message, callback) { - return callback(new Error(message), null); -}; \ No newline at end of file diff --git a/Packages/ohif-dicomweb-client/package.js b/Packages/ohif-dicomweb-client/package.js deleted file mode 100644 index 60999009f..000000000 --- a/Packages/ohif-dicomweb-client/package.js +++ /dev/null @@ -1,22 +0,0 @@ -Package.describe({ - name: 'ohif:dicomweb-client', - summary: 'DICOM Services: DICOMWeb', - version: '0.0.1' -}); - -Npm.depends({ - 'url-parse': '1.4.1', - 'isomorphic-fetch': '2.2.1', - 'isomorphic-base64': '1.0.2' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.6'); - - api.use('ecmascript'); - - // DICOMWeb functions - api.mainModule('src/index.js'); - - api.export('DICOMWeb'); -}); diff --git a/Packages/ohif-dicomweb-client/src/get.js b/Packages/ohif-dicomweb-client/src/get.js deleted file mode 100644 index 3bceb0661..000000000 --- a/Packages/ohif-dicomweb-client/src/get.js +++ /dev/null @@ -1,33 +0,0 @@ -import makeRequest from "./makeRequest"; - -/** - * Make a request to the URL given a set of options. - * This function will add optional timing, request, and respone logging. - * - * @param {String} url - * @param {Object} options - * @return {Promise<*>} - */ -const get = async function get(url, options) { - if (options.logRequests) { - console.log(url); - } - - if (options.logTiming) { - console.time(url); - } - - const result = await makeRequest(url, options); - - if (options.logTiming) { - console.timeEnd(url); - } - - if (options.logResponses) { - console.info(result); - } - - return result; -} - -export default get; diff --git a/Packages/ohif-dicomweb-client/src/getAccessToken.js b/Packages/ohif-dicomweb-client/src/getAccessToken.js deleted file mode 100644 index c8306fc38..000000000 --- a/Packages/ohif-dicomweb-client/src/getAccessToken.js +++ /dev/null @@ -1,14 +0,0 @@ -import { OHIF } from 'meteor/ohif:core'; - -export default function getAccessToken() { - if (!global.window || !window.sessionStorage || !sessionStorage) { - return; - } - - const userAccessToken = OHIF.user.getAccessToken(); - if (userAccessToken) { - return userAccessToken; - } - - return sessionStorage.token; -} diff --git a/Packages/ohif-dicomweb-client/src/getBulkData.js b/Packages/ohif-dicomweb-client/src/getBulkData.js deleted file mode 100644 index dc576fc17..000000000 --- a/Packages/ohif-dicomweb-client/src/getBulkData.js +++ /dev/null @@ -1,133 +0,0 @@ -import get from './get.js'; - -const ASCII = 'ascii'; - -function getMultipartContentInfo(headers) { - const multipartRegex = /^\s*multipart\/[^;]+/g; - const contentType = headers.get('content-type'); - let dict = null; - - if (typeof contentType === 'string' && multipartRegex.test(contentType)) { - let match; - let pairRegex = /;\s*([^=]+)=([^;\r\n]+)/g; - - pairRegex.lastIndex = multipartRegex.lastIndex; - while ((match = pairRegex.exec(contentType)) !== null) { - let key = match[1] - let value = match[2]; - - if (dict === null) { - dict = {}; - } - dict[key] = value; - } - } - - return dict; -} - -function parseContentHeader(data, offset) { - const endOfHeader = data.indexOf('\r\n\r\n', offset); - - if (endOfHeader < 0 || endOfHeader <= offset || endOfHeader > data.length) { - throw new Error('End of content header cannot be determined...'); - } - - const header = { - start: offset, - end: endOfHeader + 4, - fields: {} - }; - const headerRegex = /([\w\-]+):\s*([^\r\n]+)(?:\r\n)?/g; - const headerContentRegex = /\t([^\r\n]+)(?:\r\n)?/g; - const headerString = data.slice(offset, endOfHeader); - - let match; - - while ((match = headerRegex.exec(headerString)) !== null) { - const key = match[1].toLowerCase(), value = match[2]; - - while (headerString.charAt(headerRegex.lastIndex) === '\t') { - headerContentRegex.lastIndex = headerRegex.lastIndex; - - if ((match = headerContentRegex.exec(headerString)) !== null) { - headerRegex.lastIndex = headerContentRegex.lastIndex; - value += ' ' + match[1]; - continue; - } - - break; - } - header.fields[key] = value; - } - - return header; - -} - -function toBytes(input) { - const data = []; - for (let i = 0; i < input.length; i++){ - data.push(input.charCodeAt(i)); - } - - return data; -} - - -function parseResponse(headers, data) { - const contentInfo = getMultipartContentInfo(headers); - - if (!contentInfo || !contentInfo.boundary) { - throw new Error('Content boundary not specified...'); - } - - const boundary = contentInfo.boundary; - const delimiter = '--' + boundary + '\r\n'; - let index = data.indexOf(delimiter, 0, ASCII); - - if (index < 0) { - throw new Error('DICOMWeb: The specified boundary could not be found...'); - } - - let closingIndex - let closingDelimiter = '\r\n--' + boundary + '--'; - - index += delimiter.length; - if (data[index] !== 0x0D || data[index + 1] !== 0x0A) { - // multipart content headers are present, so let's parse them... - let contentHeader = parseContentHeader(data, index); - if (contentHeader && contentHeader.end > index) { - if (contentHeader.fields['content-length'] > 0) { - let endOfData = contentHeader.end + parseInt(contentHeader.fields['content-length'], 10); - if (endOfData === data.indexOf(closingDelimiter, endOfData)) { - // content-length is valid... - return data.slice(contentHeader.end, endOfData); - } - } - index = contentHeader.end; - } - } else { - // no headers, the content comes right after... - index += 2; - } - - closingIndex = data.indexOf(closingDelimiter, index); - if (closingIndex < 0 || closingIndex < index) { - throw new Error('DICOMWeb: The end of the content could not be determined...') - } - - return toBytes(data.slice(index, closingIndex)); -} - -const getBulkData = async function(url, options = {}) { - options.headers = options.headers || {}; - options.headers.Accept = 'multipart/related; type=application/octet-stream'; - - const response = await get(url, options); - const data = await response.text(); - - return parseResponse(response.headers, data); -} - -export default getBulkData; diff --git a/Packages/ohif-dicomweb-client/src/getJSON.js b/Packages/ohif-dicomweb-client/src/getJSON.js deleted file mode 100644 index 69480f0ba..000000000 --- a/Packages/ohif-dicomweb-client/src/getJSON.js +++ /dev/null @@ -1,16 +0,0 @@ -import get from './get.js'; -import getAttribute from "./getAttribute"; - -const getJSON = async function (url, options) { - options.headers = options.headers || {}; - options.headers.Accept = 'application/json'; - return get(url, options).then(response => { - if (!(response instanceof Response)) { - return ''; - } - - return response.json(); - }); -}; - -export default getJSON; diff --git a/Packages/ohif-dicomweb-client/src/makeRequest.js b/Packages/ohif-dicomweb-client/src/makeRequest.js deleted file mode 100644 index dd367ff1d..000000000 --- a/Packages/ohif-dicomweb-client/src/makeRequest.js +++ /dev/null @@ -1,69 +0,0 @@ -import { Meteor } from "meteor/meteor"; -import URL from 'url-parse'; -import 'isomorphic-fetch'; -import { btoa } from 'isomorphic-base64'; -import getAccessToken from './getAccessToken.js'; - -async function makeRequest(url, options) { - const parsed = new URL(url); - - let requestOpt = { - method: 'GET', - headers: {} - }; - - const accessToken = getAccessToken(); - if (accessToken) { - requestOpt.headers = { - Authorization: `Bearer ${accessToken}` - }; - } else if (options.auth) { - requestOpt.headers = { - Authorization: `Basic ${btoa(options.auth)}` - }; - } - - if (options.headers) { - Object.keys(options.headers).forEach(key => { - requestOpt.headers[key] = options.headers[key]; - }); - } - - if(options.method) { - requestOpt.method = options.method; - } - - if (options.method === 'POST' && options.body) { - requestOpt.body = options.body; - } - - return new Promise((resolve, reject) => { - // TODO: Kept getting weird build errors from RegExp - const isAbsolute = parsed.href.indexOf('http://') === 0 || parsed.href.indexOf('https://') === 0; - - let url = parsed.href; - - if (isAbsolute === false) { - url = Meteor.absoluteUrl(parsed.href); - } - - fetch(url, requestOpt).then((response) => { - if (response.status >= 400) { - reject(new Error(response.status)); - } - - if (response.status === 204) { - resolve([]); - } else { - // TODO: Handle 204 no content - resolve(response); - } - }, (error) => { - console.error('There was an error in the DICOMWeb Server'); - - reject(new Error(error)); - }); - }); -} - -export default makeRequest; diff --git a/Packages/validatejs/load.js b/Packages/ohif-hanging-protocols/client/lib/validate.js old mode 100755 new mode 100644 similarity index 62% rename from Packages/validatejs/load.js rename to Packages/ohif-hanging-protocols/client/lib/validate.js index 0f76e71d2..b92607f4b --- a/Packages/validatejs/load.js +++ b/Packages/ohif-hanging-protocols/client/lib/validate.js @@ -1,39 +1,39 @@ -import {validate as v} from './lib/validate.js'; - -v.validators.equals = function(value, options, key, attributes) { - if (options && value !== options.value) { - return key + 'must equal ' + options.value; - } -}; - -v.validators.doesNotEqual = function(value, options, key) { - if (options && value === options.value) { - return key + 'cannot equal ' + options.value; - } -}; - -v.validators.contains = function(value, options, key) { - if (options && value.indexOf && value.indexOf(options.value) === -1) { - return key + 'must contain ' + options.value; - } -}; - -v.validators.doesNotContain = function(value, options, key) { - if (options && value.indexOf && value.indexOf(options.value) !== -1) { - return key + 'cannot contain ' + options.value; - } -}; - -v.validators.startsWith = function(value, options, key) { - if (options && value.startsWith && !value.startsWith(options.value)) { - return key + 'must start with ' + options.value; - } -}; - -v.validators.endsWith = function(value, options, key) { - if (options && value.endsWith && !value.endsWith(options.value)) { - return key + 'must end with ' + options.value; - } -}; - -validate = v; \ No newline at end of file +import { validate } from 'validate.js'; + +validate.validators.equals = function(value, options, key, attributes) { + if (options && value !== options.value) { + return key + 'must equal ' + options.value; + } +}; + +validate.validators.doesNotEqual = function(value, options, key) { + if (options && value === options.value) { + return key + 'cannot equal ' + options.value; + } +}; + +validate.validators.contains = function(value, options, key) { + if (options && value.indexOf && value.indexOf(options.value) === -1) { + return key + 'must contain ' + options.value; + } +}; + +validate.validators.doesNotContain = function(value, options, key) { + if (options && value.indexOf && value.indexOf(options.value) !== -1) { + return key + 'cannot contain ' + options.value; + } +}; + +validate.validators.startsWith = function(value, options, key) { + if (options && value.startsWith && !value.startsWith(options.value)) { + return key + 'must start with ' + options.value; + } +}; + +validate.validators.endsWith = function(value, options, key) { + if (options && value.endsWith && !value.endsWith(options.value)) { + return key + 'must end with ' + options.value; + } +}; + +export { validate }; diff --git a/Packages/ohif-hanging-protocols/client/matcher/HPMatcher.js b/Packages/ohif-hanging-protocols/client/matcher/HPMatcher.js index c6ca73698..4ce67bde7 100644 --- a/Packages/ohif-hanging-protocols/client/matcher/HPMatcher.js +++ b/Packages/ohif-hanging-protocols/client/matcher/HPMatcher.js @@ -2,6 +2,7 @@ import { Viewerbase } from 'meteor/ohif:viewerbase'; // Local imports +import { validate } from '../lib/validate.js'; import '../customAttributes'; /** @@ -102,7 +103,8 @@ const match = (metadataInstance, rules) => { return { score, - details + details, + requiredFailed }; }; diff --git a/Packages/ohif-hanging-protocols/client/protocolEngine.js b/Packages/ohif-hanging-protocols/client/protocolEngine.js index a652c8824..a6f962ede 100644 --- a/Packages/ohif-hanging-protocols/client/protocolEngine.js +++ b/Packages/ohif-hanging-protocols/client/protocolEngine.js @@ -274,8 +274,6 @@ HP.ProtocolEngine = class ProtocolEngine { let highestStudyMatchingScore = 0; let highestSeriesMatchingScore = 0; - let highestImageMatchingScore = 0; - let bestMatch; // Set custom attribute for study metadata and it's first instance currentStudy.setCustomAttribute(ABSTRACT_PRIOR_VALUE, 0); @@ -349,8 +347,9 @@ HP.ProtocolEngine = class ProtocolEngine { this.studies.forEach(study => { const studyMatchDetails = HPMatcher.match(study.getFirstInstance(), studyMatchingRules); - if ((studyMatchingRules.length && !studyMatchDetails.score) || - studyMatchDetails.score < highestStudyMatchingScore) { + + // Prevent bestMatch from being updated if the matchDetails' required attribute check has failed + if (studyMatchDetails.requiredFailed === true || studyMatchDetails.score < highestStudyMatchingScore) { return; } @@ -358,8 +357,9 @@ HP.ProtocolEngine = class ProtocolEngine { study.forEachSeries(series => { const seriesMatchDetails = HPMatcher.match(series.getFirstInstance(), seriesMatchingRules); - if ((seriesMatchingRules.length && !seriesMatchDetails.score) || - seriesMatchDetails.score < highestSeriesMatchingScore) { + + // Prevent bestMatch from being updated if the matchDetails' required attribute check has failed + if (seriesMatchDetails.requiredFailed === true || seriesMatchDetails.score < highestSeriesMatchingScore) { return; } @@ -377,6 +377,11 @@ HP.ProtocolEngine = class ProtocolEngine { const instanceMatchDetails = HPMatcher.match(instance, instanceMatchingRules); + // Prevent bestMatch from being updated if the matchDetails' required attribute check has failed + if (instanceMatchDetails.requiredFailed === true) { + return; + } + const matchDetails = { passed: [], failed: [] @@ -417,11 +422,6 @@ HP.ProtocolEngine = class ProtocolEngine { imageDetails.imageId = instance.getImageId(); } - if ((totalMatchScore > highestImageMatchingScore) || !bestMatch) { - highestImageMatchingScore = totalMatchScore; - bestMatch = imageDetails; - } - matchingScores.push(imageDetails); }); }); @@ -441,6 +441,8 @@ HP.ProtocolEngine = class ProtocolEngine { }); matchingScores.sort((a, b) => sortingFunction(a.sortingInfo, b.sortingInfo)); + const bestMatch = matchingScores[0]; + OHIF.log.info('ProtocolEngine::matchImages bestMatch', bestMatch); return { diff --git a/Packages/ohif-hanging-protocols/package.js b/Packages/ohif-hanging-protocols/package.js index ec63f33c9..887e01e9b 100755 --- a/Packages/ohif-hanging-protocols/package.js +++ b/Packages/ohif-hanging-protocols/package.js @@ -4,8 +4,12 @@ Package.describe({ version: '0.0.1' }); +Npm.depends({ + 'validate.js': '0.9.0' +}); + Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('standard-app-packages'); @@ -16,7 +20,6 @@ Package.onUse(function(api) { api.use('natestrauser:select2@4.0.1', 'client'); api.use('clinical:router@2.0.19'); api.use('momentjs:moment'); - api.use('validatejs'); // Our custom packages api.use('ohif:core'); diff --git a/Packages/ohif-header/package.js b/Packages/ohif-header/package.js index 640b5c340..bc67eae33 100644 --- a/Packages/ohif-header/package.js +++ b/Packages/ohif-header/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4.2.3'); + api.versionsFrom('1.7'); // Meteor packages api.use('ecmascript'); diff --git a/Packages/ohif-hotkeys/client/classes/HotkeysManager.js b/Packages/ohif-hotkeys/client/classes/HotkeysManager.js index f684aa392..078060bed 100644 --- a/Packages/ohif-hotkeys/client/classes/HotkeysManager.js +++ b/Packages/ohif-hotkeys/client/classes/HotkeysManager.js @@ -36,7 +36,7 @@ export class HotkeysManager { return new Promise((resolve, reject) => { if (this.storeFunction) { this.storeFunction.call(this, storageKey, definitions).then(resolve).catch(reject); - } else if (Meteor.userId()) { + } else if (OHIF.user.userLoggedIn()) { OHIF.user.setData(storageKey, definitions).then(resolve).catch(reject); } else { Session.setPersistent(storageKey, definitions); @@ -50,7 +50,7 @@ export class HotkeysManager { return new Promise((resolve, reject) => { if (this.retrieveFunction) { this.retrieveFunction(contextName).then(resolve).catch(reject); - } else if (OHIF.user) { + } else if (OHIF.user.userLoggedIn()) { try { resolve(OHIF.user.getData(storageKey)); } catch(error) { diff --git a/Packages/ohif-hotkeys/client/components/confirmReplacementPopover.html b/Packages/ohif-hotkeys/client/components/confirmReplacementPopover.html index 90a8e2db9..2f47094bf 100644 --- a/Packages/ohif-hotkeys/client/components/confirmReplacementPopover.html +++ b/Packages/ohif-hotkeys/client/components/confirmReplacementPopover.html @@ -1,6 +1,6 @@ diff --git a/Packages/ohif-hotkeys/client/index.js b/Packages/ohif-hotkeys/client/index.js index a3b6ff5b9..758f32245 100644 --- a/Packages/ohif-hotkeys/client/index.js +++ b/Packages/ohif-hotkeys/client/index.js @@ -1,2 +1 @@ import './components'; -import './lib'; diff --git a/Packages/ohif-hotkeys/client/lib/index.js b/Packages/ohif-hotkeys/client/lib/index.js deleted file mode 100644 index 86c73e446..000000000 --- a/Packages/ohif-hotkeys/client/lib/index.js +++ /dev/null @@ -1 +0,0 @@ -import './routes'; diff --git a/Packages/ohif-hotkeys/client/lib/routes.js b/Packages/ohif-hotkeys/client/lib/routes.js deleted file mode 100644 index b434438e9..000000000 --- a/Packages/ohif-hotkeys/client/lib/routes.js +++ /dev/null @@ -1,14 +0,0 @@ -import { Router } from 'meteor/clinical:router'; -import { Session } from 'meteor/session'; -import { hotkeys } from 'meteor/ohif:hotkeys'; - -Router.onBeforeAction(function() { - const lastRoute = Session.get('lastRoute'); - const currentRoute = this.router.current().route.getName(); - if (currentRoute !== lastRoute) { - hotkeys.switchToContext(null); - Session.set('lastRoute', currentRoute); - } - - this.next(); -}); diff --git a/Packages/ohif-hotkeys/package.js b/Packages/ohif-hotkeys/package.js index 933549260..3d3949651 100644 --- a/Packages/ohif-hotkeys/package.js +++ b/Packages/ohif-hotkeys/package.js @@ -9,7 +9,7 @@ Npm.depends({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); // Meteor packages api.use([ diff --git a/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/calculateLongestAndShortestDiameters.js b/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/calculateLongestAndShortestDiameters.js new file mode 100644 index 000000000..db7ca9b6d --- /dev/null +++ b/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/calculateLongestAndShortestDiameters.js @@ -0,0 +1,32 @@ +// Calculate the longest and shortest diameters for the given measurementData +export default function(eventData, measurementData) { + const { rowPixelSpacing, columnPixelSpacing } = eventData.image; + const { start, end, perpendicularStart, perpendicularEnd } = measurementData.handles; + + // updatePerpendicularLineHandles(eventData, measurementData); + + // Calculate the long axis length + const dx = (start.x - end.x) * (columnPixelSpacing || 1); + const dy = (start.y - end.y) * (rowPixelSpacing || 1); + let length = Math.sqrt(dx * dx + dy * dy); + + // Calculate the short axis length + const wx = (perpendicularStart.x - perpendicularEnd.x) * (columnPixelSpacing || 1); + const wy = (perpendicularStart.y - perpendicularEnd.y) * (rowPixelSpacing || 1); + let width = Math.sqrt(wx * wx + wy * wy); + if (!width) { + width = 0; + } + + // Length is always longer than width + if (width > length) { + const tempW = width; + const tempL = length; + length = tempW; + width = tempL; + } + + // Set measurement text to show lesion table + measurementData.longestDiameter = length.toFixed(1); + measurementData.shortestDiameter = width.toFixed(1); +} diff --git a/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/invertHandles.js b/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/invertHandles.js new file mode 100644 index 000000000..8405a9c09 --- /dev/null +++ b/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/invertHandles.js @@ -0,0 +1,42 @@ +const swapAttribute = (a, b, attribute) => { + const originalA = a[attribute]; + const originalB = b[attribute]; + a[attribute] = originalB; + b[attribute] = originalA; +}; + +const swapHandles = (a, b) => { + swapAttribute(a, b, 'x'); + swapAttribute(a, b, 'y'); + swapAttribute(a, b, 'moving'); + swapAttribute(a, b, 'hover'); + swapAttribute(a, b, 'active'); + swapAttribute(a, b, 'selected'); +}; + +function invertHandles(eventData, measurementData, handle) { + const { rowPixelSpacing, columnPixelSpacing } = eventData.image; + const { handles } = measurementData; + const { start, end, perpendicularStart, perpendicularEnd } = handles; + + // Calculate the long axis length + const dx = (start.x - end.x) * (columnPixelSpacing || 1); + const dy = (start.y - end.y) * (rowPixelSpacing || 1); + const length = Math.sqrt(dx * dx + dy * dy); + + // Calculate the short axis length + const wx = (perpendicularStart.x - perpendicularEnd.x) * (columnPixelSpacing || 1); + const wy = (perpendicularStart.y - perpendicularEnd.y) * (rowPixelSpacing || 1); + const width = Math.sqrt(wx * wx + wy * wy) || 0; + + if (width > length) { + swapHandles(start, end); + swapHandles(start, perpendicularStart); + swapHandles(end, perpendicularEnd); + return Object.values(handles).find(h => h.moving === true); + } + + return handle; +} + +export default invertHandles; diff --git a/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/mouseDownCallback.js b/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/mouseDownCallback.js index 6bff924d0..f762cb54c 100644 --- a/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/mouseDownCallback.js +++ b/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/mouseDownCallback.js @@ -5,6 +5,7 @@ import { toolType, distanceThreshold } from './definitions'; import mouseMoveCallback from './mouseMoveCallback'; import pointNearTool from './pointNearTool'; import moveHandle from './moveHandle'; +import invertHandles from './invertHandles'; // Clear the selected state for the given handles object const unselectAllHandles = handles => { @@ -88,9 +89,14 @@ export default function(event) { for (let i = 0; i < toolData.data.length; i++) { data = toolData.data[i]; const handleParams = [element, data.handles, coords, distanceThreshold]; - const handle = cornerstoneTools.getHandleNearImagePoint(...handleParams); + let handle = cornerstoneTools.getHandleNearImagePoint(...handleParams); if (handle) { + handle.moving = true; + + // Invert handles if needed + handle = invertHandles(eventData, data, handle); + // Hide the cursor to improve precision while resizing the line or set to move // if dragging text box $element.css('cursor', handle.hasBoundingBox ? 'move' : 'none'); @@ -99,7 +105,6 @@ export default function(event) { data.active = true; unselectAllHandles(data.handles); - handle.moving = true; moveHandle(eventData, toolType, data, handle, () => handleDoneMove(handle)); event.stopImmediatePropagation(); event.stopPropagation(); diff --git a/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/moveHandle/moveHandle.js b/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/moveHandle/moveHandle.js index a1bd5d4e4..f53a1aade 100644 --- a/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/moveHandle/moveHandle.js +++ b/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/moveHandle/moveHandle.js @@ -1,5 +1,6 @@ import { cornerstone } from 'meteor/ohif:cornerstone'; import setHandlesPosition from './setHandlesPosition'; +import calculateLongestAndShortestDiameters from '../calculateLongestAndShortestDiameters'; export default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) { const element = mouseEventData.element; @@ -29,14 +30,23 @@ export default function (mouseEventData, toolType, data, handle, doneMovingCallb cornerstone.updateImage(element); - const eventType = 'cornerstonetoolsmeasurementmodified'; - const modifiedEventData = { - toolType, - element, - measurementData: data + const measurementModifiedHandler = () => { + const eventType = 'cornerstonetoolsmeasurementmodified'; + const modifiedEventData = { + toolType, + element, + measurementData: data + }; + + calculateLongestAndShortestDiameters(mouseEventData, data); + + cornerstone.triggerEvent(element, eventType, modifiedEventData); + + element.removeEventListener('cornerstoneimagerendered', measurementModifiedHandler); }; - cornerstone.triggerEvent(element, eventType, modifiedEventData); + // Wait on image render before triggering the modified event + element.addEventListener('cornerstoneimagerendered', measurementModifiedHandler); }; element.addEventListener('cornerstonetoolsmousedrag', mouseDragCallback); diff --git a/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/onImageRendered/onImageRendered.js b/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/onImageRendered/onImageRendered.js index 1f8b4b94b..2101eefd2 100644 --- a/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/onImageRendered/onImageRendered.js +++ b/Packages/ohif-lesiontracker/client/compatibility/bidirectionalTool/onImageRendered/onImageRendered.js @@ -2,11 +2,12 @@ import { cornerstone, cornerstoneMath, cornerstoneTools } from 'meteor/ohif:corn import { OHIF } from 'meteor/ohif:core'; import { toolType } from '../definitions'; import drawHandles from './drawHandles'; +import calculateLongestAndShortestDiameters from '../calculateLongestAndShortestDiameters'; import updatePerpendicularLineHandles from '../updatePerpendicularLineHandles'; import drawPerpendicularLine from './drawPerpendicularLine'; import drawSelectedMarker from './drawSelectedMarker'; -export default function(event) { +export default function onImageRendered(event) { const eventData = event.detail; const { element, canvasContext } = eventData; @@ -41,9 +42,7 @@ export default function(event) { for (let i = 0; i < toolData.data.length; i++) { const data = toolData.data[i]; - if (data.visible === false) { - continue; - } + if (data.visible === false) continue; const { start, end, perpendicularStart, perpendicularEnd, textBox } = data.handles; const strokeWidth = lineWidth; @@ -65,10 +64,16 @@ export default function(event) { color = cornerstoneTools.toolColors.getToolColor(); } - // draw the line - const handleStartCanvas = cornerstone.pixelToCanvas(element, start); - const handleEndCanvas = cornerstone.pixelToCanvas(element, end); - const canvasTextLocation = cornerstone.pixelToCanvas(element, textBox); + // Update the perpendicular handles to draw it correctly + updatePerpendicularLineHandles(eventData, data); + + // Draw the line + const { pixelToCanvas } = cornerstone; + const handleStartCanvas = pixelToCanvas(element, start); + const handleEndCanvas = pixelToCanvas(element, end); + const handlePerpendicularStartCanvas = pixelToCanvas(element, perpendicularStart); + const handlePerpendicularEndCanvas = pixelToCanvas(element, perpendicularEnd); + const canvasTextLocation = pixelToCanvas(element, textBox); context.beginPath(); context.strokeStyle = color; @@ -78,7 +83,6 @@ export default function(event) { context.stroke(); // Draw perpendicular line - updatePerpendicularLineHandles(eventData, data); drawPerpendicularLine(context, element, data, color, strokeWidth); // Draw the handles @@ -88,26 +92,8 @@ export default function(event) { // Draw the selected marker drawSelectedMarker(eventData, data.handles, '#FF9999'); - // Calculate the long axis length - const dx = (start.x - end.x) * (colPixelSpacing || 1); - const dy = (start.y - end.y) * (rowPixelSpacing || 1); - let length = Math.sqrt(dx * dx + dy * dy); - - // Calculate the short axis length - const wx = (perpendicularStart.x - perpendicularEnd.x) * (colPixelSpacing || 1); - const wy = (perpendicularStart.y - perpendicularEnd.y) * (rowPixelSpacing || 1); - let width = Math.sqrt(wx * wx + wy * wy); - if (!width) { - width = 0; - } - - // Length is always longer than width - if (width > length) { - const tempW = width; - const tempL = length; - length = tempW; - width = tempL; - } + // Calculate the longest and shortest diameters, storing it in the respective attributes + calculateLongestAndShortestDiameters(eventData, data); if (data.measurementNumber) { // Draw the textbox @@ -116,9 +102,14 @@ export default function(event) { suffix = ' pixels'; } - const lengthText = ' L ' + length.toFixed(1) + suffix; - const widthText = ' W ' + width.toFixed(1) + suffix; - const textLines = [`Target ${data.measurementNumber}`, lengthText, widthText]; + const lengthText = ' L ' + data.longestDiameter + suffix; + const widthText = ' W ' + data.shortestDiameter + suffix; + let textLines = [`Target ${data.measurementNumber}`, lengthText, widthText]; + + // Append extra text lines when applies + if (data.additionalData && Array.isArray(data.additionalData.extraTextLines)) { + textLines = textLines.concat(data.additionalData.extraTextLines); + } const boundingBox = cornerstoneTools.drawTextBox( context, @@ -139,12 +130,39 @@ export default function(event) { end: {} }; - const midpointCanvas = { - x: (handleStartCanvas.x + handleEndCanvas.x) / 2, - y: (handleStartCanvas.y + handleEndCanvas.y) / 2, + const longLine = { + start: handleStartCanvas, + end: handleEndCanvas }; - const points = [ handleStartCanvas, handleEndCanvas, midpointCanvas ]; + const perpendicularLine = { + start: handlePerpendicularStartCanvas, + end: handlePerpendicularEndCanvas + }; + + // Check if the perpendicular line has some length (start and end are not equal) + // Note: this check is needed to prevent NaN value on the intersection result + const { distance } = cornerstoneMath.point; + const lineHasLength = distance(perpendicularLine.start, perpendicularLine.end) > 0; + + // Define the lines intersection point + let linesIntersection; + if (lineHasLength) { + // As the line has length, define it as the intersection between the lines + const { intersectLine } = cornerstoneMath.lineSegment; + linesIntersection = intersectLine(longLine, perpendicularLine); + } else { + // As the line has no length, the tool is in its start position + linesIntersection = longLine.start; + } + + const points = [ + handleStartCanvas, + handleEndCanvas, + handlePerpendicularStartCanvas, + handlePerpendicularEndCanvas, + linesIntersection + ]; link.end.x = canvasTextLocation.x; link.end.y = canvasTextLocation.y; @@ -181,10 +199,6 @@ export default function(event) { context.stroke(); } - // Set measurement text to show lesion table - data.longestDiameter = length.toFixed(1); - data.shortestDiameter = width.toFixed(1); - context.restore(); } -} +} \ No newline at end of file diff --git a/Packages/ohif-lesiontracker/client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.js b/Packages/ohif-lesiontracker/client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.js index e3a0dab44..fb093038b 100644 --- a/Packages/ohif-lesiontracker/client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.js +++ b/Packages/ohif-lesiontracker/client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.js @@ -35,7 +35,13 @@ Template[defaultTemplate].onRendered(() => { if (computation.firstRun) return; computation.stop(); const imageIndex = instance.getImageIndex(); - OHIF.studies.loadStudy(studyInstanceUid).then(studyMetadata => { + + if (!studyInstanceUid || !seriesInstanceUid) { + return; + } + + OHIF.studies.loadStudy(studyInstanceUid).then(study => { + const studyMetadata = OHIF.viewerbase.getStudyMetadata(study); const seriesMetadata = studyMetadata.getSeriesByUID(seriesInstanceUid); const instanceMetadata = seriesMetadata.getInstanceByIndex(imageIndex); if (!instanceMetadata) return; diff --git a/Packages/ohif-lesiontracker/client/components/timepointBrowser/item.js b/Packages/ohif-lesiontracker/client/components/timepointBrowser/item.js index a004c3eef..4ed7a2c8c 100644 --- a/Packages/ohif-lesiontracker/client/components/timepointBrowser/item.js +++ b/Packages/ohif-lesiontracker/client/components/timepointBrowser/item.js @@ -62,7 +62,7 @@ Template.timepointBrowserItem.onCreated(() => { }); Template.timepointBrowserItem.events({ - 'ohif.lesiontracker.timepoint.load .timepoint-item'(event, instance) { + 'ohif.measurements.timepoint.load .timepoint-item'(event, instance) { instance.loadStudies(); }, @@ -71,7 +71,7 @@ Template.timepointBrowserItem.events({ const $element = $(element); const triggerClick = () => { - $element.trigger('ohif.lesiontracker.timepoint.click', instance.data.timepoint); + $element.trigger('ohif.measurements.timepoint.click', instance.data.timepoint); }; if (!instance.studiesData.get()) { diff --git a/Packages/ohif-lesiontracker/client/components/timepointBrowser/quickSwitch.js b/Packages/ohif-lesiontracker/client/components/timepointBrowser/quickSwitch.js index e562e423d..905845dad 100644 --- a/Packages/ohif-lesiontracker/client/components/timepointBrowser/quickSwitch.js +++ b/Packages/ohif-lesiontracker/client/components/timepointBrowser/quickSwitch.js @@ -72,7 +72,7 @@ Template.timepointBrowserQuickSwitch.onRendered(() => { }); Template.timepointBrowserQuickSwitch.events({ - 'ohif.lesiontracker.timepoint.click'(event, instance) { + 'ohif.measurements.timepoint.click'(event, instance) { const $element = $(event.currentTarget); $element.toggleClass('active'); instance.updateActiveStudy(); diff --git a/Packages/ohif-lesiontracker/client/components/timepointBrowser/sidebar.js b/Packages/ohif-lesiontracker/client/components/timepointBrowser/sidebar.js index a71c11cd9..dac2222bc 100644 --- a/Packages/ohif-lesiontracker/client/components/timepointBrowser/sidebar.js +++ b/Packages/ohif-lesiontracker/client/components/timepointBrowser/sidebar.js @@ -19,7 +19,7 @@ Template.timepointBrowserSidebar.onRendered(() => { // Runs this computation every time the timepointViewType is changed const type = instance.timepointViewType.get(); if (type !== instance.lastType) { - const eventKey = 'ohif.lesiontracker.timepoint.changeViewType'; + const eventKey = 'ohif.measurements.timepoint.changeViewType'; instance.$browserList.trigger(eventKey, type); } @@ -49,7 +49,7 @@ Template.timepointBrowserSidebar.events({ }); }, - 'ohif.lesiontracker.timepoint.click'(event, instance) { + 'ohif.measurements.timepoint.click'(event, instance) { const $element = $(event.currentTarget); // Defer the active class toggling to wait for child template rendering diff --git a/Packages/ohif-lesiontracker/package.js b/Packages/ohif-lesiontracker/package.js index 2e9a302d1..8e63f1572 100644 --- a/Packages/ohif-lesiontracker/package.js +++ b/Packages/ohif-lesiontracker/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('standard-app-packages'); @@ -13,8 +13,6 @@ Package.onUse(function(api) { api.use('stylus'); api.use('random'); - api.use('validatejs'); - // Template overriding api.use('aldeed:template-extension@4.0.0'); diff --git a/Packages/ohif-log/package.js b/Packages/ohif-log/package.js index 8c319c55b..4ba86b763 100644 --- a/Packages/ohif-log/package.js +++ b/Packages/ohif-log/package.js @@ -9,7 +9,7 @@ Npm.depends({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('standard-app-packages'); diff --git a/Packages/ohif-measurement-table/client/configuration/dataExchange.js b/Packages/ohif-measurement-table/client/configuration/dataExchange.js index 2a9ce7a9f..9bcc1b880 100644 --- a/Packages/ohif-measurement-table/client/configuration/dataExchange.js +++ b/Packages/ohif-measurement-table/client/configuration/dataExchange.js @@ -9,16 +9,12 @@ export const retrieveMeasurements = (patientId, timepointIds) => { if(!latestSeries) return Promise.resolve({}); - return retrieveMeasurementFromSR(latestSeries).then((value) => { - return { - length: value - } - }); + return retrieveMeasurementFromSR(latestSeries); }; export const storeMeasurements = (measurementData, timepointIds) => { OHIF.log.info('storeMeasurements'); - + const server = OHIF.servers.getCurrentServer(); if (!server || server.type !== 'dicomWeb') { return Promise.resolve({}); @@ -28,6 +24,8 @@ export const storeMeasurements = (measurementData, timepointIds) => { return stowSRFromMeasurements(measurementData).then( () => { OHIF.studies.deleteStudyMetadataPromise(studyInstanceUid); + }, error => { + throw new Error(error); }); }; diff --git a/Packages/ohif-measurement-table/client/utils/getLengthMeasurementData.js b/Packages/ohif-measurement-table/client/utils/getLengthMeasurementData.js deleted file mode 100644 index a571b577c..000000000 --- a/Packages/ohif-measurement-table/client/utils/getLengthMeasurementData.js +++ /dev/null @@ -1,77 +0,0 @@ -import { OHIF } from 'meteor/ohif:core'; -import { cornerstone } from 'meteor/ohif:cornerstone'; -import { getInstanceMetadata } from './srUtils'; - -export default getLengthMeasurementData = (lengthMeasurementContent, displaySets) => { - let lengthStates = []; - - lengthMeasurementContent.forEach(groupItemContent => { - const lengthContent = groupItemContent.ContentSequence; - const reference = lengthContent.ContentSequence.ReferencedSOPSequence; - const lengthState = {}; - - lengthState.measuredValue = groupItemContent.MeasuredValueSequence.NumericValue; - lengthState.handles = {start: {}, end: {}}; - [lengthState.handles.start.x, - lengthState.handles.start.y, - lengthState.handles.end.x, - lengthState.handles.end.y] = lengthContent.GraphicData; - - // TODO: Save textbox position in GraphicData? - lengthState.handles.textBox = { - hasMoved: false, - movesIndependently: false, - drawnIndependently: true, - allowedOutsideImage: true, - hasBoundingBox: true - } - - lengthState.ReferencedInstanceUID = reference.ReferencedSOPInstanceUID; - if (reference.ReferencedFrameNumber && reference.ReferencedFrameNumber !== 'NaN') { - lengthState.ReferencedFrameNumber = reference.ReferencedFrameNumber; - } else { - lengthState.ReferencedFrameNumber = 0; - } - - lengthStates.push(lengthState); - }); - - const lengthMeasurementData = []; - - let measurementNumber = 0; - lengthStates.forEach(lengthState => { - const sopInstanceUid = lengthState.ReferencedInstanceUID; - const instanceMetadata = getInstanceMetadata(displaySets, sopInstanceUid); - const imageId = OHIF.viewerbase.getImageId(instanceMetadata); - if (!imageId) { - return; - } - - const studyInstanceUid = cornerstone.metaData.get('study', imageId).studyInstanceUid; - const seriesInstanceUid = cornerstone.metaData.get('series', imageId).seriesInstanceUid; - const patientId = instanceMetadata._study.patientId; - const frameIndex = lengthState.ReferencedFrameNumber; - const imagePath = [studyInstanceUid, seriesInstanceUid, sopInstanceUid, frameIndex].join('_'); - const measurement = { - handles: lengthState.handles, - length: lengthState.measuredValue, - imageId, - imagePath, - sopInstanceUid, - seriesInstanceUid, - studyInstanceUid, - patientId, - frameIndex, - measurementNumber: ++measurementNumber, - userId: 'UserID', - timepointId: OHIF.viewer.data.currentTimepointId, - toolType: 'length', - _id: imageId + measurementNumber, - }; - - lengthMeasurementData.push(measurement); - }); - - - return lengthMeasurementData; -}; diff --git a/Packages/ohif-measurement-table/client/utils/getLengthMeasurementGroupContentItem.js b/Packages/ohif-measurement-table/client/utils/getLengthMeasurementGroupContentItem.js deleted file mode 100644 index ff84a5e98..000000000 --- a/Packages/ohif-measurement-table/client/utils/getLengthMeasurementGroupContentItem.js +++ /dev/null @@ -1,79 +0,0 @@ -export default measurementGroupContentItem = (measurement, sopClassUid) => { - const { - handles, - length, - frameIndex, - sopInstanceUid - } = measurement; - const measurementContentItem = [ - { - RelationshipType: 'HAS OBS CONTEXT', - ValueType: 'TEXT', - ConceptNameCodeSequence: { - CodeValue: '112039', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Tracking Identifier', - }, - TextValue: 'web annotation', - }, - { - RelationshipType: 'HAS OBS CONTEXT', - ValueType: 'UIDREF', - ConceptNameCodeSequence: { - CodeValue: '112040', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Tracking Unique Identifier', - }, - UID: dcmjs.data.DicomMetaDictionary.uid(), - }, - { - RelationshipType: 'CONTAINS', - ValueType: 'CODE', - ConceptNameCodeSequence: { - CodeValue: '121071', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Finding', - }, - ConceptCodeSequence: { - CodeValue: 'SAMPLEFINDING', - CodingSchemeDesignator: '99dcmjs', - CodeMeaning: 'Sample Finding', - }, - }, - { - RelationshipType: 'CONTAINS', - ValueType: 'NUM', - ConceptNameCodeSequence: { - CodeValue: 'G-D7FE', - CodingSchemeDesignator: 'SRT', - CodeMeaning: 'Length', - }, - MeasuredValueSequence: { - MeasurementUnitsCodeSequence: { - CodeValue: 'mm', - CodingSchemeDesignator: 'UCUM', - CodingSchemeVersion: '1.4', - CodeMeaning: 'millimeter', - }, - NumericValue: length, - }, - ContentSequence: { - RelationshipType: 'INFERRED FROM', - ValueType: 'SCOORD', - GraphicType: 'POLYLINE', - GraphicData: [ handles.start.x, handles.start.y, handles.end.x, handles.end.y ], - ContentSequence: { - RelationshipType: 'SELECTED FROM', - ValueType: 'IMAGE', - ReferencedSOPSequence: { - ReferencedSOPClassUID: sopClassUid, - ReferencedSOPInstanceUID: sopInstanceUid, - ReferencedFrameNumber: frameIndex, - } - }, - }, - }, - ]; - - return measurementContentItem; -}; \ No newline at end of file diff --git a/Packages/ohif-measurement-table/client/utils/handleSR.js b/Packages/ohif-measurement-table/client/utils/handleSR.js index a13165df1..9f9c7e2d9 100644 --- a/Packages/ohif-measurement-table/client/utils/handleSR.js +++ b/Packages/ohif-measurement-table/client/utils/handleSR.js @@ -1,60 +1,63 @@ import { dcmjs } from 'meteor/ohif:cornerstone'; import retrieveDataFromSR from './retrieveDataFromSR'; import retrieveDataFromMeasurements from './retrieveDataFromMeasurements'; -import { - multipartEncode -} from './srUtils'; + +import DICOMwebClient from 'dicomweb-client'; const retrieveMeasurementFromSR = async (series) => { - const instance = series.getFirstInstance(); - const options = { - method: 'GET', - responseType: 'arraybuffer', - }; - const url = instance.getDataProperty('wadouri'); + const server = OHIF.servers.getCurrentServer(); + const url = WADOProxy.convertURL(server.wadoRoot, server); - try { - const result = await DICOMWeb.makeRequest(url, options); - const data = await result.arrayBuffer(); - const measurementData = retrieveDataFromSR(data); - return Promise.resolve(measurementData); - } catch(error) { - return Promise.reject(error); - } + const config = { + url, + headers: OHIF.DICOMWeb.getAuthorizationHeader() + }; + + const dicomWeb = new DICOMwebClient.api.DICOMwebClient(config); + + const instance = series.getFirstInstance(); + const options = { + studyInstanceUID: instance.getStudyInstanceUID(), + seriesInstanceUID: instance.getSeriesInstanceUID(), + sopInstanceUID: instance.getSOPInstanceUID(), + }; + + return dicomWeb.retrieveInstance(options).then(retrieveDataFromSR); }; -/** - * Retrieve the DICOMWeb STOW-RS URL for the current server. - * - * See ftp://medical.nema.org/medical/dicom/current/output/html/part18.html#sect_6.6.1.1 - * - * @return {string|null} The URL, rerouted to the proxy if the WADOProxy is enabled. - */ -function getStowRsUrl() { - const server = OHIF.servers.getCurrentServer(); - const url = `${server.wadoRoot}/studies`; - - return WADOProxy.convertURL(url, server); -} - const stowSRFromMeasurements = async (measurements) => { - const serverUrl = getStowRsUrl(); - const reportDataset = retrieveDataFromMeasurements(measurements); - const boundary = dcmjs.data.DicomMetaDictionary.uid(); - const options = { - method: 'POST', - body: multipartEncode(reportDataset, boundary), - headers: { - 'Content-Type': `multipart/related; type=application/dicom; boundary=${boundary}` - } + const server = OHIF.servers.getCurrentServer(); + const url = WADOProxy.convertURL(server.wadoRoot, server); + const dataset = retrieveDataFromMeasurements(measurements); + const { DicomMetaDictionary, DicomDict } = dcmjs.data; + + const meta = { + FileMetaInformationVersion: dataset._meta.FileMetaInformationVersion.Value, + MediaStorageSOPClassUID: dataset.SOPClassUID, + MediaStorageSOPInstanceUID: dataset.SOPInstanceUID, + TransferSyntaxUID: "1.2.840.10008.1.2.1", + ImplementationClassUID: DicomMetaDictionary.uid(), + ImplementationVersionName: "dcmjs-0.0", }; - try { - await DICOMWeb.makeRequest(serverUrl, options); - return Promise.resolve(); - } catch(error) { - return Promise.reject(error); - } + const denaturalized = DicomMetaDictionary.denaturalizeDataset(meta); + const dicomDict = new DicomDict(denaturalized); + + dicomDict.dict = DicomMetaDictionary.denaturalizeDataset(dataset); + + const part10Buffer = dicomDict.write(); + + const config = { + url, + headers: OHIF.DICOMWeb.getAuthorizationHeader() + }; + + const dicomWeb = new DICOMwebClient.api.DICOMwebClient(config); + const options = { + datasets: [part10Buffer] + }; + + return dicomWeb.storeInstances(options); }; export { diff --git a/Packages/ohif-measurement-table/client/utils/retrieveDataFromMeasurements.js b/Packages/ohif-measurement-table/client/utils/retrieveDataFromMeasurements.js index 94be65f46..8ec3061ee 100644 --- a/Packages/ohif-measurement-table/client/utils/retrieveDataFromMeasurements.js +++ b/Packages/ohif-measurement-table/client/utils/retrieveDataFromMeasurements.js @@ -1,199 +1,27 @@ +import { OHIF } from 'meteor/ohif:core'; import { dcmjs } from 'meteor/ohif:cornerstone'; -import { getInstanceMetadata, getAllDisplaySets } from './srUtils'; -import getLengthMeasurementGroupContentItem from './getLengthMeasurementGroupContentItem'; - export default retrieveDataFromMeasurements = (measurements) => { - - const { studyInstanceUid, seriesInstanceUid, sopInstanceUid } = measurements.allTools[0]; - - const displaySets = getAllDisplaySets(); - const instanceMetadata = getInstanceMetadata(displaySets, sopInstanceUid); - const sopClassUid = instanceMetadata._data.sopClassUid; - - // TODO: figure out what is needed to make a dcmjs dataset from - // information available in the viewer. Apparently the raw dicom is not available - // directly. - const derivationSourceDataset = { - StudyInstanceUID: studyInstanceUid, - SeriesInstanceUID: seriesInstanceUid, - SOPInstanceUID: sopInstanceUid, - SOPClassUID: sopClassUid - }; - report = new dcmjs.derivations.StructuredReport([derivationSourceDataset]); - dataset = report.dataset; - - // TODO: what is the correct metaheader - // http://dicom.nema.org/medical/Dicom/current/output/chtml/part10/chapter_7.html - // TODO: move meta creation to dcmjs - const fileMetaInformationVersionArray = new Uint16Array(1); - fileMetaInformationVersionArray[0] = 1; - dataset._meta = { - FileMetaInformationVersion: fileMetaInformationVersionArray.buffer, - MediaStorageSOPClassUID: dataset.SOPClassUID, - MediaStorageSOPInstanceUID: dataset.SOPInstanceUID, - TransferSyntaxUID: "1.2.840.10008.1.2.1", // Explicit little endian (always for dcmjs?) - ImplementationClassUID: dcmjs.data.DicomMetaDictionary.uid(), // TODO: could be git hash or other valid id - ImplementationVersionName: "OHIFViewer" - }; - - // TODO: factor out a lot of this back into dcmjs for use in both - // the example and in the Viewer - const measurementGroupContentSequence = []; - for (measurement of measurements.allTools) { - if (measurement.toolType === 'length') { - measurementGroupContentSequence.push.apply(measurementGroupContentSequence, getLengthMeasurementGroupContentItem(measurement, sopClassUid)); - } - } - - // TODO: make a TID1550 derivation as an SR subclass - dataset = Object.assign(dataset, { - ConceptNameCodeSequence: { - CodeValue: '126000', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Imaging Measurement Report' - }, - ContinuityOfContent: 'SEPARATE', - PerformedProcedureCodeSequence: [], - CompletionFlag: 'COMPLETE', - VerificationFlag: 'UNVERIFIED', - ReferencedPerformedProcedureStepSequence: [], - InstanceNumber: 1, - CurrentRequestedProcedureEvidenceSequence: { - StudyInstanceUID: dataset.StudyInstanceUID, - ReferencedSeriesSequence: { - SeriesInstanceUID: dataset.SeriesInstanceUID, - ReferencedSOPSequence: { - ReferencedSOPClassUID: derivationSourceDataset.SOPClassUID, - ReferencedSOPInstanceUID: derivationSourceDataset.SOPInstanceUID - }, - }, - }, - CodingSchemeIdentificationSequence: { - CodingSchemeDesignator: "99dcmjs", - CodingSchemeName: "Codes used for dcmjs", - CodingSchemeVersion: "0", - CodingSchemeResponsibleOrganization: "https://github.com/pieper/dcmjs" - }, - ContentTemplateSequence: { - MappingResource: 'DCMR', - TemplateIdentifier: '1500' - }, - ContentSequence: [ - { - RelationshipType: 'HAS CONCEPT MOD', - ValueType: 'CODE', - ConceptNameCodeSequence: { - CodeValue: '121049', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Language of Content Item and Descendants', - }, - ConceptCodeSequence: { - CodeValue: 'eng', - CodingSchemeDesignator: 'RFC3066', - CodeMeaning: 'English', - }, - ContentSequence: { - RelationshipType: 'HAS CONCEPT MOD', - ValueType: 'CODE', - ConceptNameCodeSequence: { - CodeValue: '121046', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Country of Language', - }, - ConceptCodeSequence: { - CodeValue: 'US', - CodingSchemeDesignator: 'ISO3166_1', - CodeMeaning: 'United States', - } - } - }, - { - RelationshipType: 'HAS OBS CONTEXT', - ValueType: 'PNAME', - ConceptNameCodeSequence: { - CodeValue: '121008', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Person Observer Name', - }, - PersonName: 'user^web' // TODO: these can be options argument for constructor - }, - { - RelationshipType: 'HAS OBS CONTEXT', - ValueType: 'TEXT', - ConceptNameCodeSequence: { - CodeValue: 'RP-100006', - CodingSchemeDesignator: '99dcmjs', - CodeMeaning: "Person Observer's Login Name" - }, - TextValue: 'user' - }, - { - RelationshipType: 'HAS CONCEPT MOD', - ValueType: 'CODE', - ConceptNameCodeSequence: { - CodeValue: '121058', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Procedure reported' - }, - ConceptCodeSequence: { - CodeValue: '1', - CodingSchemeDesignator: '99dcmjs', - CodeMeaning: 'Unknown procedure' - }, - }, - { - RelationshipType: 'CONTAINS', - ValueType: 'CONTAINER', - ConceptNameCodeSequence: { - CodeValue: '111028', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Image Library', - }, - ContinuityOfContent: 'SEPARATE', - ContentSequence: { - RelationshipType: 'CONTAINS', - ValueType: 'CONTAINER', - ConceptNameCodeSequence: { - CodeValue: '126200', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Image Library Group', - }, - ContinuityOfContent: 'SEPARATE', - ContentSequence: { - RelationshipType: 'CONTAINS', - ValueType: 'IMAGE', - ReferencedSOPSequence: { - // TODO: this should refer to the UIDs extracted from the toolState / instance info - ReferencedSOPClassUID: dataset.SOPClassUID, - ReferencedSOPInstanceUID: dataset.SOPInstanceUID, - }, - }, - }, - }, - { - RelationshipType: 'CONTAINS', - ValueType: 'CONTAINER', - ConceptNameCodeSequence: { - CodeValue: '126010', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Imaging Measurements', // TODO: would be nice to abstract the code sequences (in a dictionary? a service?) - }, - ContinuityOfContent: 'SEPARATE', - ContentSequence: { - RelationshipType: 'CONTAINS', - ValueType: 'CONTAINER', - ConceptNameCodeSequence: { - CodeValue: '125007', - CodingSchemeDesignator: 'DCM', - CodeMeaning: 'Measurement Group', - }, - ContinuityOfContent: 'SEPARATE', - ContentSequence: measurementGroupContentSequence, - }, - }, - ] - }); - - return dataset; + const { MeasurementReport } = dcmjs.adapters.Cornerstone; + const { getImageIdForImagePath } = OHIF.viewerbase; + + const toolState = {}; + + Object.keys(measurements).forEach(measurementType => { + const annotations = measurements[measurementType]; + + annotations.forEach(annotation => { + const imageId = getImageIdForImagePath(annotation.imagePath); + toolState[imageId] = toolState[imageId] || {}; + toolState[imageId][annotation.toolType] = toolState[imageId][annotation.toolType] || { + data: [] + }; + + toolState[imageId][annotation.toolType].data.push(annotation); + }); + }) + + const report = MeasurementReport.generateReport(toolState, cornerstone.metaData); + + return report.dataset; } diff --git a/Packages/ohif-measurement-table/client/utils/retrieveDataFromSR.js b/Packages/ohif-measurement-table/client/utils/retrieveDataFromSR.js index 4c643930c..d5f8e18c4 100644 --- a/Packages/ohif-measurement-table/client/utils/retrieveDataFromSR.js +++ b/Packages/ohif-measurement-table/client/utils/retrieveDataFromSR.js @@ -1,36 +1,58 @@ import { dcmjs } from 'meteor/ohif:cornerstone'; -import getLengthMeasurementData from './getLengthMeasurementData'; -import { toArray, codeMeaningEquals, getAllDisplaySets } from './srUtils' +import {getAllDisplaySets, getInstanceMetadata} from './srUtils' const imagingMeasurementsToMeasurementData = (dataset, displaySets) => { - // Identify the Imaging Measurements - const imagingMeasurementContent = toArray(dataset.ContentSequence).find(codeMeaningEquals("Imaging Measurements")); + const { MeasurementReport } = dcmjs.adapters.Cornerstone; + const storedMeasurementByToolType = MeasurementReport.generateToolState(dataset); + const measurementData = {}; + let measurementNumber = 0; - // Retrieve the Measurements themselves - const measurementGroupContent = toArray(imagingMeasurementContent.ContentSequence).find(codeMeaningEquals("Measurement Group")); + Object.keys(storedMeasurementByToolType).forEach(toolType => { + const measurements = storedMeasurementByToolType[toolType]; + measurementData[toolType] = []; - // For now, bail out if the dataset is not a TID1500 SR with length measurements - // TODO: generalize to the various kinds of report - // TODO: generalize to the kinds of measurements the Viewer supports - if (dataset.ContentTemplateSequence.TemplateIdentifier !== "1500") { - OHIF.log.warn("This package can currently only interpret DICOM SR TID 1500"); + measurements.forEach(measurement => { + const instanceMetadata = getInstanceMetadata(displaySets, measurement.sopInstanceUid); + const imageId = OHIF.viewerbase.getImageId(instanceMetadata); + if (!imageId) { + return; + } - return {}; - } + // TODO: Update the OHIF metadata provider, then switch these to use 'generalSeriesModule' + const study = cornerstone.metaData.get('study', imageId); + const series = cornerstone.metaData.get('series', imageId); + const imagePath = [ + study.studyInstanceUid, + series.seriesInstanceUid, + measurement.sopInstanceUid, + measurement.frameIndex + ].join('_'); - // Filter to find Length measurements in the Structured Report - const lengthMeasurementContent = toArray(measurementGroupContent.ContentSequence).filter(codeMeaningEquals("Length")); + const toolData = Object.assign({}, measurement, { + imageId, + imagePath, + seriesInstanceUid: series.seriesInstanceUid, + studyInstanceUid: study.studyInstanceUid, + patientId: study.patientId, + measurementNumber: ++measurementNumber, + timepointId: OHIF.viewer.data.currentTimepointId, + toolType, + _id: imageId + measurementNumber, + }); - // Retrieve Length Measurement Data - return getLengthMeasurementData(lengthMeasurementContent, displaySets); + measurementData[toolType].push(toolData); + }); + }) + + return measurementData; }; export default retrieveDataFromSR = (Part10SRArrayBuffer) => { const allDisplaySets = getAllDisplaySets(); - // get the dicom data as an Object - let dicomData = dcmjs.data.DicomMessage.readFile(Part10SRArrayBuffer); - let dataset = dcmjs.data.DicomMetaDictionary.naturalizeDataset(dicomData.dict); + // Get the dicom data as an Object + const dicomData = dcmjs.data.DicomMessage.readFile(Part10SRArrayBuffer); + const dataset = dcmjs.data.DicomMetaDictionary.naturalizeDataset(dicomData.dict); // Convert the SR into the kind of object the Measurements package is expecting return imagingMeasurementsToMeasurementData(dataset, allDisplaySets); diff --git a/Packages/ohif-measurement-table/client/utils/srUtils.js b/Packages/ohif-measurement-table/client/utils/srUtils.js index a82eb2e33..8805993b6 100644 --- a/Packages/ohif-measurement-table/client/utils/srUtils.js +++ b/Packages/ohif-measurement-table/client/utils/srUtils.js @@ -2,16 +2,6 @@ import { dcmjs } from 'meteor/ohif:cornerstone'; const supportedSopClassUIDs = ['1.2.840.10008.5.1.4.1.1.88.22']; -const toArray = function(x) { - return (x.constructor.name === "Array" ? x : [x]); -}; - -const codeMeaningEquals = (codeMeaningName) => { - return (contentItem) => { - return contentItem.ConceptNameCodeSequence.CodeMeaning === codeMeaningName; - }; -}; - const getAllDisplaySets = () => { const allStudies = OHIF.viewer.Studies.all(); let allDisplaySets = []; @@ -55,7 +45,7 @@ const getLatestSRSeries = () => { if (supportedSopClassUIDs.includes(sopClassUid)) { if(!latestSeries) { latestSeries = series; - } else if (series._data.seriesDate > latestSeries._data.seriesDate || + } else if (series._data.seriesDate > latestSeries._data.seriesDate || (series._data.seriesDate === latestSeries._data.seriesDate && series._data.seriesTime > latestSeries._data.seriesTime)) { latestSeries = series; } @@ -66,40 +56,8 @@ const getLatestSRSeries = () => { return latestSeries; }; -const stringToArray = (string) => { - return Uint8Array.from(Array.from(string).map(letter => letter.charCodeAt(0))) -}; - -const multipartEncode = (dataset, boundary) => { - - const denaturalizedMetaheader = dcmjs.data.DicomMetaDictionary.denaturalizeDataset(dataset._meta); - const dicomDict = new dcmjs.data.DicomDict(denaturalizedMetaheader); - - dicomDict.dict = dcmjs.data.DicomMetaDictionary.denaturalizeDataset(dataset); - - const part10Buffer = dicomDict.write(); - - const header = `\r\n--${boundary}\r\nContent-Type: application/dicom\r\n\r\n`; - const footer = `\r\n--${boundary}--`; - - headerArray = stringToArray(header); - contentArray = new Uint8Array(part10Buffer); - footerArray = stringToArray(footer); - - const multipartArray = new Uint8Array(headerArray.length + contentArray.length + footerArray.length); - - multipartArray.set(headerArray, 0); - multipartArray.set(contentArray, headerArray.length); - multipartArray.set(footerArray, headerArray.length + contentArray.length); - - return(multipartArray.buffer); -}; - export { - codeMeaningEquals, getAllDisplaySets, getInstanceMetadata, getLatestSRSeries, - multipartEncode, - toArray -} \ No newline at end of file +} diff --git a/Packages/ohif-measurement-table/package.js b/Packages/ohif-measurement-table/package.js index 6e5c0ccda..a6293d55c 100644 --- a/Packages/ohif-measurement-table/package.js +++ b/Packages/ohif-measurement-table/package.js @@ -4,8 +4,13 @@ Package.describe({ version: '0.0.1' }); +Npm.depends({ + 'dicomweb-client': '0.3.2', + 'xhr2': '0.1.4' +}); + Package.onUse(function(api) { - api.versionsFrom('1.6'); + api.versionsFrom('1.7'); api.use('ecmascript'); diff --git a/Packages/ohif-measurements/client/lib/MeasurementHandlers/handleSingleMeasurementAdded.js b/Packages/ohif-measurements/client/lib/MeasurementHandlers/handleSingleMeasurementAdded.js index 8a254d4c5..226ba89a7 100644 --- a/Packages/ohif-measurements/client/lib/MeasurementHandlers/handleSingleMeasurementAdded.js +++ b/Packages/ohif-measurements/client/lib/MeasurementHandlers/handleSingleMeasurementAdded.js @@ -21,7 +21,8 @@ export default function ({ instance, eventData, tool }) { const imageAttributes = getImageAttributes(eventData.element); const measurement = _.extend({}, measurementData, imageAttributes, { measurementNumber: measurementData.measurementNumber, - userId: OHIF.user.getUserId() + userId: OHIF.user.getUserId(), + toolType }); // Get the related timepoint by the measurement number and use its location if defined diff --git a/Packages/ohif-measurements/client/lib/MeasurementHandlers/handleSingleMeasurementRemoved.js b/Packages/ohif-measurements/client/lib/MeasurementHandlers/handleSingleMeasurementRemoved.js index 1208e44fe..5310fc28e 100644 --- a/Packages/ohif-measurements/client/lib/MeasurementHandlers/handleSingleMeasurementRemoved.js +++ b/Packages/ohif-measurements/client/lib/MeasurementHandlers/handleSingleMeasurementRemoved.js @@ -30,7 +30,7 @@ export default function({ instance, eventData, tool, toolGroupId, toolGroup }) { measurementApi.sortMeasurements(baseline.timepointId); // Repaint the images on all viewports without the removed measurements - _.each($('.imageViewerViewport'), element => cornerstone.updateImage(element)); + _.each($('.imageViewerViewport:not(.empty)'), element => cornerstone.updateImage(element)); // Notify that viewer suffered changes if (tool.toolGroup !== 'temp') { diff --git a/Packages/ohif-measurements/client/lib/index.js b/Packages/ohif-measurements/client/lib/index.js index 088d3eeef..6768b3b80 100644 --- a/Packages/ohif-measurements/client/lib/index.js +++ b/Packages/ohif-measurements/client/lib/index.js @@ -14,6 +14,7 @@ import './getTimepointName'; import './getToolConfiguration'; import './hangingProtocolCustomizations'; import './isNewLesionsMeasurement'; +import './isSaveDisabled'; import './MeasurementHandlers'; import './MeasurementManager'; import './navigateOverLesions'; diff --git a/Packages/ohif-measurements/client/lib/isSaveDisabled.js b/Packages/ohif-measurements/client/lib/isSaveDisabled.js new file mode 100644 index 000000000..687425074 --- /dev/null +++ b/Packages/ohif-measurements/client/lib/isSaveDisabled.js @@ -0,0 +1,24 @@ +import { OHIF } from 'meteor/ohif:core'; + +OHIF.measurements.isSaveDisabled = timepointId => { + const basePath = `viewer.studyViewer.measurements.${timepointId}`; + + // Get the timepoint object + const timepoint = OHIF.viewer.timepointApi.timepoints.findOne({ timepointId }); + + // Check if the timepoint is locked + let isLocked = (timepoint && timepoint.isLocked); + if (typeof isLocked === 'undefined') { + isLocked = true; + } + + // Check if the given timepoint suffered changes + const hasChanges = OHIF.ui.unsavedChanges.probe(basePath) !== 0; + + // Check if the given timepoint has nonconformities + const nonconformities = OHIF.viewer.conformanceCriteria.nonconformities.get(); + const hasNonconformities = nonconformities && !!nonconformities.length; + + // Prevent saving if timepoint is locked, has no changes or has nonconformities + return isLocked || !hasChanges || hasNonconformities; +}; diff --git a/Packages/ohif-measurements/client/lib/jumpToRowItem.js b/Packages/ohif-measurements/client/lib/jumpToRowItem.js index e33d144fc..1782d3624 100644 --- a/Packages/ohif-measurements/client/lib/jumpToRowItem.js +++ b/Packages/ohif-measurements/client/lib/jumpToRowItem.js @@ -3,6 +3,9 @@ import { _ } from 'meteor/underscore'; import { OHIF } from 'meteor/ohif:core'; import { cornerstone } from 'meteor/ohif:cornerstone'; +// Flag that can be changed to disable automatic stack scroll linking when jumping over lesions +OHIF.measurements.automaticStackScrollLinkingEnabled = true; + function renderIntoViewport(measurementData, enabledElement, viewportIndex) { const { activateMeasurements, findAndRenderDisplaySet } = OHIF.measurements; const { element } = enabledElement; @@ -54,6 +57,11 @@ function renderIntoViewport(measurementData, enabledElement, viewportIndex) { } function syncViewports(viewportsIndexes) { + // Prevent stack scrolling from being linked if it's disabled + if (!OHIF.measurements.automaticStackScrollLinkingEnabled) { + return; + } + const synchronizer = OHIF.viewer.stackImagePositionOffsetSynchronizer; if(!synchronizer) { return; } diff --git a/Packages/ohif-measurements/client/lib/saveMeasurements.js b/Packages/ohif-measurements/client/lib/saveMeasurements.js index dae43de6e..996da8a60 100644 --- a/Packages/ohif-measurements/client/lib/saveMeasurements.js +++ b/Packages/ohif-measurements/client/lib/saveMeasurements.js @@ -4,12 +4,10 @@ OHIF.measurements.saveMeasurements = (measurementApi, timepointId) => { const { unsavedChanges, notifications, showDialog } = OHIF.ui; const basePath = `viewer.studyViewer.measurements.${timepointId}`; - // Stop here if there are nonconformities in the timepoints - const nonconformities = OHIF.viewer.conformanceCriteria.nonconformities.get(); - if (nonconformities.length) return; - - // Stop here if there were no changes to the timepoint - if (unsavedChanges.probe(basePath) === 0) return; + // Prevent saving if it's disabled + if (OHIF.measurements.isSaveDisabled(timepointId)) { + return; + } // Clear unsaved changes state and display success message const successHandler = () => { diff --git a/Packages/ohif-measurements/package.js b/Packages/ohif-measurements/package.js index cade7ef26..220b754ed 100644 --- a/Packages/ohif-measurements/package.js +++ b/Packages/ohif-measurements/package.js @@ -11,7 +11,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('standard-app-packages'); @@ -21,8 +21,6 @@ Package.onUse(function(api) { api.use('momentjs:moment'); - api.use('validatejs'); - // Schema for Data Models api.use('aldeed:simple-schema'); api.use('aldeed:collection2'); diff --git a/Packages/ohif-metadata/package.js b/Packages/ohif-metadata/package.js index 1e69589cd..13a0e2ac7 100644 --- a/Packages/ohif-metadata/package.js +++ b/Packages/ohif-metadata/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use('ecmascript'); diff --git a/Packages/ohif-polyfill/package.js b/Packages/ohif-polyfill/package.js index ab843b5e9..c249242b3 100644 --- a/Packages/ohif-polyfill/package.js +++ b/Packages/ohif-polyfill/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); // Meteor packages api.use('ecmascript'); diff --git a/Packages/ohif-select-tree/package.js b/Packages/ohif-select-tree/package.js index 353c20118..e9706b277 100644 --- a/Packages/ohif-select-tree/package.js +++ b/Packages/ohif-select-tree/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); // Meteor packages api.use([ diff --git a/Packages/ohif-servers/both/schema/servers.js b/Packages/ohif-servers/both/schema/servers.js index 71988598d..d12820095 100644 --- a/Packages/ohif-servers/both/schema/servers.js +++ b/Packages/ohif-servers/both/schema/servers.js @@ -64,15 +64,15 @@ export const DICOMWebServer = new SimpleSchema({ imageRendering: { type: String, label: 'Image rendering', - allowedValues: ['wadouri', 'wadors', 'orthanc'], - valuesLabels: ['WADO URI', 'WADO RS', 'ORTHANC'], + allowedValues: ['wadouri', 'wadors'], + valuesLabels: ['WADO URI', 'WADO RS'], defaultValue: 'wadouri' }, thumbnailRendering: { type: String, label: 'Thumbnail rendering', - allowedValues: ['wadouri', 'wadors', 'orthanc'], - valuesLabels: ['WADO URI', 'WADO RS', 'ORTHANC'], + allowedValues: ['wadouri', 'wadors'], + valuesLabels: ['WADO URI', 'WADO RS'], defaultValue: 'wadouri' }, qidoRoot: { diff --git a/Packages/ohif-servers/client/startup.js b/Packages/ohif-servers/client/startup.js index de120dcc1..d8c3d2f47 100644 --- a/Packages/ohif-servers/client/startup.js +++ b/Packages/ohif-servers/client/startup.js @@ -14,7 +14,6 @@ if (Meteor.settings && const endpoints = servers[serverType]; endpoints.forEach((endpoint) => { const server = Object.assign({}, endpoint); - server.origin = 'json'; server.type = serverType; Servers.insert(server); @@ -26,7 +25,5 @@ if (Meteor.settings && CurrentServer.insert({ serverId: newServer._id }); - - console.log('test'); } diff --git a/Packages/ohif-servers/package.js b/Packages/ohif-servers/package.js index 574de1674..465d7ef52 100644 --- a/Packages/ohif-servers/package.js +++ b/Packages/ohif-servers/package.js @@ -5,14 +5,14 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use('ecmascript'); - api.use('templating'); - api.use('jquery'); - api.use('stylus'); - api.use('aldeed:simple-schema'); - api.use('aldeed:collection2'); + api.use('templating', 'client'); + api.use('jquery', 'client'); + api.use('stylus', 'client'); + api.use('aldeed:simple-schema@1.5.4'); + api.use('aldeed:collection2@2.10.0'); // Our custom packages api.use('ohif:core'); diff --git a/Packages/ohif-servers/server/startup.js b/Packages/ohif-servers/server/startup.js index e34a2cca4..efcfec539 100644 --- a/Packages/ohif-servers/server/startup.js +++ b/Packages/ohif-servers/server/startup.js @@ -2,7 +2,6 @@ import { Meteor } from 'meteor/meteor'; import { _ } from 'meteor/underscore'; import { OHIF } from 'meteor/ohif:core'; import { Servers } from 'meteor/ohif:servers/both/collections'; -import { ServerConfiguration } from 'meteor/ohif:servers/both/schema/servers.js'; // Check the servers on meteor startup if (Meteor.settings && diff --git a/Packages/ohif-studies/imports/both/lib/encodeQueryData.js b/Packages/ohif-studies/imports/both/lib/encodeQueryData.js deleted file mode 100644 index f466b3a20..000000000 --- a/Packages/ohif-studies/imports/both/lib/encodeQueryData.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Converts the properties to URL query parameters. Based on: - * http://stackoverflow.com/questions/111529/create-query-parameters-in-javascript - * - * @param data - * @returns {string} - */ -encodeQueryData = function(data) { - var ret = []; - - for (var d in data) { - if (data[d]) { - ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d])); - } - } - - return ret.join('&'); -}; diff --git a/Packages/ohif-studies/imports/both/lib/index.js b/Packages/ohif-studies/imports/both/lib/index.js index 8271ccc98..f53464cd4 100644 --- a/Packages/ohif-studies/imports/both/lib/index.js +++ b/Packages/ohif-studies/imports/both/lib/index.js @@ -1,2 +1 @@ -import './encodeQueryData.js'; import './parseFloatArray.js'; diff --git a/Packages/ohif-studies/imports/both/services/qido/instances.js b/Packages/ohif-studies/imports/both/services/qido/instances.js index e13ae54ea..aadf5db91 100644 --- a/Packages/ohif-studies/imports/both/services/qido/instances.js +++ b/Packages/ohif-studies/imports/both/services/qido/instances.js @@ -1,15 +1,7 @@ import { OHIF } from 'meteor/ohif:core'; -import { DICOMWeb } from 'meteor/ohif:dicomweb-client'; +import DICOMwebClient from 'dicomweb-client'; -/** - * Creates a QIDO URL given the server settings and a study instance UID - * @param server - * @param studyInstanceUid - * @returns {string} URL to be used for QIDO calls - */ -function buildUrl(server, studyInstanceUid) { - return server.qidoRoot + '/studies/' + studyInstanceUid + '/instances'; -} +const { DICOMWeb } = OHIF; /** * Parses data returned from a QIDO search and transforms it into @@ -76,20 +68,23 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { * @returns {{wadoUriRoot: String, studyInstanceUid: String, seriesList: Array}} */ OHIF.studies.services.QIDO.Instances = function(server, studyInstanceUid) { - var url = buildUrl(server, studyInstanceUid); + // TODO: Are we using this function anywhere?? Can we remove it? - try { - var result = DICOMWeb.getJSON(url, server.requestOptions); + const config = { + url: server.qidoRoot, + headers: OHIF.DICOMWeb.getAuthorizationHeader() + }; + const dicomWeb = new DICOMwebClient.api.DICOMwebClient(config); + const queryParams = getQIDOQueryParams(filter, server.qidoSupportsIncludeField); + const options = { + studyInstanceUID: studyInstanceUid + }; + return dicomWeb.searchForInstances(options).then(result => { return { wadoUriRoot: server.wadoUriRoot, studyInstanceUid: studyInstanceUid, seriesList: resultDataToStudyMetadata(server, studyInstanceUid, result.data) }; - } catch (error) { - OHIF.log.trace(); - - throw error; - } - + }); }; diff --git a/Packages/ohif-studies/imports/both/services/qido/studies.js b/Packages/ohif-studies/imports/both/services/qido/studies.js index b7ff4f97b..830bd9302 100644 --- a/Packages/ohif-studies/imports/both/services/qido/studies.js +++ b/Packages/ohif-studies/imports/both/services/qido/studies.js @@ -1,5 +1,14 @@ import { OHIF } from 'meteor/ohif:core'; -import { DICOMWeb } from 'meteor/ohif:dicomweb-client'; +import DICOMwebClient from 'dicomweb-client'; + +const { DICOMWeb } = OHIF; + +// TODO: Is there an easier way to do this? +if (Meteor.isServer) { + var XMLHttpRequest = require('xhr2'); + + global.XMLHttpRequest = XMLHttpRequest; +} /** * Creates a QIDO date string for a date range query @@ -23,11 +32,11 @@ function dateToString(date) { * Produces a QIDO URL given server details and a set of specified search filter * items * - * @param server * @param filter + * @param serverSupportsQIDOIncludeField * @returns {string} The URL with encoded filter query data */ -function filterToQIDOURL(server, filter) { +function getQIDOQueryParams(filter, serverSupportsQIDOIncludeField) { const commaSeparatedFields = [ '00081030', // Study Description '00080060' //Modality @@ -41,7 +50,8 @@ function filterToQIDOURL(server, filter) { StudyDescription: filter.studyDescription, ModalitiesInStudy: filter.modalitiesInStudy, limit: filter.limit, - includefield: server.qidoSupportsIncludeField ? 'all' : commaSeparatedFields + offset: filter.offset, + includefield: serverSupportsQIDOIncludeField ? commaSeparatedFields : 'all' }; // build the StudyDate range parameter @@ -59,7 +69,16 @@ function filterToQIDOURL(server, filter) { parameters.StudyInstanceUID = studyUids; } - return server.qidoRoot + '/studies?' + encodeQueryData(parameters); + // Clean query params of undefined values. + const params = {}; + Object.keys(parameters).forEach(key => { + if (parameters[key] !== undefined && + parameters[key] !== "") { + params[key] = parameters[key]; + } + }); + + return params; } /** @@ -98,13 +117,16 @@ function resultDataToStudies(resultData) { } OHIF.studies.services.QIDO.Studies = (server, filter) => { - const url = filterToQIDOURL(server, filter); + const config = { + url: server.qidoRoot, + headers: OHIF.DICOMWeb.getAuthorizationHeader() + }; - return new Promise((resolve, reject) => { - DICOMWeb.getJSON(url, server.requestOptions).then(result => { - const studies = resultDataToStudies(result); + const dicomWeb = new DICOMwebClient.api.DICOMwebClient(config); + const queryParams = getQIDOQueryParams(filter, server.qidoSupportsIncludeField); + const options = { + queryParams + }; - resolve(studies); - }, reject); - }); + return dicomWeb.searchForStudies(options).then(resultDataToStudies); }; diff --git a/Packages/ohif-studies/imports/both/services/wado/retrieveMetadata.js b/Packages/ohif-studies/imports/both/services/wado/retrieveMetadata.js index 05d75657f..a4c9f8904 100644 --- a/Packages/ohif-studies/imports/both/services/wado/retrieveMetadata.js +++ b/Packages/ohif-studies/imports/both/services/wado/retrieveMetadata.js @@ -1,7 +1,10 @@ import { OHIF } from 'meteor/ohif:core'; -import { DICOMWeb } from 'meteor/ohif:dicomweb-client'; +import DICOMwebClient from 'dicomweb-client'; + import { parseFloatArray } from '../../lib/parseFloatArray'; +const { DICOMWeb } = OHIF; + /** * Simple cache schema for retrieved color palettes. */ @@ -39,17 +42,6 @@ const paletteColorCache = { } }; -/** - * Creates a URL for a WADO search - * - * @param server - * @param studyInstanceUid - * @returns {string} - */ -function buildUrl(server, studyInstanceUid) { - return server.wadoRoot + '/studies/' + studyInstanceUid + '/metadata'; -} - /** Returns a WADO url for an instance * * @param studyInstanceUid @@ -58,6 +50,7 @@ function buildUrl(server, studyInstanceUid) { * @returns {string} */ function buildInstanceWadoUrl(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid) { + // TODO: This can be removed, since DICOMWebClient has the same function. Not urgent, though const params = []; params.push('requestType=WADO'); @@ -102,23 +95,47 @@ function getSourceImageInstanceUid(instance) { } function getPaletteColor(server, instance, tag, lutDescriptor) { - const lut = []; const numLutEntries = lutDescriptor[0]; const bits = lutDescriptor[2]; - const uri = WADOProxy.convertURL(instance[tag].BulkDataURI, server) - const bulkDataPromise = DICOMWeb.getBulkData(uri); - return bulkDataPromise.then(data => { - for (var i = 0; i < numLutEntries; i++) { - if(bits === 16) { - lut[i] = data[i * 65536] + data[i + 1]; + let uri = WADOProxy.convertURL(instance[tag].BulkDataURI, server) + + // TODO: Workaround for dcm4chee behind SSL-terminating proxy returning + // incorrect bulk data URIs + if (server.wadoRoot.indexOf('https') === 0 && + !uri.includes('https')) { + uri = uri.replace('http', 'https'); + } + + const config = { + url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used + headers: OHIF.DICOMWeb.getAuthorizationHeader() + }; + const dicomWeb = new DICOMwebClient.api.DICOMwebClient(config); + const options = { + BulkDataURI: uri + }; + + const readUInt16 = (byteArray, position) => { + return byteArray[position] + (byteArray[position + 1] * 256); + } + + const arrayBufferToPaletteColorLUT = (arraybuffer) =>{ + const byteArray = new Uint8Array(arraybuffer); + const lut = []; + + for (let i = 0; i < numLutEntries; i++) { + if (bits === 16) { + lut[i] = readUInt16(byteArray, i * 2); } else { - lut[i] = data[i]; + lut[i] = byteArray[i]; } } return lut; - }) + } + + return dicomWeb.retrieveBulkData(options).then(arrayBufferToPaletteColorLUT) } /** @@ -129,13 +146,15 @@ function getPaletteColor(server, instance, tag, lutDescriptor) { * @returns {String} The ReferenceSOPInstanceUID */ async function getPaletteColors(server, instance, lutDescriptor) { - let entry = null; let paletteUID = DICOMWeb.getString(instance['00281199']); return new Promise((resolve, reject) => { if (paletteColorCache.isValidUID(paletteUID)) { - entry = paletteColorCache.get(paletteUID); - return resolve(entry); + const entry = paletteColorCache.get(paletteUID); + + if (entry) { + return resolve(entry); + } } // no entry in cache... Fetch remote data. @@ -146,7 +165,11 @@ async function getPaletteColors(server, instance, lutDescriptor) { const promises = [r, g, b]; Promise.all(promises).then((args) => { - entry = { red: r, green: g, blue: b }; + entry = { + red: args[0], + green: args[1], + blue: args[2] + }; // when paletteUID is present, the entry can be cached... entry.uid = paletteUID; @@ -202,9 +225,6 @@ function getRadiopharmaceuticalInfo(instance) { * @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}} */ async function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { - const seriesMap = {}; - const seriesList = []; - if (!resultData.length) { return; } @@ -215,7 +235,9 @@ async function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { } const studyData = { - seriesList, + seriesList: [], + studyInstanceUid, + wadoUriRoot: server.wadoUriRoot, patientName: DICOMWeb.getName(anInstance['00100010']), patientId: DICOMWeb.getString(anInstance['00100020']), patientAge: DICOMWeb.getNumber(anInstance['00101010']), @@ -230,9 +252,12 @@ async function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { institutionName: DICOMWeb.getString(anInstance['00080080']) }; + const seriesMap = {}; + await Promise.all(resultData.map(async function(instance) { - var seriesInstanceUid = DICOMWeb.getString(instance['0020000E']); - var series = seriesMap[seriesInstanceUid]; + const seriesInstanceUid = DICOMWeb.getString(instance['0020000E']); + let series = seriesMap[seriesInstanceUid]; + if (!series) { series = { seriesDescription: DICOMWeb.getString(instance['0008103E']), @@ -244,7 +269,7 @@ async function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { instances: [] }; seriesMap[seriesInstanceUid] = series; - seriesList.push(series); + studyData.seriesList.push(series); } const sopInstanceUid = DICOMWeb.getString(instance['00080018']); @@ -331,22 +356,23 @@ async function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { } /** - * Retrieved Study MetaData from a DICOM server using a WADO call + * Retrieve Study MetaData from a DICOM server using a WADO call + * * @param server * @param studyInstanceUid * @returns {Promise} */ OHIF.studies.services.WADO.RetrieveMetadata = async function(server, studyInstanceUid) { - const url = buildUrl(server, studyInstanceUid); + const config = { + url: server.wadoRoot, + headers: OHIF.DICOMWeb.getAuthorizationHeader() + }; + const dicomWeb = new DICOMwebClient.api.DICOMwebClient(config); + const options = { + studyInstanceUID: studyInstanceUid + }; - return new Promise((resolve, reject) => { - DICOMWeb.getJSON(url, server.requestOptions).then(result => { - resultDataToStudyMetadata(server, studyInstanceUid, result).then((study) => { - study.wadoUriRoot = server.wadoUriRoot; - study.studyInstanceUid = studyInstanceUid; - - resolve(study); - }, reject); - }, reject); + return dicomWeb.retrieveStudyMetadata(options).then(result => { + return resultDataToStudyMetadata(server, studyInstanceUid, result); }); }; diff --git a/Packages/ohif-studies/imports/server/services/dimse/instances.js b/Packages/ohif-studies/imports/server/services/dimse/instances.js index 6672c069d..ff09559f8 100644 --- a/Packages/ohif-studies/imports/server/services/dimse/instances.js +++ b/Packages/ohif-studies/imports/server/services/dimse/instances.js @@ -1,4 +1,5 @@ import { OHIF } from 'meteor/ohif:core'; +import DIMSE from 'dimse'; /** * Parses data returned from a study search and transforms it into diff --git a/Packages/ohif-studies/imports/server/services/dimse/retrieveMetadata.js b/Packages/ohif-studies/imports/server/services/dimse/retrieveMetadata.js index 255b496f6..fb47de74c 100644 --- a/Packages/ohif-studies/imports/server/services/dimse/retrieveMetadata.js +++ b/Packages/ohif-studies/imports/server/services/dimse/retrieveMetadata.js @@ -1,5 +1,6 @@ import { OHIF } from 'meteor/ohif:core'; import { parseFloatArray } from 'meteor/ohif:studies/imports/both/lib/parseFloatArray'; +import DIMSE from 'dimse'; /** * Returns the value of the element (e.g. '00280009') diff --git a/Packages/ohif-studies/imports/server/services/dimse/setup.js b/Packages/ohif-studies/imports/server/services/dimse/setup.js index 919251fe2..7e3c71ed7 100644 --- a/Packages/ohif-studies/imports/server/services/dimse/setup.js +++ b/Packages/ohif-studies/imports/server/services/dimse/setup.js @@ -1,6 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { OHIF } from 'meteor/ohif:core'; import { CurrentServer } from 'meteor/ohif:servers/both/collections'; +import DIMSE from 'dimse'; const setupDIMSE = () => { // Terminate existing DIMSE servers and sockets and clean up the connection object diff --git a/Packages/ohif-studies/imports/server/services/dimse/studies.js b/Packages/ohif-studies/imports/server/services/dimse/studies.js index c4bb16bb8..e3169432f 100644 --- a/Packages/ohif-studies/imports/server/services/dimse/studies.js +++ b/Packages/ohif-studies/imports/server/services/dimse/studies.js @@ -1,5 +1,6 @@ import { moment } from 'meteor/momentjs:moment'; import { OHIF } from 'meteor/ohif:core'; +import DIMSE from 'dimse'; /** * Parses resulting data from a QIDO call into a set of Study MetaData diff --git a/Packages/ohif-studies/package.js b/Packages/ohif-studies/package.js index 30993e323..69bae79c1 100644 --- a/Packages/ohif-studies/package.js +++ b/Packages/ohif-studies/package.js @@ -4,8 +4,14 @@ Package.describe({ version: '0.0.1' }); +Npm.depends({ + dimse: '0.0.2', + 'dicomweb-client': '0.3.2', + 'xhr2': '0.1.4' +}); + Package.onUse(function(api) { - api.versionsFrom('1.6'); + api.versionsFrom('1.7'); api.use([ 'ecmascript', @@ -20,8 +26,6 @@ Package.onUse(function(api) { 'ohif:core', 'ohif:log', 'ohif:servers', - 'ohif:dicom-services', - 'ohif:dicomweb-client', 'ohif:viewerbase', 'ohif:wadoproxy' ]); diff --git a/Packages/ohif-study-list/client/components/studylist/index.js b/Packages/ohif-study-list/client/components/studylist/index.js index 6cd09ef93..2249e8b6d 100644 --- a/Packages/ohif-study-list/client/components/studylist/index.js +++ b/Packages/ohif-study-list/client/components/studylist/index.js @@ -1,4 +1,5 @@ import './studylist.html'; +import './studylist.js'; import './studylist.styl'; import './studylistStudy/studylistStudy.html'; diff --git a/Packages/ohif-study-list/client/components/studylist/studylist.js b/Packages/ohif-study-list/client/components/studylist/studylist.js new file mode 100644 index 000000000..91c8579ae --- /dev/null +++ b/Packages/ohif-study-list/client/components/studylist/studylist.js @@ -0,0 +1,12 @@ +import { Template } from 'meteor/templating'; +import { OHIF } from 'meteor/ohif:core'; + +Template.studylist.onCreated(() => { + // Set the current context + OHIF.context.set('studylist'); +}); + +Template.studylist.onDestroyed(() => { + // Reset the current context + OHIF.context.set(null); +}); diff --git a/Packages/ohif-study-list/client/components/studylist/studylistResult/studylistResult.js b/Packages/ohif-study-list/client/components/studylist/studylistResult/studylistResult.js index 43b15a52e..d6f545048 100644 --- a/Packages/ohif-study-list/client/components/studylist/studylistResult/studylistResult.js +++ b/Packages/ohif-study-list/client/components/studylist/studylistResult/studylistResult.js @@ -15,7 +15,6 @@ Template.studylistResult.helpers({ */ studies() { const instance = Template.instance(); - let studies; let sortOption = { patientName: 1, studyDate: 1 @@ -26,13 +25,7 @@ Template.studylistResult.helpers({ sortOption = Session.get('sortOption'); } - // Pagination parameters - const rowsPerPage = instance.paginationData.rowsPerPage.get(); - const currentPage = instance.paginationData.currentPage.get(); - const offset = rowsPerPage * currentPage; - const limit = offset + rowsPerPage; - - studies = OHIF.studylist.collections.Studies.find({}, { + const studies = OHIF.studylist.collections.Studies.find({}, { sort: sortOption }).fetch(); @@ -43,8 +36,7 @@ Template.studylistResult.helpers({ // Update record count instance.paginationData.recordCount.set(studies.length); - // Limit studies - return studies.slice(offset, limit); + return studies; }, numberOfStudies() { @@ -90,17 +82,6 @@ function getFilter(filter) { return filter; } -/** - * Search for a value in a string - */ -function isIndexOf(mainVal, searchVal) { - if (mainVal === undefined || mainVal === '' || mainVal.indexOf(searchVal) > -1){ - return true; - } - - return false; -} - /** * Replace object if undefined */ @@ -112,22 +93,11 @@ function replaceUndefinedColumnValue(text) { } } -/** - * Convert string to study date - */ -function convertStringToStudyDate(dateStr) { - const y = dateStr.substring(0, 4); - const m = dateStr.substring(4, 6); - const d = dateStr.substring(6, 8); - const newDateStr = m + '/' + d + '/' + y; - return new Date(newDateStr); -} - /** * Runs a search for studies matching the studylist query parameters * Inserts the identified studies into the Studies Collection */ -function search() { +function search(instance) { OHIF.log.info('search()'); // Show loading message @@ -136,8 +106,14 @@ function search() { // Hiding error message Session.set('serverError', false); + // Pagination parameters + const rowsPerPage = instance.paginationData.rowsPerPage.get(); + const currentPage = instance.paginationData.currentPage.get(); + // Create the filters to be used for the StudyList Search filter = { + offset: rowsPerPage * currentPage, + limit: rowsPerPage, patientName: getFilter($('input#patientName').val()), patientId: getFilter($('input#patientId').val()), accessionNumber: getFilter($('input#accessionNumber').val()), @@ -153,28 +129,37 @@ function search() { OHIF.studies.searchStudies(filter).then((studies) => { OHIF.log.info('StudyListSearch'); - // Hide loading text + // Hide loading text Session.set('showLoadingText', false); + // Clear all current studies + OHIF.studylist.collections.Studies.remove({}); + if (!studies) { OHIF.log.warn('No studies found'); return; } - // Clear all current studies - OHIF.studylist.collections.Studies.remove({}); - // Loop through all identified studies studies.forEach(study => { - // Search the rest of the parameters that aren't done via the server call - if (isIndexOf(study.modalities, modality) && - (new Date(studyDateFrom).setHours(0, 0, 0, 0) <= convertStringToStudyDate(study.studyDate) || !studyDateFrom || studyDateFrom === '') && - (convertStringToStudyDate(study.studyDate) <= new Date(studyDateTo).setHours(0, 0, 0, 0) || !studyDateTo || studyDateTo === '')) { + // TODO: Why is this Modality filter different from QIDO? + if (!modality && !study.modalities.includes(modality)) { + return; + } + // Sometimes DICOM studies have incorrect Date entries with + // periods such as '1990.10.04' + let studyDate = study.studyDate; + if (studyDate && studyDate.includes('.')) { + studyDate = studyDate.replace('.', ''); + } + + // Search the rest of the parameters that aren't done via the server call + if ((moment(studyDateFrom, "MM/DD/YYYY").isBefore(moment(studyDate, "YYYYMMDD")) || !studyDateFrom ) && + (moment(studyDate, "YYYYMMDD").isBefore(moment(studyDateTo, "MM/DD/YYYY")) || !studyDateTo || studyDateTo === '')) { // Convert numberOfStudyRelatedInstance string into integer study.numberOfStudyRelatedInstances = !isNaN(study.numberOfStudyRelatedInstances) ? parseInt(study.numberOfStudyRelatedInstances) : undefined; - // Insert any matching studies into the Studies Collection OHIF.studylist.collections.Studies.insert(study); } @@ -273,7 +258,20 @@ Template.studylistResult.onRendered(() => { } }).data('daterangepicker'); - search(); + search(instance); + + // Search when rowsPerPage or currentPage is changed + instance.autorun(computation => { + instance.paginationData.rowsPerPage.dep.depend(); + instance.paginationData.currentPage.dep.depend(); + + // Stop here if it is the first run + if (computation.firstRun) { + return; + } + + search(instance); + }); }); Template.studylistResult.onDestroyed(() => { @@ -292,17 +290,17 @@ function resetSortingColumns(instance, sortingColumn) { } Template.studylistResult.events({ - 'keydown input'(event) { + 'keydown input'(event, instance) { if (event.which === 13) { // Enter - search(); + search(instance); } }, - 'onsearch input'() { - search(); + 'onsearch input'(event, instance) { + search(instance); }, - 'change #studyDate'(event) { + 'change #studyDate'(event, instance) { let dateRange = $(event.currentTarget).val(); // Remove all space chars @@ -314,7 +312,7 @@ Template.studylistResult.events({ studyDateTo = dates[1]; if (dateRange !== '') { - search(); + search(instance); } }, diff --git a/Packages/ohif-study-list/package.js b/Packages/ohif-study-list/package.js index 0c4ae5f67..cfdcbfdd5 100644 --- a/Packages/ohif-study-list/package.js +++ b/Packages/ohif-study-list/package.js @@ -10,7 +10,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('standard-app-packages'); @@ -30,7 +30,6 @@ Package.onUse(function(api) { api.use('ohif:core'); api.use('ohif:log'); api.use('ohif:servers'); - api.use('ohif:dicom-services'); api.use('ohif:viewerbase'); api.use('ohif:wadoproxy'); api.use('ohif:studies'); diff --git a/Packages/ohif-themes-common/package.js b/Packages/ohif-themes-common/package.js index b8eb59f6e..2fb05c568 100644 --- a/Packages/ohif-themes-common/package.js +++ b/Packages/ohif-themes-common/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4.2.3'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('templating'); diff --git a/Packages/ohif-themes/package.js b/Packages/ohif-themes/package.js index 53b9805cc..be52f8bda 100644 --- a/Packages/ohif-themes/package.js +++ b/Packages/ohif-themes/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4.2.3'); + api.versionsFrom('1.7'); api.use('stylus'); diff --git a/Packages/ohif-user-management/package.js b/Packages/ohif-user-management/package.js index bd7a6c296..901e0bc65 100644 --- a/Packages/ohif-user-management/package.js +++ b/Packages/ohif-user-management/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('standard-app-packages'); diff --git a/Packages/ohif-user-meteor-accounts/imports/client/index.js b/Packages/ohif-user-meteor-accounts/imports/client/index.js index 267df83f9..0df9e0cfe 100644 --- a/Packages/ohif-user-meteor-accounts/imports/client/index.js +++ b/Packages/ohif-user-meteor-accounts/imports/client/index.js @@ -7,4 +7,4 @@ import './logout'; import './schema'; import './userLoggedIn'; -import './userLogin' +import './userLogin/' diff --git a/Packages/ohif-user-meteor-accounts/package.js b/Packages/ohif-user-meteor-accounts/package.js index 982284f52..d077d96cf 100644 --- a/Packages/ohif-user-meteor-accounts/package.js +++ b/Packages/ohif-user-meteor-accounts/package.js @@ -5,9 +5,11 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.6'); + api.versionsFrom('1.7'); api.use('ecmascript'); + api.use('templating'); + api.use('stylus'); api.use('accounts-base'); api.use('accounts-password'); diff --git a/Packages/ohif-user-oidc/package.js b/Packages/ohif-user-oidc/package.js index 099767354..c8d7d04d3 100644 --- a/Packages/ohif-user-oidc/package.js +++ b/Packages/ohif-user-oidc/package.js @@ -9,7 +9,7 @@ Npm.depends({ }); Package.onUse(function(api) { - api.versionsFrom('1.6'); + api.versionsFrom('1.7'); api.use('ecmascript', 'client'); diff --git a/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.js b/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.js index 73ef9769f..cf3bcd056 100644 --- a/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.js +++ b/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.js @@ -11,6 +11,31 @@ OHIF.viewerbase.getImageDownloadDialogAnnotationTools = () => { return ['length', 'probe', 'simpleAngle', 'arrowAnnotate', 'ellipticalRoi', 'rectangleRoi']; }; +/** + * Converts a base64 data to a blob. This is needed to enabled JPEG images downloading on IE11. + * Source: https://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript/16245768 + */ +const b64toBlob = (b64Data, contentType='', sliceSize=512) => { + const byteCharacters = atob(b64Data); + const byteArrays = []; + + for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { + const slice = byteCharacters.slice(offset, offset + sliceSize); + + const byteNumbers = new Array(slice.length); + for (let i = 0; i < slice.length; i++) { + byteNumbers[i] = slice.charCodeAt(i); + } + + const byteArray = new Uint8Array(byteNumbers); + + byteArrays.push(byteArray); + } + + const blob = new Blob(byteArrays, { type: contentType }); + return blob; +}; + Template.imageDownloadDialog.onCreated(() => { const instance = Template.instance(); @@ -42,7 +67,7 @@ Template.imageDownloadDialog.onCreated(() => { instance.lastImage = {}; instance.getConfirmCallback = () => () => { - instance.downloadImage(); + return instance.downloadImage(); }; }); @@ -105,7 +130,14 @@ Template.imageDownloadDialog.onRendered(() => { const filename = `${formData.name}.${formData.type}`; const mimetype = `image/${formData.type}`; - cornerstoneTools.saveAs(instance.viewportElement, filename, mimetype); + // Handles JPEG images for IE11 + if (instance.downloadCanvas.msToBlob && formData.type === 'jpeg') { + const image = instance.downloadCanvas.toDataURL(mimetype, 1); + const blob = b64toBlob(image.replace('data:image/jpeg;base64,', ''), mimetype); + return window.navigator.msSaveBlob(blob, filename); + } + + return cornerstoneTools.saveAs(instance.viewportElement, filename, mimetype); }; instance.autorun(() => { @@ -147,9 +179,9 @@ Template.imageDownloadDialog.onRendered(() => { }); Template.imageDownloadDialog.onDestroyed(() => { - const instance = Template.instance(); + const instance = Template.instance(); - cornerstone.disable(instance.viewportElement); + cornerstone.disable(instance.viewportElement); }); Template.imageDownloadDialog.events({ diff --git a/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.styl b/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.styl index d884f04bd..d2d48760f 100644 --- a/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.styl +++ b/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.styl @@ -12,3 +12,6 @@ .viewport-preview max-width: 512px max-height: 512px + + .wrapperLabel + display: block diff --git a/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js b/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js index 211555a72..be7fdd162 100644 --- a/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js +++ b/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js @@ -23,6 +23,9 @@ const allCornerstoneEvents = ['click', 'cornerstonetoolsmousedown', 'cornerstone const PLUGIN_CORNERSTONE = 'cornerstone'; +// Create a way to add hooks to be executed every time a cornerstone element is enabled +OHIF.viewer.cornerstoneElementHooks = []; + /** * This function loads a study series into a viewport element. * @@ -99,6 +102,13 @@ const loadDisplaySetIntoViewport = (data, templateData) => { }; cornerstone.enable(element, options); + // Call every defined hook + OHIF.viewer.cornerstoneElementHooks.forEach(hook => { + if (typeof hook === 'function') { + hook(element); + } + }); + // Get the handler functions that will run when loading has finished or thrown // an error. These are used to show/hide loading / error text boxes on each viewport. const endLoadingHandler = cornerstoneTools.loadHandlerManager.getEndLoadHandler(); diff --git a/Packages/ohif-viewerbase/client/components/viewer/toolbarSectionTools/toolbarSectionTools.styl b/Packages/ohif-viewerbase/client/components/viewer/toolbarSectionTools/toolbarSectionTools.styl index ec6134604..ebbd58f20 100644 --- a/Packages/ohif-viewerbase/client/components/viewer/toolbarSectionTools/toolbarSectionTools.styl +++ b/Packages/ohif-viewerbase/client/components/viewer/toolbarSectionTools/toolbarSectionTools.styl @@ -29,7 +29,7 @@ $distance = 10px transition(opacity 0.3s ease\, transform 0.3s ease\, left 0.3s ease) transform(translateX(-50%) translateY( - ($toolbarDrawerHeight + $distance)) scale(0)) white-space: nowrap - z-index: 1 + z-index: 2 .toolbarSectionDrawer theme('background', '$uiGrayDarkest', 0.95) diff --git a/Packages/ohif-viewerbase/client/components/viewer/viewerMain/viewerMain.js b/Packages/ohif-viewerbase/client/components/viewer/viewerMain/viewerMain.js index 77b526867..fea90093e 100644 --- a/Packages/ohif-viewerbase/client/components/viewer/viewerMain/viewerMain.js +++ b/Packages/ohif-viewerbase/client/components/viewer/viewerMain/viewerMain.js @@ -28,6 +28,9 @@ Template.viewerMain.onCreated(() => { // Add beforeUnload event handler to check for unsaved changes window.addEventListener('beforeunload', unloadHandlers.beforeUnload); + + // Set the current context + OHIF.context.set('viewer'); }); Template.viewerMain.onRendered(() => { @@ -82,4 +85,7 @@ Template.viewerMain.onDestroyed(() => { // @TypeSafeStudies // Clears OHIF.viewer.StudyMetadataList collection OHIF.viewer.StudyMetadataList.removeAll(); + + // Reset the current context + OHIF.context.set(null); }); diff --git a/Packages/ohif-viewerbase/client/lib/StackManager.js b/Packages/ohif-viewerbase/client/lib/StackManager.js index c9e7a6fc6..21b0245cb 100644 --- a/Packages/ohif-viewerbase/client/lib/StackManager.js +++ b/Packages/ohif-viewerbase/client/lib/StackManager.js @@ -35,12 +35,13 @@ function createAndAddStack(stackMap, study, displaySet) { if (numberOfFrames > 1) { OHIF.log.info('Multiframe image detected'); for (let i = 0; i < numberOfFrames; i++) { - metaData.frame = i; + metaData.frameNumber = i; imageId = getImageId(image, i); imageIds.push(imageId); metadataProvider.addMetadata(imageId, metaData); } } else { + metaData.frameNumber = 1; imageId = getImageId(image); imageIds.push(imageId); metadataProvider.addMetadata(imageId, metaData); diff --git a/Packages/ohif-viewerbase/client/lib/WLPresets.js b/Packages/ohif-viewerbase/client/lib/WLPresets.js index a0c51eb93..37ebc452f 100644 --- a/Packages/ohif-viewerbase/client/lib/WLPresets.js +++ b/Packages/ohif-viewerbase/client/lib/WLPresets.js @@ -153,7 +153,7 @@ class WindowLevelPresetsManager { return new Promise((resolve, reject) => { if (this.retrieveFunction) { this.retrieveFunction.call(this).then(resolve).catch(reject); - } else if (OHIF.user) { + } else if (OHIF.user.userLoggedIn()) { try { resolve(OHIF.user.getData(WL_STORAGE_KEY)); } catch(error) { diff --git a/Packages/ohif-viewerbase/client/lib/classes/plugins/OHIFPlugin.js b/Packages/ohif-viewerbase/client/lib/classes/plugins/OHIFPlugin.js index a81cac3f2..c31408edc 100644 --- a/Packages/ohif-viewerbase/client/lib/classes/plugins/OHIFPlugin.js +++ b/Packages/ohif-viewerbase/client/lib/classes/plugins/OHIFPlugin.js @@ -43,6 +43,12 @@ export class OHIFPlugin { }); } + if (plugin.styleURLs && plugin.styleURLs.length) { + plugin.styleURLs.forEach(styleURLs => { + this.loadScript(styleURLs, "text/css"); + }); + } + let scriptURL = plugin.url; if (plugin.allowCaching === false) { diff --git a/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js b/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js index a5fe44d6b..0f312631a 100644 --- a/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js +++ b/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js @@ -15,8 +15,5 @@ export function getWADORSImageId(instance, frame) { return; } - const imageId = `wadors:${uri}`; - OHIF.log.info('WADO-RS ImageID: ' + imageId); - - return imageId; + return `wadors:${uri}`; }; diff --git a/Packages/ohif-viewerbase/client/lib/hotkeyUtils.js b/Packages/ohif-viewerbase/client/lib/hotkeyUtils.js index 4aca22bdf..865963191 100644 --- a/Packages/ohif-viewerbase/client/lib/hotkeyUtils.js +++ b/Packages/ohif-viewerbase/client/lib/hotkeyUtils.js @@ -199,11 +199,11 @@ Meteor.startup(function() { disabled: () => !canMoveDisplaySets(true) }, nextPanel: { - name: 'Next Panel', + name: 'Next Image Viewport', action: () => panelNavigation.loadNextActivePanel() }, previousPanel: { - name: 'Previous Panel', + name: 'Previous Image Viewport', action: () => panelNavigation.loadPreviousActivePanel() } }, true); diff --git a/Packages/ohif-viewerbase/package.js b/Packages/ohif-viewerbase/package.js index 0db14d0ab..82e4dbc5b 100644 --- a/Packages/ohif-viewerbase/package.js +++ b/Packages/ohif-viewerbase/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use(['ecmascript', 'standard-app-packages', @@ -13,7 +13,6 @@ Package.onUse(function(api) { 'jquery', 'stylus', 'momentjs:moment', - 'validatejs', 'cultofcoders:persistent-session' ]); @@ -219,7 +218,7 @@ Package.onUse(function(api) { }); Package.onTest(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); /* * Really important dependencies to the project @@ -230,7 +229,6 @@ Package.onTest(function(api) { 'jquery', 'mongo', 'momentjs:moment', - 'validatejs', 'cultofcoders:persistent-session' ], 'client'); diff --git a/Packages/ohif-wadoproxy/package.js b/Packages/ohif-wadoproxy/package.js index 4ec4c1f0b..26e9fa51a 100755 --- a/Packages/ohif-wadoproxy/package.js +++ b/Packages/ohif-wadoproxy/package.js @@ -10,7 +10,7 @@ Npm.depends({ }); Package.onUse(function(api) { - api.versionsFrom('1.4'); + api.versionsFrom('1.7'); api.use('ecmascript'); api.use('clinical:router@2.0.19'); @@ -22,7 +22,7 @@ Package.onUse(function(api) { api.addFiles('both/convertURL.js', ['client', 'server']); api.addFiles('both/initialize.js', ['client', 'server']); api.addFiles('server/routes.js', 'server'); - + // Global exports api.export('WADOProxy'); }); diff --git a/Packages/validatejs/lib/validate.js b/Packages/validatejs/lib/validate.js deleted file mode 100755 index ec942ac7a..000000000 --- a/Packages/validatejs/lib/validate.js +++ /dev/null @@ -1,1086 +0,0 @@ -/*! - * validate.js 0.9.0 - * - * (c) 2013-2015 Nicklas Ansman, 2013 Wrapp - * Validate.js may be freely distributed under the MIT license. - * For all details and documentation: - * http://validatejs.org/ - */ - -(function(exports, module, define) { - "use strict"; - - // The main function that calls the validators specified by the constraints. - // The options are the following: - // - format (string) - An option that controls how the returned value is formatted - // * flat - Returns a flat array of just the error messages - // * grouped - Returns the messages grouped by attribute (default) - // * detailed - Returns an array of the raw validation data - // - fullMessages (boolean) - If `true` (default) the attribute name is prepended to the error. - // - // Please note that the options are also passed to each validator. - var validate = function(attributes, constraints, options) { - options = v.extend({}, v.options, options); - - var results = v.runValidations(attributes, constraints, options) - , attr - , validator; - - for (attr in results) { - for (validator in results[attr]) { - if (v.isPromise(results[attr][validator])) { - throw new Error("Use validate.async if you want support for promises"); - } - } - } - return validate.processValidationResults(results, options); - }; - - var v = validate; - - // Copies over attributes from one or more sources to a single destination. - // Very much similar to underscore's extend. - // The first argument is the target object and the remaining arguments will be - // used as sources. - v.extend = function(obj) { - [].slice.call(arguments, 1).forEach(function(source) { - for (var attr in source) { - obj[attr] = source[attr]; - } - }); - return obj; - }; - - v.extend(validate, { - // This is the version of the library as a semver. - // The toString function will allow it to be coerced into a string - version: { - major: 0, - minor: 9, - patch: 0, - metadata: "development", - toString: function() { - var version = v.format("%{major}.%{minor}.%{patch}", v.version); - if (!v.isEmpty(v.version.metadata)) { - version += "+" + v.version.metadata; - } - return version; - } - }, - - // Below is the dependencies that are used in validate.js - - // The constructor of the Promise implementation. - // If you are using Q.js, RSVP or any other A+ compatible implementation - // override this attribute to be the constructor of that promise. - // Since jQuery promises aren't A+ compatible they won't work. - Promise: typeof Promise !== "undefined" ? Promise : /* istanbul ignore next */ null, - - EMPTY_STRING_REGEXP: /^\s*$/, - - // Runs the validators specified by the constraints object. - // Will return an array of the format: - // [{attribute: "", error: ""}, ...] - runValidations: function(attributes, constraints, options) { - var results = [] - , attr - , validatorName - , value - , validators - , validator - , validatorOptions - , error; - - if (v.isDomElement(attributes) || v.isJqueryElement(attributes)) { - attributes = v.collectFormValues(attributes); - } - - // Loops through each constraints, finds the correct validator and run it. - for (attr in constraints) { - value = v.getDeepObjectValue(attributes, attr); - // This allows the constraints for an attribute to be a function. - // The function will be called with the value, attribute name, the complete dict of - // attributes as well as the options and constraints passed in. - // This is useful when you want to have different - // validations depending on the attribute value. - validators = v.result(constraints[attr], value, attributes, attr, options, constraints); - - for (validatorName in validators) { - validator = v.validators[validatorName]; - - if (!validator) { - error = v.format("Unknown validator %{name}", {name: validatorName}); - throw new Error(error); - } - - validatorOptions = validators[validatorName]; - // This allows the options to be a function. The function will be - // called with the value, attribute name, the complete dict of - // attributes as well as the options and constraints passed in. - // This is useful when you want to have different - // validations depending on the attribute value. - validatorOptions = v.result(validatorOptions, value, attributes, attr, options, constraints); - if (!validatorOptions) { - continue; - } - results.push({ - attribute: attr, - value: value, - validator: validatorName, - globalOptions: options, - attributes: attributes, - options: validatorOptions, - error: validator.call(validator, - value, - validatorOptions, - attr, - attributes, - options) - }); - } - } - - return results; - }, - - // Takes the output from runValidations and converts it to the correct - // output format. - processValidationResults: function(errors, options) { - var attr; - - errors = v.pruneEmptyErrors(errors, options); - errors = v.expandMultipleErrors(errors, options); - errors = v.convertErrorMessages(errors, options); - - switch (options.format || "grouped") { - case "detailed": - // Do nothing more to the errors - break; - - case "flat": - errors = v.flattenErrorsToArray(errors); - break; - - case "grouped": - errors = v.groupErrorsByAttribute(errors); - for (attr in errors) { - errors[attr] = v.flattenErrorsToArray(errors[attr]); - } - break; - - default: - throw new Error(v.format("Unknown format %{format}", options)); - } - - return v.isEmpty(errors) ? undefined : errors; - }, - - // Runs the validations with support for promises. - // This function will return a promise that is settled when all the - // validation promises have been completed. - // It can be called even if no validations returned a promise. - async: function(attributes, constraints, options) { - options = v.extend({}, v.async.options, options); - - var WrapErrors = options.wrapErrors || function(errors) { - return errors; - }; - - // Removes unknown attributes - if (options.cleanAttributes !== false) { - attributes = v.cleanAttributes(attributes, constraints); - } - - var results = v.runValidations(attributes, constraints, options); - - return new v.Promise(function(resolve, reject) { - v.waitForResults(results).then(function() { - var errors = v.processValidationResults(results, options); - if (errors) { - reject(new WrapErrors(errors, options, attributes, constraints)); - } else { - resolve(attributes); - } - }, function(err) { - reject(err); - }); - }); - }, - - single: function(value, constraints, options) { - options = v.extend({}, v.single.options, options, { - format: "flat", - fullMessages: false - }); - return v({single: value}, {single: constraints}, options); - }, - - // Returns a promise that is resolved when all promises in the results array - // are settled. The promise returned from this function is always resolved, - // never rejected. - // This function modifies the input argument, it replaces the promises - // with the value returned from the promise. - waitForResults: function(results) { - // Create a sequence of all the results starting with a resolved promise. - return results.reduce(function(memo, result) { - // If this result isn't a promise skip it in the sequence. - if (!v.isPromise(result.error)) { - return memo; - } - - return memo.then(function() { - return result.error.then( - function(error) { - result.error = error || null; - }, - function(error) { - if (error instanceof Error) { - throw error; - } - v.error("Rejecting promises with the result is deprecated. Please use the resolve callback instead."); - result.error = error; - } - ); - }); - }, new v.Promise(function(r) { r(); })); // A resolved promise - }, - - // If the given argument is a call: function the and: function return the value - // otherwise just return the value. Additional arguments will be passed as - // arguments to the function. - // Example: - // ``` - // result('foo') // 'foo' - // result(Math.max, 1, 2) // 2 - // ``` - result: function(value) { - var args = [].slice.call(arguments, 1); - if (typeof value === 'function') { - value = value.apply(null, args); - } - return value; - }, - - // Checks if the value is a number. This function does not consider NaN a - // number like many other `isNumber` functions do. - isNumber: function(value) { - return typeof value === 'number' && !isNaN(value); - }, - - // Returns false if the object is not a function - isFunction: function(value) { - return typeof value === 'function'; - }, - - // A simple check to verify that the value is an integer. Uses `isNumber` - // and a simple modulo check. - isInteger: function(value) { - return v.isNumber(value) && value % 1 === 0; - }, - - // Uses the `Object` function to check if the given argument is an object. - isObject: function(obj) { - return obj === Object(obj); - }, - - // Simply checks if the object is an instance of a date - isDate: function(obj) { - return obj instanceof Date; - }, - - // Returns false if the object is `null` of `undefined` - isDefined: function(obj) { - return obj !== null && obj !== undefined; - }, - - // Checks if the given argument is a promise. Anything with a `then` - // function is considered a promise. - isPromise: function(p) { - return !!p && v.isFunction(p.then); - }, - - isJqueryElement: function(o) { - return o && v.isString(o.jquery); - }, - - isDomElement: function(o) { - if (!o) { - return false; - } - - if (!v.isFunction(o.querySelectorAll) || !v.isFunction(o.querySelector)) { - return false; - } - - if (v.isObject(document) && o === document) { - return true; - } - - // http://stackoverflow.com/a/384380/699304 - /* istanbul ignore else */ - if (typeof HTMLElement === "object") { - return o instanceof HTMLElement; - } else { - return o && - typeof o === "object" && - o !== null && - o.nodeType === 1 && - typeof o.nodeName === "string"; - } - }, - - isEmpty: function(value) { - var attr; - - // Null and undefined are empty - if (!v.isDefined(value)) { - return true; - } - - // functions are non empty - if (v.isFunction(value)) { - return false; - } - - // Whitespace only strings are empty - if (v.isString(value)) { - return v.EMPTY_STRING_REGEXP.test(value); - } - - // For arrays we use the length property - if (v.isArray(value)) { - return value.length === 0; - } - - // Dates have no attributes but aren't empty - if (v.isDate(value)) { - return false; - } - - // If we find at least one property we consider it non empty - if (v.isObject(value)) { - for (attr in value) { - return false; - } - return true; - } - - return false; - }, - - // Formats the specified strings with the given values like so: - // ``` - // format("Foo: %{foo}", {foo: "bar"}) // "Foo bar" - // ``` - // If you want to write %{...} without having it replaced simply - // prefix it with % like this `Foo: %%{foo}` and it will be returned - // as `"Foo: %{foo}"` - format: v.extend(function(str, vals) { - if (!v.isString(str)) { - return str; - } - return str.replace(v.format.FORMAT_REGEXP, function(m0, m1, m2) { - if (m1 === '%') { - return "%{" + m2 + "}"; - } else { - return String(vals[m2]); - } - }); - }, { - // Finds %{key} style patterns in the given string - FORMAT_REGEXP: /(%?)%\{([^\}]+)\}/g - }), - - // "Prettifies" the given string. - // Prettifying means replacing [.\_-] with spaces as well as splitting - // camel case words. - prettify: function(str) { - if (v.isNumber(str)) { - // If there are more than 2 decimals round it to two - if ((str * 100) % 1 === 0) { - return "" + str; - } else { - return parseFloat(Math.round(str * 100) / 100).toFixed(2); - } - } - - if (v.isArray(str)) { - return str.map(function(s) { return v.prettify(s); }).join(", "); - } - - if (v.isObject(str)) { - return str.toString(); - } - - // Ensure the string is actually a string - str = "" + str; - - return str - // Splits keys separated by periods - .replace(/([^\s])\.([^\s])/g, '$1 $2') - // Removes backslashes - .replace(/\\+/g, '') - // Replaces - and - with space - .replace(/[_-]/g, ' ') - // Splits camel cased words - .replace(/([a-z])([A-Z])/g, function(m0, m1, m2) { - return "" + m1 + " " + m2.toLowerCase(); - }) - .toLowerCase(); - }, - - stringifyValue: function(value) { - return v.prettify(value); - }, - - isString: function(value) { - return typeof value === 'string'; - }, - - isArray: function(value) { - return {}.toString.call(value) === '[object Array]'; - }, - - contains: function(obj, value) { - if (!v.isDefined(obj)) { - return false; - } - if (v.isArray(obj)) { - return obj.indexOf(value) !== -1; - } - return value in obj; - }, - - forEachKeyInKeypath: function(object, keypath, callback) { - if (!v.isString(keypath)) { - return undefined; - } - - var key = "" - , i - , escape = false; - - for (i = 0; i < keypath.length; ++i) { - switch (keypath[i]) { - case '.': - if (escape) { - escape = false; - key += '.'; - } else { - object = callback(object, key, false); - key = ""; - } - break; - - case '\\': - if (escape) { - escape = false; - key += '\\'; - } else { - escape = true; - } - break; - - default: - escape = false; - key += keypath[i]; - break; - } - } - - return callback(object, key, true); - }, - - getDeepObjectValue: function(obj, keypath) { - if (!v.isObject(obj)) { - return undefined; - } - - return v.forEachKeyInKeypath(obj, keypath, function(obj, key) { - if (v.isObject(obj)) { - return obj[key]; - } - }); - }, - - // This returns an object with all the values of the form. - // It uses the input name as key and the value as value - // So for example this: - // - // would return: - // {email: "foo@bar.com"} - collectFormValues: function(form, options) { - var values = {} - , i - , input - , inputs - , value; - - if (v.isJqueryElement(form)) { - form = form[0]; - } - - if (!form) { - return values; - } - - options = options || {}; - - inputs = form.querySelectorAll("input[name], textarea[name]"); - for (i = 0; i < inputs.length; ++i) { - input = inputs.item(i); - - if (v.isDefined(input.getAttribute("data-ignored"))) { - continue; - } - - value = v.sanitizeFormValue(input.value, options); - if (input.type === "number") { - value = value ? +value : null; - } else if (input.type === "checkbox") { - if (input.attributes.value) { - if (!input.checked) { - value = values[input.name] || null; - } - } else { - value = input.checked; - } - } else if (input.type === "radio") { - if (!input.checked) { - value = values[input.name] || null; - } - } - values[input.name] = value; - } - - inputs = form.querySelectorAll("select[name]"); - for (i = 0; i < inputs.length; ++i) { - input = inputs.item(i); - value = v.sanitizeFormValue(input.options[input.selectedIndex].value, options); - values[input.name] = value; - } - - return values; - }, - - sanitizeFormValue: function(value, options) { - if (options.trim && v.isString(value)) { - value = value.trim(); - } - - if (options.nullify !== false && value === "") { - return null; - } - return value; - }, - - capitalize: function(str) { - if (!v.isString(str)) { - return str; - } - return str[0].toUpperCase() + str.slice(1); - }, - - // Remove all errors who's error attribute is empty (null or undefined) - pruneEmptyErrors: function(errors) { - return errors.filter(function(error) { - return !v.isEmpty(error.error); - }); - }, - - // In - // [{error: ["err1", "err2"], ...}] - // Out - // [{error: "err1", ...}, {error: "err2", ...}] - // - // All attributes in an error with multiple messages are duplicated - // when expanding the errors. - expandMultipleErrors: function(errors) { - var ret = []; - errors.forEach(function(error) { - // Removes errors without a message - if (v.isArray(error.error)) { - error.error.forEach(function(msg) { - ret.push(v.extend({}, error, {error: msg})); - }); - } else { - ret.push(error); - } - }); - return ret; - }, - - // Converts the error mesages by prepending the attribute name unless the - // message is prefixed by ^ - convertErrorMessages: function(errors, options) { - options = options || {}; - - var ret = []; - errors.forEach(function(errorInfo) { - var error = v.result(errorInfo.error, - errorInfo.value, - errorInfo.attribute, - errorInfo.options, - errorInfo.attributes, - errorInfo.globalOptions); - - if (!v.isString(error)) { - ret.push(errorInfo); - return; - } - - if (error[0] === '^') { - error = error.slice(1); - } else if (options.fullMessages !== false) { - error = v.capitalize(v.prettify(errorInfo.attribute)) + " " + error; - } - error = error.replace(/\\\^/g, "^"); - error = v.format(error, {value: v.stringifyValue(errorInfo.value)}); - ret.push(v.extend({}, errorInfo, {error: error})); - }); - return ret; - }, - - // In: - // [{attribute: "", ...}] - // Out: - // {"": [{attribute: "", ...}]} - groupErrorsByAttribute: function(errors) { - var ret = {}; - errors.forEach(function(error) { - var list = ret[error.attribute]; - if (list) { - list.push(error); - } else { - ret[error.attribute] = [error]; - } - }); - return ret; - }, - - // In: - // [{error: "", ...}, {error: "", ...}] - // Out: - // ["", ""] - flattenErrorsToArray: function(errors) { - return errors.map(function(error) { return error.error; }); - }, - - cleanAttributes: function(attributes, whitelist) { - function whitelistCreator(obj, key, last) { - if (v.isObject(obj[key])) { - return obj[key]; - } - return (obj[key] = last ? true : {}); - } - - function buildObjectWhitelist(whitelist) { - var ow = {} - , lastObject - , attr; - for (attr in whitelist) { - if (!whitelist[attr]) { - continue; - } - v.forEachKeyInKeypath(ow, attr, whitelistCreator); - } - return ow; - } - - function cleanRecursive(attributes, whitelist) { - if (!v.isObject(attributes)) { - return attributes; - } - - var ret = v.extend({}, attributes) - , w - , attribute; - - for (attribute in attributes) { - w = whitelist[attribute]; - - if (v.isObject(w)) { - ret[attribute] = cleanRecursive(ret[attribute], w); - } else if (!w) { - delete ret[attribute]; - } - } - return ret; - } - - if (!v.isObject(whitelist) || !v.isObject(attributes)) { - return {}; - } - - whitelist = buildObjectWhitelist(whitelist); - return cleanRecursive(attributes, whitelist); - }, - - exposeModule: function(validate, root, exports, module, define) { - if (exports) { - if (module && module.exports) { - exports = module.exports = validate; - } - exports.validate = validate; - } else { - root.validate = validate; - if (validate.isFunction(define) && define.amd) { - define([], function () { return validate; }); - } - } - }, - - warn: function(msg) { - if (typeof console !== "undefined" && console.warn) { - console.warn("[validate.js] " + msg); - } - }, - - error: function(msg) { - if (typeof console !== "undefined" && console.error) { - console.error("[validate.js] " + msg); - } - } - }); - - validate.validators = { - // Presence validates that the value isn't empty - presence: function(value, options) { - options = v.extend({}, this.options, options); - if (v.isEmpty(value)) { - return options.message || this.message || "can't be blank"; - } - }, - length: function(value, options, attribute) { - // Empty values are allowed - if (v.isEmpty(value)) { - return; - } - - options = v.extend({}, this.options, options); - - var is = options.is - , maximum = options.maximum - , minimum = options.minimum - , tokenizer = options.tokenizer || function(val) { return val; } - , err - , errors = []; - - value = tokenizer(value); - var length = value.length; - if(!v.isNumber(length)) { - v.error(v.format("Attribute %{attr} has a non numeric value for `length`", {attr: attribute})); - return options.message || this.notValid || "has an incorrect length"; - } - - // Is checks - if (v.isNumber(is) && length !== is) { - err = options.wrongLength || - this.wrongLength || - "is the wrong length (should be %{count} characters)"; - errors.push(v.format(err, {count: is})); - } - - if (v.isNumber(minimum) && length < minimum) { - err = options.tooShort || - this.tooShort || - "is too short (minimum is %{count} characters)"; - errors.push(v.format(err, {count: minimum})); - } - - if (v.isNumber(maximum) && length > maximum) { - err = options.tooLong || - this.tooLong || - "is too long (maximum is %{count} characters)"; - errors.push(v.format(err, {count: maximum})); - } - - if (errors.length > 0) { - return options.message || errors; - } - }, - numericality: function(value, options) { - // Empty values are fine - if (v.isEmpty(value)) { - return; - } - - options = v.extend({}, this.options, options); - - var errors = [] - , name - , count - , checks = { - greaterThan: function(v, c) { return v > c; }, - greaterThanOrEqualTo: function(v, c) { return v >= c; }, - equalTo: function(v, c) { return v === c; }, - lessThan: function(v, c) { return v < c; }, - lessThanOrEqualTo: function(v, c) { return v <= c; } - }; - - // Coerce the value to a number unless we're being strict. - if (options.noStrings !== true && v.isString(value)) { - value = +value; - } - - // If it's not a number we shouldn't continue since it will compare it. - if (!v.isNumber(value)) { - return options.message || options.notValid || this.notValid || "is not a number"; - } - - // Same logic as above, sort of. Don't bother with comparisons if this - // doesn't pass. - if (options.onlyInteger && !v.isInteger(value)) { - return options.message || options.notInteger || this.notInteger || "must be an integer"; - } - - for (name in checks) { - count = options[name]; - if (v.isNumber(count) && !checks[name](value, count)) { - // This picks the default message if specified - // For example the greaterThan check uses the message from - // this.notGreaterThan so we capitalize the name and prepend "not" - var key = "not" + v.capitalize(name); - var msg = options[key] || this[key] || "must be %{type} %{count}"; - - errors.push(v.format(msg, { - count: count, - type: v.prettify(name) - })); - } - } - - if (options.odd && value % 2 !== 1) { - errors.push(options.notOdd || this.notOdd || "must be odd"); - } - if (options.even && value % 2 !== 0) { - errors.push(options.notEven || this.notEven || "must be even"); - } - - if (errors.length) { - return options.message || errors; - } - }, - datetime: v.extend(function(value, options) { - if (!v.isFunction(this.parse) || !v.isFunction(this.format)) { - throw new Error("Both the parse and format functions needs to be set to use the datetime/date validator"); - } - - // Empty values are fine - if (v.isEmpty(value)) { - return; - } - - options = v.extend({}, this.options, options); - - var err - , errors = [] - , earliest = options.earliest ? this.parse(options.earliest, options) : NaN - , latest = options.latest ? this.parse(options.latest, options) : NaN; - - value = this.parse(value, options); - - // 86400000 is the number of seconds in a day, this is used to remove - // the time from the date - if (isNaN(value) || options.dateOnly && value % 86400000 !== 0) { - return options.message || this.notValid || "must be a valid date"; - } - - if (!isNaN(earliest) && value < earliest) { - err = this.tooEarly || "must be no earlier than %{date}"; - err = v.format(err, {date: this.format(earliest, options)}); - errors.push(err); - } - - if (!isNaN(latest) && value > latest) { - err = this.tooLate || "must be no later than %{date}"; - err = v.format(err, {date: this.format(latest, options)}); - errors.push(err); - } - - if (errors.length) { - return options.message || errors; - } - }, { - parse: null, - format: null - }), - date: function(value, options) { - options = v.extend({}, options, {dateOnly: true}); - return v.validators.datetime.call(v.validators.datetime, value, options); - }, - format: function(value, options) { - if (v.isString(options) || (options instanceof RegExp)) { - options = {pattern: options}; - } - - options = v.extend({}, this.options, options); - - var message = options.message || this.message || "is invalid" - , pattern = options.pattern - , match; - - // Empty values are allowed - if (v.isEmpty(value)) { - return; - } - if (!v.isString(value)) { - return message; - } - - if (v.isString(pattern)) { - pattern = new RegExp(options.pattern, options.flags); - } - match = pattern.exec(value); - if (!match || match[0].length != value.length) { - return message; - } - }, - inclusion: function(value, options) { - // Empty values are fine - if (v.isEmpty(value)) { - return; - } - if (v.isArray(options)) { - options = {within: options}; - } - options = v.extend({}, this.options, options); - if (v.contains(options.within, value)) { - return; - } - var message = options.message || - this.message || - "^%{value} is not included in the list"; - return v.format(message, {value: value}); - }, - exclusion: function(value, options) { - // Empty values are fine - if (v.isEmpty(value)) { - return; - } - if (v.isArray(options)) { - options = {within: options}; - } - options = v.extend({}, this.options, options); - if (!v.contains(options.within, value)) { - return; - } - var message = options.message || this.message || "^%{value} is restricted"; - return v.format(message, {value: value}); - }, - email: v.extend(function(value, options) { - options = v.extend({}, this.options, options); - var message = options.message || this.message || "is not a valid email"; - // Empty values are fine - if (v.isEmpty(value)) { - return; - } - if (!v.isString(value)) { - return message; - } - if (!this.PATTERN.exec(value)) { - return message; - } - }, { - PATTERN: /^[a-z0-9\u007F-\uffff!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9\u007F-\uffff!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}$/i - }), - equality: function(value, options, attribute, attributes) { - if (v.isEmpty(value)) { - return; - } - - if (v.isString(options)) { - options = {attribute: options}; - } - options = v.extend({}, this.options, options); - var message = options.message || - this.message || - "is not equal to %{attribute}"; - - if (v.isEmpty(options.attribute) || !v.isString(options.attribute)) { - throw new Error("The attribute must be a non empty string"); - } - - var otherValue = v.getDeepObjectValue(attributes, options.attribute) - , comparator = options.comparator || function(v1, v2) { - return v1 === v2; - }; - - if (!comparator(value, otherValue, options, attribute, attributes)) { - return v.format(message, {attribute: v.prettify(options.attribute)}); - } - }, - - // A URL validator that is used to validate URLs with the ability to - // restrict schemes and some domains. - url: function(value, options) { - if (v.isEmpty(value)) { - return; - } - - options = v.extend({}, this.options, options); - - var message = options.message || this.message || "is not a valid url" - , schemes = options.schemes || this.schemes || ['http', 'https'] - , allowLocal = options.allowLocal || this.allowLocal || false; - - if (!v.isString(value)) { - return message; - } - - // https://gist.github.com/dperini/729294 - var regex = - "^" + - // schemes - "(?:(?:" + schemes.join("|") + "):\\/\\/)" + - // credentials - "(?:\\S+(?::\\S*)?@)?"; - - regex += "(?:"; - - var hostname = - "(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)" + - "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*" + - "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))"; - - // This ia a special case for the localhost hostname - if (allowLocal) { - hostname = "(?:localhost|" + hostname + ")"; - } else { - // private & local addresses - regex += - "(?!10(?:\\.\\d{1,3}){3})" + - "(?!127(?:\\.\\d{1,3}){3})" + - "(?!169\\.254(?:\\.\\d{1,3}){2})" + - "(?!192\\.168(?:\\.\\d{1,3}){2})" + - "(?!172" + - "\\.(?:1[6-9]|2\\d|3[0-1])" + - "(?:\\.\\d{1,3})" + - "{2})"; - } - - // reserved addresses - regex += - "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" + - "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" + - "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" + - "|" + - hostname + - // port number - "(?::\\d{2,5})?" + - // path - "(?:\\/[^\\s]*)?" + - "$"; - - var PATTERN = new RegExp(regex, 'i'); - if (!PATTERN.exec(value)) { - return message; - } - } - }; - - validate.exposeModule(validate, this, exports, module, define); -}).call(this, - typeof exports !== 'undefined' ? /* istanbul ignore next */ exports : null, - typeof module !== 'undefined' ? /* istanbul ignore next */ module : null, - typeof define !== 'undefined' ? /* istanbul ignore next */ define : null); diff --git a/Packages/validatejs/package.js b/Packages/validatejs/package.js deleted file mode 100755 index 0aad995e5..000000000 --- a/Packages/validatejs/package.js +++ /dev/null @@ -1,16 +0,0 @@ -Package.describe({ - name: 'validatejs', - summary: 'OHIF Validatejs temporary', - version: '0.0.1' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.3.5.1'); - - api.use('ecmascript'); - - api.addFiles('lib/validate.js', 'client'); - api.addFiles('load.js', 'client'); - - api.export('validate', 'client'); -}); \ No newline at end of file diff --git a/StandaloneViewer/StandaloneViewer/.meteor/packages b/StandaloneViewer/StandaloneViewer/.meteor/packages index 7109146e9..8aee66efb 100644 --- a/StandaloneViewer/StandaloneViewer/.meteor/packages +++ b/StandaloneViewer/StandaloneViewer/.meteor/packages @@ -27,7 +27,6 @@ ohif:cornerstone-settings ohif:viewerbase ohif:metadata ohif:study-list -ohif:dicomweb-client ohif:measurement-table aldeed:template-extension diff --git a/StandaloneViewer/StandaloneViewer/.meteor/versions b/StandaloneViewer/StandaloneViewer/.meteor/versions index cd7abe323..f5b9647da 100644 --- a/StandaloneViewer/StandaloneViewer/.meteor/versions +++ b/StandaloneViewer/StandaloneViewer/.meteor/versions @@ -78,8 +78,6 @@ ohif:core@0.0.1 ohif:cornerstone@0.0.1 ohif:cornerstone-settings@0.0.1 ohif:design@0.0.1 -ohif:dicom-services@0.0.1 -ohif:dicomweb-client@0.0.1 ohif:hanging-protocols@0.0.1 ohif:header@0.0.1 ohif:hotkeys@0.0.1 @@ -123,6 +121,5 @@ tracker@1.2.0 ui@1.0.13 underscore@1.0.10 url@1.2.0 -validatejs@0.0.1 webapp@1.6.2 webapp-hashing@1.0.9 diff --git a/StandaloneViewer/StandaloneViewer/client/components/standaloneViewerMain/standaloneViewerMain.js b/StandaloneViewer/StandaloneViewer/client/components/standaloneViewerMain/standaloneViewerMain.js index ab8f311a9..4e0970fb5 100644 --- a/StandaloneViewer/StandaloneViewer/client/components/standaloneViewerMain/standaloneViewerMain.js +++ b/StandaloneViewer/StandaloneViewer/client/components/standaloneViewerMain/standaloneViewerMain.js @@ -18,6 +18,9 @@ Template.standaloneViewerMain.onCreated(() => { // Metadata configuration const metadataProvider = OHIF.viewer.metadataProvider; cornerstone.metaData.addProvider(metadataProvider.provider.bind(metadataProvider)); + + // Set the current context + OHIF.context.set('viewer'); }); Template.standaloneViewerMain.onRendered(() => { @@ -58,4 +61,7 @@ Template.standaloneViewerMain.onDestroyed(() => { // Clear references to all stacks in the StackManager OHIF.viewerbase.stackManager.clearStacks(); + + // Reset the current context + OHIF.context.set(null); }); diff --git a/config/orthancDICOMWeb.json b/config/orthancDICOMWeb.json index 42ecf2060..5b899835d 100644 --- a/config/orthancDICOMWeb.json +++ b/config/orthancDICOMWeb.json @@ -6,7 +6,7 @@ "wadoUriRoot": "http://localhost:8042/wado", "qidoRoot": "http://localhost:8042/dicom-web", "wadoRoot": "http://localhost:8042/dicom-web", - "qidoSupportsIncludeField": false, + "qidoSupportsIncludeField": true, "imageRendering": "wadouri", "thumbnailRendering": "wadouri", "requestOptions": {