def test_insert_fully_resolved(self): exp = self.final_multiple_fully_resolved placements, backbone = parse_jplace(self.jplacedata_multiple) obs = insert_fully_resolved(placements, backbone) self.assertEqual({n.name for n in obs.tips()}, {n.name for n in exp.tips()}) self.assertEqual(obs.compare_rfd(exp), 0) self.assertAlmostEqual(obs.compare_tip_distances(exp), 0)
def test_parse_jplace_multiple_per_fragment(self): columns = [ 'fragment', 'edge_num', 'likelihood', 'like_weight_ratio', 'distal_length', 'pendant_length' ] exp_df = [ [ "82", 361, 0.01013206496780672, 1, 0.02652932626620403, 0.039354548684623215 ], [ "99", 308, 0.04520741687623886, 1, 0.11020044356641526, 0.06550337922097477 ], # tied on like_weight_ratio but lower pendant [ "99", 309, 0.04520741687623886, 1, 0.11020044356641526, 0.00550337922097477 ], [ "55", 139, 0.09563944060686769, 1, 0.014593217782258146, 0.04537214236560885 ], # tied higher like_weight_ratio [ "55", 138, 0.09563944060686769, 10, 0.014593217782258146, 0.04537214236560885 ] ] exp_df = pd.DataFrame(exp_df, columns=columns) # ...adjust jplace data data = json.loads(self.jplacedata) keep = [] for placement in data['placements']: if placement['n'][0] == '82': keep.append(placement) elif placement['n'][0] == '99': placement['p'].append([ 309, 0.04520741687623886, 1, 0.11020044356641526, 0.00550337922097477 ]) keep.append(placement) elif placement['n'][0] == '55': placement['p'].append([ 138, 0.09563944060686769, 10, 0.014593217782258146, 0.04537214236560885 ]) keep.append(placement) data['placements'] = keep data = json.dumps(data) exp_tree = self.tree obs_df, obs_tree = parse_jplace(data) obs_tree = to_skbio_treenode(obs_tree) pdt.assert_frame_equal(obs_df, exp_df) self.assertEqual(obs_tree.compare_rfd(exp_tree), 0)
def placement(placements, output, method): if method == 'fully-resolved': f = insert_fully_resolved elif method == 'multifurcating': f = insert_multifurcating else: raise ValueError("Unknown method: %s" % method) placement_df, tree = parse_jplace(open(placements).read()) sktree = f(placement_df, tree) sktree.write(output)
def test_place_jplace_square_braces(self): self.jplacedata = json.loads(self.jplacedata) treestr = self.jplacedata['tree'] treestr = re.sub(r"{(\d+)}", r"[\1]", treestr) self.jplacedata['tree'] = treestr self.jplacedata = json.dumps(self.jplacedata) exp_tree = self.tree obs_df, obs_tree = parse_jplace(self.jplacedata) obs_tree = to_skbio_treenode(obs_tree) self.assertEqual(obs_tree.compare_rfd(exp_tree), 0) for n in obs_tree.traverse(include_self=False): self.assertTrue(n.edge_num >= 0)
def test_parse_jplace_simple(self): columns = [ 'fragment', 'edge_num', 'likelihood', 'like_weight_ratio', 'distal_length', 'pendant_length' ] exp_df = [[ "82", 361, 0.01013206496780672, 1, 0.02652932626620403, 0.039354548684623215 ], [ "99", 308, 0.04520741687623886, 1, 0.11020044356641526, 0.06550337922097477 ], [ "43", 309, 0.04054866161921744, 1, 0.010712923050783987, 0.020946988900520196 ], [ "195", 277, 0.01918907908397749, 1, 0.03065741838803451, 0.04513513498399864 ], [ "162", 55, 0.01758935282545493, 1, 0.0033199487685078776, 0.05388735804976052 ], [ "56", 81, 0.2366882303770561, 1, 0.04172580852519453, 0.0007060238727097983 ], [ "91", 105, 0.0001863393767883581, 1, 0.04578898721138839, 0.08655004339151215 ], [ "174", 89, 0.01216463967379211, 1, 0.04707020642820376, 0.045206727542450205 ], [ "5", 143, 0.012162345471765756, 1, 0.023797389484252734, 0.10447375403452556 ], [ "55", 139, 0.09563944060686769, 1, 0.014593217782258146, 0.04537214236560885 ]] exp_df = pd.DataFrame(exp_df, columns=columns) exp_tree = self.tree obs_df, obs_tree = parse_jplace(self.jplacedata) obs_tree = to_skbio_treenode(obs_tree) pdt.assert_frame_equal(obs_df, exp_df) self.assertEqual(obs_tree.compare_rfd(exp_tree), 0)
def test_insert_fully_resolved_multiple_placements(self): exp = self.final_multiple_fully_resolved placements, backbone = parse_jplace(self.jplacedata_multiple) # add another placement elsewhere that we would not keep # as it's ratio is lower dup1 = placements.iloc[0].copy() dup1['like_weight_ratio'] -= 0.5 dup1['edge_num'] += 1 # add another placement elsewhere that we would not keep # as, though its ratio is the same, its pendant is larger dup2 = placements.iloc[1].copy() dup2['pendant_length'] += 0.5 dup2['edge_num'] += 1 placements = pd.concat([placements, pd.DataFrame([dup1, dup2])]) obs = insert_fully_resolved(placements, backbone) self.assertEqual({n.name for n in obs.tips()}, {n.name for n in exp.tips()}) self.assertEqual(obs.compare_rfd(exp), 0) self.assertAlmostEqual(obs.compare_tip_distances(exp), 0)