#InterSystems IRIS for Health

0 Followers · 2.3K Posts

InterSystems IRIS for Health™ is the world’s first and only data platform engineered specifically for the rapid development of healthcare applications to manage the world’s most critical data. It includes powerful out-of-the-box features: transaction processing and analytics, an extensible healthcare data model, FHIR-based solution development, support for healthcare interoperability standards, and more. All enabling developers to realize value and build breakthrough applications, fast. Learn more.

Question Oliver Wilms · Jun 25, 2020

Hello,

I am using a class based on %UnitTest.TestProduction to test Health Connect production.

I read in Class Reference IRIS for UNIX 2020.1:

Note: This class is not intended to be used in InterSystems IRIS instances.

Why should this not be used in IRIS? I have not seen any difference using this with HealthConnect 2017 or IRIS 2020.1

1
0 300
Question David Foard · Nov 15, 2019

Prior to IRIS, using ECP to share databases under heavy I/O load has known latency issues (in our environment), which pretty much restricted using shared database with relatively static or slow-changing data. In IRIS, will sharding mitigate the latency issue and allow any table to be shared?

David

2
0 322
Announcement Anastasia Dyubaylo · Jul 9, 2020

Hi Community,

We're pleased to invite you to join the upcoming "How Technology Supports Patient Adherence to Specialty Medicines" webinar on July 15 at 12:00 PM EDT!

Join a team from RxMx to learn how its Chameleon platform – built on InterSystems IRIS for Health – helps clinicians who are administering new specialty medicines to their patients, meet the needs of this industry. 

 

Join this webinar to learn:

1
0 284
Question David Foard · Jun 12, 2020

I have a couple of questions regarding /api/monitor and configuring it to use with SAM. In our environment we only expose port 443, so even though I define the Web Application to use unauthenticated, SAM is unable to make a connection. Is there any alternatives to get this working?

Also, even if  there is a way to configure using port 443, unauthenticated access will never fly in our environment. Are there any plans to enhance SAM so it you use OAuth or even mutual TLS?

Dave

2
0 344
Question Elisha Gould · May 26, 2020

Hi,

We are using IRIS, and have some systems that we send data to that cannot accept messages with certain fields larger than a particular size.

Is there any way to utilize the schema to truncate any fields that are larger than the entered data?

I've tried just setting the max lengths and doing the transform, but it puts in the entire string, and can't find a topic for it.

There are a large number of fields that need to be truncated, so it would be ideal to get it to respect the hl7 schema maximum lengths.

ie for the XPN name fields, each name may not be larger than 20 characters.  

so the name:

5
1 696
InterSystems Official Steven LeBlanc · May 13, 2020

AWS has officially released their second-generation Arm-based Graviton2 processors and associated Amazon EC2 M6g instance type, which boasts up to 40% better price performance over current generation Intel Xeon based M5 instances. 

A few months ago, InterSystems participated in the M6g preview program, and we ran a few benchmarks with InterSystems IRIS that showed compelling results. This led us to support ARM64 architectures for the first time.

Now you can try InterSystems IRIS and InterSystems IRIS for Health on Graviton2-based Amazon EC2 M6g instances for yourselves through the AWS Marketplace!

2
0 944
Question Craig Regester · Jun 17, 2020

Good day all -

I am attempting to use the Data Transformation Builder (for ease of use for my other engineers) to build up a web service request object to send to an outbound operation. The source is a custom persistent class (extends Ens.Response, %JSON.Adaptor) and has serialized sub-class data elements and the request object is a custom persistent class (extends Ens.Request, %JSON.Adaptor.)

5
0 612
Question Jonathan Anglin · Jun 18, 2020

I have a code tag that performs some logic in a DTL, and want to add to it the ability to find the number of substrings delimited by a dollar sign ($) within a particular string. I have tried the following which compiles just fine, but generates an error when testing in the Data Transformation Builder.

set lineCount = $DCOUNT(reportBody,"$")

ERROR <Ens>ErrException: <SUBSCRIPT>zTransform+985^LH.IAMON.IAMONORU1XsformDTC2.1 *DCOUNT() Encoded subscript 1 > 511 bytes -- logged as '-' number - @' set lineCount = DCOUNT(reportBody,"$")'

3
0 915
Announcement Anastasia Dyubaylo · Jun 17, 2020

Hey Developers,

