Appendix E — QuPath Patoloji Atlası Extension

qupath
wsi
atlas
yazılım
software
Published

October 23, 2026

An open-source QuPath extension that lets you browse the whole-slide images published on this atlas and open any of them directly inside QuPath. Slides are streamed tile-by-tile over HTTP, with nothing to download in advance.

The extension adds a Deep Zoom (DZI) image reader to QuPath plus a searchable catalogue driven by the atlas’s own image list, so QuPath’s full measurement, annotation and analysis toolkit works on atlas slides.

Requires QuPath 0.6 or newer and an internet connection at runtime.

Links: Source code and releases · Latest release · DOI: 10.5281/zenodo.21443833 · Sharing a research project · MIT licence

The documentation below is kept in sync with the extension repository’s README. Menu and button labels are given exactly as they appear in the extension, which ships a Turkish interface.

E.1 About

The Patoloji Atlası is a whole-slide image teaching collection curated by pathologists and published openly on the web. This extension brings that same collection into QuPath so the slides can be browsed and opened for study and analysis without leaving the application. An About button in the browser window (and the extension’s entry in QuPath’s extension manager) links back to these sites:

Website images, favicons, and the extension icon are available in the visual asset pack.

Related work: QuPath Edu / OpenMicroanatomy (Yli-Hallila et al., Journal of Anatomy 2025;246(5):846–856, doi:10.1111/joa.14172) is a server-based QuPath teaching extension (workspaces, hidden-answer annotations, slide tours). This extension serves the same educational space with a deliberately serverless design: slides stream read-only from the public atlas, and every study artifact (quiz/tour packs, collections, recordings) is a portable local file.

E.2 What it does

  • Adds Extensions → Patoloji Atlası → Slaytlara gözat…, opening a searchable window that lists every image grouped by category (Gastrointestinal, Pancreatobiliary, Neuropathology, …), with a thumbnail preview and a Published only filter.
  • Each entry is a single stain of a case, so multi-stain cases (H&E plus IHC / special stains such as Warthin-Starry, Giemsa, CISH, PAS…) each appear as their own openable image.
  • Double-click an image (or select it and press Open in QuPath) to open it.
    • With a project open, the slide is added to the project and opened as an entry, so your annotations, detections and measurements are saved with the project.
    • With no project open, it opens in the current viewer for read-only viewing.
  • Curate a project from several images. Use Add to selection (button or the tree right-click menu) to build up a set as you browse and search — the selection persists across searches and Refresh list. Then Create project… opens a dialog where you review the set and either create a new project on disk or add the selection to the current project. Because slides stream from URLs, the resulting project is tiny and portable — hand the project folder to students (they need this extension installed) to run a course, seminar, or exam set.
  • Refresh list pulls the latest lists/list.yaml live from the patolojiatlasi/patolojiatlasi.github.io repository, so new cases appear without updating the extension. A snapshot of the list (288 images) is bundled so the browser works offline out of the box.
  • Registers .dzi URLs as an openable image type, so File → Open URI… with any https://images.patolojiatlasi.com/<case>/<stain>.dzi link works too.
  • Opens local Deep Zoom folders too — Patoloji Atlası → Yerel DZI aç… reads a .dzi sitting next to its <name>_files/ directory on disk, the same pyramid format the atlas serves. Useful for a slide you have exported with vips dzsave but not yet published. It is an explicit command rather than drag-and-drop because QuPath may filter unknown extensions before any image reader is consulted. With a project open the slide is added to it, because annotations on a slide opened without a project live only in memory and are lost on close.
  • Named teaching regions. Patoloji Atlası → Bölgeler → Bölgeleri dışa aktar… writes the slide’s named annotations to <slide>.regions.json beside the pyramid. That one small file is read by three different things: this extension (Bölgeleri içe aktar… to revise them), the OpenSeadragon web viewer (click a region name, the slide zooms to it), and the atlas MCP server (so an assistant can list a slide’s regions and open one). Coordinates are plain full-resolution pixels — the space QuPath, the DZI descriptor and OpenSeadragon all already share, so nothing is transformed anywhere along the way. Name an annotation Lenfoid agregat | Lymphoid aggregate to give it both languages. Full workflow, the atlas-regions/1 format, and the invariants that keep the three consumers in step: docs/teaching-regions.md.
  • GeoJSON region exchange. Bölgeler → GeoJSON dışa aktar… / içe aktar… writes and reads a separate GeoJSON FeatureCollection for QuPath, R tools such as wsiTools, and geometry checks. The exchange file carries full-resolution pixel coordinates, feature UUIDs, names, classes, descriptions, and slide dimensions when exported here. Polygon holes and fractional coordinates remain in the geometry; QuPath 0.6 ROI conversion can shift fractional coordinates by a few thousandths of a pixel, so use a 0.01 px tolerance for a QuPath round-trip check. Import checks dimensions and asks for confirmation when another tool omitted them; matching UUIDs can replace existing annotations after confirmation. The website and MCP server still use <slide>.regions.json, so export that format again after editing a GeoJSON copy if the published teaching regions should change. Bölgeler → Bölge dosyasını GeoJSON’a çevir… converts an existing published .regions.json without opening its slide; it copies stored geometry directly, avoiding QuPath ROI coordinate rounding.

