*/
package jalview.ext.rbvi.chimera;
-import jalview.api.AlignmentViewPanel;
-import jalview.api.structures.JalviewStructureDisplayI;
-import jalview.bin.Cache;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.HiddenColumns;
-import jalview.datamodel.PDBEntry;
-import jalview.datamodel.SearchResultMatchI;
-import jalview.datamodel.SearchResultsI;
-import jalview.datamodel.SequenceFeature;
-import jalview.datamodel.SequenceI;
-import jalview.gui.StructureViewer.ViewerType;
-import jalview.httpserver.AbstractRequestHandler;
-import jalview.io.DataSourceType;
-import jalview.structure.AtomSpec;
-import jalview.structure.StructureCommandsI.SuperposeData;
-import jalview.structure.StructureSelectionManager;
-import jalview.structures.models.AAStructureBindingModel;
-import jalview.util.MessageManager;
-
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.BindException;
import java.util.ArrayList;
-import java.util.BitSet;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import ext.edu.ucsf.rbvi.strucviz2.ChimeraModel;
import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
import ext.edu.ucsf.rbvi.strucviz2.StructureManager.ModelType;
+import jalview.api.AlignmentViewPanel;
+import jalview.api.structures.JalviewStructureDisplayI;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SearchResultMatchI;
+import jalview.datamodel.SearchResultsI;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.gui.StructureViewer.ViewerType;
+import jalview.httpserver.AbstractRequestHandler;
+import jalview.io.DataSourceType;
+import jalview.structure.AtomSpec;
+import jalview.structure.StructureCommand;
+import jalview.structure.StructureCommandI;
+import jalview.structure.StructureSelectionManager;
+import jalview.structures.models.AAStructureBindingModel;
public abstract class JalviewChimeraBinding extends AAStructureBindingModel
{
+ public static final String CHIMERA_SESSION_EXTENSION = ".py";
+
public static final String CHIMERA_FEATURE_GROUP = "Chimera";
// Chimera clause to exclude alternate locations in atom selection
* Close down the Jalview viewer and listener, and (optionally) the associated
* Chimera window.
*/
+ @Override
public void closeViewer(boolean closeChimera)
{
- getSsm().removeStructureViewerListener(this, this.getStructureFiles());
+ super.closeViewer(closeChimera);
if (closeChimera)
{
chimeraManager.exitChimera();
{
chimeraMonitor.interrupt();
}
- releaseUIResources();
}
/**
*
* @return
*/
- public boolean isChimeraRunning()
+ @Override
+ public boolean isViewerRunning()
{
return chimeraManager.isChimeraLaunched();
}
* @param getResponse
*/
@Override
- public List<String> executeCommand(final String command,
+ public List<String> executeCommand(final StructureCommandI command,
boolean getResponse)
{
if (chimeraManager == null || command == null)
}
List<String> reply = null;
// trim command or it may never find a match in the replyLog!!
+ String cmd = command.getCommand().trim();
List<String> lastReply = chimeraManager
- .sendChimeraCommand(command.trim(), getResponse);
+ .sendChimeraCommand(cmd, getResponse);
if (getResponse)
{
reply = lastReply;
if (debug)
{
- log("Response from command ('" + command + "') was:\n" + lastReply);
+ log("Response from command ('" + cmd + "') was:\n" + lastReply);
}
}
return reply;
}
- /**
- * @param command
- */
- protected void executeWhenReady(String command)
- {
- waitForChimera();
- executeCommand(command, false);
- waitForChimera();
- }
-
- private void waitForChimera()
- {
- while (chimeraManager != null && chimeraManager.isBusy())
- {
- try
- {
- Thread.sleep(15);
- } catch (InterruptedException q)
- {
- }
- }
- }
-
@Override
public synchronized String[] getStructureFiles()
{
}
/**
- * Ask Chimera to save its session to the given file. Returns true if
- * successful, else false.
- *
- * @param filepath
- * @return
- */
- public boolean saveSession(String filepath)
- {
- if (isChimeraRunning())
- {
- /*
- * Chimera: https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/save.html
- * ChimeraX: https://www.cgl.ucsf.edu/chimerax/docs/user/commands/save.html
- */
- String command = getCommandGenerator().saveSession(filepath);
- List<String> reply = chimeraManager.sendChimeraCommand(command, true);
- if (reply.contains("Session written"))
- {
- return true;
- }
- else
- {
- Cache.log
- .error("Error saving Chimera session: " + reply.toString());
- }
- }
- return false;
- }
-
- /**
* Ask Chimera to open a session file. Returns true if successful, else false.
* The filename must have a .py (Chimera) or .cxs (ChimeraX) extension for
* this command to work.
* Chimera: https://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/open.html
* ChimeraX: https://www.cgl.ucsf.edu/chimerax/docs/user/commands/open.html
*/
- executeCommand("open " + filepath, true);
+ executeCommand(getCommandGenerator().loadFile(filepath), true);
// todo: test for failure - how?
return true;
}
return 0;
}
- String[] commands = getCommandGenerator()
+ List<StructureCommandI> commands = getCommandGenerator()
.setAttributesForFeatures(getSsm(), files, getSequence(), avp);
- if (commands.length > 10)
+ if (commands.size() > 10)
{
sendCommandsByFile(commands);
}
else
{
- for (String command : commands)
+ for (StructureCommandI command : commands)
{
sendAsynchronousCommand(command, null);
}
}
- return commands.length;
+ return commands.size();
}
/**
*
* @param commands
*/
- protected void sendCommandsByFile(String[] commands)
+ protected void sendCommandsByFile(List<StructureCommandI> commands)
{
try
{
File tmp = File.createTempFile("chim", getCommandFileExtension());
tmp.deleteOnExit();
PrintWriter out = new PrintWriter(new FileOutputStream(tmp));
- for (String command : commands)
+ for (StructureCommandI command : commands)
{
- out.println(command);
+ out.println(command.getCommand());
}
out.flush();
out.close();
String path = tmp.getAbsolutePath();
- String command = getCommandGenerator().openCommandFile(path);
+ StructureCommandI command = getCommandGenerator()
+ .openCommandFile(path);
sendAsynchronousCommand(command, null);
} catch (IOException e)
{
// fails for 'average.bfactor' (which is bad):
String cmd = "list residues attr '" + attName + "'";
- List<String> residues = executeCommand(cmd, true);
+ List<String> residues = executeCommand(new StructureCommand(cmd), true);
boolean featureAdded = createFeaturesForAttributes(attName, residues);
if (featureAdded)
}
@Override
- public int getModelNoForFile(String pdbFile)
+ public String getModelIdForFile(String pdbFile)
{
List<ChimeraModel> foundModels = chimeraMaps.get(pdbFile);
if (foundModels != null && !foundModels.isEmpty())
{
- return foundModels.get(0).getModelNumber();
+ return String.valueOf(foundModels.get(0).getModelNumber());
}
- return -1;
+ return "";
}
/**
}
/**
- * Returns the file extension to use for a saved viewer session file
+ * Returns the file extension to use for a saved viewer session file (.py)
*
* @return
*/
+ @Override
public String getSessionFileExtension()
{
- return ".py";
+ return CHIMERA_SESSION_EXTENSION;
}
public String getHelpURL()