Catch null colour exception
[jalview.git] / src / MCview / PDBCanvas.java
index b3eb23f..17db1a0 100755 (executable)
@@ -88,7 +88,7 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
         int pdbend = 0;\r
         int seqstart = 0;\r
         int seqend = 0;\r
-        int [] mapping = null;\r
+        AlignSeq maxAlignseq = null;\r
 \r
         for (int i = 0; i < pdb.chains.size(); i++)\r
         {\r
@@ -126,7 +126,7 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
                 pdbend = as.seq2end;\r
                 seqstart = as.seq1start + sequence.getStart()-1;\r
                 seqend = as.seq1end + sequence.getEnd()-1;\r
-                mapping = as.getExactMapping();\r
+                maxAlignseq = as;\r
             }\r
 \r
             mappingDetails.append("\nPDB start/end "  + pdbstart + " " + pdbend);\r
@@ -140,10 +140,9 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
         mainchain.seqstart = seqstart;\r
         mainchain.seqend = seqend;\r
         mainchain.isVisible = true;\r
-        mainchain.seqMapping = mapping;\r
-      //  mainchain.sequence = sequence;\r
+        mainchain.makeExactMapping(maxAlignseq, sequence);\r
 \r
-      this.pdb = pdb;\r
+        this.pdb = pdb;\r
         this.prefsize = new Dimension(getWidth(), getHeight());\r
 \r
         //Initialize the matrices to identity\r
@@ -182,15 +181,6 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
           }\r
        });\r
 \r
-      /*\r
-       SequenceGroup sg = new SequenceGroup("PDB",\r
-                                            null, true,true,false,\r
-                                            sequence.findIndex(seqstart-1),\r
-                                            sequence.findIndex(seqend-1));\r
-       sg.addSequence(sequence, false);\r
-       sg.setOutlineColour(Color.black);\r
-       seqcanvas.getViewport().getAlignment().addGroup(sg);\r
-       */\r
 \r
         findCentre();\r
         findWidth();\r
@@ -199,13 +189,12 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
 \r
         scale = findScale();\r
 \r
-\r
-        updateSeqColours();\r
         ToolTipManager.sharedInstance().registerComponent(this);\r
         ToolTipManager.sharedInstance().setInitialDelay(0);\r
         ToolTipManager.sharedInstance().setDismissDelay(10000);\r
     }\r
 \r
+\r
     Vector visiblebonds;\r
     void setupBonds()\r
     {\r
@@ -224,25 +213,13 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
           }\r
         }\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
