Table of Contents
Pypx is a simple Python wrapper around DCMTK and PyDicom. It provides 4 simple way to interact with the PACS:
- px-echo: Ping the PACS to make sure it is online (echoscu).
- px-find: Find data on the PACS (findscu).
- px-move: Move data from the PACS (movescu).
- px-listen: Listen for incoming data from the PACS (storescp).
apt-get update \
&& apt-get install -y dcmtk \
&& apt-get install -y python3-pip python3-dev \
&& pip3 install --upgrade pip \
&& pip install pypx
px-echo
is a wrapper around dcmtk echoscu.
It sends a DICOM C-ECHO message to a Service Class Provider (SCP) and waits for a response. The application can be used to verify basic DICOM connectivity. -- DCMTK, about echoscu.
# need some help?
px-echo --help
# ping Orthanc PACS server
# calling aet: CHIPS
# called aet: ORTHANC
# Orthanc PACS server IP: 127.0.0.1
# Orthanc PACS server port: 4242
# echoscu executable: /usr/local/bin/echoscu
px-echo --aet CHIPS --aec ORTHANC --serverIP 127.0.0.1 --serverPort 4242 --executable /usr/local/bin/echoscu
# output
# { 'status': 'success',
# 'command': '/usr/local/bin/echoscu --timeout 5 -aec ORTHANC -aet CHIPS 127.0.0.1 4242',
# 'data': ''}
# in yourscript.py
import pypx
pacs_settings = {
'executable': '/usr/local/bin/echoscu',
'aec': 'ORTHANC',
'aet': 'CHIPS',
'server_ip': '127.0.0.1',
'server_port': '4242',
}
output = pypx.echo(pacs_settings)
print(output)
# output:
# {
# 'command': '/bin/echoscu --timeout 5 -aec MY-AEC -aet MY-AET 192.168.1.110 4242',
# 'data': '',
# 'status': 'success'
# }
px-find
is a wrapper around dcmtk findscu.
Find series on a PACS server given a vast array of parameters. See px-find --help
for the full list.
It sends query keys to an SCP and awaits responses. The application can be used to test SCPs of the Query/Retrieve and Basic Worklist Management Service Classes. -- DCMTK, about findscu.
# need some help?
px-find --help
# find data in Orthanc PACS server
# calling aet: CHIPS
# called aet: ORTHANC
# Orthanc PACS server IP: 127.0.0.1
# Orthanc PACS server port: 4242
# findscu executable: /usr/local/bin/findscu
px-find --aet CHIPS --aec ORTHANC --serverIP 127.0.0.1 --serverPort 4242 --executable /usr/local/bin/findscu \
--patientID 32124
# output
# {'status': 'success',
# 'command': '/usr/local/bin/findscu -xi -S
# -k InstanceNumber
# -k ModalitiesInStudy
# -k NumberOfSeriesRelatedInstances
# -k PatientBirthDate
# -k "PatientID=32124"
# -k PatientName
# -k PatientSex
# -k PerformedStationAETitle
# -k "QueryRetrieveLevel=SERIES"
# -k SeriesDate
# -k SeriesDescription
# -k SeriesInstanceUID
# -k StudyDate
# -k StudyDescription
# -k StudyInstanceUID
# -aec ORTHANC -aet CHIPS 127.0.0.1 4242',
# 'data': [lot of stuff if a match] # [] if no results
# }
# in yourscript.py
import pypx
pacs_settings = {
'executable': '/usr/local/bin/findscu',
'aec': 'ORTHANC',
'aet': 'CHIPS',
'server_ip': '127.0.0.1',
'server_port': '4242',
}
# query parameters
query_settings = {
'PatientID': 32124,
}
# python 3.5 ** syntax
output = pypx.find({**pacs_settings, **query_settings})
print(output)
# output
# {'status': 'success',
# 'command': '/usr/local/bin/findscu -xi -S
# -k InstanceNumber
# -k ModalitiesInStudy
# -k NumberOfSeriesRelatedInstances
# -k PatientBirthDate
# -k "PatientID=32124"
# -k PatientName
# -k PatientSex
# -k PerformedStationAETitle
# -k "QueryRetrieveLevel=SERIES"
# -k SeriesDate
# -k SeriesDescription
# -k SeriesInstanceUID
# -k StudyDate
# -k StudyDescription
# -k StudyInstanceUID
# -aec ORTHANC -aet CHIPS 127.0.0.1 4242',
# 'data': [lot of stuff if a match] # [] if no results
# }
px-move
is a wrapper around dcmtk movescu.
Move series given its SeriesUID. SeriesUID can be retrieved with px-find
.
It sends query keys to an SCP and awaits responses. The application can be used to test SCPs of the Query/Retrieve Service Class. The movescu application can initiate the transfer of images to a third party or can retrieve images to itself. -- DCMTK, about movescu.
px-move --help
# move data from Orthanc PACS server to AETL
# calling aet: CHIPS
# calling aet that will receive the data: CHIPS
# called aet: ORTHANC
# Orthanc PACS server IP: 127.0.0.1
# Orthanc PACS server port: 4242
# movescu executable: /usr/local/bin/movescu
px-move --aet CHIPS --aetl CHIPS --aec ORTHANC --serverIP 127.0.0.1 --serverPort 4242 --executable /usr/local/bin/movescu \
--seriesUID 1.3.12.2.1107.5.2.32.35235.2012041417312491079284166.0.0.0
# output
# {'status': 'success',
# 'command': '/usr/local/bin/movescu --move CHIPS --timeout 5
# -k QueryRetrieveLevel=SERIES
# -k SeriesInstanceUID=1.3.12.2.1107.5.2.32.35235.2012041417312491079284166.0.0.0
# -aec ORTHANC -aet CHIPS 127.0.0.1 4242',
# 'data': ''
# }
# in yourscript.py
import pypx
pacs_settings = {
'executable': '/usr/local/bin/findscu',
'aec': 'ORTHANC',
'aet': 'CHIPS',
'server_ip': '127.0.0.1',
'server_port': '4242',
}
# query parameters
query_settings = {
'SeriesInstanceUID': '1.3.12.2.1107.5.2.32.35235.2012041417312491079284166.0.0.0',
}
# python 3.5 ** syntax
output = pypx.move({**pacs_settings, **query_settings})
print(output)
# output
# {'status': 'success',
# 'command': '/usr/local/bin/movescu --move CHIPS --timeout 5
# -k QueryRetrieveLevel=SERIES
# -k SeriesInstanceUID=1.3.12.2.1107.5.2.32.35235.2012041417312491079284166.0.0.0
# -aec ORTHANC -aet CHIPS 127.0.0.1 4242',
# 'data': ''
# }
px-listen
is a wrapper around dcmtk storescp.
It should be connected to a daemon/service in order to act as a DICOM_Listener.
It listens on a specific TCP/IP port for incoming association requests from a Storage Service Class User (SCU). It can receive both DICOM images and other DICOM composite objects. -- DCMTK, about storescp.
px-listen --help
# receive DICOM data Orthanc PACS server
# tmp directory to store the data before ordering: /tmp
# log directory to log all incoming/processing data : /incoming/log
# data directory to store ordered data : /incoming/data
# storescp executable: /usr/local/bin/storescp
px-listen -t /tmp -l /incoming/log -d /incoming/data --executable /usr/local/bin/storescp
Uncomment first 2 imports in the binary command to test then run is a below.
python3 bin/px-find --aet CHIPS --aec CHIPS --serverIP 192.168.0.1 --serverPort 4242
- Author(s): darcymason
- Author(s): Dicom @ OFFIS Team