aboutsummaryrefslogtreecommitdiff
path: root/web/webqtl/heatmap/slink.py
diff options
context:
space:
mode:
Diffstat (limited to 'web/webqtl/heatmap/slink.py')
-rwxr-xr-xweb/webqtl/heatmap/slink.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/web/webqtl/heatmap/slink.py b/web/webqtl/heatmap/slink.py
new file mode 100755
index 00000000..3de41de4
--- /dev/null
+++ b/web/webqtl/heatmap/slink.py
@@ -0,0 +1,141 @@
+# Copyright (C) University of Tennessee Health Science Center, Memphis, TN.
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Affero General Public License
+# as published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Affero General Public License for more details.
+#
+# This program is available from Source Forge: at GeneNetwork Project
+# (sourceforge.net/projects/genenetwork/).
+#
+# Contact Drs. Robert W. Williams and Xiaodong Zhou (2010)
+# at rwilliams@uthsc.edu and xzhou15@uthsc.edu
+#
+#
+#
+# This module is used by GeneNetwork project (www.genenetwork.org)
+#
+# Created by GeneNetwork Core Team 2010/08/10
+#
+# Last updated by GeneNetwork Core Team 2010/10/20
+
+#--Only imported by correlationPage.py.
+#
+#Functions:
+#slink(lists) -- the only function called outside of this file.
+#nearest(lists,i,j) -- some sort of recursive function.
+#printarray(array,n) -- prints n elements of the given array
+#this is a myseterious piece of code in GN that Kev Adler and Rob Williams do not understand.
+#but is used in some way by the Traits Correlation function
+#Kev and Rob suspect that the d2 matrix below is unused
+#We do not understand the signifance of "d" but Kev suspects it is unimportant
+#These comments by Kev and Rob: May 23, 2008
+
+d = [[0,9,3,6,11],[9,0,7,5,10],[3,7,0,9,2],[6,5,9,0,8],[11,10,2,8,0]]
+d2 = [[0,9,5.5,6,11],[9,0,7,5,10],[5.5,7,0,9,2],[6,5,9,0,3],[11,10,2,3,0]]
+
+def nearest(lists,i,j):
+ if type(i) == type(1) and type(j) == type(1):
+ return lists[i][j]
+ elif type(i) == type(1):
+ dist = 1e10
+ for itemj in j[:-1]:
+ d = nearest(lists,i,itemj)
+ if dist > d:
+ dist = d
+ elif type(j) == type(1):
+ dist = 1e10
+ for itemi in i[:-1]:
+ d = nearest(lists,itemi,j)
+ if dist > d:
+ dist = d
+ else:
+ dist = 1e10
+ for itemi in i[:-1]:
+ for itemj in j[:-1]:
+ d = nearest(lists,itemi,itemj)
+ if dist > d:
+ dist = d
+ return dist
+
+def printarray(array,n):
+ print "\n"
+ for i in range(n):
+ print array[i][:n]
+ print "\n"
+
+def slink(lists):
+ try:
+ if type(lists) != type([]) and type(lists) != type(()):
+ raise 'FormatError'
+ else:
+ size = len(lists)
+ for item in lists:
+ if type(item) != type([]) and type(item) != type(()):
+ raise 'FormatError'
+ else:
+ if len(item) != size:
+ raise 'LengthError'
+ for i in range(size):
+ if lists[i][i] != 0:
+ raise 'ValueError'
+ for j in range(0,i):
+ if lists[i][j] < 0:
+ raise 'ValueError'
+ if lists[i][j] != lists[j][i]:
+ raise 'MirrorError'
+ except 'FormatError':
+ print "the format of the list is incorrect!"
+ return []
+ except 'LengthError':
+ print "the list is not a square list!"
+ return []
+ except 'MirrorError':
+ print "the list is not symmetric!"
+ return []
+ except 'ValueError':
+ print "the distance is negative value!"
+ return []
+ except:
+ print "Unknown Error"
+ return []
+ listindex = range(size)
+ listindexcopy = range(size)
+ listscopy = []
+ for i in range(size):
+ listscopy.append(lists[i][:])
+ initSize = size
+ candidate = []
+ while initSize >2:
+ mindist = 1e10
+ for i in range(initSize):
+ for j in range(i+1,initSize):
+ if listscopy[i][j] < mindist:
+ mindist = listscopy[i][j]
+ candidate=[[i,j]]
+ elif listscopy[i][j] == mindist:
+ mindist = listscopy[i][j]
+ candidate.append([i,j])
+ else:
+ pass
+ newmem = (listindexcopy[candidate[0][0]],listindexcopy[candidate[0][1]],mindist)
+ listindexcopy.pop(candidate[0][1])
+ listindexcopy[candidate[0][0]] = newmem
+
+ initSize -= 1
+ for i in range(initSize):
+ for j in range(i+1,initSize):
+ listscopy[i][j] = nearest(lists,listindexcopy[i],listindexcopy[j])
+ listscopy[j][i] = listscopy[i][j]
+ #print listindexcopy
+ #printarray(listscopy,initSize)
+ listindexcopy.append(nearest(lists,listindexcopy[0],listindexcopy[1]))
+ return listindexcopy
+
+
+