#InterSystems IRIS for Health

0 Seguidores · 498 Publicaciones

InterSystems IRIS for Health™ es la primera y única plataforma de datos global diseñada específicamente para desarrollar aplicaciones que permitan a los servicios médicos administrar los datos más importantes del mundo. Incluye poderosas funciones listas para utilizarse: procesamiento y análisis de transacciones, un modelo flexible para la información de los servicios médicos, implementación de soluciones basadas en FHIR, soporte para las normas de compatibilidad operativa entre los servicios médicos, y mucho más. Todas estas funciones permiten que los desarrolladores realicen aplicaciones valiosas y novedosas rápidamente. Obtener más información.

Artículo Mario Sanchez Macias · abr 27, 2021 21m read

Esta publicación es la traducción de un artículo que publicó mi compañero Murray hace un tiempo. Durante mi trabajo en soporte la he recomendado muchas veces, pues lo que aquí se explica es bastante común y los ejemplos que se dan pueden ayudar a muchos de vosotros.

0
0 375
InterSystems Official David Reche · abr 21, 2021

Ya están disponibles las versiones de prueba 2021.1 de InterSystems IRIS, IRIS for Health y HealthShare Health Connect.

Al ser versiones de prueba, estamos impacientes por aprender de vuestras experiencias con las nuevas versiones, antes de su lanzamiento oficial el próximo mes. Podéis compartir vuestros comentarios a través de la Comunidad de Desarrolladores, para crear entre todos un mejor producto.

0
0 108
Anuncio Esther Sanchez · abr 12, 2021

¡Hola desarrolladores!

Os invitamos a un nuevo webinar en español: "Perfiles FHIR: Introducción y uso con InterSystems IRIS for Health", el martes 20 de abril, a las 4:00 PM (CET).
 

Los Perfiles en FHIR permiten adaptar las especificaciones ‘core’ de FHIR al caso de uso o contexto de implantación. Durante el webinar, hablaremos de Perfiles desde la perspectiva del estándar y enseñaremos el uso de Perfiles en InterSystems IRIS for Health.

¡Nos vemos el próximo martes!

➡️ Podéis registraros aquí >> 
 

2
0 278
InterSystems Official David Reche · abr 9, 2021

La versión 2020.4 de InterSystems IRIS, IRIS for Health e IRIS Studio ya ha sido liberada.

InterSystems IRIS Data Platform 2020.4 hace aún más fácil desarrollar, desplegar y gestionar aplicaciones aumentadas y procesos de negocio que canalizan silos de datos y aplicaciones aisladas. Ofrece muchas nuevas funcionalidades, como:

Mejoras para desarrolladores de aplicaciones y de interfaces, incluyendo:

0
0 83
Artículo Ricardo Paiva · abr 1, 2021 2m read
 

Spoiler

Creé dos ejemplos sencillos utilizando InterSystems IRIS + InterSystems Reports e intentaré compartir lo fácil que es configurar estas dos aplicaciones juntas!

En los siguientes párrafos, describo una guía paso a paso de la facilidad y simplicidad de este proceso.

Después de instalar el Logi Report Designer, abre y selecciona el icono de InterSystems IRIS.

0
0 183
InterSystems Official Mario Sanchez Macias · mar 30, 2021

InterSystems ha corregido un defecto que puede ocasionar problemas de inconsistencia de datos en miembros de mirror no-primarios en circunstancias excepcionales. Este defecto afecta a todas las versiones de los productos de InterSystems.

0
0 116
InterSystems Official David Reche · mar 29, 2021

Ya están disponibles nuevas versiones de mantenimiento de: 

  • Caché  2018.1.5, Ensemble 2018.1.5 y HSAP 2018.1.5
  • InterSystems IRIS 2019.1.2, IRIS for Health 2019.1.2 y HealthShare Health Connect 2019.1.2
  • InterSystems IRIS 2020.1.1, IRIS for Health 2020.1.1 y HealthShare Health Connect 2020.1.1

Los kits para la instalación y los contenedores se pueden descargar de la página de distribución de software del Centro de Soporte Internacional (WRC).

0
0 174
Artículo Ricardo Paiva · mar 24, 2021 9m read

SWIFT-FHIR-IRIS es una aplicación de iOS para exportar datos de HealthKit a InterSystems IRIS for Health (o a cualquier repositorio FHIR)

Swift-FHIR-Iris

Índice

Objetivo de esta demostración

El objetivo es crear una demostración de extremo a extremo del protocolo FHIR.

Lo que quiero decir con extremo a extremo, es desde una fuente de información como un iPhone. Recoge tus datos médicos en formato Apple (HealthKit), transfórmalos en FHIR y envíalos al repositorio de InterSystems IRIS for Health.

Esta información debe ser accesible a través de una interfaz web.

TL;DR: iPhone -> InterSystems FHIR -> Página web.

Cómo ejecutar esta demostración

Requisitos previos

  • Por la parte del cliente (iOS)
    • Xcode 12
  • Para el servidor y la aplicación web
    • Docker

Instalar Xcode

No hay mucho que decir aquí, abre la AppStore, busca Xcode e instálalo.

Abrir el proyecto SwiftUi

Swift es el lenguaje de programación de Apple para iOS, Mac, Apple TV y Apple Watch. Es el sustituto de objective-C.

Haz doble clic en Swift-FHIR-Iris.xcodeproj

Abre el simulador haciendo clic en la flecha superior izquierda.

xcode

Configurar el simulador

Ve a Health

Haz clic en Steps

Añade los datos

simulador

Lanzar InterSystems FHIR Server

En la carpeta raíz de este git, ejecuta el siguiente comando:

docker-compose up -d

Al finalizar el proceso de desarrollo, podrás conectarte al repositorio FHIR:

http://localhost:32783/fhir/portal/patientlist.html

portal

Este portal fue realizado por @diashenrique.

Con algunas modificaciones para manejar los pasos de Apple.

Jugar con la app de iOS

Primero, la aplicación te pedirá que aceptes compartir cierta información.

Haga clic en Authorize

autorizar

