def get_best_TC_tree(
    dv_file,
    gm_file,
    label_file,
    tree_files,
    name='unnamed_tree',
    ):
    """
    Given a distance-variance file, a genome-map file, a label file
    and a number of tree files
    """

    if not isinstance(tree_files, list):
        return Tree.new_treecollection_tree(dv_file, gm_file,
                label_file, tree_files, name)
    best_score = float('inf')
    best_tree = None
    starts = len(tree_files)

    for i in range(starts):
        guide = tree_files[i]
        current_tree = Tree.new_treecollection_tree(dv_file, gm_file,
                label_file, guide, name)
        if current_tree.score < best_score:
            best_score = current_tree.score
            best_tree = current_tree

    return best_tree
 def _put_best_TC_trees(self, tmpdir="/tmp", overwrite=True, max_guide_trees=-1):
     rec_list = self.get_cluster_records_with_memberships()
     for (rec, members) in rec_list:
         print "Calculating treecollection tree for {0}".format(rec.name),
         if rec.name in self.inferred_trees and overwrite == False:
             print "Skipping - already calculated (overwrite set to False)"
             continue
         guidetrees = [self.keys_to_records[member].tree for member in members]
         if max_guide_trees > 0:
             guidetrees = guidetrees[:max_guide_trees]
         TCtrees = []
         pref = rec._write_temp_tc(make_guide_tree=False, tmpdir=tmpdir)
         pref = "{0}/{1}".format(tmpdir, pref)
         dv_file = pref + "_dv.txt"
         labels_file = pref + "_labels.txt"
         map_file = pref + "_map.txt"
         if len(guidetrees) > 1:
             print "(using best of {0} guidetrees)".format(len(guidetrees))
         else:
             print "(using single guidetree)"
         for t in guidetrees:
             guidetree_file = "{0}/{1}.nwk".format(tmpdir, t.name)
             n = t.reroot_newick()
             with open(guidetree_file, "w") as writer:
                 writer.write(n)
             TCtrees.append(Tree.new_treecollection_tree(dv_file, map_file, labels_file, guidetree_file, rec.name))
         best = min(TCtrees, key=lambda x: x.score)
         rec.tree = best
         self.inferred_trees[rec.name] = best
     self.update_scores()
 def _put_best_TC_trees(
     self,
     tmpdir='/tmp',
     overwrite=True,
     max_guide_trees=-1,
 ):
     rec_list = self.get_cluster_records_with_memberships()
     for (rec, members) in rec_list:
         print 'Calculating treecollection tree for {0}'.format(rec.name),
         if rec.name in self.inferred_trees and overwrite == False:
             print 'Skipping - already calculated (overwrite set to False)'
             continue
         guidetrees = [
             self.keys_to_records[member].tree for member in members
         ]
         if max_guide_trees > 0:
             guidetrees = guidetrees[:max_guide_trees]
         TCtrees = []
         pref = rec._write_temp_tc(make_guide_tree=False, tmpdir=tmpdir)
         pref = '{0}/{1}'.format(tmpdir, pref)
         dv_file = pref + '_dv.txt'
         labels_file = pref + '_labels.txt'
         map_file = pref + '_map.txt'
         if len(guidetrees) > 1:
             print '(using best of {0} guidetrees)'.format(len(guidetrees))
         else:
             print '(using single guidetree)'
         for t in guidetrees:
             guidetree_file = '{0}/{1}.nwk'.format(tmpdir, t.name)
             n = t.reroot_newick()
             with open(guidetree_file, 'w') as writer:
                 writer.write(n)
             TCtrees.append(
                 Tree.new_treecollection_tree(dv_file, map_file,
                                              labels_file, guidetree_file,
                                              rec.name))
         best = min(TCtrees, key=lambda x: x.score)
         rec.tree = best
         self.inferred_trees[rec.name] = best
     self.update_scores()