E.3 Quiz (self-study)

Extensions → Patoloji Atlası → Sınav / Quiz → Hazırla… and Extensions → Patoloji Atlası → Sınav / Quiz → Çöz… turn atlas slides into a self-study quiz — no project and no server required. Four question types are supported:

  • Multiple-choice — a prompt with several options, one marked correct.

  • Free-text — a prompt with a model answer to compare your own notes against.

  • Annotation task — a prompt that asks you to mark or outline a feature on the slide (e.g. “mark every mitosis”); you draw with QuPath’s normal annotation tools, then click Göster to overlay the instructor’s reference annotation on the slide and compare by eye.

  • Guided navigation (“find it”) — a prompt that asks you to navigate to a region (e.g. “find the area of highest mitotic activity”); pan/zoom there yourself, then click Göster to overlay the target region and recentre the viewer on it.

  • Author (Sınav / Quiz → Hazırla…) — with an atlas slide open, add a question of any of the four types; each question is bound to the slide that was open when you added it (its DZI URL is stored with the question), so one pack can span several slides. For an annotation or navigation question, draw and select the reference region on the slide yourself, then click Referansı slayttan al to capture its shape as the question’s reference (annotation) or target (navigation) geometry. Save the finished set as a quiz-pack JSON.

  • Take (Sınav / Quiz → Çöz…) — load a quiz-pack and work through its questions in order; each question opens its slide, you answer it — pick an option, type notes, draw an outline, or navigate to a region — then click Göster to reveal the correct MCQ option, the free-text model answer, or, for annotation/navigation questions, an overlay of the reference/target region drawn directly on the slide.

  • This is self-study, not a graded exam. For multiple-choice and free-text questions there is no auto-grading at all — Göster only reveals the correct option or model answer for a visual self-compare, nothing is scored. For annotation and navigation questions, Göster additionally appends one measurement-only score line below the reference/target overlay: IoU % plus a hit/miss verdict, where a hit is “IoU > 0.3 or containment” (annotation: your drawn outline vs. the reference geometry; navigation: your viewport at reveal time vs. the target geometry). This score is a geometric measurement, not a clinical judgement, and it is display-only: it is never persisted, never written back into the quiz-pack, and disappears like everything else in the reveal area as soon as you move on. Nothing is saved anywhere: the quiz-pack is a single portable file you’re free to email or hand out, and anything you draw while answering an annotation or navigation question is transient — it’s cleared again as soon as you move to the next/previous question or close the window, so it never ends up saved in the project.

  • No QuPath? No problem. web-tour-player/ is a single self-contained HTML page that plays the same quiz/tour packs in a plain web browser — see its README for deployment and CORS notes.

E.4 Compare a case’s stains

Extensions → Patoloji Atlası → Karşılaştır → Bu vakanın boyalarını karşılaştır… opens every stain of the case shown in the active viewer — H&E plus any IHC / special stains — into QuPath’s native multi-viewer grid, with pan/zoom linked across all of them (QuPath’s built-in synchronize viewers behavior), so you can scroll one panel and have the others follow to the same field. The grid size (1×2 up to 2×3) is picked to fit the number of stains; cases with more than six stains only show the first six. If the active viewer isn’t showing a cataloged atlas slide, or the slide’s case has no other stains, you get a message instead of a grid.

