← MacAngioView Download PDF

DICOM Conformance Statement

MacAngioView — DICOM cine viewer Version 1.5b · Document date 2026-09-23 · Document version 2.19 (draft)

Disclaimer. MacAngioView is a beta application for evaluation, review, and educational use only. It is not a certified medical device and is not intended for primary diagnosis or clinical decision-making. This document is structured after DICOM PS3.2 but has not been independently audited.


1. Conformance Statement Overview

MacAngioView is a standalone desktop application that reads DICOM PS3.10 (Part 10) files and DICOMDIR file-sets from local storage or mounted removable media (CD/DVD/USB), and displays X-ray angiographic (XA) cine runs, multiframe/single-frame ultrasound (US) images, and the Encapsulated PDF and Structured Report (SR) documents contained in a study. It can export loaded runs to QuickTime (.mov) movies and copy the displayed frame to the system clipboard (both non-DICOM outputs).

MacAngioView implements Media Interchange services only, in the File-Set Reader (FSR) role. It provides no network services of any kind.

Table 1-1. Network Services

Service User of Service (SCU) Provider of Service (SCP)
All DIMSE services (Verification, Storage, Query/Retrieve, Print, Storage Commitment, Worklist, MPPS) No No
DICOMweb (STOW-RS / QIDO-RS / WADO-RS) No No

The application never opens a network association or socket for DICOM purposes; it runs fully offline.

Table 1-2. Media Services

Media Storage Application Profile Write Files (FSC/FSU) Read Files (FSR)
General Purpose CD-R / DVD (STD-GEN-CD, STD-GEN-DVD-JPEG) No Yes
Basic Cardiac X-Ray Angiographic (STD-XABC-CD) No Yes
1024 X-Ray Angiographic (STD-XA1K-CD, STD-XA1K-DVD) No Yes
Ultrasound (STD-US-ID/SC/CC-MF…, CD and DVD media) No Yes
CT/MR (STD-CTMR-… CD and DVD media) No Yes

MacAngioView never creates or updates a DICOM file-set and never writes DICOM objects.


2. Introduction

2.1 Revision History

