seq size cant be less than 2 for tree
[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     /**\r
47      * Creates a new BLCFile object.\r
48      *\r
49      * @param inFile DOCUMENT ME!\r
50      * @param type DOCUMENT ME!\r
51      *\r
52      * @throws IOException DOCUMENT ME!\r
53      */\r
54     public BLCFile(String inFile, String type) throws IOException\r
55     {\r
56         super(inFile, type);\r
57     }\r
58 \r
59     /**\r
60      * DOCUMENT ME!\r
61      */\r
62     public void initData()\r
63     {\r
64         super.initData();\r
65         titles = new Vector();\r
66     }\r
67 \r
68     /**\r
69      * DOCUMENT ME!\r
70      */\r
71     public void parse() throws IOException\r
72     {\r
73         boolean idsFound = false;\r
74         Vector ids = new Vector();\r
75         StringBuffer[] seqstrings;\r
76         Vector starts = new Vector();\r
77         Vector ends = new Vector();\r
78 \r
79         String line = null;\r
80 \r
81             do\r
82             {\r
83                 line = nextLine();\r
84 \r
85                 // seek end of ids\r
86                 if (line.indexOf("*") > -1)\r
87                 {\r
88                     idsFound = true;\r
89 \r
90                     break;\r
91                 }\r
92 \r
93                 int abracket = line.indexOf(">");\r
94 \r
95                 if (abracket > -1)\r
96                 {\r
97                   if (line.indexOf(" ") > -1) //\r
98                   {\r
99                     line = line.substring(abracket + 1,\r
100                                           line.indexOf(" ", abracket + 1));\r
101                   }\r
102                   else\r
103                     line = line.substring(abracket+1);\r
104 \r
105 \r
106                   Sequence seq = parseId(line);\r
107                   ids.addElement(seq.getName());\r
108                   starts.addElement(seq.getStart() + "");\r
109                   ends.addElement(seq.getEnd() + "");\r
110                 }\r
111             }\r
112             while (!idsFound);\r
113 \r
114             int starCol = line.indexOf("*");\r
115             seqstrings = new StringBuffer[ids.size()];\r
116 \r
117             for (int i = 0; i < ids.size(); i++)\r
118             {\r
119                 if (seqstrings[i] == null)\r
120                 {\r
121                     seqstrings[i] = new StringBuffer();\r
122                 }\r
123             }\r
124 \r
125             while ((line = nextLine()).indexOf("*") == -1)\r
126             {\r
127                 for (int i = 0; i < ids.size(); i++)\r
128                 {\r
129                     if (line.length() > (i + starCol))\r
130                     {\r
131                         seqstrings[i].append(line.charAt(i + starCol));\r
132                     }\r
133                 }\r
134             }\r
135 \r
136             for (int i = 0; i < ids.size(); i++)\r
137             {\r
138               Sequence newSeq = new Sequence(ids.elementAt(i).toString(),\r
139                                              seqstrings[i].toString(),\r
140                                              Integer.parseInt(starts.elementAt(i).\r
141                                                               toString()),\r
142                                              Integer.parseInt(ends.elementAt(i).toString()));\r
143 \r
144               if (!isValidProteinSequence(newSeq.getSequence()))\r
145               {\r
146                 throw new IOException(AppletFormatAdapter.INVALID_CHARACTERS\r
147                                +" : "+ newSeq.getName()\r
148                                +" : "+invalidCharacter);\r
149 \r
150               }\r
151 \r
152                 seqs.addElement(newSeq);\r
153             }\r
154 \r
155     }\r
156 \r
157     /**\r
158      * DOCUMENT ME!\r
159      *\r
160      * @return DOCUMENT ME!\r
161      */\r
162     public String print()\r
163     {\r
164         return print(getSeqsAsArray());\r
165     }\r
166 \r
167     /**\r
168      * DOCUMENT ME!\r
169      *\r
170      * @param s DOCUMENT ME!\r
171      *\r
172      * @return DOCUMENT ME!\r
173      */\r
174     public String print(SequenceI[] s)\r
175     {\r
176         StringBuffer out = new StringBuffer();\r
177         /**\r
178          * A general parser for ids. Will look for dbrefs in\r
179          * Uniprot format source|id\r
180          * And also Jalview /start-end\r
181          *\r
182          * @String id Id to be parsed\r
183      */\r
184         int i = 0;\r
185         int max = -1;\r
186 \r
187         while ((i < s.length) && (s[i] != null))\r
188         {\r
189             out.append(">" + printId(s[i]) +"\n");\r
190 \r
191             if (s[i].getSequence().length() > max)\r
192             {\r
193                 max = s[i].getSequence().length();\r
194             }\r
195 \r
196             i++;\r
197         }\r
198 \r
199         out.append("* iteration 1\n");\r
200 \r
201         for (int j = 0; j < max; j++)\r
202         {\r
203             i = 0;\r
204 \r
205             while ((i < s.length) && (s[i] != null))\r
206             {\r
207                 if (s[i].getSequence().length() > j)\r
208                 {\r
209                     out.append(s[i].getSequence().substring(j, j + 1));\r
210                 }\r
211                 else\r
212                 {\r
213                     out.append("-");\r
214                 }\r
215 \r
216                 i++;\r
217             }\r
218 \r
219             out.append("\n");\r
220         }\r
221 \r
222         out.append("*\n");\r
223 \r
224         return out.toString();\r
225     }\r
226 }\r