UCLH-Foundry / PIXL

PIXL Image eXtraction Laboratory
Apache License 2.0
8 stars 0 forks source link

Make our anonymisation DICOM standard-compliant #418

Open milanmlft opened 1 week ago

milanmlft commented 1 week ago

Definition of Done / Acceptance Criteria

Anonymising a DICOM dataset using pixl_dcmd.anonymise_dicom() should pass the validation checks as implemented in pixl_dcmd._dicom_helpers.DicomValidator.

Testing

At a minimum, the following tests should pass:

# pixl_dcmd/tests/test_main.py

from pixl_dcmd.main import anonymise_and_validate_dicom

def test_anonymisation_and_validation(vanilla_dicom_image: Dataset, caplog) -> None:
    """
    Test whether anonymisation and validation works as expected on a vanilla DICOM dataset
    No warnings should be generated for a valid anonymisation
    """
    caplog.clear()
    caplog.set_level(logging.WARNING)
    validation_errors = anonymise_and_validate_dicom(vanilla_dicom_image)
    # Check no warnings were generated
    assert "WARNING" not in [record.levelname for record in caplog.records]
    assert not validation_errors
# pixl_dcmd/tests/test_dicom_validation.py

from pixl_dcmd._dicom_helpers import DicomValidator
from pixl_dcmd.main import anonymise_dicom

def test_validation_after_anonymisation_works(vanilla_dicom_image: Dataset) -> None:
    """
    GIVEN a DICOM dataset
    WHEN the dataset is validated after anonymisation
    THEN no errors should be raised
    """
    validator = DicomValidator()
    validator.validate_original(vanilla_dicom_image)
    anonymise_dicom(vanilla_dicom_image)
    assert not validator.validate_anonymised(vanilla_dicom_image)

Documentation

No response

Dependencies

Details and Comments

DICOM validation is added in #414 but this made apparent that our anonymisation results in non-compliant DICOM. Some common errors that were observed are the following:

{
    'Frame of Reference': {'Tag (0020,1040) (Position Reference Indicator) is missing': [...]}, 
    'General Series': {"Tag (0018,5100) (Patient Position) is missing due to condition:\n  ...1.1.4.3" or "1.2.840.10008.5.1.4.1.1.4.2"\''}, 
    'General Study': {
        'Tag (0008,0020) (Study Date) is missing': [...], 
        'Tag (0008,0030) (Study Time) is missing': [...], 
        "Tag (0008,0090) (Referring Physician's Name) is missing": [...]
    }, 
    'Image Plane': {
        'Tag (0018,0050) (Slice Thickness) is missing': [...], 
        'Tag (0020,0032) (Image Position (Patient)) is missing': [...], 
        'Tag (0020,0037) (Image Orientation (Patient)) is missing': [...]
        }, 
    'MR Image': {
        'Tag (0018,0020) (Scanning Sequence) is missing': [...], 
        'Tag (0018,0021) (Sequence Variant) is missing': [...], 
        'Tag (0018,0022) (Scan Options) is missing': [...], 
        'Tag (0018,0023) (MR Acquisition Type) is missing': [...], 
        'Tag (0018,0081) (Echo Time) is missing': [...], 
        'Tag (0018,0091) (Echo Train Length) is missing': [...]
    }, 
    'Patient': {
        "Tag (0010,0030) (Patient's Birth Date) is missing": [...], 
        "Tag (0010,0040) (Patient's Sex) is missing": [...]
    }
}