Source code for pycartool.rois.regions_of_interest
# -*- coding: utf-8 -*-
# Authors: Victor Férat <victor.ferat@live.fr>
#
# License: BSD (3-clause)
from ..spi.source_space import SourceSpace
from ..utils._logs import logger, verbose
@verbose
def read_roi(filename, source_space=None, verbose=None):
"""Read Cartool region of interest (.rois) files.
Parameters
----------
filename : str or file-like
The Regions Of Interest (.roi) file to read.
source_space : pycartool.spi.SourceSpace
The SourceSpace corresponding to the regions of interest.
%(verbose)s
Returns
-------
regions_of_interest : pycartool.rois.RegionsOfInterest
The regions of interest.
Note
-------
Indices are broadcast to 0 based as expected in Python. In file, indices
are saved starting from 1 as expected in Cartool.
"""
with open(filename) as f:
Roi_type = f.readline().strip()
if Roi_type != "RO01":
raise ValueError(f"{Roi_type} format not supported")
logger.info(Roi_type)
n_orig = int(f.readline().strip())
logger.info(f"Dimension_of_original_data: {n_orig}")
n_roi = int(f.readline().strip())
logger.info(f"Number of ROI: {n_roi}")
rois_name = []
rois_elements = []
for _ in range(0, n_roi):
roi_name = f.readline().strip()
roi_elem = f.readline().split(" ")[:-1]
# Use python 0base indices instead of Cartool 1 based indices
roi_elem = [int(elem) - 1 for elem in roi_elem]
rois_name.append(roi_name)
rois_elements.append(roi_elem)
if source_space is not None:
if n_orig != source_space.n_sources:
raise ValueError(
f"Dimension of original data for roi file data is"
f" {n_orig}, but source space contains "
f"{source_space.n_sources} sources."
)
regions_of_interest = RegionsOfInterest(
rois_name, rois_elements, source_space=source_space, filename=filename
)
return regions_of_interest
def _check_groups_of_indexes(groups_of_indexes):
if not isinstance(groups_of_indexes, list):
raise TypeError(f"groups_of_indexes must be a list of list")
for e, elem in enumerate(groups_of_indexes):
if not isinstance(elem, list):
raise TypeError(
f"groups_of_indexes must be a list of list but"
f" the {e} element is a {type(elem)}"
)
def _compute_number_of_sources(groups_of_indexes):
groups_of_indexes_max = [max(elem) for elem in groups_of_indexes]
maximum = max(groups_of_indexes_max)
return maximum
[docs]class RegionsOfInterest(object):
"""Container for regions of interest.
Parameters
----------
names : :obj:`list` of :obj:`str`
The regions of interest names.
groups_of_indexes : :obj:`list` of :obj:`list` of :obj:`int`
The sources indices belonging to each region of interest.
source_space : pycartool.spi.SourceSpace
The source space associated to the regions of interest.
filename : str or file-like
The Regions Of Interest file (``.roi``) from which
the data has been extracted.
Attributes
----------
names : :obj:`list` of :obj:`str`
The regions of interest names.
groups_of_indexes : :obj:`list` of :obj:`list` of :obj:`int`
The sources indices belonging to each region of interest.
source_space : pycartool.spi.SourceSpace
The source space associated to the regions of interest.
filename : str or file-like
The Regions Of Interest file (``.roi``) from which
the data has been extracted.
"""
def __init__(
self, names, groups_of_indexes, source_space=None, filename=None
):
_check_groups_of_indexes(groups_of_indexes)
maximum = _compute_number_of_sources(groups_of_indexes)
# Check that groups_of_indexes correspond to source space.
if source_space is not None:
if not isinstance(source_space, SourceSpace):
raise TypeError(
f"sourcespace must be an instance" f" of SourceSpace."
)
if source_space.n_sources < maximum:
raise ValueError(
f"Indice {maximum} found in groups_of_indexes"
f" but SourceSpace contains only"
f" {source_space.n_sources} sources."
)
self.names = names
self.groups_of_indexes = groups_of_indexes
self.source_space = source_space
self.filename = filename
def __repr__(self): # noqa: D401
"""String representation."""
s = f"{len(self.names)} Rois"
if self.filename is not None:
s += f", filename : {self.filename}"
return f"<RegionsOfInterest or {s}>"