Merge branch 'develop' into feature/r2_11_2/JAL-3808_gff2_exonerate
[jalview.git] / src / jalview / structures / models / AAStructureBindingModel.java
index 16dd96c..9ecf630 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.structures.models;
 
+import java.util.Locale;
+
 import java.awt.Color;
 import java.io.File;
 import java.io.IOException;
@@ -39,7 +41,7 @@ import jalview.api.FeatureRenderer;
 import jalview.api.SequenceRenderer;
 import jalview.api.StructureSelectionManagerProvider;
 import jalview.api.structures.JalviewStructureDisplayI;
-import jalview.bin.Cache;
+import jalview.bin.Console;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.MappedFeatures;
@@ -59,6 +61,7 @@ import jalview.structure.AtomSpec;
 import jalview.structure.AtomSpecModel;
 import jalview.structure.StructureCommandI;
 import jalview.structure.StructureCommandsI;
+import jalview.structure.StructureCommandsI.AtomSpecType;
 import jalview.structure.StructureListener;
 import jalview.structure.StructureMapping;
 import jalview.structure.StructureSelectionManager;
@@ -67,7 +70,7 @@ import jalview.util.MessageManager;
 
 /**
  * 
- * A base class to hold common function for protein structure model binding.
+ * A base class to hold common function for 3D structure model binding.
  * Initial version created by refactoring JMol and Chimera binding models, but
  * other structure viewers could in principle be accommodated in future.
  * 
@@ -89,6 +92,9 @@ public abstract class AAStructureBindingModel
 
     public String chain = "";
 
+    /**
+     * is the mapped sequence not protein ?
+     */
     public boolean isRna;
 
     /*
@@ -165,6 +171,9 @@ public abstract class AAStructureBindingModel
 
   protected boolean colourBySequence = true;
 
+  /**
+   * true if all sequences appear to be nucleotide
+   */
   private boolean nucleotide;
 
   private boolean finishedInit = false;
@@ -582,6 +591,7 @@ public abstract class AAStructureBindingModel
       }
     }
   }
+  
 
   @Override
   public abstract void highlightAtoms(List<AtomSpec> atoms);
@@ -713,7 +723,7 @@ public abstract class AAStructureBindingModel
               structures[pdbfnum].chain = chain;
             }
             structures[pdbfnum].pdbId = mapping.getPdbId();
-            structures[pdbfnum].isRna = theSequence.getRNA() != null;
+            structures[pdbfnum].isRna = !theSequence.isProtein();
 
             /*
              * move on to next pdb file (ignore sequences for other chains
@@ -915,7 +925,8 @@ public abstract class AAStructureBindingModel
        */
       // todo better way to ensure synchronous than setting getReply true!!
       executeCommands(commandGenerator.showBackbone(), true, null);
-
+      
+      AtomSpecType backbone = structures[refStructure].isRna ? AtomSpecType.PHOSPHATE : AtomSpecType.ALPHA;
       /*
        * superpose each (other) structure to the reference in turn
        */
@@ -925,12 +936,12 @@ public abstract class AAStructureBindingModel
         {
           AtomSpecModel atomSpec = getAtomSpec(structures[i], matched);
           List<StructureCommandI> commands = commandGenerator
-                  .superposeStructures(refAtoms, atomSpec);
+                  .superposeStructures(refAtoms, atomSpec, backbone);
           List<String> replies = executeCommands(commands, true, null);
           for (String reply : replies)
           {
             // return this error (Chimera only) to the user
-            if (reply.toLowerCase().contains("unequal numbers of atoms"))
+            if (reply.toLowerCase(Locale.ROOT).contains("unequal numbers of atoms"))
             {
               error += "; " + reply;
             }
@@ -1072,7 +1083,10 @@ public abstract class AAStructureBindingModel
    * executed.
    * <p>
    * If a reply is wanted, the execution is done synchronously (waits),
-   * otherwise it is done in a separate thread (doesn't wait).
+   * otherwise it is done in a separate thread (doesn't wait). WARNING: if you
+   * are sending commands that need to execute before later calls to
+   * executeCommand (e.g. mouseovers, which clean up after previous ones) then
+   * set getReply true to ensure that commands are not executed out of order.
    * 
    * @param getReply
    * @param msg
@@ -1096,7 +1110,10 @@ public abstract class AAStructureBindingModel
         for (StructureCommandI cmd : cmds)
         {
           List<String> replies = executeCommand(cmd, true);
-          response.addAll(replies);
+          if (replies != null)
+          {
+            response.addAll(replies);
+          }
         }
         return response;
       } finally
@@ -1213,8 +1230,7 @@ public abstract class AAStructureBindingModel
   }
 
   /**
-   * Returns the FeatureRenderer for the given alignment view, or null if
-   * feature display is turned off in the view.
+   * Returns the FeatureRenderer for the given alignment view
    * 
    * @param avp
    * @return
@@ -1227,9 +1243,7 @@ public abstract class AAStructureBindingModel
     {
       return null;
     }
-    return ap.getAlignViewport().isShowSequenceFeatures()
-            ? ap.getFeatureRenderer()
-            : null;
+    return ap.getFeatureRenderer();
   }
 
   protected void setStructureCommands(StructureCommandsI cmd)
@@ -1491,7 +1505,7 @@ public abstract class AAStructureBindingModel
       saveSession(f);
     } catch (IOException e)
     {
-      Cache.log.error(String.format("Error saving %s session: %s", prefix,
+      Console.error(String.format("Error saving %s session: %s", prefix,
               e.toString()));
     }