{\r
Vector cluster;\r
SequenceI[] sequence;\r
+\r
+ //SequenceData is a string representation of what the user\r
+ //sees. The display may contain hidden columns.\r
+ public AlignmentView seqData=null;\r
+\r
int[] done;\r
int noseqs;\r
int noClus;\r
String pwtype;\r
Object found = null;\r
Object leaves = null;\r
- int start;\r
- int end;\r
+\r
+ boolean hasDistances = true; // normal case for jalview trees\r
+ boolean hasBootstrap = false; // normal case for jalview trees\r
+\r
+ private boolean hasRootDistance = true;\r
\r
/**\r
- * Creates a new NJTree object.\r
- *\r
- * @param node DOCUMENT ME!\r
+ * Create a new NJTree object with leaves associated with sequences in seqs,\r
+ * and original alignment data represented by Cigar strings.\r
+ * @param seqs SequenceI[]\r
+ * @param odata Cigar[]\r
+ * @param treefile NewickFile\r
*/\r
- public NJTree(SequenceNode node)\r
- {\r
- top = node;\r
- maxheight = findHeight(top);\r
+ public NJTree(SequenceI[] seqs, AlignmentView odata, NewickFile treefile) {\r
+ this(seqs, treefile);\r
+ if (odata!=null)\r
+ seqData = odata;\r
+ /*\r
+ sequenceString = new String[odata.length];\r
+ char gapChar = jalview.util.Comparison.GapChars.charAt(0);\r
+ for (int i = 0; i < odata.length; i++)\r
+ {\r
+ SequenceI oseq_aligned = odata[i].getSeq(gapChar);\r
+ sequenceString[i] = oseq_aligned.getSequence();\r
+ } */\r
}\r
\r
/**\r
- * Creates a new NJTree object.\r
+ * Creates a new NJTree object from a tree from an external source\r
*\r
- * @param seqs DOCUMENT ME!\r
- * @param treefile DOCUMENT ME!\r
+ * @param seqs SequenceI which should be associated with leafs of treefile\r
+ * @param treefile A parsed tree\r
*/\r
- public NJTree(SequenceI[] seqs, NewickFile treefile)\r
+ public NJTree(SequenceI[] seqs, NewickFile treefile)\r
{\r
+ this.sequence = seqs;\r
top = treefile.getTree();\r
+\r
+ /**\r
+ * There is no dependent alignment to be recovered from an\r
+ * imported tree.\r
+ *\r
+ if (sequenceString == null)\r
+ {\r
+ sequenceString = new String[seqs.length];\r
+ for (int i = 0; i < seqs.length; i++)\r
+ {\r
+ sequenceString[i] = seqs[i].getSequence();\r
+ }\r
+ }\r
+ */\r
+\r
+ hasDistances = treefile.HasDistances();\r
+ hasBootstrap = treefile.HasBootstrap();\r
+ hasRootDistance = treefile.HasRootDistance();\r
+\r
maxheight = findHeight(top);\r
\r
SequenceIdMatcher algnIds = new SequenceIdMatcher(seqs);\r
* Creates a new NJTree object.\r
*\r
* @param sequence DOCUMENT ME!\r
- * @param start DOCUMENT ME!\r
- * @param end DOCUMENT ME!\r
- */\r
- public NJTree(SequenceI[] sequence, int start, int end)\r
- {\r
- this(sequence, "NJ", "BL", start, end);\r
- }\r
-\r
- /**\r
- * Creates a new NJTree object.\r
- *\r
- * @param sequence DOCUMENT ME!\r
* @param type DOCUMENT ME!\r
* @param pwtype DOCUMENT ME!\r
* @param start DOCUMENT ME!\r
* @param end DOCUMENT ME!\r
*/\r
- public NJTree(SequenceI[] sequence, String type, String pwtype, int start,\r
- int end)\r
+ public NJTree(SequenceI[] sequence,\r
+ AlignmentView seqData,\r
+ String type,\r
+ String pwtype,\r
+ int start, int end)\r
{\r
this.sequence = sequence;\r
this.node = new Vector();\r
this.type = type;\r
this.pwtype = pwtype;\r
- this.start = start;\r
- this.end = end;\r
+ if (seqData!=null) {\r
+ this.seqData = seqData;\r
+ } else {\r
+ SeqCigar[] seqs = new SeqCigar[sequence.length];\r
+ for(int i=0; i<sequence.length; i++)\r
+ {\r
+ seqs[i] = new SeqCigar(sequence[i], start, end);\r
+ }\r
+ CigarArray sdata = new CigarArray(seqs);\r
+ sdata.addOperation(CigarArray.M, end-start+1);\r
+ this.seqData = new AlignmentView(sdata);\r
+ }\r
\r
if (!(type.equals("NJ")))\r
{\r
\r
noseqs = i++;\r
\r
- distance = findDistances();\r
+ distance = findDistances(this.seqData.getSequenceStrings(Comparison.GapChars.charAt(0)));\r
\r
makeLeaves();\r
\r
*\r
* @return DOCUMENT ME!\r
*/\r
- public float[][] findDistances()\r
+ public float[][] findDistances(String[] sequenceString)\r
{\r
float[][] distance = new float[noseqs][noseqs];\r
\r
else\r
{\r
distance[i][j] = 100 -\r
- Comparison.PID(sequence[i], sequence[j], start, end);\r
+ Comparison.PID(sequenceString[i], sequenceString[j]);\r
+\r
distance[j][i] = distance[i][j];\r
}\r
}\r
else if (pwtype.equals("BL"))\r
{\r
int maxscore = 0;\r
-\r
+ int end = sequenceString[0].length();\r
for (int i = 0; i < (noseqs - 1); i++)\r
{\r
for (int j = i; j < noseqs; j++)\r
{\r
int score = 0;\r
\r
- for (int k = start; k < end; k++)\r
+ for (int k = 0; k < end; k++)\r
{\r
try\r
{\r
- score += ResidueProperties.getBLOSUM62(sequence[i].getSequence(\r
- k, k + 1), sequence[j].getSequence(k, k +\r
- 1));\r
+ score += ResidueProperties.getBLOSUM62(\r
+ sequenceString[i].substring(k, k + 1),\r
+ sequenceString[j].substring(k, k + 1));\r
}\r
catch (Exception ex)\r
{\r
}\r
}\r
}\r
- else if (pwtype.equals("SW"))\r
+ /* else if (pwtype.equals("SW"))\r
{\r
float max = -1;\r
\r
distance[j][i] = distance[i][j];\r
}\r
}\r
- }\r
+ }/*/\r
\r
return distance;\r
}\r
\r
return top;\r
}\r
-\r
+ /**\r
+ *\r
+ * @return true if original sequence data can be recovered\r
+ */\r
+ public boolean hasOriginalSequenceData() {\r
+ return seqData!=null;\r
+ }\r
+ /**\r
+ * Returns original alignment data used for calculation - or null where\r
+ * not available.\r
+ *\r
+ * @return null or cut'n'pasteable alignment\r
+ */\r
+ public String printOriginalSequenceData(char gapChar)\r
+ {\r
+ if (seqData==null)\r
+ return null;\r
+\r
+ StringBuffer sb = new StringBuffer();\r
+ String[] seqdatas = seqData.getSequenceStrings(gapChar);\r
+ for(int i=0; i<seqdatas.length; i++)\r
+ {\r
+ sb.append(new jalview.util.Format("%-" + 15 + "s").form(\r
+ sequence[i].getName()));\r
+ sb.append(" "+seqdatas[i]+"\n");\r
+ }\r
+ return sb.toString();\r
+ }\r
/**\r
* DOCUMENT ME!\r
*\r
* @param node DOCUMENT ME!\r
*/\r
- public static void printN(SequenceNode node)\r
+ public void printN(SequenceNode node)\r
{\r
if (node == null)\r
{\r
{\r
return top;\r
}\r
+ /**\r
+ *\r
+ * @return true if tree has real distances\r
+ */\r
+ public boolean isHasDistances() {\r
+ return hasDistances;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @return true if tree has real bootstrap values\r
+ */\r
+ public boolean isHasBootstrap() {\r
+ return hasBootstrap;\r
+ }\r
+\r
+ public boolean isHasRootDistance()\r
+ {\r
+ return hasRootDistance;\r
+ }\r
+\r
}\r
\r
\r