Skip to main content

ClinicalScope

Multi-source time-series signal visualization for research, mainly in ICU and Machine Learning
Format · Visualize · Annotate · Export — no code required

CI PyPI version Python versions License: Apache 2.0 DOI


ClinicalScope is an open-source, browser-based dashboard for visualizing, annotating, and extracting time-series data. Its primary domain is ICU monitoring — loading recordings from multiple clinical devices simultaneously (Servo-U ventilators, EIT systems, FluxMed, Mindray, EDF recorders, plus a generic reader for any tabular export — monitors, syringe pumps, and the like) — but its annotation and extraction pipeline is designed for any time-series data, making it equally useful for machine learning workflows that require labeled datasets.

Installation

Download the latest release for your platform from the Releases page:

Platform File
Windows ClinicalScope-windows-x86_64.zip
macOS (Apple Silicon) ClinicalScope-macOS-arm64.zip
Linux ClinicalScope-linux-x86_64.zip

Unzip and run the ClinicalScope executable — no Python installation required. Each bundle includes the user guide PDF and a demo database to get started immediately.

First launch — the app is not code-signed, so your OS warns you once
  • Windows — right-click ClinicalScope.exe → Run as administrator; the first launch needs elevation. SmartScreen may also warn about an unknown publisher (More info → Run anyway). One time only — afterwards a plain double-click works, including after a reboot.
  • macOS (Apple Silicon) — strip the quarantine flag from the .zip before unzipping: xattr -d com.apple.quarantine ClinicalScope-macOS-arm64.zip. Some browsers unzip downloads automatically and defeat this — turn that off, or use another browser.
  • Linux — chmod +x ClinicalScope/ClinicalScope if it does not start.

To close the app, close the terminal window that opened with it — ClinicalScope runs inside that window.

From PyPI (Python users)

pip install clinical-scope
clinical-scope          # opens http://127.0.0.1:8050

Requires Python 3.11–3.13.

To upgrade an existing install to the newest release:

pip install -U clinical-scope

From source (developers)

git clone https://github.com/larib-data/clinical-scope.git
cd clinical-scope
python -m venv .venv              # create a virtual environment
source .venv/bin/activate         # Windows: .venv\Scripts\activate
pip install -e .
clinical-scope

For the full developer setup (tests, linting, adding a datasource), see CONTRIBUTING.md.

Demo

ClinicalScope demo

Quickstart

  1. Install and run — see Installation above; your browser opens at http://127.0.0.1:8050
  2. Load config — click Default visualization (all sources) to use built-in defaults, or upload a database_options.json / .xlsx config file
  3. Set data folder — enter the path to your patient folder. No data of your own yet? See Trying the demo below (for the demo, set the EIT day to 2004-09-15 and the EDF recording start to 2004-09-15 10:12:33 — neither file carries its own recording date)
  4. Process — click Process visualization; interactive plots appear in the browser
  5. Annotate — draw time events, windows, or point annotations, then click Save

Trying the demo

ClinicalScope ships a small demo recording — one patient, every supported data source — so you can see a full visualization before preparing any data of your own.

A pip install does not include it, so download it once:

clinical-scope --demo

That prints the folder it landed in, plus the demo_patient/ path to paste into the app's Data folder field. A source checkout already carries the same data under example/demo_database/; the standalone application puts it in demo_database/, next to the executable.

Run clinical-scope --help for the full list of commands.

Documentation

The user guide is the primary reference for everything beyond the Quickstart: data folder layout, database_options config files, annotation tools, inspection view, CLI scripts, and the Python API.

Supported Data Sources

Data Source Device / Format File Types Typical Signals
EIT PulmoVista .asc .asc Global/local impedance, impedance percentages
FluxMed Signals FluxMed waveforms .parquet, .txt, .csv Respiratory waveforms
FluxMed Parameters FluxMed parameters .parquet, .txt, .csv Respiratory parameters
Servo-U Servo-U ventilator .sta .sta Ventilator waveforms and settings
Mindray Scope Mindray monitor .xml, .csv ECG, SpO₂, pressure waveforms
Mindray Respi Waves Mindray respiratory .parquet, .csv High-frequency respiratory waveforms
Mindray Respi Numerics Mindray respiratory .parquet, .csv Vt, RR, PEEP, and more
EDF / EDF+ Amplifiers and polygraphic recorders .edf Any EDF-exported signal, typically EEG
Other (Generic) Any CSV / Parquet .parquet, .csv Any time-series with a datetime column — one independent entry per file

Each patient folder should contain one subfolder per data source. The user guide → Patient Data & Supported Data Sources gives the folder keyword for each source, the naming rules, and the configuration details.

Standalone Data Processing

ClinicalScope can run the full find → load → format pipeline without opening the UI, either via Python or command-line scripts. Raw parquet caches are always written to <data_folder>/clinical_scope_output/ automatically; pass save_folder to also save formatted output elsewhere.

Python API

from pathlib import Path
from clinical_scope import extract_datasource, extract_patient, batch_extract
from clinical_scope.config.parsing import load_database_options_from_path