Extensions → Patoloji Atlası → Karşılaştır → Tek görünüme dön turns synchronization off and collapses the grid back to a single viewer, closing the other panels (prompting to save first if any of them have unsaved edits, exactly like QuPath’s own close-viewer action).

E.5 Bench-side reference

Open an atlas case in a second viewer beside your own slide — handy for comparing your own case against a known reference while you work, without losing what’s already open. Two ways to launch it:

  • Browser right-click — in Slaytlara gözat…, right-click a case and choose Referans olarak yanında aç.
  • Extensions → Patoloji Atlası → Referans → Referans slayt aç… — a search-and-pick dialog (filter by title, organ, or stain) with a Yanında aç button (or double-click a row).

Either way, the reference slide streams into a new viewer added next to your active one; if nothing is open yet, it opens directly into that single viewer instead (there’s nothing to be “beside” yet). When both slides carry a known pixel size (µm/px), the reference viewer’s zoom is matched automatically to show the same on-screen scale as yours. A small floating Referans window appears alongside it with:

  • Büyütmeyi eşle — re-match magnification on demand.
  • Kaydırmayı da eşle (tam senkron) — toggle full pan/zoom sync between the two viewers (QuPath’s built-in synchronize-viewers behavior).
  • Referansı kapat — closes the reference viewer (prompting to save first if it has unsaved edits) and collapses the grid back to a single viewer.

E.7 Collections & favorites

Build a selection in the browser (right-click a slide → Add to selection, or the Add to selection button), then:

  • Koleksiyonu kaydet… writes the current selection to a small, shareable .json file — send it to a colleague, or keep it as your own case list. Refuses (with a status hint) if the selection is empty.
  • Koleksiyon yükle… opens a .json collection and re-resolves each entry against the currently-loaded catalog, adding whatever matches into the selection basket. The status line reports how many slides loaded and how many are no longer in the catalog (e.g. renamed or removed since the file was saved) — that part is safely ignored rather than failing the whole load.
  • Right-click a slide → ★ Favori (aç/kapat) to mark or unmark it as a favorite. Favorited slides show a ★ prefix in the tree. Favorites persist automatically to ~/QuPath-atlas-collections/favorites.json, independent of any saved collection file.
  • Favorileri yükle adds every currently-catalogued favorite into the selection basket.

Collections are portable: the .json file only needs the slide’s DZI URL plus a bit of display metadata, so it resolves correctly even against a refreshed catalog — share it with a colleague running the same extension.

E.8 Requirements

  • QuPath 0.6.x (built against the 0.6 API; runs on Java 21).
  • Internet access at runtime (slides stream from images.patolojiatlasi.com).

E.9 Install

Two ways to install, both needing only QuPath 0.6 or newer. Method A is recommended — you add the catalog once and QuPath installs the extension and offers future updates for you. Method B is a one-time manual download if you’d rather not add a catalog.

Method B — download the JAR from Releases (manual)

  1. Go to the latest release and download the attached qupath-extension-atlas-<version>.jar (under Assets).
  2. Start QuPath 0.6+.
  3. Drag the .jar onto the QuPath window and confirm when asked to install it. (Alternatively, copy it into QuPath’s extensions directory: Extensions → Installed extensions → open extensions directory, drop the JAR there.)
  4. Restart QuPath when prompted. The extension then appears under Extensions → Patoloji Atlası → Slaytlara gözat….

To update with Method B, download the newer JAR and repeat — replace the old JAR in the extensions directory (or just drag the new one on and let QuPath overwrite it).

E.10 Build (optional)

Pre-built JARs are attached to every GitHub release, so most users never need to build. To build from source (JDK 21 required):

./gradlew build          # macOS / Linux
gradlew.bat build        # Windows

The extension jar is written to build/libs/qupath-extension-atlas-<version>.jar. QuPath’s own APIs are resolved from the SciJava Maven repository at build time, so an internet connection is needed for the first build.

