From 674546df743bb6a008ec40bb7061bd2189bc88e5 Mon Sep 17 00:00:00 2001 From: teogale Date: Wed, 18 Sep 2019 15:30:46 +0200 Subject: [PATCH] added test for asciiimageio.py and test_tiffio.py added installation of pillow via setup (review based) minor modification of asciiimageio and tiff --- .circleci/requirements_testing.txt | 1 + .travis.yml | 1 + neo/core/block.py | 1 + neo/io/__init__.py | 16 ++++----- neo/io/asciiimageio.py | 8 ++--- neo/io/tiffio.py | 13 ++++++-- neo/test/coretest/test_imagesequence.py | 7 ++-- neo/test/iotest/test_asciiimageio.py | 43 +++++++++++++++++++++++++ neo/test/iotest/test_tiffio.py | 43 +++++++++++++++++++++++++ setup.py | 1 + 10 files changed, 116 insertions(+), 18 deletions(-) create mode 100644 neo/test/iotest/test_asciiimageio.py create mode 100644 neo/test/iotest/test_tiffio.py diff --git a/.circleci/requirements_testing.txt b/.circleci/requirements_testing.txt index cf7fccc67..2d65411c5 100644 --- a/.circleci/requirements_testing.txt +++ b/.circleci/requirements_testing.txt @@ -9,3 +9,4 @@ ipython https://github.com/nsdf/nsdf/archive/0.1.tar.gz coverage coveralls +pillow diff --git a/.travis.yml b/.travis.yml index 08a307fa7..b950a7855 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,7 @@ install: - pip install -r requirements.txt - pip install coveralls - pip install . + - pip install pillow # command to run tests, e.g. python setup.py test script: nosetests --with-coverage --cover-package=neo diff --git a/neo/core/block.py b/neo/core/block.py index 3742db589..dfd4c0469 100644 --- a/neo/core/block.py +++ b/neo/core/block.py @@ -98,6 +98,7 @@ def __init__(self, name=None, description=None, file_origin=None, self.file_datetime = file_datetime self.rec_datetime = rec_datetime self.index = index + self.regionsofinterest = [] @property def data_children_recur(self): diff --git a/neo/io/__init__.py b/neo/io/__init__.py index 61cd28437..dbf8e1890 100644 --- a/neo/io/__init__.py +++ b/neo/io/__init__.py @@ -17,10 +17,10 @@ .. autoclass:: neo.io.AlphaOmegaIO -.. autoclass:: neo.io.AsciiSignalIO - .. autoclass:: neo.io.AsciiImageIO +.. autoclass:: neo.io.AsciiSignalIO + .. autoclass:: neo.io.AsciiSpikeTrainIO .. autoclass:: neo.io.AxographIO @@ -85,10 +85,10 @@ .. autoclass:: neo.io.StimfitIO -.. autoclass:: neo.io.TiffIO - .. autoclass:: neo.io.TdtIO +.. autoclass:: neo.io.TiffIO + .. autoclass:: neo.io.WinEdrIO .. autoclass:: neo.io.WinWcpIO @@ -114,8 +114,8 @@ # print("\n loading with API...") from neo.io.alphaomegaio import AlphaOmegaIO -from neo.io.asciisignalio import AsciiSignalIO from neo.io.asciiimageio import AsciiImageIO +from neo.io.asciisignalio import AsciiSignalIO from neo.io.asciispiketrainio import AsciiSpikeTrainIO from neo.io.axographio import AxographIO from neo.io.axonio import AxonIO @@ -152,15 +152,15 @@ from neo.io.rawmcsio import RawMCSIO from neo.io.spike2io import Spike2IO from neo.io.stimfitio import StimfitIO -from neo.io.tiffio import TiffIO from neo.io.tdtio import TdtIO +from neo.io.tiffio import TiffIO from neo.io.winedrio import WinEdrIO from neo.io.winwcpio import WinWcpIO iolist = [ AlphaOmegaIO, - AsciiSignalIO, AsciiImageIO, + AsciiSignalIO, AsciiSpikeTrainIO, AxographIO, AxonIO, @@ -195,8 +195,8 @@ RawMCSIO, Spike2IO, StimfitIO, - TiffIO, TdtIO, + TiffIO, WinEdrIO, WinWcpIO ] diff --git a/neo/io/asciiimageio.py b/neo/io/asciiimageio.py index 0db2cddc2..a6d5962e1 100644 --- a/neo/io/asciiimageio.py +++ b/neo/io/asciiimageio.py @@ -62,13 +62,12 @@ def __init__(self, file_name=None, nb_frame=None, nb_row=None, nb_column=None, u def read(self, lazy=False, **kwargs): if lazy: raise ValueError('This IO module does not support lazy loading') - return [self.read_block(lazy=lazy, nb_frame=self.nb_frame, nb_row=self.nb_row, - nb_column=self.nb_column, units=self.units, sampling_rate=self.sampling_rate, - spatial_scale=self.spatial_scale, **kwargs)] + return [self.read_block(lazy=lazy, **kwargs)] def read_block(self, lazy=False, **kwargs): - data = open(self.filename, 'r').read() + file = open(self.filename, 'r') + data = file.read() print("read block") liste_value = [] record = [] @@ -93,6 +92,7 @@ def read_block(self, lazy=False, **kwargs): image_sequence = ImageSequence(np.array(data, dtype='float'), units=self.units, sampling_rate=self.sampling_rate, spatial_scale=self.spatial_scale) + file.close() print("creating segment") segment = Segment(file_origin=self.filename) segment.imagesequences = [image_sequence] diff --git a/neo/io/tiffio.py b/neo/io/tiffio.py index 963487450..09f7af636 100644 --- a/neo/io/tiffio.py +++ b/neo/io/tiffio.py @@ -4,6 +4,12 @@ """ import os +try: + from PIL import Image + have_pil = True +except ImportError: + have_pil = False + from PIL import Image import numpy as np from neo.core import ImageSequence, Segment, Block @@ -68,6 +74,10 @@ class TiffIO(BaseIO): def __init__(self, directory_path=None,units=None, sampling_rate=None, spatial_scale=None, **kwargs): + + if not have_pil: + raise Exception("Please install the pillow package to use TiffIO") + BaseIO.__init__(self, directory_path, **kwargs) self.units = units self.sampling_rate = sampling_rate @@ -76,8 +86,7 @@ def __init__(self, directory_path=None,units=None, sampling_rate=None, def read(self, lazy=False, **kwargs): if lazy: raise ValueError('This IO module does not support lazy loading') - return [self.read_block(lazy=lazy, units=self.units, sampling_rate=self.sampling_rate, - spatial_scale=self.spatial_scale, **kwargs)] + return [self.read_block(lazy=lazy, **kwargs)] def read_block(self, lazy=False, **kwargs): # to sort file diff --git a/neo/test/coretest/test_imagesequence.py b/neo/test/coretest/test_imagesequence.py index 393217f7c..31fd1e2a4 100644 --- a/neo/test/coretest/test_imagesequence.py +++ b/neo/test/coretest/test_imagesequence.py @@ -35,13 +35,14 @@ def test_error_spatial_scale(self): ImageSequence(self.data, units='V', sampling_rate=500 * pq.Hz) def test_units(self): - with self.assertRaises(ValueError): + with self.assertRaises(TypeError): ImageSequence(self.data, sampling_rate=500 * pq.Hz, spatial_scale='m') # test method will be remove are rename def test_something(self): - l = ImageSequence(self.data, sampling_rate=500 * pq.Hz, units='V', spatial_scale='m') + l = ImageSequence(self.data, sampling_rate=500 * pq.Hz, units='V', + spatial_scale='m') self.assertEqual(l.sampling_rate, 500 * pq.Hz) self.assertEqual(l.spatial_scale, 'm') @@ -75,8 +76,6 @@ def test_signal_from_region(self): with self.assertRaises(ValueError): ImageSequence(self.data, units='V', sampling_rate=500 * pq.Hz, spatial_scale='m').signal_from_region() - m = ImageSequence(self.data, units='V', sampling_rate=500 * pq.Hz, spatial_scale='m').view() - print(m.sampling_rate) if __name__ == "__main__": unittest.main() diff --git a/neo/test/iotest/test_asciiimageio.py b/neo/test/iotest/test_asciiimageio.py new file mode 100644 index 000000000..98ed3b8a0 --- /dev/null +++ b/neo/test/iotest/test_asciiimageio.py @@ -0,0 +1,43 @@ +""" +Test of neo.io.asciiimageio +""" +import os +import unittest +import quantities as pq +from neo.io import AsciiImageIO +import numpy as np + + +class TestAsciiImageIO(unittest.TestCase): + + def test_read_txt(self): + img = '' + img_list = [] + for frame in range(20): + img_list.append([]) + for y in range(50): + img_list[frame].append([]) + for x in range(50): + img += str(x) + img += '\t' + img_list[frame][y].append(x) + img_list = np.array(img_list) + file_name = "txt_test_file.txt" + file = open(file_name, mode="w") + file.write(str(img)) + file.close() + + object = AsciiImageIO(file_name='txt_test_file.txt', + nb_frame=20, nb_row=50, nb_column=50, units='V', + sampling_rate=1 * pq.Hz, spatial_scale=1 * pq.micrometer) + block = object.read_block() + self.assertEqual(len(block.segments), 1) + self.assertEqual(len(block.segments[0].imagesequences), 1) + self.assertEqual(block.segments[0].imagesequences[0].shape, (20, 50, 50)) + self.assertEqual(block.segments[0].imagesequences[0].any(), img_list.any()) + + file.close() + os.remove(file_name) + +if __name__ == "__main__": + unittest.main() diff --git a/neo/test/iotest/test_tiffio.py b/neo/test/iotest/test_tiffio.py new file mode 100644 index 000000000..9952a096e --- /dev/null +++ b/neo/test/iotest/test_tiffio.py @@ -0,0 +1,43 @@ + +import unittest +import os +from PIL import Image +import numpy as np +import shutil +from neo.io.tiffio import TiffIO +import quantities as pq + +class TestTiffIO(unittest.TestCase): + + + def test_read_group_of_tiff_grayscale(self): + directory = 'test_tiff' + if not os.path.exists(directory): + os.makedirs(directory) + # directory is live + img = [] + for picture in range(10): + img.append([]) + for y in range(50): + img[picture].append([]) + for x in range(50): + img[picture][y].append(x) + img = np.array(img, dtype=float) + for image in range(10): + Image.fromarray(img[image]).save(directory+'/tiff_exemple'+str(image)+".tif") + + ioclass = TiffIO(directory_path=directory, units='V', sampling_rate=1.0*pq.Hz, + spatial_scale=1.0*pq.micrometer) + blck = ioclass.read_block() + self.assertEqual(len(blck.segments), 1) + self.assertEqual(len(blck.segments[0].imagesequences), 1) + self.assertEqual(blck.segments[0].imagesequences[0].any(), img.any()) + self.assertEqual(blck.segments[0].imagesequences[0].sampling_rate, 1.0*pq.Hz) + self.assertEqual(blck.segments[0].imagesequences[0].spatial_scale, 1.0 * pq.micrometer) + + # end of directory + shutil.rmtree(directory) + + +if __name__ == "__main__": + unittest.main() diff --git a/setup.py b/setup.py index 56b8e253f..f629390e3 100755 --- a/setup.py +++ b/setup.py @@ -14,6 +14,7 @@ 'neomatlabio': ['scipy>=0.12.0'], 'nixio': ['nixio>=1.5.0b2'], 'stimfitio': ['stfio'], + 'tiffio':['pillow'] } if os.environ.get('TRAVIS') == 'true' and \