Source code for magicctapipe.image.leakage

"""
Leakage utilities (MARS-like)
"""
import numpy as np
from ctapipe.containers import LeakageContainer

__all__ = [
    "get_leakage",
]

border_cache = dict()


def get_border_masks_mars(geom):
    """
    Get a mask for pixels at the border of the camera
    for width 1 and 2 using MARS definition.

    Parameters
    ----------
    geom : ctapipe.instrument.CameraGeometry
        Camera geometry information.

    Returns
    -------
    tuple
        Tuple with the two masks.
    """

    if geom.camera_name in border_cache:
        if 1 in border_cache[geom.camera_name] and 2 in border_cache[geom.camera_name]:
            return border_cache[geom.camera_name][1], border_cache[geom.camera_name][2]

    neighbors = geom.neighbor_matrix_sparse

    # find pixels in the outermost ring
    outermostring = [pix for pix in range(geom.n_pixels) if neighbors[pix].getnnz() < 5]

    # find pixels in the second outermost ring
    outerring = []
    for pix in range(geom.n_pixels):
        if pix in outermostring:
            continue
        for neigh in np.where(neighbors[pix][0, :].toarray() == True)[1]:
            if neigh in outermostring:
                outerring.append(pix)

    # needed because outerring has some pixels appearing more than once
    outerring = np.unique(outerring).tolist()
    outermostring_mask = np.zeros(geom.n_pixels, dtype=bool)
    outermostring_mask[outermostring] = True
    outerring_mask = np.zeros(geom.n_pixels, dtype=bool)
    outerring_mask[outerring] = True

    border_cache[geom.camera_name] = {
        1: outermostring_mask,
        2: outerring_mask,
    }

    return outermostring_mask, outerring_mask


[docs] def get_leakage(geom, event_image, clean_mask): """Calculate the leakage as done in MARS. Parameters ---------- geom : ctapipe.instrument.CameraGeometry Camera geometry information. event_image : np.ndarray Event image. clean_mask : np.ndarray Cleaning mask. Returns ------- ctapipe.containers.LeakageContainer Container with leakage value. """ outermostring_mask, outerring_mask = get_border_masks_mars(geom) # intersection between 1st outermost ring and cleaning mask mask1 = np.array(outermostring_mask) & clean_mask # intersection between 2nd outermost ring and cleaning mask mask2 = np.array(outerring_mask) & clean_mask leakage_pixel1 = np.count_nonzero(mask1) leakage_pixel2 = np.count_nonzero(mask2) leakage_intensity1 = np.sum(event_image[mask1]) leakage_intensity2 = np.sum(event_image[mask2]) size = np.sum(event_image[clean_mask]) return LeakageContainer( pixels_width_1=leakage_pixel1 / geom.n_pixels, pixels_width_2=leakage_pixel2 / geom.n_pixels, intensity_width_1=leakage_intensity1 / size, intensity_width_2=leakage_intensity2 / size, )