A continuación, puedes probar el servidor FHIR haciendo clic en "Save and test server".

La configuración predeterminada señala la configuración de Docker.

Si todo va bien, puedes introducir la información de tu paciente.

Nombre, apellido, cumpleaños, género.

El paciente se guarda en Fhir. Una ventana emergente te mostrará su ID de Fhir único.

savepatient

Puedes consultar este paciente en el portal:

Ve a: http://localhost:32783/fhir/portal/patientlist.html

Aquí podemos ver que hay un nuevo paciente "Toto" con 0 actividades.

portal de pacientes

Envía sus actividades:

Vuelve a la aplicación iOS y haz clic en Step count

Este panel resume el conteo de pasos de la semana. En nuestro caso hay 2 registros.

Ahora puedes enviarlos a InterSystems IRIS FHIR haciendo clic en Send.

enviar ios

Consulta las nuevas actividades en el portal:

Ahora podemos ver que Toto tiene dos nuevas observaciones y actividades.

portal de actividades

Puedes hacer clic en el botón de Gráfico para mostrar la información gráficamente.

portal de gráficas

Cómo funciona

iOS

La mayor parte de esta demostración está creada en SwiftUI.

https://developer.apple.com/xcode/swiftui/

Que es la framework más reciente para iOS.

Cómo verificar la autorización de los datos médicos

Está en la clase SwiftFhirIrisManager.

Esta clase es una instancia única o singleton y llevará todo lo que está alrededor de la aplicación con la anotación @EnvironmentObject.

Más información en: https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data-between-views

El método requestAuthorization:

    // Request authorization to access HealthKit.
    func requestAuthorization() {
        // Requesting authorization.
        /// - Tag: RequestAuthorization

        let writeDataTypes: Set<HKSampleType> = dataTypesToWrite()
        let readDataTypes: Set<HKObjectType> = dataTypesToRead()

        // requset authorization
        healthStore.requestAuthorization(toShare: writeDataTypes, read: readDataTypes) { (success, error) in
            if !success {
                // Handle the error here.
            } else {

                DispatchQueue.main.async {
                    self.authorizedHK = true
                }

            }
        }
    }

Donde healthStore es el objeto de HKHealthStore().

La HKHealthStore actua como la base de datos de healthdata en iOS.

dataTypesToWrite y dataTypesToRead son los objetos que nos gustaría consultar en la base de datos.

La autorización necesita un propósito y esto se hace en el archivo Info.plist xml al añadir:

    <key>NSHealthClinicalHealthRecordsShareUsageDescription</key>
    <string>Read data for IrisExporter</string>
    <key>NSHealthShareUsageDescription</key>
    <string>Send data to IRIS</string>
    <key>NSHealthUpdateUsageDescription</key>
    <string>Write date for IrisExporter</string>

 

Cómo conectarse al repositorio de FHIR

Para esta parte utilicé el paquete FHIR de Smart-On-FHIR: https://github.com/smart-on-fhir/Swift-FHIR

Utilicé la clase FHIROpenServer.

    private func test() {

        progress = true

        let url = URL(string: self.url)

        swiftIrisManager.fhirServer = FHIROpenServer(baseURL : url! , auth: nil)

        swiftIrisManager.fhirServer.getCapabilityStatement() { FHIRError in

            progress = false
            showingPopup = true

            if FHIRError == nil {
                showingSuccess = true
                textSuccess = "Connected to the fhir repository"
            } else {
                textError = FHIRError?.description ?? "Unknow error"
                showingSuccess = false
            }

            return
        }

    }

Esto crea un nuevo objeto fhirServer en la instancia única swiftIrisManager.

A continuación utilizamos la función getCapabilityStatement()

Si podemos recuperar la capabilityStatement del servidor FHIR, significará que nos conectamos correctamente al repositorio FHIR.

Este repositorio no está en HTTPS, de forma predeterminada apple bloquea este tipo de comunicación.

Para permitir el soporte HTTP, el archivo Info.plist xml se edita de la siguiente forma:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>localhost</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
            </dict>
        </dict>
    </dict>

 

Cómo guardar un paciente en el Repositorio de FHIR

La operación básica es verificar primero si el paciente ya existe en el repositorio

Patient.search(["family": "\(self.lastName)"]).perform(fhirServer)

Esto realiza una búsqueda de pacientes con el mismo apellido.

Aquí podemos imaginar otros escenarios como con Oauth2 y JWT token para unir al patientid con su token. Pero para esta demo, mantenemos las cosas sencillas.

A continuación, si el paciente existe, lo recuperamos; de lo contrario creamos el paciente:

    func createPatient(callback: @escaping (Patient?, Error?) -> Void) {
        // Create the new patient resource
        let patient = Patient.createPatient(given: firstName, family: lastName, dateOfBirth: birthDay, gender: gender)

        patient?.create(fhirServer, callback: { (error) in
            callback(patient, error)
        })
    }

 

Cómo extraer datos del HealthKit

Se realiza consultando el Healthkit Store (HKHealthStore())

Aquí consultamos los pasos.

Prepare la consulta con el predicado.

        //Last week
        let startDate = swiftFhirIrisManager.startDate
        //Now
        let endDate = swiftFhirIrisManager.endDate

        print("Collecting workouts between \(startDate) and \(endDate)")

        let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: HKQueryOptions.strictEndDate)

A continuación, la misma consulta con su tipo de datos (HKQuantityType.quantityType(forIdentifier: .stepCount)) y el predicado.

func queryStepCount(){

        //Last week
        let startDate = swiftFhirIrisManager.startDate
        //Now
        let endDate = swiftFhirIrisManager.endDate

        print("Collecting workouts between \(startDate) and \(endDate)")

        let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: HKQueryOptions.strictEndDate)

        let query = HKSampleQuery(sampleType: HKQuantityType.quantityType(forIdentifier: .stepCount)!, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { (query, results, error) in

            guard let results = results as? [HKQuantitySample] else {
                   return
            }

            process(results, type: .stepCount)

        }

        healthStore.execute(query)

    }

 

