def test_multipage_tiff(self): from jicbioimage.core.image import MicroscopyCollection, ImageCollection from jicbioimage.core.io import DataManager, FileBackend backend = FileBackend(directory=TMP_DIR) data_manager = DataManager(backend) data_manager.load(os.path.join(DATA_DIR, 'multipage.tif')) image_collection = data_manager[0] # When we load a multipage tiff file we get an ImageCollection not a # MicroscopyCollection. self.assertFalse(isinstance(image_collection, MicroscopyCollection)) self.assertTrue(isinstance(image_collection, ImageCollection)) # Let us get the first proxy image. first_proxy_image = image_collection.proxy_image() self.assertTrue(os.path.isfile(first_proxy_image.fpath)) # Let us get the last proxy image. last_proxy_image = image_collection.proxy_image(index=-1) self.assertTrue(os.path.isfile(last_proxy_image.fpath)) # Let us get some actual images. first_image = image_collection.image() self.assertEqual(np.max(first_image), 30) second_image = image_collection.image(1) self.assertEqual(np.max(second_image), 90) third_image = image_collection.image(index=2) self.assertEqual(np.max(third_image), 120)
def test_error_message_when_bfconvert_not_in_path(self): from jicbioimage.core.io import DataManager, FileBackend backend = FileBackend(TMP_DIR) data_manager = DataManager(backend) tmp_path = os.environ['PATH'] del os.environ['PATH'] with self.assertRaises(RuntimeError): data_manager.load(os.path.join(DATA_DIR, 'single-channel.ome.tif')) os.environ['PATH'] = tmp_path
def test_proxy_image(self): from jicbioimage.core.io import DataManager, FileBackend backend = FileBackend(TMP_DIR) data_manager = DataManager(backend) data_manager.load(os.path.join(DATA_DIR, 'single-channel.ome.tif')) microscopy_collection = data_manager[0] proxy_image = microscopy_collection.proxy_image() self.assertTrue(os.path.isfile(proxy_image.fpath), 'no such file: {}'.format(proxy_image.fpath)) self.assertTrue(isinstance(proxy_image.image, np.ndarray)) self.assertEqual(proxy_image.image.shape, (167, 439))
def test_data_manager_already_unpacked(self): # The second time the data manager is loaded, it should contain data # without unpacking. from jicbioimage.core.io import DataManager, FileBackend backend = FileBackend(TMP_DIR) data_manager = DataManager(backend) data_manager.load(os.path.join(DATA_DIR, 'single-channel.ome.tif')) self.assertEqual(len(data_manager), 1) backend_reload = FileBackend(TMP_DIR) data_manager_reload = DataManager(backend) data_manager_reload.load(os.path.join(DATA_DIR, 'single-channel.ome.tif')) self.assertEqual(len(data_manager_reload), 1)
def test_BZ1(self): """ If the file backend creates a directory into which to unpack TIFFs, but then fails for some reason (e.g. bfconvert is not in the path), it has created a directory, but not a manifest. At this point, re-running the unpack fails because the directory already exists, and: os.mkdir(self.directory) throws an error. """ from jicbioimage.core.io import DataManager, FileBackend backend = FileBackend(directory=TMP_DIR) data_manager = DataManager(backend=backend) fname = 'single-channel.ome.tif' # The directory already exists. os.mkdir(os.path.join(TMP_DIR, fname)) # The below throws if the bug is present. data_manager.load(os.path.join(DATA_DIR, fname))
def test_image_collection(self): from jicbioimage.core.image import Image3D from jicbioimage.core.io import DataManager, FileBackend backend = FileBackend(TMP_DIR) data_manager = DataManager(backend) data_manager.load(os.path.join(DATA_DIR, 'multi-channel-4D-series.ome.tif')) microscopy_collection = data_manager[0] self.assertEqual(len(microscopy_collection), 7*5*3) # 7t, 5z, 3c proxy_image = microscopy_collection.proxy_image() self.assertEqual(proxy_image.series, 0) self.assertEqual(proxy_image.channel, 0) self.assertEqual(proxy_image.zslice, 0) self.assertEqual(proxy_image.timepoint, 0) proxy_image = microscopy_collection.proxy_image(s=0, c=1, z=2, t=3) self.assertEqual(proxy_image.series, 0) self.assertEqual(proxy_image.channel, 1) self.assertEqual(proxy_image.zslice, 2) self.assertEqual(proxy_image.timepoint, 3) self.assertEqual(5, len([i for i in microscopy_collection.zstack_proxy_iterator()])) for i, proxy_image in enumerate(microscopy_collection.zstack_proxy_iterator()): self.assertEqual(proxy_image.series, 0) self.assertEqual(proxy_image.channel, 0) self.assertEqual(proxy_image.zslice, i) self.assertEqual(proxy_image.timepoint, 0) self.assertEqual(5, len([i for i in microscopy_collection.zstack_proxy_iterator(s=0, c=1, t=3)])) for i, proxy_image in enumerate(microscopy_collection.zstack_proxy_iterator(s=0, c=1, t=3)): self.assertEqual(proxy_image.series, 0) self.assertEqual(proxy_image.channel, 1) self.assertEqual(proxy_image.zslice, i) self.assertEqual(proxy_image.timepoint, 3) zstack = microscopy_collection.zstack(s=0, c=1, t=3) self.assertTrue(isinstance(zstack, Image3D)) self.assertEqual(zstack.shape, (167, 439, 5)) image = microscopy_collection.image(s=0, c=1, z=2, t=3) self.assertTrue(isinstance(image, np.ndarray)) self.assertEqual(image.shape, (167, 439))
def test_load_returns_collection(self): from jicbioimage.core.image import ImageCollection from jicbioimage.core.image import MicroscopyImage, ProxyImage from jicbioimage.core.io import DataManager, FileBackend backend = FileBackend(directory=TMP_DIR) data_manager = DataManager(backend) collection = data_manager.load(os.path.join(DATA_DIR, 'multipage.tif')) self.assertTrue(isinstance(collection, ImageCollection)) self.assertFalse(isinstance(collection[0], MicroscopyImage)) self.assertTrue(isinstance(collection[0], ProxyImage))
def get_microscopy_collection(input_file): """Return microscopy collection from input file.""" data_dir = os.path.abspath(os.path.join(HERE, "..", "data")) if not os.path.isdir(data_dir): os.mkdir(data_dir) backend_dir = os.path.join(data_dir, 'unpacked') file_backend = FileBackend(backend_dir) data_manager = DataManager(file_backend) microscopy_collection = data_manager.load(input_file) return microscopy_collection
def get_microscopy_collection(input_file): """Return microscopy collection from input file.""" data_dir = "output" if not os.path.isdir(data_dir): os.mkdir(data_dir) backend_dir = os.path.join(data_dir, '.backend') file_backend = FileBackend(backend_dir) data_manager = DataManager(file_backend) microscopy_collection = data_manager.load(input_file) return microscopy_collection
def test_stack_to_image_transform(self): from jicbioimage.core.image import Image from jicbioimage.core.io import DataManager, FileBackend backend = FileBackend(TMP_DIR) data_manager = DataManager(backend) from jicbioimage.core.transform import transformation from jicbioimage.core.io import AutoName AutoName.directory = TMP_DIR @transformation def average_projection(stack): xmax, ymax, zmax = stack.shape projection = np.sum(stack, axis=2, dtype=np.uint8) // zmax return Image.from_array(projection) data_manager.load(os.path.join(DATA_DIR, 'z-series.ome.tif')) microscopy_collection = data_manager[0] stack = microscopy_collection.zstack() image = average_projection(stack) self.assertTrue(isinstance(image, Image))
def test_data_manager(self): # Alice wants to analyse her microscopy data. To access the raw image # data within the microscopy files she uses a DataManager. from jicbioimage.core.io import DataManager, FileBackend backend = FileBackend(TMP_DIR) data_manager = DataManager(backend) # Initially the DataManger is empty. self.assertEqual(len(data_manager), 0) # Alice loads her file of interest. data_manager.load(os.path.join(DATA_DIR, 'single-channel.ome.tif')) self.assertEqual(len(data_manager), 1) # A DataManager is a container for MicroscopyCollection instances. from jicbioimage.core.image import MicroscopyCollection microscopy_collection = data_manager[0] self.assertTrue(isinstance(microscopy_collection, MicroscopyCollection)) # In this instance the image collection only contains one item. self.assertEqual(len(microscopy_collection), 1) image = microscopy_collection[0] # A MicroscopyCollection is a container for MicroscopyImage instances. from jicbioimage.core.image import MicroscopyImage self.assertTrue(isinstance(image, MicroscopyImage)) # Alice then loads her second file of interest. data_manager.load(os.path.join(DATA_DIR, 'z-series.ome.tif')) # The data manager now contains to image collections. self.assertEqual(len(data_manager), 2) # There are five z-slices in the new image collection. zseries_collection = data_manager[1] self.assertEqual(len(zseries_collection), 5) # File format conversion trouble (for example using non existing input # file) raises IOError. with self.assertRaises(IOError): data_manager.load(os.path.join(DATA_DIR, 'nonsese.ome.tif'))