pacs-workflow

star 2

Query PACS, retrieve studies, manage worklists, and integrate with PACS workflows. Also use when the user needs to interact with picture archiving systems, search for imaging studies, retrieve DICOM data, or manage radiologist worklists. For DICOMweb REST queries, see dicom-web-query.

aizech By aizech schedule Updated 4/21/2026

name: pacs-workflow description: Query PACS, retrieve studies, manage worklists, and integrate with PACS workflows. Also use when the user needs to interact with picture archiving systems, search for imaging studies, retrieve DICOM data, or manage radiologist worklists. For DICOMweb REST queries, see dicom-web-query.

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")
Install via CLI
npx skills add https://github.com/aizech/clinical-skills --skill pacs-workflow
Repository Details
star Stars 2
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator