71d372ea147265f7b40be24e3e8649f1c4d5056b
[jalview.git] / src / jalview / io / FastaFile.java
1 /*\r
2 * Jalview - A Sequence Alignment Editor and Viewer\r
3 * Copyright (C) 2006 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 FastaFile extends AlignFile\r
35 {\r
36     /**\r
37      * Creates a new FastaFile object.\r
38      */\r
39     public FastaFile()\r
40     {\r
41     }\r
42 \r
43     /**\r
44      * Creates a new FastaFile object.\r
45      *\r
46      * @param inFile DOCUMENT ME!\r
47      * @param type DOCUMENT ME!\r
48      *\r
49      * @throws IOException DOCUMENT ME!\r
50      */\r
51     public FastaFile(String inFile, String type) throws IOException\r
52     {\r
53         super(inFile, type);\r
54     }\r
55 \r
56     /**\r
57      * DOCUMENT ME!\r
58      *\r
59      * @throws IOException DOCUMENT ME!\r
60      */\r
61     public void parse() throws IOException\r
62     {\r
63         StringBuffer sb = new StringBuffer();\r
64         boolean firstLine = true;\r
65 \r
66         String line;\r
67         Sequence seq = null;\r
68 \r
69         boolean annotation = false;\r
70 \r
71         while ((line = nextLine()) != null)\r
72         {\r
73             line = line.trim();\r
74             if (line.length() > 0)\r
75             {\r
76               if (line.charAt(0)=='>')\r
77                 {\r
78                   if (line.startsWith(">#_"))\r
79                   {\r
80                     if (annotation)\r
81                     {\r
82                       Annotation[] anots = new Annotation[sb.length()];\r
83                       String anotString = sb.toString();\r
84                       for (int i = 0; i < sb.length(); i++)\r
85                       {\r
86                         anots[i] = new Annotation(anotString.substring(i, i+1),\r
87                                                   null,\r
88                                                   ' ', 0);\r
89                       }\r
90                       AlignmentAnnotation aa = new AlignmentAnnotation(\r
91                           seq.getName().substring(2), seq.getDescription(),\r
92                           anots);\r
93 \r
94                       annotations.addElement(aa);\r
95                     }\r
96                   }\r
97                   else\r
98                     annotation = false;\r
99 \r
100                     if (!firstLine)\r
101                     {\r
102                       if (!annotation && !isValidProteinSequence(sb.toString().toCharArray()))\r
103                       {\r
104                         throw new IOException(AppletFormatAdapter.INVALID_CHARACTERS\r
105                                               +" : "+seq.getName()\r
106                                               +" : "+invalidCharacter);\r
107                       }\r
108 \r
109                        seq.setSequence(sb.toString());\r
110 \r
111                        if (!annotation)\r
112                          seqs.addElement(seq);\r
113                     }\r
114 \r
115                     seq = parseId(line.substring(1));\r
116                     firstLine = false;\r
117 \r
118                     sb = new StringBuffer();\r
119 \r
120                     if (line.startsWith(">#_"))\r
121                       annotation = true;\r
122                 }\r
123                 else\r
124                 {\r
125                     sb.append(line);\r
126                 }\r
127             }\r
128         }\r
129 \r
130         if (annotation)\r
131         {\r
132           Annotation[] anots = new Annotation[sb.length()];\r
133           String anotString = sb.toString();\r
134           for (int i = 0; i < sb.length(); i++)\r
135           {\r
136             anots[i] = new Annotation(anotString.substring(i, i + 1),\r
137                                       null,\r
138                                       ' ', 0);\r
139           }\r
140           AlignmentAnnotation aa = new AlignmentAnnotation(\r
141               seq.getName().substring(2), seq.getDescription(),\r
142               anots);\r
143 \r
144           annotations.addElement(aa);\r
145         }\r
146 \r
147         else if (!firstLine)\r
148         {\r
149 \r
150             if (!isValidProteinSequence(sb.toString().toCharArray()))\r
151             {\r
152                 throw new IOException(AppletFormatAdapter.INVALID_CHARACTERS\r
153                                       +" : "+seq.getName()\r
154                                       +" : "+invalidCharacter);\r
155             }\r
156 \r
157             seq.setSequence(sb.toString());\r
158             seqs.addElement(seq);\r
159         }\r
160     }\r
161 \r
162 \r
163     /**\r
164      * DOCUMENT ME!\r
165      *\r
166      * @param s DOCUMENT ME!\r
167      * @param len DOCUMENT ME!\r
168      * @param gaps DOCUMENT ME!\r
169      * @param displayId DOCUMENT ME!\r
170      *\r
171      * @return DOCUMENT ME!\r
172      */\r
173     public String print(SequenceI[] s)\r
174     {\r
175         int len = 72;\r
176         StringBuffer out = new StringBuffer();\r
177         int i = 0;\r
178 \r
179         while ((i < s.length) && (s[i] != null))\r
180         {\r
181             out.append(">" + printId(s[i]));\r
182             if(s[i].getDescription()!=null)\r
183               out.append(" "+s[i].getDescription());\r
184 \r
185             out.append("\n");\r
186 \r
187             int nochunks = (s[i].getLength() / len) + 1;\r
188 \r
189             for (int j = 0; j < nochunks; j++)\r
190             {\r
191                 int start = j * len;\r
192                 int end = start + len;\r
193 \r
194                 if (end < s[i].getLength())\r
195                 {\r
196                     out.append(s[i].getSequenceAsString(start, end) + "\n");\r
197                 }\r
198                 else if (start < s[i].getLength())\r
199                 {\r
200                     out.append(s[i].getSequenceAsString(start, s[i].getLength()) + "\n");\r
201                 }\r
202             }\r
203 \r
204             i++;\r
205         }\r
206 \r
207         return out.toString();\r
208     }\r
209 \r
210     /**\r
211      * DOCUMENT ME!\r
212      *\r
213      * @return DOCUMENT ME!\r
214      */\r
215     public String print()\r
216     {\r
217         return print(getSeqsAsArray());\r
218     }\r
219 }\r