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