-WorkList use case: now uses ScheduleProcedure date, better test data
DICOM Integration with InterSystems IRIS for Health
dcm4che simulator · DICOM interoperability workshop
This repository provides hands-on examples of DICOM integration using InterSystems IRIS for Health and the dcm4che DICOM simulator.
You’ll find:
Perfect for testing, learning, or building healthcare imaging integrations.
https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# What you’ll learn
| Use case | DICOM interaction | Integration outcome |
|---|---|---|
| Embedded PDF | C-STORE | IRIS receives a DICOM document and extracts its metadata. |
| Query / Retrieve | C-FIND and C-MOVE | IRIS locates a study in a simulated archive and retrieves it. |
| WorkList | Modality Worklist C-FIND | IRIS queries MySQL and returns scheduled procedure steps. |
| Store over the Web | STOW-RS | IRIS accepts DICOM over HTTP and forwards it to a DICOM receiver. |
DICOM vocabulary: An AE Title is a DICOM application’s name. An SCU sends a request and an SCP receives it. C-FIND searches for matching records, C-MOVE requests a transfer, Modality Worklist supplies scheduled imaging work, and STOW-RS stores DICOM objects over HTTP.
To run this project, you’ll need:
Optional, for browsing and editing the ObjectScript source:
https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# 🚀 Getting Started
Once you’ve got Docker installed, build and start the lab with:
docker compose up -d --build
Confirm that the three services are running before starting a use case:
docker compose ps
You should see iris, tools, and mysql running. That’s it — you’re ready.
https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# Explore the IRIS Production
Open the DICOM production interface in your browser:
DICOM.Production
Credentials: superuser / SYS
https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# 📥 Use Case 1: Receiving DICOM with Embedded PDF
A DICOM file containing a PDF report is received by IRIS. The system extracts metadata from the DICOM header (e.g. patient name, study ID) and stores both the PDF and metadata in another system (like an EHR or document store).
Open a shell in the tools container:
docker exec -it tools bash
Generate a DICOM file with embedded PDF:
./pdf2dcm -f /shared/pdf/metadata.xml -- /shared/pdf/sample.pdf /shared/pdf/embeddedpdf.dcm
Send it to IRIS:
./storescu -b DCM_PDF_SCP -c IRIS_PDF_SCU@iris:2010 /shared/pdf/embeddedpdf.dcm
Check the messages in IRIS:
Message Viewer
Expected outcome: A new inbound DICOM message appears in the IRIS Message Viewer.
https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# 🔍 Use Case 2: Query / Retrieve (C-FIND / C-MOVE)
IRIS queries a PACS using a DICOM C-FIND to locate imaging studies, then uses C-MOVE to retrieve one of the matching documents.
Open the tools container:
docker exec -it tools bash
Inspect a DICOM file:
./dcmdump /shared/dicom/d1I00001.dcm
Create the DICOMDIR database:
./dcmdir -c /shared/DICOMDIR --fs-id SAMPLEDICOMS --fs-desc /shared/dicom/descriptor /shared/dicom
Start the simulated archive:
./dcmqrscp --ae-config /shared/ae.properties -b DCM_QRY_SCP:3010 --dicomdir /shared/DICOMDIR
This command keeps the terminal busy. Leave it running, then open a second terminal for the next steps.
In a second terminal, connect to IRIS:
docker exec -it iris bash
iris session iris
Run the C-FIND:
do https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#class(DICOM.BS.QueryService).TestFind()
View results in QueryService Messages
Expected outcome: IRIS sends a C-FIND request and records matching study information in the Message Viewer.
Request a study using C-MOVE:
do https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#class(DICOM.BS.MoveService).TestMove()
Track the transfer:
MoveService | DICOM Store In
Expected outcome: The selected study is transferred from the simulated archive to IRIS as DICOM C-STORE messages.
https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# 📋 Use Case 3: WorkList Management (C-FIND + SQL)
Description: An imaging device sends a C-FIND request to IRIS to retrieve scheduled studies. IRIS queries an external MySQL database, builds the WorkList response, and sends it back.
https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# Check the external MySQL WorkList DB
Enter the MySQL container:
docker exec -it mysql bash
mysql --host=localhost --user=testuser testdb -p https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# Password: testpassword
View WorkList data:
SELECT * FROM WorkList;
https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# Request the WorkList using C-FIND
Open the tools container:
docker exec -it tools bash
Send a WorkList query:
./findscu -b DCM_WL -c IRIS_WL@iris:1112 -M MWL -m ScheduledProcedureStepSequence.ScheduledProcedureStepStartDate=20250404
This sends a real Modality Worklist C-FIND request using SOP class 1.2.840.10008.5.1.4.31.
Expected outcome: The fixed demo date returns three scheduled entries: DEMO001, DEMO002, and DEMO003.
Check DICOM WL Find In Messages
https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# 🌐 Use Case 4: Store Document over the Web
An imaging device sends an image over HTTP using a STOW-RS (HTTP POST) request to IRIS, which receives, extracts, and processes the DICOM image.
Open the tools container:
docker exec -it tools bash
Run a simulated listener for incoming C-STORE:
./storescp -b DCM_STORE_SCP:4010 --response-delay 5000
This command keeps the terminal busy. Leave it running, then open a second terminal for the STOW-RS request.
In a second terminal, send DICOM images using STOW-RS:
./stowrs --url http://iris:52773/dicom/studies /shared/dicom/d1I00001.dcm /shared/dicom/d1I00002.dcm /shared/dicom/d1I00003.dcm
In IRIS, check the received message in the DICOM REST Service Messages
Expected outcome: IRIS receives the STOW-RS request, and the simulated listener receives the forwarded DICOM C-STORE messages.
You now have a fully working, simulated DICOM integration lab using IRIS for Health and dcm4che. Use it to learn, test and build prototypes.
docker compose down
https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/#https://github.com/intersystems-ib/workshop-iris-dicom-interop/blob/master/# Securing DICOM with TLS
Want to add mutual TLS (mTLS) authentication to your DICOM communications?
Check out the TLS Setup Guide for step-by-step instructions on creating certificates and configuring secure connections between SCU clients and IRIS.