Skip to content

Find DICOMs

imgtools.dicom.find_dicoms

find_dicoms(
    directory: pathlib.Path,
    recursive: bool = True,
    check_header: bool = False,
    extension: str = "dcm",
    case_sensitive: bool = False,
    limit: int | None = None,
    search_input: typing.List[str] | None = None,
) -> typing.List[pathlib.Path]

Locate DICOM files in a specified directory.

This function scans a directory for files matching the specified extension and validates them as DICOM files based on the provided options. It supports recursive search and optional header validation to confirm file validity.

Parameters:

Name Type Description Default

directory

pathlib.Path

The directory in which to search for DICOM files.

required

recursive

bool

Whether to include subdirectories in the search

True

check_header

bool

Whether to validate files by checking for a valid DICOM header. - If True, perform DICOM header validation (slower but more accurate). - If False, skip header validation and rely on extension.

False

extension

str

File extension to search for (e.g., "dcm"). If None, consider all files regardless of extension.

"dcm"

case_sensitive

bool

Whether to perform a case-sensitive search for the file extension. If False, the search is case-insensitive.

False

limit

int

Maximum number of DICOM files to return. If None, return all found files.

None

search_input

typing.List[str]

List of terms to filter files by. Only files containing all terms in their paths will be included. If None, no filtering is applied.

None

Returns:

Type Description
typing.List[pathlib.Path]

A list of valid DICOM file paths found in the directory.

Notes
  • If check_header is enabled, the function checks each file for a valid DICOM header, which may slow down the search process.

Examples:

Setup

>>> from pathlib import Path
>>> from imgtools.dicom.dicom_find import find_dicoms

Find DICOM files recursively without header validation:

>>> find_dicoms(
...     Path("/data"),
...     recursive=True,
...     check_header=False,
... )
[PosixPath('/data/scan1.dcm'), PosixPath('/data/subdir/scan2.dcm'), PosixPath('/data/subdir/scan3.DCM')]

Suppose that scan3.DCM is not a valid DICOM file. Find DICOM files with header validation:

>>> find_dicoms(
...     Path("/data"),
...     recursive=True,
...     check_header=True,
... )
[PosixPath('/data/scan1.dcm'), PosixPath('/data/subdir/scan2.dcm')]

Find DICOM files without recursion:

>>> find_dicoms(
...     Path("/data"),
...     recursive=False,
...     check_header=False,
... )
[PosixPath('/data/scan1.dcm')]

Find DICOM files with a specific extension:

>>> find_dicoms(
...     Path("/data"),
...     recursive=True,
...     check_header=False,
...     extension="dcm",
... )
[PosixPath('/data/scan1.dcm'), PosixPath('/data/subdir/scan2.dcm')]

Find DICOM files with a search input (substring match):

>>> find_dicoms(
...     Path("/data"),
...     recursive=True,
...     check_header=False,
...     search_input=["1", "scan2"],
... )
[PosixPath('/data/scan1.dcm'), PosixPath('/data/subdir/scan2.dcm')]

Find DICOM files with a limit:

>>> find_dicoms(
...     Path("/data"),
...     recursive=True,
...     check_header=False,
...     limit=1,
... )
[PosixPath('/data/scan1.dcm')]

Find DICOM files with all options:

>>> find_dicoms(
...     Path("/data"),
...     recursive=True,
...     check_header=True,
...     extension="dcm",
...     limit=2,
...     search_input=["scan"],
... )
[PosixPath('/data/scan1.dcm'), PosixPath('/data/subdir/scan2.dcm')]
Source code in src/imgtools/dicom/dicom_find.py
def find_dicoms(
    directory: Path,
    recursive: bool = True,
    check_header: bool = False,
    extension: str = "dcm",
    case_sensitive: bool = False,
    limit: int | None = None,
    search_input: List[str] | None = None,
) -> List[Path]:
    """Locate DICOM files in a specified directory.

    This function scans a directory for files matching the specified extension
    and validates them as DICOM files based on the provided options. It supports
    recursive search and optional header validation to confirm file validity.

    Parameters
    ----------
    directory : Path
        The directory in which to search for DICOM files.
    recursive : bool
        Whether to include subdirectories in the search
    check_header : bool
        Whether to validate files by checking for a valid DICOM header.
            - If `True`, perform DICOM header validation (slower but more accurate).
            - If `False`, skip header validation and rely on extension.
    extension : str, default="dcm"
        File extension to search for (e.g., "dcm"). If `None`, consider all files
        regardless of extension.
    case_sensitive : bool, default=False
        Whether to perform a case-sensitive search for the file extension.
        If `False`, the search is case-insensitive.
    limit : int, optional
        Maximum number of DICOM files to return. If `None`, return all found files.
    search_input : List[str], optional
        List of terms to filter files by. Only files containing all terms
        in their paths will be included. If `None`, no filtering is applied.

    Returns
    -------
    List[Path]
        A list of valid DICOM file paths found in the directory.

    Notes
    -----
    - If `check_header` is enabled, the function checks each file for a valid
        DICOM header, which may slow down the search process.

    Examples
    --------
    Setup

    >>> from pathlib import Path
    >>> from imgtools.dicom.dicom_find import find_dicoms

    Find DICOM files recursively without header validation:

    >>> find_dicoms(
    ...     Path("/data"),
    ...     recursive=True,
    ...     check_header=False,
    ... )
    [PosixPath('/data/scan1.dcm'), PosixPath('/data/subdir/scan2.dcm'), \
PosixPath('/data/subdir/scan3.DCM')]

    Suppose that `scan3.DCM` is not a valid DICOM file. Find DICOM files with \
header validation:

    >>> find_dicoms(
    ...     Path("/data"),
    ...     recursive=True,
    ...     check_header=True,
    ... )
    [PosixPath('/data/scan1.dcm'), PosixPath('/data/subdir/scan2.dcm')]

    Find DICOM files without recursion:
    >>> find_dicoms(
    ...     Path("/data"),
    ...     recursive=False,
    ...     check_header=False,
    ... )
    [PosixPath('/data/scan1.dcm')]

    Find DICOM files with a specific extension:
    >>> find_dicoms(
    ...     Path("/data"),
    ...     recursive=True,
    ...     check_header=False,
    ...     extension="dcm",
    ... )
    [PosixPath('/data/scan1.dcm'), PosixPath('/data/subdir/scan2.dcm')]

    Find DICOM files with a search input (substring match):
    >>> find_dicoms(
    ...     Path("/data"),
    ...     recursive=True,
    ...     check_header=False,
    ...     search_input=["1", "scan2"],
    ... )
    [PosixPath('/data/scan1.dcm'), PosixPath('/data/subdir/scan2.dcm')]

    Find DICOM files with a limit:
    >>> find_dicoms(
    ...     Path("/data"),
    ...     recursive=True,
    ...     check_header=False,
    ...     limit=1,
    ... )
    [PosixPath('/data/scan1.dcm')]

    Find DICOM files with all options:
    >>> find_dicoms(
    ...     Path("/data"),
    ...     recursive=True,
    ...     check_header=True,
    ...     extension="dcm",
    ...     limit=2,
    ...     search_input=["scan"],
    ... )
    [PosixPath('/data/scan1.dcm'), PosixPath('/data/subdir/scan2.dcm')]
    """

    files = filter_valid_dicoms(
        directory,
        check_header,
        case_sensitive,
        search_input,
        extension or "",
        recursive,
    )

    return list(islice(files, limit)) if limit else list(files)