Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Mención en Computación
Mención: Computación
Fecha de lectura:
Cualificación:
A todas las personas que me han
Raúl.
Resumen
El aumento del número de clı́nicas y hospitales privados en nuestro paı́s, ası́
como el creciente número de profesionales del sector médico que se especializan
en una de sus ramas , presenta ante la sociedad una ingente cantidad de op-
ciones para decidir dónde realizar sus pruebas médicas. Esta situación provoca
que si cambiamos de hospital o consultamos a un experto para obtener una
segunda opinión sobre nuestro caso médico, por ejemplo, estos nuevos estudios
no podrı́an ser unificados con posibles estudios anteriores del paciente, pues
contienen diferentes datos de identificación para el mismo paciente, debido a
que cada centro sanitario identifica a sus pacientes de manera independiente.
Ası́, nace la necesidad de resolver este problema para que los centros médi-
cos puedan incorporar estudios clı́nicos no realizados en sus instalaciones de
cualquier paciente al posible historial que pudiera tener ese paciente con ellos.
Este proyecto consiste en la realización del diseño e implementación de
un sistema que permita la importación de estudios clı́nicos a un repositorio
centralizado. El integrador de estudios, como llamaremos a la herramienta,
es capaz de leer estudios DICOM (Estándar reconocido mundialmente para
el intercambio de imágenes médicas) de diferentes fuentes (CD,DVD,USB...)
extrayendo información de los mismos para poder comparar estos datos con
los presentes en el PACS (Sistema de archivado y transmisión de imágenes
médicas) del centro médico en busca de pacientes a los que pueda pertenecer
el estudio. Una vez realizada esta comparación, al usuario se le mostrarán
todos los posibles pacientes que son candidatos a ser el dueño real de ese
nuevo estudio clı́nico, pudiendo ası́, elegir a quien le pertenece, con lo que el
integrador realizará las modificaciones necesarias al estudio a nivel DICOM
y lo enviará al PACS para que se almacene con el resto de estudios que el
paciente tiene en su centro médico.
1. Introducción 1
1.1. Contexto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Problemática . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4. Estructura de la memoria . . . . . . . . . . . . . . . . . . . . . 4
2. Fundamentos tecnológicos 5
2.1. Base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2. BackEnd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.1. Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.2. Maven . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.3. Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.4. JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3. Gestión de la entrada/salida de dispositivos de almacenamiento 8
2.3.1. .Net y C# . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4. Front End . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4.1. JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4.2. HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4.3. CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5. DICOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5.1. Modelo de datos . . . . . . . . . . . . . . . . . . . . . . 11
2.5.2. Elementos DICOM . . . . . . . . . . . . . . . . . . . . . 11
2.5.3. Objetos DICOM . . . . . . . . . . . . . . . . . . . . . . 12
2.5.4. Servicios DICOM . . . . . . . . . . . . . . . . . . . . . . 13
2.5.5. DICOMDIR . . . . . . . . . . . . . . . . . . . . . . . . . 15
ix
x ÍNDICE GENERAL
3. Estado de la cuestión 19
3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2. Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3. Medavis DICOM importer . . . . . . . . . . . . . . . . . . . . . 21
3.4. Consideraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4. Metodologı́a de desarrollo 25
4.1. Metodologı́a seleccionada . . . . . . . . . . . . . . . . . . . . . . 25
4.1.1. Fases de cada iteración . . . . . . . . . . . . . . . . . . . 26
6. Sistema desarrollado 35
6.1. Análisis de requisitos . . . . . . . . . . . . . . . . . . . . . . . . 35
6.2. Arquitectura del sistema . . . . . . . . . . . . . . . . . . . . . . 36
6.3. Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
6.3.1. Estructura de los directorios . . . . . . . . . . . . . . . . 37
6.3.2. Configuración . . . . . . . . . . . . . . . . . . . . . . . . 37
6.3.3. Backend . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
6.3.4. Frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.3.5. Iteraciones . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.4. Iteración 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.4.1. Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.4.2. Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.4.3. Implementación . . . . . . . . . . . . . . . . . . . . . . . 52
ÍNDICE GENERAL xi
6.4.4. Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.5. Iteración 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.5.1. Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.5.2. Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.5.3. Implementación . . . . . . . . . . . . . . . . . . . . . . . 58
6.5.4. Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.6. Iteración 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.6.1. Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.6.2. Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.6.3. Implementación . . . . . . . . . . . . . . . . . . . . . . . 69
6.6.4. Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
6.7. Iteración 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
6.7.1. Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
6.7.2. Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
6.7.3. Implementación . . . . . . . . . . . . . . . . . . . . . . . 80
6.7.4. Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
6.8. Iteración 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
6.8.1. Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.8.2. Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.8.3. Implementación . . . . . . . . . . . . . . . . . . . . . . . 87
6.8.4. Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
7. Conclusiones 93
8. Trabajo futuro 95
Referencias 97
Apéndices 101
xv
xvi ÍNDICE DE FIGURAS
6.33. core/model/mediaService . . . . . . . . . . . . . . . . . . . . . . 58
6.34. Carpeta config creada al ejecutar la clase App . . . . . . . . . . 58
6.35. core/app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.36. Pruebas funcionales SI (i) . . . . . . . . . . . . . . . . . . . . . 60
6.37. Pruebas funcionales SI (ii) . . . . . . . . . . . . . . . . . . . . . 60
6.38. Logs al insertar un paciente ya registrado en BD . . . . . . . . . 61
6.39. Logs al insertar un nuevo estudio a BD . . . . . . . . . . . . . . 61
6.40. Logs al leer una serie . . . . . . . . . . . . . . . . . . . . . . . . 61
6.41. Logs al leer una imagen e importarla . . . . . . . . . . . . . . . 61
6.42. MediaDetector/Program.cs . . . . . . . . . . . . . . . . . . . . . 63
6.43. core/rmi/PatientServiceRmi . . . . . . . . . . . . . . . . . . . . 64
6.44. core/rmi/PatientModServiceRmi . . . . . . . . . . . . . . . . . 65
6.45. core/rmi/StudyServiceRmi . . . . . . . . . . . . . . . . . . . . . 66
6.46. core/rmi/StudyModServiceRmi . . . . . . . . . . . . . . . . . . 67
6.47. core/rmi/MediaServiceRmi . . . . . . . . . . . . . . . . . . . . . 67
6.48. web/controller/StudyController y web/controller/StudyModCon-
troller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.49. web/controller/MediaController . . . . . . . . . . . . . . . . . . 69
6.50. web/dto/StudyDTO y web/dto/StudyModDTO . . . . . . . . . 70
6.51. web/conversor/StudyToStudyDtoConversor y web/conversor/S-
tudyModToStudyModDtoConversor . . . . . . . . . . . . . . . . 70
6.52. Solución .NET MediaDetector . . . . . . . . . . . . . . . . . . . 71
6.53. Paquete Rmi en el módulo Core . . . . . . . . . . . . . . . . . . 71
6.54. Paquete Rmi en el módulo Web . . . . . . . . . . . . . . . . . . 71
6.55. Paquetes Conversor y Dto en el módulo Web . . . . . . . . . . 72
6.56. Paquete Controller en el módulo Web . . . . . . . . . . . . . . . 72
6.57. Carpeta Web en el módulo Web . . . . . . . . . . . . . . . . . . 73
6.58. Página principal de la web . . . . . . . . . . . . . . . . . . . . . 73
6.59. Página principal de la web, mostrando la segunda página de
estudios importados . . . . . . . . . . . . . . . . . . . . . . . . . 74
6.60. Página principal de la web, ordenando estudios por nombre del
paciente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
6.61. Acción de borrar un estudio . . . . . . . . . . . . . . . . . . . . 74
xviii ÍNDICE DE FIGURAS
Introducción
1.1. Contexto
Llamamos imagen médica [1] al conjunto de técnicas y procesos usados
para crear imágenes del cuerpo humano, o partes de él, con propósitos clı́nicos
(revelar, diagnosticar o examinar enfermedades) o para la ciencia médica.
Sus inicios se remontan al 8 de noviembre de 1895 cuando el ingeniero
mecánico y fı́sico alemán Wilhelm Conrad Röntgen [2] produjo radiación elec-
tromagnética en las longitudes de onda correspondiente a los actualmente lla-
mados rayos X.
En el siglo XX se producen grandes avances tecnológicos en radiologı́a e im-
portantes descubrimientos en el diagnóstico, como son las ecografı́as (redujeron
la exposición del paciente a los rayos X), las tomografı́as axiales computariza-
das (TAC o TC, desde que en 1970 se diseñó el primer equipo de TC hasta
la actualidad, han ido sucediéndose diferentes generaciones que han mejorado
la rapidez y la calidad de la imagen) o las resonancias magnéticas( no utiliza
radiaciones ionizantes ni el aire ni el hueso son obstáculos).
Todos estos hitos en la historia de la imagen médica [3], sumados a la apa-
rición y al crecimiento de la infórmatica, supusieron el paso a la digitalización
de sus procesos de generación, transferencia y almacenamiento. Esto provocó
la necesidad de la creación de unos estándares sobre los formatos de la in-
formación médica y los protocolos de transferencia de esta información. Ası́,
en 1985 y mediante la NEMA (National Electrical Manufacturers Associa-
tion) [4] y el ACR (American College of Radiology) [5], se creó el estándar
1
2 1.2. Problemática
1.2. Problemática
El problema radica en que cada centro médico dispone de un identificador
diferente para cada paciente, causando problemas cuando, por ejemplo, una
persona:
• Quiere una segunda opinión sobre el estudio clı́nico que se haya realizado
en un centro médico en concreto.
1.3. Objetivos
Como se describe en la sección anterior, en este trabajo se pretende diseñar
e implementar una aplicación web que permita leer estudios DICOM de dife-
rentes fuentes (CD,DVD,USB...) extrayendo información de los mismos para
poder comparar estos datos con los presentes en el PACS del centro médico en
busca de pacientes a los que puede pertenecer el estudio.
Para conseguirlo, se han definido una serie de subobjetivos que nos permi-
tirán abordar el proyecto:
Fundamentos tecnológicos
5
6 2.2. BackEnd
2.2. BackEnd
Se ha optado por una arquitectura Java [12] para el desarrollo del servidor
web de la aplicación.
2.2.1. Java
Lenguaje orientado a objetos muy completo y ampliamente utilizado por
su sencillez, portabilidad y gran cantidad de librerı́as.
Java es un lenguaje orientado a objetos, que fue diseñado especı́ficamente
para tener tan pocas dependencias de implementación como fuera posible. Es
uno de los lenguajes de programación más populares en uso, particularmente
para aplicaciones de cliente-servidor de web, lo cual es una de las causas por las
que Java presenta una gran cantidad de librerı́as, facilitando ası́ los desarrollos
en este lenguaje de programación.
Su sintaxis es la de C++ “simplificada”, lo cual lo convierte en un lenguaje
de programación muy fácil de aprender. Los creadores de Java partieron de la
sintaxis de C++ y trataron de eliminar de este todo lo que resultase complicado
o fuente de errores en este lenguaje. Esto provoca que no se puedan realizar
2. Fundamentos tecnológicos 7
2.2.2. Maven
Maven [14] es una herramienta de software para la gestión y construcción
de proyectos Java [15]. Es similar en funcionalidad a Apache Ant, pero tiene
un modelo de configuración de construcción más simple, basado en un formato
XML.
Maven utiliza un Project Object Model (POM) para describir el proyec-
to de software a construir, sus dependencias de otros módulos y componentes
externos, y el orden de construcción de los elementos. Viene con objetivos pre-
definidos para realizar ciertas tareas claramente definidas, como la compilación
del código y su empaquetado.
Las partes del ciclo de vida principal del proyecto Maven son:
2.2.3. Spring
Spring [16] es un framework para el desarrollo de aplicaciones y contenedor
de inversión de control, de código abierto para la plataforma Java.
La caracterı́stica principal es la inyección de dependencias a través de la
inversión de control. Spring está compuesto por varios módulos, sin embargo,
solo es necesario utilizar los que nos sirvan para la aplicación que estemos
desarrollando.
2.2.4. JUnit
JUnit [17] es un conjunto de clases (framework) que permite realizar la
ejecución de clases Java de manera controlada para poder evaluar si el funcio-
namiento de cada uno de los métodos de la clase se comporta como se espera.
2.3.1. .Net y C#
.NET [18] es un framework de Microsoft que hace un énfasis en la transpa-
rencia de redes, con independencia de plataforma de hardware y que permite un
rápido desarrollo de aplicaciones. Basada en ella, la empresa intenta desarro-
llar una estrategia horizontal que integre todos sus productos, desde el sistema
operativo hasta las herramientas de mercado.
.NET Framework consta de dos componentes principales: Common Lan-
guage Runtime (CLR) y la biblioteca de clases de .NET Framework. Common
Language Runtime es el fundamento de .NET Framework, pues administra
la memoria, ejecución de subprocesos, ejecución de código, comprobación de
la seguridad del código, compilación y la posibilidad de comunicación entre
lenguajes bajo el estándar CLR. Esto permitirı́a utilizar diferentes lenguajes,
aprovechando los puntos fuertes de cada uno.
Lo que hace destacar a este framework por encima de otros son las amplı́as
guı́as y la facilidad para realizar operaciones de entrada y salida en equipos
Windows, uno de los requisitos de la herramienta.
Como lenguaje administrado por .NET se usará C# [19].
C dispone de una sintaxis básica derivada de C/C++ y utiliza el modelo
de objetos de la plataforma .NET, similar al de Java, aunque incluye mejoras
derivadas de otros lenguajes.
2. Fundamentos tecnológicos 9
2.4.1. JavaScript
JavaScript [20] es un lenguaje de programación interpretado, dialecto del
estándar ECMAScript. Se define como orientado a objetos, basado en proto-
tipos, imperativo, débilmente tipado y dinámico.
Se utiliza, principalmente, en su forma del lado del cliente (front-end), im-
plementado como parte de un navegador web permitiendo mejoras en la inter-
faz de usuario y páginas web dinámicas. JavaScript se diseñó con una sintaxis
similar a C, aunque adopta nombres y convenciones del lenguaje de progra-
mación Java. Sin embargo, Java y JavaScript tienen semánticas y propósitos
diferentes.
Todos los navegadores modernos interpretan el código JavaScript integrado
en las páginas web.
2.4.2. HTML
HTML [21] o HyperText Markup Language (lenguaje de marcas de hiper-
texto), hace referencia al lenguaje de marcado para la elaboración de páginas
web. Es un estándar que sirve de referencia del software que conecta con la
elaboración de páginas web en sus diferentes versiones, define una estructura
básica y un código (denominado código HTML) para la definición de contenido
de una página web, como texto, imágenes, videos, juegos, entre otros. Es el
estándar que se ha impuesto en la visualización de páginas web y es el que
todos los navegadores actuales han adoptado.
El lenguaje HTML basa su filosofı́a de desarrollo en la diferenciación. Para
añadir un elemento externo a la página (imagen, vı́deo, script...), este no se
incrusta directamente en el código de la página, sino que se hace una referencia
a la ubicación de dicho elemento mediante texto. De este modo, la página web
10 2.5. DICOM
2.4.3. CSS
CSS [22] (siglas en inglés de Cascading Style Sheets), o en español ”Hojas
de estilo en cascada”, es un lenguaje de diseño gráfico para definir y crear la
presentación de un documento estructurado escrito en un lenguaje de marcado.
Es muy utilizado para establecer el diseño visual de los documentos web.
Junto con HTML y JavaScript, CSS es una tecnologı́a usada por muchos
sitios web para crear páginas visualmente atractivas, interfaces de usuario para
aplicaciones web y GUIs para muchas aplicaciones móviles.
CSS está diseñado principalmente para marcar la separación del contenido
del documento y la forma de presentación de este, caracterı́sticas tales como
las capas o layouts, los colores y las fuentes.
2.5. DICOM
En los inicios de la imagen médica, cada fabricante diseñaba sus productos
de manera independiente, creando sus propios formatos para almacenar infor-
mación y enviarla a otros equipos, lo cual provocaba una casi nula compati-
bilidad entre equipos de diferentes fabricantes. Ası́, viendo que era necesario
crear un estándar que permitise interacción entre difentes equipos y almacenar
información de estudios médicos, se creó el formato DICOM, en un esfuerzo
común entre la NEMA y el ACR.
Este estándar define un formato para almacenar información, ası́ como un
protocolo de comunicación basado en TCP-IP que permite la interacción entre
workstations, servidores e impresoras médicas por igual.
Aun ası́, el primer estándar DICOM importante es la versión 3.0, que fue
desarrollado en 1993, puesto que significó la aceptación de todos los fabrican-
tes del estándar DICOM. Desde entonces, y hasta el dı́a de hoy, el estándar
DICOM es usado en todos los hospitales y en cualquier material médico de
cualquier fabricante.
2. Fundamentos tecnológicos 11
• Tag: Todo elemento DICOM tiene un Tag que lo define de manera única
y está compuesto de dos números llamados grupo y elemento. Elementos
DICOM que estan relacionados entre ellos a veces tienen el mismo grupo
en su Tag. En el ejemplo podemos ver varios elementos del grupo 0028.
• Service Class User (SCU): El nodo DICOM que usa el servicio DI-
COM. Un ejemplo de esto podrı́a ser una estación de trabajo que usa
el servicio de almacenamiento del servidor PACS para mandar imágenes
DICOM al archivo del servidor PACS.
• C-Find: El SCU trata de realizar una búsqueda entre los estudios del
SCP, mandando una serie de atributos en forma de string. El SCP de-
vuelve por cada emparejamiento una lista con los atributos requeridos y
sus valores.
2. Fundamentos tecnológicos 15
• Query [26]: En esta fase se quiere recuperar una lista de estudios a partir
de una serie de atributos, con los que se pretende filtrar esta búsqueda.
Esto se realiza ejecutando una operacón C-FIND.
• Retrive [27]: En esta fase se quiere obtener uno de los estudios de entre los
que se encontraron en el anterior paso. Para esto, en primer lugar, se eje-
cuta una operación C-Move, siendo el destino el propio SCU que mandó
la petición. En este momento se puede observar una de las particulari-
dades de los nodos en servicios DICOM comentandas con anterioridad,
puesto que los roles del SCU y el SCP se invierten, siendo el antiguo
SCP el que lanza una petición C-Store (pasando a ser el nuevo SCU) al
antiguo SCU (convirtiéndose este en el nuevo SCP).
2.5.5. DICOMDIR
Existen dos maneras en las que aplicaciones DICOM pueden colaborar
entre ellas. Pueden comunicarse a través de conexiones TCP/IP o pueden
intercambiarse ficheros a través de algún medio fı́sico.
Por ejemplo, un paciente le entrega a su médico un CD diciéndole que con-
tiene ficheros DICOM con la información que este necesita para poder realizar
un diagnóstico. Si se tuviese más información que es, se tendrı́a que leer el CD
e ir mirando cada fichero, viendo si es un fichero DICOM, leyéndolo, descifran-
do que se encuentra dentro del mismo y si es lo que se estaba buscando. Pero
si el CD está hecho acorde a lo dictado en el estándar, este proceso se vuelve
mucho más sencillo. Lo único que se necesita es leer el fichero DICOMDIR [28],
encontrar los archivos del paciente contenidos en él y conseguir las referencias
a los ficheros DICOM que se están buscando. Ası́, el DICOMDIR es lo que
su propio nombre indica, un registro de directorios con información sobre los
ficheros DICOM del dispositivo de almacenamiento.
En la figura 2.5 se ejemplifica la estructura del DICOMDIR.
16 2.5. DICOM
• Previsualizar imágenes
Estado de la cuestión
3.1. Introducción
Cada dı́a, el mundo sanitario se convierte en un contexto mucho más tec-
nológico, donde los profesionales tienen a su alcance aplicaciones y herramien-
tas cada vez más sofisticadas que les ayudan a una mejor y más rapida toma de
decisiones. También los pacientes se benefician de este avance, por ejemplo, ob-
teniendo CDs con el estudio clı́nico que se realizan en su centro sanitario. Estos
CDs son el princial medio de intercambio de información entre instituciones
médicas.
En este apartado se verá una serie de aplicaciones que realizan la tarea
de importar esta información al PACS para que el profesional médico pueda
tener acceso directo a las anteriores examinaciones de ese paciente, lo cual
evita duplicar estudios clı́nicos y mejora los tratamientos.
3.2. Integrity
El Integrity [31] es un dispositivo de pago que permite leer, reconciliar
y almacenar estudios médicos desde un disco(CD/DVD) a un PACS. Permi-
te realizar búsquedas múltiples para identificar coincidencias entre datos del
estudio (nombre del paciente, demografı́a...).
Esta herramienta dispone además de una interfaz basada en web que pro-
porciona acceso multiusuario, separando el proceso de lectura del disco de la
reconciliación. Realiza análisis antivirus a los estudios importados, permite
editar atributos de los estudios y almacenar en hasta diez destinos, incluyendo
PACS y archivos locales.
Como se puede observar en las figuras 3.1, 3.2 y 3.3, el Integrity cuenta
19
20 3.2. Integrity
con una intuitiva interfaz web que nos permite realizar muchas funciones clave
para la correcta importación de estudios. Destaca la capacidad de revisión, e
incluso, edición de los datos de los estudios para su correcta reconciliación con
anteriores estudios del paciente, lo cual facilita mucho la tarea de cerciorarse
que todo está correcto y de que se está realizando la importación de forma
adecuada por parte del profesional.
Los fallos del Integrity radican en que es un dispositivo hardware de pago
3. Estado de la cuestión 21
3.4. Consideraciones
No es extensa la cantidad de herramientas en el mercado que permitan
realizar la tarea de poder importar la información que un paciente trae en un
CD para ser usada por los profesionales del centro médico al que asiste. Ambas
opciones tratadas son de pago, una siendo hardware y otra software. Además,
el mayor problema radica en que no todos los centros médicos disponen de
personal formado en el estándar DICOM.
Viendo estas carencias, se plantea realizar un importador de estudios pro-
pio, recogiendo las funcionalidades más destacadas de estas aplicaciones, an-
teriormente mencionadas, y añadiendole algunos puntos en las que estas no se
adaptan a lo que el sector necesita debido al avance que el mismo experimenta.
Ası́, se realizará una aplicación cogiendo los puntos fuertes de ambas he-
rramientas:
• Permitir revisar los datos de los estudios a importar: La parte más im-
portante de este proceso de intercambio es que la importación se haga
con reconciliaciones verı́dicas.
Metodologı́a de desarrollo
25
26 4.1. Metodologı́a seleccionada
• Permite mitigar desde el inicio los riesgos del proyecto. Desde la pri-
mera iteración, el equipo tiene que gestionar los problemas que pueden
aparecer en una entrega del proyecto. Al hacer patentes estos riesgos, es
posible iniciar su mitigación de manera anticipada.
• Dado que cada iteración debe dar como resultado requisitos terminados,
se minimiza el número de errores que se producen en el desarrollo y se
aumenta la calidad.
• Permite conocer el progreso real del proyecto desde las primeras itera-
ciones y extrapolar si su finalización es viable en la fecha prevista.
• Diseño: Se definen las arquitecturas y los modelos de datos con los que
se representará la información.
27
28 5.2. Planificación inicial
Sistema desarrollado
35
36 6.2. Arquitectura del sistema
6.3. Diseño
6.3.2. Configuración
Los diferentes módulos del programa requerirán ser configurables para
adaptarlos a cada cliente. Dentro de cada módulo, los ficheros de configuración
necesarios serán:
38 6.3. Diseño
◦ config.js
◦ Url de conexión con el servidor
◦ Intervalo de refresco de datos en pantalla principal
◦ Columnas de las tablas usadas, permitiendo especificar los datos
asociados a cada columna según la tecnologı́a de las dataTables
◦ configImportador.xml
◦ Directorio incoming
◦ Directorio processed
◦ Directorio Historic
◦ configDicom.xml
◦ AET Origen (Application Entity Title)
◦ AET Destino
◦ Ip
◦ Puerto
◦ QueryTimeout
◦ MoveTimeout
◦ MaxResults
◦ OrderBy
◦ SearchType
6.3.3. Backend
En la figura 6.2 se muestra el modelo de datos del sistema.
Con este diseño se quiere conseguir una base de datos sencilla que permita
añadir trazabilidad a la herramienta.
6. Sistema desarrollado 39
6.3.4. Frontend
A continuación, en las siguientes figuras 6.3, 6.4 y 6.5, se muestra el diseño
inicial de la interfaz de usuario.
Como se puede observar, se busca una interfaz muy simpla que permite
realizar las funcionalidades ofrecidas de manera sencilla e intuitiva. Esto es
40 6.3. Diseño
ası́ debido a que los profesionales que usarán esta herramienta no dominan
la informática, muchos de los cuales son de avanzada edad. Ası́, se intentará
crear una herramienta que permita realizar operaciones complejas utilizando
una interfaz gráfica sencilla que suponga una curva de aprendizaje baja y
simplifique las acciones que tenga que realizar el usuario para llevar a cabo
tales operaciones.
6. Sistema desarrollado 41
6.3.5. Iteraciones
En esta sección se describe de forma detallada el desarrollo del proyecto.
Como se comenta en el capı́tulo 5, al usar una metodologı́a iterativa incremen-
tal este apartado estará estructurado en iteraciones.
6.4. Iteración 1
El objetivo de esta iteración es obtener una versión del programa con las
clases básicas para el manejo de la base de datos, directorios...etc.
6.4.1. Análisis
Esta iteración se centra en crear las utilidades del proyecto, por lo que las
tareas a abordar serán:
6.4.2. Diseño
Para la parte de creación de la base de datos, se procederá siguiendo el
diseño estipulado en el apartado de backend.
El primer paso será la creación de un script llamado CreateTables.sql que
será el encargado de crear todas las entidades y relaciones de nuestra base
de datos. También necesitaremos un script para poder borrar estas tablas y
relaciones, por lo que crearemos un script llamado DropTables.sql. Estos scripts
se localizarán en el módulo Core.
Una vez se tenga creada la base de datos, ha de crearse todo el código para
el manejo de la misma, lo cual incluye los POJOs que representen las tablas
de la base de datos, los DAOs, los RowMappers... Todo esto se organizará
dentro del módulo Core en un paquete llamado model, dentro del cual se
hará un nuevo paquete con el nombre de la tabla que representa (por ejemplo
”paciente”) que incluirá todas las clases necesarias para la interacción con esa
tabla.
Además, una vez implementado todo esto, se crearán los servicios (interfaz
e implementación) que implementarán las funcionalidades que se acabarán
de codificar en cada uno de los respectivos DAOs de la herramienta. Estos
servicios se crearán dentro de paquetes llamados por el nombre de la entidad
concatenado con Service.
Durante esta implementación, se irá añadiendo el código necesario para el
correcto funcionamiento de Spring. A continuación se muestra el diseño de las
cuatro entidadades de la herramienta:
- Paciente:
6. Sistema desarrollado 43
El primer paso será crear la entidad persistente Patient que incluirá los
campos definidos en las tablas de la base de datos, como se puede visualizar
en la figura 6.6.
Los métodos que se incluyen en la interfaz SqlPatientDAO son los siguien-
tes:
- Paciente Modificado:
El primer paso será crear la entidad persistente PatientMod que incluirá
los campos definidos en las tablas de la base de datos, como se puede visualizar
en la figura 6.8.
Los métodos que se incluyen en la interfaz SqlPatientModDAO son los
siguientes:
- Estudio:
El primer paso será crear la entidad persistente Study que incluirá los cam-
pos definidos en las tablas de la base de datos, como se puede visualizar en la
figura 6.10.
Los métodos que se incluyen en la interfaz SqlStudyDAO son los siguientes:
- Estudio Modificado:
El primer paso será crear la entidad persistente StudyMod que incluirá los
campos definidos en las tablas de la base de datos, como se puede visualizar
en la figura 6.12.
Los métodos que se incluyen en la interfaz SqlStudyModDAO son los si-
guientes:
Además, en este mismo módulo, se creará una clase llamada Global Na-
mes para establecer constantes como el fichero de Log, puertos USB... para
añadir mayor flexibilidad a la hora de configurar la herramienta en los equipos
médicos.
Para la lectura del DICOMDIR se creará en el modulo Dicom una clase
DicomDirReader que implementará este servicio dentro del paquete services.
Los métodos de esta clase, como se pueden apreciar en la figura 6.15, son los
siguientes:
6.4.3. Implementación
Para la creación de la BD se utilizará la herramienta MySQL WorkBench.
Desde la página principal, crearemos un nuevo schema con nombre studyim-
porter. Añadiremos a este schema un usuario y passoword. Estos tres datos son
importantes puesto que después deberemos indicarlos en el fichero application-
context.xml de Spring para poder conectar con nuestra base de datos.
A continuación se codificarán las cuatro tablas que representan nuestras
entidades persistentes a través de los scripts para la creación y el borrado
de las mismas. Estos scripts serán añadidos al módulo Core en una carpeta
llamada scripts-sql.
Una vez esté toda esta parte codificada, se seguirá con la implementación
de los servicios de cada una de estas entidades. La estructura de estas clases
54 6.4. Iteración 1
y los paquetes en los que se encuentran se puede ver en las figuras 6.23, 6.24,
6.25 y 6.26:
Para manejar los datos de entrada se han implementado las funcionalidades
indicadas utilizando el paquete Java.io, el cual nos facilita la realización de
tareas relacionadas con el flujo de datos, tanto de entrada como de salida. La
estructura de esta implementación se puede ver en la figura 6.27.
Las clases creadas para realizar este manejo de las excepciones en esta
iteración son las expuestas en la figura 6.29.
6.4.4. Pruebas
Para la parte de la base de datos y del código para su manejo se crearán
cuatro tests unitarios usando JUnit, uno por cada entidad persistente, para
comprobar el correcto funcionamiento de cada una de las funcionalidades que
estas ofrecen. Estos tests se llamarán igual que la clase que testean, con la
palabra Test añadida al final, como se puede visualizar en la figura 6.30
Además de estas pruebas unitarias, también se hace uso de la herramien-
ta MySql Workbench para realizar de manera manual comprobaciones de la
56 6.4. Iteración 1
6.5. Iteración 2
El objetivo de esta iteración es la implementación de la parte común de los
hilos monitores.
6.5.1. Análisis
Esta iteración se centrará en la lectura de estudios. Para ello, se definen las
siguientes tareas:
6.5.2. Diseño
En el módulo Core se creará la clase App, la cual creará los directorios
necesarios para el programa según se especifican en el archivo de configuración
y lanzará los hilos monitores.
A continuación se creará la interfaz para la parte común de los hilos moni-
tores, llamada MediaService y ubicada en el paquete model del módulo Core,
la cual integrará la funcionalidad de leer el DICOMDIR, dar de alta en base
de datos a los pacientes y estudios recopilados y llevar los estudios (con sus
58 6.5. Iteración 2
6.5.3. Implementación
Se utiliza la clase textitApp contenida en el paquete app del módulo Core
para codificar la creación de los directorios necesarios para el funcionamiento
de la aplicación. Tal estructura se puede observar en la figura 6.34.
6.5.4. Pruebas
En esta iteración se realizan gran cantidad de pruebas funcionales con CD’s
con datos ficticios pero estructura real proporcionados por la empresa para
comprobar que la aplicación se comporta debidamente en cualquier caso de
uso. Ası́, se crea una lista con las pruebas realizadas, su resultado y, en el caso
de que la prueba no fuese pasada, comentarios con los ajustes realizados. Las
pruebas realizadas se muestran es las figuras 6.36 y 6.37.
Para la comprobación de estas pruebas, se volverá a utilizar los logs in-
sertados en las funcionalidades de la lectura del DICOMDIR y el manejo de
directorios de la primera iteración, añadidos a los logs introducidos en la imple-
mentación común de los hilos monitores para la correcta inserción de pacientes
y estudios en la base de datos. Para este último apartado, también se volverá
a comprobar de forma manual, a través de la herramienta MySQL Workbench
el correcto comportamiento de la implementación realizada. Estos logs pueden
ser visualizados en las figuras 6.38, 6.39, 6.40 y 6.41.
60 6.5. Iteración 2
6.6. Iteración 3
El objetivo de esta iteración es la lectura de estudios de CD/DVD y USB,
ası́ como su presentación en la interfaz de usuario en la web.
6.6.1. Análisis
Esta iteración se centra en la implementación de los hilos monitores, deli-
mitándose las siguientes tareas a abordar:
• Servicios RMI: Se crearán los servicios RMI que expondrán las funcio-
nalidades de los servicios del módulo Core al módulo Web.
• Interfaz Web: Esta será la primera versión de la interfaz web, que solo
dispondrá de la pantalla principal donde se listarán los estudios que se
hayan leı́do.
6.6.2. Diseño
Para la creación de los hilos monitores, tanto de USB como de CD/DVD,
se creará una aplicación de consola de .NET, llamada MediaDetector, que im-
plementará dichas funcionalidades, cada una en un método distinto, en la clase
Program.cs autogenerada al crear la solución en el IDE Microsoft Visual Stu-
dio, como se puede ver en la figura 6.42.
• GetAllStudies: Devuelve una lista con todos los estudios existentes. Esta
funcionalidad se utilizará para mostrar la lista de estudios en la página
principal de la aplicación web.
6.6.3. Implementación
Para la implementación de los hilos monitores de CD/DVD/USB, se creará
una soluciñon llamada MediaDetector, del tipo aplicación de consola en el IDE
Microsoft Visual Studio. Una vez esta haya sido creada, implementamos en
la clase autogenerada Program.cs los eventos que se lanzarán al introducir un
CD/DVD/USB, lo cual será implementado gracias a las librerias ofrecidas por
70 6.6. Iteración 3
Una vez creados los servicios RMI, se codificarán los controladores web
72 6.6. Iteración 3
• Ordenar los estudios por cualquiera de los campos que se presentan para
cada uno de ellos.
6. Sistema desarrollado 73
• Borrar un estudio.
Figura 6.60: Página principal de la web, ordenando estudios por nombre del
paciente
6.6.4. Pruebas
Para comprobar el correcto funcionamiento de la lectura de dispositivos de
almacenamiento, se hacen pruebas manuales con dispositivos proporcionados
por la empresa, que simulan a los usados en los centros médicos, volviendo
a repasar todas las pruebas realizadas en la iteración 2 y que comprobando
que en todos los casos de uso la herramienta sigue comportandose de forma
correcta (ausencia de archivos de configuración, fichero DICOMDIR con mal
formato...).
Una vez que toda la parte de lectura e incorporación de estudios a través de
dispositivos de almacenamiento está funcionando de manera correcta, se pro-
dece a comprobar el correcto funcionamiento de los servicios creados, ası́ como
la comunicación entre estos y la aplicación web codificada en esta iteración a
través de los controladores.
Ası́, cuando se inserta un CD con un estudio contenido en él, se deberı́a
mostrar en la aplicación web una vez este fuera importado por la herramienta.
Para esto, se utilizan CDs y USBs que contienen estudios ficticios pero con
estructura real proporcionados con la empresa, probando todos los casos de
uso como se hizo en la parte de lectura de estudios. Todo este proceso se puede
seguir gracias a los Logs incorporados en los servicios RMI y, en la parte de la
aplicación web, se pueden realizar tareas de debug gracias a los navegadores
web. En este caso, se realizarán con la opción Inspeccionar del navegador
Google Chrome [36], como se puede visualizar en la figura 6.63.
6.7. Iteración 4
El objetivo de esta iteración es la creación de las operaciones DICOM Store
y Query&Retrieve.
76 6.7. Iteración 4
6.7.1. Análisis
Esta iteración se centra en la implementación de las operaciones DICOM
que realizará la herramienta, ası́ como de los servicios que darán acceso al uso
de las mismas. Ası́, se delimitan una serie de tareas para abordar la iteración:
6.7.2. Diseño
El primer paso en esta iteración será la creación de los archivos de confi-
guración para poder permitir la flexibilidad necesaria para la instalación de la
herramienta en cualquier equipo del cliente. Además, se procederá a esta tarea
con la intención de que la implementación permita al equipo técnico realizar
estas instalaciones de la manera más fácil, rápida e intuitiva. Ası́, se creará un
fichero .xml para que el equipo técnico establezca la configuración del equipo
en cuestión en el que se instale la herramienta. Este fichero será leı́do por la
herramienta para adquirir esta configuración y funcionar de manera correcta
para cada cliente. Esta estructura se puede visualizar en la figura 6.64.
A continuación, se listan los archivos de configuración requeridos por la
herramienta, que se localizarán en el paquete utils del módulo Dicom:
◦ read(File, int []): Lee los tags especificados en el array del tipo int
contenidos en el fichero especificado y devuelve la información re-
copilada.
◦ read(File, int): Lee el tag pasado como parámetro del fichero y de-
vuelve la información recopilada.
◦ read(File): Lee todos los tags presentes en el fichero y devuelve toda
la información recopilada.
• GetKeys: Recupera los Tags DICOM que se usarán para filtrar la búsque-
da en el PACS.
6.7.3. Implementación
El primer paso en esta iteración será la creación de la carpeta xml en la
estructura de directorios de la herramienta para poder añadir el fichero .xml
para la configuración de los parámetros necesarios para el correcto funciona-
miento de los servicios del módulo Dicom en cualquier equipo en el que se
instale la misma.
Una vez creada y codificado el fichero .xml para su posterior uso por el
equipo de servicio técnico de la empresa, se procede a crear las clases de con-
figuración en el paquete utils del módulo Dicom que leeran este fichero.
6. Sistema desarrollado 81
6.7.4. Pruebas
Para comprobar el correcto funcionamiento de los servicios DICOM im-
plementados en esta iteración se crearán, por cada servicio, test unitarios,
haciendo uso de JUnit, llamados igual que la clase que testean, con la palabra
”Test” concatenada al final.
En ambos casos, se utilizará la herramienta DICOM CONQUEST, gracias
a la cual podremos replicar un PACS real, y realizar operaciones sobre él.
En la clase StoreTest, se comprobará el correcto envı́o de ficheros DICOM
ası́ como su recepción y correcto almacenamiento en el PACS, además de añadir
82 6.8. Iteración 5
6.8. Iteración 5
El objetivo de esta iteración es la modificación de los campos del estudio y
su envı́o al PACS siguiendo dos criterios:
6.8.1. Análisis
Esta iteración se centra en la implementación de las dos posibilidades de
reconciliación de estudios, por lo que se dividirá el trabajo en las siguientes
tareas:
6.8.2. Diseño
Para la implementación del Matcher, se creará una interfaz llamada Dicom-
Module y una implementación para las opciones de matcheo definidas, dentro
del paquete facade en el módulo Dicom, usando los servicios de Query&Retrieve
y Store, cuyo diseño se puede observar en la figura 6.77.
Los métodos implementados por el Matcher son los siguientes:
• Query: Lanza una búsqueda con los tags especificados, devolviendo una
lista con los objetos DICOM encontrados.
• Move: Se realiza una petición para que se envı́en los objetos DICOM
pasados como parámetro.
84 6.8. Iteración 5
• qrMove: Se realiza una petición para mover los estudios DICOM pasados
como parámetro a la entidad de destino indicada.
• readMetadata(File, int []): Lee los tags especificados en el array del ti-
po int contenidos en el fichero especificado y devuelve la información
recopilada.
cuyos datos coinciden con los del paciente, o ninguno si no existe ningún
match.
El siguiente paso será la creación del servicio RMI que expondrá las fun-
cionalidades del servicio de Matching al módulo Web. Ası́, se creará la clase
MatcherServiceRmi en el paquete rmi del módulo Core, con el diseño presen-
tado en la figura 6.79.
86 6.8. Iteración 5
6.8.3. Implementación
Los pasos a realizar en esta implementación son idénticos a los tomados en
la iteración 3, puesto que se está añadiendo una nueva funcionalidad como se
realizó en su momento en dicha iteración.
Ası́, el primer paso para la codificación de esta iteración será la creación
del Matcher, el cual dispondrá de una interfaz y una implementación, como se
puede observar en la figura 6.81.
Una vez finalizada esta iteración, se habrán añadido las últimas funciona-
lidades de la herramienta, obteniendo el producto final del proyecto. A conti-
nuación, en las figuras 6.85, 6.86, 6.87, 6.88, 6.89, 6.90, 6.91 y 6.92, se pueden
visualizar las últimas funcionalidades agregadas a la página web.
6.8.4. Pruebas
Para la comprobación de la correcta implementación de las funcionalidades
de esta iteración, se ha utilizado la herramienta DICOM Conquest. En esta
herramienta se dispone de una base de datos proporcionada por la empresa
que contiene datos ficticios pero con estructura real. Ası́, utilizando esta he-
rramienta como el PACS de destino, se puede ir comprobando de forma que en
todos los casos de uso la aplicación web realiza sus funcionalidades de forma
correcta.
También se usará la herramienta MySQL Workbench para comprobar la
correcta adición de los pacientes y estudios modificados al realizar la importa-
ción por parte de la aplicación web, y que se generan de manera correcta las
carpetas y ficheros en el directorio Processed de la estructura de directorios de
la aplicación.
Ası́ mismo, se vuelve a usar la opción Inspeccionar del navegador Google
Chrome [36] para tareas de Debug en la parte del módulo Web y se comprue-
ba el correcto funcionamiento de la aplicación en todos los navegadores web
actuales mayormente usados.
Capı́tulo 7
Conclusiones
Con el proyecto finalizado, se puede afirmar que alcanzaron las metas pro-
puestas en el análisis de requisitos inicial, ası́ como los requisitos definidos en
cada una de las iteraciones. Si bien es cierto que durante la realización del pro-
yecto existieron desviaciones temporales modificaciones al diseño e iteraciones
propuestas al inicio del mismo, estas no han interferido en la consecución de
los objetivos y los principios de diseño predefinidos, ası́ como con el diseño de
la web propuesto, que fue realizado siguiendo los mockups propuestos por la
empresa.
A continuación se listan los principales objetivos conseguidos con la reali-
zación de este proyecto:
• Se dispone de una aplicación web con una interfaz de usuario ágil, sencilla
e intuitiva, cuyo objetivo es facilitar el trabajo de los profesionales del
sector clı́nico.
93
94
Trabajo futuro
95
96
Referencias
97
98 REFERENCIAS
101
Apéndice A
Manual de instalación
• Java 8
A.2. Instalación
A.2.1. MySql
La instación de mysql se hará mediante su instalador, que podemos encon-
trar en la página web de Oracle. El instalador Mysql nos mostrará la lista de
software de Mysql que esté instalado en este equipo, además de una serie de
botones que nos permitirán añadir nuevo software, ası́ como actualizar o des-
instalar el ya existente. En nuestro caso necesitamos instalar las herramientas
MySqlWorkbench y MySql Server.
Una vez instalada, pasaremos a crear un nuevo schema llamado studyimpor-
ter, añadiendole el usuario y contraseña indicada por el equipo técnico y dando
permisos totales al mismo. Una vez configurada la base de datos, ejecutaremos
el script CreateTables incluı́do con la herramienta.
A.2.2. Java
Se ejecutará la opción maven install en los módulos Core y Web para
generar los archivos .jar en la carpeta target. Una vez obtenidos estos, generar
103
104 A.2. Instalación
los archivos .bat que lanzarán la aplicación, como se muestra en las figuras A.1,
A.2 y A.3.
Manual de Usuario
B.1. Introducción
El integrador de estudios es una herramienta capaz de leer estudios DI-
COM (Estándar reconocido mundialmente para el intercambio de imágenes
médicas) de diferentes fuentes (CD,DVD,USB...) extrayendo información de
los mismos para poder comparar estos datos con los presentes en el PACS
(Sistema de archivado y transmisión de imágenes médicas) del centro médico
en busca de pacientes a los que puede pertenecer el estudio. Una vez realizada
esta comparación, al usuario se le mostrarán todos los posibles pacientes que
son candidatos a ser el dueño real de ese nuevo estudio clı́nico, pudiendo ası́
elegir a quien le pertenece, con lo que el integrador realizará las modificaciones
necesarias al estudio a nivel DICOM y lo enviará al PACS para que se alma-
cene con el resto de estudios que el paciente tiene en su centro médico (a este
último proceso lo llamaremos matching).
Para comenzar a leer estudios, el usuario deberá introducir un sistema de al-
macenamiento externo con los mismos. El sistema reconocerá dicho dispositivo
y automáticamente almacenará los estudios que en el se encuentre, mostrando
las principales caracterı́sticas de los mismos en la aplicación web.
107
108 B.2. Pasos para la integración de un estudio DICOM