E.11 Notes & limitations

  • Pixel-size calibration is now usually automatic. The .dzi descriptor itself carries no microns-per-pixel, but vips dzsave writes a vips-properties.xml sidecar inside the <name>_files/ directory, and that sidecar keeps the scanner’s real calibration (openslide.mpp-x, aperio.MPP, xres, plus aperio.AppMag and ScannerType). The extension reads it on open — over HTTP for atlas slides and from disk for local ones — so most slides now open already calibrated, with QuPath’s scale bar working and measurements in µm. Verified against lymphocytic-gastritis/HE: aperio.MPP = 0.263018 on a GT450 DX at 40×.

    Precedence, highest first: (1) an explicit …/HE.dzi?mpp=0.25 in the URL; (2) a per-image "mpp" or catalog-wide "defaultMpp" in the catalog; (3) the vips-properties.xml sidecar;

    1. nothing — the slide opens uncalibrated, as before. A wrong calibration is never guessed: if no source supplies one, none is applied.

    Note xres is pixels per millimetre, so µm/px is 1000 / xres. Because vips computes it for the image it actually wrote, it stays correct even for a slide that was downsampled on export — no per-case export ratio has to be recovered.

    In-app helper, for the slides that still need it: Patoloji Atlası → Piksel boyutu ayarla… shows whether the open image is calibrated, computes mpp_export = mpp_original × (width_original / width_export) from the scanner preset and the export ratio (the formula in docs/pixel-size-mpp.md), and then either applies it for the session or builds the durable ?mpp= URL — the two are labelled separately because only the URL survives a reopen.

    This matters more than a missing scale bar. An uncalibrated image still reports getAveragedPixelSize() == 1.0, and µm-based tools that read it without first checking hasPixelSizeMicrons() silently treat one pixel as one micron. The WSInfer extension is a verified example: it computes downsample = spacing_um_px / getAveragedPixelSize(), so a model trained at 0.5 µm/px runs at roughly twice the intended magnification and the run completes with no error. Cell detection fails differently again (it checks, and returns NaN). Calibrate before analysing.

  • Image type is set on open when recognised. H&E → Brightfield (H&E) and a known special/histochemical stain → Brightfield (other), so color deconvolution works without setting it by hand. Any other stain (including IHC markers) is left unset — the extension only assigns a type it is confident about and never guesses IHC/DAB; set those in the Image tab.

  • Streaming, not downloaded. Tiles are fetched on demand into QuPath’s tile cache; a live connection is needed while panning into new regions.

  • Category coverage depends on the list metadata. Images are grouped from the speciality and organEN fields, falling back to the title/slug. Entries whose list record has none of these (currently a fair number, many with blank titles) land under Uncategorized — filling in organEN/titleEN in list.yaml will automatically improve grouping on the next refresh.

  • Respecting the source. The images belong to patolojiatlasi.com; this tool is for viewing and study. Avoid bulk-downloading the tile pyramids.

E.12 Focus heatmap

Extensions → Araştırma → Odak ısı haritası adds a dwell/attention heatmap that records where you look on a slide. This lives in the “Araştırma” menu (a top-level sibling of “Patoloji Atlası” in Extensions), together with image rotation and the “flag any project” action below — these tools are atlas-independent and work on any open slide, not just ones opened from the atlas catalogue. While tracking is on, the active viewer’s visible region is sampled a few times a second and accumulated into a per-slide grid shown as a translucent overlay — focused high-magnification viewing heats an area far faster than a zoomed-out browse, so the map doubles as a “did I review the whole slide?” check and as a way to study where readers focus.

Menu items:

  • Slayt üzerinde göster (ısı katmanı) — toggle the translucent heatmap overlay on the active viewer.
  • Ayrı pencerede göster — toggle a separate floating window showing the same heatmap.
  • Temizle — reset the current slide’s map.
  • Kaydet… — save the current map now to a folder you pick.
  • Araştırmaya katkıda bulun… — save an anonymised contribution (no user name; a random session id + stable slide key + date) under ~/QuPath-atlas-focus-maps/contributions/, for the planned per-slide crowd attention map. Uploading is disabled until the atlas website has a receiver — until then the file is only written locally and can be shared manually.
  • Oturumdan sonra sakla (kalıcı) — when off (default), maps live only for the session and are discarded; when on, each slide’s map is auto-saved (on slide change, close, or stopping) to ~/QuPath-atlas-focus-maps/ so it can be analysed later.
  • Gezinme kaydı (araştırma) — sessizce kaydeder, ısı haritası gösterilmez — the blinded-recording toggle; see Blinded research recording below.

Each saved map is a <slide>__<user>__<timestamp>.json (plus a .png preview). The JSON carries the slide name/URI, the user (OS login), image and grid dimensions, sample count, and the row-major grid of dwell values — enough to aggregate focus across readers offline. The plan for pooling contributions into a website overlay is in docs/focus-aggregation-plan.md.

Blinded research recording

For studies that need real, unbiased dwell-time data — where seeing a live heatmap of your own viewing could change how you look — the same focus tracker has a blinded mode: it silently records which regions of the slide you looked at and for how long, with no overlay, no window, and no on-screen indication of any kind while it’s active. It can’t be toggled visible; the Slayt üzerinde göster (ısı katmanı) / Ayrı pencerede göster / Temizle / Kaydet… / Araştırmaya katkıda bulun… menu items are all disabled for the duration, so a session can’t accidentally surface a heatmap or leak one to a file.

You can turn it on for a single session from Extensions → Araştırma → Odak ısı haritası → Gezinme kaydı (araştırma), or make it the default for an entire study. There are two ways to do that:

  • Building a project from the atlas browser: check “Araştırma projesi — gezinme kaydı (blinded)” in the Create project dialog.
  • Any other project — local slides, a server/PACS project, or one you already have open: Extensions → Araştırma → Mevcut projeyi araştırma projesi yap (gezinme kaydı)… flags the currently open project in one click, no atlas involvement required. This is the same sidecar mechanism, so it’s how a researcher sets up a double-blind spatial/temporal/directional viewing study on their own SVS files.

Either way, this writes a small atlas-research.json sidecar next to the project’s .qpproj file; every time the project is opened afterwards, blinded recording starts automatically — after a one-time consent notice explaining that anonymised viewing data (regions viewed + dwell time, no identity) is being recorded for research. (The “flag current project” action asks for that same consent immediately, since you’re opting in right there, and starts recording at once rather than waiting for the next reopen.) Declining leaves recording off and the notice reappears next time the project opens; accepting is remembered so later sessions start recording immediately, no re-prompt.

Where the data goes. When a project is open, every blinded write for that session goes into <project>/atlas-focus/ (captured once when recording starts, so a later project switch can’t misattribute a still-finishing session); with no project open it falls back to ~/QuPath-atlas-focus-maps/contributions/. While recording, the current slide’s map is checkpointed to a session-<id>__<slide-start>.partial.json file roughly every 30 seconds, so a crash or force-quit loses at most that much data — not the whole session. Switching slides or stopping promotes the checkpoint into a final per-slide JSON fragment and removes that .partial.json only after the final write succeeds. A failed final write leaves the checkpoint for recovery. Closing or switching away from the project stops recording, writes the last slide’s fragment, and bundles every fragment from the session into a single atlas-focus_<timestamp>_<session>.zip in the project folder (or the fallback dir) — that one zip is what you hand to the study coordinator. Every artifact in this pipeline (checkpoint, fragment, zip) is JSON-only and anonymised: no PNG, no username, ever.

Running a study? See SHARING.md for the end-to-end guide to preparing a blinded-research project, packaging it (with the extension) for researchers, the consent / observer-effect tradeoff, and getting the data back — and analysis/ for the Python/R analysis toolkits.

Pathology-CoT demo recording

Blinded recording answers “how does an unaware reader actually navigate?”. The authoring recorder answers the opposite question — “how would you show someone your reasoning on this slide?” — and turns the answer into Pathology-CoT training data.

Extensions → Araştırma → Pathology-CoT → CoT demo kaydı — başlat / durdur (Shortcut+Shift+G). A short notice explains what is recorded, then a red KAYIT indicator appears in the top-left of the viewer with the elapsed time and point count. Navigate the slide the way you would talk a trainee through it. Press the shortcut again and the draft is built immediately — each inspect/peek you made becomes a stop with its viewport and highlight box, ready for you to type the “why I looked here / what I saw” rationale in the tour author.

This is the deliberate counterpart to blinded recording, and the two differ in every respect that matters:

Blinded research recording CoT demo recording
Scope whole project, every time it opens one take, one slide
On screen nothing, by design KAYIT indicator
Who it describes an unaware reader (naturalistic) an aware author (demonstration)
Slide identity anonymised hash only the real slide URI (see below)
Where it lands <project>/atlas-focus/ ~/QuPath-atlas-cot/<slide>__<timestamp>/

