Modifications for Applet PDB
[jalview.git] / src / MCview / PDBChain.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 package MCview;\r
20 \r
21 import jalview.datamodel.*;\r
22 \r
23 import jalview.schemes.ResidueProperties;\r
24 \r
25 import java.awt.*;\r
26 \r
27 import java.util.*;\r
28 \r
29 \r
30 public class PDBChain {\r
31     public String id;\r
32     public Vector bonds = new Vector();\r
33     public Vector atoms = new Vector();\r
34     public Vector residues = new Vector();\r
35     public int offset;\r
36     public Sequence sequence;\r
37     public boolean isVisible = false;\r
38     public int pdbstart = 0;\r
39     public int pdbend = 0;\r
40     public int seqstart = 0;\r
41     public int seqend = 0;\r
42 \r
43     //public DrawableSequence ds;\r
44     public PDBChain(String id) {\r
45         this.id = id;\r
46     }\r
47 \r
48     public String print() {\r
49         String tmp = "";\r
50 \r
51         for (int i = 0; i < bonds.size(); i++) {\r
52             tmp = tmp + ((Bond) bonds.elementAt(i)).at1.resName + " " +\r
53                 ((Bond) bonds.elementAt(i)).at1.resNumber + " " + offset +\r
54                 "\n";\r
55         }\r
56 \r
57         return tmp;\r
58     }\r
59 \r
60     public void makeCaBondList() {\r
61         for (int i = 0; i < (residues.size() - 1); i++) {\r
62             Residue tmpres = (Residue) residues.elementAt(i);\r
63             Residue tmpres2 = (Residue) residues.elementAt(i + 1);\r
64             myAtom at1 = tmpres.findAtom("CA");\r
65             myAtom at2 = tmpres2.findAtom("CA");\r
66 \r
67             if ((at1 != null) && (at2 != null)) {\r
68                 if (at1.chain.equals(at2.chain)) {\r
69                     makeBond(at1, at2);\r
70                 }\r
71             }\r
72         }\r
73     }\r
74 \r
75     public void makeBond(myAtom at1, myAtom at2) {\r
76         float[] start = new float[3];\r
77         float[] end = new float[3];\r
78 \r
79         start[0] = at1.x;\r
80         start[1] = at1.y;\r
81         start[2] = at1.z;\r
82 \r
83         end[0] = at2.x;\r
84         end[1] = at2.y;\r
85         end[2] = at2.z;\r
86 \r
87         bonds.addElement(new Bond(start, end, at1, at2));\r
88     }\r
89 \r
90     public void makeResidueList() {\r
91         int count = 0;\r
92         String seq = "";\r
93 \r
94         for (int i = 0; i < atoms.size(); i++) {\r
95             myAtom tmp = (myAtom) atoms.elementAt(i);\r
96             //String resName = tmp.resName;\r
97             int resNumber = tmp.resNumber;\r
98             int res = resNumber;\r
99 \r
100             if (i == 0) {\r
101                 offset = resNumber;\r
102             }\r
103 \r
104             Vector resAtoms = new Vector();\r
105 \r
106             resAtoms.addElement((myAtom) atoms.elementAt(i));\r
107             i++;\r
108             resNumber = ((myAtom) atoms.elementAt(i)).resNumber;\r
109 \r
110             //Add atoms to a vector while the residue number\r
111             //remains the same\r
112             while ((resNumber == res) && (i < atoms.size())) {\r
113                 resAtoms.addElement((myAtom) atoms.elementAt(i));\r
114                 i++;\r
115 \r
116                 if (i < atoms.size()) {\r
117                     resNumber = ((myAtom) atoms.elementAt(i)).resNumber;\r
118                 } else {\r
119                     resNumber++;\r
120                 }\r
121             }\r
122 \r
123             //We need this to keep in step with the outer for i = loop\r
124             i--;\r
125 \r
126             //Make a new Residue object with the new atoms vector\r
127             residues.addElement(new Residue(resAtoms, resNumber - 1, count));\r
128             count++;\r
129 \r
130             Residue tmpres = (Residue) residues.lastElement();\r
131             myAtom tmpat = (myAtom) tmpres.atoms.elementAt(0);\r
132 \r
133             // Keep totting up the sequence\r
134             if (ResidueProperties.getAA3Hash().get(tmpat.resName) == null) {\r
135                 System.err.println("PDBReader:Null aa3Hash for " +\r
136                     tmpat.resName);\r
137             } else {\r
138                 String tmpres2 = ResidueProperties.aa[((Integer) ResidueProperties.getAA3Hash()\r
139                                                                                   .get(tmpat.resName)).intValue()];\r
140                 seq = seq + tmpres2;\r
141             }\r
142 \r
143         }\r
144 \r
145         sequence = new Sequence("PDB_seq", seq, 1, seq.length());\r
146      //   System.out.println("PDB Sequence is :\nSequence = " + seq);\r
147      //   System.out.println("No of residues = " + residues.size());\r
148     }\r
149 \r
150     public void setChargeColours() {\r
151         for (int i = 0; i < bonds.size(); i++) {\r
152             try {\r
153                 Bond b = (Bond) bonds.elementAt(i);\r
154 \r
155                 if (b.at1.resName.toUpperCase().equals("ASP") ||\r
156                         b.at1.resName.toUpperCase().equals("GLU")) {\r
157                     b.startCol = Color.red;\r
158                 } else if (b.at1.resName.toUpperCase().equals("LYS") ||\r
159                         b.at1.resName.toUpperCase().equals("ARG")) {\r
160                     b.startCol = Color.blue;\r
161                 } else if (b.at1.resName.toUpperCase().equals("CYS")) {\r
162                     b.startCol = Color.yellow;\r
163                 } else {\r
164                     //int atno = ((Integer) ResidueProperties.getAA3Hash().get(b.at1.resName.toUpperCase())).intValue();\r
165                     b.startCol = Color.lightGray;\r
166                 }\r
167 \r
168                 if (b.at2.resName.toUpperCase().equals("ASP") ||\r
169                         b.at2.resName.toUpperCase().equals("GLU")) {\r
170                     b.endCol = Color.red;\r
171                 } else if (b.at2.resName.toUpperCase().equals("LYS") ||\r
172                         b.at2.resName.toUpperCase().equals("ARG")) {\r
173                     b.endCol = Color.blue;\r
174                 } else if (b.at2.resName.toUpperCase().equals("CYS")) {\r
175                     b.endCol = Color.yellow;\r
176                 } else {\r
177                     //int atno = ((Integer) ResidueProperties.getAA3Hash().get(b.at2.resName.toUpperCase())).intValue();\r
178                     b.endCol = Color.lightGray;\r
179                 }\r
180             } catch (Exception e) {\r
181                 Bond b = (Bond) bonds.elementAt(i);\r
182                 b.startCol = Color.gray;\r
183                 b.endCol = Color.gray;\r
184             }\r
185         }\r
186     }\r
187 \r
188     public void setHydrophobicityColours() {\r
189         float hydmin = (float) ResidueProperties.getHydmin();\r
190         float hydmax = (float) ResidueProperties.getHydmax();\r
191         double[] hyd = ResidueProperties.getHyd();\r
192 \r
193         Hashtable AA3Hash = ResidueProperties.getAA3Hash();\r
194 \r
195         for (int i = 0; i < bonds.size(); i++) {\r
196             try {\r
197                 Bond b = (Bond) bonds.elementAt(i);\r
198 \r
199                 int atno = ((Integer) AA3Hash.get(b.at1.resName.toUpperCase())).intValue();\r
200                 float red = ((float) hyd[atno] - hydmin) / (hydmax - hydmin);\r
201 \r
202                 if (red > (float) 1.0) {\r
203                     red = (float) 1.0;\r
204                 }\r
205 \r
206                 if (red < (float) 0.0) {\r
207                     red = (float) 0.0;\r
208                 }\r
209 \r
210                 b.startCol = new Color(red, (float) 0.0, (float) 1.0 - red);\r
211                 atno = ((Integer) AA3Hash.get(b.at2.resName.toUpperCase())).intValue();\r
212 \r
213                 red = ((float) hyd[atno] - hydmin) / (hydmax - hydmin);\r
214 \r
215                 if (red > (float) 1.0) {\r
216                     red = (float) 1.0;\r
217                 }\r
218 \r
219                 if (red < (float) 0.0) {\r
220                     red = (float) 0.0;\r
221                 }\r
222 \r
223                 b.endCol = new Color(red, (float) 0.2, (float) 1.0 - red);\r
224             } catch (Exception e) {\r
225                 Bond b = (Bond) bonds.elementAt(i);\r
226                 b.startCol = Color.gray;\r
227                 b.endCol = Color.gray;\r
228             }\r
229         }\r
230     }\r
231 \r
232 \r
233 \r
234     public void setChainColours() {\r
235         for (int i = 0; i < bonds.size(); i++) {\r
236             Bond tmp = (Bond) bonds.elementAt(i);\r
237 \r
238             try {\r
239                 tmp.startCol = (Color) ResidueProperties.getChainColours().get(id);\r
240                 tmp.endCol = (Color) ResidueProperties.getChainColours().get(id);\r
241             } catch (Exception e) {\r
242                 tmp.startCol = Color.lightGray;\r
243                 tmp.endCol = Color.lightGray;\r
244             }\r
245         }\r
246     }\r
247 }\r