def test_load_aromafile(): contents = """2, 3, 5""".strip() expected = [['unknown'], ['movement'], ['movement'], ['unknown'], ['movement']] with tests.testdir() as testdir: fname = op.join(testdir, 'labels.txt') with open(fname, 'wt') as f: f.write(contents) # Too many labels in the file lblobj = vollbls.VolumeLabels(3) with pytest.raises(fixlbls.InvalidLabelFileError): lblobj.load(fname) # Not enough labels in the file - # this is ok. Remaining labels # should be given 'Unknown' lblobj = vollbls.VolumeLabels(6) lblobj.load(fname) for i in range(4): assert lblobj.getLabels(i) == expected[i] assert lblobj.getLabels(5) == ['unknown'] # Right number of labels lblobj = vollbls.VolumeLabels(5) lblobj.load(fname) for i in range(4): assert lblobj.getLabels(i) == expected[i]
def test_clearLabels(): ncomps = 5 labels = [('Label {}'.format(i), 'Label b') for i in range(ncomps)] lowers = [[l.lower() for l in ll] for ll in labels] lblobj = vollbls.VolumeLabels(ncomps) for i in range(ncomps): for l in labels[i]: lblobj.addLabel(i, l) calledValue = [] def removed(lo, topic, value): calledValue.append(value) lblobj.register('callback', removed, topic='removed') expectedAllLabels = list(it.chain(*[list(l) for l in lowers])) for i in range(ncomps): calledValue = [] lblobj.clearLabels(i) assert calledValue[0] == list(zip([i, i], lowers[i])) assert lblobj.getLabels(i) == [] [expectedAllLabels.remove(l) for l in lowers[i]] assert sorted(lblobj.getAllLabels()) == sorted(set(expectedAllLabels))
def test_removeLabel(): ncomps = 5 labels = ['Label {}'.format(i) for i in range(ncomps)] lowers = [lbl.lower() for lbl in labels] lblobj = vollbls.VolumeLabels(ncomps) for i in range(ncomps): lblobj.addLabel(i, labels[i]) called = [False] def removed(*a): called[0] = True lblobj.register('callback', removed, topic='removed') assert not lblobj.removeLabel(0, 'notalabel') assert not called[0] for i in range(ncomps): called[0] = False assert lblobj.removeLabel(i, labels[i]) assert called[0] assert lblobj.getLabels(i) == [] assert sorted(lblobj.getAllLabels()) == lowers[i + 1:]
def test_save(): expected = textwrap.dedent(""" 1, Signal, Default mode, False 2, Unknown, False 3, Unclassified noise, True 4, Movement, True [3, 4] """).strip() lbls = vollbls.VolumeLabels(4) lbls.addLabel(0, 'Signal') lbls.addLabel(0, 'Default mode') lbls.addLabel(1, 'Unknown') lbls.addLabel(2, 'Unclassified noise') lbls.addLabel(3, 'Movement') with tests.testdir() as testdir: fname = op.join(testdir, 'labels.txt') # Test saving without dirname lbls.save(fname) exp = '.\n{}'.format(expected) with open(fname, 'rt') as f: assert f.read().strip() == exp.strip() # And with dirname lbls.save(fname, 'path/to/analysis.ica') exp = 'path/to/analysis.ica\n{}'.format(expected) with open(fname, 'rt') as f: assert f.read().strip() == exp.strip()
def test_removeComponent(): ncomps = 5 labels = ['label a', 'label b', 'label c', 'label d', 'label e'] lblobj = vollbls.VolumeLabels(ncomps) called = [False] for i in range(ncomps): lblobj.addLabel(i, labels[i]) def removed(*a): called[0] = True lblobj.register('callback', removed, topic='removed') assert not lblobj.removeComponent('notalabel', 0) assert not called[0] for i in range(ncomps): called[0] = False assert lblobj.removeComponent(labels[i], i) assert called[0] assert lblobj.getComponents(labels[i]) == [] assert sorted(lblobj.getAllLabels()) == labels[i + 1:]
def test_add_get_hasComponents(): ncomps = 5 labels = ['label a', 'label b', 'label c', 'label d', 'label e'] lblobj = vollbls.VolumeLabels(ncomps) called = [False] def labelAdded(lo, topic, value): called[0] = True lblobj.register('callback', labelAdded, topic='added') for i in range(ncomps): called[0] = False assert lblobj.addComponent(labels[i], i) assert called[0] assert lblobj.hasComponent(labels[i], i) assert lblobj.hasLabel(i, labels[i]) assert lblobj.getComponents(labels[i]) == [i] called[0] = False assert not lblobj.addComponent(labels[i], i) assert not called[0]
def test_load_fixfile_long(): contents = """ path/to/analysis.ica 1, Signal, False 2, Unknown, False 3, Movement, True 4, Unclassified Noise, Random label, True [3, 4] """.strip() expected = [['signal'], ['unknown'], ['movement'], ['unclassified noise', 'random label']] with tests.testdir() as testdir: fname = op.join(testdir, 'labels.txt') with open(fname, 'wt') as f: f.write(contents) # Too many labels in the file lblobj = vollbls.VolumeLabels(3) with pytest.raises(fixlbls.InvalidLabelFileError): lblobj.load(fname) # Not enough labels in the file - # this is ok. Remaining labels # should be given 'Unknown' lblobj = vollbls.VolumeLabels(5) lblobj.load(fname) for i in range(4): assert lblobj.getLabels(i) == expected[i] assert lblobj.getLabels(4) == ['unknown'] # Right number of labels lblobj = vollbls.VolumeLabels(4) lblobj.load(fname) for i in range(4): assert lblobj.getLabels(i) == expected[i]
def __registerOverlay(self, overlay): """Called by :meth:`__selectedOverlayChanged`. Registers with the given overlay. Returns the :class:`.VolumeLabels` instance associated with the overlay (creating it if necessary). """ from fsleyes.views.lightboxpanel import LightBoxPanel self.__overlay = overlay opts = self.displayCtx.getOpts(overlay) volLabels = self.overlayList.getData(overlay, 'VolumeLabels', None) if volLabels is None: volLabels = vollabels.VolumeLabels(overlay.shape[3]) self.overlayList.setData(overlay, 'VolumeLabels', volLabels) # Initialse component with an 'Unknown' label for i in range(overlay.shape[3]): volLabels.addLabel(i, 'Unknown') # We only need to listen for volume/label # changes if we are in a LightBoxPanel if not isinstance(self.__canvasPanel, LightBoxPanel): return volLabels opts.addListener('volume', self.name, self.__volumeChanged) # Whenever the classification labels change, # update the text annotation on the canvas. # We do this on the idle loop because otherwise, # when a new label is added, the LookupTable # instance may not have been updated to contain # the new label - see ComponentGrid.__onTagAdded. for topic in ['added', 'removed']: volLabels.register(self.name, self.__labelsChanged, topic=topic, runOnIdle=True) self.__updateTextAnnotation() return volLabels
def test_add_get_hasLabel(): ncomps = 5 labels = ['Label {}'.format(i) for i in range(ncomps)] lowers = [lbl.lower() for lbl in labels] lblobj = vollbls.VolumeLabels(ncomps) called = [False] def labelAdded(lo, topic, value): called[0] = True lblobj.register('callback', labelAdded, topic='added') for i in range(ncomps): called[0] = False assert lblobj.addLabel(i, labels[i]) assert called[0] assert lblobj.getLabels(i) == [lowers[i]] assert lblobj.getDisplayLabel(lowers[i]) == labels[i] assert lblobj.hasLabel(i, labels[i]) assert lblobj.hasLabel(i, lowers[i]) # Attempt to add the same label should # return False called[0] = False assert not lblobj.addLabel(i, labels[i]) assert not called[0] # Labels are case insensitive assert not lblobj.addLabel(i, lowers[i]) assert not called[0] assert sorted(lblobj.getAllLabels()) == lowers
def test_clearComponents(): ncomps = 5 labels = [('label {}'.format(i), 'label b') for i in range(ncomps)] lblobj = vollbls.VolumeLabels(ncomps) for i in range(ncomps): for l in labels[i]: lblobj.addLabel(i, l) calledValue = [] def removed(lo, topic, value): calledValue.append(value) lblobj.register('callback', removed, topic='removed') lblobj.clearComponents('label b') assert sorted(calledValue[0]) == list( zip(list(range(ncomps)), ['label b'] * ncomps)) assert sorted(lblobj.getAllLabels()) == [l[0] for l in labels] # expectedAllLabels = list(it.chain(*[list(l) for l in lowers])) labels = [l[0] for l in labels] for i in range(ncomps): calledValue = [] lblobj.clearComponents(labels[i]) assert calledValue[0] == [(i, labels[i])] assert lblobj.getComponents(labels[i]) == [] assert lblobj.getLabels(i) == [] assert sorted(lblobj.getAllLabels()) == labels[i + 1:]