Source code for dicom_dre.default_catalog

"""Default device catalog data for DICOM filtering and pixel scrubbing.

Each device() entry combines a filter decision (allow/deny) with the pixel
scrub regions to blank for that device. Exclusion rules define the deny-list.
"""

from __future__ import annotations

from dicom_dre.catalog import DeviceCatalog
from dicom_dre.catalog import DeviceRule
from dicom_dre.catalog import ExclusionRule
from dicom_dre.catalog import deny_modalities
from dicom_dre.catalog import deny_when
from dicom_dre.catalog import device
from dicom_dre.catalog import variant


# Helper: SOP class prefixes used for US devices
_US_SOP_SINGLE = "1.2.840.10008.5.1.4.1.1.6"
_US_SOP_MULTI = "1.2.840.10008.5.1.4.1.1.3"
_US_SOP_SC = "1.2.840.10008.5.1.4.1.1.7"


# Device rules — allow-list

_cr_dx_devices: list[DeviceRule] = [
    # 1. KONICA 0402 CR -- SCRUBBED
    device(
        "KONICA 0402 CR",
        "allow",
        manufacturer="KONICA",
        modality="^CR",
        manufacturer_model_name="0402",
        variants=[
            variant(software_versions="^6.", rows=2446, cols=2446, scrub=[(0, 2308, 2446, 137)]),
            variant(software_versions="^2.", rows=2010, cols=2446, scrub=[(0, 0, 2446, 115)]),
        ],
    ),
    # 2. MedicaTechUSA KrystalRad 660 -- SCRUBBED
    device(
        "MedicaTechUSA KrystalRad 660",
        "allow",
        manufacturer="Medicatechusa",
        modality=["^CR", "^DX"],
        manufacturer_model_name="^KrystalRad 660",
        software_versions="^1.",
        scrub=[(0, 0, 10000, 70)],
    ),
    # 3. CANON/SHIMADZU AXIOM / CXDI -- SCRUBBED
    # Canon AXIOM V6 uses a different scrub height (115) than CXDI (104) per rule REG-XR02.
    device(
        "Canon AXIOM V6 CR",
        "allow",
        manufacturer="Canon",
        modality=["^CR", "^DX"],
        manufacturer_model_name="^AXIOM",
        software_versions="^V6",
        scrub=[(0, 0, 10000, 115)],
    ),
    device(
        "Shimadzu CXDI CR",
        "allow",
        manufacturer="^Shimadzu",
        modality=["^CR", "^DX"],
        manufacturer_model_name="^CXDI",
        software_versions="^2.",
        scrub=[(0, 0, 10000, 90)],
    ),
    device(
        "Canon/Shimadzu AXIOM/CXDI CR",
        "allow",
        manufacturer=["Shimadzu", "Canon"],
        modality=["^CR", "^DX"],
        manufacturer_model_name=["^AXIOM", "^CXDI"],
        software_versions=["^V6", "^V4", "^2."],
        scrub=[(0, 0, 10000, 104)],
    ),
    # 4. Cuattro CloudDR -- SCRUBBED
    device(
        "Cuattro CloudDR",
        "allow",
        manufacturer="^Cuattro",
        modality="^DX",
        manufacturer_model_name="^CloudDR",
        software_versions="^3.",
        rows=3072,
        cols=3072,
        scrub=[(2500, 0, 572, 400)],
    ),
    # 5. Medlink Imaging AltoDR -- SCRUBBED
    device(
        "Medlink Imaging AltoDR",
        "allow",
        manufacturer="^Medlink Imaging",
        modality="^DX",
        manufacturer_model_name="^AltoDR",
        software_versions="^1.",
        rows=2922,
        cols=1936,
        scrub=[(0, 0, 1936, 50)],
    ),
]


