0edcb63556fc402b41d1a9fdb3f0d9dcbc0b2657
[jalview.git] / src / jalview / io / BLCFile.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 jalview.datamodel.*;\r
22 \r
23 import java.io.*;\r
24 \r
25 import java.util.*;\r
26 \r
27 \r
28 /**\r
29  * DOCUMENT ME!\r
30  *\r
31  * @author $author$\r
32  * @version $Revision$\r
33  */\r
34 public class BLCFile extends AlignFile\r
35 {\r
36     Vector titles;\r
37 \r
38     /**\r
39      * Creates a new BLCFile object.\r
40      */\r
41     public BLCFile()\r
42     {\r
43     }\r
44 \r
45     /**\r
46      * Creates a new BLCFile object.\r
47      *\r
48      * @param inStr DOCUMENT ME!\r
49      */\r
50     public BLCFile(String inStr)\r
51     {\r
52         super(inStr);\r
53     }\r
54 \r
55     /**\r
56      * Creates a new BLCFile object.\r
57      *\r
58      * @param inFile DOCUMENT ME!\r
59      * @param type DOCUMENT ME!\r
60      *\r
61      * @throws IOException DOCUMENT ME!\r
62      */\r
63     public BLCFile(String inFile, String type) throws IOException\r
64     {\r
65         super(inFile, type);\r
66     }\r
67 \r
68     /**\r
69      * DOCUMENT ME!\r
70      */\r
71     public void initData()\r
72     {\r
73         super.initData();\r
74         titles = new Vector();\r
75     }\r
76 \r
77     /**\r
78      * DOCUMENT ME!\r
79      */\r
80     public void parse()\r
81     {\r
82         boolean idsFound = false;\r
83         Vector ids = new Vector();\r
84         StringBuffer[] seqstrings;\r
85         Vector starts = new Vector();\r
86         Vector ends = new Vector();\r
87 \r
88         String line = null;\r
89 \r
90         try\r
91         {\r
92             do\r
93             {\r
94                 line = nextLine();\r
95 \r
96                 // seek end of ids\r
97                 if (line.indexOf("*") > -1)\r
98                 {\r
99                     idsFound = true;\r
100 \r
101                     break;\r
102                 }\r
103 \r
104                 int abracket = line.indexOf(">");\r
105 \r
106                 if (abracket > -1)\r
107                 {\r
108                     if (line.indexOf(" ") > -1) //\r
109                     {\r
110                         ///Colur it be this format?\r
111                         //>54402046         0             1   137   137:\r
112                         // or this??\r
113                         //     1   >L1H14       30539  343\r
114                         try\r
115                         {\r
116                             ids.addElement(line.substring(abracket + 1,\r
117                                     line.indexOf(" ", abracket + 1)));\r
118 \r
119                             // remove p Value\r
120                             line = line.substring(abracket + 1);\r
121                             line = line.substring(line.indexOf(" ") + 1);\r
122                             line = line.trim();\r
123                             line = line.substring(line.indexOf(" ") + 1);\r
124                             line = line.trim();\r
125 \r
126                             int value = Integer.parseInt(line.substring(0,\r
127                                         line.indexOf(" ")));\r
128                             starts.addElement(value + "");\r
129                             line = line.substring(line.indexOf(" ") + 1);\r
130                             line = line.trim();\r
131                             value = Integer.parseInt(line.substring(0,\r
132                                         line.indexOf(" ")));\r
133                             ends.addElement(value + "");\r
134                         }\r
135                         catch (Exception ex)\r
136                         {\r
137                             System.err.println("Error during blockfile read.");\r
138                             ex.printStackTrace();\r
139                             starts.addElement("1");\r
140                             ends.addElement("-1");\r
141                         }\r
142                     }\r
143                     else\r
144                     {\r
145                         if (line.indexOf("/") > -1)\r
146                         {\r
147                             ids.addElement(line.substring(abracket + 1,\r
148                                     line.indexOf("/")));\r
149                             line = line.substring(line.indexOf("/") + 1);\r
150                             starts.addElement(line.substring(0,\r
151                                     line.indexOf("-")));\r
152                             ends.addElement(line.substring(line.indexOf("-") +\r
153                                     1));\r
154                         }\r
155                         else\r
156                         {\r
157                             ids.addElement(line.substring(abracket + 1));\r
158                             starts.addElement("1");\r
159                             ends.addElement("-1");\r
160                         }\r
161                     }\r
162                 }\r
163             }\r
164             while (!idsFound);\r
165 \r
166             int starCol = line.indexOf("*");\r
167             seqstrings = new StringBuffer[ids.size()];\r
168 \r
169             for (int i = 0; i < ids.size(); i++)\r
170             {\r
171                 if (seqstrings[i] == null)\r
172                 {\r
173                     seqstrings[i] = new StringBuffer();\r
174                 }\r
175             }\r
176 \r
177             while ((line = nextLine()).indexOf("*") == -1)\r
178             {\r
179                 for (int i = 0; i < ids.size(); i++)\r
180                 {\r
181                     if (line.length() > (i + starCol))\r
182                     {\r
183                         seqstrings[i].append(line.charAt(i + starCol));\r
184                     }\r
185                 }\r
186             }\r
187 \r
188             for (int i = 0; i < ids.size(); i++)\r
189             {\r
190                 Sequence newSeq = new Sequence(ids.elementAt(i).toString(),\r
191                         seqstrings[i].toString(),\r
192                         Integer.parseInt(starts.elementAt(i).toString()),\r
193                         Integer.parseInt(ends.elementAt(i).toString()));\r
194                 seqs.addElement(newSeq);\r
195             }\r
196         }\r
197         catch (Exception ex)\r
198         {\r
199             ex.printStackTrace();\r
200         }\r
201     }\r
202 \r
203     /**\r
204      * DOCUMENT ME!\r
205      *\r
206      * @return DOCUMENT ME!\r
207      */\r
208     public String print()\r
209     {\r
210         return print(getSeqsAsArray());\r
211     }\r
212 \r
213     /**\r
214      * DOCUMENT ME!\r
215      *\r
216      * @param s DOCUMENT ME!\r
217      *\r
218      * @return DOCUMENT ME!\r
219      */\r
220     public static String print(SequenceI[] s)\r
221     {\r
222         StringBuffer out = new StringBuffer();\r
223 \r
224         int i = 0;\r
225         int max = -1;\r
226 \r
227         while ((i < s.length) && (s[i] != null))\r
228         {\r
229             out.append(">" + s[i].getName() + "/" + s[i].getStart() + "-" +\r
230                 s[i].getEnd() + "\n");\r
231 \r
232             if (s[i].getSequence().length() > max)\r
233             {\r
234                 max = s[i].getSequence().length();\r
235             }\r
236 \r
237             i++;\r
238         }\r
239 \r
240         out.append("* iteration 1\n");\r
241 \r
242         for (int j = 0; j < max; j++)\r
243         {\r
244             i = 0;\r
245 \r
246             while ((i < s.length) && (s[i] != null))\r
247             {\r
248                 if (s[i].getSequence().length() > j)\r
249                 {\r
250                     out.append(s[i].getSequence().substring(j, j + 1));\r
251                 }\r
252                 else\r
253                 {\r
254                     out.append("-");\r
255                 }\r
256 \r
257                 i++;\r
258             }\r
259 \r
260             out.append("\n");\r
261         }\r
262 \r
263         out.append("*\n");\r
264 \r
265         return out.toString();\r
266     }\r
267 }\r