Cómo convertir los datos de HealthKit a FHIR

En esta parte, utilizamos el paquete HealthKitToFHIR de Microsoft

https://github.com/microsoft/healthkit-to-fhir

Es un paquete útil que ofrece factories para convertir HKQuantitySample a FHIR Observation

     let observation = try! ObservationFactory().observation(from: item)
      let patientReference = try! Reference(json: ["reference" : "Patient/\(patientId)"])
      observation.category = try! [CodeableConcept(json: [
          "coding": [
            [
              "system": "http://terminology.hl7.org/CodeSystem/observation-category",
              "code": "activity",
              "display": "Activity"
            ]
          ]
      ])]
      observation.subject = patientReference
      observation.status = .final
      print(observation)
      observation.create(self.fhirServer,callback: { (error) in
          if error != nil {
              completion(error)
          }
      })

Donde el elemento es un HKQuantitySample; en nuestro caso es un tipo stepCount.

El factory hace la mayor parte del trabajo de convertir 'unit' y 'type' a FHIR codeableConcept y 'value' a FHIR valueQuantity.

La referencia al patientId se realiza manualmente al emitir una referencia json fhir.

let patientReference = try! Reference(json: ["reference" : "Patient/\(patientId)"])

Lo mismo se hace para la categoría :

      observation.category = try! [CodeableConcept(json: [
          "coding": [
            [
              "system": "http://terminology.hl7.org/CodeSystem/observation-category",
              "code": "activity",
              "display": "Activity"
            ]
          ]
      ])]

Al final, se crea la observación en el repositorio fhir:

      observation.create(self.fhirServer,callback: { (error) in
          if error != nil {
              completion(error)
          }
      })

 

Backend (FHIR)

No hay mucho que decir, se basa en la plantilla fhir de la Comunidad de InterSystems :

https://openexchange.intersystems.com/package/iris-fhir-template

Frontend

Se basa en los trabajos de Henrique, que es un buen front-end para los repositorios FHIR hechos en jquery.

https://openexchange.intersystems.com/package/iris-fhir-portal

 
1
0 246
Artículo Ricardo Paiva · mar 18, 2021 2m read

Demo lista para usar de un servidor FHIR con IRIS for Health 2020.2:

  • Transformación HL7v2 al servidor FHIR
  • Servidor FHIR que se puede consultar en SQL

alt text

### Instalación

Clona este repositorio

git clone https://github.com/grongierisc/FHIR-HL7v2-SQL-Demo.git

Docker

docker-compose up --build -d

Uso

  • Puedes utilizar la configuración de postman en misc/fhirhl7v2demo.postman_collection.json

  • Utiliza UX en http://localhost:4201

  • Inicio de sesión/Contraseña: SuperUser/password

Cómo utilizar la demostración

alt text

3 pasos para utilizarla:

Importar mensajes HL7v2

Haz clic en la flecha izquierda que está entre IRIS y la ambulancia.

Esto abre las siguientes ventanas:

alt text

Desde aquí se pueden importar muestras desde este directorio en el repositorio de Git:

sampleFiles

Elige uno y haz clic en enviar.

alt text

Desde aquí puedes hacer clic en Message Trace:

alt text

Selecciona el primero:

alt text

Aquí puedes ver la transformación preparada entre HL7v2, SDA y FHIR.

Utiliza el cliente FHIR

Haz clic en la flecha entre IRIS y el FHIR client:

alt text

El pequeño swagger te da la oportunidad de consultar en FHIR el repositorio lleno desde el mensaje HL7v2 o desde el FHIR client.

Por ejemplo :

alt text

Utiliza el cliente SQL

Haz clic en la flecha que está entre IRIS y SQL client:

alt text

Desde aquí se pueden ver todos los recursos FHIR en una estructura relacional de SQL. Debe quedar claro que esta estructura SQL puede cambiar sin previo aviso. Dicha estructura no está documentada y su uso no tiene el respaldo de InterSystems.

0
0 309
Artículo Pierre-Yves Duquesnoy · mar 10, 2021 5m read

Con el lanzamiento de PEX en InterSystems IRIS 2020.1 e InterSystems IRIS for Health 2020.1, los clientes tienen una mejor forma de incorporar Java en las producciones que con el Java Business Host. PEX proporciona un completo conjunto de APIs para construir la interoperabilidad de los componentes y está disponible tanto en Java como en .NET. Java Business Host ha sido discontinuado y se retirará en una versión futura.

Ventajas de PEX

  • Permite que los desarrolladores creen cualquier componente de producción tanto en Java como en .NET
  • Se pueden transferir estructuras de mensajes más complejas entre los componentes
  • Configuración simplificada
  • Workflow de desarrollo simplificado, sin necesidad de ObjectScript.

El resto de este artículo se centra en cómo migrar el código existente de Java Business Host a PEX.

Resumen

Las clases y las interfaces que utiliza PEX son diferentes a las de Java Business Host (JBH). Aquí ofrecemos un resumen de las diferencias, pero la documentación recoge toda la información necesaria.

Cómo cambiar un Business Service desde Java Business Host a PEX

Para crear un PEX Business Service, debes implementar com.intersystems.enslib.pex.BusinessService en vez de com.intersystems.gateway.bh.BusinessService.

El patrón de diseño utilizado por PEX para el Business Service ha cambiado de uno en el que se espera que el servicio inicie un subproceso para producir mensajes, a otro en el que el servicio implementa una función que es llamada periódicamente para producir mensajes.

En JBH, tu código se parecería a esto:

  @Override
  public boolean OnInit(Production p) throws Exception {
    production = p;

    if (messageThread == null) {
      Messager messager = new Messager();
      messageThread = new Thread(messager);
      messageThread.start();
    }

    return true;
  }

En PEX, solo necesitas implementar tres funciones:

  public void OnInit() throws Exception {
    // Initialization
    return;
  }

  public Object OnProcessInput(Object messageInput) throws Exception {
    // Here is where you call SendMessage() or SendMessageAsync()

    return null;
  }

  public void OnTearDown() throws Exception {
    // Shut down
    return;
  }

