DICOM nach HL7-MDM

Mit Mirth Connect lassen sich aus DICOM-Daten mit eingebetteten Bilddateien HL7-MDM Nachrichten generieren, sofern die DICOM-Daten die Patientennummer und Fallnummer enthalten. Damit Mirth Connect von allen IP DICOM Daten entgegennehmen kann, muss hier anders als bei TCP/IP-Verbindungen 0.0.0.0 als Listener Adresse eingegeben werden, siehe MIRTH-2116.

dicom_listener_source_settings

Mit dem Toolkit DCMTK kann man dann den Aubau einer Verbindung testen:

$ echoscu -v -aec IMIRTHSCP 10.6.110.12 16999
I: Requesting Association
I: Association Accepted (Max Send PDV: 16372)
I: Sending Echo Request: MsgID 1
I: Received Echo Response (Status: Success)
I: Releasing Association

Sinnvollerweise prüft man dann zunächst bei den eingegangenen DICOM-Daten über einen Filter ab, dass diese eine Patienten- und Fallnummer enthalten:

// Prüft auf rein numerische PID und FallID in einer DICOM Nachricht
//
// $Id$

var invalid_id = new RegExp('[^0-9]');

if (
  invalid_id.test( msg['tag00080050'].toString() ) ||
  invalid_id.test( msg['tag00100020'].toString() )
) 
{
  return false;
} else if ( msg['tag00080050'].toString() == '' || msg['tag00100020'].toString() == '')
	return false;
else return true;

Hier wird die Fallnummer in dem Feld Accession-Number übermittelt.

Über zwei destinations wird dann die Verarbeitung durchgeführt. In der ersten destination werden die Bildddaten aus dem DICOM-attachment in einer Channelvariable abgespeichert und auf dem Fileserver des Zielsytems abgelegt. Hier kommt folgender Transformer zum Einsatz:

// Legt den Inhalt des DICOM-Attachments in einem JPEG-Byte Array ab
//
// $id$

FileContent = DICOMUtil.convertDICOM('JPEG', connectorMessage, 1);
channelMap.put('FileContent',FileContent);

Über eine 2. destination wird dann aus der DICOM-Datei die HL7-MDM Nachricht gebildet. Hier kommen auch wieder einige Hilfsfunktionen zum Einsatz.

// Wandelt eine DICOM-Datei in eine MDM-Datei um
//
// $id$

// Mapping AETitle -> Fachrichtung
var AEtitleOE = {
    "HNKAetitle":"HNO"
}

// Mapping AETitle -> Dokumenztenart
var AEtitleDocumenttype = {
	"HNKAetitle":"Ultraschall"
}

// Pfad für Dateibereitstellung auf dem Server
var prefix = '/opt/orbis/KHV/jaif/docs/';

// MSH
tmp['MSH']['MSH.3']['MSH.3.1'] 
 = msg['tag00081010'].toString().listlookup(AEtitleOE);
tmp['MSH']['MSH.4']['MSH.4.1'] 
 = msg['tag00081010'].toString().listlookup(AEtitleOE);
tmp['MSH']['MSH.7']['MSH.7.1'] 
 = msg['tag0008002A'].toString().substring(0,14);
tmp['MSH']['MSH.10']['MSH.10.1'] = $('UID');

// EVN
tmp['EVN']['EVN.2']['EVN.2.1'] 
 = msg['tag0008002A'].toString().substring(0,14);

// PID
tmp['PID']['PID.3']['PID.3.1'] 
 = msg['tag00100020'].toString();
tmp['PID']['PID.5'] 
 = msg['tag00100010'].toString();
tmp['PID']['PID.7']['PID.7.1'] 
 = msg['tag00100030'].toString();
tmp['PID']['PID.8']['PID.8.1'] 
 = msg['tag00100040'].toString();

// PV1
tmp['PV1']['PV1.19']['PV1.19.1'] 
 = msg['tag00080050'].toString();

// TXA
tmp['TXA']['TXA.2']['TXA.2.1'] 
 = msg['tag00081010'].toString().listlookup(AEtitleDocumenttype);
tmp['TXA']['TXA.3']['TXA.3.1'] 
 = 'JPG';
tmp['TXA']['TXA.8']['TXA.8.1'] 
 = msg['tag0008002A'].toString().substring(0,14);
tmp['TXA']['TXA.12']['TXA.12.1'] 
 = $('UID');
tmp['TXA']['TXA.12']['TXA.12.2'] 
 = msg['tag00081010'].toString();
tmp['TXA']['TXA.16']['TXA.16.1'] 
 = prefix + $('UID') + '.jpg';
tmp['TXA']['TXA.17']['TXA.17.1'] = 'F';

Im Transformer des Eingangs-channels wurden zuvor noch folgende Channel-Variablen belegt:

SUID = msg['tag0020000D'].toString()
SeriesID = msg['tag00200011'].toString()
InstanceNumber = msg['tag00200013'].toString()
UID = $('SUID') + '.' + $('InstanceNumber')
Advertisements