Clear filter
Article
Vladimir Prushkovskiy · Oct 31, 2022
It has been asked a few times recently, how one can make Laravel Framework work with InterSystems IRIS Data Platform. It's been a while since this post about Laravel and InterSystems Caché was published. To bring it up to date, the article gives a brief instruction set on how to setup and configure a Laravel project for use with InterSystems IRIS through ODBC.
What is Laravel?
Laravel is a PHP framework that is based on MVC architecture. Using Laravel simplifies and speeds up the backend development while building modern secure web applications. It is very beginner-friendly, widely used in PHP world and tends to be the most popular backend framework according to github.com star rating measured in this video. Combining all that with flexibility and performance capabilities delivered by InterSystems IRIS as a database is seen to be beneficial for both worlds.
This post is organised into 4 steps which represent a sequence of actions one needs to complete in order to make the connection work. Specific ways of completing each step may vary depending on the platform. Commands here are shown for Ubuntu 22.02 (x64).
Setup Driver Manager (unixODBC)
In order to make the connection work we need to install a Driver Manager. Most commonly used driver managers are 'unixODBC' and 'iODBC'. This guide uses 'unixODBC', which may be downloaded here http://www.unixodbc.org/ . Please refer to 'Download' section of the website to download and build. Alternatively, build instructions can also be found here. We'll use here packages from 'apt' package manager for Ubuntu.
Install packages
Install unixodbc package accompanied by libodbccr2 which provides unixODBC Cursor library.
sudo apt update
sudo apt -y install unixodbc libodbccr2 odbcinst
Create a link for Cursor LibraryIn certain cases there might be issues with Shared Object Dependencies after unixODBC installation. This is shown as 'Can't open cursor lib' error. There are few workarounds described in internet. In order to resolve this issue we make a symbolic link to a desired library. First, we locate the library:
sudo find / -type f -name "libodbccr*"
And then we create a link
sudo ln -s /usr/lib/x86_64-linux-gnu/libodbccr.so.2.0.0 /etc/libodbccr.so
Setup ODBC Driver for InterSystems IRIS
ODBC driver for InterSystems IRIS can be obtained in various ways. For example, ODBC Driver is included to all InterSystems IRIS kits. The other option would be Distributions Portal on wrc.intersystems.com.
Alternatively, drivers for all supported platforms can be found here: https://intersystems-community.github.io/iris-driver-distribution/
Download, unpack and install ODBC Driver:
sudo mkdir -p /usr/lib/intersystems/odbc
cd /usr/lib/intersystems/odbc/
sudo wget -q https://raw.githubusercontent.com/intersystems-community/iris-driver-distribution/main/ODBC/lnxubuntu2004/ODBC-2022.1.0.209.0-lnxubuntu2004x64.tar.gz
sudo tar -xzvf /usr/lib/intersystems/odbc/ODBC-2022.1.0.209.0-lnxubuntu2004x64.tar.gz
sudo ./ODBCinstall
sudo rm -f ODBC-2022.1.0.209.0-lnxubuntu2004x64.tar.gz
After that, the driver will be located in the following folder /usr/lib/intersystems/odbc/bin/.
Additional information on drivers and their usage may be found in the docs. This guide uses libirisodbcur6435.so as a driver library.
Setup Laravel project
The traditional and convenient way to interact with a database from Laravel would be using its Eloquent package. Eloquent is an object relational mapper (ORM) that is included by default within the Laravel framework. Only few DBMS vendors are supported out-of-the-box. So in order to implement connection and SQL query builder specifics for InterSystems IRIS (via ODBC) some additional PHP code needs to be written. Thanks to @Jean.Dormehl this gap was covered for InterSystems Caché . The same one could be used for InterSystems IRIS.So in this article we describe steps to setup connection for existing Laravel project using jeandormehl/laracache package, assuming that installation and configuration of php, composer and Laravel is done prior to that.
Install php-odbcMake sure that php-odbc module is installed. You can check the list of modules installed with the following command:
php -m | grep odbc
To install php-odbc extension use the following command using a proper version of php installed on your environment
sudo apt -y install php8.1-odbc
Setup 'jeandormehl/laracache' packageGo to your Laravel project directory, install package and publish its config file.
composer require jeandormehl/laracache
php artisan vendor:publish --tag=isc
Configure IRIS connection
Edit your .env file to contain settings needed to connect to a database. For Unix users it should look similar to this:
DB_CONNECTION=isc
DB_WIN_DSN=
DB_UNIX_DRIVER=/usr/lib/intersystems/odbc/bin/libirisodbcur6435.so
DB_HOST=127.0.0.1
DB_PORT=1972
DB_DATABASE=USER
DB_USERNAME=_SYSTEM
DB_PASSWORD=sys
After editing .env file you may find useful to clear application config cache:
php artisan config:cache
Usage
Let's try to retrieve some data using our new package. As an example we'll create a Model inherited from Laracache\Cache\Eloquent\Model . Just for testing purposes we will count the number of sent messages in Interoperability enabled namespace.
nano app/Models/EnsMessageHeader.php
<?php
namespace App\Models;
use Laracache\Cache\Eloquent\Model;
class EnsMessageHeader extends Model
{
protected $table = 'Ens.MessageHeader';
protected $fillable = [
'MessageBodyClassName'
];
}
To execute a query we may create an artisan console command like this:
nano routes/console.php
<?php
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use App\Models\EnsMessageHeader;
Artisan::command('iris:test', function () {
echo EnsMessageHeader::count() . PHP_EOL;
});
Then executing the following command should retrieve the number of records
php artisan iris:test
This scenario should work to a wide range of InterSystems IRIS based products. Great Article - Thanks Vlad !. Nice write-up, thanks Vlad! Thank you very much. For those who are getting an "access denied" error,they need to run "odbcinst -i -s -l -f odbc.ini_unixODBCtemplate." If anyone is curious jeandormehl/laracache hasn't updated past Laravel 9, and it seems sort of abandoned. I have a WIP fork that will work on 11 but I still need to fix pagination. From 9 to 10 laravel removed compileRowConstraint.
Announcement
Anastasia Dyubaylo · Jan 30, 2023
Hey Developers,
It's time to announce the Top Contributors of InterSystems Developer Community for 2022 🎉
We are pleased to reward the most active contributors across all regional DC sites (EN, ES, PT, JP, CN, and FR):
Top Authors
Top Experts
Top Opinion Makers
And a new nomination ... Breakthrough of the Year!
Before we share our best of the best, we'd like to introduce a new exciting badge – Breakthrough of the Year. It is a person who started contributing this year and made the greatest contribution to the development of our Сommunity.
Let's take a closer look at the DC Wall of Fame 2022 and greet everyone with big applause! 👏🏼
Badge's Name
Winners DC
Winners InterSystems
Nomination: Breakthrough of the Year
Given to members who started contributing in 2022 and have the most posts, likes, translations, and views in 2022.
Breakthrough of 2022
@Lucas.Enard2487
@Smythe.Smythee
@Mark.OReilly
–
Nomination: InterSystems Best-selling Author
Given to authors whose articles gathered the maximum amount of views in 2022.
1st place: Gold Best-Selling Author 2022
@Yuri.Gomes
@miniclub
2nd place: Silver Best-Selling Author 2022
@Lucas.Enard2487
@Yunfei.Lei
3rd place: Bronze Best-Selling Author 2022
@姚.鑫
@Evgeny.Shvarov
4 - 10th places: Best-Selling Author 2022
@Muhammad.Waseem
@Evgeniy.Potapov
@Robert.Cemper1003
@José.Pereira
@Lorenzo.Scalese
@Iryna.Mykhailova
@Dmitry.Maslennikov
@Guillaume.Rongier7183
@Mihoko.Iijima
@Eduard.Lebedyuk
@Peng.Qiao
@Alberto.Fuentes
@Megumi.Kakechi
@Ricardo.Paiva
Nomination: InterSystems Expert
Given to authors, who got the largest number of accepted answers for 2022.
1st place: Gold Expert 2022
@Robert.Cemper1003
@Eduard.Lebedyuk
2nd place: SilverExpert 2022
@Julius.Kavay
@Yunfei.Lei
3rd place: Bronze Expert 2022
@Vitaliy.Serdtsev2149
@akoblov
4 - 10th places: DC Expert 2022
@Dmitry.Maslennikov
@Jeffrey.Drumm
@David.Hockenbroch
@Cristiano.Silva
@John.Murray
@Yaron.Munz8173
@Julian.Matthews7786
@Vic.Sun
@Marc.Mundt
@Timothy.Leavitt
@Guillaume.Rongier7183
@Alex.Woodhead
@Benjamin.Spead
@Evgeny.Shvarov
Nomination: InterSystems Opinion Leader
Given to authors whose posts and answers scored the highest number of likes for 2022.
1st place: Gold Opinion Leader 2022
@Yuri.Gomes
@Angelo.Braga5765
2nd place: Silver Opinion Leader 2022
@Robert.Cemper1003
@Eduard.Lebedyuk
3rd place: Bronze Opinion Leader 2022
@Dmitry.Maslennikov
@Guillaume.Rongier7183
4 - 10th places: DC Opinion Leader 2022
@wang.zhe
@Muhammad.Waseem
@Lorenzo.Scalese
@姚.鑫
@Lucas.Enard2487
@Francisco.López1549
@Julius.Kavay
@Evgeny.Shvarov
@Benjamin.Spead
@Rochael.Ribeiro
@Timothy.Leavitt
@Robert.Kuszewski
@Danusa.Ferreira
@Raj.Singh5479
This list is a good reason to start following some of the great authors of the Developer Community ;)
BIG APPLAUSE TO OUR WINNERS!
Congratulations to all of you and thank you for your great contribution to the InterSystems Developer Community for 2022!
P.S. Please take part in our annual survey and help us become better:
👉🏼 InterSystems Developer Community Annual Survey 2022 👈🏼 Thanks the nominations! About Robert Cemper, he is a diamond expert for me, his contribution and apps are fundamental and fantastic to my personal learning @Yuri.Gomes, @Robert.Cemper1003
¡¡Congratulations!!
And thank you for your contribution and for sharing your knowledge and wisdow!
Congrats to all the contributors! You make the community! Thank you! My heartfelt congratulation to all the contributors! Especially to the French ones 😘 You guys rock! Thanks for all and congratulation to @Robert.Cemper1003 ... our light in our dark doubts I am especially grateful for the very active participation of @Robert.Cemper1003 in our Community :) Thank you, do we get a shiny badge for breakthrough on our profiles? Only just signed up for global masters I think badges are only awarded via Global Masters but I may be mistaken (that is where I saw my badges show up) Hi @Mark.OReilly congratulations on this great achievement!!!We award badges on Global Masters, and after that badges appear on Developer Community profiles as well.I now see your new profile on Global Masters, we will award the badge today, and it will appear within 1 day in your DC profile too :)
Announcement
Anastasia Dyubaylo · Jul 15, 2023
Hey Developers,
Enjoy watching the new video on InterSystems Developers YouTube:
⏯ InterSystems Supply Chain Orchestrator
See how InterSystems Supply Chain Orchestrator improves supply chain operations with real-time, actionable data. InterSystems Supply Chain Orchestrator includes an extensible data model, integration engine, and API framework that allow you to create real-time full-stack applications for order processing, issue processing, demand forecasting, and more.
Enjoy and stay tuned! 👍
Announcement
Anastasia Dyubaylo · Feb 28, 2023
Hey Developers,
Enjoy watching the new video on InterSystems Developers YouTube:
⏯ InterSystems Security Development Lifecycle @ Global Summit 2022
InterSystems actively partners with you to meet your security requirements. In this session, you'll learn about InterSystems approach to security and our security practices. This information will help you understand how to receive and use the information critical to developing, deploying, and operating secure applications. Beginner level.
🗣 Presenter: Mark-David McLaughlin, Principal Security Architect, InterSystems
Enjoy it and stay tuned! 👍
Announcement
Anastasia Dyubaylo · Nov 29, 2022
Hi Developers,
Enjoy watching the new video on InterSystems Developers YouTube:
⏯ Using Python with InterSystems IRIS @ Global Summit 2022
Witness all the ways you can use InterSystems IRIS with Python traditional client/server, Embedded Python, and the Python Gateway. Learn when to use each of them.
Presenters🗣 @Robert.Kuszewski, Product Manager, Developer Experience, InterSystems🗣 @Stefan.Wittmann, Product Manager, InterSystems🗣 @Raj.Singh5479, Developer Experience Product Manager, InterSystems
Enjoy it and stay tuned! 👍
Announcement
Derek Robinson · Jun 12
Hi, Community!
⛅Need to connect your application to InterSystems Cloud Services? Get a high-level overview of the process:
Connecting to InterSystems Cloud Services
In this video, you will learn:
How to connect with Python, Java, C++, or .NET.
Key components for a connection and basic setup steps.
The importance of TLS encryption.
Article
Ashok Kumar T · Jun 30
Overview
Fast Healthcare Interoperability Resources (FHIR) is a standardized framework developed by HL7 International to facilitate the exchange of healthcare data in a flexible, developer-friendly, and modern way. It leverages contemporary web technologies to ensure seamless integration and communication across healthcare systems.
Key FHIR Technologies
RESTful APIs for resource interaction
JSON and XML for data representation
OAuth2 for secure authorization and authentication
FHIR is structured around modular components called resources, each representing specific healthcare concepts, including the following:
Patient – Demographics and identifiers
Observation – Clinical measurements (e.g., vitals, labs)
Encounter – Patient-provider interactions
Medication, AllergyIntolerance, Condition, etc.
Resources are individually defined and can reference other resources to form a comprehensive data model.
InterSystems IRIS for Health: FHIR Support
InterSystems IRIS for Health is a unified data platform designed specifically for health care. It includes native HL7 FHIR support. It provides built-in tools and services, enabling storage, retrieval, transformation, and exchange of FHIR resources.IRIS enhances system interoperability with three major FHIR-handling components:
1.FHIR repository Server
IRIS enables rapid deployment of FHIR-compliant servers, with support for the following:
The complete FHIR paradigm
Implementation of FHIR RESTful APIs, including search and query parameters
Importing and utilizing FHIR packages and structure definitions
Working with FHIR Profiles
Native CRUD operations on FHIR resources
Retrieval of FHIR data in JSON or XML formats
Support for multiple FHIR versions
FHIR SQL builder and bulk FHIR handling capabilities
2. FHIR Facade Layer
The FHIR facade layer is a software architecture pattern used to expose a FHIR-compliant API on top of an existing one (often non-FHIR). It also streamlines the healthcare data system, including an electronic health record (EHR), legacy database, or HL7 v2 message store, without migrating all the data into a FHIR-native system.
This implementation specifically centers around the FHIR Interoperability Adapter.
3. FHIR Interoperability Adapter
InterSystems IRIS for Health offers high flexibility and fine-grained control for transforming such healthcare message standards as HL7 V2.x and C-CDA into FHIR, and vice versa (see the Message Conversion Diagram). However, not all FHIR implementations require a dedicated FHIR repository server. To support such scenarios, IRIS for Health includes an interoperability adapter toolkit that enables detailed message conversion without the need for a FHIR server.
This adapter can handle a variety of external requests (e.g., REST or SOAP APIs) from external systems, transform them into FHIR format, and route them to downstream systems, without necessarily persisting the data to a database.
Alternatively, if needed, the adapter can transform and store the data in the database.
It effectively provides an external interface layer that allows a non-FHIR database to behave as if it were a FHIR server, enabling seamless interoperability.
Message conversion
SDA: Summary Document Architecture
The Summary Document Architecture (SDA) is InterSystems’ intermediary XML-based format used to represent patient data internally within IRIS and HealthShare products. This powerful native data structure enables you to access discrete data and easily convert between multiple data formats, including HL7 V2, CCDA, C32, HL7 FHIR, and others.
SDA Structure
The SDA (Structured Data Architecture) is primarily divided into two main components:
Container – Top-level structure containing one or more sections
Sections – Representation of specific healthcare elements(e.g., Patient, Encounter, AllergyIntolerance)
Container
The container is the top level of the SDA standard, and it includes multiple sections (e.g., patient, encounter, allergyIntolerance and others).
Let's explore the internal structure of the SDA and its components.
class definition of Container:
The HS.SDA3.Container class serves as the primary definition for representing an SDA document. Various sections, such as patient and encounter, are defined as objects and included as properties within this class.Sections.
A section is a discrete piece of a container element represented as an IRIS class definition with relevant data elements on the container.
Patient – HS.SDA3.Patient
Encounter – HS.SDA3.Encounter
Allergy - HS.SDA3.Allergy
SDA Container Structure
The below XML structure represents an entire SDA container.
<Container>
<Patient/>
<Encounters/>
<Encounters/>
<AdvanceDirectives/>
</Container>
SDA Data Types
The FHIR data type formats are different from the IRIS standard data types. So, SDA has specific custom data types that handle the properties in sections more effectively than the standard properties, e.g., %String, %Integer, %Stream, etc. However, the standard properties are also used in SDA sections.
Those data type classes are also defined inside the HS.SDA3* package:
HS.SDA3.Name
HS.SDA3.CodeTableDetail.Allergy
HS.SDA3.PatientNumber
HS.SDA3.TimeStamp
SDA Extension
In most cases, the SDA has sufficient properties to manage and generate all the data coming through the system to develop a resource. However, if you need to accommodate additional data as a part of your implementation, IRIS provides a straightforward way to extend it into the SDA extension classes effortlessly.
For example, HS.Local.SDA3.AllergyExtension class definition is the extension class for the HS.SDA3.Allergy. You can add the necessary data elements to this extension class, simplifying the access and manipulation throughout your implementation.
The next step is to create a container object.
Create a container object
ClassMethod CreateSDAContainer()
{
set SDAContainer = ##class(HS.SDA3.Container).%New()
#; create patient object
set patientSDA = ##class(HS.SDA3.Patient).%New()
set patientSDA.Name.FamilyName = "stood"
set patientSDA.Name.GivenName = "test"
set patientSDA.Gender.Code="male"
set patientSDA.Gender.Description="birth gender"
#; create Encounter 1
set encounterSDA = ##class(HS.SDA3.Encounter).%New()
set encounterSDA.AccountNumber = 12109979
set encounterSDA.ActionCode ="E"
set encounterSDA.AdmitReason.Code ="Health Concern"
set encounterSDA.AdmitReason.Description = "general health concern"
#; create Encounter 2
set encounterSDA1 = ##class(HS.SDA3.Encounter).%New()
set encounterSDA1.AccountNumber = 95856584
set encounterSDA1.ActionCode ="D"
set encounterSDA1.AdmitReason.Code ="reegular checkup"
set encounterSDA1.AdmitReason.Description = "general health ckeckup"
#; set the patientSDA into the container.
set SDAContainer.Patient = patientSDA
#; set multiple encounters into the container SDA
do SDAContainer.Encounters.Insert(encounterSDA)
do SDAContainer.Encounters.Insert(encounterSDA1)
#; convert the SDA object into an XML string.
do SDAContainer.XMLExportToString(.containerString)
write containerString
}
SDA – XML Document Output
<Container>
<Patient>
<Name>
<FamilyName>stood</FamilyName>
<GivenName>test</GivenName>
</Name>
<Gender>
<Code>male</Code>
<Description>birth gender</Description>
</Gender>
</Patient>
<Encounters>
<Encounter>
<AccountNumber>12109979</AccountNumber>
<AdmitReason>
<Code>Health Concern</Code>
<Description>general health concern</Description>
</AdmitReason>
<ActionCode>E</ActionCode>
</Encounter>
<Encounter>
<AccountNumber>95856584</AccountNumber>
<AdmitReason>
<Code>reegular checkup</Code>
<Description>general health ckeckup</Description>
</AdmitReason>
<ActionCode>D</ActionCode>
</Encounter>
</Encounters>
<UpdateECRDemographics>true</UpdateECRDemographics>
</Container>
In the previous section, we discussed the SDA and its components. We also learned how to generate the SDA via Cache ObjectScript.
Next, we will generate a FHIR resource or Bundle using Interoperability production (formerly known as Ensemble).
Let’s briefly read about interoperability production before creating a FHIR resource.
Interoperability Production with FHIR Adaptor
An interoperability production is an integration framework for connecting systems and developing applications for interoperability with ease. It is typically divided into 3 major components:
Business service – It connects to the external system and receives the request from it.
Business process – It receives a request from the other business hosts, processes the request based on your defined business logic, and converts the relevant data. Multiple components are used to convert the data:
BPL – Business Process Language
DTL – Data Transformation Language
BR – Business Rules
Record Mapping
Business operation – It connects with the external system and sends the response to it.
Let’s begin the process of constructing a FHIR message.
Create FHIR Resource
There are two types of systems: FHIR servers and non-FHIR servers. In our case, we aim to make a non-FHIR InterSystems IRIS database appear as a FHIR-compliant system by generating FHIR resources using the FHIR Interoperability Adapters.
In this section, we will demonstrate how to generate FHIR resources from custom data stored in the IRIS database with the help of the InterSystems IRIS for Health Interoperability Toolkit with FHIR adapters.
As a part of this implementation, we will create the following types of FHIR resources:
Standard FHIR Resource – It utilizes the built-in FHIR classes with minimal or no modifications.
Custom FHIR Resource – It involves adding extensions to the SDA model and creating a custom Data Transformation (DTL) for the FHIR resource.
Each implementation will be initiated through dedicated business hosts.
Business Service
The RESTful business host is responsible for receiving requests from external systems. You may configure the appropriate adapter based on your specific integration requirements (e.g., HTTP, SOAP, or other supported protocols).
Upon receiving a request from the external system, the workflow will generate a corresponding FHIR resource using data persisted in the custom or legacy database.
FHIR Business Process
The FHIR message generation process involves two primary steps:
Transform custom/proprietary data into SDA (HL7 version 2.X to SDA, and CCDA to SDA, etc.).
Add data elements to the SDA and, if required, create a custom DTL. These steps are optional and depend on specific implementation needs, e.g., custom FHIR resource generation.
Then, convert the generated SDA into a FHIR Resource with the help of the IRIS built-in process.
The Structured Data Architecture (SDA) format serves as an intermediary, enabling flexible data transformation. Once the data is available in SDA format, it can be easily mapped to FHIR or other healthcare data standards.
Converting Custom/proprietary Data to SDA Format In this approach, begin by creating a persistent or interoperability request class to facilitate the transformation into SDA. It involves defining a custom patient class that maps data from your legacy or custom database structure into SDA-compliant objects.
Utilizing a custom patient class provides significant flexibility:
It simplifies object handling and manipulation.
It enables clean mapping in Data Transformation Language (DTL).
It allows an effortless reuse of the object in other transformation or business logic layers.
Request a class for the external layer to convert SDA:
Class Samples.FHIRAdapt.CustomStorage.Patient Extends (Ens.Request,%JSON.Adaptor)
{
Property Name As %String;
Property BirthDate As %String;
Property Citizenship As %String;
Property Religion As %String;
Property PrimaryLanguage As %String;
Property Married As %String;
Property MRN As %String;
}
This request class serves as the external interface layer, initiating the conversion process from your database format into SDA. Once the SDA object is created, it can be seamlessly transformed into the desired FHIR resource via standard or custom DTL mappings:
Add the Samples.FHIRAdapt.CustomStorage.Patient (use your class definition) class as the source class for the transformation.
Identify and select the appropriate SDA target class for mapping. In this case, HS.SDA3.Patient is a suitable class for transforming custom data into the SDA format.
Sample DTL conversion
Class Samples.FHIRAdapt.DTL.CustomDataToPatientSDA Extends Ens.DataTransformDTL [ DependsOn = (Samples.FHIRAdapt.CustomStorage.Patient, HS.SDA3.Patient) ]
{
Parameter IGNOREMISSINGSOURCE = 1;
Parameter REPORTERRORS = 1;
Parameter TREATEMPTYREPEATINGFIELDASNULL = 0;
XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='Samples.FHIRAdapt.CustomStorage.Patient' targetClass='HS.SDA3.Patient' create='new' language='objectscript' >
<assign value='$Piece(source.Name,",")' property='target.Name.GivenName' action='set' />
<assign value='$Piece(source.Name,",")' property='target.Name.FamilyName' action='set' />
<assign value='$Piece($Piece(source.Name,",",2)," ",2)' property='target.Name.MiddleName' action='set' />
<assign value='source.Citizenship' property='target.Citizenship' action='set' />
<assign value='"fullname"' property='target.Name.Type' action='set' />
<assign value='$Select(source.Married=1:"married",1:"single")' property='target.MaritalStatus.Code' action='set' />
</transform>
}
}
At this stage, the data has been successfully transformed into an SDA document and is ready for conversion into a FHIR resource.
Before generating the FHIR resource, additional supporting FHIR resources should be created as a part of this response. Besides, the custom fields need to be included in the FHIR output. To support these custom elements, the corresponding properties must be incorporated into the SDA structure.
It can be accomplished with the help of the SDA extensions, which enable the inclusion of custom data elements required for accurate and complete FHIR resource generation.
SDA Extension
FHIR follows the 80/20 rule, where the core FHIR specification covers approximately 80% of common healthcare use cases, while the remaining 20% are addressed through custom constraints and extensions.
To illustrate this, we will create an AllergyIntolerance resource with custom extensions.
There are two key steps for the proper implementation of extension data elements in InterSystems IRIS:
The class HS.SDA3.*******Extension is used to add extra data elements to each SDA section. For example, the class HS.Local.SDA3.AllergyExtension extends HS.SDA3.Allergy by defining the required custom properties.
Since the pre-built DTL mappings do not include these custom extensions, you must create a custom DTL to handle the transformation accordingly.
Allergy Extension Class
To build the required fields in the HS.Local.SDA3.AllergyExtension class for creating the required allergy resource, use the following lines of code:
Class HS.Local.SDA3.AllergyExtension Extends HS.SDA3.DataType
{
Parameter STREAMLETCLASS = "HS.SDA3.Streamlet.Allergy";
/// Mapped this property due to not being available in the SDA to FHIR conversion
Property Criticality As %String;
/// Mapped this property due to not being available in the SDA to FHIR conversion
Property Type As %String(MAXLEN = "");
Storage Default
{
<Data name="AllergyExtensionState">
<Subscript>"AllergyExtension"</Subscript>
<Value name="1">
<Value>Criticality</Value>
</Value>
<Value name="2">
<Value>Type</Value>
</Value>
</Data>
<State>AllergyExtensionState</State>
<Type>%Storage.Serial</Type>
}
}
Making an extension is a halfway done process because standard DTL does not have a mapping for the extension field. Now, we have to construct a custom DTL to transform the FHIR response properly.
Custom DTL Creation
Before customizing DTL classes, you need to define a dedicated package for all of your custom DTL implementations. To do that, InterSystems recommends using the package called HS.Local.FHIR.DTL.
To build a custom DTL for Allergy, start with the existing data transformation class:HS.FHIR.DTL.SDA3.vR4.Allergy.AllergyIntolerance, which handles the conversion from SDA to FHIR resources.
First, make a copy of this class into your custom package as
HS.Local.FHIR.DTL.SDA3.vR4.Allergy.AllergyIntolerance. Then, extend it by mapping your custom extensions into the FHIR resource generation process.
For instance, the sample class HS.Local.FHIR.DTL.FromSDA.Allergy demonstrates how to map Allergy extension fields for convenience, while inheriting all other mappings from the base class HS.FHIR.DTL.SDA3.vR4.Allergy.AllergyIntolerance.
Sample custom DTL mapping is illustrated below:
/// Transforms SDA3 HS.SDA3.Allergy to vR4 AllergyIntolerance
Class HS.Local.FHIR.DTL.SDA3.vR4.Allergy.AllergyIntolerance Extends Ens.DataTransformDTL [ DependsOn = (HS.SDA3.Allergy, HS.FHIR.DTL.vR4.Model.Resource.AllergyIntolerance), ProcedureBlock ]
{
XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='HS.SDA3.Allergy' targetClass='HS.FHIR.DTL.vR4.Model.Resource.AllergyIntolerance' create='existing' language='objectscript' >
<assign value='source.Extension.Criticality' property='target.criticality' action='set' />
<assign value='source.Extension.Type' property='target.type' action='set' >
<annotation>11/07/2023; ak; Added this set to populate type in AllergyIntolerance resource</annotation>
</assign>
</transform>
}
}
Once you have created your class package for custom DTL (in case the custom DTL package does not already exist), you must register it for future FHIR data transformation results.
set status = ##class(HS.FHIR.DTL.Util.API.ExecDefinition).SetCustomDTLPackage("HS.Local.FHIR.DTL")
Furthermore, you can obtain the custom DTL package details (if already defined) by calling the class method.
Write ##class(HS.FHIR.DTL.Util.API.ExecDefinition).GetCustomDTLPackage()
Stream Container Class for Request Message
The setup of the SDA and its optional SDA extension, along with the optional creation of a custom DTL for building the SDA, is now complete. However, the SDA object must now be converted into a standardized Ens.StreamContainer, used specifically in the SDA-to-FHIR conversion business process.
Here are the simple steps to convert the SDA object to Ens.StreamContainer.
ClassMethod CreateEnsStreamContainer()
{
set ensStreamCntr=""
try {
#; refer the CreateSDAContainer() method above
#dim SDAContainer As HS.SDA3.Container = ..CreateSDAContainer()
do SDAContainer.XMLExportToStream(.stream)
#; Create Ens.StreamContainer is the default format for processing the SDA to FHIR process
Set ensStreamCntr = ##class(Ens.StreamContainer).%New(stream)
}
catch ex {
Write ex.DisplayString()
set ensStreamCntr=""
}
return ensStreamCntr
}
The first phase of SDA creation is concluded. The second phase, generating the FHIR resource, is already handled by InterSystems IRIS.
The following article will demonstrate how to convert an SDA document into a FHIR resource.
SDA to FHIR Transformation
Configure Interoperability Business Hosts for FHIR Creation
Business logic for FHIR generation is finalized. Now, let’s configure the Interoperability production setup:
Set up your inbound service to receive requests from the external system.
Business process - it is a crucial step to create the FHIR resource.
Business Process Implementation
This business process focuses on SDA to FHIR transformation. InterSystems IRIS includes a comprehensive built-in business process, S.FHIR.DTL.Util.HC.SDA3.FHIR.Process that facilitates the transformation of the SDA to the FHIR message. By sending the generated SDA document to this business process, you receive a FHIR resource as a JSON response.
The Process supports two types of FHIR responses based on the SDA input.
Bundle – when an entire SDA container object is sent as an Ens.StreamConainter, the process returns a FHIR bundle with all resources.
Resource - when an individual SDA section (e.g., patient, encounter, allergy) is sent as an Ens.StreamConainter, it returns the corresponding single FHIR resource as a bundle.
Business Operation
The FHIR Bundle is now ready to be returned to the requester or sent to an external system.
Production settings:
Business Service Class
The business service class handles incoming requests from the external system to generate the FHIR.
Upon receiving the request, it creates the SDA using existing logic.
The SDA is then converted into a stream object.
This stream is transformed into the format expected by the standard business process.
Finally, the processed input is sent to the Business Process.
Class Samples.Interop.BS.GenerateFHIRService Extends Ens.BusinessService
{
Parameter ADAPTER = "Ens.InboundAdapter";
Property TargetConfigName As Ens.DataType.ConfigName [ InitialExpression = "HS.FHIR.DTL.Util.HC.FHIR.SDA3.Process" ];
Method OnProcessInput(pInput As %RegisteredObject, Output pOutput As %RegisteredObject) As %Status
{
#; create your SDA container object and export to stream
do ..CreateSDAContainer().XMLExportToStream(.sdaStream)
#; convert to the standard Ens.StreamContainer message format
set ensStreamCtnr = ##class(Ens.StreamContainer).%New(sdaStream)
#; send to the Business process
do ..SendRequestSync(..TargetConfigName,ensStreamCtnr,.pOutput)
Quit $$$OK
}
ClassMethod CreateSDAContainer() As HS.SDA3.Container
{
set SDAContainer = ##class(HS.SDA3.Container).%New()
#; create patient object
set patientSDA = ##class(HS.SDA3.Patient).%New()
set patientSDA.Name.FamilyName = "stood"
set patientSDA.Name.GivenName = "test"
set patientSDA.Gender.Code="male"
set patientSDA.Gender.Description="birth gender"
#; create Encounter 1
set encounterSDA = ##class(HS.SDA3.Encounter).%New()
set encounterSDA.AccountNumber = 12109979
set encounterSDA.ActionCode ="E"
set encounterSDA.AdmitReason.Code ="Health Concern"
set encounterSDA.AdmitReason.Description = "general health concern"
#; set the patientSDA into the container.
set SDAContainer.Patient = patientSDA
#; set encounters into the container SDA
do SDAContainer.Encounters.Insert(encounterSDA)
return SDAContainer
}
}
Creating SDA to FHIR Using ObjectScript
In the previous example, the FHIR resource was generated from SDA with the help of the Interoperability framework. In this section, we will build a FHIR bundle directly utilizing ObjectScript.
Creating a FHIR Bundle from an SDA Container
The CreateSDAContainer method returns an object of type HS.SDA3.Container (we referred to it above). This SDA container must be converted to a stream before being passed to the TransformStream method. The TransformStream method then processes the stream and returns a FHIR bundle as a %DynamicObject in tTransformObj.bundle.
ClassMethod CreateBundle(fhirVersion As %String = "R4") As %DynamicObject
{
try {
Set SDAContainer = ..CreateSDAContainer()
Do SDAContainer.XMLExportToStream(.stream)
#; Should pass stream, not a container object
Set tTransformObj = ##class(HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIR).TransformStream( stream, "HS.SDA3.Container", fhirVersion)
return tTransformObj.bundle
}
catch ex {
write ex.DisplayString()
}
return ""
}
Creating a FHIR Bundle Using an SDA Section
In this approach, the patientSDA is declared directly within ObjectScript. This SDA object is then passed to the TransformObject method, which processes it and returns a FHIR bundle as a %DynamicObject.
ClassMethod CreatePatientResourceDirectSet()
{
try {
#; convert you're custom dataset into SDA by your DTL
set patientSDA = ##class(HS.SDA3.Patient).%New()
set patientSDA.Name.FamilyName = "stood"
set patientSDA.Name.GivenName = "test"
set patientSDA.Gender.Code="male"
set patientSDA.Gender.Description="birth gender"
#dim tTransformObj As HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIR = ##class(HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIR).TransformObject(patientSDA,"R4")
set patinetBundle = tTransformObj.bundle
}
catch ex {
write ex.DisplayString()
}
return patinetBundle
}
Creating an Allergy Resource with a Custom FHIR DTL and Allergy Extension
Populate all required fields, including custom extension fields, directly within the SDA object.
You should mention the FHIR version type as a second parameter in the TransformObject method (“R4” stands for Resource4 FHIR message).
Pass the completed SDA object to the FHIR transformation class to generate the AllergyIntolerance FHIR bundle.
Note: The custom extension for the allergy resource has already been defined, and the custom DTL mapping has been registered.
ClassMethod CreateAllergyWithDTL()
{
#; I already registered the "HS.Local.FHIR.DTL.SDA3.vR4.Allergy.AllergyIntolerance" for extension mapping
#; fetch the data from the table/global and set it into AllergySDA directly.
set allerySDA = ##class(HS.SDA3.Allergy).%New()
set allerySDA.Extension.Criticality = "critial"
set allerySDA.Extension.Type = "t1"
set allerySDA.Comments = "testing allergies"
set allerySDA.AllergyCategory.Code="food"
set allerySDA.AllergyCategory.Description="sea food"
#; Set the required and additional properties in SDA, depending on your requirements.
#; create a FHIR resource from the allergySDA with extension fields that uses a custom "HS.Local.FHIR.*" DTL
#dim tTransformObj As HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIR = ##class(HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIR).TransformObject(allerySDA,"R4")
Set patinetBundle = tTransformObj.bundle
}
FHIR to SDA Conversion
Custom data, HL7 v2.x, or CCDA messages were previously converted into FHIR. The next implementation involves converting the FHIR Bundle or resource into SDA format, which can then be stored in the database or transformed into CCDA or HL7 v2.x formats.
A JSON or XML-formatted FHIR resource is received from an external system. Upon receipt, the resource must be converted into the internal data structure and stored in the IRIS database.
Business Service
Requests can be received via HTTP/REST or any other inbound adapters based on the requirements.
Business Process - FHIR To SDA Transformation
Once InterSystems IRIS receives the FHIR request message, it provides an extensive built-in business process (HS.FHIR.DTL.Util.HC.FHIR.SDA3.Process). This business process takes a FHIR resource or Bundle as input. The FHIR input can only be of the configured FHIR version. This business process transforms the FHIR data into SDA3, forwards the SDA3 stream to a specified business host, receives the response from the business host, and returns a FHIR response.
Please note that you cannot send the received request to this Business process directly.
The request input type should be in the following:
“HS.FHIRServer.Interop.Request” – for Interoperability production.
“HS.Message.FHIR.Request” – FHIR repository server.
It means that you must convert the request to one of the abovementioned formats before sending.
Creating Interop.Request
ClassMethod CreateReqObjForFHIRToSDA(pFHIRResource As %DynamicObject) As HS.FHIRServer.Interop.Request
{
#; sample message
set pFHIRResource = {"resourceType":"Patient","name":[{"use":"official","family":"ashok te","given":["Sidharth"]}],"gender":"male","birthDate":"1997-09-08","telecom":[{"system":"phone","value":"1234566890","use":"mobile"},{"system":"email","value":"tornado1212@gmail.com"}],"address":[{"line":["Some street"],"city":"Manipal1","state":"Karnataka1","postalCode":"1234561"}]}
set stream = ##class(%Stream.GlobalCharacter).%New()
do stream.Write(pFHIRResource.%ToJSON())
#; create Quick stream
set inputQuickStream = ##class(HS.SDA3.QuickStream).%New()
set inputQuickStreamId = inputQuickStream.%Id()
$$$ThrowOnError( inputQuickStream.CopyFrom(stream) )
#dim ensRequest as HS.FHIRServer.Interop.Request = ##class(HS.FHIRServer.Interop.Request).%New()
set ensRequest.QuickStreamId = inputQuickStreamId
return ensRequest
Once the HS.FHIRServer.Interop.Request message is created, send it to the Business process to convert the FHIR resource to an SDA bundle.
Production settings:
Business Service Class
The Class receives the stream of a FHIR resource via an HTTP request, converts this stream input to the standard process expected format HS.FHIRServer.Interop.Request, and finally calls the FHIR adapter process class to generate the SDA.
Class Samples.Interop.BS.FHIRReceiver Extends Ens.BusinessService
{
Parameter ADAPTER = "EnsLib.HTTP.InboundAdapter";
Property TargetConfigName As Ens.DataType.ConfigName [ InitialExpression = "HS.FHIR.DTL.Util.HC.FHIR.SDA3.Process" ];
Method OnProcessInput(pInput As %Stream.Object, Output pOutput As %Stream.Object) As %Status
{
set inputQuickStream = ##class(HS.SDA3.QuickStream).%New()
set inputQuickStreamId = inputQuickStream.%Id()
$$$ThrowOnError( inputQuickStream.CopyFrom(pInput) )
#dim ensRequest as HS.FHIRServer.Interop.Request = ##class(HS.FHIRServer.Interop.Request).%New()
set ensRequest.QuickStreamId = inputQuickStreamId
Do ..SendRequestSync(..TargetConfigName, ensRequest, .pOutput)
Quit $$$OK
}
}
Creating SDA from the FHIR Resource Using ObjectScript
In the previous example, the SDA document was generated from FHIR with the help of the Interoperability framework. In this section, we will employ an SDA from FHIR directly using ObjectScript.
Once you have received the FHIR resource/Bundle as a request into the IRIS, convert the FHIR JSON to an SDA container:
Convert the InterSystems %DynamicObject AKA JSON into %Stream object.
Execute the TransformStream method from the HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3 class, which returns the SDA container object as a response.
///Simple, straightforward FHIR JSON resource to SDA conversion
ClassMethod CreateSDAFromFHIRJSON()
{
try {
; have to send as a stream, not a %DynamicObject
set patientStream = ##Class(%Stream.GlobalCharacter).%New()
do patientStream.Write({"resourceType":"Patient","name":[{"use":"official","family":"ashok te","given":["Sidharth"]}],"gender":"male","birthDate":"1997-09-08","telecom":[{"system":"phone","value":"1234566890","use":"mobile"},{"system":"email","value":"tornado1212@gmail.com"}],"address":[{"line":["Some street"],"city":"Manipal1","state":"Karnataka1","postalCode":"1234561"}]}.%ToJSON())
#dim SDAObj As HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3 = ##class(HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3).TransformStream(patientStream,"R4","JSON")
set SDAContainer = SDAObj.container
; XML-based SDA output
write SDAContainer.XMLExport()
}
catch ex {
write ex.DisplayString()
}
}
FHIR XML to SDA container.
Convert the XML into %Stream object.
Execute the TransformStream method from the HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3 class, which returns the SDA container object as a response.
/// Simple, straightforward FHIR XML resource to SDA conversion
ClassMethod CreateSDAFromFHIRXML()
{
try {
set patientXML = "<Patient xmlns=""http://hl7.org/fhir""><id value=""example""/><text><status value=""generated""/><div xmlns=""http://www.w3.org/1999/xhtml""><p>John Doe</p></div></text><identifier><use value=""usual""/><type><coding><system value=""http://terminology.hl7.org/CodeSystem/v2-0203""/><code value=""MR""/></coding></type><system value=""http://hospital.smarthealth.org""/><value value=""123456""/></identifier><name><use value=""official""/><family value=""Doe""/><given value=""John""/></name><gender value=""male""/><birthDate value=""1980-01-01""/></Patient>"
set patientStream = ##Class(%Stream.GlobalCharacter).%New()
do patientStream.Write(patientXML)
#dim SDAObj As HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3 = ##class(HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3).TransformStream(patientStream,"R4","XML")
set SDAContainer = SDAObj.container
; XML-based SDA output
write SDAContainer.XMLExport()
}
catch ex {
write ex.DisplayString()
}
}
By following the steps detailed above, you can seamlessly transform data to or from a FHIR resource.
Other built-in FHIR repository and FHIR Facade options are valuable tools for exposing a FHIR-compliant system and for handling and storing FHIR resources efficiently. Excellent, super complete article!
Article
Kurro Lopez · Jun 25
Previously, we trained our model using machine learning. However, the sample data we utilized was generated directly from insert statements.
Today, we will learn how to load this data straight from a file.
Dump Data
Before dumping the data from your file, check what header the fields have.
In this case, the file is called “Sleep_health_and_lifestyle_dataset.csv” and is located in the data/csv folder.
This file contains 374 records plus a header (375 lines).
The header includes the following names and positions:
Person ID
Gender
Age
Occupation
Sleep Duration
Quality of Sleep
Physical Activity Level
Stress Level
BMI Category
Systolic
Diastolic
Heart Rate
Daily Steps
Sleep Disorder
It is essential to know the names of column headers.
The class St.MLL.insomnia02 has different column names; therefore, we need to load the data indicating the name of the column into the file, while the relation with the column is placed in the table.
LOAD DATA FROM FILE '/opt/irisbuild/data/csv/Sleep_health_and_lifestyle_dataset.csv'
INTO St_MLL.insomnia02
(Gender,Age,Occupation,SleepDuration,QualitySleep,PhysicalActivityLevel,
StressLevel,BMICategory,Systolic,Diastolic,HeartRate,DailySteps,SleepDisorder)
VALUES ("Gender","Age","Occupation","Sleep Duration","Quality of Sleep","Physical Activity Level",
"Stress Level","BMI Category","Systolic","Diastolic","Heart Rate","Daily Steps","Sleep Disorder")
USING {"from":{"file":{"header":true}}}
All the information makes sense, but… What is the last instruction?
{
"from": {
"file": {
"header": true
}
}
}
This is an instruction for the LOAD DATA command to determine what the file is (whether or not it has a header; whether the column separator is another character, etc).
You can find more information about the JSON options by checking out the following links:
LOAD DATA (SQL)
LOAD DATA jsonOptions
Since the columns of the file do not match those in the tables, it is necessary to indicate that the document has a line with the header, because by default, this value is “false”.
Now, we will drill our model once more. With much more data in hand, it will be way more efficient at this point.
TRAIN MODEL insomnia01AllModel FROM St_MLL.insomnia02
TRAIN MODEL insomnia01SleepModel FROM St_MLL.insomnia02
TRAIN MODEL insomnia01BMIModel FROM St_MLL.insomnia02
Populate the St_MLL.insomniaValidate02 table with 50% of St_MLL.insomnia02 rows:
INSERT INTO St_MLL.insomniaValidate02(
Age, BMICategory, DailySteps, Diastolic, Gender, HeartRate, Occupation, PhysicalActivityLevel, QualitySleep, SleepDisorder, SleepDuration, StressLevel, Systolic)
SELECT TOP 187
Age, BMICategory, DailySteps, Diastolic, Gender, HeartRate, Occupation, PhysicalActivityLevel, QualitySleep, SleepDisorder, SleepDuration, StressLevel, Systolic
FROM St_MLL.insomnia02
Validate the models with the newly validated table:
INSERT INTO St_MLL.insomniaTest02(
Age, BMICategory, DailySteps, Diastolic, Gender, HeartRate, Occupation, PhysicalActivityLevel, QualitySleep, SleepDisorder, SleepDuration, StressLevel, Systolic)
SELECT TOP 50
Age, BMICategory, DailySteps, Diastolic, Gender, HeartRate, Occupation, PhysicalActivityLevel, QualitySleep, SleepDisorder, SleepDuration, StressLevel, Systolic
FROM St_MLL.insomnia02
Proceeding with our previous model (a nurse, 29-year-old, female), we can check what prediction our test table will make.
Note: The following queries will be focused exclusively on this type of person.
SELECT *, PREDICT(insomnia01AllModel) FROM St_MLL.insomnia02
WHERE age = 29 and Gender = 'Female' and Occupation = 'Nurse'
SURPRISE!!! The result is identical to the one with less data. We thought that training our model with more data would improve the outcome, but we were wrong.
For a change, I executed the probability query instead, and I got a pretty interesting result:
SELECT Gender, Age, SleepDuration, QualitySleep, SleepDisorder, PREDICT(insomnia01SleepModel) As SleepDisorderPrediction, PROBABILITY(insomnia01SleepModel FOR 'Insomnia') as ProbabilityInsomnia,
PROBABILITY(insomnia01SleepModel FOR 'Sleep Apnea') as ProbabilityApnea
FROM St_MLL.insomniaTest02
WHERE age = 29 and Gender = 'Female' and Occupation = 'Nurse'
According to the data (sex, age, sleep quality, and sleep duration), the probability of having insomnia is only 46.02%, whereas the chance of having sleep apnea is 51.46%.
Our previous data training provided us with the following percentages: insomnia - 34.63%, and sleep apnea - 64.18%.
What does it mean? The more data we have, the more accurate results we obtain.
Time Is Money
Now, let's try another type of training, using the time series.
Following the same steps we took to build the insomnia table, I created a class called WeatherBase:
Class St.MLL.WeatherBase Extends %Persistent
{
/// Date and time of the weather observation in New York City
Property DatetimeNYC As %DateTime;
/// Measured temperature in degrees
Property Temperature As %Numeric(SCALE = 2);
/// Apparent ("feels like") temperature in degrees
Property ApparentTemperature As %Numeric(SCALE = 2);
/// Relative humidity (0 to 1)
Property Humidity As %Numeric(SCALE = 2);
/// Wind speed in appropriate units (e.g., km/h)
Property WindSpeed As %Numeric(SCALE = 2);
/// Wind direction in degrees
Property WindBearing As %Numeric(SCALE = 2);
/// Visibility distance in kilometers
Property Visibility As %Numeric(SCALE = 2);
/// Cloud cover fraction (0 to 1)
Property LoudCover As %Numeric(SCALE = 2);
/// Atmospheric pressure in appropriate units (e.g., hPa)
Property Pressure As %Numeric(SCALE = 2);
}
Then, I built two classes extending from WeatherBase (Weather and WeatherTest). It allowed me to have the same columns for both tables.
There is a file named “NYC_WeatherHistory.csv” in the csv folder. It contains the temperature, humidity, wind speed, and pressure for New York City in 2015. It is a fortune of data!! For that reason, we will load the file into our table using the knowledge about how to load data from a file.
LOAD DATA FROM FILE '/opt/irisbuild/data/csv/NYC_WeatherHistory.csv'
INTO St_MLL.Weather
(DatetimeNYC,Temperature,ApparentTemperature,Humidity,WindSpeed,WindBearing,Visibility,LoudCover,Pressure)
VALUES ("DatetimeNYC","Temperature","ApparentTemperature","Humidity","WindSpeed","WindBearing","Visibility","LoudCover","Pressure")
USING {"from":{"file":{"header":true}}}
📣NOTE: The names of the columns and the fields in the table are the same, therefore, we can use the following sentence instead.
LOAD DATA FROM FILE '/opt/irisbuild/data/csv/NYC_WeatherHistory.csv'
INTO St_MLL.Weather
USING {"from":{"file":{"header":true}}}
Now we will create our model, but we will do it in a particular way.
CREATE TIME SERIES MODEL WeatherForecast
PREDICTING (Temperature, Humidity, WindSpeed, Pressure)
BY (DatetimeNYC) FROM St_MLL.Weather
USING {"Forward":3}
If we wish to create a prediction series, we should take into account the recommendations below:
The date field must be datetime.
Try to sort the data chronologically.
📣NOTE: This advice comes from Luis Angel Perez, thanks to his great experience in Machine Learning.
The latest command, USING {"Forward":3}, sets the timesteps for the time series.
This parameter has other values:
forward specifies the number of timesteps in the future that you would like to foresee as a positive integer. Approximated rows will appear after the latest time or date in the original dataset. However, you may specify both this and the backward setting simultaneously.
Example: USING {"Forward":3}
backward defines the number of timesteps in the past that you would like to predict as a positive integer. Forecasted rows will appear before the earliest time or date in the original dataset. Remember that you can indicate both this and the forward setting at the same time. The AutoML provider ignores this parameter.Example: USING {"backward":5}
frequency determines both the size and unit of the predicted timesteps as a positive integer followed by a letter that denotes the unit of time. If this value is not appointed, the most common timestep in the data is supplied.
Example: USING {"Frequency":"d"}
This parameter is case-insensitive.
The letter abbreviations for units of time are outlined in the following table:
Abbreviation
Unit of Time
y
year
m
month
w
week
d
day
h
hour
t
minute
s
second
Now… training. You already know the command for that:
TRAIN MODEL WeatherForecast
Be patient! This training took 1391 seconds, wich is approximately 23 minutes!!!!
Now, populate the table St_MLL.WeatherTest with the command Populate.
Do ##class(St.MLL.WeatherTest).Populate()
It includes the first 5 days of January 2025. When completed, select the prediction using the model and the test table.
📣Remember: It is crucial to have at least three values to be able to make a prognosis.
SELECT WITH PREDICTIONS (WeatherForecast) * FROM St_MLL.WeatherTest
Well, it is showing us the forecast for the next 3 hours on January 2, 2025. This happens because we defined our model to forecast 3 records ahead. However, our data model has data for every hour of every day (00:00, 01:00, 02:00, etc.)
If we want to see the daily outlook, we should create another model trained to do so by the day.
Let's create the following model to see the 5-day forecast.
CREATE TIME SERIES MODEL WeatherForecastDaily
PREDICTING (Temperature, Humidity, WindSpeed, Pressure)
BY (DatetimeNYC) FROM St_MLL.Weather
USING {"Forward":5, "Frequency":"d"}
Now, repeat the same steps… training and displaying the forecast:
TRAIN MODEL WeatherForecastDaily
SELECT WITH PREDICTIONS (WeatherForecastDaily) * FROM St_MLL.WeatherTest
Wait! This time, it throws out the following error:
[SQLCODE: <-400>:<Fatal error occurred>][%msg: <PREDICT execution error: ERROR #5002: ObjectScript error: <PYTHON EXCEPTION> *<class 'ValueError'>: forecast_length is too large for training data. What this means is you don't have enough history to support cross validation with your forecast_length. Various solutions include bringing in more data, alter min_allowed_train_percent to something smaller, and also setting a shorter forecast_length to class init for cross validation which you can then override with a longer value in .predict() This error is also often caused by errors in inputing of or preshaping the data. Check model.df_wide_numeric to make sure data was imported correctly. >]
What has happened?
As the error says, it is due to the lack of data to make a prediction. You might think that it needs more data in the Weather table and training, but it has 8760 records… so what is wrong?
If we want to forecast the weather for a large number of days, we need a lot of data in the model. Filling all the data into a table requires extensive training time and a very powerful PC. Therefore, since this is a basic tutorial, we will build a model for 3 days only. Don’t forget to remove the model WeatherForecastDaily before following the instructions.
DROP MODEL WeatherForecastDaily
I am not going to include all the images of those changes, but I will give you the instructions on what to do:
CREATE TIME SERIES MODEL WeatherForecastDaily
PREDICTING (Temperature, Humidity, WindSpeed, Pressure)
BY (DatetimeNYC) FROM St_MLL.Weather
USING {"Forward":3, "Frequency":"d"}
TRAIN MODEL WeatherForecastDaily
SELECT WITH PREDICTIONS (WeatherForecastDaily) * FROM St_MLL.WeatherTest
Important Note
The Docker container containers.intersystems.com/intersystems/iris-community-ml:latest-em is no longer available, so you have to use the iris-community container.
This container is not initialized with the AutoML configuration, so the following statement will need to be executed first:
pip install --index-url https://registry.intersystems.com/pypi/simple --no-cache-dir --target /usr/irissys/mgr/python intersystems-iris-automl
If you are using a Dockerfile to deploy your Docker image, remember to add the command below to the deployment instructions:
ARG IMAGE=containers.intersystems.com/intersystems/iris-community:latest-em
FROM $IMAGE
USER root
WORKDIR /opt/irisbuild
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /opt/irisbuild
RUN pip install --index-url https://registry.intersystems.com/pypi/simple --no-cache-dir --target /usr/irissys/mgr/python intersystems-iris-automl
For more information, please visit the website below:
https://docs.intersystems.com/iris20251/csp/docbook/DocBook.UI.Page.cls?KEY=GIML_Configuration_Providers#GIML_Configuration_Providers_AutoML_Install
Announcement
Anastasia Dyubaylo · Jul 17
Hi Community!
We’re pleased to announce that several Early Access Programs (EAPs) are now open for registration. These programs provide developers with the opportunity to explore upcoming features and technologies from InterSystems before their general release.
By joining an EAP, you can:
Evaluate and test new functionality
Provide direct feedback to product teams
Help shape the future direction of InterSystems platforms
If you're interested in contributing to the evolution of our tools and getting early insight into what's coming next, we encourage you to review the following available programs and sign up:
Name
Description
FHIR Application Training Course
InterSystems is developing a comprehensive FHIR application development course. The course will consist of 40 hours of recorded video content, numerous GitHub repositories, interactive quizzes, and supplementary material. The course will be targeted at FHIR application developers and will use the InterSystems IRIS for Health Community Edition with application development in Python.
Health Connect - AI Copilot for DTL Explanations
Uses generative AI to provide human-readable summaries for Data Transformation Language (DTL) logic. This reduces onboarding time for new interface developers, accelerates troubleshooting, and makes it easier for non-experts to understand and maintain complex data transformations.
Health Connect - DTL Assistant Copilot for HL7 Transformations
Introduces AI-powered mapping assistance that suggests transformations, auto-generates mappings, and helps enforce standards between HL7 message formats. This assistant shortens development cycles, reduces errors, and increases team productivity by lowering the technical barrier to working with HL7.
Health Connect - CDA Validation
Enables robust validation of Clinical Document Architecture (CDA) files against standards and rules, improving data integrity and compliance.This tool helps organizations detect structural and content-related issues early, ensuring smoother data exchange and regulatory readiness.
Health Data De-Identifier
Health Data De-identifier is a configurable framework to de-identify structured clinical data. It incorporates HIPAA Safe Harbor rules for the US but provides hooks to be adjusted for regional requirements.
InterSystems Data Fabric Studio Virtual Assistant module
InterSystems Data Fabric Studio (IDFS) simplifies data management and exploration. With its Virtual Assistant module, users gain access to interactive assistants that help them understand, navigate, and leverage their data more effectively. Built on an agentic framework, IDFS supports reasoning, diagnostics, evaluation, and governance capabilities. Users can also design custom assistants and agents that are enriched with specialized knowledge and memory for context-aware interaction.
InterSystems Data Fabric Studio with Health Module
Provides a fully managed, self-service platform for provisioning trusted healthcare datasets, data models for analytics, AI models, and operational reporting. It includes out-of-the-box business connectors, pipeline building, and data catalog modeling capabilities.
InterSystems IRIS Security Database
This new feature provides greater security by moving sensitive data from IRISSYS to a new database: IRISSECURITY. An additional security role has been added to restrict access to this data.
OAuth2 Authentication/Authorization
InterSystems is making it easier for customers to use and configure OAuth2.
Online Backup
With Online Backup, InterSystems IRIS automatically tracks which blocks change, such that it can easily create incremental backups of your data without freezing or otherwise interrupting regular operations. In InterSystems IRIS 2024.1, the first part of a significant overhaul of this capability is now available for your evaluation, bringing orders-of-magnitude faster backup and restore operations compared to the original version. If you are using or considering Online Backup today, please join the Early Access Program to receive updates and share your feedback.
Table Partitioning
Table Partitioning helps users manage large tables efficiently by enabling them to split the data across multiple databases based on a logical scheme. This enables, for example, moving older data to a database mounted on a cheaper tier of storage, while keeping the current data that is accessed frequently on premium storage. The data structure for partitioned tables also brings several operational and performance benefits when tables get very large (> 1B rows).
Participation may be limited, so we recommend registering early if you're interested. If you have any questions, please don't hesitate to ask them in the comments or send an email to EarlyAccess@InterSystems.com.
>> REQUEST EARLY ACCESS HERE <<
Article
Vachan C Rannore · Jul 24
Are you curious about how to run Python scripts directly in your InterSystems IRIS or Caché terminal? 🤔 Good news it's easy! 😆 IRIS supports Embedded Python, allowing you to use Python interactively within its terminal environment.
How to access the Python Shell?
To launch the Python shell from the IRIS terminal, simply run the following command:
do ##class(%SYS.Python).Shell()
This opens an interactive Python shell inside the IRIS terminal. From here, you can write and run Python code just as you would in a normal Python environment.
Exiting the Shell:
>>> quit()
This will exit the Python shell and return you to the ObjectScript prompt.
USER>do ##class(%SYS.Python).Shell()
Python 3.9.5 (default, May 31 2022, 12:35:47) [MSC v.1927 64 bit (AMD64)] on win32
Type quit() or Ctrl-D to exit this shell.
>>> name = 'Vachan'
>>> age = 25
>>> print('Name: ',name,'\nAge:',age)
Name: Vachan
Age: 25
>>> quit()
This is a great way to leverage Python's capabilities within your InterSystems environment. Whether you're experimenting, testing logic, or integrating with ObjectScript, the embedded Python shell makes it fast and flexible.
Enjoy Coding! 👨💻
You can use :py alias to connect the python shell in IRIS terminal as well. Thanks! It's a cool article 😄 I'm gonna try it. Thanks! that worked! If you use the InterSystems CLI vis your OS shell, you can also simply run:
#iris python instancename
See the iris command docs (at least for some OSs).
Announcement
Anastasia Dyubaylo · Jun 5
Hello Community,
We're thrilled to invite all our Developer Community members (both InterSystems employees and not) to participate in our next contest!
💡 The 4th InterSystems Ideas Contest 💡
We're looking for your innovative ideas to enhance InterSystems IRIS and related products and services. We encourage suggestions based on real-life use cases, highlighting the tangible benefits your idea will bring to other users and how it will enhance developers' experiences with InterSystems technology.
📅 Duration: June 9 - July 20, 2025
🏆 Prizes for the best ideas and a random draw!
🎁 Gifts for everyone: A special gift will be given to each author whose idea is accepted in the contest.
>> SUBMIT AN IDEA <<
Accepted ideas should:
be created during the Ideas Contest period by a user registered on the InterSystems Ideas portal (you can log in via InterSystems SSO);
not be part of other already existing ideas - only new ideas are allowed;
not describe the existing functionality of InterSystems IRIS and related Products or Services;
be posted in English;
be written by a person, not generated by AI;
be accepted as meaningful by InterSystems experts;
❗adhere to the structure below:
1️⃣ Description of the idea
2️⃣ Who is the target audience?
3️⃣ What problem does it solve?
4️⃣ How does this impact the efficiency, stability, reliability, etc, of the product?
5️⃣ Provide a specific use case or scenario that illustrates how this idea could be used in practice.
All ideas are subject to moderation. We may request to clarify the submitted idea. Ideas that meet the requirements will receive a special "Ideas Contest" status.
Who can participate?
We invite EVERYONE to join our new Ideas Contest. Both InterSystems employees and non-employees are welcome to participate and submit their ideas.
Prizes
1. Participation gift - authors of all accepted ideas will get:
🎁 Aluminum Media Stand
2. Expert award - InterSystems experts will select the best ideas. Winners will get:
🥇 1st place - Stilosa Barista Espresso Machine & Cappuccino Maker
🥈 2nd place - Osmo Mobile 7
🥉 3rd place - Smart Mini Projector XGODY Gimbal 3
3. Random award - a participating idea author chosen at random will get:
🏅 Smart Mini Projector XGODY Gimbal 3
Note: InterSystems employees are eligible to receive only the participation gift. Expert and Random awards can only be won by Developer Community members who are not InterSystems employees.
Important dates:
⚠️ Idea Submission: June 9 - July 13
✅ Voting for ideas: July 14 - July 20
🎉 Winners announcement: July 21
Good luck! 🍀
Note: All prizes are subject to availability and shipping options. Some items may not be available for international shipping to specific countries, in this case, an equivalent alternative will be provided. We will let you know if a prize is not available and offer a possible replacement. Prizes cannot be delivered to residents of Crimea, Russia, Belarus, Iran, North Korea, Syria, or other US-embargoed countries. Can inters join and do we count as employees who can get the participation gift? 😊 Interns are absolutely welcome to join — we’d love to have you involved! 😊 And they are considered employees for this contest.
While the Expert and Random awards are reserved for non-employees, taking part is still a great opportunity. As an intern, you have a unique, hands-on perspective that can contribute to a deeper understanding of what the product truly needs. Thanks for clarification. I'll be thinking of ideas! As I'm diving into Angular right now, mine is to add a projection to a TypeScript interface.
Is there a specific tag we're supposed to use for the contest this year? Hey Developers!
The fantastic prizes for the 4th InterSystems Ideas Contest were chosen, and here they are:
Expert Award 🏆
InterSystems experts will select the best ideas, with amazing prizes awaiting the winners:
🥇 1st place: Stilosa Barista Espresso Machine & Cappuccino Maker
🥈 2nd place: Osmo Mobile 7
🥉 3rd place: Smart Mini Projector XGODY Gimbal 3
Random Award
One lucky idea chosen at random will win:
🏅 Smart Mini Projector XGODY Gimbal 3
Reminder: To qualify for the contest, ensure your idea submission follows this required structure:
1. Description of the idea2. Who is the target audience?3. What problem does it solve?4. How does this impact the efficiency, stability, reliability, etc., of the product?5. Provide a specific use case or scenario that illustrates how this idea could be used in practice.
Good luck, everyone! 🚀✨ There is no need to choose a specific tag. All ideas that pass our experts' master will be added to the Contest. Hi Community!
We have an update on the dates of the contest - it's extended until July 20. During InterSystems Ready 2025, we received numerous requests to do this, as many of you were focused on your presentations or other commitments related to the event and didn't have the opportunity to submit your ideas.
You asked, we listened!
Don't forget, for the idea to take part in the contest, it has to follow the structure:
Description of the idea
Who is the target audience?
What problem does it solve?
How does this impact the efficiency, stability, reliability, etc, of the product?
Provide a specific use case or scenario that illustrates how this idea could be used in practice.
At this point, we have a lot of interesting ideas, but they don't adhere to the terms, so they aren't considered for the contest. @Mark.OReilly, @Andre.LarsenBarbosa, @Abdul.Manan, @Marykutty.George1462, @Jeffrey.Drumm, @Robert.Barbiaux, @Sylvain.Guilbaud, @Ashok.Kumar. Hey Community!
During the contest period, 43 ideas were submitted to the Ideas Portal, thank you for your contributions! 🙌Out of those, 24 ideas have been accepted into the Contest so far.
If your idea wasn't accepted yet (one of the remaining 19), there's still time! To be included in the Contest, please make sure your idea follows this required structure:
1️⃣ Description of the idea2️⃣ Who is the target audience?3️⃣ What problem does it solve?4️⃣ How does this improve the efficiency, stability, reliability, etc., of the product?5️⃣ Provide a specific use case or scenario that shows how your idea could be used in practice
🕒 You have until the end of day Sunday to update your submissions. Don’t miss your chance to participate!
Good luck! 🍀 Hey Community!
The submission period is over, and now it's voting time! While the judges are hard at work, let's look at the ideas that are participating in the contest:
Author
Idea
@Yuri.Gomes
Extending an open source LLM to support efficient code generation in intersystems technology
@David.Hockenbroch
Add Typescript Interface Projection
@Enrico.Parisi
Make DICOM iteroperability adapter usable in Mirror configuration/environment
@Marykutty.George1462
Ability to abort a specific message from message viewer or visual trace page
@Enrico.Parisi
Do not include table statistics when exporting Production for deployment
@Ashok.Kumar
recursive search in Abstract Set Query
@Ashok.Kumar
TTL(Time To Live) Parameter in %Persistent Class
@Ashok.Kumar
Programmatic Conversion from SDA to HL7 v2
@Ashok.Kumar
Streaming JSON Parsing Support
@Ashok.Kumar
Differentiating System-Defined vs. User-Defined Web Applications in IRIS
@Ashok.Kumar
Need for Application-Specific HTTP Tracing in Web Gateway
@Ashok.Kumar
Add Validation for Dispatch Class in Web Application Settings
@Ashok.Kumar
Encoding in SQL functions
@Ashok.Kumar
Compression in SQL Functions
@Alexey.Maslov
Universal Global Exchange Utility
@Ashok.Kumar
Automatically Expose Interactive API Documentation
@Vishal.Pallerla
Dark Mode for Management Portal
@Ashok.Kumar
IRIS Native JSON Schema Validator
@Ashok.Kumar
Enable Schema Validation for REST APIs Using Swagger Definitions
@diba
Auto-Scaling for Embedded Python Workloads in IRIS
@Dmitry.Maslennikov
Integrate InterSystems IRIS with SQLancer for Automated SQL Testing and Validation
@Dmitry.Maslennikov
Bring IRIS to the JavaScript ORM World
@Ashok.Kumar
HTML Report for UnitTest Results
@Andre.LarsenBarbosa
AI Suggestions for Deprecated Items
@Mark.OReilly
Add a field onto Oauth Client to allow alerting expiry dates alert
@Mark.OReilly
Expose "Reply To" as default on EnsLib.EMail.AlertOperation
I have updated the structure on my 2 ideas, wasn't aware of the contest, was just creating ideas ah it's closed now, no matter, hopefully in clearer format anyway now for actioning Since it's the beginning of the voting period, it was decided to add your ideas to the contest. Good luck!
Article
Irène Mykhailova · Jun 28
Hey Community!
Here's the recap of the final half-day of the InterSystems Ready 2025! It was the last chance to see everyone and say farewell until next time.
It was a warm and energetic closing, with great conversations, smiles, and unforgettable memories!
The final Ready 2025 moment with our amazing team!
And, of course, let’s say a huge THANK YOU to a godmother of the Ready 2025, @Maureen.Flaherty! You and your team are the best! Here we are together with @Enrico.Parisi.
@Patrick.Sulin7198 dropped by Developer Cmmunity table:
And @Yuri.Gomes
Caught @Scott.Roth outside the Tech Exchange
And @Sergei.Shutov3787
My golf buddy @Anzelem.Sanyatwe also came to spin the wheel of fortune. And Luc Chatty dropped by.
We went to visit the source of great ribbons. Here are @Iryna.Mykhailova, @Macey.Minor3011, @Andre, @Anastasia.Dyubaylo
It was also time for the winners of the AI Programming Contest to present their AI agentic applications!
@Sergei.Shutov3787 talked about AI Agents as First-Class Citizens in InterSystems IRIS:
@Eric.Fortenberry presented "A Minimalist View of AI: Exploring Embeddings and Vector Search with EasyBot":
@Yuri.Gomes spoke about Natural Language Control of IRIS:
@Muhammad.Waseem talked about Next generation of autonomous AI Agentic Applications:
@henry, @Henrique, and @José.Pereira got hid by all the people who came to listen "Command the Crew - create an AI crew to automate your work" presentation:
@Victor.Naroditskiy explained how Developer Community AI works:
Also, on the other tables people carried out other presentations. For example, @Guillaume.Rongier7183 talked about Python:
Let's leave Tech Exchange and see what was going on at the DC sessions. @Benjamin.Spead, @Hannah.Sullivan, @Victor.Naroditskiy, and @Dean.Andrews2971 talked about using SerenityGPT to build GenAI middleware:
And, of course, the main session of the Ready 2025 - InterSystems Developer Ecosystem: new resources and tools you need to know. @Dean.Andrews2971 and @Anastasia.Dyubaylo gave an overview of all the updates to the DC Ecosystem:
Afterwards, @David.Reche checked how attentively everyone was listening by leading the Kahoot! game. Please welcome the winners: @Vishal.Pallerla, @Rochael.Ribeiro and @Jason.Morgan. Congratulations! We hope you enjoy your prize!
@Juliana.MatsuzakiModesto, @DKG, @Rochael.Ribeiro, @Katia.Neves, @Anastasia.Dyubaylo, @Dean.Andrews2971, @Enrico.Parisi, @Vishal.Pallerla, @Eduard.Lebedyuk
On this happy note, I promised last time to tell you who was the only verified person who answered all the quiz questions correctly at the DC table. And it was @Asaf.Sinay! Congratulations! @Olga.Zavrazhnova2637 and the whole Global Masters team are happy that so many people came and tried to master it. If you're interested to do a quiz, here's the link. And if you want to answer more quiz questions, you can find them on Global Masters!
Talking about Global Masters and quizzes, you can't skip the most popular reward 😁 No summit goes by without someone showing me their Developer Community socks 🤣
As you can see, the Brazilian DC team is very happy: @Rochael.Ribeiro, @Juliana.MatsuzakiModesto. @Danusa.Ferreira and @Heloisa.Paiva we really missed you - with you, the Portuguese Developer Community team would've been complete!
This was almost the end of the Ready 2025 and it's the end of my story.
The rumor is, the next summit will take place in April in Washington, D.C. Put it in your calendar not to double book, you know you want to!
See you next year! Great event, fantastic DC events and very happy to meet persons that make our community Thanks @Irène.Mykhailova for the sharing.This year’s event was an incredible opportunity to meet community heroes, explore cutting-edge technologies, forge meaningful connections, and exchange ideas with industry leaders. It has been very interesting and, as usual, keeping in touch with old fellows as well meeting new ones is the most valuable think of the conference.
And, HEY! only 10 month to the next conference!Washington DC from 27th to 29th of April!
Please note that next conference will start with the Welcome Reception on Monday (usually Sunday).
I'm looking forward to meet you all in DC! 😊 Great team!!!I've missed you all so much this year, I hope to see you all next year. What an incredible event! 🙌
It was so great to see such a strong presence of our amazing Developer Community — so many familiar faces and so many new ones too!
Thanks to everyone who made this experience so special. Already looking forward to next year! 😊 It was very good to see you all !!!!! It was so great to see you and being your neighbors again at the Tech Exchange pavilion! It was a great event full of interesting info and people! So nice! Tks for the reminder 😉 can't wait for your presentation's recording to be available! It broke my heart to have had to miss it.
Article
Irène Mykhailova · Jun 25
Hi Community!
I'm super excited to be your on-the-ground reporter for the biggest developer event of the year - InterSystems Ready 2025!
As you may know from previous years, our global summits are always exciting, exhilarating, and packed with valuable knowledge, innovative ideas, and exciting news from InterSystems. This year is no different. But let's not get ahead of ourselves and start from the beginning.
Pre-summit day was, as usual, filled with fun and educational experiences. Those who enjoy playing golf (I among them) got up at the crack of dawn to tee off before the sun got too high up. Here's our dream team in action:
@sween, @Mark.Bolinsky, @Anzelem.Sanyatwe, @Iryna.Mykhailova
If you're interested, here are the results (but to save you the suspense, we didn't win 😭):
The other group of sports enthusiasts went to play football (AKA soccer). And those who are differently inclined attended the different workshops planned for Sunday:
AI-enabling your applications with InterSystems IRIS
Discovering InterSystems products: a high-level overview
Get ready to build with FHIR in InterSystems: visualizing data as FHIR resources
From FHIR to insights: analytics with FHIRPath, SQL Builder, and Pandas
Ready Startup Forum: insights, innovations & investment with InterSystems
Yet another exciting yearly pre-summit event was a Women's meet-up and reception. Unfortunately, after playing 18 hot and humid holes, I didn't have enough time to make myself presentable before the beginning.
Anyway, everyone was ready to begin the InterSystems Ready 2025 with a bang and turned up at the Welcome reception on time!
Let me share a secret - it's always a highlight of the event to meet friends and colleagues after a long pause.
@Iryna.Mykhailova, @Johan.Jacob7942, @Lorenzo.Scalese, @Adeline.Icard, @Guillaume.Rongier7183
And on Monday, the main event began with the keynote presentation from Terry Ragon, CEO & Founder of InterSystems, with a warm welcome, highlighting InterSystems' dedication to creating technology that truly matters during a time of fast change. He discussed the great promise of AI and data platforms to enhance healthcare and emphasized the importance of making a tangible difference, rather than merely following trends.
Later on, there was a panel discussion moderated by Jennifer Eaton between @Donald.Woodlock, Scott Gnau, and Tim Ferris on the future of healthcare.
Right before lunch was the best presentation of the day! And it was the best because it mentioned the Developer Community. And to share the excitement of it with you, here's a short clip from it:
And to make your day, here are a couple of photos of one of the presenters, @Randy.Pallotta
The AI did a good job, or did it 😁
Anyway, after lunch, our Developer Community booth at the Tech Exchange was ready to roll.
All our cool prizes and games were out and ready to amaze and entertain our guests!
And they soon came.
At the same time, in the hallway outside the Tech Exchange, the startups were doing their presentations. Here's a photo from the SerenityGPT presentation about their software, which utilizes IRIS Vector search to maximize the potential of clinical data.
And all the while, there were interesting presentations and use-cases of InterSystems technology from InterSystems colleagues and guests:
Moreover, there's a big screen for presentations in Tech Exchange, so don't miss it!
This very long and exciting day ended on a really high note - the Ready Games at the Demos and Drinks! There were many great demos from which the guests had to choose the winners — two runner-ups in each category and two winners, for Most Innovative and Most Likely to Use.
Btw, the winners of the Most Likely to Use category are from Lead North, who brought with them the coolest stickers ever:
So, if you're at the Ready 2025 and haven't yet picked up a cute sticker, don't miss your chance to get one (or more) and to talk to @Andre and his colleagues! Swing by the Partner Pavilion (which starts outside the Tech Exchange) and you will definitely find something you like.
So this is it about the first 1.5 days of the Ready 2025. Look out for a new recap tomorrow of the rest of it. And let me tell you, it is unforgettable!
Announcement
Derek Robinson · Jul 31
Hi, Community!
Are you building applications in a healthcare setting? See how InterSystems FHIR Server can help:
What Is InterSystems FHIR Server?
InterSystems Product Manager @Elijah.Cotterrell explains how InterSystems FHIR Server helps you store, manage, and query healthcare data. In a brief demo, Elijah shows how you can:
Deploy a FHIR server.
Configure OAuth authentication.
You will also learn about two key tools—the Bulk FHIR Coordinator and FHIR SQL Builder—which allow you to scale your applications and perform analytics!
Article
Irène Mykhailova · Jun 27
Hi Community,
While writing an article yesterday, I realized I was so busy with people who came to the Developer Community table at the Tech Exchange that I forgot to take photos for you. Luckily, I realized the error of my ways and corrected my behavior accordingly 😉
So, let's look at what happened on Tuesday at the InterSystems Ready 2025! It began with a speech of Scott Gnau about the approach and architecture of InterSystems Data Platform and how it is different from all other DBMSs:
Afterwards, @Tom.Woodfin and Peter Lesperance dove into the details of using the novelties of IRIS in Epic:
Then, @Gokhan.Uluderya talked about data in AI and how important it is to have good data to be able to apply GenAI or Vector Search to it:
@Jeffrey.Fried picked up this topic and went into more detail about InterSystems GenAI strategy:
Daniel Franko summed up the tools that are available to developers of IRIS for Health:
After lunch most of the participants went on to the sessions or Tech Exchange. For example, @Raj.Singh5479 dropped by our table and we talked about the current Ideas Contest
@Henrique, @henry, @Dean.Andrews2971 and @Guilherme.Silva came up to us as well:
@Lorenzo.Scalese, @Dean.Andrews2971 , @DKG
@Sergei.Shutov3787, @Anastasia.Dyubaylo, @Vishal.Pallerla
@Iryna.Mykhailova, @Anastasia.Dyubaylo, @Robert.Kuszewski
@Henrique, @Benjamin.DeBoe, @Anastasia.Dyubaylo, @Enrico.Parisi, @henry, @Iryna.Mykhailova, @José.Pereira
The "Musketeers" (@henry, @Henrique,@José.Pereira) with @Anastasia.Dyubaylo
@Dean.Andrews2971, Mariam Makhmutova, @Anastasia.Dyubaylo, @DKG
@Muhammad.Waseem, @Guillaume.Rongier7183, @Anastasia.Dyubaylo, @Oliver.Wilms
@DKG, @Anastasia.Dyubaylo, @Benjamin.Spead, @tomd
This year to make it more interesting, for our developer guests we prepared a special challenge - a quiz from Global Masters!
So, here are @Derek.Robinson, @Myles.Collins and @Patrick.Sulin7198 trying to get all 5 answers correctly:
In the next article, you will learn who beat the challenge!
While there was all this excitement at the Developer Community table, there were presentations at the big screen in the Tech Exchange, for example from @Brett.Saviano about VS Code:
And presentations on smaller tables, for example, from @Guillaume.Rongier7183:
Outside the Tech Exchange, the startups were making their presentations. For example, SerenityGPT which created our wonderful DC AI Bot and DC AI Chat:
And in the evening we went to the Universal City Walk and were treated to the concert of Integrity Check, which was a blast!
After the concert, we had the pleasure of the company of the guitar player, aka @Randy.Pallotta
Afterwards, I went to roam and met up with @Dean.Andrews2971, @Adeline.Icard, @Anastasia.Dyubaylo, and @Guillaume.Rongier7183:
We finished the day with a rousing game of Table shuffleboard - ladies (@Adeline.Icard, @Anastasia.Dyubaylo, and me) vs gentlemen (@Guillaume.Rongier7183, @Jeffrey.Fried, @Eduard.Lebedyuk). Guess in the comments who won 😁
All in all, we had a wonderful time at the Universal, which was a great end to a great day.