The two can never run at once. Starting either one while the other is recording is refused with a message rather than silently taking over — an awareness cue during a blinded session would compromise that study, and blinded recording starting mid-take would mix a demonstration into the study cohort.

Where the data goes, and why not in the project. A take is written to ~/QuPath-atlas-cot/<slide-slug>__<yyyyMMdd-HHmmss>/recording.json, checkpointed every ~30 seconds and flushed on quit, with schema atlas-cot-authored/1. That schema is a deliberately new family, so the blinded analysis toolkits — which accept only atlas-focus-contribution/… — reject an authored take automatically and demonstration data can never be scored as if it were naturalistic. Unlike a blinded fragment, a take records the real slide path (the draft has to reopen the slide), which is why it is kept outside the project folder: SHARING.md asks study participants to send their whole atlas-focus/ folder, and nothing authored should ever travel with it.

Design notes, verified facts and what is deliberately not built yet are in docs/superpowers/2026-10-11-cot-authoring-recorder.md.

E.13 Coverage & QC dashboard

Extensions → Patoloji Atlası → Katalog kapsamı ve QC… opens a read-only category x stain matrix computed from the bundled catalogue snapshot — for every category, how many slides and distinct cases fall into each of the four stain buckets (H&E / IHC / special stain / other), plus per-category published% and mpp-known% (pixel-size calibration coverage). A bold TOTAL strip under the table sums the whole catalogue.

  • Bağlantıları denetle — an opt-in, best-effort reachability check of every distinct DZI URL in the catalogue (a HEAD request per URL, run off the UI thread with a progress bar). Any unreachable slide is listed by title and URL underneath — nothing is checked automatically, since this makes a batch of network calls.
  • Drill down. Double-click a category row to seed the project builder (the same dialog the browser’s selection basket uses) with every case in that category, ready to review and turn into a project.
  • Export. Copy or save the matrix as CSV or Markdown — handy for pasting a data-availability statement or tracking catalogue gaps over time.

The classification (which stain bucket a slide falls into) is keyword-based, so the Diğer (“other”) / Uncategorized buckets are honest catch-alls rather than a guarantee of correctness — see stainBucket()/normalizeCategory() if you need to extend the keyword lists.

E.14 Provenance & citation

Beyond citing the extension itself (see Citation below), the atlas menu can generate ready-to-use citations and export files for the slides you actually used — image + extension + QuPath references together, so a figure or methods section always carries full provenance.

  • Cite a slide. Right-click a case in Slaytlara gözat… and choose Bu slaytı alıntıla…, or use Extensions → Patoloji Atlası → Atıf → Açık slaytı alıntıla… with the slide open in the active viewer. Produces BibTeX / RIS / plain-text citations for the atlas image, this extension, and QuPath (Bankhead et al. 2017), with copy-to-clipboard and save-to-file actions.
  • Export a cohort manifest. In the project-builder dialog (from the browser’s selection basket), click Künye / manifest dışa aktar… and pick a folder — writes atlas-manifest.csv, atlas-manifest.md, and atlas-methods.txt for every slide in the current selection. This does not create a project; it only records provenance for the slides you’ve gathered.
  • Cite a region. Select an annotation on an open atlas slide, then use Extensions → Patoloji Atlası → Atıf → Bu bölgeyi alıntıla…. Produces a figure-citation card — the slide citation, the viewport framing (downsample + center), an editable caption, and the region’s geometry as GeoJSON — with the same copy/save actions.

All three add a best-effort catalogue commit SHA (from a lightweight, unauthenticated GitHub API call) and this extension’s version to the exported provenance, without blocking the UI while that network lookup runs.

E.15 Citation

If you use this software, please cite it — GitHub renders a “Cite this repository” button from CITATION.cff. The archive is on Zenodo under a concept DOI that always resolves to the latest release (cite this — it stays the same across versions):

10.5281/zenodo.21443833

Balcı, S. QuPath Patoloji Atlası Extension (qupath-extension-atlas) [Software]. Zenodo. https://doi.org/10.5281/zenodo.21443833

E.16 License

MIT — see LICENSE.

Developer and release notes are kept with the source code: README.