Skip to content

DICOM Source

The DICOM source implements a C-STORE SCP (Service Class Provider), allowing imaging modalities, PACS systems, and other DICOM SCUs to send images and structured reports directly into an intu channel.

Metadata from DICOM tags is processed and made available to the transformer by default. Pixel data (the image itself) is stored separately and referenced in the message payload, keeping the pipeline efficient for metadata-driven workflows.

source:
type: dicom
port: 4104
ae_title: INTU_SCP
calling_ae_titles:
- CT_SCANNER_1
- MR_SCANNER_2
tls:
cert_file: ./certs/server.crt
key_file: ./certs/server.key
PropertyTypeRequiredDefaultDescription
portintYesTCP port to listen for DICOM associations (commonly 104 or 4104).
ae_titlestringNoINTU_SCPApplication Entity title advertised by this SCP.
calling_ae_titlesstring[]NoRestrict accepted associations to these calling AE titles. If omitted, all callers are accepted.
tlsobjectNoTLS certificate and key for encrypted DICOM (DICOM TLS).
TermDescription
AE TitleApplication Entity Title — a unique name identifying a DICOM node on the network.
C-STOREDICOM service for sending (storing) objects from an SCU to an SCP.
SCPService Class Provider — the receiver in a DICOM association (intu acts as this).
SCUService Class User — the sender that initiates the association (e.g. a CT scanner).
SOP ClassIdentifies the type of DICOM object (e.g. CT Image Storage, MR Image Storage).

A radiology ingest channel that receives DICOM images and converts metadata to a FHIR ImagingStudy resource:

channels/radiology-ingest/channel.yaml
id: radiology-ingest
enabled: true
group: imaging
source:
type: dicom
port: 4104
ae_title: INTU_RAD
calling_ae_titles:
- CT_SCANNER_1
- MR_SCANNER_2
- US_SCANNER_1
tls:
cert_file: ./certs/dicom-server.crt
key_file: ./certs/dicom-server.key
transformer: dicom-to-fhir.ts
destinations:
- pacs_archive
- ehr_fhir

A TypeScript transformer that maps DICOM metadata to a FHIR ImagingStudy resource:

transforms/dicom-to-fhir.ts
export default function transform(msg: IntuMessage): IntuMessage {
const dicom = JSON.parse(msg.payload);
const imagingStudy = {
resourceType: "ImagingStudy",
status: "available",
subject: {
reference: `Patient/${dicom.PatientID}`,
},
started: dicom.StudyDate,
identifier: [
{
system: "urn:dicom:uid",
value: `urn:oid:${dicom.StudyInstanceUID}`,
},
],
modality: [
{
system: "http://dicom.nema.org/resources/ontology/DCM",
code: dicom.Modality,
},
],
description: dicom.StudyDescription,
numberOfSeries: dicom.NumberOfStudyRelatedSeries,
numberOfInstances: dicom.NumberOfStudyRelatedInstances,
};
msg.payload = JSON.stringify(imagingStudy);
return msg;
}