From 8bf3d497bf67aeab960590153481770bae289e74 Mon Sep 17 00:00:00 2001 From: Scott Lowe Date: Fri, 18 Jun 2021 21:57:52 +0100 Subject: [PATCH 1/9] TST:BUG: datahandler moved to extraction --- fissa/tests/generate_downsampled_resources.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fissa/tests/generate_downsampled_resources.py b/fissa/tests/generate_downsampled_resources.py index 2cc599df..148d6103 100755 --- a/fissa/tests/generate_downsampled_resources.py +++ b/fissa/tests/generate_downsampled_resources.py @@ -15,7 +15,7 @@ import zipfile from fissa import readimagejrois -from fissa import datahandler +from fissa import extraction def maybe_make_dir(dirname): @@ -330,6 +330,8 @@ def main(): dwn_y = dwn_x dwn_t = 10 + datahandler = extraction.DataHandlerTifffile + # Extract the rois from the zip file print( 'Extracting rois from {} into {}' From c5146af567c24347aeae9c9d79eab537175169db Mon Sep 17 00:00:00 2001 From: Scott Lowe Date: Fri, 18 Jun 2021 21:59:02 +0100 Subject: [PATCH 2/9] TST:ENH: Expand outputs of resource downsampler --- fissa/tests/generate_downsampled_resources.py | 111 +++++++++++------- 1 file changed, 69 insertions(+), 42 deletions(-) diff --git a/fissa/tests/generate_downsampled_resources.py b/fissa/tests/generate_downsampled_resources.py index 148d6103..a998c76e 100755 --- a/fissa/tests/generate_downsampled_resources.py +++ b/fissa/tests/generate_downsampled_resources.py @@ -3,7 +3,8 @@ from __future__ import division from __future__ import unicode_literals -import os, os.path +import glob +import os from itertools import product import sys import shutil @@ -309,10 +310,19 @@ def _writecoords(points): outhand.write(line) -def main(): +def main(name=None, roi_ids=None, dwn_x=4, dwn_y=None, dwn_t=10): ''' Convert example data into downsampled test data. ''' + # Default arguments + if dwn_y is None: + dwn_y = dwn_x + + if name is None: + import datetime + + name = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + # Input resolution this_dir = os.path.dirname(os.path.abspath(__file__)) repo_dir = os.path.dirname(os.path.dirname(this_dir)) @@ -322,13 +332,12 @@ def main(): images_location = os.path.join( repo_dir, 'examples', 'exampleData', '20150529', ) + # Output configuration output_folder_base = os.path.join(this_dir, 'resources') roi_extract_dir = os.path.join(output_folder_base, '_build_rois') - output_folder = os.path.join(output_folder_base, 'a') - dwn_x = 4 - dwn_y = dwn_x - dwn_t = 10 + + output_folder = os.path.join(output_folder_base, name) datahandler = extraction.DataHandlerTifffile @@ -342,51 +351,69 @@ def main(): # Read in rois roi_list = readimagejrois.read_imagej_roi_zip(rois_location) - - # Read in image - image_location = os.path.join(images_location, 'AVG_A01.tif') - img = datahandler.image2array(image_location) - - # Downscale image - roi_id = 1 - mn = roi_list[roi_id]['polygons'].min(0) # [ 86. 164. 40.] - mx = roi_list[roi_id]['polygons'].max(0) # [113. 175. 40.] - off_x = max(0, int(mn[0] - 19)) # 67 - end_x = min(img.shape[2], int(mx[0] + 19)) # 132 - off_y = max(0, int(mn[1] - 19)) # 145 - end_y = min(img.shape[1], int(mx[1] + 19)) # 176 - img_dwn = scipy.ndimage.uniform_filter(img, size=[dwn_t, dwn_y, dwn_x]) - img_dwn = img_dwn[::dwn_t, off_y:end_y:dwn_y, off_x:end_x:dwn_x] - img_dwn_pth = os.path.join(output_folder, 'images', 'AVG_A01_R1_small.tif') - print( - 'Saving {}, {} downsampled image as {}' - ''.format(dwn_x, dwn_y, img_dwn_pth) - ) - maybe_make_dir(os.path.dirname(img_dwn_pth)) - tifffile.imsave(img_dwn_pth, img_dwn) - - # Downscale roi - roi_raw_pth = os.path.join( - roi_extract_dir, '{:02d}.roi'.format(roi_id + 1), - ) - roi_dwn_pth = os.path.join(output_folder, 'rois', '01.roi') - print( - 'Downsampling {} with factor {}, {} as {}' - ''.format(roi_raw_pth, dwn_x, dwn_y, roi_dwn_pth) - ) - maybe_make_dir(os.path.dirname(roi_dwn_pth)) - downscale_roi(roi_raw_pth, roi_dwn_pth, [dwn_x, dwn_y], [-off_x, -off_y]) + if roi_ids is None: + roi_ids = range(len(roi_list)) + + image_paths = sorted(glob.glob(os.path.join(images_location, "*.tif*"))) + img = datahandler.image2array(image_paths[0]) + + # Workout where to crop images when downscaling to include ROIs + buffer = 19 + off_x = off_y = 1e9 + end_x = end_y = 0 + for roi_id in roi_ids: + mn = roi_list[roi_id]["polygons"].min(0) + mx = roi_list[roi_id]["polygons"].max(0) + off_x = min(off_x, max(0, int(mn[0] - buffer))) + end_x = max(end_x, min(img.shape[2], int(mx[0] + buffer))) + off_y = min(off_y, max(0, int(mn[1] - buffer))) + end_y = max(end_y, min(img.shape[1], int(mx[1] + buffer))) + + # Downsample images + for img_pth in image_paths: + img = datahandler.image2array(img_pth) + print("Loaded image {} shaped {}".format(img_pth, img.shape)) + img_dwn = scipy.ndimage.uniform_filter(img, size=[dwn_t, dwn_y, dwn_x]) + img_dwn = img_dwn[::dwn_t, off_y:end_y:dwn_y, off_x:end_x:dwn_x] + img_dwn_pth = os.path.join(output_folder, "images", os.path.basename(img_pth)) + print( + "Saving downsampled image shaped {} as {}".format( + img_dwn.shape, img_dwn_pth + ) + ) + maybe_make_dir(os.path.dirname(img_dwn_pth)) + tifffile.imsave(img_dwn_pth, img_dwn) + + # Downscale roi(s) + for roi_id in roi_ids: + roi_raw_pth = os.path.join( + roi_extract_dir, "{:02d}.roi".format(roi_id + 1), + ) + roi_dwn_pth = os.path.join( + output_folder, "rois", "{:02d}.roi".format(roi_id + 1) + ) + print( + "Downsampling ROI {} with factor ({}, {}); saving as {}" + "".format(roi_raw_pth, dwn_x, dwn_y, roi_dwn_pth) + ) + maybe_make_dir(os.path.dirname(roi_dwn_pth)) + downscale_roi(roi_raw_pth, roi_dwn_pth, [dwn_x, dwn_y], [-off_x, -off_y]) # Turn rois into a zip file roi_zip_pth = os.path.join(output_folder, 'rois.zip') - print('Zipping rois {} as {}'.format(roi_dwn_pth, roi_zip_pth)) + print("Zipping rois {} as {}".format(os.path.dirname(roi_dwn_pth), roi_zip_pth)) maybe_make_dir(os.path.dirname(roi_dwn_pth)) with zipfile.ZipFile(roi_zip_pth, 'w') as zr: - zr.write(roi_dwn_pth, os.path.basename(roi_dwn_pth)) + for roi_id in roi_ids: + roi_dwn_pth = os.path.join( + output_folder, "rois", "{:02d}.roi".format(roi_id + 1) + ) + zr.write(roi_dwn_pth, os.path.basename(roi_dwn_pth)) # Remove _build_rois directory shutil.rmtree(roi_extract_dir) + if __name__ == '__main__': __package__ = 'fissa.tests.generate_downsampled_resources' main() From 5f1c3082f56d1ad0915815845b32c80bcc0743a2 Mon Sep 17 00:00:00 2001 From: Scott Lowe Date: Fri, 25 Jun 2021 02:17:39 +0100 Subject: [PATCH 3/9] TST:ENH: Add parser for generate_downsampled_resources --- fissa/tests/generate_downsampled_resources.py | 82 +++++++++++++++++-- 1 file changed, 73 insertions(+), 9 deletions(-) diff --git a/fissa/tests/generate_downsampled_resources.py b/fissa/tests/generate_downsampled_resources.py index a998c76e..09c68283 100755 --- a/fissa/tests/generate_downsampled_resources.py +++ b/fissa/tests/generate_downsampled_resources.py @@ -310,13 +310,13 @@ def _writecoords(points): outhand.write(line) -def main(name=None, roi_ids=None, dwn_x=4, dwn_y=None, dwn_t=10): +def main(name=None, roi_ids=None, x_down=4, y_down=None, t_down=10): ''' Convert example data into downsampled test data. ''' # Default arguments - if dwn_y is None: - dwn_y = dwn_x + if y_down is None: + y_down = x_down if name is None: import datetime @@ -351,7 +351,7 @@ def main(name=None, roi_ids=None, dwn_x=4, dwn_y=None, dwn_t=10): # Read in rois roi_list = readimagejrois.read_imagej_roi_zip(rois_location) - if roi_ids is None: + if roi_ids is None or len(roi_ids) == 0: roi_ids = range(len(roi_list)) image_paths = sorted(glob.glob(os.path.join(images_location, "*.tif*"))) @@ -373,8 +373,8 @@ def main(name=None, roi_ids=None, dwn_x=4, dwn_y=None, dwn_t=10): for img_pth in image_paths: img = datahandler.image2array(img_pth) print("Loaded image {} shaped {}".format(img_pth, img.shape)) - img_dwn = scipy.ndimage.uniform_filter(img, size=[dwn_t, dwn_y, dwn_x]) - img_dwn = img_dwn[::dwn_t, off_y:end_y:dwn_y, off_x:end_x:dwn_x] + img_dwn = scipy.ndimage.uniform_filter(img, size=[t_down, y_down, x_down]) + img_dwn = img_dwn[::t_down, off_y:end_y:y_down, off_x:end_x:x_down] img_dwn_pth = os.path.join(output_folder, "images", os.path.basename(img_pth)) print( "Saving downsampled image shaped {} as {}".format( @@ -394,10 +394,10 @@ def main(name=None, roi_ids=None, dwn_x=4, dwn_y=None, dwn_t=10): ) print( "Downsampling ROI {} with factor ({}, {}); saving as {}" - "".format(roi_raw_pth, dwn_x, dwn_y, roi_dwn_pth) + "".format(roi_raw_pth, x_down, y_down, roi_dwn_pth) ) maybe_make_dir(os.path.dirname(roi_dwn_pth)) - downscale_roi(roi_raw_pth, roi_dwn_pth, [dwn_x, dwn_y], [-off_x, -off_y]) + downscale_roi(roi_raw_pth, roi_dwn_pth, [x_down, y_down], [-off_x, -off_y]) # Turn rois into a zip file roi_zip_pth = os.path.join(output_folder, 'rois.zip') @@ -414,6 +414,70 @@ def main(name=None, roi_ids=None, dwn_x=4, dwn_y=None, dwn_t=10): shutil.rmtree(roi_extract_dir) +def get_parser(): + """ + Build parser for generate_downsampled_resources command line interface. + + Returns + ------- + parser : argparse.ArgumentParser + CLI argument parser. + """ + import argparse + + prog = os.path.split(sys.argv[0])[1] + if prog == "__main__.py" or prog == "__main__": + prog = os.path.split(__file__)[1] + parser = argparse.ArgumentParser( + prog=prog, + description="Downsample example dataset to create test data", + add_help=False, + ) + + parser.add_argument( + "-h", "--help", action="help", help="Show this help message and exit.", + ) + + parser.add_argument( + "--name", + type=str, + help="Name of output dataset (default: current datetime)", + ) + parser.add_argument( + "--roi-id", + nargs="+", + type=int, + help=""" + ROI indices to include. The image will be downsampled to include + the ROIs and their surroundings. Multiple ROIs can be specified. + If omitted, all ROIs are used. + """, + ) + parser.add_argument( + "--x-down", + type=int, + default=4, + help="Downsampling factor for x dimension (default: 4)", + ) + parser.add_argument( + "--y-down", + type=int, + default=4, + help="Downsampling factor for y dimension (default: 4)", + ) + parser.add_argument( + "--t-down", + type=int, + default=10, + help="Downsampling factor for time dimension (default: 10)", + ) + + return parser + + if __name__ == '__main__': __package__ = 'fissa.tests.generate_downsampled_resources' - main() + parser = get_parser() + kwargs = vars(parser.parse_args()) + roi_ids = kwargs.pop("roi_id") + main(roi_ids=roi_ids, **kwargs) From 5ba0e8387aade9c7a409dba22a0ae77ca67cee2f Mon Sep 17 00:00:00 2001 From: Scott Lowe Date: Fri, 18 Jun 2021 21:59:29 +0100 Subject: [PATCH 4/9] TST:RF: Move Core tests into a Mixin class --- fissa/tests/test_core.py | 96 ++++++++++++++++++++++------------------ 1 file changed, 52 insertions(+), 44 deletions(-) diff --git a/fissa/tests/test_core.py b/fissa/tests/test_core.py index d5bf78f6..b1b51055 100644 --- a/fissa/tests/test_core.py +++ b/fissa/tests/test_core.py @@ -14,52 +14,11 @@ from .. import extraction -class TestExperimentA(BaseTestCase): - '''Test Experiment class and its methods.''' +class ExperimentTestMixin: + """Base tests for Experiment class.""" def __init__(self, *args, **kwargs): - super(TestExperimentA, self).__init__(*args, **kwargs) - - self.resources_dir = os.path.join(self.test_directory, 'resources', 'a') self.output_dir = self.tempdir - self.images_dir = os.path.join(self.resources_dir, 'images') - self.image_names = ['AVG_A01_R1_small.tif'] - self.image_shape = (8, 17) - self.roi_zip_path = os.path.join(self.resources_dir, 'rois.zip') - self.roi_paths = [os.path.join('rois', r) for r in ['01.roi']] - - self.expected_00 = np.array([ - [11.25423074, 0. , 0. , 7.55432252, 19.11182766, - 0. , 6.37473238, 0. , 0. , 0. , - 0. , 1.58567319, 2.28185467, 0. , 16.70204514, - 17.55112746, 17.23642459, 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 14.75392227], - [89.75326173, 81.33290066, 88.77502093, 80.71108594, 85.5315738 , - 78.42423771, 80.3659251 , 84.46124736, 78.04229961, 81.48360449, - 82.12879963, 83.11862592, 83.09085808, 91.22418523, 86.42399606, - 81.05860567, 86.15497276, 81.53903092, 80.53875696, 83.41061814, - 80.59332446, 81.64495893, 86.26057223, 82.47622273, 83.28735277, - 84.00697623, 83.68517083, 83.19829805, 82.06518458], - [ 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. ], - [ 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. ], - [ 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. ], - ]) def setUp(self): self.tearDown() @@ -155,7 +114,7 @@ def compare_experiments(self, actual, expected, prepared=True, separated=True): def compare_matlab(self, fname, experiment, compare_deltaf=None): """ - Compare experiment output against expected from test attributes. + Compare matfile contents against an experiment. Parameters ---------- @@ -828,6 +787,7 @@ def test_func_deltaf(self): actual = core.run_fissa( image_path, roi_path, self.output_dir, freq=4, return_deltaf=True ) + #TODO: Check contents of the .mat file self.assert_equal(len(actual), 1) self.assert_equal(len(actual[0]), 1) # TODO: Check contents of deltaf output @@ -837,3 +797,51 @@ def test_func_deltaf_nofreq(self): roi_path = os.path.join(self.resources_dir, self.roi_zip_path) with self.assertRaises(ValueError): core.run_fissa(image_path, roi_path, self.output_dir, return_deltaf=True) + + +class TestExperimentA(BaseTestCase, ExperimentTestMixin): + """Test core on Experiment A, which has 1 roi and 1 TIFF.""" + + def __init__(self, *args, **kwargs): + super(TestExperimentA, self).__init__(*args, **kwargs) + ExperimentTestMixin.__init__(self) + + self.resources_dir = os.path.join(self.test_directory, "resources", "a") + self.images_dir = os.path.join(self.resources_dir, "images") + self.image_names = ["AVG_A01_R1_small.tif"] + self.image_shape = (8, 17) + self.roi_zip_path = os.path.join(self.resources_dir, "rois.zip") + self.roi_paths = [os.path.join("rois", r) for r in ["01.roi"]] + + self.expected_00 = np.array([ + [11.25423074, 0. , 0. , 7.55432252, 19.11182766, + 0. , 6.37473238, 0. , 0. , 0. , + 0. , 1.58567319, 2.28185467, 0. , 16.70204514, + 17.55112746, 17.23642459, 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 14.75392227], + [89.75326173, 81.33290066, 88.77502093, 80.71108594, 85.5315738 , + 78.42423771, 80.3659251 , 84.46124736, 78.04229961, 81.48360449, + 82.12879963, 83.11862592, 83.09085808, 91.22418523, 86.42399606, + 81.05860567, 86.15497276, 81.53903092, 80.53875696, 83.41061814, + 80.59332446, 81.64495893, 86.26057223, 82.47622273, 83.28735277, + 84.00697623, 83.68517083, 83.19829805, 82.06518458], + [ 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. ], + [ 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. ], + [ 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. ], + ]) From 904d6e0c6993976e6639ed41d1c4f81c2098f10b Mon Sep 17 00:00:00 2001 From: Scott Lowe Date: Fri, 25 Jun 2021 12:23:05 +0100 Subject: [PATCH 5/9] TST: Add ExperimentA resource a/expected.npz --- fissa/tests/resources/a/expected_py2.npz | Bin 0 -> 5454 bytes fissa/tests/resources/a/expected_py3.npz | Bin 0 -> 6022 bytes .../resources/a/images/AVG_A01_R1_small.h5 | Bin 0 -> 14600 bytes .../tests/resources/a/new/AVG_A01_R1_small.roi | Bin 0 -> 152 bytes .../tests/resources/a/new/AVG_A01_R1_small.txt | 6 ++++++ fissa/tests/resources/a/new/composite-brush.roi | Bin 0 -> 256 bytes fissa/tests/resources/a/new/ellipse2-flat.roi | Bin 0 -> 1008 bytes fissa/tests/resources/a/new/ellipse2.roi | Bin 0 -> 992 bytes fissa/tests/resources/a/new/selection-brush.roi | Bin 0 -> 276 bytes fissa/tests/resources/a/rois/01.txt | 9 +++++++++ 10 files changed, 15 insertions(+) create mode 100644 fissa/tests/resources/a/expected_py2.npz create mode 100644 fissa/tests/resources/a/expected_py3.npz create mode 100644 fissa/tests/resources/a/images/AVG_A01_R1_small.h5 create mode 100644 fissa/tests/resources/a/new/AVG_A01_R1_small.roi create mode 100644 fissa/tests/resources/a/new/AVG_A01_R1_small.txt create mode 100644 fissa/tests/resources/a/new/composite-brush.roi create mode 100644 fissa/tests/resources/a/new/ellipse2-flat.roi create mode 100644 fissa/tests/resources/a/new/ellipse2.roi create mode 100644 fissa/tests/resources/a/new/selection-brush.roi create mode 100644 fissa/tests/resources/a/rois/01.txt diff --git a/fissa/tests/resources/a/expected_py2.npz b/fissa/tests/resources/a/expected_py2.npz new file mode 100644 index 0000000000000000000000000000000000000000..5e1305f864825d87dfc562c2cf2214100211f90e GIT binary patch literal 5454 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 literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/a/images/AVG_A01_R1_small.h5 b/fissa/tests/resources/a/images/AVG_A01_R1_small.h5 new file mode 100644 index 0000000000000000000000000000000000000000..b3e320a344728f4d13b45a7e5b1c6c22ab81bca0 GIT binary patch literal 14600 zcmeI1NpGZA6^5_71DKFV1R*6v0(#jiy6v_*p6#+-c9mV_smkSYdnga>p5k_=6Ne!Q zWI%`zDI3HFv58n9mMqz`VaZR(&tM17b5DJSIBIpoj>P^{(|7N8?it?mo^!8%Q<
fV2$EC2kw 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 LU;H0m^p5`q^B62B literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/a/new/AVG_A01_R1_small.roi b/fissa/tests/resources/a/new/AVG_A01_R1_small.roi new file mode 100644 index 0000000000000000000000000000000000000000..2528fd256e168e60692a6cba345137b4c7eddf5c GIT binary patch literal 152 vcmeawFD+qs%)r3F2!t#QoD6J0Ht`?=sEYxpj}1t309i~7%wWwRQHlTnsip%A literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/a/new/AVG_A01_R1_small.txt b/fissa/tests/resources/a/new/AVG_A01_R1_small.txt new file mode 100644 index 00000000..65323b86 --- /dev/null +++ b/fissa/tests/resources/a/new/AVG_A01_R1_small.txt @@ -0,0 +1,6 @@ +2 1 +1 3 +5 4 +7 1 +2 1 +9 2 diff --git a/fissa/tests/resources/a/new/composite-brush.roi b/fissa/tests/resources/a/new/composite-brush.roi new file mode 100644 index 0000000000000000000000000000000000000000..8ab6aa91fdca5a13a2a601ca3c3ca7ff6ff59d1b GIT binary patch literal 256 zcmeawFD+qs%*epN%D}?F$-u*a9VlQIW;g&6cW40O1q=-KAR34r8KCS3sBDlLkUR)D g3Lx}=*f2d{Hjoc8%h3U%4$cPZgRzm#0t%B20OWWUSO5S3 literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/a/new/ellipse2-flat.roi b/fissa/tests/resources/a/new/ellipse2-flat.roi new file mode 100644 index 0000000000000000000000000000000000000000..a5c9cfd70d87783e38b722a362c7fbf4c4bbade5 GIT binary patch literal 1008 zcma)*X-HI27=}+e<5pG*DX1ivsP&`BJ(uzQL@AesG|^OCYg}sDm~zM^N=wXAD{EYm zT*$55MnwCeMv;+9f>thtm9|)%{dv4BWGTYzV2 zu~myK_h-L!O%1Q+UA&vSa5wJC-Fb>8?{B{0Vm0s3B=P>`Xq=ahnw9+jxU`plFHiVA z7goV{k&+7QC{ZRQnbM2mpGYW1o=%aGc@$a|O+o%v6cFV@K2uWioEs+R!bI9S7)Lf; zle96Znl?;Kk)fLpi84zuU(|~aQg=M}cfrGk4`@@>pxR~tsx$?1)OJwz6d^Xa3IQ%w za4mC$U5y#c71J=XjD>!u3gYlt@V_fo$HCxWFN`;dV9~FOEz zD{{BXP;9anHDmT@kCNcgIZupi?Z8J5dn{a3k~kxQ);gM#$>>|MjCe=3^?9_dt&v>h zB_w&UlYDFC6u7pOfyIHB13K5nSyaPze(D!=#O*2p|+ yGmKFGW(IeDOrUXS0L|gnXvv?3`uO9O*F*b_py{pD|Dnj3Tp*bpV+tl?_CEm(mHPDn literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/a/new/ellipse2.roi b/fissa/tests/resources/a/new/ellipse2.roi new file mode 100644 index 0000000000000000000000000000000000000000..7337649b859d2ee86308474fc4a2374771e17da6 GIT binary patch literal 992 zcmbV~eN4=89LK+Rm##}iYmIKv!$^6Ex$bI=@B3rLp=R2&gk{xTLd7cPsRt=fAuB0m z)smi8wqmG-ijJu+&|NdmNasn{hI7{Js?@VAHEo4(SN80Pj@o3-K$4qwI?dncaeXx z8rkhJNR|{}b5$x<)r~^!KZ4nbdQ9KV;1H&Sd~pn9P92a+S3`VVg~Aq&PDOB?%HZ>{ z2TL;NBIH&PqEi}hAXSMI-B~Dn+lHz~QMjHQj*eR%Fdmm+@G4<=W;|JkKBg&7oixob zkKETV^1fJ0i|Rg8fX9V zb)dMk1aZP}^T`4jmg#X{qe52$LwBJHJ%d4bRqz7u&Koh%pMZ~h7Gg;23R74WOr-{x zJbN+t<`X`=)M3Cyg|{U)&>L@nF+T}Ul|ZNB8QK$NxGm_fcje>Cz+P0=-{rW6FT&d$3>BBrTIfoxR7|e4|$MfQ14X-)n#+$X@d1r%$_nl{a*jR_j z9>Z`6ZGv}{5dmsPXlrw@vBDqQe@Jk!NQt99O61CPD17LP@|_W=>2VpKv;SQD1nZmm A6951J literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/a/new/selection-brush.roi b/fissa/tests/resources/a/new/selection-brush.roi new file mode 100644 index 0000000000000000000000000000000000000000..270954cd11f6a94cf61cc6c8b4194aacc454ea08 GIT binary patch literal 276 zcmeawFD+qs%*epN%D}?F#lXXW9jIa#X1D?pcQ^pV3m6#e8=!0;AIt`df#l%q2T*nc oP#lTvr~nanWME)GVGBUT9f0CUY?zsj1_<-P>;*u60|UhX03uEuod5s; literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/a/rois/01.txt b/fissa/tests/resources/a/rois/01.txt new file mode 100644 index 00000000..60ec97cd --- /dev/null +++ b/fissa/tests/resources/a/rois/01.txt @@ -0,0 +1,9 @@ +5.0000 6.0000 +7.0000 5.0000 +9.0000 5.0000 +11.0000 6.0000 +11.0000 6.0000 +12.0000 7.0000 +12.0000 8.0000 +5.0000 8.0000 +5.0000 7.0000 From a8797a902435cc34611b943c5b935a5375f929b7 Mon Sep 17 00:00:00 2001 From: Scott Lowe Date: Fri, 25 Jun 2021 12:21:48 +0100 Subject: [PATCH 6/9] TST: Expand core tests, comparing attributes against expected.npz file contents --- fissa/tests/test_core.py | 244 +++++++++++++++++++++------------------ 1 file changed, 130 insertions(+), 114 deletions(-) diff --git a/fissa/tests/test_core.py b/fissa/tests/test_core.py index b1b51055..101b34df 100644 --- a/fissa/tests/test_core.py +++ b/fissa/tests/test_core.py @@ -4,6 +4,7 @@ import os, os.path import shutil +import sys import unittest import numpy as np @@ -27,64 +28,67 @@ def tearDown(self): if os.path.isdir(self.output_dir): shutil.rmtree(self.output_dir) - def compare_output(self, experiment, separated=True, compare_deltaf=None): + def compare_result(self, actual): """ - Compare experiment output against expected from test attributes. + Compare experiment result against self.expected["result"]. + """ + # Check sizes are correct + expected_shape = len(self.roi_paths), len(self.image_names) + self.assert_equal(np.shape(actual), expected_shape) + # Check contents are correct + self.assert_allclose_ragged(actual, self.expected["result"]) + + def compare_deltaf_result(self, actual): + """ + Compare experiment result against self.expected["deltaf_result"]. + """ + # Check sizes are correct + expected_shape = len(self.roi_paths), len(self.image_names) + self.assert_equal(np.shape(actual), expected_shape) + self.assert_allclose_ragged(actual, self.expected["deltaf_result"]) + + def compare_output(self, actual, separated=True, compare_deltaf=None): + """ + Compare actual output against expected from self.expected. Parameters ---------- - experiment : fissa.Experiment + actual : fissa.Experiment Actual experiment. separated : bool Whether to compare results of :meth:`fissa.Experiment.separate`. Default is ``True``. compare_deltaf : bool or None - Whether to compare ``experiment.deltaf_raw`` against - ``experiment.raw`` and, if ``separated=True``, - ``experiment.deltaf_result`` against ``experiment.result``. + Whether to compare ``actual.deltaf_raw`` and + ``actual.deltaf_result`` against their targets. If ``None`` (default), this is automatically determined based on - whether ``experiment.deltaf_result`` (if ``separated=True``) or - ``experiment.deltaf_raw`` (otherwise) is not ``None``. + whether ``actual.deltaf_result`` (if ``separated=True``) or + ``actual.deltaf_raw`` (otherwise) is not ``None``. """ if compare_deltaf is None: if separated: - compare_deltaf = experiment.deltaf_result is not None + compare_deltaf = actual.deltaf_result is not None else: - compare_deltaf = experiment.deltaf_raw is not None - self.assert_equal(len(experiment.raw), 1) - self.assert_equal(len(experiment.raw[0]), 1) + compare_deltaf = actual.deltaf_raw is not None + # Check sizes are correct + expected_shape = len(self.roi_paths), len(self.image_names) + self.assert_equal(np.shape(actual.raw), expected_shape) + self.assert_equal(len(actual.means), len(self.image_names)) + # Check contents are correct + self.assert_equal(actual.means, self.expected["means"]) + self.assert_allclose_ragged(actual.roi_polys, self.expected["roi_polys"]) if separated: - self.assert_equal(len(experiment.result), 1) - self.assert_equal(len(experiment.result[0]), 1) - self.assert_allclose(experiment.result[0][0], self.expected_00) - self.assert_equal(len(experiment.means), len(self.image_names)) - self.assert_equal(experiment.means[0].shape, self.image_shape) - self.assert_equal(experiment.means[-1].shape, self.image_shape) - # TODO: Check contents of exp.deltaf_result instead of just the shape + # Check sizes are correct + self.assert_equal(np.shape(actual.sep), expected_shape) + # Check result is correct + self.compare_result(actual.result) + # Check contents are correct + self.assert_allclose_ragged(actual.sep, self.expected["sep"]) + self.assert_allclose_ragged(actual.mixmat, self.expected["mixmat"]) if compare_deltaf: - if experiment.raw is None: - self.assertIs(experiment.deltaf_raw, experiment.raw) - else: - self.assert_equal( - np.shape(experiment.deltaf_raw), - np.shape(experiment.raw), - ) - self.assert_equal( - np.shape(experiment.deltaf_raw[0]), - np.shape(experiment.raw[0]), - ) + self.assert_allclose_ragged(actual.deltaf_raw, self.expected["deltaf_raw"]) if compare_deltaf and separated: - if experiment.result is None: - self.assertIs(experiment.deltaf_result, experiment.result) - else: - self.assert_equal( - np.shape(experiment.deltaf_result), - np.shape(experiment.result), - ) - self.assert_equal( - np.shape(experiment.deltaf_result[0]), - np.shape(experiment.result[0]), - ) + self.compare_deltaf_result(actual.deltaf_result) def compare_experiments(self, actual, expected, prepared=True, separated=True): """ @@ -109,8 +113,12 @@ def compare_experiments(self, actual, expected, prepared=True, separated=True): else: self.assert_allclose_ragged(actual.raw, expected.raw) self.assert_allclose_ragged(actual.means, expected.means) + self.assert_allclose_ragged(actual.roi_polys, expected.roi_polys) if separated: self.assert_allclose_ragged(actual.result, expected.result) + self.assert_allclose_ragged(actual.sep, expected.sep) + self.assert_allclose_ragged(actual.mixmat, expected.mixmat) + self.assert_equal(actual.info, expected.info) def compare_matlab(self, fname, experiment, compare_deltaf=None): """ @@ -154,6 +162,44 @@ def compare_matlab(self, fname, experiment, compare_deltaf=None): experiment.deltaf_raw[0, 0], ) + def compare_matlab_expected(self, fname, compare_deltaf=True): + """ + Compare matfile contents against expected from test attributes. + + Parameters + ---------- + fname : str + Path to .mat file to test. + compare_deltaf : bool or None + Whether to compare ``deltaf_raw`` and ``deltaf_result``. + Default is ``True``. + """ + self.assertTrue(os.path.isfile(fname)) + # Check contents of the .mat file + M = loadmat(fname) + self.assert_allclose(M["raw"][0, 0][0][0, 0][0], self.expected["raw"][0, 0]) + self.assert_allclose( + M["result"][0, 0][0][0, 0][0], + self.expected["result"][0, 0], + ) + self.assert_allclose( + M["ROIs"][0, 0][0][0, 0][0][0][0], + self.expected["roi_polys"][0, 0][0][0], + ) + if compare_deltaf: + self.assert_allclose( + M["df_result"][0, 0][0][0, 0][0], + self.expected["deltaf_result"][0, 0], + ) + # Row and column vectors on MATLAB are 2d instead of 1d, and df_raw + # is a vector, not a matrix, so has an extra dimension. + # N.B. This extra dimension is in the wrong place as it doesn't align + # with the other attributes. + self.assert_allclose( + M["df_raw"][0, 0][0][0, 0][0][0, :], + self.expected["deltaf_raw"][0, 0], + ) + def test_imagedir_roizip(self): exp = core.Experiment(self.images_dir, self.roi_zip_path) exp.separate() @@ -647,32 +693,47 @@ def test_load_manual_undefined(self): def test_calcdeltaf(self): exp = core.Experiment(self.images_dir, self.roi_zip_path) exp.separate() - exp.calc_deltaf(4) + exp.calc_deltaf(self.fs) self.compare_output(exp, compare_deltaf=True) def test_calcdeltaf_cache(self): exp = core.Experiment(self.images_dir, self.roi_zip_path, self.output_dir) exp.separate() - exp.calc_deltaf(4) + exp.calc_deltaf(self.fs) self.compare_output(exp, compare_deltaf=True) def test_calcdeltaf_notrawf0(self): exp = core.Experiment(self.images_dir, self.roi_zip_path) exp.separate() - exp.calc_deltaf(4, use_raw_f0=False) - self.compare_output(exp, compare_deltaf=True) + exp.calc_deltaf(self.fs, use_raw_f0=False) + # We did not use this setting to generate the expected values, so can't + # compare the output against the target. + self.compare_output(exp, compare_deltaf=False) + # Check sizes are correct + expected_shape = len(self.roi_paths), len(self.image_names) + self.assert_equal(np.shape(exp.deltaf_result), expected_shape) def test_calcdeltaf_notacrosstrials(self): exp = core.Experiment(self.images_dir, self.roi_zip_path) exp.separate() - exp.calc_deltaf(4, across_trials=False) - self.compare_output(exp, compare_deltaf=True) + exp.calc_deltaf(self.fs, across_trials=False) + # We did not use this setting to generate the expected values, so can't + # compare the output against the target. + self.compare_output(exp, compare_deltaf=False) + # Check sizes are correct + expected_shape = len(self.roi_paths), len(self.image_names) + self.assert_equal(np.shape(exp.deltaf_result), expected_shape) def test_calcdeltaf_notrawf0_notacrosstrials(self): exp = core.Experiment(self.images_dir, self.roi_zip_path) exp.separate() - exp.calc_deltaf(4, use_raw_f0=False, across_trials=False) - self.compare_output(exp, compare_deltaf=True) + exp.calc_deltaf(self.fs, use_raw_f0=False, across_trials=False) + # We did not use this setting to generate the expected values, so can't + # compare the output against the target. + self.compare_output(exp, compare_deltaf=False) + # Check sizes are correct + expected_shape = len(self.roi_paths), len(self.image_names) + self.assert_equal(np.shape(exp.deltaf_result), expected_shape) def test_matlab(self): exp = core.Experiment(self.images_dir, self.roi_zip_path, self.output_dir) @@ -710,7 +771,7 @@ def test_matlab_from_cache(self): def test_matlab_deltaf(self): exp = core.Experiment(self.images_dir, self.roi_zip_path, self.output_dir) exp.separate() - exp.calc_deltaf(4) + exp.calc_deltaf(self.fs) exp.save_to_matlab() fname = os.path.join(self.output_dir, "matlab.mat") # Check contents of the .mat file @@ -722,14 +783,10 @@ def test_func(self): actual = core.run_fissa( image_path, roi_path, self.output_dir, export_to_matlab=None ) - self.assert_equal(len(actual), 1) - self.assert_equal(len(actual[0]), 1) - self.assert_allclose(actual[0][0], self.expected_00) - expected_file = os.path.join(self.output_dir, "matlab.mat") - self.assertTrue(os.path.isfile(expected_file)) + self.compare_result(actual) # Check contents of the .mat file - M = loadmat(expected_file) - self.assert_allclose(M["result"][0, 0][0][0, 0][0], actual[0, 0]) + expected_file = os.path.join(self.output_dir, "matlab.mat") + self.compare_matlab_expected(expected_file, compare_deltaf=False) def test_func_explict_matlab(self): image_path = os.path.join(self.resources_dir, self.images_dir) @@ -737,14 +794,9 @@ def test_func_explict_matlab(self): actual = core.run_fissa( image_path, roi_path, self.output_dir, export_to_matlab=True ) - self.assert_equal(len(actual), 1) - self.assert_equal(len(actual[0]), 1) - self.assert_allclose(actual[0][0], self.expected_00) + self.compare_result(actual) expected_file = os.path.join(self.output_dir, "matlab.mat") - self.assertTrue(os.path.isfile(expected_file)) - # Check contents of the .mat file - M = loadmat(expected_file) - self.assert_allclose(M["result"][0, 0][0][0, 0][0], actual[0, 0]) + self.compare_matlab_expected(expected_file, compare_deltaf=False) def test_func_explict_nomatlab(self): image_path = os.path.join(self.resources_dir, self.images_dir) @@ -752,9 +804,7 @@ def test_func_explict_nomatlab(self): actual = core.run_fissa( image_path, roi_path, self.output_dir, export_to_matlab=False ) - self.assert_equal(len(actual), 1) - self.assert_equal(len(actual[0]), 1) - self.assert_allclose(actual[0][0], self.expected_00) + self.compare_result(actual) expected_file = os.path.join(self.output_dir, "matlab.mat") self.assertFalse(os.path.isfile(expected_file)) @@ -765,32 +815,22 @@ def test_func_manual_matlab(self): actual = core.run_fissa( image_path, roi_path, self.output_dir, export_to_matlab=fname ) - self.assert_equal(len(actual), 1) - self.assert_equal(len(actual[0]), 1) - self.assert_allclose(actual[0][0], self.expected_00) - self.assertTrue(os.path.isfile(fname)) - # Check contents of the .mat file - M = loadmat(fname) - self.assert_allclose(M["result"][0, 0][0][0, 0][0], actual[0, 0]) + self.compare_result(actual) + self.compare_matlab_expected(fname, compare_deltaf=False) def test_func_nocache(self): image_path = os.path.join(self.resources_dir, self.images_dir) roi_path = os.path.join(self.resources_dir, self.roi_zip_path) actual = core.run_fissa(image_path, roi_path) - self.assert_equal(len(actual), 1) - self.assert_equal(len(actual[0]), 1) - self.assert_allclose(actual[0][0], self.expected_00) + self.compare_result(actual) def test_func_deltaf(self): image_path = os.path.join(self.resources_dir, self.images_dir) roi_path = os.path.join(self.resources_dir, self.roi_zip_path) actual = core.run_fissa( - image_path, roi_path, self.output_dir, freq=4, return_deltaf=True + image_path, roi_path, self.output_dir, freq=self.fs, return_deltaf=True ) - #TODO: Check contents of the .mat file - self.assert_equal(len(actual), 1) - self.assert_equal(len(actual[0]), 1) - # TODO: Check contents of deltaf output + self.compare_deltaf_result(actual) def test_func_deltaf_nofreq(self): image_path = os.path.join(self.resources_dir, self.images_dir) @@ -810,38 +850,14 @@ def __init__(self, *args, **kwargs): self.images_dir = os.path.join(self.resources_dir, "images") self.image_names = ["AVG_A01_R1_small.tif"] self.image_shape = (8, 17) + self.fs = 1 self.roi_zip_path = os.path.join(self.resources_dir, "rois.zip") self.roi_paths = [os.path.join("rois", r) for r in ["01.roi"]] - self.expected_00 = np.array([ - [11.25423074, 0. , 0. , 7.55432252, 19.11182766, - 0. , 6.37473238, 0. , 0. , 0. , - 0. , 1.58567319, 2.28185467, 0. , 16.70204514, - 17.55112746, 17.23642459, 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 14.75392227], - [89.75326173, 81.33290066, 88.77502093, 80.71108594, 85.5315738 , - 78.42423771, 80.3659251 , 84.46124736, 78.04229961, 81.48360449, - 82.12879963, 83.11862592, 83.09085808, 91.22418523, 86.42399606, - 81.05860567, 86.15497276, 81.53903092, 80.53875696, 83.41061814, - 80.59332446, 81.64495893, 86.26057223, 82.47622273, 83.28735277, - 84.00697623, 83.68517083, 83.19829805, 82.06518458], - [ 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. ], - [ 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. ], - [ 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. ], - ]) + self.expected = np.load( + os.path.join( + self.resources_dir, + "expected_py{}.npz".format(sys.version_info.major), + ), + allow_pickle=True, + ) From 51f821d6378714ce5595f4549e80bae827f04ec6 Mon Sep 17 00:00:00 2001 From: Scott Lowe Date: Fri, 25 Jun 2021 12:23:39 +0100 Subject: [PATCH 7/9] TST: Add ExperimentB resources, with 2 ROIs and 3 TIFFs --- fissa/tests/resources/b/expected_py2.npz | Bin 0 -> 15090 bytes fissa/tests/resources/b/expected_py3.npz | Bin 0 -> 16484 bytes fissa/tests/resources/b/images/AVG_A01.tif | Bin 0 -> 21956 bytes fissa/tests/resources/b/images/AVG_A02.tif | Bin 0 -> 21956 bytes fissa/tests/resources/b/images/AVG_A03.tif | Bin 0 -> 21956 bytes fissa/tests/resources/b/rois.zip | Bin 0 -> 530 bytes fissa/tests/resources/b/rois/03.roi | Bin 0 -> 160 bytes fissa/tests/resources/b/rois/04.roi | Bin 0 -> 172 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 fissa/tests/resources/b/expected_py2.npz create mode 100644 fissa/tests/resources/b/expected_py3.npz create mode 100644 fissa/tests/resources/b/images/AVG_A01.tif create mode 100644 fissa/tests/resources/b/images/AVG_A02.tif create mode 100644 fissa/tests/resources/b/images/AVG_A03.tif create mode 100644 fissa/tests/resources/b/rois.zip create mode 100644 fissa/tests/resources/b/rois/03.roi create mode 100644 fissa/tests/resources/b/rois/04.roi diff --git a/fissa/tests/resources/b/expected_py2.npz b/fissa/tests/resources/b/expected_py2.npz new file mode 100644 index 0000000000000000000000000000000000000000..761d8442cdcec37d1ba6687eb6dd3370fba574f5 GIT binary patch literal 15090 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 literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/b/images/AVG_A01.tif b/fissa/tests/resources/b/images/AVG_A01.tif new file mode 100644 index 0000000000000000000000000000000000000000..c474c0db762ba9f2e9ff283f08af086baf0cdcb0 GIT binary patch literal 21956 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 Ia0TXn0q{|hivR!s literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/b/images/AVG_A02.tif b/fissa/tests/resources/b/images/AVG_A02.tif new file mode 100644 index 0000000000000000000000000000000000000000..5c3364c114d7f9781cd02c18ccc9ec4793f626a9 GIT binary patch literal 21956 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 literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/b/images/AVG_A03.tif b/fissa/tests/resources/b/images/AVG_A03.tif new file mode 100644 index 0000000000000000000000000000000000000000..594983aa0dad5c41266aec9c418d67897617f30f GIT binary patch literal 21956 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 Td{$Dvwt0F|`m?3~w*vFON-Bv< literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/b/rois.zip b/fissa/tests/resources/b/rois.zip new file mode 100644 index 0000000000000000000000000000000000000000..93657f1b843650a890d9dde412c6836ffd9050c8 GIT binary patch literal 530 zcmWIWW@Zs#0D*G;n?bg3-!5JNWP>mp5E~fl73F7o=9iW*JO*;PfKY&ekAeN*DF%jv zT|f+_fpXY^CQvwrfr)_y2$>id!HU?xMuV6jaZE4=EQ2YIUBrOFH~_^DIj5G*S_4!I z!eBp`p!k86ft7)Wft!H~=5`p3-FTp=0T5>ZT?%nMBLg$g1dt!t7}$ZB73d2H0Qm-F zAv#zA6o9Egm&4>6Fqi~*Gct)V;hsa4V1$UG=ah~3``6xK*+?v2v)?#zy?(e S62}B{fI>`|!Z<_>7>of5$qEku literal 0 HcmV?d00001 diff --git a/fissa/tests/resources/b/rois/04.roi b/fissa/tests/resources/b/rois/04.roi new file mode 100644 index 0000000000000000000000000000000000000000..04a1c7118412c23865f263f9f1254539a246c056 GIT binary patch literal 172 zcmeawFD+qs%)r3F3WPii+zea?PcbkY>;hsa4V1$U41mHJ3@i+cU};7MW}pddV8{+6 cSs9q1+L(Z9*svI}0w@MkgGCxm$bi8F0E1= Date: Fri, 18 Jun 2021 21:59:29 +0100 Subject: [PATCH 8/9] TST: Add core tests on Experiment B, with 2 ROIs and 3 TIFFs --- fissa/tests/test_core.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/fissa/tests/test_core.py b/fissa/tests/test_core.py index 101b34df..0d43773a 100644 --- a/fissa/tests/test_core.py +++ b/fissa/tests/test_core.py @@ -861,3 +861,27 @@ def __init__(self, *args, **kwargs): ), allow_pickle=True, ) + + +class TestExperimentB(BaseTestCase, ExperimentTestMixin): + """Test core on Experiment B, which has 2 ROIs and 3 TIFFs.""" + + def __init__(self, *args, **kwargs): + super(TestExperimentB, self).__init__(*args, **kwargs) + ExperimentTestMixin.__init__(self) + + self.resources_dir = os.path.join(self.test_directory, "resources", "b") + self.images_dir = os.path.join(self.resources_dir, "images") + self.image_names = ["AVG_A01.tif", "AVG_A02.tif", "AVG_A03.tif"] + self.image_shape = (29, 21) + self.fs = 1 + self.roi_zip_path = os.path.join(self.resources_dir, "rois.zip") + self.roi_paths = [os.path.join("rois", "{:02d}.roi") for r in range(3, 5)] + + self.expected = np.load( + os.path.join( + self.resources_dir, + "expected_py{}.npz".format(sys.version_info.major), + ), + allow_pickle=True, + ) From 80ce9794657871053856f0af21606ce8b0e471be Mon Sep 17 00:00:00 2001 From: Scott Lowe Date: Fri, 25 Jun 2021 12:37:02 +0100 Subject: [PATCH 9/9] TST: Remove ExperimentA tests and resources We only use the (larger) ExperimentB tests instead, since these are better. It takes a lot longer to run both ExperimentA and ExperimentB, so we just run ExperimentB. --- fissa/tests/resources/a/expected_py2.npz | Bin 5454 -> 0 bytes fissa/tests/resources/a/expected_py3.npz | Bin 6022 -> 0 bytes .../resources/a/images/AVG_A01_R1_small.h5 | Bin 14600 -> 0 bytes .../resources/a/images/AVG_A01_R1_small.tif | Bin 13544 -> 0 bytes .../resources/a/new/AVG_A01_R1_small.roi | Bin 152 -> 0 bytes .../resources/a/new/AVG_A01_R1_small.txt | 6 ----- .../tests/resources/a/new/composite-brush.roi | Bin 256 -> 0 bytes fissa/tests/resources/a/new/ellipse2-flat.roi | Bin 1008 -> 0 bytes fissa/tests/resources/a/new/ellipse2.roi | Bin 992 -> 0 bytes .../tests/resources/a/new/selection-brush.roi | Bin 276 -> 0 bytes fissa/tests/resources/a/rois.zip | Bin 278 -> 0 bytes fissa/tests/resources/a/rois/01.roi | Bin 168 -> 0 bytes fissa/tests/resources/a/rois/01.txt | 9 ------- fissa/tests/test_core.py | 24 ------------------ 14 files changed, 39 deletions(-) delete mode 100644 fissa/tests/resources/a/expected_py2.npz delete mode 100644 fissa/tests/resources/a/expected_py3.npz delete mode 100644 fissa/tests/resources/a/images/AVG_A01_R1_small.h5 delete mode 100644 fissa/tests/resources/a/images/AVG_A01_R1_small.tif delete mode 100644 fissa/tests/resources/a/new/AVG_A01_R1_small.roi delete mode 100644 fissa/tests/resources/a/new/AVG_A01_R1_small.txt delete mode 100644 fissa/tests/resources/a/new/composite-brush.roi delete mode 100644 fissa/tests/resources/a/new/ellipse2-flat.roi delete mode 100644 fissa/tests/resources/a/new/ellipse2.roi delete mode 100644 fissa/tests/resources/a/new/selection-brush.roi delete mode 100644 fissa/tests/resources/a/rois.zip delete mode 100644 fissa/tests/resources/a/rois/01.roi delete mode 100644 fissa/tests/resources/a/rois/01.txt diff --git a/fissa/tests/resources/a/expected_py2.npz b/fissa/tests/resources/a/expected_py2.npz deleted file mode 100644 index 5e1305f864825d87dfc562c2cf2214100211f90e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5454 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 diff --git a/fissa/tests/resources/a/images/AVG_A01_R1_small.h5 b/fissa/tests/resources/a/images/AVG_A01_R1_small.h5 deleted file mode 100644 index b3e320a344728f4d13b45a7e5b1c6c22ab81bca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14600 zcmeI1NpGZA6^5_71DKFV1R*6v0(#jiy6v_*p6#+-c9mV_smkSYdnga>p5k_=6Ne!Q zWI%`zDI3HFv58n9mMqz`VaZR(&tM17b5DJSIBIpoj>P^{(|7N8?it?mo^!8%Q<
fV2$EC2kw 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 LU;H0m^p5`q^B62B diff --git a/fissa/tests/resources/a/images/AVG_A01_R1_small.tif b/fissa/tests/resources/a/images/AVG_A01_R1_small.tif deleted file mode 100644 index e2b4d6e5123d076f0198393ae39e1cc9d00d1bf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13544 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 S`%_=-jQ0MQoc0M|`}N;V$1$7$ diff --git a/fissa/tests/resources/a/new/AVG_A01_R1_small.roi b/fissa/tests/resources/a/new/AVG_A01_R1_small.roi deleted file mode 100644 index 2528fd256e168e60692a6cba345137b4c7eddf5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 vcmeawFD+qs%)r3F2!t#QoD6J0Ht`?=sEYxpj}1t309i~7%wWwRQHlTnsip%A diff --git a/fissa/tests/resources/a/new/AVG_A01_R1_small.txt b/fissa/tests/resources/a/new/AVG_A01_R1_small.txt deleted file mode 100644 index 65323b86..00000000 --- a/fissa/tests/resources/a/new/AVG_A01_R1_small.txt +++ /dev/null @@ -1,6 +0,0 @@ -2 1 -1 3 -5 4 -7 1 -2 1 -9 2 diff --git a/fissa/tests/resources/a/new/composite-brush.roi b/fissa/tests/resources/a/new/composite-brush.roi deleted file mode 100644 index 8ab6aa91fdca5a13a2a601ca3c3ca7ff6ff59d1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmeawFD+qs%*epN%D}?F$-u*a9VlQIW;g&6cW40O1q=-KAR34r8KCS3sBDlLkUR)D g3Lx}=*f2d{Hjoc8%h3U%4$cPZgRzm#0t%B20OWWUSO5S3 diff --git a/fissa/tests/resources/a/new/ellipse2-flat.roi b/fissa/tests/resources/a/new/ellipse2-flat.roi deleted file mode 100644 index a5c9cfd70d87783e38b722a362c7fbf4c4bbade5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1008 zcma)*X-HI27=}+e<5pG*DX1ivsP&`BJ(uzQL@AesG|^OCYg}sDm~zM^N=wXAD{EYm zT*$55MnwCeMv;+9f>thtm9|)%{dv4BWGTYzV2 zu~myK_h-L!O%1Q+UA&vSa5wJC-Fb>8?{B{0Vm0s3B=P>`Xq=ahnw9+jxU`plFHiVA z7goV{k&+7QC{ZRQnbM2mpGYW1o=%aGc@$a|O+o%v6cFV@K2uWioEs+R!bI9S7)Lf; zle96Znl?;Kk)fLpi84zuU(|~aQg=M}cfrGk4`@@>pxR~tsx$?1)OJwz6d^Xa3IQ%w za4mC$U5y#c71J=XjD>!u3gYlt@V_fo$HCxWFN`;dV9~FOEz zD{{BXP;9anHDmT@kCNcgIZupi?Z8J5dn{a3k~kxQ);gM#$>>|MjCe=3^?9_dt&v>h zB_w&UlYDFC6u7pOfyIHB13K5nSyaPze(D!=#O*2p|+ yGmKFGW(IeDOrUXS0L|gnXvv?3`uO9O*F*b_py{pD|Dnj3Tp*bpV+tl?_CEm(mHPDn diff --git a/fissa/tests/resources/a/new/ellipse2.roi b/fissa/tests/resources/a/new/ellipse2.roi deleted file mode 100644 index 7337649b859d2ee86308474fc4a2374771e17da6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 992 zcmbV~eN4=89LK+Rm##}iYmIKv!$^6Ex$bI=@B3rLp=R2&gk{xTLd7cPsRt=fAuB0m z)smi8wqmG-ijJu+&|NdmNasn{hI7{Js?@VAHEo4(SN80Pj@o3-K$4qwI?dncaeXx z8rkhJNR|{}b5$x<)r~^!KZ4nbdQ9KV;1H&Sd~pn9P92a+S3`VVg~Aq&PDOB?%HZ>{ z2TL;NBIH&PqEi}hAXSMI-B~Dn+lHz~QMjHQj*eR%Fdmm+@G4<=W;|JkKBg&7oixob zkKETV^1fJ0i|Rg8fX9V zb)dMk1aZP}^T`4jmg#X{qe52$LwBJHJ%d4bRqz7u&Koh%pMZ~h7Gg;23R74WOr-{x zJbN+t<`X`=)M3Cyg|{U)&>L@nF+T}Ul|ZNB8QK$NxGm_fcje>Cz+P0=-{rW6FT&d$3>BBrTIfoxR7|e4|$MfQ14X-)n#+$X@d1r%$_nl{a*jR_j z9>Z`6ZGv}{5dmsPXlrw@vBDqQe@Jk!NQt99O61CPD17LP@|_W=>2VpKv;SQD1nZmm A6951J diff --git a/fissa/tests/resources/a/new/selection-brush.roi b/fissa/tests/resources/a/new/selection-brush.roi deleted file mode 100644 index 270954cd11f6a94cf61cc6c8b4194aacc454ea08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmeawFD+qs%*epN%D}?F#lXXW9jIa#X1D?pcQ^pV3m6#e8=!0;AIt`df#l%q2T*nc oP#lTvr~nanWME)GVGBUT9f0CUY?zsj1_<-P>;*u60|UhX03uEuod5s; diff --git a/fissa/tests/resources/a/rois.zip b/fissa/tests/resources/a/rois.zip deleted file mode 100644 index 841a867a56993eee83f30eff68f511eb652a857b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmWIWW@Zs#00E1HY(M6;6B$+j*&xgY#0G|XMfsVY`K2WckAYlPAmm`+Vc