/*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
-*\r
-* This program is free software; you can redistribute it and/or\r
-* modify it under the terms of the GNU General Public License\r
-* as published by the Free Software Foundation; either version 2\r
-* of the License, or (at your option) any later version.\r
-*\r
-* This program is distributed in the hope that it will be useful,\r
-* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-* GNU General Public License for more details.\r
-*\r
-* You should have received a copy of the GNU General Public License\r
-* along with this program; if not, write to the Free Software\r
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
-*/\r
+ * Jalview - A Sequence Alignment Editor and Viewer\r
+ * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
package jalview.io;\r
\r
-import jalview.datamodel.*;\r
-\r
-import jalview.util.*;\r
-\r
import java.io.*;\r
-\r
import java.util.*;\r
\r
+import jalview.datamodel.*;\r
+import jalview.util.*;\r
\r
-public class ClustalFile extends AlignFile {\r
- Vector ids;\r
-\r
- public ClustalFile() {\r
- }\r
-\r
- public ClustalFile(String inStr) {\r
- super(inStr);\r
- }\r
-\r
- public ClustalFile(String inFile, String type) throws IOException {\r
- super(inFile, type);\r
- }\r
-\r
- public void initData() {\r
- super.initData();\r
- ids = new Vector();\r
- }\r
+public class ClustalFile\r
+ extends AlignFile\r
+{\r
+\r
+ public ClustalFile()\r
+ {\r
+ }\r
+\r
+ public ClustalFile(String inStr)\r
+ {\r
+ super(inStr);\r
+ }\r
+\r
+ public ClustalFile(String inFile, String type)\r
+ throws IOException\r
+ {\r
+ super(inFile, type);\r
+ }\r
+\r
+ public void initData()\r
+ {\r
+ super.initData();\r
+ }\r
+\r
+ public void parse() throws IOException\r
+ {\r
+ int i = 0;\r
+ boolean flag = false;\r
+\r
+ Vector headers = new Vector();\r
+ Hashtable seqhash = new Hashtable();\r
+ StringBuffer tempseq;\r
+ String line, id;\r
+ StringTokenizer str;\r
+\r
+ try\r
+ {\r
+ while ( (line = nextLine()) != null)\r
+ {\r
+ if (line.indexOf(" ") != 0)\r
+ {\r
+ str = new StringTokenizer(line, " ");\r
+\r
+ if (str.hasMoreTokens())\r
+ {\r
+ id = str.nextToken();\r
+\r
+ if (id.equalsIgnoreCase("CLUSTAL"))\r
+ {\r
+ flag = true;\r
+ }\r
+ else\r
+ {\r
+ if (flag)\r
+ {\r
+ if (seqhash.containsKey(id))\r
+ {\r
+ tempseq = (StringBuffer) seqhash.get(id);\r
+ }\r
+ else\r
+ {\r
+ tempseq = new StringBuffer();\r
+ seqhash.put(id, tempseq);\r
+ }\r
\r
- public void parse() {\r
- int i = 0;\r
- boolean flag = false;\r
-\r
- Vector headers = new Vector();\r
- Hashtable seqhash = new Hashtable();\r
-\r
- String line;\r
-\r
- try {\r
- while ((line = nextLine()) != null) {\r
- if (line.indexOf(" ") != 0) {\r
- StringTokenizer str = new StringTokenizer(line, " ");\r
- String id = "";\r
-\r
- if (str.hasMoreTokens()) {\r
- id = str.nextToken();\r
-\r
- if (id.equals("CLUSTAL")) {\r
- flag = true;\r
- } else {\r
- if (flag) {\r
- StringBuffer tempseq;\r
-\r
- if (seqhash.containsKey(id)) {\r
- tempseq = (StringBuffer) seqhash.get(id);\r
- } else {\r
- tempseq = new StringBuffer();\r
- seqhash.put(id, tempseq);\r
- }\r
-\r
- if (!(headers.contains(id))) {\r
- headers.addElement(id);\r
- }\r
-\r
- if (str.hasMoreTokens()) {\r
- tempseq.append(str.nextToken());\r
- }\r
- }\r
- }\r
- }\r
+ if (! (headers.contains(id)))\r
+ {\r
+ headers.addElement(id);\r
}\r
- }\r
- } catch (IOException e) {\r
- System.err.println("Exception parsing clustal file " + e);\r
- e.printStackTrace();\r
- }\r
\r
- if (flag) {\r
- this.noSeqs = headers.size();\r
-\r
- //Add sequences to the hash\r
- for (i = 0; i < headers.size(); i++) {\r
- int start = -1;\r
- int end = -1;\r
-\r
- if (seqhash.get(headers.elementAt(i)) != null) {\r
- if (maxLength < seqhash.get(headers.elementAt(i)).toString()\r
- .length()) {\r
- maxLength = seqhash.get(headers.elementAt(i)).toString()\r
- .length();\r
- }\r
-\r
- String head = headers.elementAt(i).toString();\r
- start = 1;\r
- end = seqhash.get(headers.elementAt(i)).toString().length();\r
-\r
- if (head.indexOf("/") > 0) {\r
- StringTokenizer st = new StringTokenizer(head, "/");\r
-\r
- if (st.countTokens() == 2) {\r
- ids.addElement(st.nextToken());\r
-\r
- String tmp = st.nextToken();\r
- st = new StringTokenizer(tmp, "-");\r
-\r
- if (st.countTokens() == 2) {\r
- start = Integer.valueOf(st.nextToken())\r
- .intValue();\r
- end = Integer.valueOf(st.nextToken()).intValue();\r
- }\r
- } else {\r
- ids.addElement(headers.elementAt(i));\r
- }\r
- } else {\r
- ids.addElement(headers.elementAt(i));\r
- }\r
-\r
- Sequence newSeq = new Sequence(ids.elementAt(i).toString(),\r
- seqhash.get(headers.elementAt(i).toString())\r
- .toString(), start, end);\r
-\r
- seqs.addElement(newSeq);\r
- } else {\r
- System.err.println(\r
- "Clustal File Reader: Can't find sequence for " +\r
- headers.elementAt(i));\r
+ if (str.hasMoreTokens())\r
+ {\r
+ tempseq.append(str.nextToken());\r
}\r
+ }\r
}\r
+ }\r
+ else\r
+ flag = true;\r
}\r
+ }\r
+ }\r
+ catch (IOException e)\r
+ {\r
+ System.err.println("Exception parsing clustal file " + e);\r
+ e.printStackTrace();\r
}\r
\r
- public String print() {\r
- return print(getSeqsAsArray());\r
+ if (flag)\r
+ {\r
+ this.noSeqs = headers.size();\r
+\r
+ //Add sequences to the hash\r
+ for (i = 0; i < headers.size(); i++)\r
+ {\r
+ if (seqhash.get(headers.elementAt(i)) != null)\r
+ {\r
+ if (maxLength < seqhash.get(headers.elementAt(i)).toString()\r
+ .length())\r
+ {\r
+ maxLength = seqhash.get(headers.elementAt(i)).toString()\r
+ .length();\r
+ }\r
+\r
+ Sequence newSeq = parseId(headers.elementAt(i).toString());\r
+ newSeq.setSequence( seqhash.get(headers.elementAt(i).toString()).toString() );\r
+\r
+ if (!isValidProteinSequence(newSeq.getSequence()))\r
+ {\r
+ throw new IOException(AppletFormatAdapter.INVALID_CHARACTERS\r
+ + " : " + newSeq.getName()\r
+ + " : " + invalidCharacter);\r
+ }\r
+\r
+\r
+ seqs.addElement(newSeq);\r
+ }\r
+ else\r
+ {\r
+ System.err.println(\r
+ "Clustal File Reader: Can't find sequence for " +\r
+ headers.elementAt(i));\r
+ }\r
+ }\r
}\r
+ }\r
\r
- public static String print(SequenceI[] s) {\r
- StringBuffer out = new StringBuffer("CLUSTAL\n\n");\r
+ public String print()\r
+ {\r
+ return print(getSeqsAsArray());\r
+ }\r
\r
- int max = 0;\r
- int maxid = 0;\r
+ public String print(SequenceI[] s)\r
+ {\r
+ StringBuffer out = new StringBuffer("CLUSTAL\n\n");\r
\r
- int i = 0;\r
+ int max = 0;\r
+ int maxid = 0;\r
\r
- while ((i < s.length) && (s[i] != null)) {\r
- String tmp = s[i].getName() + "/" + s[i].getStart() + "-" +\r
- s[i].getEnd();\r
+ int i = 0;\r
\r
- if (s[i].getSequence().length() > max) {\r
- max = s[i].getSequence().length();\r
- }\r
+ while ( (i < s.length) && (s[i] != null))\r
+ {\r
+ String tmp = printId(s[i]);\r
\r
- if (tmp.length() > maxid) {\r
- maxid = tmp.length();\r
- }\r
+ if (s[i].getSequence().length() > max)\r
+ {\r
+ max = s[i].getSequence().length();\r
+ }\r
\r
- i++;\r
- }\r
+ if (tmp.length() > maxid)\r
+ {\r
+ maxid = tmp.length();\r
+ }\r
\r
- if (maxid < 15) {\r
- maxid = 15;\r
- }\r
-\r
- maxid++;\r
+ i++;\r
+ }\r
\r
- int len = 60;\r
- int nochunks = (max / len) + 1;\r
+ if (maxid < 15)\r
+ {\r
+ maxid = 15;\r
+ }\r
\r
- for (i = 0; i < nochunks; i++) {\r
- int j = 0;\r
+ maxid++;\r
\r
- while ((j < s.length) && (s[j] != null)) {\r
- out.append(new Format("%-" + maxid + "s").form(s[j].getName() +\r
- "/" + s[j].getStart() + "-" + s[j].getEnd()) + " ");\r
+ int len = 60;\r
+ int nochunks = (max / len) + 1;\r
\r
- int start = i * len;\r
- int end = start + len;\r
+ for (i = 0; i < nochunks; i++)\r
+ {\r
+ int j = 0;\r
\r
- if ((end < s[j].getSequence().length()) &&\r
- (start < s[j].getSequence().length())) {\r
- out.append(s[j].getSequence().substring(start, end));\r
- } else {\r
- if (start < s[j].getSequence().length()) {\r
- out.append(s[j].getSequence().substring(start));\r
- }\r
- }\r
+ while ( (j < s.length) && (s[j] != null))\r
+ {\r
+ out.append(new Format("%-" + maxid + "s").form( printId(s[j]) + " "));\r
\r
- out.append("\n");\r
- j++;\r
- }\r
+ int start = i * len;\r
+ int end = start + len;\r
\r
- out.append("\n");\r
+ if ( (end < s[j].getSequence().length()) &&\r
+ (start < s[j].getSequence().length()))\r
+ {\r
+ out.append(s[j].getSequence().substring(start, end));\r
+ }\r
+ else\r
+ {\r
+ if (start < s[j].getSequence().length())\r
+ {\r
+ out.append(s[j].getSequence().substring(start));\r
+ }\r
}\r
\r
- return out.toString();\r
+ out.append("\n");\r
+ j++;\r
+ }\r
+\r
+ out.append("\n");\r
}\r
+\r
+ return out.toString();\r
+ }\r
}\r