X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fio%2FClustalFile.java;h=8c0cac1e2344a91074d40c570f1b8b9669c4d9e7;hb=b81d4d7d46ea8b1c89df086fb847baab6b69d427;hp=d62d185d9afda45c67c1e5efa4b0f419490de4fa;hpb=3a993bbe274824870c78bd7695c42fa93908cb30;p=jalview.git diff --git a/src/jalview/io/ClustalFile.java b/src/jalview/io/ClustalFile.java index d62d185..8c0cac1 100755 --- a/src/jalview/io/ClustalFile.java +++ b/src/jalview/io/ClustalFile.java @@ -1,20 +1,19 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ package jalview.io; @@ -24,34 +23,35 @@ import java.util.*; import jalview.datamodel.*; import jalview.util.*; -public class ClustalFile - extends AlignFile +public class ClustalFile extends AlignFile { public ClustalFile() { } - public ClustalFile(String inFile, String type) - throws IOException + public ClustalFile(String inFile, String type) throws IOException { super(inFile, type); } + public ClustalFile(FileParse source) throws IOException { super(source); } + public void initData() { super.initData(); } - public void parse() - throws IOException + public void parse() throws IOException { int i = 0; boolean flag = false; - + boolean rna=false; + boolean top=false; + StringBuffer pssecstr=new StringBuffer(),consstr=new StringBuffer(); Vector headers = new Vector(); Hashtable seqhash = new Hashtable(); StringBuffer tempseq; @@ -60,8 +60,12 @@ public class ClustalFile try { - while ( (line = nextLine()) != null) + while ((line = nextLine()) != null) { + if (line.length()==0) + { + top=true; + } if (line.indexOf(" ") != 0) { str = new StringTokenizer(line, " "); @@ -88,7 +92,7 @@ public class ClustalFile seqhash.put(id, tempseq); } - if (! (headers.contains(id))) + if (!(headers.contains(id))) { headers.addElement(id); } @@ -97,6 +101,7 @@ public class ClustalFile { tempseq.append(str.nextToken()); } + top=false; } } } @@ -104,10 +109,19 @@ public class ClustalFile { flag = true; } + } else { + if (line.matches("\\s+(-|\\.|\\(|\\[|\\]|\\))+")) + { + if (top) + { + pssecstr.append(line.trim()); + } else { + consstr.append(line.trim()); + } + } } } - } - catch (IOException e) + } catch (IOException e) { System.err.println("Exception parsing clustal file " + e); e.printStackTrace(); @@ -117,49 +131,67 @@ public class ClustalFile { this.noSeqs = headers.size(); - //Add sequences to the hash + // Add sequences to the hash for (i = 0; i < headers.size(); i++) { if (seqhash.get(headers.elementAt(i)) != null) { if (maxLength < seqhash.get(headers.elementAt(i)).toString() - .length()) + .length()) { maxLength = seqhash.get(headers.elementAt(i)).toString() - .length(); + .length(); } Sequence newSeq = parseId(headers.elementAt(i).toString()); - newSeq.setSequence(seqhash.get(headers.elementAt(i).toString()). - toString()); + newSeq.setSequence(seqhash.get(headers.elementAt(i).toString()) + .toString()); seqs.addElement(newSeq); } else { - System.err.println( - "Clustal File Reader: Can't find sequence for " + - headers.elementAt(i)); + System.err + .println("Clustal File Reader: Can't find sequence for " + + headers.elementAt(i)); + } + } + AlignmentAnnotation lastssa=null; + if (pssecstr.length()==maxLength) + { + Vector ss=new Vector(); + AlignmentAnnotation ssa=lastssa=StockholmFile.parseAnnotationRow(ss, "secondary structure", pssecstr.toString()); + ssa.label="Secondary Structure"; + annotations.addElement(ssa); + } + if (consstr.length()==maxLength) + { + Vector ss=new Vector(); + AlignmentAnnotation ssa=StockholmFile.parseAnnotationRow(ss, "secondary structure", consstr.toString()); + ssa.label="Consensus Secondary Structure"; + if (lastssa==null || !lastssa.getRNAStruc().equals(ssa.getRNAStruc().replace('-', '.'))) + { + annotations.addElement(ssa); } } } } - public String print() { return print(getSeqsAsArray()); + // TODO: locaRNA style aln output } public String print(SequenceI[] s) { - StringBuffer out = new StringBuffer("CLUSTAL\n\n"); + StringBuffer out = new StringBuffer("CLUSTAL"+newline+newline); int max = 0; int maxid = 0; int i = 0; - while ( (i < s.length) && (s[i] != null)) + while ((i < s.length) && (s[i] != null)) { String tmp = printId(s[i]); @@ -190,15 +222,15 @@ public class ClustalFile { int j = 0; - while ( (j < s.length) && (s[j] != null)) + while ((j < s.length) && (s[j] != null)) { out.append(new Format("%-" + maxid + "s").form(printId(s[j]) + " ")); int start = i * len; int end = start + len; - if ( (end < s[j].getSequence().length) && - (start < s[j].getSequence().length)) + if ((end < s[j].getSequence().length) + && (start < s[j].getSequence().length)) { out.append(s[j].getSequenceAsString(start, end)); } @@ -210,11 +242,11 @@ public class ClustalFile } } - out.append("\n"); + out.append(newline); j++; } - out.append("\n"); + out.append(newline); } return out.toString();