Skip to main content

Orthanc REST API python wrapper with additional utilities

Project description

ci documentation PyPI - Version PyPI - Downloads status

PyOrthanc

PyOrthanc is a comprehensive Python client for Orthanc, providing:

  • Complete wrapping of the Orthanc REST API methods
  • High-level utilities for common DICOM operations
  • Asynchronous client support
  • Helper functions for working with DICOM data
  • Integration with the Orthanc Python plugin

Why PyOrthanc?

PyOrthanc makes it easy to work with DICOM medical images stored on Orthanc servers using Python - instead of dealing with the DICOM protocol directly or creating complex code to interact with Orthanc's REST API.

Researchers and clinicians can make simple Python script to access and manage their medical imaging data.

Advanced users can use PyOrthanc to make Orthanc query a hospital PACS (Picture Archiving and Communication System). This allows to find and retrieve images produced in the clinic for research or quality control purposes. Additionally, since PyOrthanc simplifies Orthanc's anonymization operations, an entire medical image management workflow can be implemented in Python.

PyOrthanc or python-orthanc-api-client?

Another project python-orthanc-api-client from orthanc-team is quite similar to pyorthanc.

If you are wondering which one to use, please refer to this discussion.

Quick Install

pip install pyorthanc        # Basic installation
pip install pyorthanc[all]   # Install all optional dependencies

Basic Usage

Assuming an Orthanc server running locally at http://localhost:8042:

from pyorthanc import Orthanc, upload

# Connect to Orthanc server
client = Orthanc('http://localhost:8042')
# Or with authentication:
client = Orthanc('http://localhost:8042', username='orthanc', password='orthanc')

# Basic operations
patient_ids = client.get_patients()
studies = client.get_studies() 

# Upload DICOM files
upload(client, 'image.dcm')  # From a file
upload(client, 'dicom_files.zip')  # From a zip
upload(client, 'path/to/directory')  # Upload all dicom files in a directory
upload(client, 'path/to/directory', recursive=True)  # Upload all dicom files in a directory recursively
# Check if dicom is in Orthanc before upload
upload(client, 'path/to/directory', recursive=True, check_before_upload=True)

Working with DICOM Modalities

from pyorthanc import Modality

# Create modality connection
modality = Modality(client, 'REMOTE_PACS')

# Test connection with C-ECHO
if modality.echo():
    print("Successfully connected to PACS")

# Query studies with C-FIND
response = modality.find({
    'Level': 'Study',
    'Query': {
        'PatientID': '12345*',
        'StudyDate': '20230101-20231231'
    }
})

# Matches (i.e. answers in Orthanc nomenclature) can be reviewed before retrieving results
response['answers']

# Retrieve results with C-MOVE to a target AET
modality.move(response['ID'], {'TargetAet': 'ORTHANC'})

Finding and Processing DICOM Data

from pyorthanc import find_patients, find_studies, find_series, find_instances

# Search for patients
patients = find_patients(
    client,
    query={'PatientName': '*Gabriel'},
    labels=['research']  # It is also possible to filter by labels
)

# Process patient data
for patient in patients:
    print(f"Patient: {patient.name} (ID: {patient.patient_id})")
    print(f"Birth Date: {patient.birth_date}")
    print(f"Labels: {patient.labels}")
    
    # Access studies
    for study in patient.studies:
        print(f"\nStudy Date: {study.date}")
        print(f"Description: {study.description}")
        
        # Access series
        for series in study.series:
            print(f"\nModality: {series.modality}")
            print(f"Series Description: {series.description}")
            
            # Access individual DICOM instances
            for instance in series.instances:
                # Convert to pydicom dataset
                ds = instance.get_pydicom()
                # Process DICOM data...

# Note the existing function to query Orthanc
find_studies(client, query={...})
find_series(client, query={...})
find_instances(client, query={...})

Using pyorthanc within Orthanc's Python plugin

Use the orthanc_sdk module when using Orthanc's Python plugin. orthanc_sdk acts as the same as orthanc, but it provides type hints and autocompletion. For example:

