Pregunta
· 1 ago, 2022

Tranformar Fichero .dcm enviado a Servicio REST mediante STOW-RS a formato DICOM de Ensemble para emitirlo por TCP

Buenos días,

Nos gustaría compartir lo que estamos investigando y en lo que necesitamos su apoyo, para continuar con ello:

1) Hemos desarrollado un Circuito REST: Servicio REST + Proceso + Operacion REST.

Los cuales reciben un fichero de estudios de imágenes médicas .dcm y lo envían tal cual. Para ello enviamos mediante el simulador dcm4che y en concreto mediante la línea:

./stowrs --disableTM --allowAnyHost  --url https://[IP del ESB]:[Puerto del ESB]/aplicaciones/scs/cconcertadostest/almacenarImagen /opt/contenedor/PACS/dcm4che-5.27.0-bin/dcm4che-5.27.0/bin/shared/dicom/d1I00012.dcm  

 

Observamos la traza:

 

Enviamos el mismo fichero tal cual, recibiéndolo en el Servidor Destino que simulamos mediante dcm4che y comando:

./stowrsd -b 8080 --unpack

 

De manera que en el Servidor se genera el .dcm

 

De manera que se ve la imagen:

 

 

2) Hemos probado un proceso DICOM > Operacion TCP > Servidor Destino que recibe DICOM

Reenviando una traza:

El servidor el cual hemnos iniciado previamente mediante:

./storescp -b VNAPRE:11112 --filepath {00100020}/{0020000D}/{0020000E}/{00080018}.dcm

 

recibe el DICOM enviado mediante la Operacion TCP

 

Y se genera el .dcm

 

Viendose de manera igual:

 

 

3) El desafío, reto y necesidad que se nos genera es la siguiente:

El circuito real necesario es:

Servicio REST + Proceso + Operación TCP

 

Es decir, sistema origen es necesario que nos envíe sí o sí en REST, y sistema destino necesita sí o sí que enviemos mediante TCP

 

¿ qué documentación , ejemplos , medios , herramientas , vídeos , tutoriales , referencias , o lecturas nos pueden indicar, exponer, anotar; para nosotros indagar y buscar la forma de realizarlo ?
 

Hemos indagado por nuestra cuenta lo siguiente:

Hemos añadido en el Servicio REST las líneas que pensamos que parece que pudieran convertir un fichero .dcm REST en un DICOM de Ensemble a Enviar por TCP:

; 29/07/2022 Tratar de convertir Fichero .dcm en formato REST a formato DICOM de Ensemble
set dicom = ##class(EnsLib.DICOM.Document).%New()
do ##class(EnsLib.DICOM.Document).CreateFromDicomFileStream(pInput,dicom)
set objetoEntrada.dicom = dicom
$$$LOGINFO("objetoEntrada.dicom: "_objetoEntrada.dicom)
 

Además, a fines informativos, para visualizar en el Visor de Mensajes, el contenido de los EnsLib.DICOM.Document hemos escrito en la clase:

Class EnsLib.DICOM.Document Extends (%Persistent, Ens.Util.MessageBodyMethods, EnsLib.DICOM.Util.ULP, %XML.Adaptor) [ ClassType = persistent, Inheritance = right, System = 4 ]

 

Siendo el Mensaje Request:

