586ede699b40a4597eaf43c59a867c60f5f855ad
[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 \r
102   public static String print(SequenceI[] s, int len,boolean gaps) {\r
103     return print(s,len,gaps,true);\r
104   }\r
105 \r
106   public static String print(SequenceI[] s, int len,boolean gaps, boolean displayId) {\r
107     StringBuffer out = new StringBuffer();\r
108     int i = 0;\r
109     while (i < s.length && s[i] != null) {\r
110       String seq = "";\r
111       if (gaps) {\r
112         seq = s[i].getSequence();\r
113       } else {\r
114         seq = AlignSeq.extractGaps("-. ",s[i].getSequence());\r
115       }\r
116       // used to always put this here: + "/" + s[i].getStart() + "-" + s[i].getEnd() +\r
117       out.append(">" + ((displayId) ? s[i].getDisplayId() : s[i].getName())+"\n");\r
118 \r
119       int nochunks = seq.length() / len + 1;\r
120 \r
121       for (int j = 0; j < nochunks; j++) {\r
122         int start = j*len;\r
123         int end = start + len;\r
124 \r
125         if (end < seq.length()) {\r
126           out.append(seq.substring(start,end) + "\n");\r
127         } else if (start < seq.length()) {\r
128           out.append(seq.substring(start) + "\n");\r
129         }\r
130       }\r
131       i++;\r
132     }\r
133     return out.toString();\r
134   }\r
135 \r
136   public String print() {\r
137     return print(getSeqsAsArray());\r
138   }\r
139 }\r
140 \r
141 \r
142 \r