JAL-1807 test
[jalviewjs.git] / bin / jalview / analysis / NJTree.js
index 24a8fc5..8f3a367 100644 (file)
-Clazz.declarePackage ("jalview.analysis");\r
-Clazz.load (["java.util.Vector"], ["jalview.analysis.Cluster", "$.NJTree"], ["jalview.analysis.SequenceIdMatcher", "jalview.datamodel.AlignmentView", "$.CigarArray", "$.NodeTransformI", "$.SeqCigar", "$.Sequence", "$.SequenceI", "$.SequenceNode", "jalview.io.NewickFile", "jalview.schemes.ResidueProperties", "jalview.util.Format", "java.lang.StringBuffer"], function () {\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.$cluster = null;\r
-this.sequence = null;\r
-this.seqData = null;\r
-this.done = null;\r
-this.noseqs = 0;\r
-this.noClus = 0;\r
-this.distance = null;\r
-this.mini = 0;\r
-this.minj = 0;\r
-this.ri = 0;\r
-this.rj = 0;\r
-this.groups = null;\r
-this.maxdist = null;\r
-this.top = null;\r
-this.maxDistValue = 0;\r
-this.maxheight = 0;\r
-this.ycount = 0;\r
-this.node = null;\r
-this.type = null;\r
-this.pwtype = null;\r
-this.found = null;\r
-this.leaves = null;\r
-this.hasDistances = true;\r
-this.hasBootstrap = false;\r
-this.hasRootDistance = true;\r
-this._lycount = 0;\r
-this._lylimit = 0;\r
-Clazz.instantialize (this, arguments);\r
-}, jalview.analysis, "NJTree");\r
-Clazz.prepareFields (c$, function () {\r
-this.groups =  new java.util.Vector ();\r
-});\r
-Clazz.makeConstructor (c$, \r
-function (seqs, odata, treefile) {\r
-this.construct (seqs, treefile);\r
-if (odata != null) {\r
-this.seqData = odata;\r
-}}, "~A,jalview.datamodel.AlignmentView,jalview.io.NewickFile");\r
-Clazz.makeConstructor (c$, \r
-function (seqs, treefile) {\r
-this.sequence = seqs;\r
-this.top = treefile.getTree ();\r
-this.hasDistances = treefile.HasDistances ();\r
-this.hasBootstrap = treefile.HasBootstrap ();\r
-this.hasRootDistance = treefile.HasRootDistance ();\r
-this.maxheight = this.findHeight (this.top);\r
-var algnIds =  new jalview.analysis.SequenceIdMatcher (seqs);\r
-var leaves =  new java.util.Vector ();\r
-this.findLeaves (this.top, leaves);\r
-var i = 0;\r
-var namesleft = seqs.length;\r
-var j;\r
-var nam;\r
-var realnam;\r
-var one2many =  new java.util.Vector ();\r
-var countOne2Many = 0;\r
-while (i < leaves.size ()) {\r
-j = leaves.elementAt (i++);\r
-realnam = j.getName ();\r
-nam = null;\r
-if (namesleft > -1) {\r
-nam = algnIds.findIdMatch (realnam);\r
-}if (nam != null) {\r
-j.setElement (nam);\r
-if (one2many.contains (nam)) {\r
-countOne2Many++;\r
-} else {\r
-one2many.addElement (nam);\r
-namesleft--;\r
-}} else {\r
-j.setElement ( new jalview.datamodel.Sequence (realnam, "THISISAPLACEHLDER"));\r
-j.setPlaceholder (true);\r
-}}\r
-}, "~A,jalview.io.NewickFile");\r
-Clazz.makeConstructor (c$, \r
-function (sequence, seqData, type, pwtype, sm, start, end) {\r
-this.sequence = sequence;\r
-this.node =  new java.util.Vector ();\r
-this.type = type;\r
-this.pwtype = pwtype;\r
-if (seqData != null) {\r
-this.seqData = seqData;\r
-} else {\r
-var seqs =  new Array (sequence.length);\r
-for (var i = 0; i < sequence.length; i++) {\r
-seqs[i] =  new jalview.datamodel.SeqCigar (sequence[i], start, end);\r
-}\r
-var sdata =  new jalview.datamodel.CigarArray (seqs);\r
-sdata.addOperation ('M', end - start + 1);\r
-this.seqData =  new jalview.datamodel.AlignmentView (sdata, start);\r
-}if (!(type.equals ("NJ"))) {\r
-type = "AV";\r
-}if (sm == null && !(pwtype.equals ("PID"))) {\r
-if (jalview.schemes.ResidueProperties.getScoreMatrix (pwtype) == null) {\r
-pwtype = "BLOSUM62";\r
-}}var i = 0;\r
-this.done =  Clazz.newIntArray (sequence.length, 0);\r
-while ((i < sequence.length) && (sequence[i] != null)) {\r
-this.done[i] = 0;\r
-i++;\r
-}\r
-this.noseqs = i++;\r
-this.distance = this.findDistances (sm);\r
-this.makeLeaves ();\r
-this.noClus = this.$cluster.size ();\r
-this.cluster ();\r
-}, "~A,jalview.datamodel.AlignmentView,~S,~S,jalview.api.analysis.ScoreModelI,~N,~N");\r
-Clazz.overrideMethod (c$, "toString", \r
-function () {\r
-var fout =  new jalview.io.NewickFile (this.getTopNode ());\r
-return fout.print (this.isHasBootstrap (), this.isHasDistances (), this.isHasRootDistance ());\r
-});\r
-Clazz.defineMethod (c$, "UpdatePlaceHolders", \r
-function (list) {\r
-var leaves =  new java.util.Vector ();\r
-this.findLeaves (this.top, leaves);\r
-var sz = leaves.size ();\r
-var seqmatcher = null;\r
-var i = 0;\r
-while (i < sz) {\r
-var leaf = leaves.elementAt (i++);\r
-if (list.contains (leaf.element ())) {\r
-leaf.setPlaceholder (false);\r
-} else {\r
-if (seqmatcher == null) {\r
-var seqs =  new Array (list.size ());\r
-for (var j = 0; j < seqs.length; j++) {\r
-seqs[j] = list.get (j);\r
-}\r
-seqmatcher =  new jalview.analysis.SequenceIdMatcher (seqs);\r
-}var nam = seqmatcher.findIdMatch (leaf.getName ());\r
-if (nam != null) {\r
-if (!leaf.isPlaceholder ()) {\r
-}leaf.setPlaceholder (false);\r
-leaf.setElement (nam);\r
-} else {\r
-if (!leaf.isPlaceholder ()) {\r
-leaf.setElement ( new jalview.datamodel.Sequence (leaf.getName (), "THISISAPLACEHLDER"));\r
-}leaf.setPlaceholder (true);\r
-}}}\r
-}, "java.util.List");\r
-Clazz.defineMethod (c$, "renameAssociatedNodes", \r
-function () {\r
-this.applyToNodes (((Clazz.isClassDefined ("jalview.analysis.NJTree$1") ? 0 : jalview.analysis.NJTree.$NJTree$1$ ()), Clazz.innerTypeInstance (jalview.analysis.NJTree$1, this, null)));\r
-});\r
-Clazz.defineMethod (c$, "cluster", \r
-function () {\r
-while (this.noClus > 2) {\r
-if (this.type.equals ("NJ")) {\r
-this.findMinNJDistance ();\r
-} else {\r
-this.findMinDistance ();\r
-}var c = this.joinClusters (this.mini, this.minj);\r
-this.done[this.minj] = 1;\r
-this.$cluster.setElementAt (null, this.minj);\r
-this.$cluster.setElementAt (c, this.mini);\r
-this.noClus--;\r
-}\r
-var onefound = false;\r
-var one = -1;\r
-var two = -1;\r
-for (var i = 0; i < this.noseqs; i++) {\r
-if (this.done[i] != 1) {\r
-if (onefound == false) {\r
-two = i;\r
-onefound = true;\r
-} else {\r
-one = i;\r
-}}}\r
-this.joinClusters (one, two);\r
-this.top = (this.node.elementAt (one));\r
-this.reCount (this.top);\r
-this.findHeight (this.top);\r
-this.findMaxDist (this.top);\r
-});\r
-Clazz.defineMethod (c$, "joinClusters", \r
-function (i, j) {\r
-var dist = this.distance[i][j];\r
-var noi = (this.$cluster.elementAt (i)).value.length;\r
-var noj = (this.$cluster.elementAt (j)).value.length;\r
-var value =  Clazz.newIntArray (noi + noj, 0);\r
-for (var ii = 0; ii < noi; ii++) {\r
-value[ii] = (this.$cluster.elementAt (i)).value[ii];\r
-}\r
-for (var ii = noi; ii < (noi + noj); ii++) {\r
-value[ii] = (this.$cluster.elementAt (j)).value[ii - noi];\r
-}\r
-var c =  new jalview.analysis.Cluster (value);\r
-this.ri = this.findr (i, j);\r
-this.rj = this.findr (j, i);\r
-if (this.type.equals ("NJ")) {\r
-this.findClusterNJDistance (i, j);\r
-} else {\r
-this.findClusterDistance (i, j);\r
-}var sn =  new jalview.datamodel.SequenceNode ();\r
-sn.setLeft ((this.node.elementAt (i)));\r
-sn.setRight ((this.node.elementAt (j)));\r
-var tmpi = (this.node.elementAt (i));\r
-var tmpj = (this.node.elementAt (j));\r
-if (this.type.equals ("NJ")) {\r
-this.findNewNJDistances (tmpi, tmpj, dist);\r
-} else {\r
-this.findNewDistances (tmpi, tmpj, dist);\r
-}tmpi.setParent (sn);\r
-tmpj.setParent (sn);\r
-this.node.setElementAt (sn, i);\r
-return c;\r
-}, "~N,~N");\r
-Clazz.defineMethod (c$, "findNewNJDistances", \r
-function (tmpi, tmpj, dist) {\r
-tmpi.dist = ((dist + this.ri) - this.rj) / 2;\r
-tmpj.dist = (dist - tmpi.dist);\r
-if (tmpi.dist < 0) {\r
-tmpi.dist = 0;\r
-}if (tmpj.dist < 0) {\r
-tmpj.dist = 0;\r
-}}, "jalview.datamodel.SequenceNode,jalview.datamodel.SequenceNode,~N");\r
-Clazz.defineMethod (c$, "findNewDistances", \r
-function (tmpi, tmpj, dist) {\r
-var ih = 0;\r
-var jh = 0;\r
-var sni = tmpi;\r
-var snj = tmpj;\r
-while (sni != null) {\r
-ih = ih + sni.dist;\r
-sni = sni.left ();\r
-}\r
-while (snj != null) {\r
-jh = jh + snj.dist;\r
-snj = snj.left ();\r
-}\r
-tmpi.dist = ((dist / 2) - ih);\r
-tmpj.dist = ((dist / 2) - jh);\r
-}, "jalview.datamodel.SequenceNode,jalview.datamodel.SequenceNode,~N");\r
-Clazz.defineMethod (c$, "findClusterDistance", \r
-function (i, j) {\r
-var noi = (this.$cluster.elementAt (i)).value.length;\r
-var noj = (this.$cluster.elementAt (j)).value.length;\r
-var newdist =  Clazz.newFloatArray (this.noseqs, 0);\r
-for (var l = 0; l < this.noseqs; l++) {\r
-if ((l != i) && (l != j)) {\r
-newdist[l] = ((this.distance[i][l] * noi) + (this.distance[j][l] * noj)) / (noi + noj);\r
-} else {\r
-newdist[l] = 0;\r
-}}\r
-for (var ii = 0; ii < this.noseqs; ii++) {\r
-this.distance[i][ii] = newdist[ii];\r
-this.distance[ii][i] = newdist[ii];\r
-}\r
-}, "~N,~N");\r
-Clazz.defineMethod (c$, "findClusterNJDistance", \r
-function (i, j) {\r
-var newdist =  Clazz.newFloatArray (this.noseqs, 0);\r
-for (var l = 0; l < this.noseqs; l++) {\r
-if ((l != i) && (l != j)) {\r
-newdist[l] = ((this.distance[i][l] + this.distance[j][l]) - this.distance[i][j]) / 2;\r
-} else {\r
-newdist[l] = 0;\r
-}}\r
-for (var ii = 0; ii < this.noseqs; ii++) {\r
-this.distance[i][ii] = newdist[ii];\r
-this.distance[ii][i] = newdist[ii];\r
-}\r
-}, "~N,~N");\r
-Clazz.defineMethod (c$, "findr", \r
-function (i, j) {\r
-var tmp = 1;\r
-for (var k = 0; k < this.noseqs; k++) {\r
-if ((k != i) && (k != j) && (this.done[k] != 1)) {\r
-tmp = tmp + this.distance[i][k];\r
-}}\r
-if (this.noClus > 2) {\r
-tmp = tmp / (this.noClus - 2);\r
-}return tmp;\r
-}, "~N,~N");\r
-Clazz.defineMethod (c$, "findMinNJDistance", \r
-function () {\r
-var min = 100000;\r
-for (var i = 0; i < (this.noseqs - 1); i++) {\r
-for (var j = i + 1; j < this.noseqs; j++) {\r
-if ((this.done[i] != 1) && (this.done[j] != 1)) {\r
-var tmp = this.distance[i][j] - (this.findr (i, j) + this.findr (j, i));\r
-if (tmp < min) {\r
-this.mini = i;\r
-this.minj = j;\r
-min = tmp;\r
-}}}\r
-}\r
-return min;\r
-});\r
-Clazz.defineMethod (c$, "findMinDistance", \r
-function () {\r
-var min = 100000;\r
-for (var i = 0; i < (this.noseqs - 1); i++) {\r
-for (var j = i + 1; j < this.noseqs; j++) {\r
-if ((this.done[i] != 1) && (this.done[j] != 1)) {\r
-if (this.distance[i][j] < min) {\r
-this.mini = i;\r
-this.minj = j;\r
-min = this.distance[i][j];\r
-}}}\r
-}\r
-return min;\r
-});\r
-Clazz.defineMethod (c$, "findDistances", \r
-function (_pwmatrix) {\r
-var distance =  Clazz.newFloatArray (this.noseqs, this.noseqs, 0);\r
-if (_pwmatrix == null) {\r
-_pwmatrix = jalview.schemes.ResidueProperties.getScoreModel (this.pwtype);\r
-if (_pwmatrix == null) {\r
-_pwmatrix = jalview.schemes.ResidueProperties.getScoreMatrix ("BLOSUM62");\r
-}}distance = _pwmatrix.findDistances (this.seqData);\r
-return distance;\r
-}, "jalview.api.analysis.ScoreModelI");\r
-Clazz.defineMethod (c$, "makeLeaves", \r
-function () {\r
-this.$cluster =  new java.util.Vector ();\r
-for (var i = 0; i < this.noseqs; i++) {\r
-var sn =  new jalview.datamodel.SequenceNode ();\r
-sn.setElement (this.sequence[i]);\r
-sn.setName (this.sequence[i].getName ());\r
-this.node.addElement (sn);\r
-var value =  Clazz.newIntArray (1, 0);\r
-value[0] = i;\r
-var c =  new jalview.analysis.Cluster (value);\r
-this.$cluster.addElement (c);\r
-}\r
-});\r
-Clazz.defineMethod (c$, "findLeaves", \r
-function (node, leaves) {\r
-if (node == null) {\r
-return leaves;\r
-}if ((node.left () == null) && (node.right () == null)) {\r
-leaves.addElement (node);\r
-return leaves;\r
-} else {\r
-this.findLeaves (node.left (), leaves);\r
-this.findLeaves (node.right (), leaves);\r
-}return leaves;\r
-}, "jalview.datamodel.SequenceNode,java.util.Vector");\r
-Clazz.defineMethod (c$, "findLeaf", \r
-function (node, count) {\r
-this.found = this._findLeaf (node, count);\r
-return this.found;\r
-}, "jalview.datamodel.SequenceNode,~N");\r
-Clazz.defineMethod (c$, "_findLeaf", \r
-function (node, count) {\r
-if (node == null) {\r
-return null;\r
-}if (node.ycount == count) {\r
-this.found = node.element ();\r
-return this.found;\r
-} else {\r
-this._findLeaf (node.left (), count);\r
-this._findLeaf (node.right (), count);\r
-}return this.found;\r
-}, "jalview.datamodel.SequenceNode,~N");\r
-Clazz.defineMethod (c$, "printNode", \r
-function (node) {\r
-if (node == null) {\r
-return;\r
-}if ((node.left () == null) && (node.right () == null)) {\r
-System.out.println ("Leaf = " + (node.element ()).getName ());\r
-System.out.println ("Dist " + node.dist);\r
-System.out.println ("Boot " + node.getBootstrap ());\r
-} else {\r
-System.out.println ("Dist " + node.dist);\r
-this.printNode (node.left ());\r
-this.printNode (node.right ());\r
-}}, "jalview.datamodel.SequenceNode");\r
-Clazz.defineMethod (c$, "findMaxDist", \r
-function (node) {\r
-if (node == null) {\r
-return;\r
-}if ((node.left () == null) && (node.right () == null)) {\r
-var dist = node.dist;\r
-if (dist > this.maxDistValue) {\r
-this.maxdist = node;\r
-this.maxDistValue = dist;\r
-}} else {\r
-this.findMaxDist (node.left ());\r
-this.findMaxDist (node.right ());\r
-}}, "jalview.datamodel.SequenceNode");\r
-Clazz.defineMethod (c$, "getGroups", \r
-function () {\r
-return this.groups;\r
-});\r
-Clazz.defineMethod (c$, "getMaxHeight", \r
-function () {\r
-return this.maxheight;\r
-});\r
-Clazz.defineMethod (c$, "groupNodes", \r
-function (node, threshold) {\r
-if (node == null) {\r
-return;\r
-}if ((node.height / this.maxheight) > threshold) {\r
-this.groups.addElement (node);\r
-} else {\r
-this.groupNodes (node.left (), threshold);\r
-this.groupNodes (node.right (), threshold);\r
-}}, "jalview.datamodel.SequenceNode,~N");\r
-Clazz.defineMethod (c$, "findHeight", \r
-function (node) {\r
-if (node == null) {\r
-return this.maxheight;\r
-}if ((node.left () == null) && (node.right () == null)) {\r
-node.height = (node.parent ()).height + node.dist;\r
-if (node.height > this.maxheight) {\r
-return node.height;\r
-} else {\r
-return this.maxheight;\r
-}} else {\r
-if (node.parent () != null) {\r
-node.height = (node.parent ()).height + node.dist;\r
-} else {\r
-this.maxheight = 0;\r
-node.height = 0.0;\r
-}this.maxheight = this.findHeight ((node.left ()));\r
-this.maxheight = this.findHeight ((node.right ()));\r
-}return this.maxheight;\r
-}, "jalview.datamodel.SequenceNode");\r
-Clazz.defineMethod (c$, "reRoot", \r
-function () {\r
-if (this.maxdist != null) {\r
-this.ycount = 0;\r
-var tmpdist = this.maxdist.dist;\r
-var sn =  new jalview.datamodel.SequenceNode ();\r
-sn.setParent (null);\r
-var snr = this.maxdist.parent ();\r
-this.changeDirection (snr, this.maxdist);\r
-System.out.println ("Printing reversed tree");\r
-this.printN (snr);\r
-snr.dist = tmpdist / 2;\r
-this.maxdist.dist = tmpdist / 2;\r
-snr.setParent (sn);\r
-this.maxdist.setParent (sn);\r
-sn.setRight (snr);\r
-sn.setLeft (this.maxdist);\r
-this.top = sn;\r
-this.ycount = 0;\r
-this.reCount (this.top);\r
-this.findHeight (this.top);\r
-}return this.top;\r
-});\r
-Clazz.defineMethod (c$, "hasOriginalSequenceData", \r
-function () {\r
-return this.seqData != null;\r
-});\r
-Clazz.defineMethod (c$, "printOriginalSequenceData", \r
-function (gapChar) {\r
-if (this.seqData == null) {\r
-return null;\r
-}var sb =  new StringBuffer ();\r
-var seqdatas = this.seqData.getSequenceStrings (gapChar);\r
-for (var i = 0; i < seqdatas.length; i++) {\r
-sb.append ( new jalview.util.Format ("%-15s").form (this.sequence[i].getName ()));\r
-sb.append (" " + seqdatas[i] + "\n");\r
-}\r
-return sb.toString ();\r
-}, "~S");\r
-Clazz.defineMethod (c$, "printN", \r
-function (node) {\r
-if (node == null) {\r
-return;\r
-}if ((node.left () != null) && (node.right () != null)) {\r
-this.printN (node.left ());\r
-this.printN (node.right ());\r
-} else {\r
-System.out.println (" name = " + (node.element ()).getName ());\r
-}System.out.println (" dist = " + node.dist + " " + node.count + " " + node.height);\r
-}, "jalview.datamodel.SequenceNode");\r
-Clazz.defineMethod (c$, "reCount", \r
-function (node) {\r
-this.ycount = 0;\r
-this._lycount = 0;\r
-this._reCount (node);\r
-}, "jalview.datamodel.SequenceNode");\r
-Clazz.defineMethod (c$, "_reCount", \r
-function (node) {\r
-if (node == null) {\r
-return;\r
-}this._lycount++;\r
-if ((node.left () != null) && (node.right () != null)) {\r
-this._reCount (node.left ());\r
-this._reCount (node.right ());\r
-var l = node.left ();\r
-var r = node.right ();\r
-node.count = l.count + r.count;\r
-node.ycount = (l.ycount + r.ycount) / 2;\r
-} else {\r
-node.count = 1;\r
-node.ycount = this.ycount++;\r
-}this._lycount--;\r
-}, "jalview.datamodel.SequenceNode");\r
-Clazz.defineMethod (c$, "swapNodes", \r
-function (node) {\r
-if (node == null) {\r
-return;\r
-}var tmp = node.left ();\r
-node.setLeft (node.right ());\r
-node.setRight (tmp);\r
-}, "jalview.datamodel.SequenceNode");\r
-Clazz.defineMethod (c$, "changeDirection", \r
-function (node, dir) {\r
-if (node == null) {\r
-return;\r
-}if (node.parent () !== this.top) {\r
-this.changeDirection (node.parent (), node);\r
-var tmp = node.parent ();\r
-if (dir === node.left ()) {\r
-node.setParent (dir);\r
-node.setLeft (tmp);\r
-} else if (dir === node.right ()) {\r
-node.setParent (dir);\r
-node.setRight (tmp);\r
-}} else {\r
-if (dir === node.left ()) {\r
-node.setParent (node.left ());\r
-if (this.top.left () === node) {\r
-node.setRight (this.top.right ());\r
-} else {\r
-node.setRight (this.top.left ());\r
-}} else {\r
-node.setParent (node.right ());\r
-if (this.top.left () === node) {\r
-node.setLeft (this.top.right ());\r
-} else {\r
-node.setLeft (this.top.left ());\r
-}}}}, "jalview.datamodel.SequenceNode,jalview.datamodel.SequenceNode");\r
-Clazz.defineMethod (c$, "getMaxDist", \r
-function () {\r
-return this.maxdist;\r
-});\r
-Clazz.defineMethod (c$, "getTopNode", \r
-function () {\r
-return this.top;\r
-});\r
-Clazz.defineMethod (c$, "isHasDistances", \r
-function () {\r
-return this.hasDistances;\r
-});\r
-Clazz.defineMethod (c$, "isHasBootstrap", \r
-function () {\r
-return this.hasBootstrap;\r
-});\r
-Clazz.defineMethod (c$, "isHasRootDistance", \r
-function () {\r
-return this.hasRootDistance;\r
-});\r
-Clazz.defineMethod (c$, "applyToNodes", \r
-function (nodeTransformI) {\r
-for (var nodes = this.node.elements (); nodes.hasMoreElements (); nodeTransformI.transform (nodes.nextElement ())) {\r
-;}\r
-}, "jalview.datamodel.NodeTransformI");\r
-c$.$NJTree$1$ = function () {\r
-Clazz.pu$h ();\r
-c$ = Clazz.declareAnonymous (jalview.analysis, "NJTree$1", null, jalview.datamodel.NodeTransformI);\r
-Clazz.defineMethod (c$, "transform", \r
-function (node) {\r
-var el = node.element ();\r
-if (el != null && Clazz.instanceOf (el, jalview.datamodel.SequenceI)) {\r
-node.setName ((el).getName ());\r
-}}, "jalview.datamodel.BinaryNode");\r
-c$ = Clazz.p0p ();\r
-};\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.value = null;\r
-Clazz.instantialize (this, arguments);\r
-}, jalview.analysis, "Cluster");\r
-Clazz.makeConstructor (c$, \r
-function (value) {\r
-this.value = value;\r
-}, "~A");\r
-});\r
+Clazz.declarePackage ("jalview.analysis");
+Clazz.load (["java.util.Vector"], ["jalview.analysis.Cluster", "$.NJTree"], ["jalview.analysis.SequenceIdMatcher", "jalview.datamodel.AlignmentView", "$.CigarArray", "$.NodeTransformI", "$.SeqCigar", "$.Sequence", "$.SequenceI", "$.SequenceNode", "jalview.io.NewickFile", "jalview.schemes.ResidueProperties", "jalview.util.Format", "java.lang.StringBuffer"], function () {
+c$ = Clazz.decorateAsClass (function () {
+this.$cluster = null;
+this.sequence = null;
+this.seqData = null;
+this.done = null;
+this.noseqs = 0;
+this.noClus = 0;
+this.distance = null;
+this.mini = 0;
+this.minj = 0;
+this.ri = 0;
+this.rj = 0;
+this.groups = null;
+this.maxdist = null;
+this.top = null;
+this.maxDistValue = 0;
+this.maxheight = 0;
+this.ycount = 0;
+this.node = null;
+this.type = null;
+this.pwtype = null;
+this.found = null;
+this.leaves = null;
+this.hasDistances = true;
+this.hasBootstrap = false;
+this.hasRootDistance = true;
+this._lycount = 0;
+this._lylimit = 0;
+Clazz.instantialize (this, arguments);
+}, jalview.analysis, "NJTree");
+Clazz.prepareFields (c$, function () {
+this.groups =  new java.util.Vector ();
+});
+Clazz.makeConstructor (c$, 
+function (seqs, odata, treefile) {
+this.construct (seqs, treefile);
+if (odata != null) {
+this.seqData = odata;
+}}, "~A,jalview.datamodel.AlignmentView,jalview.io.NewickFile");
+Clazz.makeConstructor (c$, 
+function (seqs, treefile) {
+this.sequence = seqs;
+this.top = treefile.getTree ();
+this.hasDistances = treefile.HasDistances ();
+this.hasBootstrap = treefile.HasBootstrap ();
+this.hasRootDistance = treefile.HasRootDistance ();
+this.maxheight = this.findHeight (this.top);
+var algnIds =  new jalview.analysis.SequenceIdMatcher (seqs);
+var leaves =  new java.util.Vector ();
+this.findLeaves (this.top, leaves);
+var i = 0;
+var namesleft = seqs.length;
+var j;
+var nam;
+var realnam;
+var one2many =  new java.util.Vector ();
+var countOne2Many = 0;
+while (i < leaves.size ()) {
+j = leaves.elementAt (i++);
+realnam = j.getName ();
+nam = null;
+if (namesleft > -1) {
+nam = algnIds.findIdMatch (realnam);
+}if (nam != null) {
+j.setElement (nam);
+if (one2many.contains (nam)) {
+countOne2Many++;
+} else {
+one2many.addElement (nam);
+namesleft--;
+}} else {
+j.setElement ( new jalview.datamodel.Sequence (realnam, "THISISAPLACEHLDER"));
+j.setPlaceholder (true);
+}}
+}, "~A,jalview.io.NewickFile");
+Clazz.makeConstructor (c$, 
+function (sequence, seqData, type, pwtype, sm, start, end) {
+this.sequence = sequence;
+this.node =  new java.util.Vector ();
+this.type = type;
+this.pwtype = pwtype;
+if (seqData != null) {
+this.seqData = seqData;
+} else {
+var seqs =  new Array (sequence.length);
+for (var i = 0; i < sequence.length; i++) {
+seqs[i] =  new jalview.datamodel.SeqCigar (sequence[i], start, end);
+}
+var sdata =  new jalview.datamodel.CigarArray (seqs);
+sdata.addOperation ('M', end - start + 1);
+this.seqData =  new jalview.datamodel.AlignmentView (sdata, start);
+}if (!(type.equals ("NJ"))) {
+type = "AV";
+}if (sm == null && !(pwtype.equals ("PID"))) {
+if (jalview.schemes.ResidueProperties.getScoreMatrix (pwtype) == null) {
+pwtype = "BLOSUM62";
+}}var i = 0;
+this.done =  Clazz.newIntArray (sequence.length, 0);
+while ((i < sequence.length) && (sequence[i] != null)) {
+this.done[i] = 0;
+i++;
+}
+this.noseqs = i++;
+this.distance = this.findDistances (sm);
+this.makeLeaves ();
+this.noClus = this.$cluster.size ();
+this.cluster ();
+}, "~A,jalview.datamodel.AlignmentView,~S,~S,jalview.api.analysis.ScoreModelI,~N,~N");
+Clazz.overrideMethod (c$, "toString", 
+function () {
+var fout =  new jalview.io.NewickFile (this.getTopNode ());
+return fout.print (this.isHasBootstrap (), this.isHasDistances (), this.isHasRootDistance ());
+});
+Clazz.defineMethod (c$, "UpdatePlaceHolders", 
+function (list) {
+var leaves =  new java.util.Vector ();
+this.findLeaves (this.top, leaves);
+var sz = leaves.size ();
+var seqmatcher = null;
+var i = 0;
+while (i < sz) {
+var leaf = leaves.elementAt (i++);
+if (list.contains (leaf.element ())) {
+leaf.setPlaceholder (false);
+} else {
+if (seqmatcher == null) {
+var seqs =  new Array (list.size ());
+for (var j = 0; j < seqs.length; j++) {
+seqs[j] = list.get (j);
+}
+seqmatcher =  new jalview.analysis.SequenceIdMatcher (seqs);
+}var nam = seqmatcher.findIdMatch (leaf.getName ());
+if (nam != null) {
+if (!leaf.isPlaceholder ()) {
+}leaf.setPlaceholder (false);
+leaf.setElement (nam);
+} else {
+if (!leaf.isPlaceholder ()) {
+leaf.setElement ( new jalview.datamodel.Sequence (leaf.getName (), "THISISAPLACEHLDER"));
+}leaf.setPlaceholder (true);
+}}}
+}, "java.util.List");
+Clazz.defineMethod (c$, "renameAssociatedNodes", 
+function () {
+this.applyToNodes (((Clazz.isClassDefined ("jalview.analysis.NJTree$1") ? 0 : jalview.analysis.NJTree.$NJTree$1$ ()), Clazz.innerTypeInstance (jalview.analysis.NJTree$1, this, null)));
+});
+Clazz.defineMethod (c$, "cluster", 
+function () {
+while (this.noClus > 2) {
+if (this.type.equals ("NJ")) {
+this.findMinNJDistance ();
+} else {
+this.findMinDistance ();
+}var c = this.joinClusters (this.mini, this.minj);
+this.done[this.minj] = 1;
+this.$cluster.setElementAt (null, this.minj);
+this.$cluster.setElementAt (c, this.mini);
+this.noClus--;
+}
+var onefound = false;
+var one = -1;
+var two = -1;
+for (var i = 0; i < this.noseqs; i++) {
+if (this.done[i] != 1) {
+if (onefound == false) {
+two = i;
+onefound = true;
+} else {
+one = i;
+}}}
+this.joinClusters (one, two);
+this.top = (this.node.elementAt (one));
+this.reCount (this.top);
+this.findHeight (this.top);
+this.findMaxDist (this.top);
+});
+Clazz.defineMethod (c$, "joinClusters", 
+function (i, j) {
+var dist = this.distance[i][j];
+var noi = (this.$cluster.elementAt (i)).value.length;
+var noj = (this.$cluster.elementAt (j)).value.length;
+var value =  Clazz.newIntArray (noi + noj, 0);
+for (var ii = 0; ii < noi; ii++) {
+value[ii] = (this.$cluster.elementAt (i)).value[ii];
+}
+for (var ii = noi; ii < (noi + noj); ii++) {
+value[ii] = (this.$cluster.elementAt (j)).value[ii - noi];
+}
+var c =  new jalview.analysis.Cluster (value);
+this.ri = this.findr (i, j);
+this.rj = this.findr (j, i);
+if (this.type.equals ("NJ")) {
+this.findClusterNJDistance (i, j);
+} else {
+this.findClusterDistance (i, j);
+}var sn =  new jalview.datamodel.SequenceNode ();
+sn.setLeft ((this.node.elementAt (i)));
+sn.setRight ((this.node.elementAt (j)));
+var tmpi = (this.node.elementAt (i));
+var tmpj = (this.node.elementAt (j));
+if (this.type.equals ("NJ")) {
+this.findNewNJDistances (tmpi, tmpj, dist);
+} else {
+this.findNewDistances (tmpi, tmpj, dist);
+}tmpi.setParent (sn);
+tmpj.setParent (sn);
+this.node.setElementAt (sn, i);
+return c;
+}, "~N,~N");
+Clazz.defineMethod (c$, "findNewNJDistances", 
+function (tmpi, tmpj, dist) {
+tmpi.dist = ((dist + this.ri) - this.rj) / 2;
+tmpj.dist = (dist - tmpi.dist);
+if (tmpi.dist < 0) {
+tmpi.dist = 0;
+}if (tmpj.dist < 0) {
+tmpj.dist = 0;
+}}, "jalview.datamodel.SequenceNode,jalview.datamodel.SequenceNode,~N");
+Clazz.defineMethod (c$, "findNewDistances", 
+function (tmpi, tmpj, dist) {
+var ih = 0;
+var jh = 0;
+var sni = tmpi;
+var snj = tmpj;
+while (sni != null) {
+ih = ih + sni.dist;
+sni = sni.left ();
+}
+while (snj != null) {
+jh = jh + snj.dist;
+snj = snj.left ();
+}
+tmpi.dist = ((dist / 2) - ih);
+tmpj.dist = ((dist / 2) - jh);
+}, "jalview.datamodel.SequenceNode,jalview.datamodel.SequenceNode,~N");
+Clazz.defineMethod (c$, "findClusterDistance", 
+function (i, j) {
+var noi = (this.$cluster.elementAt (i)).value.length;
+var noj = (this.$cluster.elementAt (j)).value.length;
+var newdist =  Clazz.newFloatArray (this.noseqs, 0);
+for (var l = 0; l < this.noseqs; l++) {
+if ((l != i) && (l != j)) {
+newdist[l] = ((this.distance[i][l] * noi) + (this.distance[j][l] * noj)) / (noi + noj);
+} else {
+newdist[l] = 0;
+}}
+for (var ii = 0; ii < this.noseqs; ii++) {
+this.distance[i][ii] = newdist[ii];
+this.distance[ii][i] = newdist[ii];
+}
+}, "~N,~N");
+Clazz.defineMethod (c$, "findClusterNJDistance", 
+function (i, j) {
+var newdist =  Clazz.newFloatArray (this.noseqs, 0);
+for (var l = 0; l < this.noseqs; l++) {
+if ((l != i) && (l != j)) {
+newdist[l] = ((this.distance[i][l] + this.distance[j][l]) - this.distance[i][j]) / 2;
+} else {
+newdist[l] = 0;
+}}
+for (var ii = 0; ii < this.noseqs; ii++) {
+this.distance[i][ii] = newdist[ii];
+this.distance[ii][i] = newdist[ii];
+}
+}, "~N,~N");
+Clazz.defineMethod (c$, "findr", 
+function (i, j) {
+var tmp = 1;
+for (var k = 0; k < this.noseqs; k++) {
+if ((k != i) && (k != j) && (this.done[k] != 1)) {
+tmp = tmp + this.distance[i][k];
+}}
+if (this.noClus > 2) {
+tmp = tmp / (this.noClus - 2);
+}return tmp;
+}, "~N,~N");
+Clazz.defineMethod (c$, "findMinNJDistance", 
+function () {
+var min = 100000;
+for (var i = 0; i < (this.noseqs - 1); i++) {
+for (var j = i + 1; j < this.noseqs; j++) {
+if ((this.done[i] != 1) && (this.done[j] != 1)) {
+var tmp = this.distance[i][j] - (this.findr (i, j) + this.findr (j, i));
+if (tmp < min) {
+this.mini = i;
+this.minj = j;
+min = tmp;
+}}}
+}
+return min;
+});
+Clazz.defineMethod (c$, "findMinDistance", 
+function () {
+var min = 100000;
+for (var i = 0; i < (this.noseqs - 1); i++) {
+for (var j = i + 1; j < this.noseqs; j++) {
+if ((this.done[i] != 1) && (this.done[j] != 1)) {
+if (this.distance[i][j] < min) {
+this.mini = i;
+this.minj = j;
+min = this.distance[i][j];
+}}}
+}
+return min;
+});
+Clazz.defineMethod (c$, "findDistances", 
+function (_pwmatrix) {
+var distance =  Clazz.newFloatArray (this.noseqs, this.noseqs, 0);
+if (_pwmatrix == null) {
+_pwmatrix = jalview.schemes.ResidueProperties.getScoreModel (this.pwtype);
+if (_pwmatrix == null) {
+_pwmatrix = jalview.schemes.ResidueProperties.getScoreMatrix ("BLOSUM62");
+}}distance = _pwmatrix.findDistances (this.seqData);
+return distance;
+}, "jalview.api.analysis.ScoreModelI");
+Clazz.defineMethod (c$, "makeLeaves", 
+function () {
+this.$cluster =  new java.util.Vector ();
+for (var i = 0; i < this.noseqs; i++) {
+var sn =  new jalview.datamodel.SequenceNode ();
+sn.setElement (this.sequence[i]);
+sn.setName (this.sequence[i].getName ());
+this.node.addElement (sn);
+var value =  Clazz.newIntArray (1, 0);
+value[0] = i;
+var c =  new jalview.analysis.Cluster (value);
+this.$cluster.addElement (c);
+}
+});
+Clazz.defineMethod (c$, "findLeaves", 
+function (node, leaves) {
+if (node == null) {
+return leaves;
+}if ((node.left () == null) && (node.right () == null)) {
+leaves.addElement (node);
+return leaves;
+} else {
+this.findLeaves (node.left (), leaves);
+this.findLeaves (node.right (), leaves);
+}return leaves;
+}, "jalview.datamodel.SequenceNode,java.util.Vector");
+Clazz.defineMethod (c$, "findLeaf", 
+function (node, count) {
+this.found = this._findLeaf (node, count);
+return this.found;
+}, "jalview.datamodel.SequenceNode,~N");
+Clazz.defineMethod (c$, "_findLeaf", 
+function (node, count) {
+if (node == null) {
+return null;
+}if (node.ycount == count) {
+this.found = node.element ();
+return this.found;
+} else {
+this._findLeaf (node.left (), count);
+this._findLeaf (node.right (), count);
+}return this.found;
+}, "jalview.datamodel.SequenceNode,~N");
+Clazz.defineMethod (c$, "printNode", 
+function (node) {
+if (node == null) {
+return;
+}if ((node.left () == null) && (node.right () == null)) {
+System.out.println ("Leaf = " + (node.element ()).getName ());
+System.out.println ("Dist " + node.dist);
+System.out.println ("Boot " + node.getBootstrap ());
+} else {
+System.out.println ("Dist " + node.dist);
+this.printNode (node.left ());
+this.printNode (node.right ());
+}}, "jalview.datamodel.SequenceNode");
+Clazz.defineMethod (c$, "findMaxDist", 
+function (node) {
+if (node == null) {
+return;
+}if ((node.left () == null) && (node.right () == null)) {
+var dist = node.dist;
+if (dist > this.maxDistValue) {
+this.maxdist = node;
+this.maxDistValue = dist;
+}} else {
+this.findMaxDist (node.left ());
+this.findMaxDist (node.right ());
+}}, "jalview.datamodel.SequenceNode");
+Clazz.defineMethod (c$, "getGroups", 
+function () {
+return this.groups;
+});
+Clazz.defineMethod (c$, "getMaxHeight", 
+function () {
+return this.maxheight;
+});
+Clazz.defineMethod (c$, "groupNodes", 
+function (node, threshold) {
+if (node == null) {
+return;
+}if ((node.height / this.maxheight) > threshold) {
+this.groups.addElement (node);
+} else {
+this.groupNodes (node.left (), threshold);
+this.groupNodes (node.right (), threshold);
+}}, "jalview.datamodel.SequenceNode,~N");
+Clazz.defineMethod (c$, "findHeight", 
+function (node) {
+if (node == null) {
+return this.maxheight;
+}if ((node.left () == null) && (node.right () == null)) {
+node.height = (node.parent ()).height + node.dist;
+if (node.height > this.maxheight) {
+return node.height;
+} else {
+return this.maxheight;
+}} else {
+if (node.parent () != null) {
+node.height = (node.parent ()).height + node.dist;
+} else {
+this.maxheight = 0;
+node.height = 0.0;
+}this.maxheight = this.findHeight ((node.left ()));
+this.maxheight = this.findHeight ((node.right ()));
+}return this.maxheight;
+}, "jalview.datamodel.SequenceNode");
+Clazz.defineMethod (c$, "reRoot", 
+function () {
+if (this.maxdist != null) {
+this.ycount = 0;
+var tmpdist = this.maxdist.dist;
+var sn =  new jalview.datamodel.SequenceNode ();
+sn.setParent (null);
+var snr = this.maxdist.parent ();
+this.changeDirection (snr, this.maxdist);
+System.out.println ("Printing reversed tree");
+this.printN (snr);
+snr.dist = tmpdist / 2;
+this.maxdist.dist = tmpdist / 2;
+snr.setParent (sn);
+this.maxdist.setParent (sn);
+sn.setRight (snr);
+sn.setLeft (this.maxdist);
+this.top = sn;
+this.ycount = 0;
+this.reCount (this.top);
+this.findHeight (this.top);
+}return this.top;
+});
+Clazz.defineMethod (c$, "hasOriginalSequenceData", 
+function () {
+return this.seqData != null;
+});
+Clazz.defineMethod (c$, "printOriginalSequenceData", 
+function (gapChar) {
+if (this.seqData == null) {
+return null;
+}var sb =  new StringBuffer ();
+var seqdatas = this.seqData.getSequenceStrings (gapChar);
+for (var i = 0; i < seqdatas.length; i++) {
+sb.append ( new jalview.util.Format ("%-15s").form (this.sequence[i].getName ()));
+sb.append (" " + seqdatas[i] + "\n");
+}
+return sb.toString ();
+}, "~S");
+Clazz.defineMethod (c$, "printN", 
+function (node) {
+if (node == null) {
+return;
+}if ((node.left () != null) && (node.right () != null)) {
+this.printN (node.left ());
+this.printN (node.right ());
+} else {
+System.out.println (" name = " + (node.element ()).getName ());
+}System.out.println (" dist = " + node.dist + " " + node.count + " " + node.height);
+}, "jalview.datamodel.SequenceNode");
+Clazz.defineMethod (c$, "reCount", 
+function (node) {
+this.ycount = 0;
+this._lycount = 0;
+this._reCount (node);
+}, "jalview.datamodel.SequenceNode");
+Clazz.defineMethod (c$, "_reCount", 
+function (node) {
+if (node == null) {
+return;
+}this._lycount++;
+if ((node.left () != null) && (node.right () != null)) {
+this._reCount (node.left ());
+this._reCount (node.right ());
+var l = node.left ();
+var r = node.right ();
+node.count = l.count + r.count;
+node.ycount = (l.ycount + r.ycount) / 2;
+} else {
+node.count = 1;
+node.ycount = this.ycount++;
+}this._lycount--;
+}, "jalview.datamodel.SequenceNode");
+Clazz.defineMethod (c$, "swapNodes", 
+function (node) {
+if (node == null) {
+return;
+}var tmp = node.left ();
+node.setLeft (node.right ());
+node.setRight (tmp);
+}, "jalview.datamodel.SequenceNode");
+Clazz.defineMethod (c$, "changeDirection", 
+function (node, dir) {
+if (node == null) {
+return;
+}if (node.parent () !== this.top) {
+this.changeDirection (node.parent (), node);
+var tmp = node.parent ();
+if (dir === node.left ()) {
+node.setParent (dir);
+node.setLeft (tmp);
+} else if (dir === node.right ()) {
+node.setParent (dir);
+node.setRight (tmp);
+}} else {
+if (dir === node.left ()) {
+node.setParent (node.left ());
+if (this.top.left () === node) {
+node.setRight (this.top.right ());
+} else {
+node.setRight (this.top.left ());
+}} else {
+node.setParent (node.right ());
+if (this.top.left () === node) {
+node.setLeft (this.top.right ());
+} else {
+node.setLeft (this.top.left ());
+}}}}, "jalview.datamodel.SequenceNode,jalview.datamodel.SequenceNode");
+Clazz.defineMethod (c$, "getMaxDist", 
+function () {
+return this.maxdist;
+});
+Clazz.defineMethod (c$, "getTopNode", 
+function () {
+return this.top;
+});
+Clazz.defineMethod (c$, "isHasDistances", 
+function () {
+return this.hasDistances;
+});
+Clazz.defineMethod (c$, "isHasBootstrap", 
+function () {
+return this.hasBootstrap;
+});
+Clazz.defineMethod (c$, "isHasRootDistance", 
+function () {
+return this.hasRootDistance;
+});
+Clazz.defineMethod (c$, "applyToNodes", 
+function (nodeTransformI) {
+for (var nodes = this.node.elements (); nodes.hasMoreElements (); nodeTransformI.transform (nodes.nextElement ())) {
+;}
+}, "jalview.datamodel.NodeTransformI");
+c$.$NJTree$1$ = function () {
+Clazz.pu$h ();
+c$ = Clazz.declareAnonymous (jalview.analysis, "NJTree$1", null, jalview.datamodel.NodeTransformI);
+Clazz.defineMethod (c$, "transform", 
+function (node) {
+var el = node.element ();
+if (el != null && Clazz.instanceOf (el, jalview.datamodel.SequenceI)) {
+node.setName ((el).getName ());
+}}, "jalview.datamodel.BinaryNode");
+c$ = Clazz.p0p ();
+};
+c$ = Clazz.decorateAsClass (function () {
+this.value = null;
+Clazz.instantialize (this, arguments);
+}, jalview.analysis, "Cluster");
+Clazz.makeConstructor (c$, 
+function (value) {
+this.value = value;
+}, "~A");
+});