DICOM MCP Server
by ChristianHinge
Verified
"""
DICOM attribute presets for different query levels.
"""
from typing import Dict, List, Optional
# Dictionary of attribute presets for each query level
ATTRIBUTE_PRESETS = {
# Minimal attribute set - just essential identifiers
"minimal": {
"patient": [
"PatientID",
"PatientName",
],
"study": [
"StudyInstanceUID",
"PatientID",
"StudyDate",
"StudyDescription",
],
"series": [
"SeriesInstanceUID",
"StudyInstanceUID",
"Modality",
"SeriesNumber",
],
"instance": [
"SOPInstanceUID",
"SeriesInstanceUID",
"InstanceNumber",
],
},
# Standard attribute set - common clinical attributes
"standard": {
"patient": [
"PatientID",
"PatientName",
"PatientBirthDate",
"PatientSex",
"PatientAge",
],
"study": [
"StudyInstanceUID",
"PatientID",
"StudyDate",
"StudyTime",
"StudyDescription",
"AccessionNumber",
"ReferringPhysicianName",
"StudyID",
"NumberOfStudyRelatedSeries",
"NumberOfStudyRelatedInstances",
],
"series": [
"SeriesInstanceUID",
"StudyInstanceUID",
"Modality",
"SeriesNumber",
"SeriesDescription",
"BodyPartExamined",
"PatientPosition",
"NumberOfSeriesRelatedInstances",
],
"instance": [
"SOPInstanceUID",
"SeriesInstanceUID",
"SOPClassUID",
"InstanceNumber",
"ContentDate",
"ContentTime",
"ImageType",
"NumberOfFrames",
],
},
# Extended attribute set - comprehensive information
"extended": {
"patient": [
"PatientID",
"PatientName",
"PatientBirthDate",
"PatientSex",
"PatientAge",
"PatientWeight",
"PatientAddress",
"PatientComments",
"IssuerOfPatientID",
"EthnicGroup",
],
"study": [
"StudyInstanceUID",
"PatientID",
"StudyDate",
"StudyTime",
"StudyDescription",
"AccessionNumber",
"ReferringPhysicianName",
"StudyID",
"ProcedureCodeSequence",
"NumberOfStudyRelatedSeries",
"NumberOfStudyRelatedInstances",
"StudyComments",
"AdmissionID",
"ModalitiesInStudy",
"RequestingPhysician",
"RequestedProcedureDescription",
],
"series": [
"SeriesInstanceUID",
"StudyInstanceUID",
"Modality",
"SeriesNumber",
"SeriesDescription",
"BodyPartExamined",
"PatientPosition",
"NumberOfSeriesRelatedInstances",
"SeriesDate",
"SeriesTime",
"PerformingPhysicianName",
"ProtocolName",
"OperatorsName",
"PerformedProcedureStepDescription",
"AnatomicalOrientationType",
"InstitutionName",
],
"instance": [
"SOPInstanceUID",
"SeriesInstanceUID",
"SOPClassUID",
"InstanceNumber",
"ContentDate",
"ContentTime",
"ImageType",
"AcquisitionDate",
"AcquisitionTime",
"ImageComments",
"NumberOfFrames",
"BurnedInAnnotation",
"WindowCenter",
"WindowWidth",
"ImagePositionPatient",
"ImageOrientationPatient",
"SliceLocation",
"PixelSpacing",
"PhotometricInterpretation",
"BitsAllocated",
"BitsStored",
],
},
}
def get_attributes_for_level(
level: str,
preset: str = "standard",
additional_attrs: Optional[List[str]] = None,
exclude_attrs: Optional[List[str]] = None
) -> List[str]:
"""Get the list of attributes for a specific query level and preset.
Args:
level: Query level (patient, study, series, instance)
preset: Attribute preset name (minimal, standard, extended)
additional_attrs: Additional attributes to include
exclude_attrs: Attributes to exclude
Returns:
List of DICOM attribute names
"""
# Start with the preset attributes
if preset in ATTRIBUTE_PRESETS and level in ATTRIBUTE_PRESETS[preset]:
attr_list = ATTRIBUTE_PRESETS[preset][level].copy()
elif preset in ATTRIBUTE_PRESETS and level not in ATTRIBUTE_PRESETS[preset]:
# If preset exists but doesn't have this level, fall back to standard
attr_list = ATTRIBUTE_PRESETS["standard"][level].copy()
else:
# If preset doesn't exist, fall back to standard
attr_list = ATTRIBUTE_PRESETS["standard"][level].copy()
# Add additional attributes
if additional_attrs:
for attr in additional_attrs:
if attr not in attr_list:
attr_list.append(attr)
# Remove excluded attributes
if exclude_attrs:
attr_list = [attr for attr in attr_list if attr not in exclude_attrs]
return attr_list