db_options = load_database_options_from_path(Path("database_options.json"))
# No config of your own yet? The demo config works as-is, no UI needed — run
# `clinical-scope --demo`, then point at the database_options.json it reports.

# 1. Single datasource subfolder (auto-detects type from folder name)
df = extract_datasource(
    Path("/data/Patient01/servo_u"),
    database_options_specific=db_options.get("servo_u"),
    patient_options={"datetime_start": "2024-01-15 08:00:00"},
    save_path="/output/servo_u.parquet",  # optional
)

# 2. All datasources for one patient
results = extract_patient(
    Path("/data/Patient01"),
    db_options,
    patient_options={"datetime_start": "2024-01-15 08:00:00"},
    save_folder="/output/Patient01",  # optional
)
# results = {"servo_u": DataFrame | None, "eit": DataFrame | None, ...}
# Note: the generic "other" source is visualization-only — extraction returns None for it.

# 3. Multiple patients — pass a root directory or an explicit list
batch = batch_extract(
    Path("/data"),  # root whose subdirs are patients
    db_options,
    save_folder="/output",  # optional; each patient gets a subfolder
)
# batch = {"Patient01": {"servo_u": DataFrame, ...}, "Patient02": {...}, ...}

# Explicit list variant
batch = batch_extract(["/data/Patient01", "/data/Patient02"], db_options)

Set "quick_load": true in patient_options to reuse previously cached parquet files on subsequent runs.

CLI Scripts

All three scripts share the same pattern: a required patient_folder positional argument plus optional --database-options, --patient-options, and --verbose flags.

# Extract (find + load + format) without plots
python scripts/process_patient_data.py patient /data/Patient01 --verbose
python scripts/process_patient_data.py patient /data/Patient01 --database-options db.json
python scripts/process_patient_data.py batch /data/patients --output-folder /out

# Inspect available columns per datasource
python scripts/inspect_patient_data.py /data/Patient01 --verbose
python scripts/inspect_patient_data.py /data/Patient01 --database-options db.json --output-csv out.csv

# Visualize (generates HTML)
python scripts/visualization_patient_data.py /data/Patient01 --verbose
python scripts/visualization_patient_data.py /data/Patient01 --database-options db.json

Omit --database-options to use all available datasources with their defaults. Use --patient-options opts.json to pass datetime range, time shift, quick_load, etc.

Contributing

Contributions are welcome — bug reports, new data sources, and documentation improvements. See CONTRIBUTING.md.

Citation

If you use ClinicalScope in academic work, please cite:

@software{clinicalscope2026,
  author    = {Janin, Alexis},
  title     = {{ClinicalScope}: Interactive Visualization Dashboard for Clinical Physiological Signals},
  url       = {https://github.com/larib-data/clinical-scope},
  version   = {1.3.0},
  year      = {2026},
  doi       = {10.5281/zenodo.20830140},
}

A CITATION.cff file is also provided for GitHub's Cite this repository button.

Disclaimer

Research Use Only — Not a Medical Device

This software is provided exclusively for scientific research purposes. It is not a medical device within the meaning of Regulation (EU) 2017/745 (MDR) and has not undergone CE marking, conformity assessment, or any regulatory authorization (CE, FDA, or other).

It must not be used for the diagnosis, monitoring, treatment, or prevention of disease, nor for any clinical decision concerning a patient. The visualizations, annotations, and formats it produces are not validated for clinical purposes, and any use beyond research is the sole responsibility of the user, who must carry out their own validation.

Personal Data and GDPR

This software processes physiological signals that may constitute health data — i.e. personal data falling within the special categories of Article 9 of Regulation (EU) 2016/679 (GDPR). By deploying or using this software on data, you act as the data controller and assume all corresponding obligations.

License

ClinicalScope is licensed under the Apache License 2.0.

Copyright © 2026 Assistance Publique – Hôpitaux de Paris. Developed by Alexis Janin.

Metadata

Release files for clinical-scope 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for clinical-scope 1.3.0
File Size Uploaded
clinical_scope-1.3.0.tar.gz 197.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for clinical-scope 1.3.0
File Interpreter ABI Platform
clinical_scope-1.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 434.3 kB

Release files / clinical_scope-1.3.0.tar.gz

Download URL clinical_scope-1.3.0.tar.gz
Size 197.4 kB
Tags Source
SHA-256 checksum
How to use checksums
d2263c22cf4faf88c2db2c3b7df7f07d1a1fd8668bae0bbaa90f4673c7e4de9e
BLAKE2b-256 checksum
How to use checksums
0a5b304a00eb7886e779af1e15971983ca390c68cf66716bc87232d9226b2d47
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release files / clinical_scope-1.3.0-py3-none-any.whl

Download URL clinical_scope-1.3.0-py3-none-any.whl
Size 236.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c394a4dcf4bf9b4ecc46370ac41ca37fd0f0e5e676dbcbc7ae6a8d7304114082
BLAKE2b-256 checksum
How to use checksums
332de80a5cca8d0958296233b4c85810cce4e2725dd765bf18ea087acf098272
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release history Release notifications | RSS feed

1.3.1

2 release files

This release

1.3.0 This release

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.4.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page