""" Tests on ND2s that have 1 or 2 cycles only. This is unlike the ND2s I work with typically, which are all done over very long periods of time. """ from nd2reader import Nd2 import numpy as np import unittest class Monocycle1Tests(unittest.TestCase): def setUp(self): self.nd2 = Nd2("/var/nd2s/simone1.nd2") def tearDown(self): self.nd2.close() def test_channels(self): self.assertListEqual(self.nd2.channels, ['Cy3Narrow', 'TxRed-modified', 'FITC', 'DAPI']) def test_pixel_size(self): self.assertGreater(self.nd2.pixel_microns, 0.0) def test_select(self): manual_images = [] for _, image in zip(range(20), self.nd2): if image is not None and image.channel == 'FITC': manual_images.append(image) filter_images = [] for image in self.nd2.select(channels='FITC'): filter_images.append(image) if len(filter_images) == len(manual_images): break self.assertEqual(len(manual_images), len(filter_images)) self.assertGreater(len(manual_images), 0) for a, b in zip(manual_images, filter_images): self.assertTrue(np.array_equal(a, b)) self.assertEqual(a.index, b.index) self.assertEqual(a.field_of_view, b.field_of_view) self.assertEqual(a.channel, b.channel) def test_select_order_all(self): # If we select every possible image using select(), we should just get every image in order n = 0 for image in self.nd2.select(channels=['Cy3Narrow', 'DAPI', 'FITC', 'TxRed-modified'], z_levels=list(range(35)), fields_of_view=list(range(5))): while True: indexed_image = self.nd2[n] if indexed_image is not None: break n += 1 self.assertTrue(np.array_equal(image, indexed_image)) n += 1 if n > 100: # Quit after the first hundred images just to save time. # If there's a problem, we'll have seen it by now. break def test_select_order_subset(self): # Test that images are always yielded in increasing order. This guarantees that no matter what subset of images # we're filtering, we still get them in the chronological order they were acquired n = -1 for image in self.nd2.select(channels='FITC', z_levels=[0, 1], fields_of_view=[1, 2, 4]): self.assertGreater(image.index, n) self.assertEqual(image.channel, 'FITC') self.assertIn(image.field_of_view, (1, 2, 4)) self.assertIn(image.z_level, (0, 1)) n = image.index if n > 100: break class Monocycle2Tests(unittest.TestCase): def setUp(self): self.nd2 = Nd2("/var/nd2s/hawkjo.nd2") def tearDown(self): self.nd2.close() def test_pixel_size(self): self.assertGreater(round(self.nd2.pixel_microns, 2), 0.26) def test_select(self): manual_images = [] for _, image in zip(range(20), self.nd2): if image is not None and image.channel == 'HHQ 500 LP 1': manual_images.append(image) filter_images = [] for image in self.nd2.select(channels='HHQ 500 LP 1'): filter_images.append(image) if len(filter_images) == len(manual_images): break self.assertEqual(len(manual_images), len(filter_images)) self.assertGreater(len(manual_images), 0) for a, b in zip(manual_images, filter_images): self.assertTrue(np.array_equal(a, b)) self.assertEqual(a.index, b.index) self.assertEqual(a.field_of_view, b.field_of_view) self.assertEqual(a.channel, b.channel) def test_select_order_all(self): # If we select every possible image using select(), we should just get every image in order n = 0 for image in self.nd2.select(channels=['HHQ 500 LP 1', 'HHQ 500 LP 2'], z_levels=[0], fields_of_view=list(range(100))): while True: indexed_image = self.nd2[n] if indexed_image is not None: break n += 1 self.assertTrue(np.array_equal(image, indexed_image)) n += 1 if n > 100: # Quit after the first hundred images just to save time. # If there's a problem, we'll have seen it by now. break def test_select_order_subset(self): # Test that images are always yielded in increasing order. This guarantees that no matter what subset of images # we're filtering, we still get them in the chronological order they were acquired n = -1 for image in self.nd2.select(channels='HHQ 500 LP 2', z_levels=[0], fields_of_view=[1, 2, 4]): self.assertGreater(image.index, n) self.assertEqual(image.channel, 'HHQ 500 LP 2') self.assertIn(image.field_of_view, (1, 2, 4)) self.assertEqual(image.z_level, 0) n = image.index if n > 100: break class OneTests(unittest.TestCase): def test_opens(self): # just testing that this doesn't throw an exception nd2 = Nd2("/var/nd2s/001.nd2") self.assertIsNotNone(nd2) nd2.close()