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