/* * 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. * * 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; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; import jalview.util.Format; import jalview.util.MessageManager; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; public class PfamFile extends AlignFile { public PfamFile() { } public PfamFile(String inFile, DataSourceType sourceType) throws IOException { super(inFile, sourceType); } public PfamFile(FileParse source) throws IOException { super(source); } @Override public void initData() { super.initData(); } @Override public void parse() throws IOException { int i = 0; String line; HashMap seqhash = new HashMap(); ArrayList headers = new ArrayList(); boolean useTabs = false; int spces; while ((line = nextLine()) != null) { if (line.indexOf("#") == 0) { // skip comment lines continue; } // locate first space or (if already checked), tab if (useTabs) { spces = line.indexOf("\t"); } else { spces = line.indexOf(" "); // check to see if we ought to split on tabs instead. if (!useTabs && spces == -1) { useTabs = true; spces = line.indexOf("\t"); } } if (spces <= 0) { // no sequence data to split on continue; } String id = line.substring(0, spces); StringBuffer tempseq; if (seqhash.containsKey(id)) { tempseq = seqhash.get(id); } else { tempseq = new StringBuffer(); seqhash.put(id, tempseq); } if (!(headers.contains(id))) { headers.add(id); } if (spces + 1 < line.length()) { tempseq.append(line.substring(spces + 1).trim()); } } this.noSeqs = headers.size(); if (noSeqs < 1) { throw new IOException(MessageManager .getString("exception.pfam_no_sequences_found")); } for (i = 0; i < headers.size(); i++) { if (seqhash.get(headers.get(i)) != null) { if (maxLength < seqhash.get(headers.get(i)).toString().length()) { maxLength = seqhash.get(headers.get(i)).toString().length(); } Sequence newSeq = parseId(headers.get(i).toString()); newSeq.setSequence( seqhash.get(headers.get(i).toString()).toString()); seqs.addElement(newSeq); } else { System.err.println("PFAM File reader: Can't find sequence for " + headers.get(i)); } } } @Override public String print(SequenceI[] s, boolean jvsuffix) { StringBuffer out = new StringBuffer(""); int max = 0; int maxid = 0; int i = 0; while ((i < s.length) && (s[i] != null)) { String tmp = printId(s[i], jvsuffix); if (s[i].getSequence().length > max) { max = s[i].getSequence().length; } if (tmp.length() > maxid) { maxid = tmp.length(); } i++; } if (maxid < 15) { maxid = 15; } int j = 0; while ((j < s.length) && (s[j] != null)) { out.append(new Format("%-" + maxid + "s") .form(printId(s[j], jvsuffix) + " ")); out.append(s[j].getSequenceAsString()); out.append(newline); j++; } out.append(newline); return out.toString(); } }