43c8e9dab57e9f178ccc0772b2e4525f1c56d859
[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 = true;\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             Atom at1 = tmpres.findAtom("CA");\r
65             Atom 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(Atom at1, Atom 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             Atom tmp = (Atom) 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((Atom) atoms.elementAt(i));\r
107             i++;\r
108             resNumber = ((Atom) 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((Atom) atoms.elementAt(i));\r
114                 i++;\r
115 \r
116                 if (i < atoms.size()) {\r
117                     resNumber = ((Atom) 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             Atom tmpat = (Atom) 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         if(id.length()<1 || id.equals(" "))\r
145            id = "_";\r
146 \r
147         sequence = new Sequence(id, seq, 1, seq.length());\r
148      //   System.out.println("PDB Sequence is :\nSequence = " + seq);\r
149      //   System.out.println("No of residues = " + residues.size());\r
150     }\r
151 \r
152     public void setChargeColours() {\r
153         for (int i = 0; i < bonds.size(); i++) {\r
154             try {\r
155                 Bond b = (Bond) bonds.elementAt(i);\r
156 \r
157                 if (b.at1.resName.toUpperCase().equals("ASP") ||\r
158                         b.at1.resName.toUpperCase().equals("GLU")) {\r
159                     b.startCol = Color.red;\r
160                 } else if (b.at1.resName.toUpperCase().equals("LYS") ||\r
161                         b.at1.resName.toUpperCase().equals("ARG")) {\r
162                     b.startCol = Color.blue;\r
163                 } else if (b.at1.resName.toUpperCase().equals("CYS")) {\r
164                     b.startCol = Color.yellow;\r
165                 } else {\r
166                     //int atno = ((Integer) ResidueProperties.getAA3Hash().get(b.at1.resName.toUpperCase())).intValue();\r
167                     b.startCol = Color.lightGray;\r
168                 }\r
169 \r
170                 if (b.at2.resName.toUpperCase().equals("ASP") ||\r
171                         b.at2.resName.toUpperCase().equals("GLU")) {\r
172                     b.endCol = Color.red;\r
173                 } else if (b.at2.resName.toUpperCase().equals("LYS") ||\r
174                         b.at2.resName.toUpperCase().equals("ARG")) {\r
175                     b.endCol = Color.blue;\r
176                 } else if (b.at2.resName.toUpperCase().equals("CYS")) {\r
177                     b.endCol = Color.yellow;\r
178                 } else {\r
179                     //int atno = ((Integer) ResidueProperties.getAA3Hash().get(b.at2.resName.toUpperCase())).intValue();\r
180                     b.endCol = Color.lightGray;\r
181                 }\r
182             } catch (Exception e) {\r
183                 Bond b = (Bond) bonds.elementAt(i);\r
184                 b.startCol = Color.gray;\r
185                 b.endCol = Color.gray;\r
186             }\r
187         }\r
188     }\r
189 \r
190     public void setHydrophobicityColours() {\r
191         float hydmin = (float) ResidueProperties.getHydmin();\r
192         float hydmax = (float) ResidueProperties.getHydmax();\r
193         double[] hyd = ResidueProperties.getHyd();\r
194 \r
195         Hashtable AA3Hash = ResidueProperties.getAA3Hash();\r
196 \r
197         for (int i = 0; i < bonds.size(); i++) {\r
198             try {\r
199                 Bond b = (Bond) bonds.elementAt(i);\r
200 \r
201                 int atno = ((Integer) AA3Hash.get(b.at1.resName.toUpperCase())).intValue();\r
202                 float red = ((float) hyd[atno] - hydmin) / (hydmax - hydmin);\r
203 \r
204                 if (red > (float) 1.0) {\r
205                     red = (float) 1.0;\r
206                 }\r
207 \r
208                 if (red < (float) 0.0) {\r
209                     red = (float) 0.0;\r
210                 }\r
211 \r
212                 b.startCol = new Color(red, (float) 0.0, (float) 1.0 - red);\r
213                 atno = ((Integer) AA3Hash.get(b.at2.resName.toUpperCase())).intValue();\r
214 \r
215                 red = ((float) hyd[atno] - hydmin) / (hydmax - hydmin);\r
216 \r
217                 if (red > (float) 1.0) {\r
218                     red = (float) 1.0;\r
219                 }\r
220 \r
221                 if (red < (float) 0.0) {\r
222                     red = (float) 0.0;\r
223                 }\r
224 \r
225                 b.endCol = new Color(red, (float) 0.2, (float) 1.0 - red);\r
226             } catch (Exception e) {\r
227                 Bond b = (Bond) bonds.elementAt(i);\r
228                 b.startCol = Color.gray;\r
229                 b.endCol = Color.gray;\r
230             }\r
231         }\r
232     }\r
233 \r
234 \r
235 \r
236     public void setChainColours(Color col)\r
237     {\r
238         for (int i = 0; i < bonds.size(); i++)\r
239         {\r
240             Bond tmp = (Bond) bonds.elementAt(i);\r
241             tmp.startCol = col;\r
242             tmp.endCol = col;\r
243         }\r
244     }\r
245 }\r