IBW Modules

For decoding and loading .ibw AFM file format into Python Numpy arrays.

load_ibw(file_path, channel)

Load image from Asylum Research (Igor) .ibw files.

Parameters:

Name Type Description Default
file_path Path | str

Path to the .ibw file.

required
channel str

The channel to extract from the .ibw file.

required

Returns:

Type Description
tuple[ndarray, float]

A tuple containing the image and its pixel to nanometre scaling value.

Raises:

Type Description
FileNotFoundError

If the file is not found.

ValueError

If the channel is not found in the .ibw file.

Examples:

Load the image and pixel to nanometre scaling factor - 'HeightTracee' is the default channel name (the extra 'e' is not a typo!).

>>> from AFMReader.ibw import load_ibw
>>> image, pixel_to_nanometre_scaling_factor = load_ibw(file_path="./my_ibw_file.ibw", channel="HeightTracee")
Source code in AFMReader/ibw.py
def load_ibw(file_path: Path | str, channel: str) -> tuple[np.ndarray, float]:
    """
    Load image from Asylum Research (Igor) .ibw files.

    Parameters
    ----------
    file_path : Path | str
        Path to the .ibw file.
    channel : str
        The channel to extract from the .ibw file.

    Returns
    -------
    tuple[np.ndarray, float]
        A tuple containing the image and its pixel to nanometre scaling value.

    Raises
    ------
    FileNotFoundError
        If the file is not found.
    ValueError
        If the channel is not found in the .ibw file.

    Examples
    --------
    Load the image and pixel to nanometre scaling factor - 'HeightTracee' is the default channel name (the extra 'e' is
    not a typo!).

    >>> from AFMReader.ibw import load_ibw
    >>> image, pixel_to_nanometre_scaling_factor = load_ibw(file_path="./my_ibw_file.ibw", channel="HeightTracee")
    """
    logger.info(f"Loading image from : {file_path}")
    file_path = Path(file_path)
    filename = file_path.stem
    try:
        scan = binarywave.load(file_path)
        logger.info(f"[{filename}] : Loaded image from : {file_path}")
        labels = []
        for label_list in scan["wave"]["labels"]:
            for label in label_list:
                if label:
                    labels.append(label.decode())
        channel_idx = labels.index(channel)
        image = scan["wave"]["wData"][:, :, channel_idx].T * 1e9  # Looks to be in m
        image = np.flipud(image)
        logger.info(f"[{filename}] : Extracted channel {channel}")
    except FileNotFoundError:
        logger.error(f"[{filename}] File not found : {file_path}")
    except ValueError:
        logger.error(f"[{filename}] : {channel} not in {file_path.suffix} channel list: {labels}")
        raise
    except Exception as e:
        logger.error(f"[{filename}] : {e}")
        raise e

    return (image, _ibw_pixel_to_nm_scaling(scan))