DICOM Destination

Send DICOM data to a PACS or other DICOM-compatible system using C-STORE SCU.

Overview

The DICOM destination acts as a C-STORE Service Class User (SCU) to transmit DICOM objects to a Picture Archiving and Communication System (PACS), a Vendor Neutral Archive (VNA), or any DICOM-compliant Service Class Provider (SCP). This destination handles the DICOM association negotiation, presentation context setup, and C-STORE operations. It is used in radiology and imaging workflows to route, archive, or forward medical images and structured reports.

Configuration

Define a DICOM destination in your root intu.yaml under the destinations key:

yaml
# intu.yaml
destinations:
  pacs-archive:
    type: dicom
    dicom:
      host: pacs.radiology.hospital.org
      port: 11112
      ae_title: INTU_SCU
      called_ae_title: PACS_SCP
      timeout_ms: 60000
      tls:
        enabled: true
        ca_cert: /etc/ssl/certs/pacs-ca.pem

Properties

host string required
Hostname or IP address of the DICOM SCP (e.g. PACS server).
port int required
Port number of the DICOM SCP. The standard DICOM port is 11112, though actual ports vary by installation.
ae_title string optional
Application Entity (AE) title of the calling SCU (this intu instance). Defaults to INTU_SCU. Must be registered in the remote SCP's configuration.
called_ae_title string optional
AE title of the remote SCP being called. Must match the SCP's configured AE title for association negotiation to succeed.
timeout_ms int optional
Timeout in milliseconds for DICOM association and C-STORE operations. Defaults to 60000 (60 seconds). Increase for large images or slow networks.
max_pdu_length int optional
Maximum Protocol Data Unit (PDU) length in bytes for the DICOM association. Defaults to 16384.

TLS

tls.enabled bool optional
Enable TLS encryption for the DICOM association. Defaults to false.
tls.ca_cert string optional
Path to a PEM-encoded CA certificate for verifying the SCP.
tls.client_cert string optional
Path to a PEM-encoded client certificate for mutual TLS.
tls.client_key string optional
Path to the client private key for mutual TLS.

Full Example

Receive DICOM images from a modality worklist, apply metadata enrichment, and forward to the hospital PACS archive.

Root Configuration

yaml
# intu.yaml
destinations:
  hospital-pacs:
    type: dicom
    dicom:
      host: pacs.radiology.hospital.org
      port: 11112
      ae_title: INTU_ROUTER
      called_ae_title: MAIN_PACS
      timeout_ms: 120000
      max_pdu_length: 65536
      tls:
        enabled: true
        ca_cert: /etc/ssl/certs/pacs-ca.pem
        client_cert: /etc/ssl/certs/intu-dicom.pem
        client_key: /etc/ssl/private/intu-dicom-key.pem

Channel Configuration

yaml
# channels/dicom-router/channel.yaml
name: dicom-router
description: Receive DICOM images and forward to PACS after metadata enrichment

source:
  type: dicom
  dicom:
    port: 11113
    ae_title: INTU_SCP

destinations:
  - hospital-pacs

Destination Transformer

typescript
// channels/dicom-router/transformer.ts
import { Message, Context } from "@intu/sdk";

export default function transform(msg: Message, ctx: Context): Message {
  const dicomData = msg.body;

  const patientId = dicomData.dataset?.["00100020"]?.Value?.[0] ?? "";
  const patientName = dicomData.dataset?.["00100010"]?.Value?.[0]?.Alphabetic ?? "";
  const modality = dicomData.dataset?.["00080060"]?.Value?.[0] ?? "";
  const studyUid = dicomData.dataset?.["0020000D"]?.Value?.[0] ?? "";

  ctx.logger.info(
    `Routing ${modality} study ${studyUid} for patient ${patientId}`
  );

  const enrichedDataset = {
    ...dicomData.dataset,
    "00081090": { vr: "LO", Value: ["INTU_PROCESSED"] },
    "00080080": {
      vr: "LO",
      Value: [dicomData.dataset?.["00080080"]?.Value?.[0] ?? "General Hospital"],
    },
  };

  return {
    ...msg,
    body: {
      ...dicomData,
      dataset: enrichedDataset,
    },
  };
}
AE Title Registration Both the calling AE title (ae_title) and the called AE title (called_ae_title) must be pre-registered in the remote PACS configuration. Association requests will be rejected if the AE titles are not recognized.
Note For large images or multi-frame studies, increase timeout_ms and max_pdu_length to prevent timeouts during C-STORE operations.