También deberás cambiar la forma en que se utiliza la configuración, se entregan los mensajes y se hace logging. Hablaremos de eso más adelante.

Cómo cambiar una Business Operation desde Java Business Host a PEX

Para crear una PEX Business Operation, debes implementar com.intersystems.enslib.pex.BusinessOperation en vez de com.intersystems.gateway.bh.BusinessOperation.

El patrón de diseño para Business Operations es estructuralmente el mismo entre JBH y PEX, pero han cambiado los parámetros a dos puntos de acceso principales.

Cambios en OnInit()

En PEX, OnInit() no requiere de ningún parámetro.

Cambios en OnMessage()

En PEX, OnMessage() recibe un Object genérico en vez del String usado en JBH. Esto permite al autor de la producción transmitir cualquier tipo de mensaje que desee.

En JBH, tu aplicación pudo haber tenido este aspecto:

  public boolean OnMessage(String message) throws Exception {
    // Business logic here
    return true;
  }

En PEX, el parámetro es un Java Objetct genérico, que se debe lanzar de forma adecuada, lo que permite transmitir mensajes más complejos que únicamente cadenas. Este es un ejemplo de cómo extraer una solicitud que es una secuencia de archivos:

  public Object OnMessage(Object request) throws Exception {
    com.intersystems.jdbc.IRISObject streamContainer = (com.intersystems.jdbc.IRISObject)request;
    com.intersystems.jdbc.IRISObject str = (com.intersystems.jdbc.IRISObject)streamContainer.get("Stream");
    String originalFilename = (String)streamContainer.get("OriginalFilename");

    Long contentSize = (Long)str.get("Size");
    String content = (String)str.invoke("Read", contentSize);

    // Business logic here

    return null;
  }

También deberás cambiar la forma en que se utiliza la configuración, se entregan los mensajes y se hace logging. Hablaremos de eso más adelante.

Configuración

Se ha simplificado la declaración de la configuración.

La configuración en JBH se declaraba mediante una cadena SETTINGS y se obtenía a través de un código que se parece a algo como esto:

  String setting = production.GetSetting("Min");
  if (!setting.isEmpty()) {
    min = Integer.parseInt(setting);
  }

En PEX, la configuración son solo campos para miembros públicos. Estos se completan automáticamente cuando la clase crea una instancia.

  public int Min = 0;

Cualquier campo de un miembro público está disponible para que se establezca en una producción, en la medida en que el campo del miembro sea de un tipo básico de Java (String, int, etc.).

Mensajes

El envío de mensajes es más potente. En JBH, los mensajes se envían como cadenas. En PEX, los mensajes se envían como objetos- IRISObject, para objetos definidos en ObjectScript, o una subclase de com.intersystems.enslib.pex.Message, para clases definidas en Java.

En JBH, tu código se parecería a esto:

  production.SendRequest(value.toString());

En PEX, sería algo como esto:

  MyExampleMessageClass req = new MyExampleMessageClass("message to send"); 
  SendRequestAsync(Target, req);

Logging

Todas las funciones de logging son similares, solo que se nombran de manera diferente.

En PEX, se registraría un mensaje informativo a través de LOGINFO()

  LOGINFO("Received message");

Object Gateway

JBH necesitaba su propio portal. Con PEX, puedes utilizar un único portal de Java para todas tus necesidades de Java. O puedes utilizar varios portales. Depende de ti. Aquí encontrarás una buena introducción al portal de Java.

Conclusión y comentarios

Si aún no has probado PEX, ¿a qué está esperando? PEX permite resolver un conjunto mucho más amplio de problemas empresariales con menos código, además de que ahora también puedes hacer cualquier cosa en .NET.

Si tienes salguna pregunta o problema para migrar tu aplicación de JBH a PEX, puedes contactar conmigo o con el Centro de Soporte Internacional (WRC).

1
0 137
Artículo Alberto Fuentes · mar 2, 2021 1m read

Si os habéis pasado de Studio a VSCode recientemente tal vez os hayáis dado cuenta de que en el Explorador faltan algunos elementos. Por ejemplo, cuando se crea una API REST a partir de sus especificaciones, se generan 3 clases: <api>.impl, <api>.disp y <api>.spec, sin embargo la clase <api>.disp no se muestra por defecto en el Explorador.

Como la clase <api>.disp es una clase generada, para mostrarla tendremos que activar la opción correspondiente haciendo click en en el Explorador:

En ese mismo lugar también encontraremos una opción para mostrar los elementos de sistema.

0
0 96
Artículo Ricardo Paiva · feb 25, 2021 4m read

Nota (junio de 2019): han cambiado muchas cosas para obtener los detalles más recientes, haz clic aquíNota (septiembre de 2018): ha habido grandes cambios desde que esta publicación apareció por primera vez; sugiero que utilices la versión del contenedor en Docker dado que el proyecto y la información para que se ejecute como un contenedor sigue publicada en GitHub, en el mismo lugar, para que puedas descargarlo, ejecutarlo y modificarlo, si lo necesitas.

Cuando trabajo con clientes en revisiones de rendimiento, planificaciones de capacidad y resolución de problemas, con frecuencia tengo que descomprimir y revisar las métricas del sistema operativo y de caché desde pButtons. En vez de lidiar con los archivos html para cortar y pegar secciones que serán graficadas en Excel, hace algún tiempo escribí una publicación sobre una herramienta para descomprimir las métricas de pButtons, escrita con el intérprete de unix, perl y los scripts de awk. Si bien este es un valioso ahorro de tiempo, no es la historia completa…

También utilizo scripts para realizar automáticamente gráficos de las métricas, para revisiones rápidas y para inconporarlos a informes. Sin embargo, estos gráficos realizados con scripts no se mantienen fácilmente y se vuelven especialmente confusos cuando se necesita una configuración específica del sitio, por ejemplo, una lista de discos para iostat o windows perfmon. Por eso, nunca publiqué las herramientas para hacer gráficos. Pero estoy muy contento de anunciar que ahora existe una solución mucho más sencilla.

