JAL-3518 separation of ChimeraXManager, pull up of closeViewer etc
[jalview.git] / src / jalview / ext / rbvi / chimera / JalviewChimeraBinding.java
index bc4eef4..b20f135 100644 (file)
@@ -78,6 +78,16 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
   String lastHighlightCommand;
 
   /**
+   * Returns a model of the structure positions described by the Chimera format atomspec
+   * @param atomSpec
+   * @return
+   */
+  protected  AtomSpec parseAtomSpec(String atomSpec)
+  {
+    return AtomSpec.fromChimeraAtomspec(atomSpec);
+  }
+
+  /**
    * Open a PDB structure file in Chimera and set up mappings from Jalview.
    * 
    * We check if the PDB model id is already loaded in Chimera, if so don't reopen
@@ -171,9 +181,9 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
           DataSourceType protocol)
   {
     super(ssm, pdbentry, sequenceIs, protocol);
-    chimeraManager = new ChimeraManager(new StructureManager(true));
-    chimeraManager.setChimeraX(ViewerType.CHIMERAX.equals(getViewerType()));
-    setStructureCommands(new ChimeraCommands());
+    boolean chimeraX = ViewerType.CHIMERAX.equals(getViewerType());
+    chimeraManager = chimeraX ? new ChimeraXManager(new StructureManager(true)) : new ChimeraManager(new StructureManager(true));
+    setStructureCommands(chimeraX ? new ChimeraXCommands() : new ChimeraCommands());
   }
 
   @Override
@@ -191,7 +201,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
     try
     {
       chimeraListener = new ChimeraListener(this);
-      chimeraManager.startListening(chimeraListener.getUri());
+      startListening(chimeraListener.getUri());
     } catch (BindException e)
     {
       System.err.println(
@@ -212,6 +222,16 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
       chimeraListener.shutdown();
       chimeraListener = null;
     }
+    
+    /*
+     * the following call should not be needed but is temporarily included,
+     * to avoid a stack trace error in Chimera after "stop really" is sent
+     */
+    if (closeChimera)
+    {
+      chimeraManager.getChimeraProcess().destroy();
+    }
+
     chimeraManager.clearOnChimeraExit();
     chimeraManager = null;
   }
@@ -420,14 +440,35 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
     /*
      * Ask Chimera for its current selection
      */
-    List<String> selection = chimeraManager.getSelectedResidueSpecs();
+    StructureCommandI command = getCommandGenerator().getSelectedResidues();
+    List<String> chimeraReply = executeCommand(command, true);
+    List<String> selectedResidues = new ArrayList<>();
+    if (chimeraReply != null)
+    {
+      /*
+       * expect 0, 1 or more lines of the format either
+       * Chimera:
+       * residue id #0:43.A type GLY
+       * ChimeraX:
+       * residue id /A:89 name THR index 88
+       * We are only interested in the atomspec (third token of the reply)
+       */
+      for (String inputLine : chimeraReply)
+      {
+        String[] inputLineParts = inputLine.split("\\s+");
+        if (inputLineParts.length >= 5)
+        {
+          selectedResidues.add(inputLineParts[2]);
+        }
+      }
+    }
 
     /*
      * Parse model number, residue and chain for each selected position,
      * formatted as #0:123.A or #1.2:87.B (#model.submodel:residue.chain)
      */
     List<AtomSpec> atomSpecs = convertStructureResiduesToAlignment(
-            selection);
+            selectedResidues);
 
     /*
      * Broadcast the selection (which may be empty, if the user just cleared all
@@ -437,7 +478,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
   }
 
   /**
-   * Converts a list of Chimera atomspecs to a list of AtomSpec representing the
+   * Converts a list of Chimera(X) atomspecs to a list of AtomSpec representing the
    * corresponding residues (if any) in Jalview
    * 
    * @param structureSelection
@@ -446,13 +487,12 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
   protected List<AtomSpec> convertStructureResiduesToAlignment(
           List<String> structureSelection)
   {
-    boolean chimeraX = chimeraManager.isChimeraX();
     List<AtomSpec> atomSpecs = new ArrayList<>();
     for (String atomSpec : structureSelection)
     {
       try
       {
-        AtomSpec spec = AtomSpec.fromChimeraAtomspec(atomSpec, chimeraX);
+        AtomSpec spec = parseAtomSpec(atomSpec);
         String pdbfilename = getPdbFileForModel(spec.getModelNumber());
         spec.setPdbFile(pdbfilename);
         atomSpecs.add(spec);
@@ -645,7 +685,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
   {
     boolean featureAdded = false;
     String featureGroup = getViewerFeatureGroup();
-    boolean chimeraX = chimeraManager.isChimeraX();
 
     for (String residue : residues)
     {
@@ -669,7 +708,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
 
       try
       {
-        spec = AtomSpec.fromChimeraAtomspec(atomSpec, chimeraX);
+        spec = parseAtomSpec(atomSpec);
       } catch (IllegalArgumentException e)
       {
         System.err.println("Problem parsing atomspec " + atomSpec);