GPL license added
[jalview.git] / src / jalview / io / PfamFile.java
1 /*\r
2 * Jalview - A Sequence Alignment Editor and Viewer\r
3 * Copyright (C) 2005 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 \r
20 package jalview.io;\r
21 \r
22 import jalview.datamodel.*;\r
23 import jalview.util.*;\r
24 \r
25 import java.io.*;\r
26 import java.util.*;\r
27 \r
28 public class PfamFile extends AlignFile {\r
29 \r
30   Vector ids;\r
31 \r
32   public PfamFile()\r
33   {}\r
34 \r
35   public PfamFile(String inStr) {\r
36     super(inStr);\r
37   }\r
38 \r
39   public void initData() {\r
40     super.initData();\r
41     ids = new Vector();\r
42   }\r
43 \r
44   public PfamFile(String inFile, String type) throws IOException {\r
45     super(inFile,type);\r
46   }\r
47 \r
48   public void parse() throws IOException{\r
49     int i = 0;\r
50     String line;\r
51 \r
52 \r
53     Hashtable seqhash = new Hashtable();\r
54     Vector    headers = new Vector();\r
55 \r
56 \r
57       while ((line = nextLine()) != null)\r
58       {\r
59 \r
60       if (line.indexOf(" ") != 0)\r
61       {\r
62         if (line.indexOf("#") != 0)\r
63         {\r
64 \r
65           StringTokenizer str = new StringTokenizer(line," ");\r
66           String id = "";\r
67 \r
68           if (str.hasMoreTokens())\r
69           {\r
70             id = str.nextToken();\r
71 \r
72             StringBuffer tempseq;\r
73 \r
74             if (seqhash.containsKey(id))\r
75               tempseq = (StringBuffer)seqhash.get(id);\r
76            else\r
77            {\r
78               tempseq = new StringBuffer();\r
79               seqhash.put(id,tempseq);\r
80             }\r
81 \r
82             if (!(headers.contains(id)))\r
83               headers.addElement(id);\r
84 \r
85 \r
86             tempseq.append(str.nextToken());\r
87           }\r
88         }\r
89       }\r
90     }\r
91 \r
92     this.noSeqs = headers.size();\r
93     if(noSeqs<1)\r
94       throw new IOException("No sequences found (PFAM input)");\r
95 \r
96     for (i = 0; i < headers.size(); i++ ) {\r
97 \r
98       if ( seqhash.get(headers.elementAt(i)) != null) {\r
99         if (maxLength <  seqhash.get(headers.elementAt(i)).toString().length() )\r
100           maxLength =  seqhash.get(headers.elementAt(i)).toString().length();\r
101 \r
102         String head =  headers.elementAt(i).toString();\r
103         int start = 1;\r
104         int end =  seqhash.get(headers.elementAt(i)).toString().length();\r
105 \r
106         if (head.indexOf("/") > 0 ) {\r
107           StringTokenizer st = new StringTokenizer(head,"/");\r
108           if (st.countTokens() == 2) {\r
109             ids.addElement(st.nextToken());\r
110             String tmp = st.nextToken();\r
111             st = new StringTokenizer(tmp,"-");\r
112             if (st.countTokens() == 2) {\r
113               start = Integer.valueOf(st.nextToken()).intValue();\r
114               end = Integer.valueOf(st.nextToken()).intValue();\r
115             } else\r
116             {\r
117               start = -1;\r
118               end = -1;\r
119             }\r
120           } else\r
121             ids.addElement(headers.elementAt(i));\r
122 \r
123         }\r
124         else\r
125           ids.addElement(headers.elementAt(i));\r
126 \r
127 \r
128         Sequence newSeq = null;\r
129         if (start != -1 && end != -1)\r
130         {\r
131           newSeq = new Sequence(ids.elementAt(i).toString(),\r
132                                          seqhash.get(headers.elementAt(i).toString()).toString(),start,end);\r
133           seqs.addElement(newSeq);\r
134         }\r
135         else\r
136         {\r
137           newSeq = new Sequence(ids.elementAt(i).toString(),\r
138                                          seqhash.get(headers.elementAt(i).toString()).toString(),1,\r
139                                          seqhash.get(headers.elementAt(i).toString()).toString().length());\r
140           seqs.addElement(newSeq);\r
141         }\r
142 \r
143         if(!isValidProteinSequence(newSeq.getSequence()))\r
144           throw new IOException("Not a valid protein sequence - (PFAM input)");\r
145       }\r
146       else\r
147         System.err.println("PFAM File reader: Can't find sequence for " + headers.elementAt(i));\r
148 \r
149     }\r
150 \r
151   }\r
152 \r
153   public static String print(SequenceI[] s) {\r
154     StringBuffer out = new StringBuffer("");\r
155 \r
156     int max = 0;\r
157     int maxid = 0;\r
158 \r
159     int i = 0;\r
160 \r
161     while (i < s.length && s[i] != null) {\r
162       String tmp = s[i].getName() + "/" + s[i].getStart()+ "-" + s[i].getEnd();\r
163 \r
164       if (s[i].getSequence().length() > max) {\r
165         max = s[i].getSequence().length();\r
166       }\r
167       if (tmp.length() > maxid) {\r
168         maxid = tmp.length();\r
169       }\r
170       i++;\r
171     }\r
172 \r
173     if (maxid < 15) {\r
174       maxid = 15;\r
175     }\r
176 \r
177     int j = 0;\r
178     while ( j < s.length && s[j] != null) {\r
179       out.append( new Format("%-" + maxid + "s").form(s[j].getName() + "/" + s[j].getStart() + "-" + s[j].getEnd() ) + " ");\r
180 \r
181       out.append(s[j].getSequence() + "\n");\r
182       j++;\r
183     }\r
184     out.append("\n");\r
185 \r
186     return out.toString();\r
187   }\r
188 \r
189   public String print() {\r
190     return print(getSeqsAsArray());\r
191   }\r
192 }\r