Skip to main content

Orthanc REST API python wrapper with additional utilities

Project description

PyOrthanc

Python library that wraps the Orthanc REST API and facilitates the manipulation of data with several cool utilities.

Breaking changes

PyOrthanc has been rewritten almost entirely from 0.*.*. The new Orthanc client is now automatically generated from https://api.orthanc-server.com/. The version *.*. of PyOrthanc will follow Orthanc version (e.g. pyorthanc 1.11.* is generated from the API specification of Orthanc 1.11.*).

This means that the method names of the Orthanc objects from PyOrthanc 0.* are no longer the same. You can still use the old client with

from pyorthanc.deprecated.client import Orthanc

Note that due to automatic generation some method names may be less clear. However, the automatic generation allows PyOrthanc to cover all the routes of the API of Orthanc.

Installation

$ pip install pyorthanc

Example of usage

Be sure that Orthanc is running. The default URL (if running locally) is http://localhost:8042.

Getting access to patients, studies, series and instances information:

from pyorthanc import Orthanc

orthanc = Orthanc('http://localhost:8042', username='username', password='password')

# To get patients identifier and main information
patients_identifiers = orthanc.get_patients()

for patient_identifier in patients_identifiers:
   # To get patient information
   patient_info = orthanc.get_patients_id(patient_identifier)

   patient_name = patient_info['MainDicomTags']['PatientName']
   ...
   study_identifiers = patient_info['Studies']

# To get patient's studies identifier and main information
for study_identifier in study_identifiers:
   # To get Study info
   study_info = orthanc.get_studies_id(study_identifier)

   study_date = study_info['MainDicomTags']['StudyDate']
   ...
   series_identifiers = study_info['Series']

# To get study's series identifier and main information
for series_identifier in series_identifiers:
   # Get series info
   series_info = orthanc.get_series_id(series_identifier)

   modality = series_info['MainDicomTags']['Modality']
   ...
   instance_identifiers = series_info['Instances']

# and so on ...
for instance_identifier in instance_identifiers:
   instance_info = orthanc.get_instances_id(instance_identifier)
   ...

Find patients with certain characteristics in an Orthanc instance:

Each patient is a tree. Layers in each tree have the following structure Patient -> Study -> Series -> Instance that correspond to the provided filter functions.

from pyorthanc import find

patients = find(
    orthanc_url='http://localhost:8042/',
    auth=('username', 'password'),
    series_filter=lambda s: s.modality == 'RTDOSE'  # Optional: filter with pyorthanc.Series object
)

for patient in patients:
   patient_info = patient.get_main_information()
   patient.id_   # Access PatientID
   patient.name  # Access PatientName
   
   patient.get_zip() # DICOM files' content in bytes
   
   anonymized_patient_1 = patient.anonymize()  # New patient that was anonymized by Orthanc
   anonymized_patient_2 = patient.anonymize(
      keep=['PatientName'],   # You can keep/remove/replace the DICOM tags you want
      replace={'PatientID': 'TheNewPatientID'},
      remove=['ReferringPhysicianName'],
      force=True  # Needed when changing PatientID/StudyInstanceUID/SeriesInstanceUID/SOPInstanceUID
   )  
   ...

   for study in patient.studies:
      study.date  # Date as a datetime object
      study.referring_physician_name
      ...

      for series in study.series:
         series.modality  # Should be 'RTDOSE' because of the series_filter parameters
         ...

Upload DICOM files to Orthanc:

from pyorthanc import Orthanc

orthanc = Orthanc('http://localhost:8042', 'username', 'password')

with open('A_DICOM_INSTANCE_PATH.dcm', 'rb') as file:
   orthanc.post_instances(file.read())

Getting list of connected remote modalities:

from pyorthanc import Orthanc

orthanc = Orthanc('http://localhost:8042', 'username', 'password')

orthanc.get_modalities()

Query (C-Find) and Retrieve (C-Move) from remote modality:

from pyorthanc import RemoteModality, Orthanc

orthanc = Orthanc('http://localhost:8042', 'username', 'password')

modality = RemoteModality(orthanc, 'modality')

# Query (C-Find) on modality
data = {'Level': 'Study', 'Query': {'PatientID': '*'}}
query_response = modality.query(data=data)

answer = modality.get_query_answers()[query_response['ID']]
print(answer)

# Retrieve (C-Move) results of query on a target modality (AET)
modality.move(query_response['ID'], {'TargetAet': 'target_modality'})

Anonymize patient:

from pyorthanc import Orthanc, Patient

orthanc = Orthanc('http://localhost:8042', 'username', 'password')

patient_identifier = orthanc.get_patients()[0]

anonymized_patient = Patient(patient_identifier, orthanc).anonymize(
    keep=['PatientName'],   # You can keep/remove/replace the DICOM tags you want
    replace={'PatientID': 'TheNewPatientID'},
    remove=['ReferringPhysicianName'],
    force=True  # Needed when changing PatientID/StudyInstanceUID/SeriesInstanceUID/SOPInstanceUID
)
# Or directly with
orthanc.post_patients_id_anonymize(patient_identifier)

# result is: (you can retrieve DICOM file from ID)
# {'ID': 'dd41f2f1-24838e1e-f01746fc-9715072f-189eb0a2',
#  'Path': '/patients/dd41f2f1-24838e1e-f01746fc-9715072f-189eb0a2',
#  'PatientID': 'dd41f2f1-24838e1e-f01746fc-9715072f-189eb0a2',
#  'Type': 'Patient'}

Citation

If you publish using PyOrthanc, we kindly ask that you credit us. PyOrthanc can be found on Zenodo : https://zenodo.org/record/7086219 .

Contributing

You can contribute to this project with the following steps:

  1. First, fork the project on Github
  2. Clone the project
    git clone https://github.com/<your-github-username>/pyorthanc
    cd pyorthanc
    
  3. Enter the project and create a poetry environment (this project use the poetry for dependency management)
    peotry install 
    
  4. Make a new git branch where you will apply the changes
    git checkout -b your-branch-name
    
    Now you can make your changes
  5. Once done, git add, git commit and git push the changes.
  6. Make a Pull Request from your branch to the https://github.com/ulaval-rs/pyorthanc.

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.11.2.tar.gz (79.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.11.2-py3-none-any.whl (84.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pyorthanc-1.11.2.tar.gz
  • Upload date:
  • Size: 79.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.10.6 Linux/5.19.8-200.fc36.x86_64

File hashes

Hashes for pyorthanc-1.11.2.tar.gz
Algorithm Hash digest
SHA256 9b0f76c3854ee879e32b2f10a1ff0789daf93295fa0e89b98f1980e5f96cc0d9
MD5 6b7ac72a393cfffa8e64a100822aee19
BLAKE2b-256 a9a7a73bfb033d92b09730f400c2620eec12f9d91fc9def2ffcd5fc4e1a986e8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pyorthanc-1.11.2-py3-none-any.whl
  • Upload date:
  • Size: 84.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.10.6 Linux/5.19.8-200.fc36.x86_64

File hashes

Hashes for pyorthanc-1.11.2-py3-none-any.whl
Algorithm Hash digest
SHA256 93f43a64eeea20533ecbfab1ac260b9e790ed4028dffe702c52f1037c5469598
MD5 e2841003561b4fe40d5a636b37021e46
BLAKE2b-256 5b123286d958f0f88fc1be2529395397bd73fbdb6b9b6d30b7f57c33c8b5d403

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