def test_distance(self): """BaseUsage distance() should return dist between two BUs""" #absolute numbers, will normalize to calculate distance self.assertFloatEqual(BaseUsage('GC').distance(BaseUsage('AU')),1) self.assertFloatEqual(BaseUsage('AU').distance(BaseUsage('GC')),1) self.assertFloatEqual(BaseUsage('GCAU').distance(BaseUsage('AUAU')),.5) #should work even against dict with 'T's self.assertFloatEqual(BaseUsage('GCAU').distance(\ BaseUsage({'A':2,'T':2,'C':0,'G':0,})),.5) #rounding error self.assertEqual(BaseUsage('ACG').distance(BaseUsage('CCGGAA')),0) #normalized - as in unit simplex ag = BaseUsage('AG') ag.normalize() uc = BaseUsage('UC') uc.normalize() self.assertFloatEqual(ag.distance(uc),1) self.assertFloatEqual(BaseUsage({'A':0.4,'G':0.1,'C':0.4,'U':0.1})\ .distance(BaseUsage({'A':0.1,'G':0.4,'U':0.4,'C':0.1})),0.6) self.assertFloatEqual(BaseUsage({'A':0.25,'G':0.25,'C':0.25,'U':0.25})\ .distance(BaseUsage({'A':0.25,'G':0.25,'U':0.25,'C':0.25})),0.0) self.assertFloatEqual(BaseUsage({'A':0.245,'G':0.255,'C':0.245,\ 'U':0.255}).distance(BaseUsage({'A':0.255,'G':0.245,'U':0.245,\ 'C':0.255})),0.02) self.assertFloatEqual(BaseUsage({'A':0.245,'G':0.255,'C':0.245,\ 'U':0.255}).distance(BaseUsage({'A':0.25,'G':0.25,'U':0.25,\ 'C':0.25})),0.01) self.assertFloatEqual(BaseUsage({'A':0.248,'G':0.252,'C':0.248,\ 'U':0.252}).distance(BaseUsage({'A':0.25,'G':0.25,'U':0.25,\ 'C':0.25})),0.004)
def test_normalize(self): """BaseUsage normalize should work when empty""" b = BaseUsage() b.normalize() self.assertEqual(b, {'U':0,'C':0,'A':0,'G':0}) b = BaseUsage('AACG') b.normalize() self.assertEqual(b, {'U':0, 'C':0.25, 'A':0.5, 'G':0.25})
def test_setitem(self): """BaseUsage should map keys on setitem""" b = BaseUsage() b['t'] = 3 b['G'] = 3 b.normalize() i = b.items() i.sort() self.assertEqual(i, [('A',0.0),('C',0.0),('G',0.5),('U',0.5)])
def test_getitem(self): """BaseUsage should map key on getitem""" b = BaseUsage({'a':3, 'T':2, 'X':1}) self.assertEqual(b['X'], 1) self.assertEqual(b['A'], 3) self.assertEqual(b['U'], 2) self.assertEqual(b['a'], 3) self.assertEqual(b['t'], 2) b.normalize() assert 'X' not in b self.assertFloatEqual(b['A'], 0.6) self.assertFloatEqual(b['u'], 0.4)
def test_init_data(self): """BaseUsage should init with arbitrary data""" b = BaseUsage('UUUUUGGGCA') self.assertEqual(b, {'U':5, 'G':3, 'C':1, 'A':1}) b.normalize() self.assertEqual(b, {'U':0.5, 'G':0.3, 'C':0.1, 'A':0.1})