X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FClustalFile.java;h=c5581867c48d1934c4c4b8cfaede90e62de08147;hb=refs%2Fheads%2Fpatch%2FJAL-1236_customClustalHeader;hp=83045a25a0decc3b245d4e87d63126a33249d09e;hpb=b57a02c25e335d033c97f8a6bacd6b54f62bd2b6;p=jalview.git diff --git a/src/jalview/io/ClustalFile.java b/src/jalview/io/ClustalFile.java index 83045a2..c558186 100755 --- a/src/jalview/io/ClustalFile.java +++ b/src/jalview/io/ClustalFile.java @@ -1,59 +1,81 @@ /* - * 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 + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ 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. - * + * 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 . + * 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; -import java.io.*; -import java.util.*; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceI; +import jalview.util.Format; -import jalview.datamodel.*; -import jalview.util.*; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.Vector; public class ClustalFile extends AlignFile { public ClustalFile() { + _initHeader(); } - public ClustalFile(String inFile, String type) throws IOException + public ClustalFile(String inFile, DataSourceType sourceType) + throws IOException { - super(inFile, type); + super(inFile, sourceType); + _initHeader(); } public ClustalFile(FileParse source) throws IOException { super(source); + _initHeader(); + } + + private void _initHeader() + { + try { + clustalHeader = jalview.bin.Cache.getDefault("CLUSTAL_HEADER","CLUSTAL"); + } catch (Error e) {}; + } + @Override public void initData() { super.initData(); } + @Override 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 pssecstr = new StringBuffer(); + StringBuffer consstr = new StringBuffer(); + Vector headers = new Vector<>(); + Map seqhash = new HashMap<>(); StringBuffer tempseq; String line, id; StringTokenizer str; @@ -66,14 +88,16 @@ public class ClustalFile extends AlignFile { top = true; } - if (line.indexOf(" ") != 0) + boolean isConservation = line.startsWith(SPACE) + || line.startsWith(TAB); + if (!isConservation) { - str = new StringTokenizer(line, " "); + str = new StringTokenizer(line); if (str.hasMoreTokens()) { id = str.nextToken(); - + // TODO: JAL-1236 other tokens may be indicative of a header for Clustal format if (id.equalsIgnoreCase("CLUSTAL")) { flag = true; @@ -84,7 +108,7 @@ public class ClustalFile extends AlignFile { if (seqhash.containsKey(id)) { - tempseq = (StringBuffer) seqhash.get(id); + tempseq = seqhash.get(id); } else { @@ -148,22 +172,21 @@ public class ClustalFile extends AlignFile } 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(); + Vector ss = new Vector<>(); AlignmentAnnotation ssa = lastssa = StockholmFile .parseAnnotationRow(ss, "secondary structure", pssecstr.toString()); @@ -172,29 +195,27 @@ public class ClustalFile extends AlignFile } if (consstr.length() == maxLength) { - Vector ss = new Vector(); + 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('-', '.'))) + 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) + /** + * clustal header - customise if needed + */ + public String clustalHeader = "CLUSTAL"; + + @Override + public String print(SequenceI[] s, boolean jvsuffix) { - StringBuffer out = new StringBuffer("CLUSTAL" + newline + newline); + StringBuffer out = new StringBuffer(clustalHeader + newline + newline); int max = 0; int maxid = 0; @@ -203,12 +224,9 @@ public class ClustalFile extends AlignFile while ((i < s.length) && (s[i] != null)) { - String tmp = printId(s[i]); + String tmp = printId(s[i], jvsuffix); - if (s[i].getSequence().length > max) - { - max = s[i].getSequence().length; - } + max = Math.max(max, s[i].getLength()); if (tmp.length() > maxid) { @@ -226,7 +244,7 @@ public class ClustalFile extends AlignFile maxid++; int len = 60; - int nochunks = (max / len) + 1; + int nochunks = (max / len) + (max % len > 0 ? 1 : 0); for (i = 0; i < nochunks; i++) { @@ -234,21 +252,22 @@ public class ClustalFile extends AlignFile while ((j < s.length) && (s[j] != null)) { - out.append(new Format("%-" + maxid + "s").form(printId(s[j]) + " ")); + out.append(new Format("%-" + maxid + "s") + .form(printId(s[j], jvsuffix) + " ")); - int start = i * len; - int end = start + len; + int chunkStart = i * len; + int chunkEnd = chunkStart + len; - if ((end < s[j].getSequence().length) - && (start < s[j].getSequence().length)) + int length = s[j].getLength(); + if ((chunkEnd < length) && (chunkStart < length)) { - out.append(s[j].getSequenceAsString(start, end)); + out.append(s[j].getSequenceAsString(chunkStart, chunkEnd)); } else { - if (start < s[j].getSequence().length) + if (chunkStart < length) { - out.append(s[j].getSequenceAsString().substring(start)); + out.append(s[j].getSequenceAsString().substring(chunkStart)); } }