X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FClustalFile.java;h=bc6ca7f154b32c41a37abea36ade2c3d758465f5;hb=865a855a4ca87eadb3e5ff284ed32ed307d9c34b;hp=d62d185d9afda45c67c1e5efa4b0f419490de4fa;hpb=3a993bbe274824870c78bd7695c42fa93908cb30;p=jalview.git diff --git a/src/jalview/io/ClustalFile.java b/src/jalview/io/ClustalFile.java index d62d185..bc6ca7f 100755 --- a/src/jalview/io/ClustalFile.java +++ b/src/jalview/io/ClustalFile.java @@ -1,20 +1,20 @@ /* - * 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.8.0b1) + * Copyright (C) 2014 The Jalview Authors + * + * 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 . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.io; @@ -24,34 +24,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 +61,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 +93,7 @@ public class ClustalFile seqhash.put(id, tempseq); } - if (! (headers.contains(id))) + if (!(headers.contains(id))) { headers.addElement(id); } @@ -97,6 +102,7 @@ public class ClustalFile { tempseq.append(str.nextToken()); } + top = false; } } } @@ -105,9 +111,22 @@ 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,29 +136,52 @@ 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); } } } @@ -148,18 +190,19 @@ public class ClustalFile 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 +233,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 +253,11 @@ public class ClustalFile } } - out.append("\n"); + out.append(newline); j++; } - out.append("\n"); + out.append(newline); } return out.toString();