JAL-1528 bug fixes and adjustments to Chimera interface
[jalview.git] / src / jalview / structure / StructureSelectionManager.java
index b38fa7c..928bb47 100644 (file)
@@ -198,9 +198,33 @@ public class StructureSelectionManager
   }
 
   /**
+   * Import structure data and register a structure mapping for broadcasting
+   * colouring, mouseovers and selection events (convenience wrapper).
+   * 
+   * @param sequence
+   *          - one or more sequences to be mapped to pdbFile
+   * @param targetChains
+   *          - optional chain specification for mapping each sequence to pdb
+   *          (may be nill, individual elements may be nill)
+   * @param pdbFile
+   *          - structure data resource
+   * @param protocol
+   *          - how to resolve data from resource
+   * @return null or the structure data parsed as a pdb file
+   */
+  synchronized public MCview.PDBfile setMapping(SequenceI[] sequence,
+          String[] targetChains, String pdbFile, String protocol)
+  {
+    return setMapping(true, sequence, targetChains, pdbFile, protocol);
+  }
+
+  /**
    * create sequence structure mappings between each sequence and the given
    * pdbFile (retrieved via the given protocol).
    * 
+   * @param forStructureView
+   *          when true, record the mapping for use in mouseOvers
+   * 
    * @param sequence
    *          - one or more sequences to be mapped to pdbFile
    * @param targetChains
@@ -212,7 +236,8 @@ public class StructureSelectionManager
    *          - how to resolve data from resource
    * @return null or the structure data parsed as a pdb file
    */
-  synchronized public MCview.PDBfile setMapping(SequenceI[] sequence,
+  synchronized public MCview.PDBfile setMapping(boolean forStructureView,
+          SequenceI[] sequence,
           String[] targetChains, String pdbFile, String protocol)
   {
     /*
@@ -221,17 +246,28 @@ public class StructureSelectionManager
      */
     MCview.PDBfile pdb = null;
     boolean parseSecStr=true;
-    for (SequenceI sq:sequence)
+    if (isPDBFileRegistered(pdbFile))
     {
-      SequenceI ds = sq;while (ds.getDatasetSequence()!=null) { ds = ds.getDatasetSequence();};
-      if (ds.getAnnotation()!=null)
+      for (SequenceI sq : sequence)
       {
-        for (AlignmentAnnotation ala:ds.getAnnotation())
+        SequenceI ds = sq;
+        while (ds.getDatasetSequence() != null)
+        {
+          ds = ds.getDatasetSequence();
+        }
+        ;
+        if (ds.getAnnotation() != null)
         {
-          // false if any annotation present from this structure
-          if (MCview.PDBfile.isCalcIdForFile(ala.getCalcId(), pdbFile))
+          for (AlignmentAnnotation ala : ds.getAnnotation())
           {
-            parseSecStr = false;
+            // false if any annotation present from this structure
+            // JBPNote this fails for jmol/chimera view because the *file* is
+            // passed, not the structure data ID -
+            if (MCview.PDBfile.isCalcIdForFile(ala,
+                    findIdForPDBFile(pdbFile)))
+            {
+              parseSecStr = false;
+            }
           }
         }
       }
@@ -239,7 +275,11 @@ public class StructureSelectionManager
     try
     {
       pdb = new MCview.PDBfile(true, parseSecStr, pdbFile, protocol);
-      
+      if (pdb.id != null && pdb.id.trim().length() > 0
+              && FormatAdapter.FILE.equals(protocol))
+      {
+        registerPDBFile(pdb.id.trim(), pdbFile);
+      }
     } catch (Exception ex)
     {
       ex.printStackTrace();
@@ -320,11 +360,13 @@ public class StructureSelectionManager
               + maxChain.residues.size() + "\n\n");
       PrintStream ps = new PrintStream(System.out)
       {
+        @Override
         public void print(String x)
         {
           mappingDetails.append(x);
         }
 
+        @Override
         public void println()
         {
           mappingDetails.append("\n");
@@ -340,7 +382,10 @@ public class StructureSelectionManager
               + (maxAlignseq.seq1end + sequence[s].getEnd() - 1));
 
       maxChain.makeExactMapping(maxAlignseq, sequence[s]);
-
+      jalview.datamodel.Mapping sqmpping = maxAlignseq
+              .getMappingFromS1(false);
+      jalview.datamodel.Mapping omap = new jalview.datamodel.Mapping(
+              sqmpping.getMap().getInverse());
       maxChain.transferRESNUMFeatures(sequence[s], null);
 
       // allocate enough slots to store the mapping from positions in
@@ -363,26 +408,30 @@ public class StructureSelectionManager
         index++;
       } while (index < maxChain.atoms.size());
 
-      if (mappings == null)
-      {
-        mappings = new StructureMapping[1];
-      }
-      else
-      {
-        StructureMapping[] tmp = new StructureMapping[mappings.length + 1];
-        System.arraycopy(mappings, 0, tmp, 0, mappings.length);
-        mappings = tmp;
-      }
-
       if (protocol.equals(jalview.io.AppletFormatAdapter.PASTE))
       {
         pdbFile = "INLINE" + pdb.id;
       }
-
-      mappings[mappings.length - 1] = new StructureMapping(sequence[s],
+      StructureMapping newMapping = new StructureMapping(sequence[s],
               pdbFile, pdb.id, maxChainId, mapping,
               mappingDetails.toString());
-      maxChain.transferResidueAnnotation(mappings[mappings.length - 1]);
+      if (forStructureView)
+      {
+
+        if (mappings == null)
+        {
+          mappings = new StructureMapping[1];
+        }
+        else
+        {
+          StructureMapping[] tmp = new StructureMapping[mappings.length + 1];
+          System.arraycopy(mappings, 0, tmp, 0, mappings.length);
+          mappings = tmp;
+        }
+
+        mappings[mappings.length - 1] = newMapping;
+      }
+      maxChain.transferResidueAnnotation(newMapping, sqmpping);
     }
     // ///////