Class Mensajes.Request.CConcertadostoPACS.AlmacenarImagenRequest Extends Ens.Request
{

Parameter RESPONSECLASSNAME = "Mensajes.Response.CConcertadostoPACS.AlmacenarImagenResponse";

Property mensaje As %String(MAXLEN = "");

Property dicom As EnsLib.DICOM.Document;

 

De esta manera vemos en la traza, una estructura que recuerda a DICOM de Ensemble , la pega, reto, desafío, o lo que nos queda por entender y que nos resulta extraño es ¿por qué el <FileStream> es vacío? :

 

 

Siendo una traza DICOM de Ensemble con Imagen una en la que sí se ve el <FileStream> relleno:

 

🤲 Muchas gracias de antemano, porque ustedes disponen de más conocimiento, entereza, práctica, saber hacer, templanza y sobre todo nos pueden auxiliar, aportar, apoyar; en esta aventura

 

¿ qué documentación , ejemplos , medios , herramientas , vídeos , tutoriales , referencias , o lecturas nos pueden indicar, exponer, anotar; para nosotros indagar y buscar la forma de realizarlo ?
 

Un saludo

$ZV: Cache for UNIX (Red Hat Enterprise Linux for x86-64) 2018.1.6 (Build 717U) Thu Feb 24 2022 13:27:54 EST
Comentarios (2)3
Inicie sesión o regístrese para continuar

Hola,
En este bloque de código:
set dicom = ##class(EnsLib.DICOM.Document).%New()
do ##class(EnsLib.DICOM.Document).CreateFromDicomFileStream(pInput,dicom)
set objetoEntrada.dicom = dicom
$$$LOGINFO("objetoEntrada.dicom: "_objetoEntrada.dicom)
 

El do ##class(EnsLib.DICOM.Document).CreateFromDicomFileStream() crea siempre una nueva instancia de Dicom document que devuelve como output. Creo que en este bloque de codigo no hace falta hacer el %New() previo de la variable "dicom" y hay que pasarle por referencia a la funccion "CreateFromDicomFileStream" (con el "PUNTO" delante del parametro dicom:

do ##class(EnsLib.DICOM.Document).CreateFromDicomFileStream(pInput,.dicom)

No se si sera suficiente para areglar el problema, es solo un primer paso.

Hola Yone,

En los adaptadores de interoperabilidad no hay directamente un adaptador STOW-RS pero puedes intentar implementar la parte de servicios REST en la plataforma y luego enviarlo utilizando los adaptadores DICOM TCP convencionales.

Los servicios y operaciones incluidos que utilizan adaptadores DICOM TCP emplean siempre como mensaje EnsLib.DICOM.Document. Y sí, puedes instanciar un documento DICOM desde un fichero (stream) con CreateFromDicomFileStream.

Comprueba siempre el resultado de CreateFromDicomFileStream por si devuelve algún error. Si todo va bien, debería ser 1 o lo que es lo mismo un $$$OK.

USER>set fileStream = ##class(%Stream.FileBinary).%New()

USER>set fileStream.Filename="/shared/dicom/d1I00001.dcm"                                     

USER>write fileStream.Size
262878
USER>set sc = ##class(EnsLib.DICOM.Document).CreateFromDicomFileStream(fileStream, .dicom)

USER>write sc
1
USER>zwrite dicom
dicom=13@EnsLib.DICOM.Document  ; <OREF>
+----------------- general information ---------------
|      oref value: 13
|      class name: EnsLib.DICOM.Document
| reference count: 2
+----------------- attribute values ------------------
|       %Concurrency = 1  <Set>
|     DestinationAET = ""
|           Modified = 1
|  OriginalSourceAET = ""
|          SourceAET = ""
|    SourceIPAddress = ""
+----------------- swizzled references ---------------
|       i%CommandSet = ""  <Set>
|       r%CommandSet = "7@EnsLib.DICOM.CommandSet"  <Set>
|     i%FixedDataSet = ""
|     r%FixedDataSet = "5@EnsLib.DICOM.FixedDataSet"
|   i%MutableDataSet = ""  <Set>
|   r%MutableDataSet = "4@EnsLib.DICOM.MutableDataSet"  <Set>
+--------------- calculated references ---------------
|        (i%DataSet)   <Get>
|        (r%DataSet)   <Get>
|            HasData   <Get>
+-----------------------------------------------------

USER>

Una vez tengas tu instancia de EnsLib.DICOM.Document ya puedes enviarlo por DICOM TCP convencional. En tu ejemplo, parece que lo has incluido en otro mensaje.

Quizá se haya construido con errores el EnsLib.DICOM.Document, o simplemente sea un tema de representación en el visor de mensajes. Siempre puedes instanciar el mensaje en concreto que quieras en el terminal y examinar su contenido para quedarte seguro.