\r
//SequenceData is a string representation of what the user\r
//sees. The display may contain hidden columns.\r
- String [] sequenceString;\r
+ CigarArray seqData=null;\r
\r
int[] done;\r
int noseqs;\r
\r
private boolean hasRootDistance = true;\r
\r
+ /**\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(SequenceI[] seqs, CigarArray 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
{\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
sequenceString[i] = seqs[i].getSequence();\r
}\r
}\r
-\r
+ */\r
\r
hasDistances = treefile.HasDistances();\r
hasBootstrap = treefile.HasBootstrap();\r
* @param end DOCUMENT ME!\r
*/\r
public NJTree(SequenceI[] sequence,\r
- String [] sequenceString,\r
+ CigarArray seqData,\r
String type,\r
String pwtype,\r
int start, int end)\r
this.node = new Vector();\r
this.type = type;\r
this.pwtype = pwtype;\r
-\r
- if (sequenceString == null)\r
- {\r
- this.sequenceString = new String[sequence.length];\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
- this.sequenceString[i] = sequence[i].getSequence(start, end);\r
- }\r
+ {\r
+ seqs[i] = new SeqCigar(sequence[i], start, end);\r
+ }\r
+ this.seqData = new CigarArray(seqs);\r
+ this.seqData.addOperation(CigarArray.M, end-start+1);\r
}\r
- else\r
- this.sequenceString = sequenceString;\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
\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()\r
{\r
+ if (seqData==null)\r
+ return null;\r
+// return seqData.getSequenceString(Comparison.GapChars[0]);\r
StringBuffer sb = new StringBuffer();\r
- for(int i=0; i<sequenceString.length; i++)\r
+ String[] seqdatas = seqData.getSequenceStrings(Comparison.GapChars.charAt(0));\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(" "+sequenceString[i]+"\n");\r
+ sb.append(" "+seqdatas[i]+"\n");\r
}\r
return sb.toString();\r
}\r