Improved consistency between JPredWS and MsaWS
[jalview.git] / src / MCview / rotCanvas.java
1 package MCview;\r
2 \r
3 import java.awt.*;\r
4 import java.awt.event.*;\r
5 import java.util.*;\r
6 import java.io.*;\r
7 import javax.swing.*;\r
8 import jalview.analysis.AlignSeq;\r
9 import jalview.datamodel.*;\r
10 \r
11 public class rotCanvas extends JPanel implements KeyListener,\r
12                                                  MouseListener,\r
13                                                  MouseMotionListener {\r
14   MCMatrix  idmat  = new MCMatrix(3,3);\r
15   MCMatrix  objmat = new MCMatrix(3,3);\r
16 \r
17   boolean redrawneeded =true;\r
18 \r
19   int omx = 0;\r
20   int mx = 0;\r
21   int omy = 0;\r
22   int my = 0;\r
23 \r
24   public PDBfile pdb;\r
25 \r
26   int bsize;\r
27 \r
28   Image img;\r
29   Graphics ig;\r
30 \r
31   Dimension prefsize;\r
32 \r
33   float centre[] = new float[3];\r
34   float width[]  = new float[3];\r
35 \r
36   float maxwidth;\r
37   float scale;\r
38 \r
39   String inStr;\r
40   String inType;\r
41 \r
42   boolean depthcue   = true;\r
43   boolean wire       = false;\r
44   boolean bymolecule = false;\r
45   boolean zbuffer    = true;\r
46 \r
47   boolean dragging;\r
48 \r
49   int xstart;\r
50   int xend;\r
51   int ystart;\r
52   int yend;\r
53   int xmid;\r
54   int ymid;\r
55 \r
56   Font font = new Font("Helvetica",Font.PLAIN,10);\r
57 \r
58   public rotCanvas(PDBfile pdb, Sequence sequence, jalview.gui.AlignViewport av) throws IOException {\r
59 \r
60     int max = -10;\r
61     int maxchain = -1;\r
62     int pdbstart=0, pdbend=0,  seqstart =0,  seqend=0;\r
63 \r
64 \r
65     for (int i=0; i < pdb.chains.size(); i++) {\r
66       // Now lets compare the sequences to get\r
67       // the start and end points.\r
68 \r
69     java.util.StringTokenizer str = new java.util.StringTokenizer(sequence.getSequence(), ".");\r
70     String newString = "";\r
71 \r
72     while (str.hasMoreTokens()) {\r
73         newString += str.nextToken();\r
74     }\r
75       // Align the sequence to the pdb\r
76       AlignSeq as = new AlignSeq(sequence,((PDBChain)pdb.chains.elementAt(i)).sequence,"pep");\r
77       as.calcScoreMatrix();\r
78       as.traceAlignment();\r
79       as.printAlignment();\r
80 \r
81       if (as.maxscore > max) {\r
82         max = as.maxscore;\r
83         maxchain = i;\r
84 \r
85         pdbstart = as.seq2start;\r
86         pdbend = as.seq2end;\r
87         seqstart = as.seq1start  - 1 ;\r
88         seqend = as.seq1end  -1;\r
89       }\r
90 \r
91       System.out.println("PDB start/end " + pdbstart + " " + pdbend);\r
92       System.out.println("SEQ start/end " + seqstart + " " + seqend);\r
93     }\r
94 \r
95 \r
96     ( (PDBChain)pdb.chains.elementAt(maxchain)).pdbstart = pdbstart;\r
97     ( (PDBChain)pdb.chains.elementAt(maxchain)).pdbend = pdbend;\r
98     ( (PDBChain)pdb.chains.elementAt(maxchain)).seqstart = seqstart;\r
99      ( (PDBChain)pdb.chains.elementAt(maxchain)).seqend = seqend;\r
100      ( (PDBChain) pdb.chains.elementAt(maxchain)).isVisible = true;\r
101      ( (PDBChain) pdb.chains.elementAt(maxchain)).sequence = sequence;\r
102      ( (PDBChain)pdb.chains.elementAt(maxchain)).colourBySequence(av, sequence);\r
103 \r
104 \r
105 \r
106     this.pdb      = pdb;\r
107     this.prefsize = new Dimension( getWidth(), getHeight());\r
108 \r
109     //Initialize the matrices to identity\r
110 \r
111     for (int i = 0; i < 3; i++) {\r
112       for (int j = 0; j < 3 ; j++) {\r
113         if (i != j) {\r
114           idmat.addElement(i,j,0);\r
115           objmat.addElement(i,j,0);\r
116         } else {\r
117           idmat.addElement(i,j,1);\r
118           objmat.addElement(i,j,1);\r
119         }\r
120       }\r
121     }\r
122 \r
123     addMouseMotionListener(this);\r
124     addMouseListener(this);\r
125     addKeyListener(this);\r
126 \r
127     addPDBfile();\r
128     ToolTipManager.sharedInstance().registerComponent(this);\r
129 \r
130   }\r
131 \r
132   public void addPDBfile() {\r
133     findCentre();\r
134     findWidth();\r
135 \r
136     scale = findScale();\r
137 \r
138     System.out.println("Scale factor = " + scale);\r
139   }\r
140 \r
141   public void deleteBonds() {\r
142     scale     = 0;\r
143     maxwidth  = 0;\r
144 \r
145     width[0] = 0;\r
146     width[1] = 0;\r
147     width[2] = 0;\r
148 \r
149     centre[0] = 0;\r
150     centre[1] = 0;\r
151     centre[2] = 0;\r
152 \r
153     for (int i=0; i < pdb.chains.size(); i++) {\r
154       ((PDBChain)pdb.chains.elementAt(i)).bonds = null;\r
155     }\r
156   }\r
157 \r
158   public void findWidth() {\r
159     float max[] = new float[3];\r
160     float min[] = new float[3];\r
161 \r
162     max[0] = (float)-1e30;\r
163     max[1] = (float)-1e30;\r
164     max[2] = (float)-1e30;\r
165 \r
166     min[0] = (float)1e30;\r
167     min[1] = (float)1e30;\r
168     min[2] = (float)1e30;\r
169 \r
170     for (int ii=0; ii < pdb.chains.size(); ii++) {\r
171       if (((PDBChain)pdb.chains.elementAt(ii)).isVisible) {\r
172 \r
173         Vector bonds = ((PDBChain)pdb.chains.elementAt(ii)).bonds;\r
174 \r
175         for (int i = 0; i < bonds.size(); i++) {\r
176           Bond tmp = (Bond)bonds.elementAt(i);\r
177 \r
178           if (tmp.start[0] >= max[0])\r
179             max[0] = tmp.start[0];\r
180           if (tmp.start[1] >= max[1])\r
181             max[1] = tmp.start[1];\r
182           if (tmp.start[2] >= max[2])\r
183             max[2] = tmp.start[2];\r
184           if (tmp.start[0] <= min[0])\r
185             min[0] = tmp.start[0];\r
186           if (tmp.start[1] <= min[1])\r
187             min[1] = tmp.start[1];\r
188           if (tmp.start[2] <= min[2])\r
189             min[2] = tmp.start[2];\r
190 \r
191           if (tmp.end[0] >= max[0])\r
192             max[0] = tmp.end[0];\r
193           if (tmp.end[1] >= max[1])\r
194             max[1] = tmp.end[1];\r
195           if (tmp.end[2] >= max[2])\r
196             max[2] = tmp.end[2];\r
197           if (tmp.end[0] <= min[0])\r
198             min[0] = tmp.end[0];\r
199           if (tmp.end[1] <= min[1])\r
200             min[1] = tmp.end[1];\r
201           if (tmp.end[2] <= min[2])\r
202             min[2] = tmp.end[2];\r
203         }\r
204       }\r
205     }\r
206 \r
207     System.out.println("xmax " + max[0] + " min " + min[0]);\r
208     System.out.println("ymax " + max[1] + " min " + min[1]);\r
209     System.out.println("zmax " + max[2] + " min " + min[2]);\r
210 \r
211     width[0] = (float)Math.abs(max[0] - min[0]);\r
212     width[1] = (float)Math.abs(max[1] - min[1]);\r
213     width[2] = (float)Math.abs(max[2] - min[2]);\r
214 \r
215     maxwidth = width[0];\r
216 \r
217     if (width[1] > width[0])\r
218       maxwidth = width[1];\r
219     if (width[2] > width[1])\r
220       maxwidth = width[2];\r
221 \r
222     System.out.println("Maxwidth = " + maxwidth);\r
223   }\r
224 \r
225   public float findScale() {\r
226     int dim, width, height;\r
227 \r
228     if ( getWidth() != 0) {\r
229       width  = getWidth();\r
230       height = getHeight();\r
231 \r
232     } else {\r
233       width  = prefsize.width;\r
234       height = prefsize.height;\r
235     }\r
236 \r
237     if (width < height) {\r
238       dim = width;\r
239     } else {\r
240       dim = height;\r
241     }\r
242 \r
243     return (float)(dim/(1.5d*maxwidth));\r
244   }\r
245 \r
246 \r
247 \r
248   public void findCentre() {\r
249     float xtot = 0;\r
250     float ytot = 0;\r
251     float ztot = 0;\r
252 \r
253     int bsize  = 0;\r
254     //Find centre coordinate\r
255 \r
256     for (int ii = 0; ii < pdb.chains.size() ; ii++) {\r
257       if (((PDBChain)pdb.chains.elementAt(ii)).isVisible) {\r
258 \r
259         Vector bonds = ((PDBChain)pdb.chains.elementAt(ii)).bonds;\r
260 \r
261         bsize += bonds.size();\r
262 \r
263         for (int i = 0; i < bonds.size(); i++) {\r
264 \r
265           xtot = xtot + ((Bond)bonds.elementAt(i)).start[0] +\r
266                  ((Bond)bonds.elementAt(i)).end[0];\r
267 \r
268           ytot = ytot + ((Bond)bonds.elementAt(i)).start[1] +\r
269                  ((Bond)bonds.elementAt(i)).end[1];\r
270 \r
271           ztot = ztot + ((Bond)bonds.elementAt(i)).start[2] +\r
272                  ((Bond)bonds.elementAt(i)).end[2];\r
273         }\r
274       }\r
275     }\r
276 \r
277     centre[0] = xtot / (2 * (float)bsize);\r
278     centre[1] = ytot / (2 * (float)bsize);\r
279     centre[2] = ztot / (2 * (float)bsize);\r
280   }\r
281 \r
282   public void paint(Graphics g) {\r
283     //Only create the image at the beginning -\r
284     //this saves much memory usage\r
285     if ((img == null) || (prefsize.width != getWidth()) || (prefsize.height != getHeight())) {\r
286       prefsize.width  = getWidth();\r
287       prefsize.height = getHeight();\r
288 \r
289       scale = findScale();\r
290       img   = createImage(prefsize.width,prefsize.height);\r
291       ig    = img.getGraphics();\r
292 \r
293       redrawneeded = true;\r
294     }\r
295 \r
296     if (redrawneeded == true) {\r
297       drawBackground(ig,Color.black);\r
298       drawScene(ig);\r
299       redrawneeded = false;\r
300     } else {\r
301       ig = img.getGraphics();\r
302     }\r
303 \r
304     g.drawImage(img,0,0,this);\r
305   }\r
306 \r
307   public void drawBackground(Graphics g, Color col) {\r
308     g.setColor(col);\r
309     g.fillRect(0,0,prefsize.width,prefsize.height);\r
310   }\r
311 \r
312 \r
313   public void drawScene(Graphics g) {\r
314     // Sort the bonds by z coord\r
315 \r
316     Vector bonds = new Vector();\r
317 \r
318 \r
319     for (int ii = 0; ii < pdb.chains.size() ; ii++) {\r
320       if (((PDBChain)pdb.chains.elementAt(ii)).isVisible) {\r
321 \r
322         Vector tmp = ((PDBChain)pdb.chains.elementAt(ii)).bonds;\r
323 \r
324         for (int i=0; i < tmp.size(); i++) {\r
325           bonds.addElement(tmp.elementAt(i));\r
326         }\r
327       }\r
328     }\r
329 \r
330     if (zbuffer) {\r
331       Zsort.Zsort(bonds);\r
332     }\r
333 \r
334     for (int i = 0; i < bonds.size(); i++) {\r
335       Bond tmpBond = (Bond)bonds.elementAt(i);\r
336 \r
337       xstart = (int)((tmpBond.start[0] - centre[0])*scale + getWidth()/2);\r
338       ystart = (int)((tmpBond.start[1] - centre[1])*scale + getHeight()/2);\r
339 \r
340       xend = (int)((tmpBond.end[0] - centre[0])*scale + getWidth()/2);\r
341       yend = (int)((tmpBond.end[1] - centre[1])*scale + getHeight()/2);\r
342 \r
343       xmid = (xend+xstart)/2;\r
344       ymid = (yend+ystart)/2;\r
345 \r
346 \r
347       if (depthcue && !bymolecule) {\r
348 \r
349         if (tmpBond.start[2] < (centre[2] - maxwidth/6))  {\r
350           g.setColor(tmpBond.startCol.darker().darker());\r
351           drawLine(g,xstart,ystart,xmid,ymid);\r
352 \r
353           g.setColor(tmpBond.endCol.darker().darker());\r
354           drawLine(g,xmid,ymid,xend,yend);\r
355         } else if (tmpBond.start[2] < (centre[2]+maxwidth/6)) {\r
356           g.setColor(tmpBond.startCol.darker());\r
357           drawLine(g,xstart,ystart,xmid,ymid);\r
358 \r
359           g.setColor(tmpBond.endCol.darker());\r
360           drawLine(g,xmid,ymid,xend,yend);\r
361         } else {\r
362           g.setColor(tmpBond.startCol);\r
363           drawLine(g,xstart,ystart,xmid,ymid);\r
364 \r
365           g.setColor(tmpBond.endCol);\r
366           drawLine(g,xmid,ymid,xend,yend);\r
367         }\r
368       } else if (depthcue && bymolecule) {\r
369         if (tmpBond.start[2] < (centre[2] - maxwidth/6))  {\r
370           g.setColor(Color.green.darker().darker());\r
371           drawLine(g,xstart,ystart,xend,yend);\r
372 \r
373         } else if (tmpBond.start[2] < (centre[2]+maxwidth/6)) {\r
374           g.setColor(Color.green.darker());\r
375           drawLine(g,xstart,ystart,xend,yend);\r
376 \r
377         } else {\r
378           g.setColor(Color.green);\r
379           drawLine(g,xstart,ystart,xend,yend);\r
380 \r
381         }\r
382       } else if (!depthcue && !bymolecule) {\r
383         g.setColor(tmpBond.startCol);\r
384         drawLine(g,xstart,ystart,xmid,ymid);\r
385         g.setColor(tmpBond.endCol);\r
386         drawLine(g,xmid,ymid,xend,yend);\r
387 \r
388       } else {\r
389         drawLine(g,xstart,ystart,xend,yend);\r
390       }\r
391     }\r
392   }\r
393 \r
394   public void drawLine(Graphics g, int x1, int y1, int x2, int y2) {\r
395     if (!wire) {\r
396 \r
397       if (((float)Math.abs(y2-y1)/(float)Math.abs(x2-x1)) < 0.5) {\r
398 \r
399         g.drawLine(x1,y1,x2,y2);\r
400         g.drawLine(x1+1,y1+1,x2+1,y2+1);\r
401         g.drawLine(x1,y1-1,x2,y2-1);\r
402       } else {\r
403         g.setColor(g.getColor().brighter());\r
404         g.drawLine(x1,y1,x2,y2);\r
405         g.drawLine(x1+1,y1,x2+1,y2);\r
406         g.drawLine(x1-1,y1,x2-1,y2);\r
407 \r
408       }\r
409     } else {\r
410       g.drawLine(x1,y1,x2,y2);\r
411     }\r
412   }\r
413 \r
414   public Dimension minimumsize() {\r
415     return prefsize;\r
416   }\r
417   public Dimension preferredsize() {\r
418     return prefsize;\r
419   }\r
420 \r
421   public void keyTyped(KeyEvent evt) { }\r
422   public void keyReleased(KeyEvent evt) { }\r
423   public void keyPressed(KeyEvent evt) {\r
424     int key = evt.getKeyChar();\r
425 \r
426     if (evt.getKeyCode() == KeyEvent.VK_UP) {\r
427       scale        = (float)(scale * 1.1);\r
428       redrawneeded = true;\r
429       repaint();\r
430 \r
431     } else if (evt.getKeyCode() == KeyEvent.VK_DOWN) {\r
432       scale        = (float)(scale * 0.9);\r
433       redrawneeded = true;\r
434       repaint();\r
435 \r
436     } else if (key == 'w') {\r
437 \r
438       wire = !wire;\r
439       System.out.println("wireframe " + wire);\r
440       redrawneeded = true;\r
441       repaint();\r
442 \r
443     } else if (key == 'd') {\r
444       depthcue = !depthcue;\r
445       System.out.println("Depth cueing is " + depthcue);\r
446       redrawneeded = true;\r
447       repaint();\r
448 \r
449     } else if (key == 'm') {\r
450       bymolecule = !bymolecule;\r
451       System.out.println("Bymolecule is " + bymolecule);\r
452       redrawneeded = true;\r
453       repaint();\r
454 \r
455     } else if (key == 'z') {\r
456       zbuffer = !zbuffer;\r
457       System.out.println("Z buffering is " + zbuffer);\r
458       redrawneeded = true;\r
459       repaint();\r
460 \r
461     } else if (key == 'c') {\r
462       bymolecule = false;\r
463       pdb.setChainColours();\r
464       System.out.println("Colouring by chain");\r
465       redrawneeded = true;\r
466       repaint();\r
467 \r
468     } else if (key == 'h') {\r
469       bymolecule = false;\r
470       pdb.setHydrophobicityColours();\r
471       System.out.println("Colouring by hydrophobicity");\r
472       redrawneeded = true;\r
473       repaint();\r
474 \r
475     } else if (key == 'q') {\r
476       bymolecule = false;\r
477       pdb.setChargeColours();\r
478       System.out.println("Colouring charges and cysteines");\r
479       redrawneeded = true;\r
480       repaint();\r
481 \r
482     }\r
483     return;\r
484   }\r
485 \r
486   public void mousePressed(MouseEvent e)\r
487   {\r
488 \r
489       mx = e.getX();\r
490       my = e.getY();\r
491       omx = mx;\r
492       omy = my;\r
493       dragging = false;\r
494 }\r
495 \r
496   public void mouseMoved(MouseEvent e)\r
497   {\r
498     myAtom fatom = null;\r
499     for (int ii = 0; ii < pdb.chains.size(); ii++)\r
500     {\r
501 \r
502       PDBChain chain = (PDBChain) pdb.chains.elementAt(ii);\r
503       if (chain.isVisible)\r
504       {\r
505         Vector bonds = ( (PDBChain) pdb.chains.elementAt(ii)).bonds;\r
506         for (int i = 0; i < bonds.size(); i++)\r
507         {\r
508           Bond tmpBond = (Bond) bonds.elementAt(i);\r
509           int truex = (int) ( (tmpBond.start[0] - centre[0]) * scale +\r
510                              getWidth() / 2);\r
511           if (Math.abs(truex - e.getX()) <= 2)\r
512           {\r
513             int truey = (int) ( (tmpBond.start[1] - centre[1]) * scale +\r
514                                getHeight() / 2);\r
515             if (Math.abs(truey - e.getY()) <= 2)\r
516               fatom = tmpBond.at1;\r
517           }\r
518         }\r
519       }\r
520     }\r
521     if(fatom!=null)\r
522      {\r
523        this.setToolTipText(fatom.resName);\r
524      }\r
525      else\r
526         this.setToolTipText(null);\r
527   }\r
528 \r
529   public void mouseClicked(MouseEvent e) { }\r
530   public void mouseEntered(MouseEvent e) { }\r
531   public void mouseExited(MouseEvent e) { }\r
532 \r
533   public void mouseDragged(MouseEvent evt) {\r
534     int x = evt.getX();\r
535     int y = evt.getY();\r
536     mx = x;\r
537     my = y;\r
538 \r
539     MCMatrix objmat = new MCMatrix(3,3);\r
540     objmat.setIdentity();\r
541 \r
542     if ((evt.getModifiers()  & Event.META_MASK) != 0) {\r
543       objmat.rotatez((float)((mx-omx)));\r
544     } else {\r
545       objmat.rotatex((float)((my-omy)));\r
546       objmat.rotatey((float)((omx-mx)));\r
547     }\r
548 \r
549     //Alter the bonds\r
550     for (int ii = 0; ii < pdb.chains.size() ; ii++) {\r
551       Vector bonds = ((PDBChain)pdb.chains.elementAt(ii)).bonds;\r
552 \r
553       for (int i = 0; i < bonds.size(); i++) {\r
554 \r
555         Bond tmpBond = (Bond)bonds.elementAt(i);\r
556 \r
557         //Translate the bond so the centre is 0,0,0\r
558         tmpBond.translate(-centre[0],-centre[1],-centre[2]);\r
559 \r
560         //Now apply the rotation matrix\r
561         tmpBond.start = objmat.vectorMultiply(tmpBond.start);\r
562         tmpBond.end   = objmat.vectorMultiply(tmpBond.end);\r
563 \r
564         //Now translate back again\r
565         tmpBond.translate(centre[0],centre[1],centre[2]);\r
566       }\r
567     }\r
568 \r
569     objmat = null;\r
570 \r
571     omx    = mx;\r
572     omy    = my;\r
573 \r
574     redrawneeded = true;\r
575 \r
576     paint(this.getGraphics());\r
577 \r
578     dragging = true;\r
579     return;\r
580   }\r
581 \r
582   public void mouseReleased(MouseEvent evt) {\r
583     int x = evt.getX();\r
584     int y = evt.getY();\r
585 \r
586     if (!dragging) {\r
587       myAtom tmp = findAtom(x,y);\r
588     }\r
589     drawLabels();\r
590     return;\r
591   }\r
592 \r
593   public void drawLabels() {\r
594     redrawneeded = true;\r
595     paint(this.getGraphics());\r
596 \r
597     for (int ii = 0; ii < pdb.chains.size() ; ii++) {\r
598 \r
599       PDBChain chain = (PDBChain)pdb.chains.elementAt(ii);\r
600 \r
601       if (chain.isVisible) {\r
602 \r
603         Vector bonds = ((PDBChain)pdb.chains.elementAt(ii)).bonds;\r
604 \r
605         for (int i = 0; i < bonds.size(); i++) {\r
606           Bond tmpBond = (Bond)bonds.elementAt(i);\r
607 \r
608           if (tmpBond.at1.isSelected) {\r
609             labelAtom(img.getGraphics(),tmpBond,1);\r
610           }\r
611 \r
612           if (tmpBond.at2.isSelected) {\r
613             labelAtom(img.getGraphics(),tmpBond,2);\r
614           }\r
615 \r
616         }\r
617       }\r
618     }\r
619 \r
620     this.getGraphics().drawImage(img,0,0,this);\r
621 \r
622     dragging = false;\r
623 \r
624   }\r
625 \r
626   public void labelAtom(Graphics g,Bond b, int n) {\r
627 \r
628     g.setFont(font);\r
629 \r
630     if (n ==1) {\r
631 \r
632       int xstart = (int)((b.start[0] - centre[0])*scale + getWidth()/2);\r
633       int ystart = (int)((b.start[1] - centre[1])*scale + getHeight()/2);\r
634 \r
635       g.setColor(Color.red);\r
636       g.drawString(b.at1.resName + "-" + b.at1.resNumber,xstart,ystart);\r
637     }\r
638 \r
639     if (n ==2) {\r
640 \r
641       int xstart = (int)((b.end[0] - centre[0])*scale + getWidth()/2);\r
642       int ystart = (int)((b.end[1] - centre[1])*scale + getHeight()/2);\r
643 \r
644       g.setColor(Color.red);\r
645       g.drawString(b.at2.resName + "-" + b.at2.resNumber,xstart,ystart);\r
646     }\r
647   }\r
648 \r
649 \r
650   public myAtom findAtom(int x, int y) {\r
651     myAtom fatom = null;\r
652 \r
653     int foundchain = -1;\r
654 \r
655     for (int ii = 0; ii < pdb.chains.size() ; ii++) {\r
656 \r
657       PDBChain chain = (PDBChain)pdb.chains.elementAt(ii);\r
658 \r
659       if (chain.isVisible) {\r
660 \r
661         Vector bonds = ((PDBChain)pdb.chains.elementAt(ii)).bonds;\r
662 \r
663         for (int i = 0; i < bonds.size(); i++) {\r
664           Bond tmpBond = (Bond)bonds.elementAt(i);\r
665 \r
666           int truex = (int)((tmpBond.start[0] - centre[0])*scale + getWidth()/2);\r
667 \r
668           if (Math.abs(truex - x) <= 2) {\r
669 \r
670             int truey = (int)((tmpBond.start[1] - centre[1])*scale + getHeight()/2);\r
671 \r
672             if (Math.abs(truey - y) <= 2) {\r
673 \r
674               System.out.println("Found match");\r
675               System.out.println(x + " " + y);\r
676               System.out.println(truex + " " + truey);\r
677               System.out.println(tmpBond.start[0] + " " + tmpBond.start[1]);\r
678               System.out.println("Atom 1 = " + tmpBond.at1.resName + " " +\r
679                                  tmpBond.at1.resNumber + " " + tmpBond.at1.chain);\r
680               fatom = tmpBond.at1;\r
681               fatom.isSelected = !fatom.isSelected;\r
682               foundchain = ii;\r
683             }\r
684           }\r
685         }\r
686       }\r
687 \r
688       if (fatom != null) //)&& chain.ds != null)\r
689       {\r
690         chain = (PDBChain)pdb.chains.elementAt(foundchain);\r
691         // SMJS TODO\r
692         // int tmp = chain.ds.seqstart + fatom.resNumber - chain.offset;\r
693         // int pos = chain.ds.findIndex(tmp);\r
694         // System.out.println("Found seq " + chain.ds.name + " "  + tmp + " " + pos);\r
695       }\r
696 \r
697     }\r
698     return fatom;\r
699   }\r
700 \r
701   public void update(Graphics g) {\r
702     paint(g);\r
703   }\r
704 \r
705 }\r