int xmid;\r
int ymid;\r
Font font = new Font("Helvetica", Font.PLAIN, 10);\r
- jalview.gui.SequenceRenderer sr;\r
- jalview.gui.FeatureRenderer fr;\r
jalview.gui.SeqCanvas seqcanvas;\r
- Sequence sequence;\r
+ public Sequence sequence;\r
final StringBuffer mappingDetails = new StringBuffer();\r
+ PDBChain mainchain;\r
+ Vector highlightRes;\r
+ boolean pdbAction = false;\r
\r
public PDBCanvas(jalview.gui.SeqCanvas seqcanvas, Sequence seq)\r
{\r
this.seqcanvas = seqcanvas;\r
this.sequence = seq;\r
- sr = seqcanvas.getSequenceRenderer();\r
- fr = seqcanvas.getFeatureRenderer();\r
-\r
- seqcanvas.setPDBViewer(this);\r
+ seqcanvas.setPDBCanvas(this);\r
}\r
\r
public void setPDBFile(PDBfile pdb)\r
{\r
- this.sr = sr;\r
- this.fr = fr;\r
int max = -10;\r
int maxchain = -1;\r
int pdbstart = 0;\r
int pdbend = 0;\r
int seqstart = 0;\r
int seqend = 0;\r
+ AlignSeq maxAlignseq = null;\r
\r
for (int i = 0; i < pdb.chains.size(); i++)\r
{\r
\r
as.printAlignment(ps);\r
\r
- if (as.maxscore > max) {\r
+\r
+\r
+ if (as.maxscore > max)\r
+ {\r
max = as.maxscore;\r
maxchain = i;\r
-\r
pdbstart = as.seq2start;\r
pdbend = as.seq2end;\r
seqstart = as.seq1start + sequence.getStart()-1;\r
seqend = as.seq1end + sequence.getEnd()-1;\r
+ maxAlignseq = as;\r
}\r
\r
mappingDetails.append("\nPDB start/end " + pdbstart + " " + pdbend);\r
mappingDetails.append("\nSEQ start/end "+ seqstart + " " + seqend);\r
}\r
\r
- ((PDBChain) pdb.chains.elementAt(maxchain)).pdbstart = pdbstart;\r
- ((PDBChain) pdb.chains.elementAt(maxchain)).pdbend = pdbend;\r
- ((PDBChain) pdb.chains.elementAt(maxchain)).seqstart = seqstart;\r
- ((PDBChain) pdb.chains.elementAt(maxchain)).seqend = seqend;\r
- ((PDBChain) pdb.chains.elementAt(maxchain)).isVisible = true;\r
- ((PDBChain) pdb.chains.elementAt(maxchain)).sequence = sequence;\r
+ mainchain = (PDBChain) pdb.chains.elementAt(maxchain);\r
+\r
+ mainchain.pdbstart = pdbstart;\r
+ mainchain.pdbend = pdbend;\r
+ mainchain.seqstart = seqstart;\r
+ mainchain.seqend = seqend;\r
+ mainchain.isVisible = true;\r
+ mainchain.makeExactMapping(maxAlignseq, sequence);\r
\r
this.pdb = pdb;\r
this.prefsize = new Dimension(getWidth(), getHeight());\r
addMouseMotionListener(this);\r
addMouseListener(this);\r
\r
+ addMouseWheelListener(new MouseWheelListener()\r
+ {\r
+ public void mouseWheelMoved(MouseWheelEvent e)\r
+ {\r
+ if (e.getWheelRotation() > 0)\r
+ {\r
+ scale = (float) (scale * 1.1);\r
+ redrawneeded = true;\r
+ repaint();\r
+ }\r
+\r
+ else\r
+ {\r
+ scale = (float) (scale * 0.9);\r
+ redrawneeded = true;\r
+ repaint();\r
+ }\r
+ }\r
+ });\r
+\r
+\r
findCentre();\r
findWidth();\r
\r
- scale = findScale();\r
+ setupBonds();\r
\r
+ scale = findScale();\r
\r
- updateSeqColours();\r
ToolTipManager.sharedInstance().registerComponent(this);\r
ToolTipManager.sharedInstance().setInitialDelay(0);\r
ToolTipManager.sharedInstance().setDismissDelay(10000);\r
-\r
}\r
\r
- public void deleteBonds() {\r
- scale = 0;\r
- maxwidth = 0;\r
\r
- width[0] = 0;\r
- width[1] = 0;\r
- width[2] = 0;\r
+ Vector visiblebonds;\r
+ void setupBonds()\r
+ {\r
+ // Sort the bonds by z coord\r
+ visiblebonds = new Vector();\r
\r
- centre[0] = 0;\r
- centre[1] = 0;\r
- centre[2] = 0;\r
+ for (int ii = 0; ii < pdb.chains.size(); ii++)\r
+ {\r
+ if ( ( (PDBChain) pdb.chains.elementAt(ii)).isVisible)\r
+ {\r
+ Vector tmp = ( (PDBChain) pdb.chains.elementAt(ii)).bonds;\r
\r
- for (int i = 0; i < pdb.chains.size(); i++) {\r
- ((PDBChain) pdb.chains.elementAt(i)).bonds = null;\r
+ for (int i = 0; i < tmp.size(); i++)\r
+ {\r
+ visiblebonds.addElement(tmp.elementAt(i));\r
+ }\r
}\r
+ }\r
+\r
+ updateSeqColours();\r
+ redrawneeded = true;\r
+ repaint();\r
}\r
\r
+\r
public void findWidth() {\r
float[] max = new float[3];\r
float[] min = new float[3];\r
centre[2] = ztot / (2 * (float) bsize);\r
}\r
\r
- public void paintComponent(Graphics g) {\r
-\r
+ public void paintComponent(Graphics g)\r
+ {\r
super.paintComponent(g);\r
\r
- if(pdb==null)\r
+ if(visiblebonds==null)\r
{\r
g.setColor(Color.black);\r
g.setFont(new Font("Verdana", Font.BOLD, 14));\r
\r
//Only create the image at the beginning -\r
//this saves much memory usage\r
- if ((img == null) || (prefsize.width != getWidth()) ||\r
- (prefsize.height != getHeight())) {\r
+ if ((img == null)\r
+ || (prefsize.width != getWidth())\r
+ || (prefsize.height != getHeight()))\r
+\r
+ {\r
prefsize.width = getWidth();\r
prefsize.height = getHeight();\r
\r
ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
RenderingHints.VALUE_ANTIALIAS_ON);\r
\r
-\r
redrawneeded = true;\r
}\r
\r
}\r
\r
g.drawImage(img, 0, 0, this);\r
+\r
+ pdbAction = false;\r
}\r
\r
public void drawAll(Graphics g, int width, int height)\r
\r
public void updateSeqColours()\r
{\r
+ if(pdbAction)\r
+ {\r
+ return;\r
+ }\r
+\r
+ // System.out.println("update seq colours");\r
if(bysequence && pdb!=null)\r
{\r
for (int ii = 0; ii < pdb.chains.size(); ii++)\r
{\r
- ( (PDBChain) pdb.chains.elementAt(ii)).colourBySequence(sr, fr);\r
+ colourBySequence( (PDBChain) pdb.chains.elementAt(ii));\r
}\r
}\r
\r
redrawneeded=true;\r
repaint();\r
+ }\r
\r
+ int findTrueIndex(int pos)\r
+ {\r
+ // returns the alignment position for a residue\r
+ int j = sequence.getStart();\r
+ int i = 0;\r
+\r
+ while ( (i < sequence.getLength()) && (j <= sequence.getEnd()) && (j <= pos+1))\r
+ {\r
+ if (!jalview.util.Comparison.isGap(sequence.getCharAt(i)))\r
+ {\r
+ j++;\r
+ }\r
+\r
+ i++;\r
+ }\r
+\r
+ if(i>1)\r
+ i--;\r
+\r
+ if ( (j == sequence.getEnd()) && (j < pos))\r
+ {\r
+ return sequence.getEnd() + 1;\r
+ }\r
+ else\r
+ {\r
+ return i;\r
+ }\r
}\r
\r
- public void drawScene(Graphics g) {\r
- // Sort the bonds by z coord\r
- Vector bonds = new Vector();\r
+ // This method has been taken out of PDBChain to allow\r
+ // Applet and Application specific sequence renderers to be used\r
+ void colourBySequence(PDBChain chain)\r
+ {\r
+ // System.out.println("colour by seq");\r
+ for (int i = 0; i < chain.bonds.size(); i++)\r
+ {\r
+ Bond tmp = (Bond) chain.bonds.elementAt(i);\r
+ tmp.startCol = Color.lightGray;\r
+ tmp.endCol = Color.lightGray;\r
\r
- for (int ii = 0; ii < pdb.chains.size(); ii++)\r
+ if(chain!=mainchain)\r
+ continue;\r
+\r
+ if ( (tmp.at1.resNumber >= ( (chain.offset + chain.pdbstart) - 1)) &&\r
+ (tmp.at1.resNumber <= ( (chain.offset + chain.pdbend) - 1)))\r
+ {\r
+ int index = findTrueIndex(tmp.at1.alignmentMapping);\r
+ //sequence.findIndex(tmp.at1.alignmentMapping);\r
+ if (index != -1)\r
+ {\r
+ tmp.startCol = seqcanvas.getSequenceRenderer().\r
+ getResidueBoxColour( sequence, index);\r
+\r
+ tmp.startCol = seqcanvas.getFeatureRenderer().\r
+ findFeatureColour(tmp.startCol, sequence, index);\r
+ }\r
+ }\r
+\r
+ if ( (tmp.at2.resNumber >= ( (chain.offset + chain.pdbstart) - 1)) &&\r
+ (tmp.at2.resNumber <= ( (chain.pdbend + chain.offset) - 1)))\r
{\r
- if ( ( (PDBChain) pdb.chains.elementAt(ii)).isVisible)\r
- {\r
- Vector tmp = ( (PDBChain) pdb.chains.elementAt(ii)).bonds;\r
\r
- for (int i = 0; i < tmp.size(); i++)\r
+ int index = findTrueIndex(tmp.at2.alignmentMapping);\r
+ //sequence.findIndex( tmp.at2.alignmentMapping );\r
+ if (index != -1)\r
{\r
- bonds.addElement(tmp.elementAt(i));\r
+ tmp.endCol = seqcanvas.getSequenceRenderer().\r
+ getResidueBoxColour( sequence, index);\r
+ tmp.endCol = seqcanvas.getFeatureRenderer().\r
+ findFeatureColour(tmp.endCol, sequence, index);\r
}\r
- }\r
}\r
+ }\r
+ }\r
\r
- if (zbuffer) {\r
- Zsort.Zsort(bonds);\r
+\r
+ public void drawScene(Graphics g)\r
+ {\r
+ if (zbuffer)\r
+ {\r
+ Zsort.Zsort(visiblebonds);\r
}\r
\r
- for (int i = 0; i < bonds.size(); i++) {\r
- Bond tmpBond = (Bond) bonds.elementAt(i);\r
+ Bond tmpBond=null;\r
+ for (int i = 0; i < visiblebonds.size(); i++)\r
+ {\r
+ tmpBond = (Bond) visiblebonds.elementAt(i);\r
\r
xstart = (int) (((tmpBond.start[0] - centre[0]) * scale) +\r
(getWidth() / 2));\r
xmid = (xend + xstart) / 2;\r
ymid = (yend + ystart) / 2;\r
\r
- if (depthcue && !bymolecule) {\r
+ if (depthcue && !bymolecule)\r
+ {\r
if (tmpBond.start[2] < (centre[2] - (maxwidth / 6))) {\r
g.setColor(tmpBond.startCol.darker().darker());\r
drawLine(g, xstart, ystart, xmid, ymid);\r
-\r
g.setColor(tmpBond.endCol.darker().darker());\r
drawLine(g, xmid, ymid, xend, yend);\r
} else if (tmpBond.start[2] < (centre[2] + (maxwidth / 6))) {\r
} else {\r
drawLine(g, xstart, ystart, xend, yend);\r
}\r
+\r
+ if(highlightBond1!=null && highlightBond1==tmpBond)\r
+ {\r
+ g.setColor(tmpBond.endCol.brighter().brighter().brighter().brighter());\r
+ drawLine(g, xmid, ymid, xend, yend);\r
+ }\r
+\r
+ if(highlightBond2!=null && highlightBond2==tmpBond)\r
+ {\r
+ g.setColor(tmpBond.startCol.brighter().brighter().brighter().brighter());\r
+ drawLine(g, xstart, ystart, xmid, ymid);\r
+ }\r
+\r
}\r
+\r
+\r
}\r
\r
public void drawLine(Graphics g, int x1, int y1, int x2, int y2) {\r
return prefsize;\r
}\r
\r
- public void keyPressed(KeyEvent evt) {\r
- int key = evt.getKeyChar();\r
+ public void keyPressed(KeyEvent evt)\r
+ {\r
if (evt.getKeyCode() == KeyEvent.VK_UP)\r
{\r
scale = (float) (scale * 1.1);\r
}\r
}\r
\r
- public void mousePressed(MouseEvent e) {\r
- myAtom fatom = findAtom(e.getX(), e.getY());\r
+ public void mousePressed(MouseEvent e)\r
+ {\r
+ pdbAction = true;\r
+ Atom fatom = findAtom(e.getX(), e.getY());\r
if(fatom!=null)\r
{\r
fatom.isSelected = !fatom.isSelected;\r
+\r
redrawneeded = true;\r
repaint();\r
+ if (foundchain != -1)\r
+ {\r
+ PDBChain chain = (PDBChain) pdb.chains.elementAt(foundchain);\r
+ if (chain == mainchain)\r
+ {\r
+ if (fatom.alignmentMapping != -1)\r
+ {\r
+ if (highlightRes == null)\r
+ highlightRes = new Vector();\r
+\r
+ if (highlightRes.contains(fatom.alignmentMapping+"" + ""))\r
+ highlightRes.remove(fatom.alignmentMapping + "");\r
+ else\r
+ highlightRes.add(fatom.alignmentMapping + "");\r
+ }\r
+ }\r
+ }\r
+\r
}\r
mx = e.getX();\r
my = e.getY();\r
dragging = false;\r
}\r
\r
- public void mouseMoved(MouseEvent e) {\r
+ public void mouseMoved(MouseEvent e)\r
+ {\r
+ pdbAction = true;\r
+ if(highlightBond1!=null)\r
+ {\r
+ highlightBond1.at2.isSelected = false;\r
+ highlightBond2.at1.isSelected = false;\r
+ highlightBond1 = null;\r
+ highlightBond2 = null;\r
+ }\r
\r
- myAtom fatom = findAtom(e.getX(), e.getY());\r
+ Atom fatom = findAtom(e.getX(), e.getY());\r
\r
+ PDBChain chain = null;\r
if(foundchain!=-1)\r
{\r
- PDBChain chain = (PDBChain) pdb.chains.elementAt(foundchain);\r
- int pos = chain.seqstart +\r
- (fatom.resNumber - chain.pdbstart - chain.offset)+1;\r
-\r
- int index = seqcanvas.getViewport().getAlignment().findIndex(sequence);\r
-\r
- seqcanvas.highlightSearchResults(new int[]{index, pos, pos});\r
+ chain = (PDBChain) pdb.chains.elementAt(foundchain);\r
+ if(chain == mainchain)\r
+ {\r
+ highlightSeqcanvas( fatom.alignmentMapping );\r
+ }\r
}\r
- else\r
- seqcanvas.highlightSearchResults(null);\r
\r
- if (fatom != null) {\r
- this.setToolTipText(fatom.resNumber+" "+ fatom.resName);\r
- } else {\r
- this.setToolTipText("");\r
+ if (fatom != null)\r
+ {\r
+ this.setToolTipText(chain.id+":"+ fatom.resNumber+" "+ fatom.resName);\r
+ } else\r
+ {\r
+ highlightSeqcanvas( -1);\r
+ this.setToolTipText(null);\r
}\r
}\r
\r
- public void mouseClicked(MouseEvent e) {\r
- }\r
\r
- public void mouseEntered(MouseEvent e) {\r
- }\r
+ void highlightSeqcanvas(int pos)\r
+ {\r
+ int index = seqcanvas.getViewport().getAlignment().findIndex(sequence);\r
+\r
+ int size = pos==-1?0:3;\r
+\r
+ if(highlightRes!=null)\r
+ size += highlightRes.size()*3;\r
\r
- public void mouseExited(MouseEvent e) {\r
+ int [] array = new int[size];\r
+ int i=0;\r
+ if(highlightRes!=null)\r
+ {\r
+ for (i = 0; i < highlightRes.size(); i++)\r
+ {\r
+ int a = Integer.parseInt(highlightRes.elementAt(\r
+ i).toString())+1;\r
+ array[i * 3] = index;\r
+ array[ (i * 3) + 1] = a;\r
+ array[ (i * 3) + 2] = a;\r
+ }\r
+ }\r
+\r
+ if(pos!=-1)\r
+ {\r
+ array[i * 3] = index;\r
+ array[i * 3 + 1] = pos+1;\r
+ array[i * 3 + 2] = pos+1;\r
+ }\r
+\r
+ seqcanvas.highlightSearchResults(array);\r
}\r
\r
- public void mouseDragged(MouseEvent evt) {\r
+\r
+ public void mouseClicked(MouseEvent e) { }\r
+\r
+ public void mouseEntered(MouseEvent e) { }\r
+\r
+ public void mouseExited(MouseEvent e) { }\r
+\r
+ public void mouseDragged(MouseEvent evt)\r
+ {\r
int x = evt.getX();\r
int y = evt.getY();\r
mx = x;\r
my = y;\r
\r
+\r
MCMatrix objmat = new MCMatrix(3, 3);\r
objmat.setIdentity();\r
\r
repaint();\r
}\r
\r
- public void mouseReleased(MouseEvent evt) {\r
+ public void mouseReleased(MouseEvent evt)\r
+ {\r
dragging = false;\r
return;\r
}\r
\r
void drawLabels(Graphics g) {\r
\r
- for (int ii = 0; ii < pdb.chains.size(); ii++) {\r
+ for (int ii = 0; ii < pdb.chains.size(); ii++)\r
+ {\r
PDBChain chain = (PDBChain) pdb.chains.elementAt(ii);\r
\r
- if (chain.isVisible) {\r
- Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds;\r
+ if (chain.isVisible)\r
+ {\r
+ Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds;\r
\r
- for (int i = 0; i < bonds.size(); i++) {\r
- Bond tmpBond = (Bond) bonds.elementAt(i);\r
+ for (int i = 0; i < bonds.size(); i++)\r
+ {\r
+ Bond tmpBond = (Bond) bonds.elementAt(i);\r
\r
- if (tmpBond.at1.isSelected) {\r
- labelAtom(g, tmpBond, 1);\r
- }\r
+ if (tmpBond.at1.isSelected)\r
+ {\r
+ labelAtom(g, tmpBond, 1);\r
+ }\r
\r
- if (tmpBond.at2.isSelected) {\r
- labelAtom(g, tmpBond, 2);\r
- }\r
+ if (tmpBond.at2.isSelected)\r
+ {\r
+\r
+ labelAtom(g, tmpBond, 2);\r
+ }\r
}\r
}\r
}\r
\r
public void labelAtom(Graphics g, Bond b, int n) {\r
g.setFont(font);\r
-\r
- if (n == 1) {\r
+ g.setColor(Color.red);\r
+ if (n == 1)\r
+ {\r
int xstart = (int) (((b.start[0] - centre[0]) * scale) +\r
(getWidth() / 2));\r
int ystart = (int) (((b.start[1] - centre[1]) * scale) +\r
(getHeight() / 2));\r
\r
- g.setColor(Color.red);\r
g.drawString(b.at1.resName + "-" + b.at1.resNumber, xstart, ystart);\r
}\r
\r
int ystart = (int) (((b.end[1] - centre[1]) * scale) +\r
(getHeight() / 2));\r
\r
- g.setColor(Color.red);\r
g.drawString(b.at2.resName + "-" + b.at2.resNumber, xstart, ystart);\r
}\r
}\r
\r
int foundchain = -1;\r
- public myAtom findAtom(int x, int y) {\r
- myAtom fatom = null;\r
+ public Atom findAtom(int x, int y) {\r
+ Atom fatom = null;\r
\r
foundchain = -1;\r
\r
- for (int ii = 0; ii < pdb.chains.size(); ii++) {\r
+ for (int ii = 0; ii < pdb.chains.size(); ii++)\r
+ {\r
PDBChain chain = (PDBChain) pdb.chains.elementAt(ii);\r
+ int truex;\r
+ Bond tmpBond=null;\r
\r
- if (chain.isVisible) {\r
+ if (chain.isVisible)\r
+ {\r
Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds;\r
\r
- for (int i = 0; i < bonds.size(); i++) {\r
- Bond tmpBond = (Bond) bonds.elementAt(i);\r
+ for (int i = 0; i < bonds.size(); i++)\r
+ {\r
+ tmpBond = (Bond) bonds.elementAt(i);\r
\r
- int truex = (int) (((tmpBond.start[0] - centre[0]) * scale) +\r
+ truex = (int) (((tmpBond.start[0] - centre[0]) * scale) +\r
(getWidth() / 2));\r
\r
- if (Math.abs(truex - x) <= 2) {\r
+ if (Math.abs(truex - x) <= 2)\r
+ {\r
int truey = (int) (((tmpBond.start[1] - centre[1]) * scale) +\r
(getHeight() / 2));\r
\r
}\r
}\r
}\r
+\r
+ // Still here? Maybe its the last bond\r
+\r
+ truex = (int) ( ( (tmpBond.end[0] - centre[0]) * scale) +\r
+ (getWidth() / 2));\r
+\r
+ if (Math.abs(truex - x) <= 2)\r
+ {\r
+ int truey = (int) ( ( (tmpBond.end[1] - centre[1]) * scale) +\r
+ (getHeight() / 2));\r
+\r
+ if (Math.abs(truey - y) <= 2)\r
+ {\r
+ fatom = tmpBond.at2;\r
+ foundchain = ii;\r
+ break;\r
+ }\r
+ }\r
+\r
}\r
\r
if (fatom != null) //)&& chain.ds != null)\r
\r
return fatom;\r
}\r
+\r
+ Bond highlightBond1, highlightBond2;\r
+ public void highlightRes(int ii)\r
+ {\r
+\r
+ if (highlightRes != null\r
+ && highlightRes.contains((ii-1) + ""))\r
+ {\r
+ return;\r
+ }\r
+\r
+ int index = -1;\r
+ Bond tmpBond;\r
+ for(index=0; index<mainchain.bonds.size(); index++)\r
+ {\r
+ tmpBond = (Bond) mainchain.bonds.elementAt(index);\r
+ if (tmpBond.at1.alignmentMapping == ii - 1)\r
+ {\r
+ if (highlightBond1 != null)\r
+ highlightBond1.at2.isSelected = false;\r
+\r
+ if (highlightBond2 != null)\r
+ highlightBond2.at1.isSelected = false;\r
+\r
+ highlightBond1 = null;\r
+ highlightBond2 = null;\r
+\r
+ if (index > 0)\r
+ {\r
+ highlightBond1 = (Bond) mainchain.bonds.elementAt(index - 1);\r
+ highlightBond1.at2.isSelected = true;\r
+ }\r
+\r
+ if (index != mainchain.bonds.size())\r
+ {\r
+ highlightBond2 = (Bond) mainchain.bonds.elementAt(index);\r
+ highlightBond2.at1.isSelected = true;\r
+ }\r
+\r
+ break;\r
+ }\r
+ }\r
+\r
+ redrawneeded = true;\r
+ repaint();\r
+ }\r
+\r
+ public void setAllchainsVisible(boolean b)\r
+ {\r
+ for (int ii = 0; ii < pdb.chains.size(); ii++)\r
+ {\r
+ PDBChain chain = (PDBChain) pdb.chains.elementAt(ii);\r
+ chain.isVisible = b;\r
+ }\r
+ mainchain.isVisible = true;\r
+ findCentre();\r
+ setupBonds();\r
+ }\r
}\r