seq size cant be less than 2 for tree
[jalview.git] / src / jalview / io / JPredFile.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 \r
20 /**\r
21  * PredFile.java\r
22  * JalviewX / Vamsas Project\r
23  * JPred.seq.concise reader\r
24  */\r
25 package jalview.io;\r
26 \r
27 import java.io.*;\r
28 import java.util.*;\r
29 \r
30 import jalview.datamodel.*;\r
31 \r
32 \r
33 /**\r
34  * DOCUMENT ME!\r
35  *\r
36  * @author $author$\r
37  * @version $Revision$\r
38  */\r
39 public class JPredFile extends AlignFile\r
40 {\r
41     Vector ids;\r
42     Vector conf;\r
43     Hashtable Scores; // Hash of names and score vectors\r
44     Hashtable Symscores; // indexes of symbol annotation properties in sequenceI vector\r
45     private int QuerySeqPosition;\r
46 \r
47 \r
48     /**\r
49      * Creates a new JPredFile object.\r
50      *\r
51      * @param inFile DOCUMENT ME!\r
52      * @param type DOCUMENT ME!\r
53      *\r
54      * @throws IOException DOCUMENT ME!\r
55      */\r
56     public JPredFile(String inFile, String type) throws IOException\r
57     {\r
58         super(inFile, type);\r
59     }\r
60 \r
61     /**\r
62      * DOCUMENT ME!\r
63      *\r
64      * @param QuerySeqPosition DOCUMENT ME!\r
65      */\r
66     public void setQuerySeqPosition(int QuerySeqPosition)\r
67     {\r
68         this.QuerySeqPosition = QuerySeqPosition;\r
69     }\r
70 \r
71     /**\r
72      * DOCUMENT ME!\r
73      *\r
74      * @return DOCUMENT ME!\r
75      */\r
76     public int getQuerySeqPosition()\r
77     {\r
78         return QuerySeqPosition;\r
79     }\r
80 \r
81     /**\r
82      * DOCUMENT ME!\r
83      *\r
84      * @return DOCUMENT ME!\r
85      */\r
86     public Hashtable getScores()\r
87     {\r
88         return Scores;\r
89     }\r
90 \r
91     /**\r
92      * DOCUMENT ME!\r
93      *\r
94      * @return DOCUMENT ME!\r
95      */\r
96     public Hashtable getSymscores()\r
97     {\r
98         return Symscores;\r
99     }\r
100 \r
101     /**\r
102      * DOCUMENT ME!\r
103      */\r
104     public void initData()\r
105     {\r
106         super.initData();\r
107         Scores = new Hashtable();\r
108         ids = null;\r
109         conf = null;\r
110     }\r
111 \r
112     /**\r
113  * parse a JPred concise file into a sequence-alignment like object.\r
114  */\r
115     public void parse() throws IOException\r
116     {\r
117         // JBPNote log.System.out.println("all read in ");\r
118         String line;\r
119         QuerySeqPosition = -1;\r
120         noSeqs = 0;\r
121 \r
122         Vector seq_entries = new Vector();\r
123         Vector ids = new Vector();\r
124         Hashtable Symscores = new Hashtable();\r
125 \r
126         while ((line = nextLine()) != null)\r
127         {\r
128             // Concise format allows no comments or non comma-formatted data\r
129             StringTokenizer str = new StringTokenizer(line, ":");\r
130             String id = "";\r
131 \r
132             if (!str.hasMoreTokens())\r
133             {\r
134                 continue;\r
135             }\r
136 \r
137             id = str.nextToken();\r
138 \r
139             String seqsym = str.nextToken();\r
140             StringTokenizer symbols = new StringTokenizer(seqsym, ",");\r
141 \r
142             // decide if we have more than just alphanumeric symbols\r
143             int numSymbols = symbols.countTokens();\r
144 \r
145             if (numSymbols == 0)\r
146             {\r
147                 continue;\r
148             }\r
149 \r
150             if (seqsym.length() != (2 * numSymbols))\r
151             {\r
152                 // Set of scalars for some property\r
153                 if (Scores.containsKey(id))\r
154                 {\r
155                     int i = 1;\r
156 \r
157                     while (Scores.containsKey(id + "_" + i))\r
158                     {\r
159                         i++;\r
160                     }\r
161 \r
162                     id = id + "_" + i;\r
163                 }\r
164 \r
165                 Vector scores = new Vector();\r
166 \r
167                 // Typecheck from first entry\r
168                 int i = 0;\r
169                 String ascore = "dead";\r
170 \r
171                 try\r
172                 {\r
173                     // store elements as floats...\r
174                     while (symbols.hasMoreTokens())\r
175                     {\r
176                         ascore = symbols.nextToken();\r
177 \r
178                         Float score = new Float(ascore);\r
179                         scores.addElement((Object) score);\r
180                     }\r
181 \r
182                     Scores.put(id, scores);\r
183                 }\r
184                 catch (Exception e)\r
185                 {\r
186                     // or just keep them as strings\r
187                     i = scores.size();\r
188 \r
189                     for (int j = 0; j < i; j++)\r
190                     {\r
191                         scores.setElementAt(\r
192                             (Object) ((Float) scores.elementAt(j)).toString(), j);\r
193                     }\r
194 \r
195                     scores.addElement((Object) ascore);\r
196 \r
197                     while (symbols.hasMoreTokens())\r
198                     {\r
199                         ascore = symbols.nextToken();\r
200                         scores.addElement((Object) ascore);\r
201                     }\r
202 \r
203                     Scores.put(id, scores);\r
204                 }\r
205             }\r
206             else if (id.equals("jnetconf"))\r
207             {\r
208                 // log.debug System.out.println("here");\r
209                 id = "Prediction Confidence";\r
210                 this.conf = new Vector(numSymbols);\r
211 \r
212                 for (int i = 0; i < numSymbols; i++)\r
213                 {\r
214                     conf.setElementAt( symbols.nextToken(), i);\r
215                 }\r
216             }\r
217             else\r
218             {\r
219                 // Sequence or a prediction string (rendered as sequence)\r
220                 StringBuffer newseq = new StringBuffer();\r
221 \r
222                 for (int i = 0; i < numSymbols; i++)\r
223                 {\r
224                     newseq.append(symbols.nextToken());\r
225                 }\r
226 \r
227                 if (id.indexOf(";") > -1)\r
228                 {\r
229                     seq_entries.addElement(newseq);\r
230 \r
231                     int i = 1;\r
232                     String name = id.substring(id.indexOf(";") + 1);\r
233 \r
234                     while (ids.lastIndexOf(name) > -1)\r
235                     {\r
236                         name = id.substring(id.indexOf(";") + 1) + "_" + ++i;\r
237                     }\r
238 \r
239                     ids.addElement(name);\r
240 \r
241                     noSeqs++;\r
242                 }\r
243                 else\r
244                 {\r
245                     if (id.equals("JNETPRED"))\r
246                     {\r
247                         id = "Predicted Secondary Structure";\r
248                     }\r
249 \r
250                     seq_entries.addElement(newseq.toString());\r
251                     ids.addElement(id);\r
252                     Symscores.put((Object) id,\r
253                         (Object) new Integer(ids.size() - 1));\r
254                 }\r
255             }\r
256         }\r
257         /* leave it to the parser user to actually check this.\r
258         if (noSeqs < 1)\r
259         {\r
260             throw new IOException(\r
261                 "JpredFile Parser: No sequence in the prediction!");\r
262         }*/\r
263 \r
264         maxLength = seq_entries.elementAt(0).toString().length();\r
265 \r
266         for (int i = 0; i < ids.size(); i++)\r
267         {\r
268             // Add all sequence like objects\r
269             Sequence newSeq = new Sequence(ids.elementAt(i).toString(),\r
270                     seq_entries.elementAt(i).toString(), 1,\r
271                     seq_entries.elementAt(i).toString().length());\r
272 \r
273             if (!Symscores.containsKey(ids.elementAt(i)) &&\r
274                     !isValidProteinSequence(newSeq.getSequence()))\r
275             {\r
276                 throw new IOException("JPredConcise: "\r
277                                       +AppletFormatAdapter.INVALID_CHARACTERS +" : "\r
278                                       +ids.elementAt(i).toString() + ")");\r
279             }\r
280 \r
281             if (maxLength != seq_entries.elementAt(i).toString().length())\r
282             {\r
283                 throw new IOException("JPredConcise: Entry (" +\r
284                     ids.elementAt(i).toString() +\r
285                     ") has an unexpected number of columns");\r
286             }\r
287 \r
288             if (newSeq.getName().startsWith("QUERY") &&\r
289                     (QuerySeqPosition == -1))\r
290             {\r
291                 QuerySeqPosition = seqs.size();\r
292             }\r
293 \r
294             seqs.addElement(newSeq);\r
295         }\r
296     }\r
297 \r
298     /**\r
299  * print\r
300  *\r
301  * @return String\r
302    */\r
303     public String print()\r
304     {\r
305         return "Not Supported";\r
306     }\r
307 \r
308     /**\r
309      * DOCUMENT ME!\r
310      *\r
311      * @param args DOCUMENT ME!\r
312      */\r
313     public static void main(String[] args)\r
314     {\r
315         try\r
316         {\r
317             JPredFile blc = new JPredFile(args[0], "File");\r
318 \r
319             for (int i = 0; i < blc.seqs.size(); i++)\r
320             {\r
321                 System.out.println(((Sequence) blc.seqs.elementAt(i)).getName() +\r
322                     "\n" + ((Sequence) blc.seqs.elementAt(i)).getSequence() +\r
323                     "\n");\r
324             }\r
325         }\r
326         catch (java.io.IOException e)\r
327         {\r
328             System.err.println("Exception " + e);\r
329             e.printStackTrace();\r
330         }\r
331     }\r
332     Vector annotSeqs=null;\r
333   /**\r
334    * removeNonSequences\r
335    */\r
336   public void removeNonSequences()\r
337   {\r
338     if (annotSeqs!=null)\r
339       return;\r
340     annotSeqs = new Vector();\r
341     Vector newseqs = new Vector();\r
342     int i=0;\r
343     int j=seqs.size();\r
344     for (; i<QuerySeqPosition; i++)\r
345         annotSeqs.addElement(seqs.elementAt(i));\r
346       // check that no stray annotations have been added at the end.\r
347       {\r
348         SequenceI sq = (SequenceI) seqs.elementAt(j-1);\r
349         if (sq.getName().toUpperCase().startsWith("JPRED")) {\r
350           annotSeqs.addElement(sq);\r
351           seqs.removeElementAt(--j);\r
352         }\r
353       }\r
354     for (; i<j; i++)\r
355         newseqs.addElement(seqs.elementAt(i));\r
356 \r
357     seqs.removeAllElements();\r
358     seqs = newseqs;\r
359   }\r
360 }\r
361 \r
362 \r
363 /*\r
364  StringBuffer out = new StringBuffer();\r
365 \r
366  out.append("START PRED\n");\r
367  for (int i = 0; i < s[0].sequence.length(); i++)\r
368  {\r
369   out.append(s[0].sequence.substring(i, i + 1) + " ");\r
370   out.append(s[1].sequence.substring(i, i + 1) + " ");\r
371   out.append(s[1].score[0].elementAt(i) + " ");\r
372   out.append(s[1].score[1].elementAt(i) + " ");\r
373   out.append(s[1].score[2].elementAt(i) + " ");\r
374   out.append(s[1].score[3].elementAt(i) + " ");\r
375 \r
376   out.append("\n");\r
377  }\r
378  out.append("END PRED\n");\r
379  return out.toString();\r
380  }\r
381 \r
382     public static void main(String[] args)\r
383  {\r
384   try\r
385   {\r
386     BLCFile blc = new BLCFile(args[0], "File");\r
387     DrawableSequence[] s = new DrawableSequence[blc.seqs.size()];\r
388     for (int i = 0; i < blc.seqs.size(); i++)\r
389     {\r
390       s[i] = new DrawableSequence( (Sequence) blc.seqs.elementAt(i));\r
391     }\r
392     String out = BLCFile.print(s);\r
393 \r
394     AlignFrame af = new AlignFrame(null, s);\r
395     af.resize(700, 500);\r
396     af.show();\r
397     System.out.println(out);\r
398   }\r
399   catch (java.io.IOException e)\r
400   {\r
401     System.out.println("Exception " + e);\r
402   }\r
403  }\r
404 \r
405  }\r
406  */\r