-\r
-        centre[0] = 0;\r
-        centre[1] = 0;\r
-        centre[2] = 0;\r
-\r
-        for (int i = 0; i < pdb.chains.size(); i++) {\r
-            ((PDBChain) pdb.chains.elementAt(i)).bonds = null;\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
@@ -392,7 +369,7 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
     {\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
@@ -455,7 +432,7 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
       {\r
         for (int ii = 0; ii < pdb.chains.size(); ii++)\r
         {\r
-          colourBySequence( (PDBChain) pdb.chains.elementAt(ii) );\r
+          colourBySequence( (PDBChain) pdb.chains.elementAt(ii));\r
         }\r
       }\r
 \r
@@ -463,6 +440,35 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
       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
     // 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
@@ -474,37 +480,40 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
         tmp.startCol = Color.lightGray;\r
         tmp.endCol = Color.lightGray;\r
 \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
-\r
-          int pos = // chain.seqstart + Don't include seqstart here, start from 0\r
-              (tmp.at1.resNumber - chain.pdbstart - chain.offset)+1;\r
-\r
-            int index = chain.seqMapping[pos];\r
+            int index = findTrueIndex(tmp.at1.alignmentMapping);\r
+                //sequence.findIndex(tmp.at1.alignmentMapping);\r
             if (index != -1)\r
             {\r
-              tmp.startCol = seqcanvas.getSequenceRenderer().findSequenceColour(\r
-                  Color.lightGray, sequence, index);\r
+              tmp.startCol = seqcanvas.getSequenceRenderer().\r
+                  getResidueBoxColour( sequence, index);\r
+              if(tmp.startCol==null)\r
+                tmp.startCol = Color.white;\r
 \r
-              tmp.startCol = seqcanvas.getFeatureRenderer().findFeatureColour(tmp.\r
-                  startCol, sequence, index);\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
-          int pos = // chain.seqstart + Don't include seqstart here, start from 0\r
-              (tmp.at2.resNumber - chain.pdbstart - chain.offset)+1;\r
 \r
-            int index = chain.seqMapping[pos];\r
+            int index =  findTrueIndex(tmp.at2.alignmentMapping);\r
+                //sequence.findIndex( tmp.at2.alignmentMapping );\r
             if (index != -1)\r
             {\r
-              tmp.endCol = seqcanvas.getSequenceRenderer().findSequenceColour(\r
-                  tmp.endCol, sequence, index);\r
-              tmp.endCol = seqcanvas.getFeatureRenderer().findFeatureColour(tmp.\r
-                  endCol, sequence, index);\r
+              tmp.endCol = seqcanvas.getSequenceRenderer().\r
+                  getResidueBoxColour( sequence, index);\r
+              if(tmp.endCol==null)\r
+                tmp.endCol = Color.white;\r
+              tmp.endCol = seqcanvas.getFeatureRenderer().\r
+                  findFeatureColour(tmp.endCol, sequence, index);\r
             }\r
         }\r
       }\r
@@ -513,8 +522,6 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
 \r
     public void drawScene(Graphics g)\r
     {\r
-\r
-\r
         if (zbuffer)\r
         {\r
             Zsort.Zsort(visiblebonds);\r
@@ -543,7 +550,6 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
                 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
@@ -652,18 +658,15 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
             PDBChain chain = (PDBChain) pdb.chains.elementAt(foundchain);\r
             if (chain == mainchain)\r
             {\r
-              int pos = // chain.seqstart + Don't include seqstart here, start from 0\r
-                  (fatom.resNumber - chain.pdbstart - chain.offset) +1 ;\r
-\r
-              if (chain.seqMapping[pos] != -1)\r
+              if (fatom.alignmentMapping != -1)\r
               {\r
                 if (highlightRes == null)\r
                   highlightRes = new Vector();\r
 \r
-                if (highlightRes.contains((chain.seqMapping[pos]) + ""))\r
-                  highlightRes.remove((chain.seqMapping[pos]) + "");\r
+                if (highlightRes.contains(fatom.alignmentMapping+"" + ""))\r
+                  highlightRes.remove(fatom.alignmentMapping + "");\r
                 else\r
-                  highlightRes.add((chain.seqMapping[pos]) + "");\r
+                  highlightRes.add(fatom.alignmentMapping + "");\r
               }\r
             }\r
           }\r
@@ -695,10 +698,7 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
           chain = (PDBChain) pdb.chains.elementAt(foundchain);\r
           if(chain == mainchain)\r
           {\r
-           int pos = // chain.seqstart + Don't include seqstart here, start from 0\r
-               (fatom.resNumber - chain.pdbstart - chain.offset) +1 ;\r
-\r
-            highlightSeqcanvas( chain.seqMapping[pos] );\r
+            highlightSeqcanvas( fatom.alignmentMapping );\r
           }\r
         }\r
 \r
@@ -816,19 +816,22 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
 \r
             if (chain.isVisible)\r
             {\r
+              Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds;\r
 \r
-                for (int i = 0; i < chain.bonds.size(); i++)\r
-                {\r
-                    Bond tmpBond = (Bond) chain.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
-                    {\r
-                        labelAtom(g, tmpBond, 1);\r
-                    }\r
-                    else if (tmpBond.at2.isSelected)\r
-                    {\r
-                        labelAtom(g, tmpBond, 2);\r
-                    }\r
+                  if (tmpBond.at1.isSelected)\r
+                  {\r
+                      labelAtom(g, tmpBond, 1);\r
+                  }\r
+\r
+                  if (tmpBond.at2.isSelected)\r
+                  {\r
+\r
+                      labelAtom(g, tmpBond, 2);\r
+                  }\r
                 }\r
             }\r
         }\r
@@ -924,46 +927,44 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
     }\r
 \r
    Bond highlightBond1, highlightBond2;\r
-   String alignMouseOver;\r
    public void highlightRes(int ii)\r
   {\r
 \r
-    int index = ii - mainchain.seqstart;\r
-\r
-    if (highlightRes!=null\r
-        && highlightRes.contains( mainchain.seqMapping[index]+ ""))\r
+    if (highlightRes != null\r
+        && highlightRes.contains((ii-1) + ""))\r
     {\r
-       return;\r
+      return;\r
     }\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
+    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
-      return;\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
-      if(index>0)\r
-      {\r
-        highlightBond1 = (Bond) mainchain.bonds.elementAt(index - 1);\r
-        highlightBond1.at2.isSelected = true;\r
-       // highlightBond1.at2.isSelected = true;\r
-      }\r
+        if (index != mainchain.bonds.size())\r
+        {\r
+          highlightBond2 = (Bond) mainchain.bonds.elementAt(index);\r
+          highlightBond2.at1.isSelected = true;\r
+        }\r
 \r
-      if(index!=mainchain.bonds.size())\r
-      {\r
-        highlightBond2 = (Bond) mainchain.bonds.elementAt(index);\r
-        highlightBond2.at1.isSelected = true;\r
-     //   highlightBond2.at2.isSelected = true;\r
+        break;\r
       }\r
     }\r
 \r
@@ -981,7 +982,5 @@ public class PDBCanvas extends JPanel implements MouseListener, MouseMotionListe
       mainchain.isVisible = true;\r
       findCentre();\r
       setupBonds();\r
-      redrawneeded = true;\r
-      repaint();\r
     }\r
 }\r