El descubrimiento fortuito ocurrió cuando estaba en las instalaciones de un cliente observando el rendimiento del sistema con Fabian, y él me mostró lo que hacía para utilizar ciertos módulos de Python para realizar gráficos. Esta es una solución mucho más flexible y fácil de mantener que los scripts que utilizaba. Y la facilidad de integrar los módulos de Python para administrar archivos y gráficos, incluyendo la posibilidad de compartir el html interactivo, significa que el resultado puede ser mucho más útil. Al tomar las publicaciones de Fabian como base, escribí Yape para extraer de forma rápida y sencilla, y luego hacer gráficos de los archivos pButtons de los clientes, en varios formatos. El proyecto se publicó en GitHub para que puedas descargarlo, ejecutarlo y modificarlo, si lo necesitas.

Resumen

Actualmente, este proceso consiste en dos pasos.

Paso 1. extract_pButtons.py

Extrae las secciones de interés desde pButtons, y escríbelas en archivos de tipo .csv para abrirlos con Excel o para que se procesen con gráficos utilizando graph_pButtons.py.

Paso 2. graph_pButtons.py

Los archivos de gráficos se crearon en el Paso 1. Actualmente las salidas pueden ser gráficas de líneas o de puntos que se representan como .png o .html interactivos e incluyen opciones de vista panorámica, zoom, impresión, etc.

Readme.md en GitHub tiene especificaciones sobre cómo configurar y ejecutar los dos scripts de Python, y será la referencia más reciente.

Notas adicionales

Por ejemplo: si utilizas las opciones para agregar prefijos a los directorios de entrada y salida, podrás examinar fácilmente un directorio con un conjunto de archivos pButtons de html (por ejemplo, semanas) y enviarlos a un directorio separado para cada archivo pButtons.

for i in `ls *.html`; do ./extract_pButtons.py $i -p ${i}_; done

for i in `ls *.html`; do ./graph_pButtons.py ./${i}_metrics -p ${i}_; done

A corto plazo, mientras continúo con la serie sobre cómo planificar y aumentar rendimiento de la plataforma de datos InterSystems IRIS, utilizaré los gráficos creados con estas herramientas.

Lo probé en OS X, pero no en Windows. No debería tener ningún problema para instalar y ejecutar Python en Windows. Supongo que necesitarás realizar algunos cambios en las barras que se encuentran en la ruta de un archivo. Deja tus comentarios si lo pruebas.

Nota: hasta hace unas semanas nunca había escrito nada en Python, así que si es un experto en este lenguaje, posiblemente te darás cuenta de que algunas partes del código no siguen las prácticas recomendadas. Sin embargo, utilizo los scripts casi todos los días, por lo que seguiré mejorándolos. Espero perfeccionar mis habilidades en Python, ¡pero siéntete libre de “educarme” si ves algo que debería corregirse!

Si descubres que los scripts te resultan útiles, házmelo saber y vuelve con frecuencia para obtener nuevas características y actualizaciones.

0
0 116
Anuncio Esther Sanchez · feb 25, 2021

¡Hola desarroladores!

Os traemos el noveno episodio de Data Points, el podcast de InterSystems en inglés.

Es la segunda parte de la entrevista con @Russell.Leftwich. En ella, @Adam.Coppola6950charla con Russ sobre algunas de las tecnologías de InterSystems que desempeñan un papel en los conceptos comentados en la parte 1 y también comentan las aplicaciones más modernas de FHIR.

Tras la entrevista con Russ, se une a la charla @Jenny Ames, para hablar sobre los FHIR Dev Days, el evento sobre FHIR más importante del mundo. ¡Dadle al play!

0
0 105
Artículo Alberto Fuentes · feb 23, 2021 2m read

Hola a todos! Os comparto hoy un artículo sobre la utilización del procesamiento de lenguaje natural y su combinación con FHIR donde se muestra un chatbot que interactúa con FHIR desarrollado por Renato Banzai.

¿Qué significa PLN?

PLN significa Procesamiento del Lenguaje Natural (NLP en inglés) y es un campo de la Inteligencia Artificial muy complejo que utiliza técnicas para, en pocas palabras, “entender de qué se está hablando”.

¿Y qué es FHIR?

FHIR significa Fast Healthcare Interoperability Resources y es un estándar que describe estructuras de datos y operaciones que puedes realizar sobre ellas en aplicaciones de salud. En la Comunidad de Desarrolladores hay varios artículos que explican mejor cómo interactúa FHIR con InterSystems IRIS. Aquí incluso publicamos un Webinar: Comienza a Trabajar con FHIR

imagen

Un chatbot para consultar FHIR

El método más común en los chatbots es utilizar machine learning para enseñar al modelo a través de conversaciones de entrenamiento. Pero cuando el chatbot necesita utilizar información en tiempo real, el desafío es mayor. Si conoces cómo funciona un modelo de machine learning, ya sabes que en la mayoría de los casos el modelo entrenado es una especie de aplicación con todas las decisiones integradas en su interior. Si necesitas más información sin tener que enseñar nuevamente al modelo, tendrás que crear tú mismo las integraciones y dedicar una parte de tu esfuerzo al "machine learning" y otra parte a la ingeniería del software.

Primera aproximación

Para mostrar mejor cómo funciona FHIR en esta aplicación se decidió trabajar primero en las preguntas que un profesional sanitario podría hacerle a un chatbot. Para ello, se hizo que la ingeniería del software fuera sencilla utilizando solamente javascript y expresiones regulares con las que se buscan objetivos y estructuras en el chat.

Recordad que en la Comunidad también publicamos otro contenido con un ejemplo de chatbot donde se utilizaban otras alternativas: Webinar: Desarrolla un chatbot con Google Dialogflow, Telegram e IRIS.

Expresiones regulares

imagen

Las expresiones regulares son una forma muy potente de trabajar con textos y de buscar coincidencias en los patrones. Con las expresiones regulares puedo buscar cuál es el paciente sobre el que quiere tener información la persona que está chateando y qué pregunta o historial médico desea consultar.

