← Selected technical work

Technical walkthrough 03 · Medical-imaging software

PulseImaging desktop viewer

An Electron application that validates DICOM hierarchy, loads a CT series into a cached volume, and renders linked axial, sagittal, and coronal views for segmentation work.

01 / Product artifact

The real viewer, rendered without patient data

A medical-imaging screenshot is useful evidence only if it does not expose protected data. I ran the current frontend against a generated 96-slice DICOM phantom containing no patient source, then opened the application’s actual MPR mode.

PulseImaging viewer showing a generated CT phantom in axial, sagittal, and coronal planes with calcium-scoring and label panels
Real PulseImaging frontend from the local repository snapshot at commit bed6b1d, rendered with a generated, non-clinical 96-slice CT fixture. The image verifies the product surface and three-plane volume path. It is not an employer screenshot, clinical example, segmentation result, or latency benchmark.

The screenshot exposes the actual interaction model: series navigation at left, viewport tools and MPR selection above the canvas, linked orthographic views in the center, and artery labels and calcium-scoring state at right.

02 / Data path

One series crosses five explicit boundaries

BoundaryValidation or transformation
DICOM import Validate study → series → instance hierarchy and retain ordering metadata.
API contract Return series metadata, image count, ordered image URLs, and patient data separately.
Client cache Load and cache every DICOM image in bounded batches before volume construction.
Volume viewports Attach one cached volume to axial, sagittal, and coronal orthographic viewports.
Segmentation Attach the same labelmap to each active viewport and persist edited slices.
Why the full series is cached first

A stack viewer can request slices lazily. MPR needs a coherent three-dimensional volume, so the client loads the complete ordered series before creating the volume and exposing orthogonal planes.

03 / Implementation

The publishable test fixture encodes volume geometry explicitly

The employer repository is not publicly accessible, so this page does not republish its implementation. The product behavior can still be tested safely: the fixture writes the position, orientation, spacing, pixel representation, and windowing fields needed to build a real DICOM volume, while marking every patient field as synthetic.

scripts/pulse-synthetic-fixture.py · generated DICOM contract source ↗
dataset.PatientName = "SYNTHETIC^QA"
dataset.PatientID = "NON-CLINICAL"
dataset.SeriesDescription = "Synthetic cardiac CT - portfolio QA fixture"

dataset.ImagePositionPatient = [0, 0, float(z * 1.25)]
dataset.ImageOrientationPatient = [1, 0, 0, 0, 1, 0]
dataset.SliceThickness = 1.25
dataset.PixelSpacing = [0.7, 0.7]

dataset.BitsAllocated = 16
dataset.PixelRepresentation = 1
dataset.WindowCenter = 40
dataset.WindowWidth = 400

The phantom varies along z so MPR reveals orientation errors

A stack of identical circles would make the axial view look plausible while producing uninformative slabs in the other planes. The fixture tapers the body and organs across 96 positions, so the sagittal and coronal views must reconstruct a different, continuous shape.

Fixture decisionFailure it can reveal
96 ordered slices with 1.25-mm z positions Missing, duplicated, or incorrectly sorted instances
Explicit orientation and 0.7-mm in-plane spacing Swapped axes or geometry built from array index alone
Torso and organs taper across z Orthogonal planes that render but do not reconstruct the volume
High-HU deposits only in central slices Threshold features appearing on the wrong slice range

The synthetic capture can be reproduced with the checked-in scripts/pulse-synthetic-fixture.py and scripts/pulse-vite-fixture.config.mjs in this portfolio repository. Those scripts generate the pixels and proxy only the local fixture endpoints.

04 / Measurements

Product verification and employer-scoped performance

EvidenceObservedScope
Current product render 96 generated slices load; axial, sagittal, and coronal viewports render Local visual QA of the frontend; no clinical data
Client loading width 8 images per Promise.all batch Resume claim confirmed in the local repository snapshot; private source is not republished
Batch inference latency <100 ms Measured internship result; hardware and percentile not claimed
Full-scan completion Under 2 minutes Measured internship result; scan size and production throughput not generalized

The first two rows are reproducible from the public source and synthetic fixture. The final two are resume-scoped employer measurements and are not re-benchmarked by this page.

05 / Limitations

What remains outside the public evidence

  • The synthetic phantom verifies rendering and data flow, not clinical correctness or diagnostic usefulness.
  • No patient images, employer datasets, private deployment details, credentials, protected screenshots, or private source excerpts were published.
  • Sub-100-ms latency is not labeled with a percentile, GPU model, concurrency level, or dynamic-batching configuration because those details are not supported by the public evidence.
  • The local capture shows an unannotated labelmap and zero calcium score. It should not be read as a segmentation-quality result.
Next public test

Add a deterministic synthetic series with known voxel spacing and landmarks, then test that the three viewports report the expected orientation, slice index, and shared physical point after crosshair movement.

Return to the first walkthrough

Robodex

Continue →