Example #1
0
	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()
Example #2
0
	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
Example #3
0
	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)