def test_get_num_positions_mm2gamma(setup_test_data,
                                    setup_mm2gamma_singlepage_tiffs):

    fold = setup_test_data
    _, _, rand_folder = setup_mm2gamma_singlepage_tiffs
    mmr = MicromanagerSequenceReader(rand_folder, extract_data=True)
    assert (mmr.get_num_positions() >= 1)
def test_get_array_mm2gamma(setup_test_data, setup_mm2gamma_singlepage_tiffs):

    fold = setup_test_data
    _, _, rand_folder = setup_mm2gamma_singlepage_tiffs
    mmr = MicromanagerSequenceReader(rand_folder, extract_data=True)
    for i in range(mmr.get_num_positions()):
        z = mmr.get_array(i)
        assert (z.shape == mmr.shape)
        assert (isinstance(z, np.ndarray))
def test_get_zarr_mm1422(setup_test_data, setup_mm1422_singlepage_tiffs):

    fold = setup_test_data
    _, _, rand_folder = setup_mm1422_singlepage_tiffs
    mmr = MicromanagerSequenceReader(rand_folder, extract_data=True)
    for i in range(mmr.get_num_positions()):
        z = mmr.get_zarr(i)
        assert (z.shape == mmr.shape)
        assert (isinstance(z, zarr.core.Array))
def test_output_dims_mm1422(setup_test_data, setup_mm1422_singlepage_tiffs):
    """
    test that output dimensions are always (t, c, z, y, x)
    """

    # choose a random folder
    fold = setup_test_data
    _, _, rand_folder = setup_mm1422_singlepage_tiffs
    mmr = MicromanagerSequenceReader(rand_folder, extract_data=False)

    assert (mmr.get_zarr(0).shape[0] == mmr.frames)
    assert (mmr.get_zarr(0).shape[1] == mmr.channels)
    assert (mmr.get_zarr(0).shape[2] == mmr.slices)
    assert (mmr.get_zarr(0).shape[3] == mmr.height)
    assert (mmr.get_zarr(0).shape[4] == mmr.width)
def test_output_dims_mm2gamma_incomplete(
        setup_test_data, setup_mm2gamma_singlepage_tiffs_incomplete):
    """
    test that output dimensions are correct for interrupted data
    """

    # choose a random folder
    fold = setup_test_data
    folder = setup_mm2gamma_singlepage_tiffs_incomplete
    mmr = MicromanagerSequenceReader(folder, extract_data=True)

    assert (mmr.get_zarr(0).shape[0] == mmr.frames)
    assert (mmr.get_zarr(0).shape[1] == mmr.channels)
    assert (mmr.get_zarr(0).shape[2] == mmr.slices)
    assert (mmr.get_zarr(0).shape[3] == mmr.height)
    assert (mmr.get_zarr(0).shape[4] == mmr.width)
    assert (mmr.get_zarr(0).shape[0] == 11)
def test_constructor_mm1422(setup_test_data, setup_mm1422_singlepage_tiffs):
    """
    test that constructor parses metadata properly
        no data extraction in this test
    """

    # choose a specific folder
    fold = setup_test_data
    _, one_folder, _ = setup_mm1422_singlepage_tiffs
    mmr = MicromanagerSequenceReader(one_folder, extract_data=False)

    assert (mmr.mm_meta is not None)
    assert (mmr.width is not 0)
    assert (mmr.height is not 0)
    assert (mmr.frames is not 0)
    assert (mmr.slices is not 0)
    assert (mmr.channels is not 0)
Beispiel #7
0
    def __init__(self,
                 src: str,
                 data_type: str = None,
                 extract_data: bool = False,
                 log_level: int = logging.ERROR):
        """
        reads data output from micro-manager and returns a zarr array or numpy array
        supports singlepage tiff sequences or ome-tiffs

        Parameters
        ----------
        src:            (str) folder or file containing all ome-tiff files or zarr root
        data_type:      (str) whether data is 'ometiff', 'singlepagetiff', or 'zarr'
        extract_data:   (bool) True if ome_series should be extracted immediately
        log_level:      (int) One of 0, 10, 20, 30, 40, 50 for NOTSET, DEBUG, INFO, WARNING, ERROR, CRITICAL respectively
        """

        logging.basicConfig(
            level=log_level,
            format=
            "[%(levelname)4s: %(module)s:%(lineno)4s %(asctime)s] %(message)s",
        )
        self.log = logging.getLogger(__name__)

        # catch if the user accidentally specifies one of the tiff files and not the parent folder
        if data_type == 'ometiff':
            if src.endswith('.tif'):
                src = os.path.dirname(src)

            if len(glob.glob(os.path.join(src, '*.tif'))) == 0:
                raise FileNotFoundError(
                    'Specified folder does not contain any ome.tif files')

        # Try to infer datatype
        if not data_type:
            try:
                zarr.open(src, 'r')
                data_type = 'zarr'
            except:
                if os.path.exists(src):
                    if src.endswith('.tif'):
                        src = os.path.dirname(src)

                    files = glob.glob(os.path.join(src, '*.tif'))
                    if len(files) == 0:

                        sub_dirs = self._get_sub_dirs(src)
                        if sub_dirs:
                            path = os.path.join(src, sub_dirs[0])
                            files = glob.glob(os.path.join(path, '*.tif'))
                            if len(files) == 0:
                                raise FileNotFoundError(
                                    f'No compatible data found under {src}')
                            else:
                                with tiff.TiffFile(os.path.join(
                                        path, files[0])) as tf:
                                    if len(tf.pages) == 1 and tf.pages[
                                            0].is_multipage.name == 'UNDEFINED':
                                        data_type = 'singlepagetiff'

                        else:
                            raise FileNotFoundError(
                                f'No compatible data found under {src}, please specify the top '
                                'level micromanager directory')
                    else:
                        with tiff.TiffFile(files[0]) as tf:
                            if len(tf.pages) > 1:
                                data_type = 'ometiff'
                            else:
                                if tf.pages[
                                        0].is_multipage == 0 and tf.is_ome == True:
                                    data_type = 'ometiff'
                                else:
                                    raise FileNotFoundError(
                                        f'No compatible data found under {src}'
                                    )
                else:
                    raise FileExistsError(f'{src} does not exist')

        # identify data structure type
        if data_type == 'ometiff':
            self.reader = MicromanagerOmeTiffReader(src, extract_data)
        elif data_type == 'singlepagetiff':
            self.reader = MicromanagerSequenceReader(src, extract_data)
        elif data_type == 'zarr':
            self.reader = ZarrReader(src)
        elif data_type == 'upti':
            self.reader = UPTIReader(src, extract_data)
        else:
            raise NotImplementedError(
                f"reader of type {data_type} is not implemented")