139 lines
6.4 KiB
JavaScript
Executable File
139 lines
6.4 KiB
JavaScript
Executable File
import { remoteGetValue } from '../../lib/remoteGetValue';
|
|
import { parseFloatArray } from '../../lib/parseFloatArray';
|
|
|
|
/**
|
|
* Parses the SourceImageSequence, if it exists, in order
|
|
* to return a ReferenceSOPInstanceUID. The ReferenceSOPInstanceUID
|
|
* is used to refer to this image in any accompanying DICOM-SR documents.
|
|
*
|
|
* @param instance
|
|
* @returns {String} The ReferenceSOPInstanceUID
|
|
*/
|
|
function getSourceImageInstanceUid(instance) {
|
|
// TODO= Parse the whole Source Image Sequence
|
|
// This is a really poor workaround for now.
|
|
// Later we should probably parse the whole sequence.
|
|
var SourceImageSequence = remoteGetValue(instance['0008,2112']);
|
|
if (SourceImageSequence && SourceImageSequence.Value && SourceImageSequence.Value.length) {
|
|
return SourceImageSequence.Value[0]['0008,1155'].Value[0];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Parses result data from a WADO search into Study MetaData
|
|
* Returns an object populated with study metadata, including the
|
|
* series list.
|
|
*
|
|
* @param server
|
|
* @param studyInstanceUid
|
|
* @param resultData
|
|
* @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}}
|
|
*/
|
|
function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
|
var seriesMap = {};
|
|
var seriesList = [];
|
|
|
|
if (!resultData.length) {
|
|
return;
|
|
}
|
|
|
|
var anInstance = resultData[0];
|
|
if (!anInstance) {
|
|
return;
|
|
}
|
|
|
|
var studyData = {
|
|
seriesList: seriesList,
|
|
patientName: remoteGetValue(anInstance['0010,0010']),
|
|
patientId: remoteGetValue(anInstance['0010,0020']),
|
|
accessionNumber: remoteGetValue(anInstance['0008,0050']),
|
|
studyDate: remoteGetValue(anInstance['0008,0020']),
|
|
modalities: remoteGetValue(anInstance['0008,0061']),
|
|
studyDescription: remoteGetValue(anInstance['0008,1030']),
|
|
imageCount: remoteGetValue(anInstance['0020,1208']),
|
|
studyInstanceUid: remoteGetValue(anInstance['0020,000d'])
|
|
};
|
|
|
|
resultData.forEach(function(instance) {
|
|
var seriesInstanceUid = remoteGetValue(instance['0020,000e']);
|
|
var series = seriesMap[seriesInstanceUid];
|
|
if (!series) {
|
|
series = {
|
|
seriesDescription: remoteGetValue(instance['0008,103e']),
|
|
modality: remoteGetValue(instance['0008,0060']),
|
|
seriesInstanceUid: seriesInstanceUid,
|
|
seriesNumber: parseFloat(remoteGetValue(instance['0020,0011'])),
|
|
instances: []
|
|
};
|
|
seriesMap[seriesInstanceUid] = series;
|
|
seriesList.push(series);
|
|
}
|
|
|
|
var sopInstanceUid = remoteGetValue(instance['0008,0018']);
|
|
|
|
var instanceSummary = {
|
|
imageType: remoteGetValue(instance['0008,0008']),
|
|
sopClassUid: remoteGetValue(instance['0008,0016']),
|
|
sopInstanceUid: sopInstanceUid,
|
|
instanceNumber: parseFloat(remoteGetValue(instance['0020,0013'])),
|
|
imagePositionPatient: remoteGetValue(instance['0020,0032']),
|
|
imageOrientationPatient: remoteGetValue(instance['0020,0037']),
|
|
frameOfReferenceUID: remoteGetValue(instance['0020,0052']),
|
|
sliceLocation: parseFloat(remoteGetValue(instance['0020,1041'])),
|
|
samplesPerPixel: parseFloat(remoteGetValue(instance['0028,0002'])),
|
|
photometricInterpretation: remoteGetValue(instance['0028,0004']),
|
|
rows: parseFloat(remoteGetValue(instance['0028,0010'])),
|
|
columns: parseFloat(remoteGetValue(instance['0028,0011'])),
|
|
pixelSpacing: remoteGetValue(instance['0028,0030']),
|
|
bitsAllocated: parseFloat(remoteGetValue(instance['0028,0100'])),
|
|
bitsStored: parseFloat(remoteGetValue(instance['0028,0101'])),
|
|
highBit: parseFloat(remoteGetValue(instance['0028,0102'])),
|
|
pixelRepresentation: parseFloat(remoteGetValue(instance['0028,0103'])),
|
|
windowCenter: remoteGetValue(instance['0028,1050']),
|
|
windowWidth: remoteGetValue(instance['0028,1051']),
|
|
rescaleIntercept: parseFloat(remoteGetValue(instance['0028,1052'])),
|
|
rescaleSlope: parseFloat(remoteGetValue(instance['0028,1053'])),
|
|
sourceImageInstanceUid: getSourceImageInstanceUid(instance),
|
|
laterality: remoteGetValue(instance['0020,0062']),
|
|
viewPosition: remoteGetValue(instance['0018,5101']),
|
|
acquisitionDatetime: remoteGetValue(instance['0008,002A']),
|
|
numFrames: parseFloat(remoteGetValue(instance['0028,0008'])),
|
|
frameIncrementPointer: remoteGetValue(instance['0028,0009']),
|
|
frameTime: parseFloat(remoteGetValue(instance['0018,1063'])),
|
|
frameTimeVector: parseFloatArray(remoteGetValue(instance['0018,1065']))
|
|
};
|
|
|
|
var iid = instance['xxxx,0001'].Value;
|
|
if (server.imageRendering === 'wadouri') {
|
|
instanceSummary.wadouri = server.wadoUriRoot + '?requestType=WADO&studyUID=' + studyInstanceUid + '&seriesUID=' + seriesInstanceUid + '&objectUID=' + sopInstanceUid + "&contentType=application%2Fdicom";
|
|
} else if (server.imageRendering == 'orthanc') {
|
|
instanceSummary.wadouri = server.root + '/instances/' + iid + '/file';
|
|
} else {
|
|
instanceSummary.wadorsuri = server.wadoRoot + '/studies/' + studyInstanceUid + '/series/' + seriesInstanceUid + '/instances/' + sopInstanceUid + '/frames/1';
|
|
}
|
|
|
|
series.instances.push(instanceSummary);
|
|
});
|
|
console.log(studyData.seriesList[0].instances);
|
|
return studyData;
|
|
}
|
|
|
|
/**
|
|
* Retrieved Study MetaData from a DICOM server using a WADO call
|
|
* @param server
|
|
* @param studyInstanceUid
|
|
* @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}}
|
|
*/
|
|
Services.REMOTE.RetrieveMetadata = function(server, studyInstanceUid) {
|
|
var remote = new OrthancRemote(server.root, server.sourceAE);
|
|
|
|
var study = resultDataToStudyMetadata(server, studyInstanceUid, remote.retrieveMetadata(server.modality, studyInstanceUid));
|
|
if (!study) {
|
|
study = {};
|
|
}
|
|
|
|
study.wadoUriRoot = server.wadoUriRoot;
|
|
study.studyInstanceUid = studyInstanceUid;
|
|
|
|
return study;
|
|
}; |