_ct_pet_devices: list[DeviceRule] = [
    # 6. GE CT+PET Discovery -- SCRUBBED
    device(
        "GE CT+PET Discovery",
        "allow",
        manufacturer=["^GE MEDICAL", "^GEMS"],
        modality=["=PT", "=OT", "=CT"],
        manufacturer_model_name="^Discovery",
        secondary_capture_device_manufacturer_model_name=["^Volume Viewer", "^Xeleris 4"],
        software_versions=["^5", "^4", "^pet_columbia"],
        variants=[
            variant(
                rows=512, cols=512, scrub=[(0, 0, 500, 80), (256, 0, 256, 22), (300, 22, 212, 80), (10, 478, 100, 10)]
            ),
            variant(
                rows=512, cols=256, scrub=[(0, 0, 500, 80), (256, 0, 256, 22), (300, 22, 212, 80), (10, 478, 100, 10)]
            ),
            variant(rows=256, cols=256, scrub=[(0, 0, 500, 80)]),
            variant(rows=1024, cols=1024, scrub=[(0, 0, 500, 80)]),
            variant(rows=1878, cols=835, scrub=[(0, 0, 500, 80)]),
            variant(rows=541, cols=328, scrub=[(0, 0, 500, 80)]),
        ],
    ),
    # 7. GE CT+PET SIGNA PET/MR - SIGNA_LX1.MP1
    device(
        "GE SIGNA PET/MR - MP1",
        "allow",
        manufacturer=["^GE MEDICAL", "^GEMS"],
        modality=["=PT", "=OT", "=CT"],
        manufacturer_model_name="^SIGNA PET/MR",
        secondary_capture_device_manufacturer_model_name="^Volume Viewer",
        software_versions="^SIGNA_LX1.MP1",
        rows=456,
        cols=456,
        scrub=[(0, 0, 456, 60), (300, 60, 456, 95), (0, 425, 456, 500)],
    ),
    # 8. GE CT+PET SIGNA PET/MR - SIGNA_LX1.MR30
    device(
        "GE SIGNA PET/MR - MR30",
        "allow",
        manufacturer=["^GE MEDICAL", "^GEMS"],
        modality=["=PT", "=OT", "=CT"],
        manufacturer_model_name="^SIGNA PET/MR",
        secondary_capture_device_manufacturer_model_name="^Volume Viewer",
        software_versions="SIGNA_LX1.MR30.1_R02_2332.a",
        rows=568,
        cols=568,
        scrub=[(0, 0, 568, 110)],
    ),
    # 9. GE CT REVOLUTION CT
    device(
        "GE REVOLUTION CT",
        "allow",
        manufacturer="=GE MEDICAL SYSTEMS",
        modality="=CT",
        manufacturer_model_name="=REVOLUTION CT",
        software_versions=["=REVO_CT_22BC.50", "=REVO_CT_21B.32"],
        rows=512,
        cols=512,
    ),
    # 10. GE CT DISCOVERY CT750 HD - ORIGINAL
    device(
        "GE DISCOVERY CT750 HD",
        "allow",
        manufacturer="=GE MEDICAL SYSTEMS",
        modality="=CT",
        manufacturer_model_name="=DISCOVERY CT750 HD",
        software_versions="=SLES_HDE.198",
        image_type="ORIGINAL",
        rows=512,
        cols=512,
    ),
    # 11. GE CT LIGHTSPEED VCT
    device(
        "GE LIGHTSPEED VCT",
        "allow",
        manufacturer="=GE MEDICAL SYSTEMS",
        modality="=CT",
        manufacturer_model_name="=LIGHTSPEED VCT",
        secondary_capture_device_manufacturer_model_name="=VOLUME VIEWER",
        software_versions="=CORELOAD.118",
        rows=512,
        cols=512,
    ),
    # 12. MIMvista standalone
    device(
        "MIMvista standalone",
        "allow",
        manufacturer="=MIMvista Corp",
        modality="=CT",
        software_versions="=",
        rows=512,
        cols=512,
    ),
    # 13. MIMvista + Manufacturer
    device(
        "MIMvista + Manufacturer",
        "allow",
        manufacturer="/ MIM",
        modality=["=CT", "=PT"],
        image_type="DERIVED\\PRIMARY",
        software_versions="=",
    ),
    # 14. Toshiba CT AQUILION - V6.06ER011
    device(
        "Toshiba AQUILION V6.06ER011",
        "allow",
        manufacturer="=TOSHIBA",
        modality="=CT",
        manufacturer_model_name="=AQUILION",
        software_versions="=V6.06ER011",
        image_type=["DERIVED", "MPR"],
        variants=[
            variant(rows=r, cols=c)
            for r, c in [
                (512, 512),
                (520, 520),
                (528, 528),
                (552, 552),
                (560, 560),
                (568, 568),
                (592, 592),
                (600, 600),
                (616, 616),
                (632, 632),
                (640, 640),
                (656, 656),
                (664, 664),
            ]
        ],
    ),
    # 15. NEUSOFT CT - NEUVIZ 16
    device(
        "NEUSOFT NEUVIZ 16",
        "allow",
        manufacturer="/(?i)^Neusoft$/",
        modality="=CT",
        secondary_capture_device_manufacturer_model_name="/(?i)^Neuviz 16$/",
        image_type=["SECONDARY", "DERIVED", "MPR"],
        image_type_exclude="DOSE_INFO",
        variants=[
            variant(rows=r, cols=c)
            for r, c in [
                (364, 512),
                (376, 512),
                (388, 512),
                (428, 512),
                (512, 512),
            ]
        ],
    ),
    # 16. CANON MEDICAL SYSTEMS CT - AQUILION ONE / Aquilion Prime SP
    device(
        "Canon AQUILION ONE/Prime SP",
        "allow",
        manufacturer="CANON MEDICAL SYSTEMS",
        modality="=CT",
        manufacturer_model_name=["AQUILION ONE", "Aquilion Prime SP"],
        software_versions="^V10",
        image_type=["DERIVED", "PRIMARY", "MPR"],
        rows=512,
        cols=512,
    ),
    # 17. Siemens CT - Biograph 6 / Somaris/5 3D / SOMATOM Definition AS / Emotion / Sensation
    device(
        "Siemens CT Biograph/Somaris/SOMATOM/Emotion/Sensation",
        "allow",
        manufacturer="^SIEMENS",
        modality=["=CT", "=PT"],
        image_type_exclude=["PROT", "SCREEN"],
        burned_in_annotation="/^(?!YES$)/",
        manufacturer_model_name=[
            "Biograph 6",
            "Somaris/5 3D",
            "SOMATOM Definition AS",
            "^Emotion",
            "Sensation",
        ],
    ),
    # 18. Siemens SOMATOM Definition Edge / AS+ / FORCE - VB20A
    device(
        "Siemens SOMATOM Edge/AS+/FORCE VB20A",
        "allow",
        manufacturer="^SIEMENS",
        modality="=CT",
        image_type="DERIVED",
        image_type_any=["CT_SOM5 MIP", "CT_SOM5 MPR"],
        manufacturer_model_name=[
            "SOMATOM Definition Edge",
            "SOMATOM DEFINITION AS+",
            "SOMATOM FORCE",
        ],
        software_versions="SYNGO CT VB20A",
    ),
    # 19. Siemens SOMATOM DEFINITION AS+ - VA48A
    device(
        "Siemens SOMATOM AS+ VA48A",
        "allow",
        manufacturer="^SIEMENS",
        modality="=CT",
        image_type="DERIVED",
        image_type_any=["CT_SOM5 MIP", "CT_SOM5 MPR"],
        manufacturer_model_name="SOMATOM DEFINITION AS+",
        software_versions="SYNGO CT VA48A",
    ),
    # 20. Siemens SOMATOM DEFINITION FLASH - VB20A
    device(
        "Siemens SOMATOM FLASH VB20A",
        "allow",
        manufacturer="^SIEMENS",
        modality="=CT",
        image_type="DERIVED",
        image_type_any=["CT_SOM5 MIP", "CT_SOM5 MPR"],
        manufacturer_model_name="SOMATOM DEFINITION FLASH",
        software_versions="syngo CT VB20A",
        secondary_capture_device_manufacturer_model_name=["Volume Viewer", "="],
    ),
    # 21. Siemens Healthineers SYNGO.VIA.VB30A
    device(
        "Siemens Healthineers VB30A",
        "allow",
        manufacturer="^Siemens Healthineers",
        modality="=CT",
        burned_in_annotation="/^(?!YES$)/",
        image_type="DERIVED",
        image_type_any=["MPR FUSION", "MPR THICK"],
        manufacturer_model_name="SYNGO.VIA.VB30A",
    ),
    # 22. Siemens Healthineers SYNGO.VIA.VB60A
    device(
        "Siemens Healthineers VB60A",
        "allow",
        manufacturer="^Siemens Healthineers",
        modality="=CT",
        image_type=["DERIVED", "AXIAL"],
        image_type_any=["CT_SOM8 DEOC", "MPR FUSION", "MPR THICK"],
        manufacturer_model_name="SYNGO.VIA.VB60A",
        software_versions="VB60A",
    ),
    # 23. Philips PT/CT fusion - Guardian
    device(
        "Philips Guardian PT/CT",
        "allow",
        manufacturer="^Philips",
        modality="=PT",
        manufacturer_model_name="^Guardian",
        secondary_capture_device_manufacturer_model_name="^EBW",
        software_versions="^9.3.1",
        variants=[
            variant(rows=839, cols=638, scrub=[(0, 0, 638, 80)]),
            variant(rows=918, cols=453, scrub=[(0, 0, 453, 100)]),
            variant(rows=918, cols=546, scrub=[(0, 0, 546, 100)]),
            variant(rows=907, cols=638, scrub=[(0, 0, 638, 110)]),
        ],
    ),
    # 23a. GE SIGNA PET/MR Static 3D MAC -- PT, DERIVED, SECONDARY, 192x192
    device(
        "GE SIGNA PET/MR Static 3D MAC PT",
        "allow",
        manufacturer="=GE MEDICAL SYSTEMS",
        modality="=PT",
        manufacturer_model_name="^SIGNA PET/MR",
        series_description="/(?i)^Static 3D MAC$/",
        image_type=["DERIVED", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
        rows=192,
        cols=192,
        study_description="/(?i)^PET/MR BRAIN METABOLISM$/",
    ),
]


_nm_devices: list[DeviceRule] = [
    # 24. Segami Mirage
    device(
        "Segami Mirage NM",
        "allow",
        manufacturer="=Segami",
        modality="=NM",
        manufacturer_model_name="=Mirage",
        variants=[
            variant(rows=192, cols=192),
            variant(rows=512, cols=512),
        ],
    ),
    # 25. GE MEDICAL SYSTEMS, NUCLEAR - Xeleris 4
    device(
        "GE Nuclear Xeleris 4 NM",
        "allow",
        manufacturer="^GE MEDICAL SYSTEMS, NUCLEAR",
        modality="=NM",
        secondary_capture_device_manufacturer_model_name="^Xeleris 4",
        variants=[
            variant(rows=541, cols=328, scrub=[(0, 0, 550, 50), (675, 505, 780, 535)]),
            variant(rows=552, cols=547, scrub=[(0, 0, 550, 50), (675, 505, 780, 535)]),
            variant(rows=540, cols=409, scrub=[(0, 0, 550, 50), (675, 505, 780, 535)]),
            variant(rows=1092, cols=409, scrub=[(0, 0, 550, 50), (675, 505, 780, 535)]),
            variant(rows=192, cols=128, scrub=[(0, 0, 550, 50), (675, 505, 780, 535)]),
            variant(rows=536, cols=328, scrub=[(0, 0, 550, 50), (675, 505, 780, 535)]),
            variant(rows=339, cols=328, scrub=[(0, 0, 550, 50), (675, 505, 780, 535)]),
        ],
    ),
    # 26. GE MEDICAL SYSTEMS, NUCLEAR - Stargate_StarGuide
    device(
        "GE Nuclear Stargate_StarGuide NM",
        "allow",
        manufacturer="^GE MEDICAL SYSTEMS, NUCLEAR",
        modality="=NM",
        manufacturer_model_name="=Stargate_StarGuide",
        rows=192,
        cols=128,
    ),
    # 27. GE MEDICAL SYSTEMS, NUCLEAR - Xeleris 5
    device(
        "GE Nuclear Xeleris 5 NM",
        "allow",
        manufacturer="^GE MEDICAL SYSTEMS, NUCLEAR",
        modality="=NM",
        secondary_capture_device_manufacturer_model_name="^Xeleris 5",
        variants=[
            variant(rows=536, cols=328, scrub=[(0, 0, 330, 50)]),
            variant(rows=339, cols=328, scrub=[(0, 0, 330, 50)]),
        ],
    ),
    # 28. Neurologica CereTom dose reports
    device(
        "Neurologica CereTom",
        "allow",
        manufacturer="=Neurologica",
        modality="=CT",
        manufacturer_model_name="=CereTom",
        image_type="=ORIGINAL\\PRIMARY\\DOSE",
        rows=512,
        cols=512,
    ),
]


_mammo_devices: list[DeviceRule] = [
    # 29. Mammography composite rule
    # Each manufacturer/model pair is a separate device entry for clarity.
    device(
        "Mammography CARESTREAM CLASSIC CR",
        "allow",
        manufacturer="=CARESTREAM",
        modality="=MG",
        manufacturer_model_name="=CLASSIC CR",
        image_type_exclude=["SCREEN"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography Hologic Selenia",
        "allow",
        manufacturer="Hologic",
        modality="=MG",
        manufacturer_model_name="Selenia",
        image_type_exclude=["SCREEN"],
        burned_in_annotation="/^(?!YES$)/",
        # Hologic Selenia allows SECONDARY
    ),
    device(
        "Mammography Lorad Selenia",
        "allow",
        manufacturer="Lorad",
        modality="=MG",
        manufacturer_model_name="Selenia",
        image_type_exclude=["SCREEN"],
        burned_in_annotation="/^(?!YES$)/",
        # Lorad Selenia allows SECONDARY
    ),
    device(
        "Mammography Lorad DSM",
        "allow",
        manufacturer="Lorad",
        modality="=MG",
        manufacturer_model_name="DSM",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography GE Senographe",
        "allow",
        manufacturer="^GE",
        modality="=MG",
        manufacturer_model_name="Senographe",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography GE ADS_",
        "allow",
        manufacturer="^GE",
        modality="=MG",
        manufacturer_model_name="ADS_",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography MPTronic Senographe",
        "allow",
        manufacturer="MPTronic",
        modality="=MG",
        manufacturer_model_name="Senographe",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography FUJI Clearview CSm",
        "allow",
        manufacturer="FUJI",
        modality="=MG",
        manufacturer_model_name="Clearview CSm",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography FUJI FDR",
        "allow",
        manufacturer="FUJI",
        modality="=MG",
        manufacturer_model_name="FDR",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography Fischer SenoScan",
        "allow",
        manufacturer="Fischer",
        modality="=MG",
        manufacturer_model_name="SenoScan",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography IMS GIOTTO",
        "allow",
        manufacturer="IMS",
        modality="=MG",
        manufacturer_model_name="GIOTTO",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography KODAK ELITE CR",
        "allow",
        manufacturer="KODAK",
        modality="=MG",
        manufacturer_model_name="=ELITE CR",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography KODAK CLASSIC CR",
        "allow",
        manufacturer="KODAK",
        modality="=MG",
        manufacturer_model_name="=CLASSIC CR",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography Philips L30",
        "allow",
        manufacturer="Philips",
        modality="=MG",
        manufacturer_model_name="=L30",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography SIEMENS Mammomat",
        "allow",
        manufacturer="SIEMENS",
        modality="=MG",
        manufacturer_model_name="Mammomat",
        image_type_exclude=["SCREEN", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
    ),
    device(
        "Mammography TMSC MGU-1000D",
        "allow",
        manufacturer="TMSC",
        modality="=MG",
        manufacturer_model_name="=MGU-1000D",
        image_type_exclude=["SCREEN"],
        burned_in_annotation="/^(?!YES$)/",
        # TMSC allows SECONDARY
    ),
]


_breast_mri_devices: list[DeviceRule] = [
    # 30. GE DISCOVERY DIXON
    device(
        "GE Breast MRI DISCOVERY DIXON",
        "allow",
        manufacturer="=GE MEDICAL SYSTEMS",
        modality="=MR",
        manufacturer_model_name="DISCOVERY",
        image_type="DERIVED\\PRIMARY\\DIXON\\WATER",
    ),
    # 30a. GE MR Ax T1 IR FSPGR - DERIVED SECONDARY, 512x512
    device(
        "GE MR Ax T1 IR FSPGR",
        "allow",
        manufacturer="=GE MEDICAL SYSTEMS",
        modality="=MR",
        manufacturer_model_name=[
            "/(?i)^SIGNA Architect$/",
            "/(?i)^SIGNA PET\\/MR$/",
            "/(?i)^SIGNA Premier$/",
            "/(?i)^DISCOVERY MR750$/",
            "/(?i)^SIGNA Explorer$/",
        ],
        series_description="Ax T1 IR FSPGR",
        image_type=["DERIVED", "SECONDARY"],
        burned_in_annotation="/^(?!YES$)/",
        rows=512,
        cols=512,
    ),
]


_us_devices: list[DeviceRule] = [
    # 31. ACUSON SEQUOIA
    device(
        "ACUSON SEQUOIA US",
        "allow",
        manufacturer="=ACUSON",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        image_type_exclude=["ORIGINAL\\PRIMARY\\\\0000", "DERIVED\\SECONDARY\\\\0000"],
        manufacturer_model_name="SEQUOIA",
        variants=[
            variant(rows=768, cols=1024, scrub=[(0, 0, 1024, 40)]),
            variant(rows=480, cols=640, scrub=[(0, 0, 640, 30), (553, 30, 87, 16)]),
            variant(rows=576, cols=768, scrub=[(0, 0, 768, 40), (672, 40, 96, 16)]),
            variant(rows=456, cols=576, scrub=[(0, 0, 576, 31), (493, 31, 83, 17)]),
        ],
    ),
    # 32. ACUSON Cypress
    device(
        "ACUSON Cypress US",
        "allow",
        manufacturer="/(?i)^ACUSON$/",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        image_type_exclude=["ORIGINAL\\PRIMARY\\\\0000", "DERIVED\\SECONDARY\\\\0000"],
        requires_ultrasound_regions=True,
        manufacturer_model_name="Cypress",
        rows=480,
        cols=640,
        scrub=[(0, 0, 640, 32), (560, 48, 80, 36)],
    ),
    # 33. Aloka Alpha series
    device(
        "Aloka Alpha/SSD-5500 US",
        "allow",
        manufacturer="Aloka",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name=[
            "SSD-ALPHA5",
            "SSD-ALPHA6",
            "SSD-ALPHA7",
            "SSD-ALPHA10",
            "SSD-5500",
        ],
        variants=[
            variant(rows=600, cols=800, scrub=[(0, 0, 800, 56)]),
            variant(rows=480, cols=640, scrub=[(0, 0, 640, 25)]),
            variant(rows=420, cols=608, scrub=[(0, 0, 608, 24)]),
            variant(rows=480, cols=686, scrub=[(0, 0, 686, 48)]),
        ],
    ),
    # 34. Aloka Noblus
    device(
        "Aloka Noblus US",
        "allow",
        manufacturer="Aloka",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name="Noblus",
        rows=600,
        cols=800,
        scrub=[(0, 0, 800, 48)],
    ),
    # 35. Aloka ProSound F75
    device(
        "Aloka ProSound F75 US",
        "allow",
        manufacturer="Aloka",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name="ProSound F75",
        variants=[
            variant(rows=480, cols=640, scrub=[(0, 0, 640, 40)]),
            variant(rows=768, cols=1024, scrub=[(0, 0, 1024, 56)]),
        ],
    ),
    # 36-38. B-K Medical
    device(
        "B-K Medical 2202 US",
        "allow",
        manufacturer=["=B-K Medical", "=BK Medical"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=2202",
        variants=[
            variant(rows=818, cols=1020, scrub=[(200, 0, 696, 56)]),
            variant(rows=480, cols=640, scrub=[(128, 0, 420, 32)]),
        ],
    ),
    device(
        "B-K Medical 1202 US",
        "allow",
        manufacturer=["=B-K Medical", "=BK Medical"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=1202",
        variants=[
            variant(rows=1072, cols=1024, scrub=[(0, 0, 1024, 147), (905, 168, 117, 730)]),
            variant(rows=780, cols=800),
        ],
    ),
    device(
        "B-K Medical 2300 US",
        "allow",
        manufacturer=["=B-K Medical", "=BK Medical"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=2300",
        variants=[
            variant(rows=1072, cols=1024, scrub=[(0, 0, 1024, 147), (905, 168, 117, 730)]),
            variant(rows=802, cols=992, scrub=[(888, 0, 104, 802)]),
        ],
    ),
    # 39. Philips US - iU22 / iE33
    device(
        "Philips iU22/iE33 US",
        "allow",
        manufacturer="Philips",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="INVALID",
        requires_ultrasound_regions=True,
        manufacturer_model_name=["=iU22", "=iE33"],
        variants=[
            variant(rows=768, cols=1024, scrub=[(0, 0, 1024, 72)]),
            variant(rows=600, cols=800, scrub=[(0, 0, 800, 56)]),
            variant(rows=480, cols=640, scrub=[(0, 0, 640, 47)]),
        ],
    ),
    # 40. Philips US - EPIQ / Affiniti
    device(
        "Philips EPIQ/Affiniti US",
        "allow",
        manufacturer="Philips",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="INVALID",
        requires_ultrasound_regions=True,
        manufacturer_model_name=["EPIQ", "Affiniti"],
        variants=[
            variant(rows=1080, cols=1920, scrub=[(0, 0, 1920, 32)]),
            variant(rows=768, cols=1024, scrub=[(0, 0, 1024, 24)]),
            variant(rows=600, cols=800, scrub=[(0, 0, 800, 16)]),
        ],
    ),
    # 41. Philips US - CX50 / CX30 / Sparq / HD15 / ClearVue 550
    device(
        "Philips CX50/CX30/Sparq/HD15/ClearVue US",
        "allow",
        manufacturer="Philips",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="INVALID",
        requires_ultrasound_regions=True,
        manufacturer_model_name=["=CX50", "=CX30", "=Sparq", "=HD15", "=ClearVue 550"],
        rows=600,
        cols=800,
        scrub=[(0, 0, 800, 56)],
    ),
    # 42. Philips US - Lumify / VT
    device(
        "Philips Lumify/VT US",
        "allow",
        manufacturer="Philips",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="INVALID",
        requires_ultrasound_regions=True,
        manufacturer_model_name=["=Lumify", "=VT"],
        rows=768,
        cols=1024,
    ),
    # 43. Toshiba US - A500 / A300 / A400 / TUS-X200 / SSH-880CV
    device(
        "Toshiba A-series/SSH-880CV US",
        "allow",
        manufacturer="Toshiba",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name=["A500", "A300", "A400", "TUS-X200", "SSH-880CV"],
        rows=720,
        cols=960,
        scrub=[(0, 0, 960, 60)],
    ),
    # 44. Toshiba US - AI700
    device(
        "Toshiba AI700 US",
        "allow",
        manufacturer="Toshiba",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="AI700",
        rows=960,
        cols=1280,
        scrub=[(0, 0, 1280, 72)],
    ),
    # 45. Toshiba US - Aplio / Xario
    device(
        "Toshiba Aplio/Xario US",
        "allow",
        manufacturer="Toshiba",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name=["Aplio", "Xario"],
        variants=[
            variant(rows=600, cols=800, scrub=[(0, 0, 800, 40)]),
            variant(rows=537, cols=716, scrub=[(0, 0, 716, 40)]),
        ],
    ),
    # 46. Toshiba US - Viamo
    device(
        "Toshiba Viamo US",
        "allow",
        manufacturer="Toshiba",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="Viamo",
        rows=600,
        cols=800,
        scrub=[(0, 0, 800, 56)],
    ),
    # 47. SonoSite US - Turbo / MicroMAXX / Nano / Edge II
    device(
        "SonoSite Turbo/MicroMAXX/Nano/Edge II US",
        "allow",
        manufacturer="SonoSite",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name=["Turbo", "MicroMAXX", "Nano", "Edge II"],
        rows=480,
        cols=640,
        scrub=[(0, 0, 640, 24)],
    ),
    # 47b. SonoSite US - Titan (no ultrasound regions requirement)
    device(
        "SonoSite Titan US",
        "allow",
        manufacturer="SonoSite",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="Titan",
        rows=480,
        cols=640,
        scrub=[(0, 0, 640, 24)],
    ),
    # 48. SonoSite US - X-Porte
    device(
        "SonoSite X-Porte US",
        "allow",
        manufacturer="SonoSite",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name="X-Porte",
        rows=720,
        cols=960,
        scrub=[(0, 0, 960, 32)],
    ),
    # 49. Zonare US - Z_ONE / ZS3
    device(
        "Zonare Z_ONE/ZS3 US",
        "allow",
        manufacturer="Zonare",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        image_type_exclude="PATIENTINFO",
        manufacturer_model_name=["Z_ONE", "ZS3"],
        variants=[
            variant(rows=480, cols=640, scrub=[(0, 0, 640, 40)]),
            variant(rows=600, cols=800, scrub=[(0, 0, 800, 40)]),
        ],
    ),
    # 50. SIEMENS US
    # 50a. S1000
    # Note: some S1000 images are mis-tagged with Modality=CT; the scrub rule omits the modality check.
    device(
        "Siemens S1000 US",
        "allow",
        manufacturer="SIEMENS",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="0000",
        manufacturer_model_name="=S1000",
        rows=768,
        cols=1024,
        scrub=[(0, 0, 1024, 56)],
    ),
    # 50b. S2000
    device(
        "Siemens S2000 US",
        "allow",
        manufacturer="SIEMENS",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="0000",
        manufacturer_model_name="=S2000",
        variants=[
            variant(rows=768, cols=1024, scrub=[(0, 0, 1024, 56)]),
            variant(rows=600, cols=800, scrub=[(0, 0, 800, 19), (0, 19, 160, 55)]),
            variant(rows=463, cols=707),
            variant(rows=183, cols=162),
        ],
    ),
    # 50c. S3000
    device(
        "Siemens S3000 US",
        "allow",
        manufacturer="SIEMENS",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="0000",
        manufacturer_model_name="=S3000",
        rows=768,
        cols=1024,
        scrub=[(0, 0, 1024, 56)],
    ),
    # 50d. Antares
    device(
        "Siemens Antares US",
        "allow",
        manufacturer="SIEMENS",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="0000",
        manufacturer_model_name="=Antares",
        variants=[
            variant(rows=768, cols=1024, scrub=[(0, 0, 1024, 56)]),
            # 600x800 scrub is restricted to single-frame SOP only
            variant(rows=600, cols=800, sop_class_uid=f"^{_US_SOP_SINGLE}", scrub=[(0, 0, 800, 19), (0, 19, 160, 55)]),
            variant(rows=600, cols=800, sop_class_uid=f"^{_US_SOP_MULTI}"),
            # 547x692 only validated for multi-frame; no scrub rule defined
            variant(rows=547, cols=692, sop_class_uid=f"^{_US_SOP_MULTI}"),
        ],
    ),
    # 50e. X150 / Acuson X300 / Acuson X700 / Acuson P500
    device(
        "Siemens X150/X300/X700/P500 US",
        "allow",
        manufacturer="SIEMENS",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude=["0000", "=ORIGINAL\\PRIMARY", "=DERIVED\\PRIMARY"],
        manufacturer_model_name=[
            "/(?i)^X150$/",
            "/(?i)^Acuson X300$/",
            "/(?i)^Acuson X700$/",
            "/(?i)^Acuson P500$/",
        ],
        variants=[
            variant(rows=600, cols=800, scrub=[(0, 0, 800, 40)]),
            variant(rows=768, cols=1024, scrub=[(0, 0, 1024, 56)]),
        ],
    ),
    # 50f. ACUSON SC2000
    device(
        "Siemens ACUSON SC2000 US",
        "allow",
        manufacturer="SIEMENS",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        image_type_exclude="0000",
        manufacturer_model_name="=ACUSON SC2000",
        rows=768,
        cols=1024,
        scrub=[(0, 0, 712, 40)],
    ),
    # 50g. ACUSON Freestyle
    device(
        "Siemens ACUSON Freestyle US",
        "allow",
        manufacturer="SIEMENS",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="0000",
        manufacturer_model_name="=ACUSON Freestyle",
        variants=[
            variant(rows=656, cols=800, scrub=[(0, 0, 800, 56)]),
            variant(rows=664, cols=800, scrub=[(0, 0, 800, 56)]),
        ],
    ),
    # 50h. ELEGRA
    device(
        "Siemens ELEGRA US",
        "allow",
        manufacturer="SIEMENS",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="0000",
        manufacturer_model_name="=ELEGRA",
        rows=666,
        cols=888,
        scrub=[(0, 0, 888, 48)],
    ),
    # 50i. G60 S / G50 S
    # Note: this rule requires PixelSpacing to be present to exclude screenshots.
    device(
        "Siemens G60 S/G50 S US",
        "allow",
        manufacturer="SIEMENS",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="0000",
        manufacturer_model_name=["=G60 S", "=G50 S"],
        pixel_spacing="/^.+$/",
        variants=[
            variant(rows=547, cols=692, scrub=[(0, 0, 692, 40)]),
            variant(rows=480, cols=640, scrub=[(0, 0, 640, 42)]),
        ],
    ),
    # 50j. G40
    device(
        "Siemens G40 US",
        "allow",
        manufacturer="SIEMENS",
        modality="US",
        sop_class_uid=[
            f"^{_US_SOP_SINGLE}",
            f"^{_US_SOP_MULTI}",
            f"^{_US_SOP_SC}",
        ],
        image_type_exclude="0000",
        manufacturer_model_name="=G40",
        rows=600,
        cols=800,
        scrub=[(0, 0, 800, 40)],
    ),
    # 51. SuperSonic Imagine - Aixplorer
    device(
        "SuperSonic Aixplorer US",
        "allow",
        manufacturer="SuperSonic",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name="=Aixplorer",
        variants=[
            variant(rows=1080, cols=1440, scrub=[(0, 0, 1440, 90)]),
            variant(rows=1050, cols=1400, scrub=[(0, 0, 1400, 90)]),
            variant(rows=930, cols=1240, scrub=[(0, 0, 1240, 70)]),
            variant(rows=900, cols=1200, scrub=[(0, 0, 1080, 64)]),
            variant(rows=894, cols=1192, scrub=[(0, 0, 1080, 64)]),
            variant(rows=819, cols=1092, scrub=[(0, 0, 980, 56)]),
            variant(rows=816, cols=1088, scrub=[(0, 0, 1088, 56)]),
            variant(rows=812, cols=1082, scrub=[(0, 0, 980, 56)]),
            variant(rows=810, cols=1080, scrub=[(0, 0, 1080, 70)]),
            variant(rows=788, cols=1050, scrub=[(0, 0, 1050, 70)]),
            variant(rows=782, cols=1042, scrub=[(0, 0, 1042, 56)]),
            variant(rows=776, cols=1035, scrub=[(0, 0, 900, 56)]),
            variant(rows=638, cols=851, scrub=[(0, 0, 851, 48)]),
            variant(rows=525, cols=700, scrub=[(0, 0, 700, 48)]),
        ],
    ),
    # 52. Samsung/Medison
    # 52a. RS80A
    device(
        "Samsung RS80A US",
        "allow",
        manufacturer="MEDISON",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name="=RS80A",
        variants=[
            variant(rows=872, cols=1280, scrub=[(0, 0, 1280, 72)]),
            variant(rows=872, cols=1152, scrub=[(0, 0, 1152, 72)]),
        ],
    ),
    # 52b. ACCUVIX
    device(
        "Samsung ACCUVIX US",
        "allow",
        manufacturer="MEDISON",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name="=ACCUVIX",
        rows=480,
        cols=640,
        scrub=[(0, 0, 640, 40)],
    ),
    # 52c. H60
    device(
        "Samsung H60 US",
        "allow",
        manufacturer="MEDISON",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name="=H60",
        rows=720,
        cols=960,
        scrub=[(0, 0, 960, 64)],
    ),
    # 52d. Accuvix V10 / V20 / XG
    device(
        "Samsung Accuvix V10/V20/XG US",
        "allow",
        manufacturer="MEDISON",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name=["=Accuvix V10", "=Accuvix V20", "=Accuvix XG"],
        rows=768,
        cols=1024,
        scrub=[(0, 0, 1024, 56)],
    ),
    # 52e. SonoAce R7 / X8
    device(
        "Samsung SonoAce R7/X8 US",
        "allow",
        manufacturer="MEDISON",
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        requires_ultrasound_regions=True,
        manufacturer_model_name=["=SonoAce R7", "=SonoAce X8"],
        rows=768,
        cols=1024,
        scrub=[(0, 0, 1024, 56)],
    ),
    # 53. GE US
    # 53a. Invenia
    device(
        "GE Invenia US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Invenia",
        rows=482,
        cols=841,
    ),
    # 53a2. Invenia ABUS 2.0 -- Automated Breast Ultrasound System
    device(
        "GE Invenia ABUS 2.0 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="/(?i)^Invenia ABUS 2\\.0$/",
        image_type=["ORIGINAL", "PRIMARY"],
        rows=546,
        cols=843,
        body_part_examined="/(?i)^BREAST$/",
    ),
    # 53b. Vivide
    device(
        "GE Vivide US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Vivide",
        rows=614,
        cols=820,
        scrub=[(0, 0, 568, 55)],
    ),
    # 53c. Vivid i
    device(
        "GE Vivid i US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Vivid i",
        variants=[
            variant(rows=422, cols=636, scrub=[(0, 0, 220, 25)]),
            variant(rows=434, cols=636, scrub=[(0, 0, 280, 24)]),
        ],
    ),
    # 53d. Vivid S5
    device(
        "GE Vivid S5 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Vivid S5",
        rows=422,
        cols=636,
        scrub=[(0, 0, 220, 25)],
    ),
    # 53e. Vivid S6
    device(
        "GE Vivid S6 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Vivid S6",
        variants=[
            variant(rows=422, cols=636, scrub=[(0, 0, 220, 25)]),
            variant(rows=434, cols=636, scrub=[(0, 0, 280, 24)]),
        ],
    ),
    # 53f. Vivid7
    device(
        "GE Vivid7 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Vivid7",
        variants=[
            variant(rows=434, cols=636, scrub=[(0, 0, 280, 24)]),
            variant(rows=434, cols=640),
            variant(rows=484, cols=636, scrub=[(0, 0, 584, 48)]),
        ],
    ),
    # 53g. Vivid E9
    device(
        "GE Vivid E9 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Vivid E9",
        variants=[
            variant(rows=759, cols=1020, scrub=[(0, 0, 800, 48)]),
            variant(rows=434, cols=636, scrub=[(0, 0, 280, 24)]),
            variant(rows=484, cols=636, scrub=[(0, 0, 584, 48)]),
            variant(rows=709, cols=1020),
        ],
    ),
    # 53h. Vivid E95
    device(
        "GE Vivid E95 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Vivid E95",
        rows=708,
        cols=1016,
        scrub=[(0, 0, 400, 56)],
    ),
    # 53i. Vivid 3
    device(
        "GE Vivid 3 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Vivid 3",
        variants=[
            variant(rows=480, cols=640, scrub=[(0, 0, 392, 32)]),
            variant(rows=434, cols=636, scrub=[(0, 0, 280, 24)]),
        ],
    ),
    # 53j. Voluson P
    device(
        "GE Voluson P US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Voluson P",
        rows=600,
        cols=800,
        scrub=[(0, 0, 800, 56)],
    ),
    # 53k. Voluson S
    device(
        "GE Voluson S US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Voluson S",
        rows=743,
        cols=975,
        scrub=[(0, 0, 975, 72)],
    ),
    # 53l. Voluson E8
    device(
        "GE Voluson E8 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Voluson E8",
        rows=852,
        cols=1136,
        scrub=[(0, 0, 1136, 64)],
    ),
    # 53m. Vivid q
    device(
        "GE Vivid q US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=Vivid q",
        variants=[
            variant(rows=422, cols=636, scrub=[(0, 0, 220, 25)]),
            variant(rows=434, cols=636, scrub=[(0, 0, 280, 24)]),
        ],
    ),
    # 53n. LOGIQworksE9
    device(
        "GE LOGIQworksE9 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQworksE9",
        rows=434,
        cols=532,
    ),
    # 53o. LOGIQe
    device(
        "GE LOGIQe US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQe",
        variants=[
            variant(rows=434, cols=532),
            variant(rows=590, cols=819, scrub=[(0, 0, 570, 55)]),
            variant(rows=614, cols=820, scrub=[(0, 0, 570, 55)]),
        ],
    ),
    # 53p. LOGIQi
    device(
        "GE LOGIQi US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQi",
        variants=[
            variant(rows=434, cols=532),
            variant(rows=600, cols=800, scrub=[(0, 0, 554, 57)]),
        ],
    ),
    # 53q. LOGIQE9
    device(
        "GE LOGIQE9 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        image_type_exclude="DERIVED\\PRIMARY\\\\0000",
        manufacturer_model_name="=LOGIQE9",
        variants=[
            variant(rows=970, cols=1552, scrub=[(0, 0, 1174, 68)]),
            variant(rows=873, cols=1552, scrub=[(0, 0, 1196, 68)]),
            variant(rows=899, cols=1442, scrub=[(0, 0, 1000, 32)]),
            variant(rows=819, cols=1456, scrub=[(0, 0, 1122, 70)]),
            variant(rows=802, cols=1442, scrub=[(0, 0, 1000, 32)]),
            variant(rows=748, cols=1346, scrub=[(0, 0, 1000, 24)]),
            variant(rows=768, cols=1280, scrub=[(0, 0, 826, 92)]),
            variant(rows=720, cols=1280, scrub=[(0, 0, 968, 70)]),
            variant(rows=649, cols=1170, scrub=[(0, 0, 880, 24)]),
            variant(rows=873, cols=1164, scrub=[(0, 0, 808, 70)]),
            variant(rows=819, cols=1092, scrub=[(0, 0, 758, 68)]),
            variant(rows=802, cols=1054, scrub=[(0, 0, 700, 30)]),
            variant(rows=748, cols=982, scrub=[(0, 0, 670, 28)]),
            variant(rows=720, cols=960, scrub=[(0, 0, 666, 68)]),
            variant(rows=519, cols=936),
            variant(rows=697, cols=914),
            variant(rows=649, cols=852, scrub=[(0, 0, 595, 26)]),
            variant(rows=649, cols=850, scrub=[(0, 0, 595, 26)]),
            variant(rows=614, cols=820, scrub=[(0, 0, 568, 55)]),
            variant(rows=421, cols=760),
            variant(rows=519, cols=680),
            variant(rows=421, cols=552),
        ],
    ),
    # 53r. LOGIQ S6 (or LOGIQ7 with LOGIQ S6 software)
    device(
        "GE LOGIQ S6 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name=["=LOGIQ S6"],
        variants=[
            variant(rows=434, cols=532),
            variant(rows=768, cols=1024, scrub=[(0, 0, 712, 67)]),
        ],
    ),
    # 53s. LOGIQS7
    device(
        "GE LOGIQS7 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQS7",
        variants=[
            variant(rows=421, cols=552),
            variant(rows=649, cols=850, scrub=[(0, 0, 592, 26)]),
            variant(rows=720, cols=960, scrub=[(0, 0, 666, 68)]),
            variant(rows=720, cols=1280, scrub=[(0, 0, 968, 70)]),
        ],
    ),
    # 53t. LOGIQS8
    device(
        "GE LOGIQS8 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQS8",
        variants=[
            variant(rows=421, cols=552),
            variant(rows=600, cols=600),
            variant(rows=649, cols=850, scrub=[(0, 0, 584, 20)]),
            variant(rows=720, cols=960, scrub=[(0, 0, 666, 68)]),
            variant(rows=819, cols=1092, scrub=[(0, 0, 758, 68)]),
            variant(rows=802, cols=1054, scrub=[(0, 0, 754, 26)]),
            variant(rows=873, cols=1164, scrub=[(0, 0, 808, 70)]),
            variant(rows=649, cols=1170, scrub=[(0, 0, 880, 24)]),
            variant(rows=720, cols=1280, scrub=[(0, 0, 968, 70)]),
            variant(rows=748, cols=1346, scrub=[(0, 0, 1000, 24)]),
            variant(rows=802, cols=1442, scrub=[(0, 0, 1000, 32)]),
            variant(rows=819, cols=1456, scrub=[(0, 0, 1122, 70)]),
            variant(rows=873, cols=1552, scrub=[(0, 0, 1195, 68)]),
            variant(rows=970, cols=1552, scrub=[(0, 0, 1174, 68)]),
        ],
    ),
    # 53u. LOGIQP5
    device(
        "GE LOGIQP5 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQP5",
        variants=[
            variant(rows=434, cols=532),
            variant(rows=614, cols=816, scrub=[(0, 0, 566, 60)]),
        ],
    ),
    # 53v. LOGIQP6
    device(
        "GE LOGIQP6 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQP6",
        variants=[
            variant(rows=434, cols=532),
            variant(rows=614, cols=816, scrub=[(0, 0, 566, 60)]),
        ],
    ),
    # 53w. LOGIQP9
    device(
        "GE LOGIQP9 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQP9",
        variants=[
            variant(rows=856, cols=1142, scrub=[(0, 0, 794, 68)]),
            variant(rows=912, cols=1216),
        ],
    ),
    # 53x. LOGIQ 400
    device(
        "GE LOGIQ 400 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQ 400",
        rows=462,
        cols=608,
        scrub=[(0, 0, 608, 31)],
    ),
    # 53y. LOGIQ5
    device(
        "GE LOGIQ5 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQ5",
        rows=480,
        cols=640,
        scrub=[(0, 0, 444, 44)],
    ),
    # 53z. LOGIQ 700
    device(
        "GE LOGIQ 700 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQ 700",
        rows=480,
        cols=640,
        scrub=[(0, 0, 640, 41)],
    ),
    # 53aa. LOGIQ7
    device(
        "GE LOGIQ7 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQ7",
        variants=[
            variant(rows=434, cols=532),
            variant(rows=480, cols=640, scrub=[(0, 0, 444, 44)]),
            variant(rows=768, cols=1024, scrub=[(0, 0, 712, 70)]),
        ],
    ),
    # 53ab. LOGIQ9
    device(
        "GE LOGIQ9 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQ9",
        variants=[
            variant(rows=434, cols=532),
            variant(rows=480, cols=640, scrub=[(0, 0, 444, 44)]),
            variant(rows=697, cols=854),
            variant(rows=697, cols=856),
            variant(rows=600, cols=800, scrub=[(0, 0, 605, 44)]),
            variant(rows=768, cols=1024, scrub=[(0, 0, 712, 67)]),
        ],
    ),
    # 53ac. LOGIQBook
    device(
        "GE LOGIQBook US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=LOGIQBook",
        rows=434,
        cols=532,
    ),
    # 53ad. V830
    device(
        "GE V830 US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=V830",
        variants=[
            variant(rows=480, cols=640, scrub=[(0, 0, 640, 48)]),
            variant(rows=600, cols=800, scrub=[(0, 0, 800, 56)]),
            variant(rows=650, cols=868, scrub=[(0, 0, 868, 48)]),
            variant(rows=662, cols=930, scrub=[(0, 0, 930, 64)]),
            variant(rows=720, cols=960, scrub=[(0, 0, 960, 56)]),
            variant(rows=735, cols=960, scrub=[(0, 0, 960, 72)]),
            variant(rows=735, cols=975, scrub=[(0, 0, 975, 72)]),
            variant(rows=743, cols=975, scrub=[(0, 0, 975, 72)]),
            variant(rows=682, cols=1134, scrub=[(0, 0, 1134, 56)]),
            variant(rows=852, cols=1136, scrub=[(0, 0, 1136, 64)]),
        ],
    ),
    # 53ae. EchoPAC PC
    device(
        "GE EchoPAC PC US",
        "allow",
        manufacturer=["^GE", "^G.E.", "^GEMS"],
        modality="US",
        sop_class_uid=[f"^{_US_SOP_SINGLE}", f"^{_US_SOP_MULTI}"],
        manufacturer_model_name="=EchoPAC PC",
        variants=[
            variant(rows=434, cols=636),
            variant(rows=850, cols=1081),
        ],
    ),
]


_scrub_only_devices: list[DeviceRule] = [
    # CT Dose scrub rules -- these are scrub-only entries
    device(
        "CT Dose IEC Body Dosimetry Phantom",
        "scrub",
        code_meaning="IEC Body Dosimetry Phantom",
        scrub=[(0, 0, 512, 200)],
    ),
    device(
        "GE CT Dose Report",
        "scrub",
        modality="CT",
        manufacturer="GE MEDICAL",
        series_description="Dose Report",
        image_type_exclude="SCREEN SAVE",
        scrub=[(0, 0, 512, 110)],
    ),
    device(
        "GE DLP Dose",
        "scrub",
        manufacturer="GE MEDICAL",
        comments_on_radiation_dose="DLP",
        image_type_exclude="SCREEN SAVE",
        scrub=[(0, 0, 512, 110)],
    ),
    device(
        "GE AW Workstation",
        "scrub",
        manufacturer="GE MEDICAL",
        burned_in_annotation="YES",
        series_description="AW electronic film",
        scrub=[(0, 0, 512, 80)],
    ),
    device(
        "GE AVA Report",
        "scrub",
        manufacturer="GE MEDICAL",
        burned_in_annotation="YES",
        series_description="AVA Report",
        rows=512,
        scrub=[(0, 0, 200, 250)],
    ),
    device(
        "Volume Rendering VOLREN",
        "scrub",
        image_type="VOLREN",
        rows=512,
        cols=512,
        scrub=[(350, 0, 162, 30), (390, 80, 122, 15)],
    ),
    device(
        "GE 1024 Screen Capture",
        "scrub",
        manufacturer="GE MEDICAL",
        burned_in_annotation="YES",
        rows=1024,
        scrub=[(0, 0, 300, 150), (724, 0, 300, 150)],
    ),
    device(
        "VITREA Stent Planning",
        "scrub",
        manufacturer="VITAL Images",
        series_description=["AAA", "Report"],
        rows=1041,
        scrub=[(0, 0, 795, 150)],
    ),
    device(
        "Siemens CT Dose Secondary",
        "scrub",
        modality="CT",
        manufacturer="SIEMENS",
        image_type="SECONDARY",
        rows=860,
        scrub=[(0, 0, 1132, 60)],
    ),
    device(
        "Philips CT Dose",
        "scrub",
        manufacturer="PHILIPS",
        image_type="DOSE",
        sop_class_uid="/^(?!1.2.840.10008.5.1.4.1.1.7$)/",
        scrub=[(0, 0, 512, 135)],
    ),
    device(
        "Toshiba Aquilion One CT Dose",
        "scrub",
        modality="=CT",
        manufacturer="TOSHIBA",
        manufacturer_model_name="Aquilion ONE",
        image_type="SECONDARY",
        rows=512,
        cols=512,
        scrub=[(0, 0, 410, 240)],
    ),
    # NM scrub rules
    device(
        "Siemens NM Secondary",
        "scrub",
        modality="NM",
        manufacturer="SIEMENS",
        image_type="SECONDARY",
        rows=860,
        scrub=[(0, 0, 1132, 82), (0, 780, 1132, 80)],
    ),
    # Other scrub rules
    device(
        "ADAC NM",
        "scrub",
        manufacturer="ADAC",
        rows=832,
        cols=1024,
        sop_class_uid="/^(?!1.2.840.10008.5.1.4.1.1.7$)/",
        scrub=[(0, 0, 1024, 60), (0, 762, 1024, 80)],
    ),
    device(
        "MEDRAD Injection Profile",
        "scrub",
        series_description="MEDRAD",
        rows=1077,
        cols=750,
        scrub=[(0, 0, 750, 230)],
    ),
    # Canon CXDI additional scrub (different from CR entry)
    device(
        "Canon CXDI 2592 scrub",
        "scrub",
        manufacturer="Canon",
        manufacturer_model_name="CXDI",
        rows=2592,
        scrub=[(0, 0, 2208, 80), (0, 2512, 2208, 80)],
    ),
]


# Exclusion rules — deny-list

default_exclusions: list[ExclusionRule] = [
    # Deny 1: Unsupported modalities (substring match)
    deny_modalities(
        substring=["MG", "MA", "RF", "US", "XA"],
    ),
    # Deny 2: Unsupported modalities (exact match)
    deny_modalities(
        exact=[
            "AN",
            "AS",
            "BD",
            "BM",
            "BMA",
            "BMD",
            "CF",
            "CV",
            "DE",
            "DEXA",
            "DF",
            "DG",
            "DMA",
            "DOC",
            "EC",
            "ECG",
            "ES",
            "FILM_CT",
            "FL",
            "HC",
            "HD",
            "IO",
            "IR",
            "PN",
            "RAW",
            "REPORT",
            "REQUEST",
            "RG",
            "RTDOSE",
            "RTIMAGE",
            "RTPLAN",
            "RTSTRUCT",
            "SC",
            "SD",
            "SPL",
            "SR",
            "ST",
            "TG",
            "UNQ",
            "XD",
        ],
    ),
    # Deny 3: Encapsulated PDF
    deny_when(
        "Encapsulated PDF",
        sop_class="=1.2.840.10008.5.1.4.1.1.104.1",
    ),
    # Deny 4: the DiCOM box
    deny_when(
        "the DiCOM box",
        manufacturer_model_name="the DiCOM box",
    ),
    # Deny 5: Vidar film scanners
    deny_when(
        "Vidar film scanner (manufacturer)",
        manufacturer="vidar",
    ),
    deny_when(
        "Vidar film scanner (model)",
        manufacturer_model_name="vidar",
    ),
    # Deny 6: iCAD mammo scanners
    deny_when(
        "iCAD mammo scanner",
        manufacturer="icad",
    ),
    # Deny 7: Presentation state and SR SOP classes.
    # Admit Modality PR instances that are 2D softcopy presentation states
    # carrying a Graphic Annotation Sequence; deny volumetric/unknown PR classes
    # and admitted-class instances that carry no annotation. Admit Key Object
    # Selection (KO, .88.59) that references at least one instance; deny the rest
    # of the SR family and deny reference-free KO.
    deny_when(
        "unsupported presentation state",
        modality="=PR",
        sop_class_not=[
            "=1.2.840.10008.5.1.4.1.1.11.1",
            "=1.2.840.10008.5.1.4.1.1.11.2",
            "=1.2.840.10008.5.1.4.1.1.11.3",
            "=1.2.840.10008.5.1.4.1.1.11.4",
            "=1.2.840.10008.5.1.4.1.1.11.5",
            "=1.2.840.10008.5.1.4.1.1.11.12",
        ],
    ),
    deny_when(
        "no annotation data",
        modality="=PR",
        graphic_annotation_absent=True,
    ),
    deny_when(
        "unsupported structured report",
        sop_class="^1.2.840.10008.5.1.4.1.1.8",
        sop_class_not=["=1.2.840.10008.5.1.4.1.1.88.59"],
    ),
    deny_when(
        "no referenced instances",
        sop_class="=1.2.840.10008.5.1.4.1.1.88.59",
        referenced_instance_absent=True,
    ),
    # Deny 8: INFINITT PACS with high series number
    deny_when(
        "INFINITT PACS high series number",
        manufacturer="INFINITT",
        series_number="/[1-9]\\d{3,}/",
    ),
    # Deny 9: Biopsy/pathology vendors
    deny_when(
        "Bioptics manufacturer",
        manufacturer="Bioptics",
    ),
    deny_when(
        "Biovision model",
        manufacturer_model_name="Biovision",
    ),
    deny_when(
        "Faxitron manufacturer",
        manufacturer="Faxitron",
    ),
    deny_when(
        "KUBTEC manufacturer",
        manufacturer="KUBTEC",
    ),
    deny_when(
        "Hologic Trident",
        manufacturer="Hologic",
        manufacturer_model_name="Trident",
    ),
    # Deny 10: Secondary Capture SOP Class
    deny_when(
        "Secondary Capture SOP",
        sop_class="1.2.840.10008.5.1.4.1.1.7",
    ),
    # Deny 11: Empty ImageType (GSPS presentation states have no ImageType).
    deny_when(
        "Empty ImageType",
        image_type_empty=True,
        modality_not=["=PR", "=KO"],
    ),
    # Deny 12: BurnedInAnnotation YES
    deny_when(
        "BurnedInAnnotation YES",
        burned_in_annotation="=YES",
    ),
    # Deny 13: DERIVED/SECONDARY/ConversionType for non-CR/DR/DX
    deny_when(
        "Non-CR/DR/DX with ConversionType",
        modality_not=["=CR", "=DR", "=DX"],
        conversion_type_present=True,
    ),
    deny_when(
        "Non-CR/DR/DX/MR DERIVED",
        modality_not=["=CR", "=DR", "=DX", "=MR"],
        image_type_any="DERIVED",
    ),
    deny_when(
        "MR DERIVED without PRIMARY",
        modality="=MR",
        image_type_any="DERIVED",
        image_type_exclude="DERIVED\\PRIMARY",
    ),
    deny_when(
        "MR MRSC",
        modality="=MR",
        image_type_any="MRSC",
    ),
    deny_when(
        "Non-CR/DR/DX SECONDARY",
        modality_not=["=CR", "=DR", "=DX"],
        image_type_any="SECONDARY",
    ),
]


# Combined device list and factory

default_devices: list[DeviceRule] = (
    _cr_dx_devices
    + _ct_pet_devices
    + _nm_devices
    + _mammo_devices
    + _breast_mri_devices
    + _us_devices
    + _scrub_only_devices
)


[docs] def get_default_catalog() -> DeviceCatalog: """Return the default device catalog with all translated rules.""" return DeviceCatalog( devices=default_devices, exclusions=default_exclusions, default_action="allow", )