Retrieve FrameIncrementPointer as an attribute and FrameTimeVector as a float array via DICOMWeb and DIMSE
This commit is contained in:
parent
255b60e2fc
commit
8e9265ab23
@ -9,6 +9,7 @@ Package.onUse(function(api) {
|
|||||||
|
|
||||||
// DICOMWeb API functions
|
// DICOMWeb API functions
|
||||||
api.addFiles('server/namespace.js', 'server');
|
api.addFiles('server/namespace.js', 'server');
|
||||||
|
api.addFiles('server/getAttribute.js', 'server');
|
||||||
api.addFiles('server/getJSON.js', 'server');
|
api.addFiles('server/getJSON.js', 'server');
|
||||||
api.addFiles('server/getName.js', 'server');
|
api.addFiles('server/getName.js', 'server');
|
||||||
api.addFiles('server/getNumber.js', 'server');
|
api.addFiles('server/getNumber.js', 'server');
|
||||||
|
|||||||
44
Packages/dicomweb/server/getAttribute.js
Normal file
44
Packages/dicomweb/server/getAttribute.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* Returns the specified element as a dicom attribute group/element.
|
||||||
|
*
|
||||||
|
* @param element - The group/element of the element (e.g. '00280009')
|
||||||
|
* @param [defaultValue] - The value to return if the element is not present
|
||||||
|
* @returns {*}
|
||||||
|
*/
|
||||||
|
DICOMWeb.getAttribute = function(element, defaultValue) {
|
||||||
|
if (!element) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
// Value is not present if the attribute has a zero length value
|
||||||
|
if (!element.Value) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
// Sanity check to make sure we have at least one entry in the array.
|
||||||
|
if (!element.Value.length) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return convertToInt(element.Value);
|
||||||
|
};
|
||||||
|
|
||||||
|
function convertToInt(input) {
|
||||||
|
function padFour(input) {
|
||||||
|
var l = input.length;
|
||||||
|
|
||||||
|
if (l == 0) return '0000';
|
||||||
|
if (l == 1) return '000' + input;
|
||||||
|
if (l == 2) return '00' + input;
|
||||||
|
if (l == 3) return '0' + input;
|
||||||
|
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
var output = '';
|
||||||
|
for (var i = 0; i < input.length; i++) {
|
||||||
|
for (var j = 0; j < input[i].length; j++) {
|
||||||
|
output += padFour(input[i].charCodeAt(j).toString(16));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return parseInt(output, 16);
|
||||||
|
}
|
||||||
@ -39,7 +39,9 @@ var getInstanceRetrievalParams = function(studyInstanceUID, seriesInstanceUID) {
|
|||||||
0x00280004: '', // photometricInterpretation
|
0x00280004: '', // photometricInterpretation
|
||||||
0x0008002A: '', // acquisitionDatetime
|
0x0008002A: '', // acquisitionDatetime
|
||||||
0x00280008: '', // numFrames
|
0x00280008: '', // numFrames
|
||||||
|
0x00280009: '', // frameIncrementPointer
|
||||||
0x00181063: '', // frameTime
|
0x00181063: '', // frameTime
|
||||||
|
0x00181065: '', // frameTimeVector
|
||||||
0x00281052: '', // rescaleIntercept
|
0x00281052: '', // rescaleIntercept
|
||||||
0x00281053: '', // rescaleSlope
|
0x00281053: '', // rescaleSlope
|
||||||
0x00280002: '', // samplesPerPixel
|
0x00280002: '', // samplesPerPixel
|
||||||
|
|||||||
@ -210,11 +210,14 @@ util.inherits(AttributeTag, ValueRepresentation);
|
|||||||
|
|
||||||
AttributeTag.prototype.readBytes = function(stream, length) {
|
AttributeTag.prototype.readBytes = function(stream, length) {
|
||||||
var group = stream.read(C.TYPE_UINT16),
|
var group = stream.read(C.TYPE_UINT16),
|
||||||
element = stream.read(C.TYPE_UINT16);
|
element = stream.read(C.TYPE_UINT16);
|
||||||
return tagFromNumbers(group, element);
|
return tagFromNumbers(group, element);
|
||||||
};
|
};
|
||||||
|
|
||||||
AttributeTag.prototype.getFields = function(value) {
|
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())]);
|
return AttributeTag.super_.prototype.getFields.call(this, [new UInt16Field(value.group()), new UInt16Field(value.element())]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -121,6 +121,7 @@ Package.onUse(function (api) {
|
|||||||
api.addFiles('server/servers.js', 'server');
|
api.addFiles('server/servers.js', 'server');
|
||||||
api.addFiles('server/lib/remoteGetValue.js', 'server');
|
api.addFiles('server/lib/remoteGetValue.js', 'server');
|
||||||
api.addFiles('server/lib/encodeQueryData.js', 'server');
|
api.addFiles('server/lib/encodeQueryData.js', 'server');
|
||||||
|
api.addFiles('server/lib/parseFloatArray.js', 'server');
|
||||||
|
|
||||||
api.addFiles('server/methods/getStudyMetadata.js', 'server');
|
api.addFiles('server/methods/getStudyMetadata.js', 'server');
|
||||||
api.addFiles('server/methods/importStudies.js', 'server');
|
api.addFiles('server/methods/importStudies.js', 'server');
|
||||||
|
|||||||
14
Packages/worklist/server/lib/parseFloatArray.js
Normal file
14
Packages/worklist/server/lib/parseFloatArray.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
export const parseFloatArray = function(obj) {
|
||||||
|
var result = [];
|
||||||
|
|
||||||
|
if (!obj) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
var objs = obj.split("\\");
|
||||||
|
for (var i = 0; i < objs.length; i++) {
|
||||||
|
result.push(parseFloat(objs[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
@ -1,3 +1,5 @@
|
|||||||
|
import { parseFloatArray } from '../../lib/parseFloatArray';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the SourceImageSequence, if it exists, in order
|
* Parses the SourceImageSequence, if it exists, in order
|
||||||
* to return a ReferenceSOPInstanceUID. The ReferenceSOPInstanceUID
|
* to return a ReferenceSOPInstanceUID. The ReferenceSOPInstanceUID
|
||||||
@ -16,6 +18,21 @@ function getSourceImageInstanceUid(instance) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value of the element (e.g. '00280009')
|
||||||
|
*
|
||||||
|
* @param element - The group/element of the element (e.g. '00280009')
|
||||||
|
* @param defaultValue - The default value to return if the element does not exist
|
||||||
|
* @returns {*}
|
||||||
|
*/
|
||||||
|
function getValue(element, defaultValue) {
|
||||||
|
if (!element || !element.value) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return element.value;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses result data from a DIMSE search into Study MetaData
|
* Parses result data from a DIMSE search into Study MetaData
|
||||||
* Returns an object populated with study metadata, including the
|
* Returns an object populated with study metadata, including the
|
||||||
@ -102,7 +119,9 @@ function resultDataToStudyMetadata(studyInstanceUid, resultData) {
|
|||||||
viewPosition: instance[0x00185101],
|
viewPosition: instance[0x00185101],
|
||||||
acquisitionDatetime: instance[0x0008002A],
|
acquisitionDatetime: instance[0x0008002A],
|
||||||
numFrames: parseFloat(instance[0x00280008]),
|
numFrames: parseFloat(instance[0x00280008]),
|
||||||
|
frameIncrementPointer: getValue(instance[0x00280009]),
|
||||||
frameTime: parseFloat(instance[0x00181063]),
|
frameTime: parseFloat(instance[0x00181063]),
|
||||||
|
frameTimeVector: parseFloatArray(instance[0x00181065]),
|
||||||
lossyImageCompression: instance[0x00282110],
|
lossyImageCompression: instance[0x00282110],
|
||||||
derivationDescription: instance[0x00282111],
|
derivationDescription: instance[0x00282111],
|
||||||
lossyImageCompressionRatio: instance[0x00282112],
|
lossyImageCompressionRatio: instance[0x00282112],
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { remoteGetValue } from '../../lib/remoteGetValue';
|
import { remoteGetValue } from '../../lib/remoteGetValue';
|
||||||
|
import { parseFloatArray } from '../../lib/parseFloatArray';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the SourceImageSequence, if it exists, in order
|
* Parses the SourceImageSequence, if it exists, in order
|
||||||
@ -97,7 +98,9 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
|||||||
viewPosition: remoteGetValue(instance['0018,5101']),
|
viewPosition: remoteGetValue(instance['0018,5101']),
|
||||||
acquisitionDatetime: remoteGetValue(instance['0008,002A']),
|
acquisitionDatetime: remoteGetValue(instance['0008,002A']),
|
||||||
numFrames: parseFloat(remoteGetValue(instance['0028,0008'])),
|
numFrames: parseFloat(remoteGetValue(instance['0028,0008'])),
|
||||||
frameTime: parseFloat(remoteGetValue(instance['0018,1063']))
|
frameIncrementPointer: remoteGetValue(instance['0028,0009']),
|
||||||
|
frameTime: parseFloat(remoteGetValue(instance['0018,1063'])),
|
||||||
|
frameTimeVector: parseFloatArray(remoteGetValue(instance['0018,1065']))
|
||||||
};
|
};
|
||||||
|
|
||||||
var iid = instance['xxxx,0001'].Value;
|
var iid = instance['xxxx,0001'].Value;
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import { parseFloatArray } from '../../lib/parseFloatArray';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a URL for a WADO search
|
* Creates a URL for a WADO search
|
||||||
*
|
*
|
||||||
@ -108,7 +110,9 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
|||||||
viewPosition: DICOMWeb.getString(instance['00185101']),
|
viewPosition: DICOMWeb.getString(instance['00185101']),
|
||||||
acquisitionDatetime: DICOMWeb.getString(instance['0008002A']),
|
acquisitionDatetime: DICOMWeb.getString(instance['0008002A']),
|
||||||
numFrames: DICOMWeb.getNumber(instance['00280008']),
|
numFrames: DICOMWeb.getNumber(instance['00280008']),
|
||||||
|
frameIncrementPointer: DICOMWeb.getAttribute(instance['00280009']),
|
||||||
frameTime: DICOMWeb.getNumber(instance['00181063']),
|
frameTime: DICOMWeb.getNumber(instance['00181063']),
|
||||||
|
frameTimeVector: parseFloatArray(DICOMWeb.getString(instance['00181065'])),
|
||||||
sliceThickness: DICOMWeb.getNumber(instance['00180050']),
|
sliceThickness: DICOMWeb.getNumber(instance['00180050']),
|
||||||
lossyImageCompression: DICOMWeb.getString(instance['00282110']),
|
lossyImageCompression: DICOMWeb.getString(instance['00282110']),
|
||||||
derivationDescription: DICOMWeb.getString(instance['00282111']),
|
derivationDescription: DICOMWeb.getString(instance['00282111']),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user