0
0 200
Artículo Ricardo Paiva · feb 19, 2021 7m read

Si está buscando una forma ingeniosa para integrar su solución de IRIS en el ecosistema de Amazon Web Services, en una aplicación sin servidor o en Boto3 (un potente script de Python), usar la API nativa de IRIS para Python podría ser el camino a seguir. No es necesario que invierta demasiado tiempo en la implementación de una producción hasta que deba acercarse y obtener algo o establecer algo en IRIS para hacer que su aplicación ejecute su característica más sobresaliente, así que esperamos este artículo sea útil y desarrolle algo aunque solamente usted pueda usarlo, ya que eso también es importante.

imagen

Si necesita algunas excusas para implementarla, utilice las siguientes:

  • Debe cargar el Activador que generará previamente los tokens en Cognito para buscar y completar el contexto de la identificación del paciente en el token. Esto con la finalidad de utilizar una solución basada en SMART on FHIR(R), la cual implementará un flujo de trabajo en OAUTH2.
  • Quiere publicar el suministro de la configuración para los parámetros en IRIS que se basa en el tipo de instancia, grupo de nodo, Toaster o el clúster ECS que inició para ejecutar IRIS en el anillo cero.
  • Quiere impresionar a su familia y amigos en Zoom con sus habilidades para administrar IRIS sin que su shell tenga que abandonar la CLI de AWS.

Lo más importante

Aquí proporcionamos una función lambda de AWS que se comunica con IRIS y brindaremos algunos ejemplos sobre cómo utilizarla, además indicaremos cómo podemos interactuar con ella en varias funciones con la esperanza de que todos podamos discutir sobre ella y publicarla en pip para facilitar las cosas.

¿¿¿¿Tiene problemas????

imagen

Consulte el Stream

<iframe width="560" height="315" src="https://www.youtube.com/embed/mA0VzKOYhBk" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen mark="crwd-mark"></iframe>

En todos los casos...

Para participar en la diversión, necesitará eliminar algunas cosas de sus planes.

Interconexión

Tiene a IRIS ejecutándose en cualquier lugar que desee, funcionando en una AWS VPC con exactamente dos subredes y un grupo de seguridad que permite el acceso al super servidor que inicia IRIS... utilizamos 1972 por razones nostálgicas y por el simple hecho de que InterSystems se tomó el tiempo para registrar ese puerto con IANA, y si agrega el nuevo puerto en /etc/services sin registrarlo, sufrirá las mismas consecuencias que si arrancara la etiqueta de un colchón nuevo. En nuestro caso, es un conjunto de réplicas de las instancias EC2 con las comprobaciones de estado adecuadas en torno a un balanceador de carga para la red AWS v2.

imagen

Ejemplo de una clase importada

De alguna forma consiguió crear e importar la clase a en la raíz de este repositorio con el namespace %SYS en su instancia de IRIS. A continuación, se muestra el ejemplo de una clase que impulsa la salida anterior. Si se pregunta por qué necesitamos una clase para importar aquí, consulte la siguiente nota donde el enfoque recomendado es proporcionar algunas clases envolventes para utilizarlas con Python.

Nota de los documentos: Aunque estos métodos también pueden utilizarse con las clases que se definieron en la Biblioteca de clases de InterSystems, una de las prácticas recomendadas consiste en llamarlos indirectamente, desde el interior de una clase o rutina definida por el usuario. Muchos métodos de clase devuelven solo un código de estado, y transmiten los resultados reales a un argumento (al que no es posible acceder por la API nativa). Las funciones definidas por el sistema (incluidas como parte de las Funciones de ObjectScript en la Referencia de ObjectScript) no pueden llamarse directamente.

Ejemplo de la clase:

