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.
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.
| 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.
| 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.
| 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 |
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.
FSR — File-Set Reader. TS — Transfer Syntax. SOP — Service-Object Pair. VOI — Value of Interest. XA — X-Ray Angiography. US — Ultrasound.
| 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 |
Not applicable. MacAngioView implements no DICOM network application entities, initiates no associations, and accepts none.
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.
-
RWA 1 — Load a file-set: the user selects a disc/folder. The
application locates a
DICOMDIRat the selected location or one subfolder level below it (case-insensitive name match) and enumerates every existing file referenced by Referenced File ID (0004,1500). Directory-record hierarchy attributes are not otherwise interpreted. -
RWA 2 — Load individual files: the user selects a single Part 10
file, or a folder containing
*.dcmfiles (searched recursively) without a DICOMDIR. - RWA 3 — Review: indexed instances appear as thumbnails; the selected instance is displayed with cine playback, frame stepping, window/level, zoom, and edge-enhancement controls. Encapsulated PDF instances are rendered as pageable images (or opened in an external PDF viewer), and Structured Report instances as pageable text renderings of their content tree.
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.
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.
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.
- Photometric Interpretation: MONOCHROME1 (rendered inverted), MONOCHROME2, PALETTE COLOR (color LUT applied), RGB, and the YBR variants produced by the JPEG codecs (converted to RGB by the decoder).
- Modality LUT: a Modality LUT Sequence (0028,3000) is applied to grayscale data when present; otherwise the linear Rescale Slope (0028,1053) / Intercept (0028,1052).
- VOI: grayscale images are windowed with the VOI LUT Function (0028,1056) the data set declares — LINEAR, LINEAR_EXACT, or SIGMOID (PS3.3 C.11.2). The default window is resolved from, in order: the first value pair of the top-level Window Center (0028,1050) / Window Width (0028,1051); the Frame VOI LUT functional-group macro (0028,9132) — shared group first, then the first per-frame item (per-frame varying windows are not reproduced); the input range of the first VOI LUT Sequence (0028,3010) item; the full data range. When a VOI LUT Sequence is present its first LUT is rendered as the default view (output normalized over the table's value range); adjusting window/level interactively replaces the table with a window, and Reset returns to the table.
- Pixel geometry: non-square pixels are displayed square. The vertical:horizontal ratio is taken from Pixel Aspect Ratio (0028,0034), or from the row:column ratio of Pixel Spacing (0028,0030) / Imager Pixel Spacing (0018,1164) / the Enhanced shared Pixel Measures group; the lower-resolution axis is upscaled (never downsampled). Only the ratio is used here — see Calibrated distance measurement below for the one place an absolute spacing value is used.
- Lossy compression indication: the Lossy Image Compression state (0028,2110), with method (0028,2114) and ratio (0028,2112) when present, is shown in the Patient panel for the selected instance.
- Cine timing: the playback rate is resolved from, in order: XA Acquisition Frame Rate → Cine Rate → Recommended Display Frame Rate → Frame Time → mean of Frame Time Vector → Actual Frame Duration → for Enhanced multiframe objects, the median inter-frame interval of the per-frame Frame Acquisition/Reference DateTime values. A Frame Time Vector's per-frame variable timing is reproduced during playback: each frame's dwell is its vector entry, scaled proportionally when the user adjusts the rate (whose readout stays the mean rate). Non-positive entries fall back to the mean interval. QuickTime export renders at a single uniform rate.
- Overlay Planes: the 60xx Overlay Plane groups (Overlay Data bitmaps) are composited in white onto monochrome images after the VOI stage. A single-frame overlay applies to every frame of a multi-frame image; a multi-frame overlay maps through Image Frame Origin; Overlay Origin places the plane (clipped at the image edges). Overlays embedded in unused Pixel Data bits (retired in DICOM 2004) are not extracted, and overlays are not composited onto color images.
- Display Shutter: RECTANGULAR, CIRCULAR, and POLYGONAL shutter shapes (PS3.3 C.7.6.11) are combined and the area outside them is painted with the Shutter Presentation Value (high byte; black when absent) on monochrome images. The Enhanced multi-frame Frame Display Shutter macro is not applied.
- Positioner angles: Positioner Primary/Secondary Angle (0018,1510/ 0018,1511) — top-level or the Enhanced XA/XRF Positioner macro (0018,9405) — are shown in the Patient panel in the LAO/RAO · CRA/CAU convention (PS3.3 C.8.7.5). A rotational acquisition's per-frame varying angles are not tracked; the first value stands for the run.
- Mask subtraction (DSA): a Mask Subtraction Sequence (0028,6100) item with Mask Operation AVG_SUB enables the View ▸ Subtracted (DSA) toggle: the mask is the mean of the Mask Frame Numbers, subtraction is limited to the Applicable Frame Range (other frames show native), and a run whose Recommended Viewing Mode (0028,1090) is SUB starts subtracted. While subtracted, the window defaults span the subtracted signal; QuickTime export and Copy follow the on-screen state. Mask Sub-pixel Shift (0028,6114) is applied as the mask's initial registration shift (bilinear, edge-replicated), and the user can re-register the mask against patient motion in 1 px steps (⌥-arrows, View ▸ Nudge DSA Mask) or 0.1 px steps (⇧⌥-arrows). Mask Operation TID is not applied. As an application feature beyond the data set, the user may designate the currently displayed frame as the mask (View menu), which enables subtraction for multi-frame grayscale cines carrying no Mask Subtraction Sequence and supersedes a file-provided spec until removed.
- Multi-slice series grouping (CT/CTA): single-frame image instances that share a Series Instance UID (0020,000E) — a CT/CTA axial series, which arrives as one file per slice with no cine mechanism of its own — are collapsed at index time into one browsable multi-slice run, ordered by through-plane position — Image Position Patient (0020,0032) projected onto the normal derived from Image Orientation Patient (0020,0037), with the direction aligned to the series' Instance Number trend so a well-formed series orders exactly as Instance Number would. Slice Location (0020,1041), Instance Number (0020,0013), SOP Instance UID and the source path break ties or stand in when the geometry is absent. A Series Instance UID that carries more than one reconstruction (Convolution Kernel (0018,1210), Slice Thickness (0018,0050)), cardiac phase (Nominal Percentage of Cardiac Phase (0020,9241)), or MR echo (Echo Numbers (0018,0086), else Echo Time (0018,0081)) becomes one run per stack rather than one interleaved run. The grouping is modality-agnostic: it applies to any single-frame instances sharing a Series Instance UID, CT and MR alike, and a component simply has no effect on a series that does not carry it. Because these attributes are unreliable in practice, a component partitions a series only when it is present on every instance in that series and leaves no single-instance group; the decision is made across the whole series, never per slice, and a run is labelled only by those components uniform across it. The echo is named only where it actually distinguishes runs, since an unsplit single-echo series would otherwise be labelled with a first echo that tells the reader nothing. The runs one series becomes are presented in cardiac-phase then echo order — a dual-echo MR opens echo 1 first whatever order its files were read in — while a reconstruction split, having no natural order, keeps the order read; runs of other series are not reordered. Each slice is decoded from its own file on selection (no combined in-memory volume, no interpolation between slices — the same "decode on demand" pattern used for cine frames). The run steps (Left/Right, the frame slider) but does not cine-play, since there is no real inter-slice playback timing; it keeps window leveling and behaves like a normal image run for Quiz Mode, export, and the Caliper Tool — a true multi-frame cine (Number of Frames > 1) is never grouped this way, even when it shares a Series Instance UID with other runs.
- Presentation State rendering (GSPS / XA-XRF GSPS): at index time, each Presentation State's Referenced Series/Image Sequence is resolved against every other instance in the same input, producing one read-only page per reference it finds there (unresolved references are skipped and logged, not silently dropped). Each page applies, in order: the Presentation State's own Modality LUT (Rescale Slope/Intercept) when present — needed when the referenced image (often a Secondary Capture instance) carries none of its own — else the referenced image's; the first Softcopy VOI LUT Sequence (0070,0100 group) item applicable to that reference (matched by Referenced Image Sequence, or applying to every reference when a VOI item carries none), else the referenced image's own Window Center/Width, else the full data range; Presentation LUT Shape (0070,0100 group) polarity, defaulting to the referenced image's own Photometric Interpretation when absent; a Displayed Area Selection Sequence crop, at native pixel resolution (every Presentation Size Mode renders the same way — there is no live viewport to "scale to fit" into); and the Graphic Annotation Sequence's Text Objects and Graphic Objects (CIRCLE, ELLIPSE — as an axis-aligned bounding box, not a rotated ellipse — POLYLINE, INTERPOLATED, POINT), layered by Graphic Layer Order, DISPLAY-unit coordinates unsupported (no live viewport to size them against). A rendered page has no window/level control of its own (the window is already baked in) and does not cine-play, matching a Structured Report/PDF/Waveform document run.
- Selectable Window Center/Width presets: any grayscale run whose Window Center (0028,1050) / Window Width (0028,1051) carry more than one value pair — e.g. CT's SOFT TISSUE/BONE/LUNG presets — offers a Preset picker (info column) that applies a chosen pair as the active window; labels come positionally from Window Center & Width Explanation (0028,1055) when present, else "Preset N". A pair repeated verbatim within the instance collapses to one entry, keeping its first label — a run left with a single distinct pair offers no picker rather than a choice between identical windows. The default window shown on first display is still the first pair, per the VOI resolution order above; selecting a preset does not persist across slices of a grouped series run (§ above) — stepping to another slice keeps the last window/level the user set, matching how a real DICOM viewer's W/L control behaves when paging a stack.
- Calibrated distance measurement (Caliper Tool): an application feature (View ▸ Caliper Tool) that reports a user-drawn two-point distance in millimeters, resolved per run at index time in priority order: (1) the first item of the Sequence of Ultrasound Regions (0018,6011)'s Physical Delta X (0018,602C) when its Physical Units X Direction (0018,6024) is cm; (2) Pixel Spacing (0028,0030)'s column value; (3) for XA/RF only, Imager Pixel Spacing (0018,1164) divided by the geometric magnification — Estimated Radiographic Magnification Factor (0018,1114), else Distance Source to Detector (0018,1110) ÷ Distance Source to Patient (0018,1111) — an isocenter-plane approximation shown as an approximate reading ("~N mm") until the user calibrates on a visible reference (below). No calibration is written back to the data set, and no DICOM measurement/annotation object (e.g. an SR or GSPS) is created — the result is display-only, shown as an on-screen overlay and optionally recorded in a Quiz Mode finding (§4.7). As an application feature beyond the data set, View ▸ Calibrate Caliper… lets the user re-derive the scale by measuring across a reference of known size (a catheter shaft, by French size, or a custom length) — this manual calibration always takes priority over the automatic scale above, persists per run for the session, and is the only path to a scale for a run whose data set has none of the attributes listed above.
- Not applied / not displayed: Color, Pseudo-Color, Blending, and Volumetric (MPR / Volume Rendering) Presentation States. Grayscale Softcopy Presentation States (and the XA/XRF sibling) are applied — see the rendering described in §4.4.
- Rendering: frames are rendered to 8-bit for display at the instance's native pixel resolution and aspect ratio — every modality (X-ray angiography, ultrasound, CT, …) displays through the same freely resizable viewport with no per-modality display mode, no auto-fit, and no letterboxing; a frame larger than the viewport is clipped and can be roamed. The user can additionally fit the whole frame to the window, or zoom from 0.1x to 8x (mouse marquee, scroll wheel, or the View menu), none of which is written to the data set or affects exported output (§4.7: export/copy are always the acquired resolution). Thumbnails and interactive zoom selections preserve the source aspect ratio. No PS3.14 (GSDF) display calibration is performed.
- Files lacking File Meta Information (raw data sets) are accepted: the transfer syntax is inferred from the detected byte order / VR encoding and the data set is read best-effort.
-
DICOMDIRlocated one directory level below the selected folder is accepted (some media place the file-set in a subfolder). - Encapsulated PDF documents are rendered in-app via PyMuPDF.
- Loaded runs can be exported to QuickTime (.mov, H.264) via the bundled ffmpeg, and the current frame can be copied to the clipboard; both render at the instance's full acquired resolution — cropped to the run's ROI (§4.6) when one is set, but never to the on-screen zoom/pan, which is a viewing aid only. These outputs are not DICOM objects and carry no DICOM header; any burned-in identification in the pixel data is preserved as-is.
- Quiz Mode (View ▸ Quiz Mode) is a non-DICOM, application-only self-study feature: it withholds the display of a study's own SR/Encapsulated PDF instances from the Select strip until the user reveals them, and lets the user record structured findings (Cath/Echo/ Vascular templates) referencing the Caliper Tool's measurements. Neither toggling it nor recording findings reads any additional DICOM attribute or alters the source data set; the saved findings are written as a plain JSON file (not a DICOM SR or other DICOM object) alongside a de-identified run label and the application version, at a location the user chooses.
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 (山田 太郎, やまだ たろう)".
- The application runs entirely offline; no data leaves the machine except by explicit user action (QuickTime export, clipboard copy).
- Media are read-only to the application; Eject unmounts the volume and purges all decoded frames and demographics from memory.
- Decoded pixel data is held in memory only; no image cache is written to disk. Two transient exceptions: an Encapsulated PDF opened externally is written as a temporary PDF file for the system viewer, and a video-transfer-syntax bitstream is written to a temporary file for the ffmpeg decoder and deleted as soon as decoding ends.
- The application is Developer ID signed and Apple-notarized. The beta build stops launching 90 days after first launch.
- No de-identification is performed on export/copy outputs.
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.
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.