Skip to content

Commit

Permalink
fix: incorrect way to convert 00080061 to FHIR
Browse files Browse the repository at this point in the history
- Refactor, functional `getModalitiesInStudy`
- Fix, set modalities in study when processing DICOM to FHIR
- Fix, missing set endpoint of FHIR ImagingStudy
- Remove read value of 00080061 and set `study.modality`
in `DICOM2FHIRImagingStudy.js` file
> The 00080061 may not present in DICOM instance,
> it is calculate from DB and use for querying
  • Loading branch information
Chinlinlee committed May 18, 2022
1 parent 88e75ca commit 6876174
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 30 deletions.
2 changes: 1 addition & 1 deletion api/dicom-web/controller/STOW-RS/storeInstance.js
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ async function dicomToFHIR(req, dicomJson, uidObj) {
let protocol = req.secure ? "https" : "http";
dicomFHIRConverter.dicomWeb.retrieveStudiesUrl = `${protocol}://${req.headers.host}/${process.env.DICOMWEB_API}/studies`;

dicomFHIRConverter.dicomJsonToFHIR(dicomJson);
await dicomFHIRConverter.dicomJsonToFHIR(dicomJson);

dicomFHIRConverter.fhir.baseUrl = process.env.FHIRSERVER_BASE_URL;
await dicomFHIRConverter.postDicomFhir();
Expand Down
28 changes: 27 additions & 1 deletion models/FHIR/DICOM/DICOMToFHIR.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const { fhirLogger } = require("../../../utils/log");
const { dicomJsonToFHIRImagingStudy } = require("./DICOMToFHIRImagingStudy");
const { dicomJsonToFHIRPatient } = require("./DICOMToFHIRPatient");
const { dicomJsonToFHIREndpoint } = require("./DICOMToFHIREndpoint");
const { getModalitiesInStudy } = require("../../../models/mongodb/models/dicom");

class DICOMFHIRConverter {
constructor() {
Expand All @@ -30,7 +31,7 @@ class DICOMFHIRConverter {
*
* @param {JSON} dicomJson The DICOM Json model
*/
dicomJsonToFHIR(dicomJson) {
async dicomJsonToFHIR(dicomJson) {
let patient = dicomJsonToFHIRPatient(dicomJson);
let imagingStudy = dicomJsonToFHIRImagingStudy(dicomJson);
if (!imagingStudy.subject.reference.includes(patient.id)) {
Expand All @@ -42,10 +43,35 @@ class DICOMFHIRConverter {
);
this.dicomFHIR.patient = patient;
this.dicomFHIR.imagingStudy = imagingStudy;
await this.setModalitiesInStudy(dicomJson);
this.dicomFHIR.endpoint = endpoint;
this.dicomFHIR.imagingStudy.endpoint = [
{
reference: `Endpoint/${this.dicomFHIR.endpoint.id}`,
type: "Endpoint"
}
];
return this.dicomFHIR;
}

async setModalitiesInStudy(dicomJson) {
let studyModalities = [];
let modalitiesInStudy = await getModalitiesInStudy({
studyUID: dicomJson["0020000D"].Value[0]
});
if (modalitiesInStudy.length > 0) {
let modalitiesInStudyValue = modalitiesInStudy[0]["00080061"].Value;
for(let i = 0 ; i < modalitiesInStudyValue.length; i++) {
let modality = {
system: "http://dicom.nema.org/resources/ontology/DCM",
code: modalitiesInStudyValue[i]
};
studyModalities.push(modality);
}
this.dicomFHIR.imagingStudy.modality = studyModalities;
}
}

//#region ImagingStudy

async getImagingStudyFromFHIRServer() {
Expand Down
1 change: 0 additions & 1 deletion models/FHIR/DICOM/DICOMToFHIRImagingStudy.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,6 @@ function dicomJsonToFHIRImagingStudy(dicomJson) {
dcm2jsonV8.dcmString(dicomJson, "00200010")
];
studyObj.identifier = getStudyIdentifiers(identifiers);
studyObj.modality = dcm2jsonV8.dcmString(dicomJson, "00080061");

let patientId = dcm2jsonV8.dcmString(dicomJson, "00100020");
studyObj.subject.identifier = new Identifier();
Expand Down
60 changes: 33 additions & 27 deletions models/mongodb/models/dicom.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,39 +127,44 @@ dicomModelSchema.post("findOneAndUpdate", async function (doc) {
});
});

async function updateStudyModalitiesInStudy(doc) {
try {
let modalitiesInStudy = await mongoose.model("dicom").aggregate([
{
$match: {
studyUID: doc.studyUID
}
},
{
$group: {
_id: "$studyUID",
modalitiesInStudy: {
$addToSet: "$00080060.Value"
}
async function getModalitiesInStudy(doc) {
let modalitiesInStudy = await mongoose.model("dicom").aggregate([
{
$match: {
studyUID: doc.studyUID
}
},
{
$group: {
_id: "$studyUID",
modalitiesInStudy: {
$addToSet: "$00080060.Value"
}
},
{
$project: {
"00080061": {
vr: "CS",
Value: {
$reduce: {
input: "$modalitiesInStudy",
initialValue: [],
in: {
$concatArrays: ["$$value", "$$this"]
}
}
},
{
$project: {
"00080061": {
vr: "CS",
Value: {
$reduce: {
input: "$modalitiesInStudy",
initialValue: [],
in: {
$concatArrays: ["$$value", "$$this"]
}
}
}
}
}
]);
}
]);
return modalitiesInStudy;
}

async function updateStudyModalitiesInStudy(doc) {
try {
let modalitiesInStudy = await getModalitiesInStudy(doc);
await mongoose.model("dicomStudy").findOneAndUpdate(
{
studyUID: doc.studyUID
Expand Down Expand Up @@ -301,3 +306,4 @@ async function updateStudyNumberOfStudyRelatedInstance(doc) {

let dicomModel = mongoose.model("dicom", dicomModelSchema, "dicom");
module.exports = dicomModel;
module.exports.getModalitiesInStudy = getModalitiesInStudy;

0 comments on commit 6876174

Please sign in to comment.