from pyorthanc import orthanc_sdk

# Register a new REST endpoint
def handle_api(output: orthanc_sdk.RestOutput, uri: str, **request):
    """Handle REST API request"""
    if request['method'] == 'GET':
        output.AnswerBuffer('Hello from plugin!', 'text/plain')
    else:
        output.SendMethodNotAllowed('GET')

orthanc_sdk.RegisterRestCallback('/hello-world', handle_api)

# Handle incoming DICOM
def on_store(dicom: orthanc_sdk.DicomInstance, instance_id: str):
    """Process stored DICOM instances"""
    print(f'Received instance {instance_id}')
    print(f'Size: {dicom.GetInstanceSize()} bytes')
    print(f'Transfer Syntax: {dicom.GetInstanceTransferSyntaxUid()}')

orthanc_sdk.RegisterOnStoredInstanceCallback(on_store)

Examples

Typical example can be found in these notebooks.

  • This notebook shows how a user can query image data from an Orthanc server
  • This notebook shows how a user can query and pull data from other modality (such as a CT scan or a PACS) connected to an Orthanc Server.

Notes on versioning

The Orthanc and AsyncOrthanc classes are generated from https://orthanc.uclouvain.be/api/.

Compatibility of versions between PyOrthanc and the Orthanc REST API are the following. Note that recent PyOrthanc versions will likely support older Orthanc version.

PyOrthanc version Generated from
>= 1.20.0 Orthanc API 1.12.6 with Python Plugin 4.2
1.19.0, 1.19.1 Orthanc API 1.12.5 with Python Plugin 4.2
1.18.0 Orthanc API 1.12.4 with Python Plugin 4.2
1.17.0 Orthanc API 1.12.3 with Python Plugin 4.2
1.13.2 to 1.16.1 Orthanc API 1.12.1 with Python Plugin 4.1
1.13.0, 1.13.1 Orthanc API 1.12.1 with Python Plugin 4.0
1.12.* Orthanc API 1.12.1
1.11.* Orthanc API 1.11.3
0.2.* Provided Google sheet from Orthanc maintainer

Running tests

The tests are run in a docker image launched with docker compose.

docker compose run test

This command starts 3 containers :

  1. A Python image with the PyOrthanc source code and launches pytest
  2. An instance of Orthanc (orthanc1) on which the PyOrthanc client is connected
  3. A second Orthanc instance (orthanc2) which acts as a modality connected to orthanc1

Cheat sheet

First steps

Getting started

Advanced examples

Releases

Community guidelines

Contacts

Citation

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyorthanc-1.22.1.tar.gz (110.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyorthanc-1.22.1-py3-none-any.whl (123.7 kB view details)

Uploaded Python 3

File details

Details for the file pyorthanc-1.22.1.tar.gz.

File metadata

  • Download URL: pyorthanc-1.22.1.tar.gz
  • Upload date:
  • Size: 110.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.11.11 Linux/5.14.0-570.24.1.el9_6.x86_64

File hashes

Hashes for pyorthanc-1.22.1.tar.gz
Algorithm Hash digest
SHA256 a7b9a8e7f9a78f36cd2ca5e13f734b99ede5f94deb27ed0ab04fda0a55a5cc68
MD5 689ade5dd47f019a77095ae4e726e13c
BLAKE2b-256 795f5dda73a71bab2c718f05ff640225b61cf05d161b01bfa43a87500d2098c7

See more details on using hashes here.

File details

Details for the file pyorthanc-1.22.1-py3-none-any.whl.

File metadata

  • Download URL: pyorthanc-1.22.1-py3-none-any.whl
  • Upload date:
  • Size: 123.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.11.11 Linux/5.14.0-570.24.1.el9_6.x86_64

File hashes

Hashes for pyorthanc-1.22.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4fcadb30aa84af57c0535ea1c5bbf1f27d3c5c215c212fc823dacff157dec4c0
MD5 2df14737246e9387d5d4d96600db47ee
BLAKE2b-256 72b69cd2b48407088546ccb6d280be4448c2a3402879d85267a4ed4614924bcc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page