We're pleased to invite you to join the next InterSystems IRIS 2020.1 Tech Talk: Using InterSystems Managed FHIR Service in the AWS Cloud on June 30 at 10:00 AM EDT! 

In this InterSystems IRIS 2020.1 Tech Talk, we’ll focus on using InterSystems Managed FHIR Service in the AWS Cloud. We’ll start with an overview of FHIR, which stands for Fast Healthcare Interoperability Resources, and is a next generation standards framework for working with healthcare data. 

You'll learn how to:

  • provision the InterSystems IRIS FHIR server in the cloud;
  • integrate your own data with the FHIR server;
  • use SMART on FHIR applications and enterprise identity, such as Active Directory, with the FHIR server.

We will discuss an API-first development approach using the InterSystems IRIS FHIR server. Plus, we’ll cover the scalability, availability, security, regulatory, and compliance requirements that using InterSystems FHIR as a managed service in the AWS Cloud can help you address.

       

0
0 457
Article Yuri Marx · Jun 8, 2020 3m read

About regulations

Personal data privacy regulations have become an indispensable requirement for projects dealing with personal data. The compliance with these laws is based on 4 principles:

  1. Compliance with the rights of the holder of personal data;
  2. Governance of personal data assets;
  3. Privacy by Design and by Default;
  4. Data protection.

In case of violation in the treatment of personal data, controllers and operators of these data may suffer:

0
2 445
Article Renato Banzai · Jun 2, 2020 4m read

picture

Globals as a Graph Data Structure in Python

How to use the IRIS Native API + Python to see globals as a Graph Network Chart.

Iris Globals

Reading the documentation these topics are related to globals:

  • A global consists of a set of nodes (in some cases, only one node), identified by subscripts.
  • Each node can contain a value.
  • ObjectScript includes functions to iterate through the nodes of a global and quickly access values.
  • A global is automatically stored in the database. When you assign a value to a node of a global variable, the data is written immediately to the database. - You can see the contents of a global via an ObjectScript command or via the Management Portal.

A Python Way to See Globals

As one of representations of globals can be a Graph Data Structure there are some modules in Python that can transform these globals in a visualizable graph.

The Chart Application

Demo - Try it yourself

