-/*
- * Created on 17-May-2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package uk.ac.vamsas.objects.utils;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Hashtable;
-import java.util.StringTokenizer;
-import java.util.Vector;
-import java.util.regex.Pattern;
-
-import uk.ac.vamsas.objects.core.*;
-
-/**
- * @author jimp
- *
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-public class SeqAln extends uk.ac.vamsas.objects.core.Alignment {
-
- public static Sequence[] ReadClustalFile(InputStream os) throws Exception {
- System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this method
- Pattern nonGap = Pattern.compile("[A-Z*0-9]", Pattern.CASE_INSENSITIVE);
- String gapchars = "";
- char gapchar = '-';
-
- int i = 0;
- boolean flag = false;
-
- Vector headers = new Vector();
- Hashtable seqhash = new Hashtable();
- Sequence[] seqs = null;
- int noSeqs = 0;
- String line;
-
- try {
- BufferedReader ins = new BufferedReader(new InputStreamReader(os));
- while ((line = ins.readLine()) != null) {
- if (line.indexOf(" ") != 0) {
- java.util.StringTokenizer str = new StringTokenizer(line, " ");
- String id = "";
-
- if (str.hasMoreTokens()) {
- id = str.nextToken();
- if (id.equals("CLUSTAL")) {
- flag = true;
- } else {
- if (flag) {
- StringBuffer tempseq;
- if (seqhash.containsKey(id)) {
- tempseq = (StringBuffer) seqhash.get(id);
- } else {
- tempseq = new StringBuffer();
- seqhash.put(id, tempseq);
- }
-
- if (!(headers.contains(id))) {
- headers.addElement(id);
- }
-
- tempseq.append(str.nextToken());
- }
- }
- }
- }
- }
-
- } catch (IOException e) {
- throw (new Exception("Exception parsing clustal file ", e));
- }
-
- if (flag) {
- noSeqs = headers.size();
-
- // Add sequences to the hash
- seqs = new Sequence[headers.size()];
- for (i = 0; i < headers.size(); i++) {
- if (seqhash.get(headers.elementAt(i)) != null) {
- // TODO: develop automatic dictionary typing for sequences
- Sequence newSeq = Seq.newSequence(headers.elementAt(i).toString(),
- seqhash.get(headers.elementAt(i).toString()).toString(),
- SymbolDictionary.STANDARD_AA,0,0);
-
- seqs[i] = newSeq;
-
- } else {
- throw (new Exception("Bizarreness! Can't find sequence for "
- + headers.elementAt(i)));
- }
- }
- }
- return seqs;
- }
-
- public static void WriteClustalWAlignment(java.io.OutputStream os,
- Alignment seqAl) throws IOException {
- System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this method
- AlignmentSequence[] s = seqAl.getAlignmentSequence();
-
- java.io.BufferedWriter out = new BufferedWriter(
- new java.io.OutputStreamWriter(os));
-
- out.write("CLUSTAL\n\n");
-
- int max = 0;
- int maxid = 0;
-
- int i = 0;
-
- while (i < s.length && s[i] != null) {
- String tmp = s[i].getId();
-
- if (s[i].getSequence().length() > max) {
- max = s[i].getSequence().length();
- }
- if (tmp.length() > maxid) {
- maxid = tmp.length();
- }
- i++;
- }
-
- if (maxid < 15) {
- maxid = 15;
- }
- maxid++;
- int len = 60;
- int nochunks = max / len + 1;
-
- for (i = 0; i < nochunks; i++) {
- int j = 0;
- while (j < s.length && s[j] != null) {
- out.write(new Format("%-" + maxid + "s").form(s[j].getId() + " "));
- int start = i * len;
- int end = start + len;
-
- if (end < s[j].getSequence().length() && start < s[j].getSequence().length()) {
- out.write(s[j].getSequence().substring(start, end) + "\n");
- } else {
- if (start < s[j].getSequence().length()) {
- out.write(s[j].getSequence().substring(start) + "\n");
- }
- }
- j++;
- }
- out.write("\n");
-
- }
- }
- /**
- * manufacture an alignment/dataset from an array of sequences
- * @param origin
- * @param seqs
- * @return
- * @throws Exception
- */
- public static Alignment make_Alignment(Entry origin,
- Sequence[] seqs) throws Exception {
- System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this method
- Alignment al = new Alignment();
- al.setProvenance(ProvenanceStuff.newProvenance(origin));
-
- Pattern nonGap = Pattern.compile("[A-Z*0-9]", Pattern.CASE_INSENSITIVE);
- boolean gapsset = false;
- char gapchar = '-';
- int seqLength = 0;
-
- for (int i = 0, nseq = seqs.length; i < nseq; i++) {
- String seq = seqs[i].getSequence();
- String gaps = nonGap.matcher(seq).replaceAll("");
- if (seqLength == 0) {
- seqLength = seq.length();
- } else if (seqLength != seq.length())
- throw (new Exception(i + "th Sequence (>" + seqs[i].getId()
- + ") is not aligned.\n"));// TODO: move this to assertions part of
- // Alignment
-
- // common check for any sequence...
- if (gaps != null && gaps.length() > 0) {
- if (!gapsset)
- gapchar = gaps.charAt(0);
- for (int c = 0, gc = gaps.length(); c < gc; c++) {
- if (gapchar != gaps.charAt(c)) {
- throw (new IOException("Inconsistent gap characters in sequence "
- + i + ": '" + seq + "'"));
- }
- }
- }
- AlignmentSequence sq = new AlignmentSequence();
- // TODO: use as basis of default AlignSequence(Sequence) constructor.
- sq.setSequence(seq);
- sq.setName(seqs[i].getId());
- sq.setRefid(seqs[i].getVorbaId());
- sq.setStart(seqs[i].getStart());
- sq.setEnd(seqs[i].getEnd());
- al.addAlignmentSequence(sq);
- }
- al.setGapChar(String.valueOf(gapchar));
- return al;
- }
-
- public static Alignment read_FastaAlignment(InputStream os, Entry entry)
- throws Exception {
- Sequence[] seqs;
- System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this method
- try {
- seqs = SeqSet.read_SeqFasta(os);
- if (seqs == null)
- throw (new Exception("Empty alignment stream!\n"));
- } catch (Exception e) {
- throw new Exception("Invalid fasta alignment\n", e);
- }
-
- return make_Alignment(entry, seqs);
- }
-
- public static Alignment read_ClustalAlignment(InputStream os, Entry entry)
- throws Exception {
- Sequence[] seqs;
- try {
- seqs = SeqAln.ReadClustalFile(os);
- if (seqs == null)
- throw (new Exception("Empty alignment stream!\n"));
- } catch (Exception e) {
- throw new Exception("Invalid fasta alignment\n", e);
- }
- System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this method
- return make_Alignment(entry, seqs);
- }
-}
+/*\r
+ * This file is part of the Vamsas Client version 0.2. \r
+ * Copyright 2010 by Jim Procter, Iain Milne, Pierre Marguerite, \r
+ * Andrew Waterhouse and Dominik Lindner.\r
+ * \r
+ * Earlier versions have also been incorporated into Jalview version 2.4 \r
+ * since 2008, and TOPALi version 2 since 2007.\r
+ * \r
+ * The Vamsas Client is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU Lesser General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (at your option) any later version.\r
+ * \r
+ * The Vamsas Client 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 Lesser General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU Lesser General Public License\r
+ * along with the Vamsas Client. If not, see <http://www.gnu.org/licenses/>.\r
+ */\r
+package uk.ac.vamsas.objects.utils;\r
+\r
+import java.io.BufferedOutputStream;\r
+import java.io.BufferedReader;\r
+import java.io.BufferedWriter;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.InputStreamReader;\r
+import java.util.Hashtable;\r
+import java.util.StringTokenizer;\r
+import java.util.Vector;\r
+import java.util.regex.Pattern;\r
+\r
+import uk.ac.vamsas.objects.core.*;\r
+\r
+/**\r
+ * @author jimp\r
+ * \r
+ * TODO To change the template for this generated type comment go to\r
+ * Window - Preferences - Java - Code Style - Code Templates\r
+ */\r
+public class SeqAln extends uk.ac.vamsas.objects.core.Alignment {\r
+\r
+ public static Sequence[] ReadClustalFile(InputStream os) throws Exception {\r
+ System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this\r
+ // method\r
+ Pattern nonGap = Pattern.compile("[A-Z*0-9]", Pattern.CASE_INSENSITIVE);\r
+ String gapchars = "";\r
+ char gapchar = '-';\r
+\r
+ int i = 0;\r
+ boolean flag = false;\r
+\r
+ Vector headers = new Vector();\r
+ Hashtable seqhash = new Hashtable();\r
+ Sequence[] seqs = null;\r
+ int noSeqs = 0;\r
+ String line;\r
+\r
+ try {\r
+ BufferedReader ins = new BufferedReader(new InputStreamReader(os));\r
+ while ((line = ins.readLine()) != null) {\r
+ if (line.indexOf(" ") != 0) {\r
+ java.util.StringTokenizer str = new StringTokenizer(line, " ");\r
+ String id = "";\r
+\r
+ if (str.hasMoreTokens()) {\r
+ id = str.nextToken();\r
+ if (id.equals("CLUSTAL")) {\r
+ flag = true;\r
+ } else {\r
+ if (flag) {\r
+ StringBuffer tempseq;\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
+ tempseq.append(str.nextToken());\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ } catch (IOException e) {\r
+ throw (new Exception("Exception parsing clustal file ", e));\r
+ }\r
+\r
+ if (flag) {\r
+ noSeqs = headers.size();\r
+\r
+ // Add sequences to the hash\r
+ seqs = new Sequence[headers.size()];\r
+ for (i = 0; i < headers.size(); i++) {\r
+ if (seqhash.get(headers.elementAt(i)) != null) {\r
+ // TODO: develop automatic dictionary typing for sequences\r
+ Sequence newSeq = Seq.newSequence(headers.elementAt(i).toString(),\r
+ seqhash.get(headers.elementAt(i).toString()).toString(),\r
+ SymbolDictionary.STANDARD_AA, 0, 0);\r
+\r
+ seqs[i] = newSeq;\r
+\r
+ } else {\r
+ throw (new Exception("Bizarreness! Can't find sequence for "\r
+ + headers.elementAt(i)));\r
+ }\r
+ }\r
+ }\r
+ return seqs;\r
+ }\r
+\r
+ public static void WriteClustalWAlignment(java.io.OutputStream os,\r
+ Alignment seqAl) throws IOException {\r
+ System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this\r
+ // method\r
+ AlignmentSequence[] s = seqAl.getAlignmentSequence();\r
+\r
+ java.io.BufferedWriter out = new BufferedWriter(\r
+ new java.io.OutputStreamWriter(os));\r
+\r
+ out.write("CLUSTAL\n\n");\r
+\r
+ int max = 0;\r
+ int maxid = 0;\r
+\r
+ int i = 0;\r
+\r
+ while (i < s.length && s[i] != null) {\r
+ String tmp = s[i].getId();\r
+\r
+ if (s[i].getSequence().length() > max) {\r
+ max = s[i].getSequence().length();\r
+ }\r
+ if (tmp.length() > maxid) {\r
+ maxid = tmp.length();\r
+ }\r
+ i++;\r
+ }\r
+\r
+ if (maxid < 15) {\r
+ maxid = 15;\r
+ }\r
+ maxid++;\r
+ int len = 60;\r
+ int nochunks = max / len + 1;\r
+\r
+ for (i = 0; i < nochunks; i++) {\r
+ int j = 0;\r
+ while (j < s.length && s[j] != null) {\r
+ out.write(new Format("%-" + maxid + "s").form(s[j].getId() + " "));\r
+ int start = i * len;\r
+ int end = start + len;\r
+\r
+ if (end < s[j].getSequence().length()\r
+ && start < s[j].getSequence().length()) {\r
+ out.write(s[j].getSequence().substring(start, end) + "\n");\r
+ } else {\r
+ if (start < s[j].getSequence().length()) {\r
+ out.write(s[j].getSequence().substring(start) + "\n");\r
+ }\r
+ }\r
+ j++;\r
+ }\r
+ out.write("\n");\r
+\r
+ }\r
+ }\r
+\r
+ /**\r
+ * manufacture an alignment/dataset from an array of sequences\r
+ * \r
+ * @param origin\r
+ * @param seqs\r
+ * @return\r
+ * @throws Exception\r
+ */\r
+ public static Alignment make_Alignment(Entry origin, Sequence[] seqs)\r
+ throws Exception {\r
+ System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this\r
+ // method\r
+ Alignment al = new Alignment();\r
+ al.setProvenance(ProvenanceStuff.newProvenance(origin));\r
+\r
+ Pattern nonGap = Pattern.compile("[A-Z*0-9]", Pattern.CASE_INSENSITIVE);\r
+ boolean gapsset = false;\r
+ char gapchar = '-';\r
+ int seqLength = 0;\r
+\r
+ for (int i = 0, nseq = seqs.length; i < nseq; i++) {\r
+ String seq = seqs[i].getSequence();\r
+ String gaps = nonGap.matcher(seq).replaceAll("");\r
+ if (seqLength == 0) {\r
+ seqLength = seq.length();\r
+ } else if (seqLength != seq.length())\r
+ throw (new Exception(i + "th Sequence (>" + seqs[i].getId()\r
+ + ") is not aligned.\n"));// TODO: move this to assertions part of\r
+ // Alignment\r
+\r
+ // common check for any sequence...\r
+ if (gaps != null && gaps.length() > 0) {\r
+ if (!gapsset)\r
+ gapchar = gaps.charAt(0);\r
+ for (int c = 0, gc = gaps.length(); c < gc; c++) {\r
+ if (gapchar != gaps.charAt(c)) {\r
+ throw (new IOException("Inconsistent gap characters in sequence "\r
+ + i + ": '" + seq + "'"));\r
+ }\r
+ }\r
+ }\r
+ AlignmentSequence sq = new AlignmentSequence();\r
+ // TODO: use as basis of default AlignSequence(Sequence) constructor.\r
+ sq.setSequence(seq);\r
+ sq.setName(seqs[i].getId());\r
+ sq.setRefid(seqs[i].getVorbaId());\r
+ sq.setStart(seqs[i].getStart());\r
+ sq.setEnd(seqs[i].getEnd());\r
+ al.addAlignmentSequence(sq);\r
+ }\r
+ al.setGapChar(String.valueOf(gapchar));\r
+ return al;\r
+ }\r
+\r
+ public static Alignment read_FastaAlignment(InputStream os, Entry entry)\r
+ throws Exception {\r
+ Sequence[] seqs;\r
+ System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this\r
+ // method\r
+ try {\r
+ seqs = SeqSet.read_SeqFasta(os);\r
+ if (seqs == null)\r
+ throw (new Exception("Empty alignment stream!\n"));\r
+ } catch (Exception e) {\r
+ throw new Exception("Invalid fasta alignment\n", e);\r
+ }\r
+\r
+ return make_Alignment(entry, seqs);\r
+ }\r
+\r
+ public static Alignment read_ClustalAlignment(InputStream os, Entry entry)\r
+ throws Exception {\r
+ Sequence[] seqs;\r
+ try {\r
+ seqs = SeqAln.ReadClustalFile(os);\r
+ if (seqs == null)\r
+ throw (new Exception("Empty alignment stream!\n"));\r
+ } catch (Exception e) {\r
+ throw new Exception("Invalid fasta alignment\n", e);\r
+ }\r
+ System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this\r
+ // method\r
+ return make_Alignment(entry, seqs);\r
+ }\r
+}\r