Any character non aa or nucleotide is a space
[jalview.git] / src / jalview / io / PfamFile.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.io;\r
20 \r
21 import java.io.*;\r
22 import java.util.*;\r
23 \r
24 import jalview.datamodel.*;\r
25 import jalview.util.*;\r
26 \r
27 public class PfamFile\r
28     extends AlignFile\r
29 {\r
30 \r
31   public PfamFile()\r
32   {\r
33   }\r
34 \r
35   public PfamFile(String inFile, String type)\r
36       throws IOException\r
37   {\r
38     super(inFile, type);\r
39   }\r
40 \r
41   public void initData()\r
42   {\r
43     super.initData();\r
44   }\r
45 \r
46   public void parse() throws IOException\r
47   {\r
48     int i = 0;\r
49     String line;\r
50 \r
51     Hashtable seqhash = new Hashtable();\r
52     Vector headers = new Vector();\r
53 \r
54     while ( (line = nextLine()) != null)\r
55     {\r
56       if (line.indexOf(" ") != 0)\r
57       {\r
58         if (line.indexOf("#") != 0)\r
59         {\r
60           StringTokenizer str = new StringTokenizer(line, " ");\r
61           String id = "";\r
62 \r
63           if (str.hasMoreTokens())\r
64           {\r
65             id = str.nextToken();\r
66 \r
67             StringBuffer tempseq;\r
68 \r
69             if (seqhash.containsKey(id))\r
70             {\r
71               tempseq = (StringBuffer) seqhash.get(id);\r
72             }\r
73             else\r
74             {\r
75               tempseq = new StringBuffer();\r
76               seqhash.put(id, tempseq);\r
77             }\r
78 \r
79             if (! (headers.contains(id)))\r
80             {\r
81               headers.addElement(id);\r
82             }\r
83 \r
84             tempseq.append(str.nextToken());\r
85           }\r
86         }\r
87       }\r
88     }\r
89 \r
90     this.noSeqs = headers.size();\r
91 \r
92     if (noSeqs < 1)\r
93     {\r
94       throw new IOException("No sequences found (PFAM input)");\r
95     }\r
96 \r
97     for (i = 0; i < headers.size(); i++)\r
98     {\r
99       if (seqhash.get(headers.elementAt(i)) != null)\r
100       {\r
101         if (maxLength < seqhash.get(headers.elementAt(i)).toString()\r
102             .length())\r
103         {\r
104           maxLength = seqhash.get(headers.elementAt(i)).toString()\r
105               .length();\r
106         }\r
107 \r
108 \r
109         Sequence newSeq = parseId(headers.elementAt(i).toString());\r
110         newSeq.setSequence( seqhash.get(headers.elementAt(i).toString()).toString());\r
111         seqs.addElement(newSeq);\r
112      }\r
113       else\r
114       {\r
115         System.err.println("PFAM File reader: Can't find sequence for " +\r
116                            headers.elementAt(i));\r
117       }\r
118     }\r
119   }\r
120 \r
121   public String print(SequenceI[] s)\r
122   {\r
123     StringBuffer out = new StringBuffer("");\r
124 \r
125     int max = 0;\r
126     int maxid = 0;\r
127 \r
128     int i = 0;\r
129 \r
130     while ( (i < s.length) && (s[i] != null))\r
131     {\r
132       String tmp = printId(s[i]);\r
133 \r
134       if (s[i].getSequence().length > max)\r
135       {\r
136         max = s[i].getSequence().length;\r
137       }\r
138 \r
139       if (tmp.length() > maxid)\r
140       {\r
141         maxid = tmp.length();\r
142       }\r
143 \r
144       i++;\r
145     }\r
146 \r
147     if (maxid < 15)\r
148     {\r
149       maxid = 15;\r
150     }\r
151 \r
152     int j = 0;\r
153 \r
154     while ( (j < s.length) && (s[j] != null))\r
155     {\r
156       out.append(new Format("%-" + maxid + "s").form( printId(s[j])+" "));\r
157 \r
158       out.append(s[j].getSequenceAsString() + "\n");\r
159       j++;\r
160     }\r
161 \r
162     out.append("\n");\r
163 \r
164     return out.toString();\r
165   }\r
166 \r
167   public String print()\r
168   {\r
169     return print(getSeqsAsArray());\r
170   }\r
171 }\r