reads fasta files from uniprot web page
[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            if(id.indexOf("UniProt/Swiss-Prot")>-1)\r
58             {\r
59               id = id.substring(id.indexOf("UniProt/Swiss-Prot|") + 19);\r
60               if(id.indexOf("|")>-1)\r
61                 id = id.substring(id.indexOf("|") + 1);\r
62             }\r
63 \r
64             if (id.indexOf("/") > 0 ) {\r
65 \r
66               StringTokenizer st = new StringTokenizer(id,"/");\r
67               if (st.countTokens() == 2) {\r
68                 id = st.nextToken();\r
69                 String tmp = st.nextToken();\r
70 \r
71                 st = new StringTokenizer(tmp,"-");\r
72 \r
73                 if (st.countTokens() == 2) {\r
74                   sstart = Integer.valueOf(st.nextToken()).intValue();\r
75                   send   = Integer.valueOf(st.nextToken()).intValue();\r
76                 }\r
77               }\r
78             }\r
79 \r
80             seq = new StringBuffer();\r
81 \r
82           } else {\r
83             seq = seq.append(line);\r
84           }\r
85         }\r
86       }\r
87       if (count > 0) {\r
88 \r
89         if(!isValidProteinSequence(seq.toString().toUpperCase()))\r
90           throw new IOException("Invalid protein sequence");\r
91 \r
92         if (sstart != 0) {\r
93           seqs.addElement(new Sequence(id,seq.toString().toUpperCase(),sstart,send));\r
94         } else {\r
95           seqs.addElement(new Sequence(id,seq.toString().toUpperCase(),1,seq.length()));\r
96         }\r
97       }\r
98 \r
99   }\r
100 \r
101   public static String print(SequenceI[] s) {\r
102     return print(s,72);\r
103   }\r
104   public static String print(SequenceI[] s, int len) {\r
105     return print(s,len,true);\r
106   }\r
107 \r
108   public static String print(SequenceI[] s, int len,boolean gaps) {\r
109     return print(s,len,gaps,true);\r
110   }\r
111 \r
112   public static String print(SequenceI[] s, int len,boolean gaps, boolean displayId) {\r
113     StringBuffer out = new StringBuffer();\r
114     int i = 0;\r
115     while (i < s.length && s[i] != null) {\r
116       String seq = "";\r
117       if (gaps) {\r
118         seq = s[i].getSequence();\r
119       } else {\r
120         seq = AlignSeq.extractGaps("-. ",s[i].getSequence());\r
121       }\r
122       // used to always put this here: + "/" + s[i].getStart() + "-" + s[i].getEnd() +\r
123       out.append(">" + ((displayId) ? s[i].getDisplayId() : s[i].getName())+"\n");\r
124 \r
125       int nochunks = seq.length() / len + 1;\r
126 \r
127       for (int j = 0; j < nochunks; j++) {\r
128         int start = j*len;\r
129         int end = start + len;\r
130 \r
131         if (end < seq.length()) {\r
132           out.append(seq.substring(start,end) + "\n");\r
133         } else if (start < seq.length()) {\r
134           out.append(seq.substring(start) + "\n");\r
135         }\r
136       }\r
137       i++;\r
138     }\r
139     return out.toString();\r
140   }\r
141 \r
142   public String print() {\r
143     return print(getSeqsAsArray());\r
144   }\r
145 }\r
146 \r
147 \r
148 \r