1.1 enabled
[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                     annotation = true;\r
97                   }\r
98                   else\r
99                     annotation = false;\r
100 \r
101                     if (!firstLine)\r
102                     {\r
103                       if (!annotation && !isValidProteinSequence(sb.toString().toCharArray()))\r
104                       {\r
105                         throw new IOException(AppletFormatAdapter.INVALID_CHARACTERS\r
106                                               +" : "+seq.getName()\r
107                                               +" : "+invalidCharacter);\r
108                       }\r
109 \r
110                        seq.setSequence(sb.toString());\r
111 \r
112                        if (!annotation)\r
113                          seqs.addElement(seq);\r
114                     }\r
115 \r
116                     seq = parseId(line.substring(1));\r
117                     firstLine = false;\r
118 \r
119                     sb = new StringBuffer();\r
120                 }\r
121                 else\r
122                 {\r
123                     sb.append(line);\r
124                 }\r
125             }\r
126         }\r
127 \r
128         if (annotation)\r
129         {\r
130           Annotation[] anots = new Annotation[sb.length()];\r
131           String anotString = sb.toString();\r
132           for (int i = 0; i < sb.length(); i++)\r
133           {\r
134             anots[i] = new Annotation(anotString.substring(i, i + 1),\r
135                                       null,\r
136                                       ' ', 0);\r
137           }\r
138           AlignmentAnnotation aa = new AlignmentAnnotation(\r
139               seq.getName().substring(2), seq.getDescription(),\r
140               anots);\r
141 \r
142           annotations.addElement(aa);\r
143         }\r
144 \r
145         else if (!firstLine)\r
146         {\r
147 \r
148             if (!isValidProteinSequence(sb.toString().toCharArray()))\r
149             {\r
150                 throw new IOException(AppletFormatAdapter.INVALID_CHARACTERS\r
151                                       +" : "+seq.getName()\r
152                                       +" : "+invalidCharacter);\r
153             }\r
154 \r
155             seq.setSequence(sb.toString());\r
156             seqs.addElement(seq);\r
157         }\r
158     }\r
159 \r
160 \r
161     /**\r
162      * DOCUMENT ME!\r
163      *\r
164      * @param s DOCUMENT ME!\r
165      * @param len DOCUMENT ME!\r
166      * @param gaps DOCUMENT ME!\r
167      * @param displayId DOCUMENT ME!\r
168      *\r
169      * @return DOCUMENT ME!\r
170      */\r
171     public String print(SequenceI[] s)\r
172     {\r
173         int len = 72;\r
174         StringBuffer out = new StringBuffer();\r
175         int i = 0;\r
176 \r
177         while ((i < s.length) && (s[i] != null))\r
178         {\r
179             out.append(">" + printId(s[i]));\r
180             if(s[i].getDescription()!=null)\r
181               out.append(" "+s[i].getDescription());\r
182 \r
183             out.append("\n");\r
184 \r
185             int nochunks = (s[i].getLength() / len) + 1;\r
186 \r
187             for (int j = 0; j < nochunks; j++)\r
188             {\r
189                 int start = j * len;\r
190                 int end = start + len;\r
191 \r
192                 if (end < s[i].getLength())\r
193                 {\r
194                     out.append(s[i].getSequenceAsString(start, end) + "\n");\r
195                 }\r
196                 else if (start < s[i].getLength())\r
197                 {\r
198                     out.append(s[i].getSequenceAsString(start, s[i].getLength()) + "\n");\r
199                 }\r
200             }\r
201 \r
202             i++;\r
203         }\r
204 \r
205         return out.toString();\r
206     }\r
207 \r
208     /**\r
209      * DOCUMENT ME!\r
210      *\r
211      * @return DOCUMENT ME!\r
212      */\r
213     public String print()\r
214     {\r
215         return print(getSeqsAsArray());\r
216     }\r
217 }\r