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