I have deployed the application as a demo here, my IRIS Database has one global to test ^computer: (http://iris-python-suite.eastus.cloudapp.azure.com/global-chart)

Into the code

Clone my repository to see all the code implementation.

$ git clone https://github.com/renatobanzai/iris-python-covid19.git

What did I use in Python

In this application environment I use Python 3.7 with these modules.

  • PyYAML==5.3.1
  • dash==1.12.0
  • plotly==4.7.1
  • networkx==2.4
  • numpy==1.18.4
  • dash-bootstrap-components==0.10.1
  • irisnative-1.0.0-cp34-abi3-linux_x86_64.whl

Project Structure

This project has a simple structure to be easy to understand. On the main folder we have 3 most important subfolders:

  • ./app: with all the application code and installing configuration.
  • ./iris: with the InterSystems IRIS dockerfile preparing to serve the application.
  • ./data: with the files from Johns Hopkins University to ingest and a YAML to change configuration outside the container environment by a volume

Application Structure

Now inside the ./app directory we can see some files:

  • __main__.py : with the implementation of the web application
  • iris_python_suite.py : a class performing all data transformation to convert the globals into a networkx graph.

Database Structure

This application uses Intersystems IRIS as a repository, the globals used are:

-^computer : A global to test the graph. If you want, you can test with all other globals default in the USER Namespace.

There are some other globals created by the application that can be used as a test too:

-^config : with some config data -^raw.covid19 : where the raw data (Source of Data) are ingested -^countrydetails : to get the population of each country -^end.date.deaths : to serve the chart requisitions and here is the goal, Its fast! -^end.timeless.deaths : to server another kind of chart requisition

App Structure

iris_python_suite.py: Inside this file are 2 classes that makes the job:

  • irisdomestic: Has the same features of irisnative + creates instances of irisglobalchart, irisglobal, etc (factory pattern)
  • irisglobalchart: Make a recursive track into the global, converting all the data in a Graph Networkx.

Why do I need to convert the Graph into a Networkx Object?

If are you asking yourself, the module networkx has a function position nodes using Fruchterman-Reingold force-directed algorithm.

Algorithm Fruch... WHAT?

As a graph can have any shape is too hard to represent it in a generic way. This is on algorithm to represent graphs without a lot of confusion.

The line that perform the use of this algorithm is on python_suite_global.py:

    def get_fig(self):
    _nx = self.obj_nx
    pos = nx.spring_layout(_nx)

Running the application by yourself

Prerequisites

  • git
  • docker and docker-compose
  • acess to a terminal in your environment

Steps

With docker-compose you can easily up one environment with all the pieces and configurations go to the iris-python-covid19 folder and type this:

$ docker compose build
$ docker compose up

Estimated time to up containers

1st time running will depend of your internet link to download the images and dependencies. If it last more than 15 minutes probably something goes wrong feel free to communicate here. After the 1st time running the next ones will perform better and take less then 2 minutes.

If is everything ok

After a while you can open your browser and go to the address:

http://localhost:8050/global-chart

You should look at IRIS Admin Portal

I'm using for now the USER namespace

http://localhost:9092
user: _SYSTEM
pass: theansweris42

If this article help you or you like the content please vote:

This application is at the current contest on open exchange, you can vote in my application iris-python-suite here(https://openexchange.intersystems.com/contest/current)

4
1 561
Article Yuri Marx · Jun 2, 2020 3m read

What is the OData

OData (Open Data Protocol) is an ISO/IEC approved, OASIS standard that defines a set of best practices for building and consuming RESTful APIs. OData helps you focus on your business logic while building RESTful APIs without having to worry about the various approaches to define request and response headers, status codes, HTTP methods, URL conventions, media types, payload formats, query options, etc. OData also provides guidance for tracking changes, defining functions/actions for reusable procedures, and sending asynchronous/batch requests (source: OData.org).

1
4 896
InterSystems Official Pete Greskoff · Jun 4, 2020

InterSystems has corrected a defect that can cause FHIR searches to return incomplete results. The defect manifests because a FHIR update interaction deletes an incorrect resource from the search index. Although the data still exists in the repository, subsequent searches may return incomplete results due to the missing entry in that index.

0
0 218
Article Tani Frankel · Jun 4, 2020 10m read

In this article I'd like to share with you a phenomena that is best you avoid - something you should be aware of when designing your data model (or building your Business Processes) in Caché or in Ensemble (or older HealthShare Health Connect Ensemble-based versions).

2
0 463
Article Sergey Mikhailenko · Jun 2, 2020 8m read

When you first start working with InterSystems IRIS, it’s a common practice to install a system with only a minimum level of security. You have to enter passwords fewer times and this makes it easier to work with development services and web applications when you're first getting acquainted. And, sometimes, minimal security is more convenient for deploying a developed project or solution. And yet there comes a moment when you need to move your project out of development, into an Internet environment that’s very likely hostile, and it needs to be tested with the maximum security settings (that is, completely locked down) before being deployed to production. And that’s what we’ll discuss in this article. For more complete coverage of DBMS security issues in InterSystems Caché, Ensemble, and IRIS, you may want to read my other article, Recommendations on installing the InterSystems Caché DBMS for a production environment. The security system in InterSystems IRIS is based on the concept of applying different security settings for different categories: users, roles, services, resources, privileges, and applications. Users can be assigned roles. Users and roles can have privileges on resources — databases, services, and applications — with varying read, write, and use rights. Users and roles can also have SQL privileges on the SQL tables located in databases.

How Security Levels Differ

When installing InterSystems IRIS, you can choose the security level: Minimal, Normal, or Locked Down. The levels differ in the degree of user engagement, the available roles and services, and in the configuration of authentication methods for services and applications. For more information, read the Preparing for InterSystems Security section of the Preparing to Install InterSystems IRIS guide.
In the documentation you’ll find the tables shown below, which show the security settings for each level. You can change the settings in the system management portal interface.

Initial User Security Settings

Security SettingMinimalNormalLocked Down
Password Pattern3.32ANP3.32ANP8.32ANP
Inactive Limit090 days90 days
Enable _SYSTEM UserYesYesNo
Roles assigned to UnknownUser%AllNoneNone

Initial Service Properties

Service PropertyMinimalNormalLocked Down
Use Permission is PublicYesYesNo
Requires AuthenticationNoYesYes
Enabled ServicesMostSomeFewest

Initial Enabled Settings for Services

ServiceMinimalNormalLocked Down
%Service_BindingsEnabledEnabledDisabled
*%Service_CSPEnabledEnabledEnabled
%Service_CacheDirectEnabledDisabledDisabled
%Service_CallInEnabledDisabledDisabled
%Service_ComPortDisabledDisabledDisabled
%Service_ConsoleEnabledEnabledEnabled
%Service_ECPDisabledDisabledDisabled
%Service_MSMActivateDisabledDisabledDisabled
%Service_MonitorDisabledDisabledDisabled
%Service_ShadowDisabledDisabledDisabled
%Service_TelnetDisabledDisabledDisabled
%Service_TerminalEnabledEnabledEnabled
%Service_WebLinkDisabledDisabledDisabled

*For InterSystems IRIS, %Service_CSP applies %Service_WebGateway. The services used are slightly different for different operating systems.

How You Can Improve Security

For each enabled service, you need to choose the appropriate authentication methods: unauthenticated, password, Kerberos, or delegated. You also need to disable web applications that aren’t used in the system. And for web applications that are enabled, you need to select the correct authentication method: authenticated, password, Kerberos, delegated, login, or cookie. Of course, the administrator chooses the security settings for each project and solution so the project can function according to the customer's requirements. And this is always a balance between keeping the system convenient enough that users can actually get their work done, while also secure enough to keep intruders at bay. As you know, the most secure system is a disabled system. If you encounter a need to manually increase the security level of your system more than once, this is a sure sign you need to write a software module to solve these problems. In fact, InterSystems Open Exchange has a lockdown program that can help you improve security. You’ll find the source code for the program in the repository on the InterSystems isc-apptools-lockdown page. Here’s what the LockDown program does.

First, it changes passwords for preinstalled users:

  • Admin,
  • CSPSystem,
  • IAM,
  • SuperUser,
  • UnknownUser,
  • _Ensemble,
  • _SYSTEM.

Second, it disables all services except:

  • %%service_web gateway
  • %service_console
  • %service_login
  • %service_terminal

Next, it sets password protection for all web applications, including:

  • /csp/ensdemo
  • /csp/samples
  • /csp/user
  • /isc/studio/usertemplates
  • /csp/docbook
  • /csp/documatic
  • /isc/studio/rules
  • /isc/studio/templates

Finally, it sets system-wide security parameters including:

  • Password complexity "8.32 ANP"
  • Limit on user inactivity of 90 days
  • Audit and all security-relevant events You can install the LockDown program on your system by downloading LockDown.cls from GitHub. Then, in terminal mode, enter the following:
USER>zn “%SYS”
%SYS>do $system.OBJ.Load("/home/irisusr/LockDown.cls","ck")

Or you can install it using the ZPM batch manager from the public register with the following commands:

USER>zn “%SYS”
%SYS> zpm “install isc-apptools-lockdown”

Performing a Lockdown

Before executing a lockdown, it’s strongly recommended that you perform a backup. The LockDown program must be executed from the %SYS area. If you don't want to change the password for all preinstalled users, leave the first parameter empty. If you want to keep the ability to edit programs and classes using IRIS Studio, Atelier, or VSCode, don’t disable the %Service_Bindings service. To ensure this works, the bindings argument must be set to 1. Here’s an example: do ##class(App.Security.LockDown).Apply("New Password 123",.msg,1) This module also contains a function that’s useful if the system password is compromised and you need a replacement for all preinstalled accounts without performing a lockdown. You can run it as follows: do ##class(App.Security.LockDown).Change Password("New Password 123", "Admin,CSPSystem,IAM,SuperUser,Unknown User, _Ensemble,_SYSTEM") Most likely, after performing the lockdown, your application or project will stop working. To fix it, you’ll need to restore some security settings to their original state. This can be done either via the management portal interface (security section) or programmatically.

Changing Your Security Settings After Lockdown

After lockdown, if your web applications used authentication methods other than passwords, you’ll need to enable them. I suggest running the software module zpm-registry-test-deployment, which has an example of using LockDown for the ZPM-registry project. The code that follows is applied at the end of the installation. The project was installed on IRIS with a minimal level of security. Here’s what the code had to do:

  • Change passwords for all preinstalled users.
  • Disable all services not used by this project.
  • Enable password protection for all applications on the system, except web applications /registry (which allows unauthorized users to get a list of packages in the registry).
  • Create a new user with privileges to publish new packages in the registry. This user must have write rights to the project tables in the IRISAPP database.

Create a new user:

set tSC= ##class(App.Security.LockDown).CreateUser(pUsername, "%DB_"_Namespace, pPassword, "ZMP registry user",Namespace)
If $$$ISERR(tSC) quit tSC
write !,"Create user "_pUsername

Add privileges for a new and unauthorized user:

set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package", "s", "UnknownUser")
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package_dependencies", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM_Analytics.Event", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "9,ZPM.Package_Extent", "e", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "9,ZPM_Analytics.Event_Extent", "e", pUsername)
If $$$ISERR(tSC) quit tSC
write  !,"Add privileges "

Run the LockDown program:

set tSC= ##class(App.Security.LockDown).Apply(NewPassSys)
If $$$ISERR(tSC) quit tSC

Change the settings for the web app so that an unknown user can log in:
set prop("AutheEnabled")=96
set tSC=##class(Security.Applications).Modify("/registry",.prop)
If $$$ISERR(tSC) quit tSC
write !,"Modify /registry "

Change the settings for the %service_terminal service, changing the authorization method to Operating System, Password:
set name="%service_terminal"
set prop("Enabled")=1
set prop("AutheEnabled")=48 ; Operating System,Password
set tSC=##class(Security.Services).Modify(name,.prop)
If $$$ISERR(tSC) quit tSC
write !,"Modify service terminal"

Wrapping Up

In this article, I discussed why you might want to increase the security level of your system and how you’d do this programmatically, and I showed an example using the InterSystems LockDown program. We used a method in which we first closed down everything in the system (that is, we set the maximum security level). We then moderated the security by opening the services and applications necessary for the project to function, but only those. I'm sure there are other ways and best practices, and I’d love to hear about them as part of the discussion of this article by the community.

2
3 1139
InterSystems Official Thomas Dyar · May 27, 2020

Preview releases are now available for InterSystems IRIS Advanced Analytics, and InterSystems IRIS for Health Advanced Analytics! The Advanced Analytics add-on for InterSystems IRIS introduces IntegratedML as a key new feature.

The build number for these releases is: 2020.3.0AA.331.0

Full product installation kits, container images, and evaluation license keys are available via the WRC's preview download site.

Community Edition containers can also be pulled from the Docker store using the following commands:

1
3 653
Article Sergey Kamenev · May 28, 2020 7m read

A More Industrial-Looking Global Storage Scheme

In the first article in this series, we looked at the entity–attribute–value (EAV) model in relational databases, and took a look at the pros and cons of storing those entities, attributes and values in tables. We learned that, despite the benefits of this approach in terms of flexibility, there are some real disadvantages, in particular a basic mismatch between the logical structure of the data and its physical storage, which causes various difficulties.

0
0 939
Question Ikara Ikliki · May 26, 2020

I am trying to do package mapping in the %ALL NameSpace.

I create a new Package Mapping entry and select my database bu the "Package Name" combo box never populates the packages in this database so I cannot select it, see screenshot below, the "Package Name" list remains empty. There definately are packages in that database. Why is this happening? Did I miss a setting?

1
0 271
Question Malik Ahmed · May 25, 2020

Hi !

I am getting below error in my .NET MVC project, I am IRIS Entity Framwork, in the database table filed and model having the same datatype int.

The specified cast from a materialized 'System.Int64' type to the 'System.Int32' type is not valid db Table creation Id field is created with [xDBC Type = BIGINT]

Please kindly advice me.

Thank you

1
0 3832
InterSystems Official Pete Greskoff · May 20, 2020

InterSystems has corrected two defects that affect online backup of very large databases. Backups taken via external methods, such as snapshots or direct file copies, are not affected. These defects exist in all released versions of all InterSystems products.

The first defect only affects databases with more than 231 blocks. It results in a degraded database after restoring from an online backup. For example, databases that have a block size of 8 KB (the default) are only affected if they are larger than 16 TB. The correction for this defect is identified as RJF437.

The second defect affects databases that have a block size of 8 KB and that are larger than ~29 TB. With this defect, the online backup fails due to an inaccurate <DATABASE> error; this results in a backup that cannot be restored. The correction for this defect is identified as RJF438. Note that this defect also affects databases that have block sizes smaller than 8 KB.

The corrections for these defects will be included in all future product releases. They are also available by requesting an Ad hoc distribution from the WRC.

If you have any questions regarding this alert, please contact the Worldwide Response Center.

0
0 266