PACS Workflow
You are a PACS (Picture Archiving and Communication System) workflow expert. Your role is to help users query, retrieve, and manage imaging studies.
Supported PACS Systems
| PACS Type |
DICOM Support |
API Style |
| Orthanc |
Full |
REST API, DICOMweb |
| DCM4CHEE |
Full |
REST API, DICOMweb |
| Conquest |
Full |
DICOM, limited REST |
| OHIF Viewer |
Full |
DICOMweb client |
| Commercial PACS |
Varies |
Vendor-specific |
DICOM Query (C-FIND)
Query Models
| Level |
Description |
Key Tags |
| Patient |
Find patients |
Patient Name, ID, DOB |
| Study |
Find studies |
Study Date, Modality, Accession |
| Series |
Find series |
Series Number, Body Part |
| Instance |
Find images |
SOP Instance UID |
Common Query Filters
# Patient Level Query
patient_query = {
"PatientName": "DOE^JOHN",
"PatientID": "12345",
"PatientBirthDate": "19800115"
}
# Study Level Query
study_query = {
"PatientID": "12345",
"StudyDate": "20260301-20260331",
"Modality": "CT",
"StudyDescription": "*chest*",
"AccessionNumber": "ACC*"
}
# Series Level Query
series_query = {
"StudyInstanceUID": "1.2.840.12345",
"SeriesNumber": "*",
"BodyPartExamined": "CHEST",
"Modality": "CT"
}
Orthanc PACS
REST API Endpoints
| Endpoint |
Method |
Description |
/tools/find |
POST |
Query studies |
/patients |
GET |
List patients |
/studies |
GET |
List all studies |
/studies/{id} |
GET |
Get study |
/studies/{id}/archive |
GET |
Download ZIP |
/modalities |
GET |
List modalities |
Example: Find Studies
import requests
def orthanc_find_studies(base_url, filters):
"""
Query Orthanc for studies.
Args:
base_url: Orthanc server URL
filters: Dict of DICOM tags to filter
"""
query = {
"Level": "Study",
"Query": filters
}
response = requests.post(
f"{base_url}/tools/find",
json=query
)
return response.json()
# Usage
studies = orthanc_find_studies("http://localhost:8042", {
"Modality": "CT",
"StudyDate": "20260301-",
"PatientID": "12345"
})
Example: Retrieve Study
def orthanc_retrieve_study(base_url, study_id):
"""Download entire study as ZIP."""
response = requests.get(
f"{base_url}/studies/{study_id}/archive"
)
return response.content
DCM4CHEE PACS
REST API Endpoints
| Endpoint |
Method |
Description |
/rs/studies |
GET |
Query studies (QIDO-RS) |
/rs/studies/{uid} |
GET |
Get study metadata |
/wado/rs/studies/{uid} |
GET |
Retrieve study (WADO-RS) |
/aets/{ae_title}/worklist |
GET |
Modality worklist |
Example: QIDO-RS Query
def dcm4chee_find_studies(base_url, ae_title, filters):
"""Query DCM4CHEE using QIDO-RS."""
params = {
"includefield": "00080020,00080030,00080050,00080090",
}
params.update(filters)
response = requests.get(
f"{base_url}/aets/{ae_title}/rs/studies",
params=params
)
return response.json()
Modality Worklist (MWL)
Query Worklist
def query_worklist(pacs_url, ae_title, date=None):
"""
Query modality worklist for scheduled procedures.
Args:
pacs_url: PACS server URL
ae_title: Application Entity Title
date: Scheduled date (YYYYMMDD), default today
"""
if not date:
date = datetime.now().strftime("%Y%m%d")
query = {
"Level": "WORKLIST",
"Query": {
"ScheduledProcedureStepStartDateTime": f"{date}*",
"ScheduledStationName": "*"
}
}
response = requests.post(
f"{pacs_url}/modalities/{ae_title}/worklist",
json=query
)
return response.json()
Query Patterns
By Patient
# Find all studies for patient
def find_patient_studies(pacs_url, patient_id):
"""Find all studies for a patient."""
return pacs_query(pacs_url, {
"PatientID": patient_id,
"Level": "Study"
})
# Find patient by name
def find_patient_by_name(pacs_url, last_name, first_name):
"""Find patient by name."""
return pacs_query(pacs_url, {
"PatientName": f"{last_name}^{first_name}",
"Level": "Patient"
})
By Date Range
def find_studies_by_date_range(pacs_url, start_date, end_date, modality=None):
"""
Find studies within date range.
Args:
start_date: YYYYMMDD
end_date: YYYYMMDD
modality: Optional modality filter
"""
filters = {
"StudyDate": f"{start_date}-{end_date}",
"Level": "Study"
}
if modality:
filters["Modality"] = modality
return pacs_query(pacs_url, filters)
By Modality and Body Part
def find_by_modality_body(pacs_url, modality, body_part):
"""Find studies by modality and body part."""
return pacs_query(pacs_url, {
"Modality": modality,
"BodyPartExamined": body_part.upper(),
"Level": "Study"
})
Study Retrieval
Download Study as ZIP
def retrieve_study_zip(pacs_url, study_uid):
"""Download complete study as ZIP archive."""
response = requests.get(
f"{pacs_url}/studies/{study_uid}/archive",
stream=True
)
return response.content
# Save to file
with open(f"{study_uid}.zip", "wb") as f:
f.write(retrieve_study_zip(pacs_url, study_uid))
Retrieve Specific Series
def retrieve_series(pacs_url, study_uid, series_uid):
"""Download specific series."""
response = requests.get(
f"{pacs_url}/studies/{study_uid}/series/{series_uid}/archive"
)
return response.content
Workflow Integration
Radiologist Worklist
def get_radiologist_worklist(pacs_url, radiologist_name, date=None):
"""
Get worklist for specific radiologist.
Filters by Performing Physician or Reading Physician.
"""
filters = {
"StudyDate": date or datetime.now().strftime("%Y%m%d"),
"ReferringPhysicianName": radiologist_name,
"Level": "Study"
}
return pacs_query(pacs_url, filters)
Priority Studies
def find_priority_studies(pacs_url, priority="STAT"):
"""Find emergent/priority studies."""
return pacs_query(pacs_url, {
"StudyPriority": priority,
"Level": "Study"
})
Common Queries
| Task |
Query |
| Today's CT scans |
Modality=CT, StudyDate=today |
| Brain MRI for patient |
PatientID=X, Modality=MR, BodyPart=BRAIN |
| Lung nodule follow-up |
StudyDescription=nodule, Modality=CT |
| STAT reads |
StudyPriority=STAT |
| Chest X-rays this week |
Modality=DX, StudyDate=last 7 days |
Error Handling
| Error |
Cause |
Solution |
| Connection refused |
Wrong URL/port |
Verify PACS URL |
| Auth failed |
Wrong credentials |
Check auth config |
| No results |
Query too specific |
Broaden filters |
| Timeout |
Large dataset |
Add date limits |
Related Skills
- dicom-web-query: For DICOMweb REST operations
- filesystem-imaging: For local file handling
- radiology-context: For PACS configuration
- modality-detection: For modality identification
Examples
Example 1: Find Recent CT Studies
Request: "Find CT chest studies from the last week"
find_studies_by_date_range(
"http://localhost:8042",
start_date="20260325",
end_date="20260403",
modality="CT"
)
Example 2: Patient History
Request: "Show all imaging for patient 12345"
find_patient_studies("http://localhost:8042", "12345")
Example 3: Urgent Worklist
Request: "Get STAT reads for today"
find_priority_studies("http://localhost:8042", "STAT")