684f867f0fe28e123bb766a2dfb762629b256820
[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    * Length of a sequence line\r
38    */\r
39   int len = 72;\r
40 \r
41   StringBuffer out;\r
42 \r
43     /**\r
44      * Creates a new FastaFile object.\r
45      */\r
46     public FastaFile()\r
47     {\r
48     }\r
49 \r
50     /**\r
51      * Creates a new FastaFile object.\r
52      *\r
53      * @param inFile DOCUMENT ME!\r
54      * @param type DOCUMENT ME!\r
55      *\r
56      * @throws IOException DOCUMENT ME!\r
57      */\r
58     public FastaFile(String inFile, String type) throws IOException\r
59     {\r
60         super(inFile, type);\r
61     }\r
62 \r
63     /**\r
64      * DOCUMENT ME!\r
65      *\r
66      * @throws IOException DOCUMENT ME!\r
67      */\r
68     public void parse() throws IOException\r
69     {\r
70         StringBuffer sb = new StringBuffer();\r
71         boolean firstLine = true;\r
72 \r
73         String line;\r
74         Sequence seq = null;\r
75 \r
76         boolean annotation = false;\r
77 \r
78         while ((line = nextLine()) != null)\r
79         {\r
80             line = line.trim();\r
81             if (line.length() > 0)\r
82             {\r
83               if (line.charAt(0)=='>')\r
84                 {\r
85                   if (line.startsWith(">#_"))\r
86                   {\r
87                     if (annotation)\r
88                     {\r
89                       Annotation[] anots = new Annotation[sb.length()];\r
90                       String anotString = sb.toString();\r
91                       for (int i = 0; i < sb.length(); i++)\r
92                       {\r
93                         anots[i] = new Annotation(anotString.substring(i, i+1),\r
94                                                   null,\r
95                                                   ' ', 0);\r
96                       }\r
97                       AlignmentAnnotation aa = new AlignmentAnnotation(\r
98                           seq.getName().substring(2), seq.getDescription(),\r
99                           anots);\r
100 \r
101                       annotations.addElement(aa);\r
102                     }\r
103                   }\r
104                   else\r
105                     annotation = false;\r
106 \r
107                     if (!firstLine)\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             seq.setSequence(sb.toString());\r
150             seqs.addElement(seq);\r
151         }\r
152     }\r
153 \r
154     /**\r
155      * DOCUMENT ME!\r
156      *\r
157      * @param s DOCUMENT ME!\r
158      * @param len DOCUMENT ME!\r
159      * @param gaps DOCUMENT ME!\r
160      * @param displayId DOCUMENT ME!\r
161      *\r
162      * @return DOCUMENT ME!\r
163      */\r
164     public String print(SequenceI[] s)\r
165     {\r
166         out = new StringBuffer();\r
167         int i = 0;\r
168 \r
169         while ((i < s.length) && (s[i] != null))\r
170         {\r
171             out.append(">" + printId(s[i]));\r
172             if(s[i].getDescription()!=null)\r
173               out.append(" "+s[i].getDescription());\r
174 \r
175             out.append("\n");\r
176 \r
177             int nochunks = (s[i].getLength() / len) + 1;\r
178 \r
179             for (int j = 0; j < nochunks; j++)\r
180             {\r
181                 int start = j * len;\r
182                 int end = start + len;\r
183 \r
184                 if (end < s[i].getLength())\r
185                 {\r
186                     out.append(s[i].getSequenceAsString(start, end) + "\n");\r
187                 }\r
188                 else if (start < s[i].getLength())\r
189                 {\r
190                     out.append(s[i].getSequenceAsString(start, s[i].getLength()) + "\n");\r
191                 }\r
192             }\r
193 \r
194             i++;\r
195         }\r
196 \r
197         return out.toString();\r
198     }\r
199 \r
200     /**\r
201      * DOCUMENT ME!\r
202      *\r
203      * @return DOCUMENT ME!\r
204      */\r
205     public String print()\r
206     {\r
207         return print(getSeqsAsArray());\r
208     }\r
209 }\r