Artículo
· 10 abr, 2023 Lectura de 5 min

Recepción de mensajes DICOM desde un PACS a IRIS for Health

En nuestro artículo anterior vimos como podíamos capturar ficheros de tipo DICOM ubicados en una carpeta de nuestro servidor y como los enviábamos a un PACS (en nuestro caso la solución open source ORTHANC) para su almacenamiento y consulta. Pues bien, en este artículo vamos a tratar el movimiento opuesto. 

En nuestro ejemplo lo que haremos será configurar nuestra producción de IRIS for Health para que reciba vía TCP/IP las imágenes que sean remitidad desde nuestro PACS. Para ello deberemos incluir un Business Service de la clase estándar EnsLib.DICOM.Service.TCP que nos permitirá configurar dichas recepciones. Echemos un vistazo a la configuración del mismo:

Como podéis observar hemos declarado el puerto que va a permanecer a la escucha y por el que se recibirán las imágenes remitidas por desde el PACS. Tenemos también configurados al AET tanto local (IRIS) como el del PACS que nos enviará el DICOM (ORTHANC), recordad que estos campos son obligatorios y son los que se van a usar para comprobar la validez del envío y la recepción de los mensajes DICOM, no olvidéis tampoco que ambos AET deben estar configurados y relacionados desde el menú de DICOM Settings:

Como véis tenemos configurado tanto el envío de mensajes de IRIS a ORTHANC (el caso del artículo anterior) como de ORTHANC a IRIS (el caso que nos ocupa). Confirmad de que tengáis configuradas para ambos contextos de asociación los contextos de presentación con los tipos de imágenes DICOM que enviéis y recibáis en ambos sistemas.

Finalmente indicar que hemos definido el parámetro con el componente de destino al que enviaremos la imagen DICOM remitida por el PACS, en este caso la hemos denominado con el mismo nombre de la clase a la que pertenece: Demo.DICOM.Process.StorageLocal

Veamos con más detalle el código del método principal de esta clase:

Method OnMessage(pSourceConfigName As %String, pInput As %Library.Persistent) As %Status
{
	#dim tSC As %Status = $$$OK
	#dim e As %Exception.AbstractException
	#dim tMsgType,tMsgId As %String
	#dim tOutput As EnsLib.DICOM.Document
	
	Try {
		
		#; We should only ever see DICOM Documents here
		$$$ASSERT(pInput.%Extends("EnsLib.DICOM.Document"))
		
		#; We only ever get DICOM Documents from the Service
		$$$ASSERT(pSourceConfigName=..ServiceDuplexName)
		 	
 		#; Get the CommandField, it contains the type of request, it should ALWAYS be present
		Set tMsgType=$$$MsgTyp2Str(pInput.GetValueAt("CommandSet.CommandField",,.tSC))
		If $$$ISERR(tSC) Quit
		#; We are only handling Storage Requests
		$$$ASSERT(tMsgType="C-STORE-RQ")

		#; Record the originating message id
		Set tMsgId=pInput.GetValueAt("CommandSet.MessageID",,.tSC)
		If $$$ISERR(tSC) $$$LOGSTATUS(tSC) Quit
		#; We can forward the document to the operation
		Set tSC=..SendRequestSync("Demo.DICOM.Operation.File",pInput)
		If $$$ISERR(tSC) Quit
		#; We need to send a reply to the service in all cases, so create an appropriate response
		Set tSC=..CreateStorageResponse(pInput,.tOutput)
		If $$$ISERR(tSC) Quit
		#; Send the reply back to the service ( don't want a response )
		Set tSC=..SendRequestAsync(..ServiceDuplexName,tOutput,0)
		If $$$ISERR(tSC) Quit
		#; Stop the private session to ensure each message gets its own session				
		Set tSC=..StopPrivateSession(..ServiceDuplexName)
		If $$$ISERR(tSC) Quit
	} catch (e) {
		Set tSC=e.AsStatus()
	}
	
	Quit tSC
}

Primeramente nos aseguramos de que el mensaje recibido sea de tipo DICOM, a continuación confirmamos que haya sido recibido desde el Business Service definido para ello y finalmente comprobamos que la operación solicitada corresponda con C-STORE-RQ.

A continuación nuestra clase creará el mensaje DICOM de respuesta que se remitirá al PACS con el identificador del mensaje recibido y finalmente se enviará al Business Operation encargado de almacenar el mensaje DICOM en un fichero. Vamos a ver también el código del método principal de ese Business Operation Demo.DICOM.Operation.File:

Method OnMessage(pRequest As %Library.Persistent, Output pResponse As %Library.Persistent) As %Status
{
	#dim tSC As %Status = $$$OK
	#dim e As %Exception.AbstractException
	#dim tFile As EnsLib.DICOM.File
	#dim tFileName As %String
	try {
		
		#; We should only ever see DICOM Documents here
		$$$ASSERT(pRequest.%Extends("EnsLib.DICOM.Document"))
		
		#; Create a DICOM File from the DICOM document
		Set tSC=##class(EnsLib.DICOM.File).CreateFromDocument(pRequest,.tFile)
		If $$$ISERR(tSC) Quit
		#; Create a unique filename
		Set tFileName=..NewFilename(..FileStorageDirectory)
		
		#; Create a new file with a unique name and the dcm extension in the target directory
		Set tSC=tFile.Save(tFileName)
		
	} catch(e) {
		Set tSC=e.AsStatus()
	}
	Quit tSC
}

Simple, ¿verdad?. Estamos recibiendo nuestro mensaje del tipo EnsLib.DICOM.Document y estamos generando un fichero con dicho mensaje.

Como véis no tiene mucha complejidad y nos quedaría una producción la mar de sencilla:

Perfecto, con nuestra producción configurada y arrancada podemos lanzar un ejemplo de prueba enviando una imagen desde la interfaz gráfica de nuestro PACS, en este caso ORTHANC.

Accedemos a uno de los estudios que previamente almacenamos en el artículo anterior y pulsaríamos sobre la opción de "Send to DICOM modality". En nuestro caso sólo tendríamos una modalidad DICOM configurada, la relativa a nuestro IRIS.

Haciendo click sobre nuestra modalidad estaremos enviando todo el estudio vía TCP/IP a nuestro IRIS for Health. ORTHANC nos proporcionará una pantalla con el estado del envío que se ha realizado. Podemos comprobar como el estado del mismo es "Success". Por lo tanto deberíamos ver la recepción del mensaje en nuestra producción.

Veamos los mensajes que han llegado a nuestro Business Service EnsLib.DICOM.Service.TCP:

Efectivamente, hemos recibido un mensaje, entremos en la traza completa del mensaje y confirmemos que ha pasado por todos los componentes con éxito:

¡Y aquí lo tenemos! Nuestro mensaje ha sido recibido, se ha generado un nuevo mensaje DICOM que se ha reenviado como respuesta a nuestro PACS y finalmente hemos generado nuestro fichero de tipo DICOM donde hemos guardado nuestra imagen.

Pues bien, ya tendríamos funcionando nuestra producción para la recepción de mensajes DICOM vía TCP/IP. En este caso lo hemos configurado para que finalmente se genere un archivo, pero se podría modificar para que este en su lugar se redirigiese a otra modalidad por TCP/IP e incluso para que se transformara en un base64 para adjuntarlo en un mensaje de HL7 (cosa que no recomiendo por el tamaño que pueden alcanzar este tipo de mensajes).

Si tenéis cualquier duda o sugerencia ya sabéis que podéis escribirlas en la sección de comentarios y estaremos encantados de contestarlas.

Comentarios (1)1
Inicie sesión o regístrese para continuar