Files
dicom-iso/docs/mkiso-analysis.md
2026-06-05 08:11:44 +07:00

5.2 KiB
Raw Permalink Blame History

mkiso PHP Scripts — Analysis

File Inventory

File Purpose Output
mkiso.php Retrieve DICOM studies by accession number from PACS, wrap in ISO with microdicom viewer, serve as download ISO download
mkiso2.php Retrieve DICOM studies from PACS, then forward to another PACS (C-STORE relay) DICOM forwarded to 172.16.0.120:104
mkiso_multiple.php Multi-accession variant of mkiso.php, with patient-name lookup in DB, ISO download ISO download with patient-name filename

Shared Flow (all three scripts)

1. Parse accession_number from GET parameter
2. Create temp working dir: /tmp/dicomdir_<uniqid>/
3. Copy microdicom viewer files into temp dir (bootstrap DICOM viewer ISO)
4. Fetch DICOM studies from PACS via Java dcm4che2 dcmqr (C-MOVE)
5. [PACS is: ABPACS@localhost:11112, AE CDRECORD:10104 is the local receiver]

The Java Command — Deep Dive

JAVA_HOME=/usr/lib/jvm/jdk1.8.0_144 LANG=en_US.iso-8859-1 \
  /usr/local/dcm4che/dcm4che2/bin/dcmqr \
  -L CDRECORD:10104 \
  ABPACS@localhost:11112 \
  -cmove CDRECORD \
  -qAccessionNumber=${accession_number} \
  -cstore ${cstore} \
  -cstoredest ${dicomdir}/DICOMDIR

This single Java process does FOUR things:

Role Parameter Description
Storage SCP -L CDRECORD:10104 Listens as AE CDRECORD on port 10104 to receive incoming C-STORE from PACS
Query SCU -qAccessionNumber=X Queries PACS for studies matching the accession number
C-MOVE SCU -cmove CDRECORD Tells PACS to send matched studies to CDRECORD (itself)
File writer -cstoredest DICOMDIR Saves received DICOM files to the specified directory

The -cstore parameter specifies a DICOM SOP Class to negotiate. dcm4che2 maps the two-letter modality codes to SOP Class UIDs internally:

Code SOP Class UID
CR Computed Radiography 1.2.840.10008.5.1.4.1.1.1
CT CT Image Storage 1.2.840.10008.5.1.4.1.1.2
MR MR Image Storage 1.2.840.10008.5.1.4.1.1.4
US Ultrasound Image 1.2.840.10008.5.1.4.1.1.6.1
NM Nuclear Medicine 1.2.840.10008.5.1.4.1.1.20
PET PET Image 1.2.840.10008.5.1.4.1.1.128
SC Secondary Capture 1.2.840.10008.5.1.4.1.1.7
XA X-Ray Angio 1.2.840.10008.5.1.4.1.1.12.1
XRF X-Ray Fluoroscopy 1.2.840.10008.5.1.4.1.1.12.2
DX Digital X-Ray 1.2.840.10008.5.1.4.1.1.1.1
MG Mammography 1.2.840.10008.5.1.4.1.1.1.2
PR Presentation State 1.2.840.10008.5.1.4.1.1.11.1
KO Key Object Selection 1.2.840.10008.5.1.4.1.1.88.59
SR Structured Report 1.2.840.10008.5.1.4.1.1.88.11

The loop iterates over ALL 14 modalities for the same accession number. Most will return nothing — the script uses a brute-force "try everything" approach since it doesn't know which modality a given accession number uses.


Per-Script Differences

mkiso.php

Fetch → genisoimage → serve ISO download → cleanup
  • ISO filename: {accession_number}.iso
  • After PACS fetch: creates ISO with genisoimage, streams it as download, deletes temp files

mkiso2.php

Fetch → dcmsend to 172.16.0.120:104 → exit
  • No ISO creation. Instead forwards retrieved DICOM files to another PACS server (172.16.0.120:104)
  • Uses dcmsend +sd +rd 172.16.0.120 104 $dicomdir/DICOMDIR (dcmtk dcmsend — a C-STORE SCU)
  • ISO creation and download code is commented out
  • This script acts as a DICOM relay/proxy: PACS A → temp dir → PACS B

mkiso_multiple.php

Parse comma-separated ACC#s → DB lookup (patient name) → 
for each ACC#, for each modality: fetch from PACS → 
genisoimage → serve ISO download → cleanup
  • Supports comma-separated accession numbers (e.g. ?accession_number=MR.001,CT.002)
  • Database lookup on two DBs:
    • pacsdb_his (192.168.2.7) — finds AccessionNumberMEDRECID, RegID
    • pacsdb_hisMEDRECIDNama (patient name)
  • ISO filename: {PATIENT_NAME}-{ACCESSION_LIST}.iso (alphanumeric only)
  • Inner loop: for each accession number, try all 14 modalities

DICOM Operations Summary

Script C-MOVE (PACS→local) C-STORE (local→PACS2) ISO gen DB lookup
mkiso.php 14 modality loop
mkiso2.php 14 modality loop (dcmsend)
mkiso_multiple.php 14 modality × N acc# (patient name)

Environment

Component Version/Location
dcm4che2 (Java) /usr/local/dcm4che/dcm4che2/bin/dcmqr
Java JDK 1.8.0_144 (/usr/lib/jvm/jdk1.8.0_144)
genisoimage /usr/bin/genisoimage
dcmsend /usr/bin/dcmsend (dcmtk C-STORE SCU)
dcmtk (static) /data/dcmtk-bin/ (v3.6.6) — findscu, movescu, storescp, getscu
microdicom /var/www/html/microdicom/ (DICOM viewer bootstrap files)
PACS source ABPACS@localhost:11112
Local AE CDRECORD:10104
PACS dest (mkiso2) 172.16.0.120:104
DB (mkiso_multiple) 192.168.2.7:3306 (pacsdb_his / rsabt201107)