Class ZDEMO.IRIS.Lambda.Operations Extends %Persistent
{
  ClassMethod Version() As %String
  {
   Set tSC = 0

   Set tVersion = $ZV
   if ( tVersion '="" ) { set tSC = $$$OK }

   Set jsonret = {}
   Set jsonret.status = tSC
   Set jsonret.payload = tVersion

   Quit jsonret.%ToJSON()
  }
}

Tenga en cuenta que decidí trabajar según lo establecido en los métodos, de modo que siempre emite un objeto JSON como respuesta, lo cual también me permite enviar el estado y posiblemente subsanar las deficiencias que implica devolver algunas cosas como referencia.

AWS Access

Obtenga algunas claves de acceso IAM que le permitirán suministrar e invocar la función Lambda con la que cambiaremos el mundo.

Comprobación previa:

IRIS            [ $$$OK ]  
VPC             [ $$$OK ]  
Subnets         [ $$$OK ]  
Security Group  [ $$$OK ]  
IAM Access      [ $$$OK ]  
Imported Class  [ $$$OK ]  

$$$OK, Lesgo.

Empaquetar la API nativa de IRIS para Python con el fin de utilizarla en la función Lambda

Esta parte sería fantástica si fuera un paquete pip, especialmente si solo es para Linux, ya que las funciones Lambda de AWS se ejecutan en Linux Boxen. Cuando realizamos esta asignación la API no estaba disponible por medio de pip, pero somos hábiles y podemos lanzar nuestro propio paquete.

mkdir iris_native_lambda
cd iris_native_lambda
wget https://github.com/intersystems/quickstarts-python/raw/master/Solutions/nativeAPI_wheel/irisnative-1.0.0-cp34-abi3-linux_x86_64.whl
unzip nativeAPI_wheel/irisnative-1.0.0-cp34-abi3-linux_x86_64.whl

A continuación, cree connection.config

Por ejemplo: connection.config

Cree su controlador, index.py o utilice el que se encuentra en la carpeta de ejemplos, en el repositorio con demostraciones de GitHub. Tenga en cuenta que la versión de demostración utiliza tanto variables de entorno como un archivo externo para guardar la información de conectividad de IRIS.

Por ejemplo:
index.py

Ahora comprímalo para utilizarlo:

zip -r9 ../iris_native_lambda.zip *

Cree un bucket S3, y cargue la función zip en él.

cd ..
aws s3 mb s3://iris-native-bucket
s3 sync iris_native_lambda.zip s3://iris-native-bucket  

Con esto concluye el empaquetado de la API y el controlador para utilizarlos como una función Lambda de AWS.

Ahora, haga clic hasta que la consola termine para crear la función, o utilice algo como Cloudformation para realizar el trabajo:

  IRISAPIFunction:
    Type: "AWS::Lambda::Function"
    DependsOn:
      - IRISSG
      - VPC
    Properties:
      Environment:
        Variables:
          IRISHOST: "172.31.0.10"
          IRISPORT: "1972"
          NAMESPACE: "%SYS"
          USERNAME: "intersystems"
          PASSWORD: "lovetheyneighbor"
      Code:
        S3Bucket: iris-native-bucket
        S3Key: iris_native_lambda.zip
      Description: "IRIS Native Python API Function"
      FunctionName: iris-native-lambda
      Handler: "index.lambda_handler"
      MemorySize: 128
      Role: "arn:aws:iam::8675309:role/BeKindtoOneAnother"
      Runtime: "python3.7"
      Timeout: 30
      VpcConfig:
        SubnetIds:
          - !GetAtt
            - SubnetPrivate1
            - Outputs.SubnetId
          - !GetAtt
            - SubnetPrivate2
            - Outputs.SubnetId
        SecurityGroupIds:
          - !Ref IRISSG

Eso fue MUCHO, pero ahora puede volverse loco, llamar a IRIS mediante la función lambda con Python y cambiar el mundo.

¡Vamos a iniciarlo!

De la forma en que se implementó lo anterior, se espera que la función sea aprobada en un evento del objeto que esté menos estructurado para reutilizarlo, puede ver la idea en el ejemplo para el evento del objeto que se muestra a continuación:

    {
      "method": "Version",
      # important, if method requires no args, enforce "none"
      "args": "none"
      # example method with args, comma seperated
      # "args": "thing1, thing2"
    }

ahora puede hacerlo, si tiene cierta tolerancia para los ejemplos de la línea de comandos, eche un vistazo en la ejecución que se muestra a continuación utilizando la CLI de AWS:

(base) sween @ basenube-pop-os ~/Desktop/BASENUBE
└─ $ &#x25b6; aws lambda invoke --function-name iris-native-lambda --payload '{"method":"Version","args":"none"}' --invocation-type RequestResponse --cli-binary-format raw-in-base64-out --region us-east-2 --profile default /dev/stdout
{{\"status\":1,\"payload\":\"IRIS for UNIX (Red Hat Enterprise Linux for x86-64) 2020.2 (Build 210U) Thu Jun 4 2020 15:48:46 EDT\"}"
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}

Ahora bien, si vamos un poco más lejos, la CLI de AWS admite alias, así que cree uno y podrá jugar integrando completamente su increíble comando con AWS. Este es un ejemplo del alias para la CLI:

└─ $ &#x25b6; cat ~/.aws/cli/alias 
[toplevel]
whoami = sts get-caller-identity

iris = 
  !f() {
   aws lambda invoke \
     --function-name iris-native-lambda \
     --payload \
     "{\"method\":\""${1}"\",\"args\":\"none\"}" \
     --invocation-type RequestResponse \
     --log-type None \
     --cli-binary-format raw-in-base64-out \
     gar.json > /dev/null
     cat gar.json 
     echo
     echo
  }; f

....y ahora puede hacerlo...
imagen

¡Manténgase a salvo!~ ¡Todos los argumentos técnicos son bienvenidos!

0
0 243
Artículo Alberto Fuentes · ene 28, 2021 2m read

Hola a todos! 

Comparto una pequeña utilidad (servicio REST) para descargar mensajes de una producción de interoperabilidad como ficheros.

Sólo necesitas:

  1. Crear una aplicación web en el Portal de Gestión (e.g. /downloadmsg) que tenga configurado DispatchClass=Util.DownloadMsg.
  2. Llamar a la utilidad pasándole el namespace y el identificador de cabecera del mensaje a descargar. http://localhost:52773/downloadmsg/ns/dev/msgid/17441
/// 
/// Util to download messages given a message header id
/// 
/// Setup:
/// 1. Create a webapplication (e.g. /downloadmsg) and set DispatchClass=Util.DownloadMsg
/// 2. Go to http://localhost:52773/downloadmsg/ns/user/msgid/19 to download the message reference by header 19
Class Util.DownloadMsg Extends %CSP.REST
{

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
    <Route Url="/ns/:ns/msgid/:msgId" Method="GET" Call="DownloadMessage"/>
</Routes>
}

/// Download a message given a Ens.MessageHeader id
ClassMethod DownloadMessage(ns As %String, msgId As %String = "") As %Status
{
    set ret = $$$OK
    set currentNs = $namespace

    try {
        set $namespace = ns
        $$$ThrowOnError(..ExportMsgToStream(msgId, .stream, .filename))

        // set headers to download stream as filename
        do %response.SetHeader("Content-Type", "application/octet-stream")
        do %response.SetHeader("Content-Disposition", "attachment; filename="""_filename_"""")
        do %response.SetHeader("Content-Length", stream.Size)
        do stream.Rewind()
        do stream.OutputToDevice()

    } catch ex {
        set ret = ex.AsStatus()
    }

    // restore namespace
    set $namespace = currentNs

    quit ret
}

/// Export a message to stream given a Ens.MessageHeader id
ClassMethod ExportMsgToStream(msgId As %String, Output stream As %Stream.Object, Output filename As %String) As %Status
{
    set ret = $$$OK
    try {
        // stream
        set stream = ##class(%Stream.GlobalCharacter).%New()
        set filename = ""

        // message header
        set headerObj = ##class(Ens.MessageHeader).%OpenId(msgId,,.sc)
        $$$ThrowOnError(sc)

        // message body
        set obj = $classmethod(headerObj.MessageBodyClassName, "%OpenId", headerObj.MessageBodyId)
        set classname = $classname(obj) 

        // output to stream
		if classname="EnsLib.HL7.Message" {
			set sc = $method(obj, "OutputToLibraryStream", .stream)
			$$$ThrowOnError(sc)
			set filename = msgId_".hl7"
		}
		else {
			set writer = ##class(%XML.Writer).%New()
			set writer.Indent=1
			set writer.NoXMLDeclaration=1
			$$$ThrowOnError(writer.OutputToStream(.stream))
			$$$ThrowOnError(writer.RootObject(obj))
			set filename = msgId_".xml"
		}
    } catch ex {
        set ret = ex.AsStatus()
    }
    quit ret
}

}
2
0 196
InterSystems Official Mario Sanchez Macias · feb 16, 2021

11 de febrero, 2021 – Aviso: Resultados de búsqueda incompletos con ‘ORDER BY <row ID field> DESC’

InterSystems ha corregido un fallo que puede producir resultados de búsquedas incompletos. Este fallo afecta a:

  • InterSystems IRIS e InterSystems IRIS for Health 2019.1.0, 2019.1.1, 2019.2, 2019.3, 2019.4, 2020.1.0, 2020.2 y 2020.3
  • HealthShare Health Connect 2019.1.0, 2019.1.1, 2020.1.0
  • HealthShare Products 2019.2, 2020.1 and 2020.2
0
0 91
Artículo Nancy Martínez · feb 2, 2021 3m read

¿Qué es OData?

OData (Open Data Protocol) es un estándar OASIS, con certificación ISO/IEC, que define un conjunto de prácticas recomendadas para construir y consumir APIs RESTful. OData te ayuda a enfocarte en tu lógica de negocio mientras construyes APIs RESTful, sin tener que preocuparte por los diversos enfoques para definir cabeceras de solicitud y respuesta, códigos de estado, métodos HTTP, convenciones URL, tipos de medios audiovisuales, formatos de carga, opciones de consulta, etc. OData también proporciona orientación para registrar cambios, definir funciones/acciones para llevar a cabo procedimientos reutilizables y enviar solicitudes asíncronas/por lotes (Fuente: OData.org).

0
0 194
Artículo Nancy Martínez · dic 10, 2020 5m read

Los sistemas de bases de datos tienen requisitos muy específicos para las copias de seguridad ("backups") que, en entornos empresariales, necesitan una previsión y planificación. En el caso de los sistemas de bases de datos, el objetivo de una copia de seguridad es crear una copia de los datos en un estado equivalente a cuando la aplicación se apaga de forma correcta. Las copias de seguridad consistentes con las aplicaciones cumplen estos requisitos, y Caché ofrece un conjunto de APIs que facilitan la integración con soluciones externas para lograr este nivel de consistencia en las copias de seguridad.

0
0 144
Anuncio Esther Sanchez · nov 17, 2020

¡Hola Comunidad!

El plazo para participar en el Séptimo concurso para desarrolladores de InterSystems ya ha terminado y empieza la fase de votación.

Hemos recibido 9 aplicaciones, así que ya puedes elegir la mejor solución de Interoperabilidad desarrollada con InterSystems IRIS!

 
¿Cómo se vota?

0
0 92
InterSystems Official David Reche · oct 23, 2020

Ya está liberada la versión 2020.3 de InterSystems IRIS e IRIS for Health, con IntegratedML.

Esta es la primera versión de InterSystems IRIS que incluye IntegratedML, una nueva funcionalidad de la plataforma de datos que ofrece a analistas y desarrolladores el mejor "machine learning" del mercado, con una sencilla e intuitiva sintaxis SQL. Ahora, los desarrolladores pueden crear, probar e implementar potentes modelos desde IRIS, justo donde se encuentran sus datos.

0
0 125
InterSystems Official Jose-Tomas Salvador · oct 21, 2020

¡Hola desarrolladores!

Una vez más os vengo a hablar de la extensión de ObjectScript para Visual Studio Code, y esta vez estamos muy contentos de poder anunciar ¡ la liberación de la versión 1.0 !

La comunidad se ha unido de un modo sin precedentes para entregar este producto con InterSystems, con la particularidad única de que una herramienta tan crítica para la productividad del desarrollador sería contruida en base a pruebas, feedback y código de la comunidad, desde el principio.

Novedades

0
0 173
Artículo Mathew Lambert · oct 14, 2020 1m read

Esto lo escribo más para ayudar a mi memoria que para otra cosa. Pensé en compartirlo, porque a menudo aparece en los comentarios, pero no está en la documentación de InterSystems

Hay una utilidad increíble que se llama ^REDEBUG, que aumenta el nivel de información que se registra en mgr\cconsole.log. 

Para activarla:

a) inicia el terminal/login

b) zn "%SYS"

c) do ^REDEBUG

d) cambia el nivel de registro a FFFFFFFF

0
0 154
InterSystems Official David Reche · oct 7, 2020

La versión 2020.3 de InterSystems IRIS, IRIS for Health e IRIS Studio ya ha sido liberadas.

Los contenedores para estos productos están disponibles en la página de distribución de software, del Centro de Soporte Internacional (WRC), incluyendo las ediciones "community" de InterSystems IRIS e IRIS for Health. Además, todos los contenedores también están disponibles desde el nuevo Registro de Contenedores de InterSystems. En este artículo os explicamos cómo usar el registro.

El número de compilación de estas versiones es 2020.3.0.221.0.

0
0 127
InterSystems Official Eduardo Anglada · sep 4, 2020

¡Hola desarrolladores!

Es un placer anunciar la disponibilidad del Registro de Contenedores de InterSystems. Es un nuevo canal para que los clientes tengan acceso a las versiones finales y de prueba de software, en formato apto para contenedores. Todas las imágenes Community Edition están disponibles en un repositorio público que no necesita autenticación. Las imágenes finales (IRIS, IRIS for Health, Health Connect, System Alerting and Monitoring, InterSystems Cloud Manager) y las utilidades (como pueden ser arbiter, Web Gateway y PasswordHash) requieren un token de autenticación que se genera a partir de las credenciales de la cuenta del WRC.

0
0 159