Formatted source
[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             //      System.out.println(tmpat.resName + " " + tmpres2);\r
144         }\r
145 \r
146         sequence = new Sequence("PDB_seq", seq, 1, seq.length());\r
147         System.out.println("PDB Sequence is :\nSequence = " + seq);\r
148         System.out.println("No of residues = " + residues.size());\r
149     }\r
150 \r
151     public void setChargeColours() {\r
152         for (int i = 0; i < bonds.size(); i++) {\r
153             try {\r
154                 Bond b = (Bond) bonds.elementAt(i);\r
155 \r
156                 if (b.at1.resName.toUpperCase().equals("ASP") ||\r
157                         b.at1.resName.toUpperCase().equals("GLU")) {\r
158                     b.startCol = Color.red;\r
159                 } else if (b.at1.resName.toUpperCase().equals("LYS") ||\r
160                         b.at1.resName.toUpperCase().equals("ARG")) {\r
161                     b.startCol = Color.blue;\r
162                 } else if (b.at1.resName.toUpperCase().equals("CYS")) {\r
163                     b.startCol = Color.yellow;\r
164                 } else {\r
165                     int atno = ((Integer) ResidueProperties.getAA3Hash().get(b.at1.resName.toUpperCase())).intValue();\r
166                     b.startCol = Color.lightGray;\r
167                 }\r
168 \r
169                 if (b.at2.resName.toUpperCase().equals("ASP") ||\r
170                         b.at2.resName.toUpperCase().equals("GLU")) {\r
171                     b.endCol = Color.red;\r
172                 } else if (b.at2.resName.toUpperCase().equals("LYS") ||\r
173                         b.at2.resName.toUpperCase().equals("ARG")) {\r
174                     b.endCol = Color.blue;\r
175                 } else if (b.at2.resName.toUpperCase().equals("CYS")) {\r
176                     b.endCol = Color.yellow;\r
177                 } else {\r
178                     int atno = ((Integer) ResidueProperties.getAA3Hash().get(b.at2.resName.toUpperCase())).intValue();\r
179                     b.endCol = Color.lightGray;\r
180                 }\r
181             } catch (Exception e) {\r
182                 Bond b = (Bond) bonds.elementAt(i);\r
183                 b.startCol = Color.gray;\r
184                 b.endCol = Color.gray;\r
185             }\r
186         }\r
187     }\r
188 \r
189     public void setHydrophobicityColours() {\r
190         float hydmin = (float) ResidueProperties.getHydmin();\r
191         float hydmax = (float) ResidueProperties.getHydmax();\r
192         double[] hyd = ResidueProperties.getHyd();\r
193 \r
194         Hashtable AA3Hash = ResidueProperties.getAA3Hash();\r
195 \r
196         for (int i = 0; i < bonds.size(); i++) {\r
197             try {\r
198                 Bond b = (Bond) bonds.elementAt(i);\r
199 \r
200                 int atno = ((Integer) AA3Hash.get(b.at1.resName.toUpperCase())).intValue();\r
201                 float red = ((float) hyd[atno] - hydmin) / (hydmax - hydmin);\r
202 \r
203                 if (red > (float) 1.0) {\r
204                     red = (float) 1.0;\r
205                 }\r
206 \r
207                 if (red < (float) 0.0) {\r
208                     red = (float) 0.0;\r
209                 }\r
210 \r
211                 b.startCol = new Color(red, (float) 0.0, (float) 1.0 - red);\r
212                 atno = ((Integer) AA3Hash.get(b.at2.resName.toUpperCase())).intValue();\r
213 \r
214                 red = ((float) hyd[atno] - hydmin) / (hydmax - hydmin);\r
215 \r
216                 if (red > (float) 1.0) {\r
217                     red = (float) 1.0;\r
218                 }\r
219 \r
220                 if (red < (float) 0.0) {\r
221                     red = (float) 0.0;\r
222                 }\r
223 \r
224                 b.endCol = new Color(red, (float) 0.2, (float) 1.0 - red);\r
225             } catch (Exception e) {\r
226                 Bond b = (Bond) bonds.elementAt(i);\r
227                 b.startCol = Color.gray;\r
228                 b.endCol = Color.gray;\r
229             }\r
230         }\r
231     }\r
232 \r
233     public void colourBySequence(jalview.gui.AlignViewport av, Sequence seq) {\r
234         jalview.gui.SequenceRenderer sr = new jalview.gui.SequenceRenderer(av);\r
235 \r
236         for (int i = 0; i < bonds.size(); i++) {\r
237             Bond tmp = (Bond) bonds.elementAt(i);\r
238 \r
239             try {\r
240                 if ((tmp.at1.resNumber >= ((offset + pdbstart) - 1)) &&\r
241                         (tmp.at1.resNumber <= ((offset + pdbend) - 1))) {\r
242                     int pos = seqstart +\r
243                         (tmp.at1.resNumber - pdbstart - offset);\r
244                     int index = seq.findIndex(pos);\r
245 \r
246                     tmp.startCol = sr.getResidueBoxColour(av.getGlobalColourScheme(),\r
247                             seq, index);\r
248                 } else {\r
249                     tmp.startCol = Color.gray;\r
250                 }\r
251 \r
252                 if ((tmp.at2.resNumber >= ((offset + pdbstart) - 1)) &&\r
253                         (tmp.at2.resNumber <= ((pdbend + offset) - 1))) {\r
254                     int pos = seqstart +\r
255                         (tmp.at2.resNumber - pdbstart - offset);\r
256                     int index = seq.findIndex(pos);\r
257 \r
258                     tmp.endCol = sr.getResidueBoxColour(av.getGlobalColourScheme(),\r
259                             seq, index);\r
260                 } else {\r
261                     tmp.endCol = Color.gray;\r
262                 }\r
263             } catch (Exception e) {\r
264                 tmp.startCol = Color.lightGray;\r
265                 tmp.endCol = Color.lightGray;\r
266             }\r
267         }\r
268     }\r
269 \r
270     public void setChainColours() {\r
271         for (int i = 0; i < bonds.size(); i++) {\r
272             Bond tmp = (Bond) bonds.elementAt(i);\r
273 \r
274             try {\r
275                 tmp.startCol = (Color) ResidueProperties.getChainColours().get(id);\r
276                 tmp.endCol = (Color) ResidueProperties.getChainColours().get(id);\r
277             } catch (Exception e) {\r
278                 tmp.startCol = Color.lightGray;\r
279                 tmp.endCol = Color.lightGray;\r
280             }\r
281         }\r
282     }\r
283 }\r