Пример #1
0
 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)
Пример #2
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)
Пример #3
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)
Пример #4
0
    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)
Пример #5
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)
Пример #6
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)