Report invalid chars
[jalview.git] / src / jalview / io / PfamFile.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 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 inStr)\r
36   {\r
37     super(inStr);\r
38   }\r
39 \r
40   public PfamFile(String inFile, String type)\r
41       throws IOException\r
42   {\r
43     super(inFile, type);\r
44   }\r
45 \r
46   public void initData()\r
47   {\r
48     super.initData();\r
49   }\r
50 \r
51   public void parse() throws IOException\r
52   {\r
53     int i = 0;\r
54     String line;\r
55 \r
56     Hashtable seqhash = new Hashtable();\r
57     Vector headers = new Vector();\r
58 \r
59     while ( (line = nextLine()) != null)\r
60     {\r
61       if (line.indexOf(" ") != 0)\r
62       {\r
63         if (line.indexOf("#") != 0)\r
64         {\r
65           StringTokenizer str = new StringTokenizer(line, " ");\r
66           String id = "";\r
67 \r
68           if (str.hasMoreTokens())\r
69           {\r
70             id = str.nextToken();\r
71 \r
72             StringBuffer tempseq;\r
73 \r
74             if (seqhash.containsKey(id))\r
75             {\r
76               tempseq = (StringBuffer) seqhash.get(id);\r
77             }\r
78             else\r
79             {\r
80               tempseq = new StringBuffer();\r
81               seqhash.put(id, tempseq);\r
82             }\r
83 \r
84             if (! (headers.contains(id)))\r
85             {\r
86               headers.addElement(id);\r
87             }\r
88 \r
89             tempseq.append(str.nextToken());\r
90           }\r
91         }\r
92       }\r
93     }\r
94 \r
95     this.noSeqs = headers.size();\r
96 \r
97     if (noSeqs < 1)\r
98     {\r
99       throw new IOException("No sequences found (PFAM input)");\r
100     }\r
101 \r
102     for (i = 0; i < headers.size(); i++)\r
103     {\r
104       if (seqhash.get(headers.elementAt(i)) != null)\r
105       {\r
106         if (maxLength < seqhash.get(headers.elementAt(i)).toString()\r
107             .length())\r
108         {\r
109           maxLength = seqhash.get(headers.elementAt(i)).toString()\r
110               .length();\r
111         }\r
112 \r
113 \r
114         Sequence newSeq = parseId(headers.elementAt(i).toString());\r
115         newSeq.setSequence( seqhash.get(headers.elementAt(i).toString()).toString());\r
116         seqs.addElement(newSeq);\r
117 \r
118         if (!isValidProteinSequence(newSeq.getSequence()))\r
119         {\r
120           throw new IOException(AppletFormatAdapter.INVALID_CHARACTERS\r
121                                 +" : "+ newSeq.getName()\r
122                                 +" : "+invalidCharacter);\r
123         }\r
124       }\r
125       else\r
126       {\r
127         System.err.println("PFAM File reader: Can't find sequence for " +\r
128                            headers.elementAt(i));\r
129       }\r
130     }\r
131   }\r
132 \r
133   public String print(SequenceI[] s)\r
134   {\r
135     StringBuffer out = new StringBuffer("");\r
136 \r
137     int max = 0;\r
138     int maxid = 0;\r
139 \r
140     int i = 0;\r
141 \r
142     while ( (i < s.length) && (s[i] != null))\r
143     {\r
144       String tmp = printId(s[i]);\r
145 \r
146       if (s[i].getSequence().length() > max)\r
147       {\r
148         max = s[i].getSequence().length();\r
149       }\r
150 \r
151       if (tmp.length() > maxid)\r
152       {\r
153         maxid = tmp.length();\r
154       }\r
155 \r
156       i++;\r
157     }\r
158 \r
159     if (maxid < 15)\r
160     {\r
161       maxid = 15;\r
162     }\r
163 \r
164     int j = 0;\r
165 \r
166     while ( (j < s.length) && (s[j] != null))\r
167     {\r
168       out.append(new Format("%-" + maxid + "s").form( printId(s[j])+" "));\r
169 \r
170       out.append(s[j].getSequence() + "\n");\r
171       j++;\r
172     }\r
173 \r
174     out.append("\n");\r
175 \r
176     return out.toString();\r
177   }\r
178 \r
179   public String print()\r
180   {\r
181     return print(getSeqsAsArray());\r
182   }\r
183 }\r