Formatting changes
[jalview.git] / src / jalview / io / FastaFile.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.analysis.*;\r
22 \r
23 import jalview.datamodel.*;\r
24 \r
25 import java.io.*;\r
26 \r
27 import java.util.*;\r
28 \r
29 \r
30 /**\r
31  * DOCUMENT ME!\r
32  *\r
33  * @author $author$\r
34  * @version $Revision$\r
35  */\r
36 public class FastaFile extends AlignFile\r
37 {\r
38     /**\r
39      * Creates a new FastaFile object.\r
40      */\r
41     public FastaFile()\r
42     {\r
43     }\r
44 \r
45     /**\r
46      * Creates a new FastaFile object.\r
47      *\r
48      * @param inStr DOCUMENT ME!\r
49      */\r
50     public FastaFile(String inStr)\r
51     {\r
52         super(inStr);\r
53     }\r
54 \r
55     /**\r
56      * Creates a new FastaFile 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 FastaFile(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      * @throws IOException DOCUMENT ME!\r
72      */\r
73     public void parse() throws IOException\r
74     {\r
75         String id = "";\r
76         StringBuffer seq = new StringBuffer();\r
77         int count = 0;\r
78 \r
79         int sstart = 0;\r
80         int send = 0;\r
81 \r
82         String line;\r
83 \r
84         while ((line = nextLine()) != null)\r
85         {\r
86             if (line.length() > 0)\r
87             {\r
88                 // Do we have an id line?\r
89                 // JBPNote - this code needs to be standardised to EBI/whatever for the\r
90                 // >dbref/dbref/dbref|refid1|refid2|refid3 'human-readable' style of naming (should it really exist)\r
91                 if (line.substring(0, 1).equals(">"))\r
92                 {\r
93                     if (count != 0)\r
94                     {\r
95                         if (sstart != 0)\r
96                         {\r
97                             seqs.addElement(new Sequence(id, seq.toString(),\r
98                                     sstart, send));\r
99                         }\r
100                         else\r
101                         {\r
102                             seqs.addElement(new Sequence(id, seq.toString(), 1,\r
103                                     seq.length()));\r
104                         }\r
105                     }\r
106 \r
107                     count++;\r
108 \r
109                     StringTokenizer str = new StringTokenizer(line, " ");\r
110 \r
111                     id = str.nextToken();\r
112                     id = id.substring(1);\r
113 \r
114                     com.stevesoft.pat.Regex dbId = new com.stevesoft.pat.Regex(\r
115                             "[A-Za-z-]+/?[A-Za-z-]+\\|(\\w+)\\|(.+)");\r
116 \r
117                     // JBPNote At the moment - we don't get rid of the friendly names but this\r
118                     // behaviour is probably wrong in the long run.\r
119                     if (dbId.search(id))\r
120                     {\r
121                         String dbid = dbId.stringMatched(1);\r
122                         String idname = dbId.stringMatched(2);\r
123 \r
124                         if ((idname.length() > 0) &&\r
125                                 (idname.indexOf("_") > -1))\r
126                         {\r
127                             id = idname; // use the friendly name - apparently no dbid\r
128                         }\r
129                         else if (dbid.length() > 1)\r
130                         {\r
131                             id = dbid; // ignore the friendly name - we lose uniprot accession ID otherwise\r
132                         }\r
133                     }\r
134 \r
135                     if (id.indexOf("/") > 0)\r
136                     {\r
137                         StringTokenizer st = new StringTokenizer(id, "/");\r
138 \r
139                         if (st.countTokens() == 2)\r
140                         {\r
141                             id = st.nextToken();\r
142 \r
143                             String tmp = st.nextToken();\r
144 \r
145                             st = new StringTokenizer(tmp, "-");\r
146 \r
147                             if (st.countTokens() == 2)\r
148                             {\r
149                                 sstart = Integer.valueOf(st.nextToken())\r
150                                                 .intValue();\r
151                                 send = Integer.valueOf(st.nextToken()).intValue();\r
152                             }\r
153                         }\r
154                     }\r
155 \r
156                     seq = new StringBuffer();\r
157                 }\r
158                 else\r
159                 {\r
160                     seq = seq.append(line);\r
161                 }\r
162             }\r
163         }\r
164 \r
165         if (count > 0)\r
166         {\r
167             if (!isValidProteinSequence(seq.toString().toUpperCase()))\r
168             {\r
169                 throw new IOException("Invalid protein sequence");\r
170             }\r
171 \r
172             if (sstart != 0)\r
173             {\r
174                 seqs.addElement(new Sequence(id, seq.toString().toUpperCase(),\r
175                         sstart, send));\r
176             }\r
177             else\r
178             {\r
179                 seqs.addElement(new Sequence(id, seq.toString().toUpperCase(),\r
180                         1, seq.length()));\r
181             }\r
182         }\r
183     }\r
184 \r
185     /**\r
186      * DOCUMENT ME!\r
187      *\r
188      * @param s DOCUMENT ME!\r
189      *\r
190      * @return DOCUMENT ME!\r
191      */\r
192     public static String print(SequenceI[] s)\r
193     {\r
194         return print(s, 72);\r
195     }\r
196 \r
197     /**\r
198      * DOCUMENT ME!\r
199      *\r
200      * @param s DOCUMENT ME!\r
201      * @param len DOCUMENT ME!\r
202      *\r
203      * @return DOCUMENT ME!\r
204      */\r
205     public static String print(SequenceI[] s, int len)\r
206     {\r
207         return print(s, len, true);\r
208     }\r
209 \r
210     /**\r
211      * DOCUMENT ME!\r
212      *\r
213      * @param s DOCUMENT ME!\r
214      * @param len DOCUMENT ME!\r
215      * @param gaps DOCUMENT ME!\r
216      *\r
217      * @return DOCUMENT ME!\r
218      */\r
219     public static String print(SequenceI[] s, int len, boolean gaps)\r
220     {\r
221         return print(s, len, gaps, true);\r
222     }\r
223 \r
224     /**\r
225      * DOCUMENT ME!\r
226      *\r
227      * @param s DOCUMENT ME!\r
228      * @param len DOCUMENT ME!\r
229      * @param gaps DOCUMENT ME!\r
230      * @param displayId DOCUMENT ME!\r
231      *\r
232      * @return DOCUMENT ME!\r
233      */\r
234     public static String print(SequenceI[] s, int len, boolean gaps,\r
235         boolean displayId)\r
236     {\r
237         StringBuffer out = new StringBuffer();\r
238         int i = 0;\r
239 \r
240         while ((i < s.length) && (s[i] != null))\r
241         {\r
242             String seq = "";\r
243 \r
244             if (gaps)\r
245             {\r
246                 seq = s[i].getSequence();\r
247             }\r
248             else\r
249             {\r
250                 seq = AlignSeq.extractGaps("-. ", s[i].getSequence());\r
251             }\r
252 \r
253             // used to always put this here: + "/" + s[i].getStart() + "-" + s[i].getEnd() +\r
254             out.append(">" +\r
255                 ((displayId) ? s[i].getDisplayId() : s[i].getName()) + "\n");\r
256 \r
257             int nochunks = (seq.length() / len) + 1;\r
258 \r
259             for (int j = 0; j < nochunks; j++)\r
260             {\r
261                 int start = j * len;\r
262                 int end = start + len;\r
263 \r
264                 if (end < seq.length())\r
265                 {\r
266                     out.append(seq.substring(start, end) + "\n");\r
267                 }\r
268                 else if (start < seq.length())\r
269                 {\r
270                     out.append(seq.substring(start) + "\n");\r
271                 }\r
272             }\r
273 \r
274             i++;\r
275         }\r
276 \r
277         return out.toString();\r
278     }\r
279 \r
280     /**\r
281      * DOCUMENT ME!\r
282      *\r
283      * @return DOCUMENT ME!\r
284      */\r
285     public String print()\r
286     {\r
287         return print(getSeqsAsArray());\r
288     }\r
289 }\r