def calculate(self): if len( self.trees) == 1: self.tree = self.trees[0] else: print("! upgma - in !") while len(self.trees) > 2: t,g = len(self.trees), len(self.genomes) i,j = getMatrixMin(self.distances) newGenome = self.grimm.midGenome(self.genomes[i], self.genomes[j]) newTree = Tree( newGenome ) newTree.addConnection( self.trees[i] ) newTree.addConnection( self.trees[j] ) self.trees[i] = newTree self.trees.pop(j) self.genomes[i] = newGenome self.genomes.pop(j) # self.distances = self.grimm.getUpdatedDistMatrix( self.genomes, self.distances, (i,j) ) self.distances = self.grimm.getDistMatrix( self.genomes ) if t - 1 != len(self.trees) or g - 1 != len(self.genomes): print newGenome print newTree print (i,j) print self.genomes print self.trees raise Exception print(";") print("! upgma - out !") if len( self.trees) == 2: self.tree = self.trees[0] self.tree.addConnection( self.trees[1] ) else: print newGenome print newTree print (i,j) print self.trees print self.genomes raise Exception assert self.tree.isBinary()
def rTreeBuilder(self, keyLabel, partsToSubs, labelsToTips, partsToKeep,partsToTree): subLabels = partsToSubs[keyLabel] if subLabels == "TIP": return [ labelsToTips[keyLabel], ] elif keyLabel in partsToKeep: # newTree = Tree( Genome(name='place holder')) correspondingTree = partsToTree[keyLabel] newTree = Tree( correspondingTree.genome ) for sLabel in subLabels: sTrees = self.rTreeBuilder(sLabel, partsToSubs, labelsToTips, partsToKeep, partsToTree) for t in sTrees: newTree.addConnection(t) return [newTree] else: out = [] for sLabel in subLabels: out += self.rTreeBuilder(sLabel, partsToSubs, labelsToTips, partsToKeep, partsToTree) return out
def genomeEstimator(self, tree, caller=None): if caller is None and tree.isLeaf(): self.genomeEstimator(tree[0]) elif tree.genome.name != "place holder" and False: return elif caller is None: for subTree in tree: self.genomeEstimator(subTree, tree) if len(tree.subs) == 3: edgeMidA = self.grimm.midGenome(tree[1].genome, tree[2].genome) tSetA = self.grimm.getTransformations(tree.subs[0].genome, edgeMidA) tSetA = [tran[1] for tran in tSetA] edgeMidB = self.grimm.midGenome(tree[0].genome, tree[2].genome) tSetB = self.grimm.getTransformations(tree.subs[1].genome, edgeMidB) tSetB = [tran[1] for tran in tSetB] pairDists = [self.grimm.getDistance(tSetA[i], tSetB[i]) for i in range(min( len(tSetA), len(tSetB)))] mindex = pairDists.index( min(pairDists) ) newGenome = self.grimm.midGenome( tSetA[mindex], tSetB[mindex] ) tree.setGenome(newGenome) elif len(tree.subs) == 2: tree.setGenome(tree[1].genome) subs = [sub for sub in tree[1]] for sub in subs: if sub is not tree: tree.addConnection(sub) tree[1].breakConnection(sub) tree.breakConnection( tree[1]) self.genomeEstimator(tree) else: m = self.grimm.getDistMatrix( [s.genome for s in tree]) (minX, minY) = getMatrixMin(m) newSubTree = Tree( Genome( name="place holder")) a, b = tree[minX], tree[minY] newSubTree.addConnection(a) newSubTree.addConnection(b) tree.breakConnection(a) tree.breakConnection(b) tree.addConnection(newSubTree) self.genomeEstimator(tree) elif not tree.isLeaf(): for subTree in tree: if subTree is not caller: self.genomeEstimator(subTree, tree) subTrees = [sub for sub in tree if sub is not caller] if len(subTrees) == 2: newGenome = self.grimm.midGenome( subTrees[0].genome, subTrees[1].genome ) tree.setGenome(newGenome) else: m = self.grimm.getDistMatrix( [s.genome for s in subTrees]) (minX, minY) = getMatrixMin(m) a, b = subTrees[minX], subTrees[minY] newSubTree = Tree( Genome( name="place holder")) a, b = subTrees[minX], subTrees[minY] newSubTree.addConnection(a) newSubTree.addConnection(b) tree.breakConnection(a) tree.breakConnection(b) tree.addConnection(newSubTree) self.genomeEstimator(tree, caller)