28109d5ae002e3c48df53f11a395009272d0214d
[jalview.git] / src / jalview / io / FastaFile.java
1 package jalview.io;\r
2 \r
3 import jalview.datamodel.*;\r
4 import jalview.analysis.*;\r
5 \r
6 import java.io.*;\r
7 import java.util.*;\r
8 \r
9 public class FastaFile extends AlignFile {\r
10 \r
11   public FastaFile()\r
12   {}\r
13 \r
14   public FastaFile(String inStr) {\r
15     super(inStr);\r
16   }\r
17 \r
18   public FastaFile(String inFile, String type) throws IOException {\r
19     super(inFile,type);\r
20   }\r
21 \r
22   public void parse() throws IOException\r
23   {\r
24 \r
25     String       id    = "";\r
26     StringBuffer seq   = new StringBuffer();\r
27     int          count = 0;\r
28     boolean      flag  = false;\r
29 \r
30     int          sstart = 0;\r
31     int          send   = 0;\r
32 \r
33     String line;\r
34 \r
35       while ((line = nextLine()) != null) {\r
36 \r
37         if (line.length() > 0) {\r
38 \r
39           // Do we have an id line?\r
40 \r
41           if (line.substring(0,1).equals(">")) {\r
42 \r
43             if (count != 0) {\r
44               if (sstart != 0) {\r
45                 seqs.addElement(new Sequence(id,seq.toString().toUpperCase(),sstart,send));\r
46               } else {\r
47                 seqs.addElement(new Sequence(id,seq.toString().toUpperCase(),1,seq.length()));\r
48               }\r
49             }\r
50 \r
51             count++;\r
52 \r
53             StringTokenizer str = new StringTokenizer(line," ");\r
54 \r
55             id = str.nextToken();\r
56             id = id.substring(1);\r
57 \r
58             if (id.indexOf("/") > 0 ) {\r
59 \r
60               StringTokenizer st = new StringTokenizer(id,"/");\r
61               if (st.countTokens() == 2) {\r
62                 id = st.nextToken();\r
63                 String tmp = st.nextToken();\r
64 \r
65                 st = new StringTokenizer(tmp,"-");\r
66 \r
67                 if (st.countTokens() == 2) {\r
68                   sstart = Integer.valueOf(st.nextToken()).intValue();\r
69                   send   = Integer.valueOf(st.nextToken()).intValue();\r
70                 }\r
71               }\r
72             }\r
73 \r
74             seq = new StringBuffer();\r
75 \r
76           } else {\r
77             seq = seq.append(line);\r
78           }\r
79         }\r
80       }\r
81       if (count > 0) {\r
82 \r
83         if(!isValidProteinSequence(seq.toString().toUpperCase()))\r
84           throw new IOException("Invalid protein sequence");\r
85 \r
86         if (sstart != 0) {\r
87           seqs.addElement(new Sequence(id,seq.toString().toUpperCase(),sstart,send));\r
88         } else {\r
89           seqs.addElement(new Sequence(id,seq.toString().toUpperCase(),1,seq.length()));\r
90         }\r
91       }\r
92 \r
93   }\r
94 \r
95   public static String print(SequenceI[] s) {\r
96     return print(s,72);\r
97   }\r
98   public static String print(SequenceI[] s, int len) {\r
99     return print(s,len,true);\r
100   }\r
101   public static String print(SequenceI[] s, int len,boolean gaps) {\r
102     StringBuffer out = new StringBuffer();\r
103     int i = 0;\r
104     while (i < s.length && s[i] != null) {\r
105       String seq = "";\r
106       if (gaps) {\r
107         seq = s[i].getSequence();\r
108       } else {\r
109         seq = AlignSeq.extractGaps(s[i].getSequence(),"-");\r
110         seq = AlignSeq.extractGaps(seq,".");\r
111         seq = AlignSeq.extractGaps(seq," ");\r
112       }\r
113 \r
114       out.append(">" + s[i].getName() + "/" + s[i].getStart() + "-" + s[i].getEnd() + "\n");\r
115 \r
116       int nochunks = seq.length() / len + 1;\r
117 \r
118       for (int j = 0; j < nochunks; j++) {\r
119         int start = j*len;\r
120         int end = start + len;\r
121 \r
122         if (end < seq.length()) {\r
123           out.append(seq.substring(start,end) + "\n");\r
124         } else if (start < seq.length()) {\r
125           out.append(seq.substring(start) + "\n");\r
126         }\r
127       }\r
128       i++;\r
129     }\r
130     return out.toString();\r
131   }\r
132 \r
133   public String print() {\r
134     return print(getSeqsAsArray());\r
135   }\r
136 }\r
137 \r
138 \r
139 \r