Doc version Date Application version Notes
1.0 (draft) 2026-07-15 0.2.1b Initial statement
1.1 (draft) 2026-07-15 0.2.2b Frame VOI LUT functional group, Pixel Aspect Ratio, lossy compression indication
1.2 (draft) 2026-07-15 0.2.2b Video transfer syntaxes (MPEG2/H.264/HEVC) decoded via bundled ffmpeg
1.3 (draft) 2026-07-16 0.3.0b Structured Report documents rendered as paginated text
1.4 (draft) 2026-07-18 0.3.0b Modality LUT Sequence, VOI LUT Sequence, VOI LUT Function (LINEAR_EXACT/SIGMOID)
1.5 (draft) 2026-07-18 0.3.0b Positioner angles displayed; Person Name ideographic/phonetic groups formatted
1.6 (draft) 2026-07-18 0.3.0b Frame Time Vector variable timing reproduced in playback
1.7 (draft) 2026-07-18 0.3.0b Overlay Planes (60xx) and Display Shutter rendered
1.8 (draft) 2026-07-18 0.3.0b HTJ2K transfer syntaxes decoded (pylibjpeg-openjpeg)
1.9 (draft) 2026-07-18 0.3.0b XA mask subtraction (DSA, AVG_SUB) with View menu toggle
2.0 (draft) 2026-07-18 0.3.0b User-designated DSA mask frame (application feature)
2.1 (draft) 2026-07-18 0.3.0b Mask Sub-pixel Shift applied; user mask re-registration (nudge)
2.2 (draft) 2026-07-18 0.4.0b Release 0.4.0b — revisions 1.4–2.1 ship in this application version
2.3 (draft) 2026-07-19 1.0b US studies displayed at native matrix (rectangular viewport); zoom and thumbnails preserve source aspect; SR zero-valued NUM measurements rendered
2.4 (draft) 2026-07-23 1.1b Documentation only — product description made platform-neutral ahead of the Windows build; clipboard described as the system clipboard. No change to supported SOP classes, transfer syntaxes, or the display pipeline
2.5 (draft) 2026-07-29 1.2b Documentation only — Windows export folder pickers fixed and batch export now isolates per-run failures. No change to supported SOP classes, transfer syntaxes, or the display pipeline
2.6 (draft) 2026-08-04 1.2b Documentation only — corrected the JPEG Extended (Process 2 & 4) transfer syntax claim: 12-bit samples are not currently decodable by either bundled decoder (python-gdcm, Pillow), verified against a real 12-bit XA sample. No change to the application itself
2.7 (draft) 2026-08-07 1.3b Caliper Tool: application-computed distance measurements from Ultrasound Region / Pixel Spacing / Imager Pixel Spacing attributes, or a manual catheter calibration (§4.6, §7.1) — supersedes the 2.2–2.6 "calibrated measurements: not applied" note. Quiz Mode (§4.7): a non-DICOM self-study workflow, no change to the data read or displayed
2.8 (draft) 2026-08-10 1.4b X-Ray Radiofluoroscopic Image Storage (RF) named explicitly as a supported SOP Class — decodes and displays through the same pipeline as XA; no application change was required (§4.4)
2.9 (draft) 2026-08-10 1.4b Waveform Storage instances (12-lead/general/ambulatory ECG, hemodynamic, cardiac EP, ...) now rendered as paginated, calibrated lead-strip images (waveform_render) instead of only being listed by SOP Instance UID — supersedes the 2.2–2.8 "waveforms: not interpreted as such" note (§4.4)
2.10 (draft) 2026-08-23 1.4b CT Image Storage (CT/CTA) named explicitly as a supported SOP Class: a study's single-frame CT slices sharing one Series Instance UID are grouped into one browsable multi-slice run (stepped, not cine-played) instead of arriving as N separate unplayable single-frame runs; multi-valued Window Center/Width (e.g. SOFT TISSUE/BONE/LUNG) is now offered as a selectable preset for any grayscale run that carries more than one W/L pair, not just CT (§4.4, §4.6, §7.1)
2.11 (draft) 2026-09-03 1.4b Display pipeline replaced: every modality now renders at its native pixel resolution and aspect ratio through one freely resizable viewport with roam, marquee, and scroll-wheel zoom — no fixed 512/1024 display modes and no separate Ultrasound-only layout — superseding 2.3's US-native-viewport note. QuickTime export and Edit ▸ Copy already rendered at acquired resolution and are unaffected by the change (§4.6, §4.7)
2.12 (draft) 2026-09-13 1.5b Documentation only — application UI and window-management reliability fixes (menu grouping, window resizing/sizing, a viewing-convenience checkbox's forced-view behavior, a user-selectable chrome text size). No change to supported SOP classes, transfer syntaxes, decoding, or the data displayed
2.13 (draft) 2026-09-15 1.5b Grayscale Softcopy Presentation State and its XA/XRF-specific sibling named explicitly as supported SOP Classes: a Presentation State's referenced image is rendered with the object's own VOI window, Displayed Area Selection crop, and Graphic Annotation Sequence (text and CIRCLE/ELLIPSE/POLYLINE/POINT graphics) applied, as one read-only page — supersedes the 2.2–2.12 "presentation states: not interpreted as such" note. Color/Pseudo-Color/Blending/Volumetric-MPR/Volume-Rendering Presentation States remain unsupported (§4.4)
2.14 (draft) 2026-09-21 1.5b CT/CTA multi-slice grouping refined, superseding 2.10's grouping note: slices within a run are ordered by through-plane geometry (Image Position Patient (0020,0032) projected onto the normal derived from Image Orientation Patient (0020,0037)) rather than by Instance Number, so a series with absent or non-monotonic Instance Numbers is still presented in anatomical order; and a Series Instance UID carrying more than one reconstruction (Convolution Kernel (0018,1210), Slice Thickness (0018,0050)) or cardiac phase (Nominal Percentage of Cardiac Phase (0020,9241)) is presented as one run per stack rather than one interleaved run. Such a component partitions a series only when it is present on every instance in that series and yields no single-instance group; a run is labelled only by those components uniform across it (§4.4, §4.6, §7.1)
2.15 (draft) 2026-09-21 1.5b Documentation only — corrected a stale exclusion: §4.6 still listed Grayscale Softcopy Presentation States under "Not applied / not displayed", contradicting §4.4 and rev 2.13, which had described the GSPS rendering but left this note in place. The exclusion now names only the Color, Pseudo-Color, Blending, and Volumetric Presentation States that genuinely are not applied. §4.4's key-object-selection claim is likewise sharpened: a Key Object Selection Document is rendered as text of its content tree, while the selection itself is not acted on. No change to the application
2.16 (draft) 2026-09-21 1.5b MR Image Storage and Enhanced MR Image Storage named explicitly as supported SOP Classes, and the CT/MR (STD-CTMR) media profile family added to Table 1-2 — MR instances were already read and grouped, the multi-slice grouping never having been gated on Modality, but neither the SOP Classes nor the profile were declared. Multi-slice grouping additionally gains an MR echo component: a series carrying more than one echo splits into one run per echo, keyed on Echo Numbers (0018,0086) where present and Echo Time (0018,0081) otherwise, under the same uniformity and no-orphan rules as the CT reconstruction and cardiac-phase components (§4.4, §4.6, §7.1)
2.17 (draft) 2026-09-22 1.5b Two presentation refinements. The runs a partitioned Series Instance UID becomes are now presented in cardiac-phase then echo order rather than in the order their instances were read, so a dual-echo MR opens echo 1 first whatever order the files arrive in; a reconstruction split, which carries no natural order, keeps the order read. And a Window Center/Width pair repeated verbatim within one instance collapses to a single preset, so a run left with one distinct pair offers no Preset picker rather than a choice between identical windows (§4.6, §6.3)
2.18 (draft) 2026-09-23 1.5b JPEG Extended (Process 2 & 4) support corrected upward, superseding rev 2.6's "8-bit only" claim: 12-bit samples decode through pylibjpeg-libjpeg, which is a bundled dependency rather than the unbundled plugin rev 2.6 tested against. The 12-bit XA sample that rev 2.6 recorded as a decode failure was found to be a malformed file rather than a missing capability — its scan header declares a DC-only spectral range, invalid for the sequential mode its frame header declares. Such a scan header is now corrected before decoding, for sequential frame headers only (§4.5)
2.19 (draft) 2026-09-23 1.5b Platform line corrected: the macOS build is now universal (native on Intel and Apple Silicon, no Rosetta), and its minimum is macOS 14 (Sonoma), not 12 — the bundled numpy requires 14.0, and the app now declares that minimum so older macOS versions refuse to open it with a system message rather than failing at launch (§2.4). Revision-history rows 2.17 and 2.18 rejoined to this table

2.2 Audience and Remarks

This document is intended for people integrating or evaluating MacAngioView alongside other DICOM applications (modalities, media creators, PACS export functions). It assumes familiarity with the DICOM standard (PS3.1–PS3.20).

Conformance to this statement does not guarantee interoperability; validation with representative media from the intended source systems is recommended.

2.3 Definitions and Abbreviations

FSR — File-Set Reader. TS — Transfer Syntax. SOP — Service-Object Pair. VOI — Value of Interest. XA — X-Ray Angiography. US — Ultrasound.

2.4 Implementation Identification

Application name MacAngioView
Version 1.5b
Platform macOS 14+ (universal: native on Intel and Apple Silicon); Windows 10/11 (64-bit)
DICOM toolkit pydicom 3.0.2 with python-gdcm 3.2.6, pylibjpeg 2.1 (openjpeg plugin), and Pillow pixel-data decoders

3. Networking

Not applicable. MacAngioView implements no DICOM network application entities, initiates no associations, and accepts none.


4. Media Interchange

4.1 Implementation Model

One local Application Entity, MEDIA-FSR, is activated by the user through the GUI (File ▸ Open File…/Open Folder…, or the equivalent buttons). It reads a file-set or individual files, builds an index of the image and document instances found (metadata only), and then decodes the pixel data of a run on demand when the user selects it. Decoded frames are held in memory only; nothing is written back to the media, which can be ejected from within the application.

4.2 Real-World Activities

4.3 Media Application Profiles — Roles

MacAngioView is a general-purpose FSR: it does not verify that a file-set declares or conforms to a specific application profile. Any file-set whose instances use the SOP classes and transfer syntaxes listed below can be read; this covers the STD-GEN, STD-XABC, STD-XA1K, STD-US, and STD-CTMR family profiles listed in Table 1-2. CT and MR studies are also commonly issued under IHE Portable Data for Imaging (PDI) rather than a PS3.11 STD- profile; PDI media build on the general-purpose CD/DVD profile and are read the same way. Because MacAngioView never validates a profile, this list describes the media it is designed against, not a gate applied to the file-set.

4.4 SOP Classes

Instance selection is content-based, not SOP-Class-restricted: any instance whose pixel data can be decoded is displayed. The SOP classes below are the design targets and the ones exercised in testing.

SOP Class UID Support
X-Ray Angiographic Image Storage 1.2.840.10008.5.1.4.1.1.12.1 Display, cine
Enhanced XA Image Storage 1.2.840.10008.5.1.4.1.1.12.1.1 Display, cine (frame timing from per-frame Frame Content macros)
X-Ray Radiofluoroscopic Image Storage (RF) 1.2.840.10008.5.1.4.1.1.12.2 Display, cine — same pipeline as XA (content-based selection; not a distinct code path)
CT Image Storage 1.2.840.10008.5.1.4.1.1.2 Single-frame slices sharing a Series Instance UID are grouped into one browsable multi-slice run, ordered by through-plane geometry (§4.6), split into one run per reconstruction or cardiac phase where the series carries more than one, and stepped (Left/Right or the frame slider) — not cine-played, since the "frames" are separate files with no playback timing of their own (§4.6)
MR Image Storage 1.2.840.10008.5.1.4.1.1.4 Single-frame slices are grouped, ordered, stepped and window-levelled exactly as CT above — the grouping is modality-agnostic. A series carrying more than one echo is split into one run per echo, identified by Echo Numbers (0018,0086) where present, else Echo Time (0018,0081) (§4.6)
Enhanced MR Image Storage 1.2.840.10008.5.1.4.1.1.4.1 Display, multi-frame stepping through the instance's own frames; per-frame functional groups are read for windowing as for other enhanced objects. Not further partitioned — a single instance is already one run
Ultrasound Image Storage 1.2.840.10008.5.1.4.1.1.6.1 Display (single frame)
Ultrasound Multi-frame Image Storage 1.2.840.10008.5.1.4.1.1.3.1 Display, cine
Encapsulated PDF Storage 1.2.840.10008.5.1.4.1.1.104.1 Rendered per page (also detected by an application/pdf Encapsulated Document when the SOP Class UID is absent)
SR Document Storage family (Basic Text, Enhanced, Comprehensive, …) 1.2.840.10008.5.1.4.1.1.88.* Content tree rendered as read-only paginated text (also detected by Modality SR with a Content Sequence when the SOP Class UID is absent). TEXT/CODE/NUM/PNAME/DATE-TIME/UIDREF items shown; IMAGE/COMPOSITE/WAVEFORM references listed by SOP Instance UID, not resolved
Waveform Storage family (12-lead/General/Ambulatory ECG, Hemodynamic, Cardiac Electrophysiology, …) 1.2.840.10008.5.1.4.1.1.9.* Each multiplex group's channels rendered as paginated, calibrated lead-strip images (waveform_render) — a channel's trace is in physical units (e.g. µV) when Channel Sensitivity is present, else raw digital values; also detected by the presence of a Waveform Sequence when the SOP Class UID is absent
Secondary Capture and other image SOP classes various Best-effort display when pixel data is decodable
Grayscale Softcopy Presentation State Storage 1.2.840.10008.5.1.4.1.1.11.1 Rendered as one read-only page per referenced image: the Presentation State's own Modality LUT (Rescale Slope/Intercept) when present, else the referenced image's; its Softcopy VOI LUT Sequence window, else the referenced image's own; Presentation LUT Shape polarity; a Displayed Area Selection crop; and its Graphic Annotation Sequence (Text Objects, and CIRCLE/ELLIPSE/POLYLINE/INTERPOLATED/POINT Graphic Objects), layered by Graphic Layer Order (§4.6)
XA/XRF Grayscale Softcopy Presentation State Storage 1.2.840.10008.5.1.4.1.1.11.5 Same rendering as Grayscale Softcopy Presentation State Storage above
Media Storage Directory Storage (DICOMDIR) 1.2.840.10008.1.3.10 Read (Referenced File ID resolution only)

Color, Pseudo-Color, Blending, and Volumetric (MPR / Volume Rendering) Presentation States are not interpreted as such. A Key Object Selection Document is rendered as paginated text of its content tree, like any other document in the SR SOP Class family, but the selection itself is not acted on: its references are listed rather than resolved, and the instances it selects are neither marked nor gathered anywhere in the interface. Any image instance whose transfer syntax is a video codec (including US Multi-frame studies exported as MPEG-4) is decoded and played per 4.5. Structured Report documents are rendered as read-only paginated text of their content tree; coded entries are shown by their Code Meaning (coding scheme designators and values are not displayed), and templates are not validated. IMAGE/COMPOSITE references inside an SR content tree are listed by SOP Instance UID rather than resolved to the referenced instance, even when that instance is a Waveform run present elsewhere in the same study.

4.5 Transfer Syntaxes

Decoding is provided by pydicom with the python-gdcm and Pillow backends; the video transfer syntaxes are decoded by the bundled ffmpeg (imageio-ffmpeg). All decoders ship in the distributed application.

Transfer Syntax UID Read
Implicit VR Little Endian 1.2.840.10008.1.2 Yes
Explicit VR Little Endian 1.2.840.10008.1.2.1 Yes
Deflated Explicit VR Little Endian 1.2.840.10008.1.2.1.99 Yes
Explicit VR Big Endian (retired) 1.2.840.10008.1.2.2 Yes
RLE Lossless 1.2.840.10008.1.2.5 Yes
JPEG Baseline (Process 1) 1.2.840.10008.1.2.4.50 Yes
JPEG Extended (Process 2 & 4) 1.2.840.10008.1.2.4.51 Yes, 8- and 12-bit — 12-bit samples decode through the bundled pylibjpeg-libjpeg plugin (python-gdcm and Pillow refuse them); a scan header declaring an invalid spectral range is repaired before decoding (§4.5)
JPEG Lossless (Process 14) 1.2.840.10008.1.2.4.57 Yes
JPEG Lossless SV1 (Process 14, FOP=1) 1.2.840.10008.1.2.4.70 Yes
JPEG-LS Lossless / Near-Lossless 1.2.840.10008.1.2.4.80 / .81 Yes
JPEG 2000 Lossless / Lossy 1.2.840.10008.1.2.4.90 / .91 Yes
MPEG2, MPEG-4 AVC/H.264 (all profiles) 1.2.840.10008.1.2.4.100–.106 Yes — bundled ffmpeg
HEVC/H.265 1.2.840.10008.1.2.4.107 / .108 Yes — bundled ffmpeg
High-Throughput JPEG 2000 (HTJ2K) 1.2.840.10008.1.2.4.201–.203 Yes — pylibjpeg-openjpeg

Video-transfer-syntax runs are decoded whole into memory as RGB frames (the encapsulated bitstream is reconstructed across fragments), capped at 1000 frames per run; window/level does not apply to them. When the data set carries no frame-rate attribute, the rate reported by the video stream itself is used. An instance in an unsupported transfer syntax is indexed but its thumbnail shows Error and the failure is logged to the in-app Console; it does not block the rest of the study.

One encoder defect is tolerated rather than reported. ITU-T T.81 requires a sequential JPEG scan header to span the full spectral range (Ss=0, Se=63), but some encoders emit sequential frames declaring a DC-only range, which a conforming decoder refuses even though the entropy-coded data is intact. Where a frame's scan header shows this, the declared range is corrected and the frame decoded normally; the repair is logged to the Console. It is applied only to sequential frame headers, never to progressive or lossless ones, whose narrower spectral ranges are legitimate.

4.6 Display Pipeline (Attribute Usage)

4.7 Extensions Beyond Part 10 Reading


5. Support of Character Sets

Data-set text is decoded by pydicom according to Specific Character Set (0008,0005), including ISO-IR 100 (Latin-1) and the other single-byte and multi-byte character sets pydicom supports; decoded text is displayed as Unicode. Person Name values are displayed with component delimiters (^) replaced by spaces (empty components dropped); the ideographic and phonetic component groups (= delimited, PS3.5 6.2.1) follow the first group in parentheses, e.g. "Yamada Tarou (山田 太郎, やまだ たろう)".


6. Security


7. Annexes

7.1 IOD Attribute Usage (informative)

Attributes read for indexing and display include: SOP Class UID, Transfer Syntax UID, Modality, Number of Frames, Rows/Columns, Bits Allocated/Stored, Photometric Interpretation, Pixel Data, the frame-rate attributes listed in 4.6, Window Center/Width, the Frame VOI LUT functional-group macro, Modality LUT Sequence, Rescale Slope/Intercept, VOI LUT Sequence, VOI LUT Function, Pixel Aspect Ratio, Pixel Spacing / Imager Pixel Spacing / Pixel Measures (ratio only, except where noted below), Lossy Image Compression / Method / Ratio, Palette Color LUT attributes, Positioner Primary/Secondary Angle (and the Positioner Position macro), the 60xx Overlay Plane attributes, the Display Shutter attributes, the Mask Subtraction Sequence and Recommended Viewing Mode, Patient Name, Patient ID, Patient Birth Date, Study Date, Study Time, Encapsulated Document, MIME Type of Encapsulated Document, Waveform Sequence and its Number of Waveform Channels/Samples, Sampling Frequency, Waveform Bits Allocated, Waveform Sample Interpretation, Waveform Data, Multiplex Group Label, and the per-channel Channel Definition Sequence (Channel Source Sequence, Channel Sensitivity, Channel Sensitivity Correction Factor, Channel Baseline, Channel Sensitivity Units Sequence, Channel Label), Series Instance UID, Instance Number and Window Center & Width Explanation (for multi-slice series grouping and W/L presets — see §4.6), and (DICOMDIR) Referenced File ID.

For the Caliper Tool's calibrated distance measurement (§4.6), Pixel Spacing and Imager Pixel Spacing are additionally read for their absolute value (not just the ratio), together with Sequence of Ultrasound Regions / Physical Delta X / Physical Units X Direction, Estimated Radiographic Magnification Factor, and Distance Source to Detector / Patient.

7.2 Grayscale Rendering (informative)

Grayscale frames are mapped with the DICOM VOI equations (PS3.3 C.11.2.1.2 LINEAR; C.11.2.1.3 LINEAR_EXACT and SIGMOID) over the effective window, or through the data set's VOI LUT table at the default window, then quantized to 8 bits; MONOCHROME1 output polarity is inverted after the VOI stage.