package jalview.ext.rbvi.chimera;
import jalview.api.AlignmentViewPanel;
-import jalview.api.SequenceRenderer;
import jalview.api.structures.JalviewStructureDisplayI;
import jalview.bin.Cache;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.SearchResultsI;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
+import jalview.gui.Preferences;
+import jalview.gui.StructureViewer.ViewerType;
import jalview.httpserver.AbstractRequestHandler;
import jalview.io.DataSourceType;
-import jalview.schemes.ColourSchemeI;
-import jalview.schemes.ResidueProperties;
import jalview.structure.AtomSpec;
import jalview.structure.StructureMappingcommandSet;
import jalview.structure.StructureSelectionManager;
import jalview.structures.models.AAStructureBindingModel;
import jalview.util.MessageManager;
-import java.awt.Color;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collections;
-import java.util.Hashtable;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
// Chimera clause to exclude alternate locations in atom selection
private static final String NO_ALTLOCS = "&~@.B-Z&~@.2-9";
- private static final String COLOURING_CHIMERA = MessageManager
- .getString("status.colouring_chimera");
-
private static final boolean debug = false;
private static final String PHOSPHORUS = "P";
private static final String ALPHACARBON = "CA";
- private List<String> chainNames = new ArrayList<String>();
-
- private Hashtable<String, String> chainFile = new Hashtable<String, String>();
-
/*
* Object through which we talk to Chimera
*/
- private ChimeraManager viewer;
+ private ChimeraManager chimeraManager;
/*
* Object which listens to Chimera notifications
/*
* Map of ChimeraModel objects keyed by PDB full local file name
*/
- private Map<String, List<ChimeraModel>> chimeraMaps = new LinkedHashMap<String, List<ChimeraModel>>();
+ private Map<String, List<ChimeraModel>> chimeraMaps = new LinkedHashMap<>();
String lastHighlightCommand;
/**
* 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 it. This is the case if Chimera has opened a saved session file.
+ * We check if the PDB model id is already loaded in Chimera, if so don't reopen
+ * it. This is the case if Chimera has opened a saved session file.
*
* @param pe
* @return
String file = pe.getFile();
try
{
- List<ChimeraModel> modelsToMap = new ArrayList<ChimeraModel>();
- List<ChimeraModel> oldList = viewer.getModelList();
+ List<ChimeraModel> modelsToMap = new ArrayList<>();
+ List<ChimeraModel> oldList = chimeraManager.getModelList();
boolean alreadyOpen = false;
/*
*/
if (!alreadyOpen)
{
- viewer.openModel(file, pe.getId(), ModelType.PDB_MODEL);
- List<ChimeraModel> newList = viewer.getModelList();
- // JAL-1728 newList.removeAll(oldList) does not work
- for (ChimeraModel cm : newList)
+ chimeraManager.openModel(file, pe.getId(), ModelType.PDB_MODEL);
+ if (chimeraManager.isChimeraX())
+ {
+ /*
+ * ChimeraX hack: force chimera model name to pdbId
+ */
+ int modelNumber = chimeraMaps.size() + 1;
+ String command = "setattr #" + modelNumber + " models name "
+ + pe.getId();
+ executeCommand(command, false);
+ modelsToMap.add(new ChimeraModel(pe.getId(), ModelType.PDB_MODEL,
+ modelNumber, 0));
+ }
+ else
{
- if (cm.getModelName().equals(pe.getId()))
+ /*
+ * Chimera: query for actual models and find the one with
+ * matching model name - set in viewer.openModel()
+ */
+ List<ChimeraModel> newList = chimeraManager.getModelList();
+ // JAL-1728 newList.removeAll(oldList) does not work
+ for (ChimeraModel cm : newList)
{
- modelsToMap.add(cm);
+ if (cm.getModelName().equals(pe.getId()))
+ {
+ modelsToMap.add(cm);
+ }
}
}
}
* @param protocol
*/
public JalviewChimeraBinding(StructureSelectionManager ssm,
- PDBEntry[] pdbentry, SequenceI[][] sequenceIs, DataSourceType protocol)
+ PDBEntry[] pdbentry, SequenceI[][] sequenceIs,
+ DataSourceType protocol)
{
super(ssm, pdbentry, sequenceIs, protocol);
- viewer = new ChimeraManager(new StructureManager(true));
+ chimeraManager = new ChimeraManager(new StructureManager(true));
+ String viewerType = Cache.getProperty(Preferences.STRUCTURE_DISPLAY);
+ chimeraManager.setChimeraX(ViewerType.CHIMERAX.name().equals(viewerType));
+ setStructureCommands(new ChimeraCommands());
}
/**
- * Starts a thread that waits for the Chimera process to finish, so that we
- * can then close the associated resources. This avoids leaving orphaned
- * Chimera viewer panels in Jalview if the user closes Chimera.
+ * Starts a thread that waits for the Chimera process to finish, so that we can
+ * then close the associated resources. This avoids leaving orphaned Chimera
+ * viewer panels in Jalview if the user closes Chimera.
*/
protected void startChimeraProcessMonitor()
{
- final Process p = viewer.getChimeraProcess();
+ final Process p = chimeraManager.getChimeraProcess();
chimeraMonitor = new Thread(new Runnable()
{
}
/**
- * Start a dedicated HttpServer to listen for Chimera notifications, and tell
- * it to start listening
+ * Start a dedicated HttpServer to listen for Chimera notifications, and tell it
+ * to start listening
*/
public void startChimeraListener()
{
try
{
chimeraListener = new ChimeraListener(this);
- viewer.startListening(chimeraListener.getUri());
+ chimeraManager.startListening(chimeraListener.getUri());
} catch (BindException e)
{
- System.err.println("Failed to start Chimera listener: "
- + e.getMessage());
- }
- }
-
- /**
- * Tells Chimera to display only the specified chains
- *
- * @param toshow
- */
- public void showChains(List<String> toshow)
- {
- /*
- * Construct a chimera command like
- *
- * ~display #*;~ribbon #*;ribbon :.A,:.B
- */
- StringBuilder cmd = new StringBuilder(64);
- boolean first = true;
- for (String chain : toshow)
- {
- int modelNumber = getModelNoForChain(chain);
- String showChainCmd = modelNumber == -1 ? "" : modelNumber + ":."
- + chain.split(":")[1];
- if (!first)
- {
- cmd.append(",");
- }
- cmd.append(showChainCmd);
- first = false;
+ System.err.println(
+ "Failed to start Chimera listener: " + e.getMessage());
}
-
- /*
- * could append ";focus" to this command to resize the display to fill the
- * window, but it looks more helpful not to (easier to relate chains to the
- * whole)
- */
- final String command = "~display #*; ~ribbon #*; ribbon :"
- + cmd.toString();
- sendChimeraCommand(command, false);
}
/**
*/
public void closeViewer(boolean closeChimera)
{
- getSsm().removeStructureViewerListener(this, this.getPdbFile());
+ getSsm().removeStructureViewerListener(this, this.getStructureFiles());
if (closeChimera)
{
- viewer.exitChimera();
+ chimeraManager.exitChimera();
}
if (this.chimeraListener != null)
{
chimeraListener.shutdown();
chimeraListener = null;
}
- viewer = null;
+ chimeraManager = null;
if (chimeraMonitor != null)
{
releaseUIResources();
}
- @Override
- public void colourByChain()
- {
- colourBySequence = false;
- sendAsynchronousCommand("rainbow chain", COLOURING_CHIMERA);
- }
-
- /**
- * Constructs and sends a Chimera command to colour by charge
- * <ul>
- * <li>Aspartic acid and Glutamic acid (negative charge) red</li>
- * <li>Lysine and Arginine (positive charge) blue</li>
- * <li>Cysteine - yellow</li>
- * <li>all others - white</li>
- * </ul>
- */
- @Override
- public void colourByCharge()
- {
- colourBySequence = false;
- String command = "color white;color red ::ASP;color red ::GLU;color blue ::LYS;color blue ::ARG;color yellow ::CYS";
- sendAsynchronousCommand(command, COLOURING_CHIMERA);
- }
-
/**
* {@inheritDoc}
*/
int[] _refStructure, HiddenColumns[] _hiddenCols)
{
StringBuilder allComs = new StringBuilder(128);
- String[] files = getPdbFile();
+ String[] files = getStructureFiles();
if (!waitForFileLoad(files))
{
refreshPdbEntries();
StringBuilder selectioncom = new StringBuilder(256);
+ boolean chimeraX = chimeraManager.isChimeraX();
for (int a = 0; a < _alignment.length; a++)
{
int refStructure = _refStructure[a];
String[] selcom = new String[files.length];
for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)
{
+ final int modelNo = pdbfnum + (chimeraX ? 1 : 0);
+ // todo correct resolution to model number
String chainCd = "." + structures[pdbfnum].chain;
int lpos = -1;
boolean run = false;
StringBuilder molsel = new StringBuilder();
+ if (chimeraX)
+ {
+ molsel.append("/" + structures[pdbfnum].chain + ":");
+ }
int nextColumnMatch = matched.nextSetBit(0);
while (nextColumnMatch != -1)
if (lpos != -1)
{
molsel.append(String.valueOf(lpos));
- molsel.append(chainCd);
+ if (!chimeraX)
+ {
+ molsel.append(chainCd);
+ }
molsel.append(",");
}
run = false;
if (lpos != -1)
{
molsel.append(String.valueOf(lpos));
- molsel.append(chainCd);
+ if (!chimeraX)
+ {
+ molsel.append(chainCd);
+ }
}
if (molsel.length() > 1)
{
selcom[pdbfnum] = molsel.toString();
- selectioncom.append("#").append(String.valueOf(pdbfnum))
- .append(":");
+ selectioncom.append("#").append(String.valueOf(modelNo));
+ if (!chimeraX)
+ {
+ selectioncom.append(":");
+ }
selectioncom.append(selcom[pdbfnum]);
- selectioncom.append(" ");
+ // selectioncom.append(" ");
if (pdbfnum < files.length - 1)
{
- selectioncom.append("| ");
+ selectioncom.append("|");
}
}
else
StringBuilder command = new StringBuilder(256);
for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)
{
+ final int modelNo = pdbfnum + (chimeraX ? 1 : 0);
if (pdbfnum == refStructure || selcom[pdbfnum] == null
|| selcom[refStructure] == null)
{
* @see
* https://www.cgl.ucsf.edu/chimera/docs/UsersGuide/midas/match.html
*/
- command.append("match ").append(getModelSpec(pdbfnum)).append(":");
+ command.append(chimeraX ? "align " : "match ");
+ command.append(getModelSpec(modelNo));
+ if (!chimeraX)
+ {
+ command.append(":");
+ }
command.append(selcom[pdbfnum]);
command.append("@").append(
structures[pdbfnum].isRna ? PHOSPHORUS : ALPHACARBON);
- // JAL-1757 exclude alternate CA locations
- command.append(NO_ALTLOCS);
- command.append(" ").append(getModelSpec(refStructure)).append(":");
+ // JAL-1757 exclude alternate CA locations - ChimeraX syntax tbd
+ if (!chimeraX)
+ {
+ command.append(NO_ALTLOCS);
+ }
+ command.append(chimeraX ? " toAtoms " : " ")
+ .append(getModelSpec(refStructure + (chimeraX ? 1 : 0)));
+ if (!chimeraX)
+ {
+ command.append(":");
+ }
command.append(selcom[refStructure]);
command.append("@").append(
structures[refStructure].isRna ? PHOSPHORUS : ALPHACARBON);
- command.append(NO_ALTLOCS);
+ if (!chimeraX)
+ {
+ command.append(NO_ALTLOCS);
+ }
}
if (selectioncom.length() > 0)
{
if (debug)
{
System.out.println("Select regions:\n" + selectioncom.toString());
- System.out.println("Superimpose command(s):\n"
- + command.toString());
+ System.out.println(
+ "Superimpose command(s):\n" + command.toString());
+ }
+ // allComs.append("~display all; ");
+ // if (chimeraX)
+ // {
+ // allComs.append("show ").append(selectioncom.toString())
+ // .append(" pbonds");
+ // }
+ // else
+ // {
+ // allComs.append("chain @CA|P; ribbon ");
+ // allComs.append(selectioncom.toString());
+ // }
+ if (allComs.length() > 0) {
+ allComs.append(";");
}
- allComs.append("~display all; chain @CA|P; ribbon ")
- .append(selectioncom.toString())
- .append(";" + command.toString());
+ allComs.append(command.toString());
}
}
{
System.out.println("Select regions:\n" + selectioncom.toString());
}
- allComs.append("; ~display all; chain @CA|P; ribbon ")
- .append(selectioncom.toString()).append("; focus");
- List<String> chimeraReplies = sendChimeraCommand(allComs.toString(),
+ allComs.append(";~display all; ");
+ if (chimeraX)
+ {
+ allComs.append("show @CA|P pbonds; show ")
+ .append(selectioncom.toString()).append(" ribbons; view");
+ }
+ else
+ {
+ allComs.append("chain @CA|P; ribbon ; focus");
+ allComs.append(selectioncom.toString());
+ }
+ // allComs.append("; ~display all; chain @CA|P; ribbon ")
+ // .append(selectioncom.toString()).append("; focus");
+ List<String> chimeraReplies = executeCommand(allComs.toString(),
true);
for (String reply : chimeraReplies)
{
{
if (pdbfnum < 0 || pdbfnum >= getPdbCount())
{
- return "";
+ return "#" + pdbfnum; // temp hack for ChimeraX
}
/*
* to the Chimera command 'list models type molecule', see
* ChimeraManager.getModelList().
*/
- List<ChimeraModel> maps = chimeraMaps.get(getPdbFile()[pdbfnum]);
+ List<ChimeraModel> maps = chimeraMaps.get(getStructureFiles()[pdbfnum]);
boolean hasSubModels = maps != null && maps.size() > 1;
return "#" + String.valueOf(pdbfnum) + (hasSubModels ? ".1" : "");
}
*/
public boolean launchChimera()
{
- if (viewer.isChimeraLaunched())
+ if (chimeraManager.isChimeraLaunched())
{
return true;
}
- boolean launched = viewer.launchChimera(StructureManager
- .getChimeraPaths());
+ boolean launched = chimeraManager.launchChimera(
+ StructureManager.getChimeraPaths(chimeraManager.isChimeraX()));
if (launched)
{
startChimeraProcessMonitor();
*/
public boolean isChimeraRunning()
{
- return viewer.isChimeraLaunched();
+ return chimeraManager.isChimeraLaunched();
}
/**
* @param command
* @param getResponse
*/
- public List<String> sendChimeraCommand(final String command,
+ @Override
+ public List<String> executeCommand(final String command,
boolean getResponse)
{
- if (viewer == null)
+ if (chimeraManager == null || command == null)
{
// ? thread running after viewer shut down
return null;
if (true /*lastCommand == null || !lastCommand.equals(command)*/)
{
// trim command or it may never find a match in the replyLog!!
- List<String> lastReply = viewer.sendChimeraCommand(command.trim(),
+ List<String> lastReply = chimeraManager.sendChimeraCommand(command.trim(),
getResponse);
if (getResponse)
{
String progressMsg);
/**
- * Sends a set of colour commands to the structure viewer
- *
- * @param colourBySequenceCommands
- */
- @Override
- protected void colourBySequence(
- StructureMappingcommandSet[] colourBySequenceCommands)
- {
- for (StructureMappingcommandSet cpdbbyseq : colourBySequenceCommands)
- {
- for (String command : cpdbbyseq.commands)
- {
- sendAsynchronousCommand(command, COLOURING_CHIMERA);
- }
- }
- }
-
- /**
- * @param files
- * @param sr
- * @param viewPanel
- * @return
- */
- @Override
- protected StructureMappingcommandSet[] getColourBySequenceCommands(
- String[] files, SequenceRenderer sr, AlignmentViewPanel viewPanel)
- {
- return ChimeraCommands.getColourBySequenceCommand(getSsm(), files,
- getSequence(), sr, viewPanel);
- }
-
- /**
* @param command
*/
protected void executeWhenReady(String command)
{
waitForChimera();
- sendChimeraCommand(command, false);
+ executeCommand(command, false);
waitForChimera();
}
private void waitForChimera()
{
- while (viewer != null && viewer.isBusy())
+ while (chimeraManager != null && chimeraManager.isBusy())
{
try
{
*/
private int _modelFileNameMap[];
-
// ////////////////////////////////
// /StructureListener
@Override
- public synchronized String[] getPdbFile()
+ public synchronized String[] getStructureFiles()
{
- if (viewer == null)
+ if (chimeraManager == null)
{
return new String[0];
}
- return chimeraMaps.keySet().toArray(
- modelFileNames = new String[chimeraMaps.size()]);
+ return chimeraMaps.keySet()
+ .toArray(modelFileNames = new String[chimeraMaps.size()]);
}
/**
- * Construct and send a command to highlight zero, one or more atoms. We do
- * this by sending an "rlabel" command to show the residue label at that
- * position.
+ * Construct and send a command to highlight zero, one or more atoms. We do this
+ * by sending an "rlabel" command to show the residue label at that position.
*/
@Override
public void highlightAtoms(List<AtomSpec> atoms)
return;
}
+ boolean forChimeraX = chimeraManager.isChimeraX();
StringBuilder cmd = new StringBuilder(128);
boolean first = true;
boolean found = false;
{
if (first)
{
- cmd.append("rlabel #").append(cms.get(0).getModelNumber())
- .append(":");
+ cmd.append(forChimeraX ? "label #" : "rlabel #");
}
else
{
cmd.append(",");
}
first = false;
- cmd.append(pdbResNum);
- if (!chain.equals(" "))
+ if (forChimeraX)
{
- cmd.append(".").append(chain);
+ cmd.append(cms.get(0).getModelNumber())
+ .append("/").append(chain).append(":").append(pdbResNum);
+ }
+ else
+ {
+ cmd.append(cms.get(0).getModelNumber())
+ .append(":").append(pdbResNum);
+ if (!chain.equals(" ") && !forChimeraX)
+ {
+ cmd.append(".").append(chain);
+ }
}
found = true;
}
*/
if (lastHighlightCommand != null)
{
- viewer.sendChimeraCommand("~" + lastHighlightCommand, false);
+ chimeraManager.sendChimeraCommand("~" + lastHighlightCommand, false);
}
if (found)
{
- viewer.sendChimeraCommand(command, false);
+ chimeraManager.sendChimeraCommand(command, false);
}
this.lastHighlightCommand = command;
}
/*
* Ask Chimera for its current selection
*/
- List<String> selection = viewer.getSelectedResidueSpecs();
+ List<String> selection = chimeraManager.getSelectedResidueSpecs();
/*
* 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);
+ List<AtomSpec> atomSpecs = convertStructureResiduesToAlignment(
+ selection);
/*
* Broadcast the selection (which may be empty, if the user just cleared all
protected List<AtomSpec> convertStructureResiduesToAlignment(
List<String> structureSelection)
{
- List<AtomSpec> atomSpecs = new ArrayList<AtomSpec>();
+ boolean chimeraX = chimeraManager.isChimeraX();
+ List<AtomSpec> atomSpecs = new ArrayList<>();
for (String atomSpec : structureSelection)
{
try
{
- AtomSpec spec = AtomSpec.fromChimeraAtomspec(atomSpec);
+ AtomSpec spec = AtomSpec.fromChimeraAtomspec(atomSpec, chimeraX);
String pdbfilename = getPdbFileForModel(spec.getModelNumber());
spec.setPdbFile(pdbfilename);
atomSpecs.add(spec);
return loadNotifiesHandled;
}
- @Override
- public void setJalviewColourScheme(ColourSchemeI cs)
- {
- colourBySequence = false;
-
- if (cs == null)
- {
- return;
- }
-
- // Chimera expects RBG values in the range 0-1
- final double normalise = 255D;
- viewerCommandHistory(false);
- StringBuilder command = new StringBuilder(128);
-
- List<String> residueSet = ResidueProperties.getResidues(isNucleotide(),
- false);
- for (String resName : residueSet)
- {
- char res = resName.length() == 3 ? ResidueProperties
- .getSingleCharacterCode(resName) : resName.charAt(0);
- Color col = cs.findColour(res, 0, null, null, 0f);
- command.append("color " + col.getRed() / normalise + ","
- + col.getGreen() / normalise + "," + col.getBlue()
- / normalise + " ::" + resName + ";");
- }
-
- sendAsynchronousCommand(command.toString(), COLOURING_CHIMERA);
- viewerCommandHistory(true);
- }
-
/**
* called when the binding thinks the UI needs to be refreshed after a Chimera
* state change. this could be because structures were loaded, or because an
}
/**
- * Send the Chimera 'background solid <color>" command.
- *
- * @see https
- * ://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/background
- * .html
- * @param col
- */
- @Override
- public void setBackgroundColour(Color col)
- {
- viewerCommandHistory(false);
- double normalise = 255D;
- final String command = "background solid " + col.getRed() / normalise
- + "," + col.getGreen() / normalise + "," + col.getBlue()
- / normalise + ";";
- viewer.sendChimeraCommand(command, false);
- viewerCommandHistory(true);
- }
-
- /**
* Ask Chimera to save its session to the given file. Returns true if
* successful, else false.
*
{
if (isChimeraRunning())
{
- List<String> reply = viewer.sendChimeraCommand("save " + filepath,
+ /*
+ * 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 = isChimeraX() ? "save session " : "save ";
+ List<String> reply = chimeraManager.sendChimeraCommand(command + filepath,
true);
if (reply.contains("Session written"))
{
/**
* Ask Chimera to open a session file. Returns true if successful, else false.
- * The filename must have a .py extension for this command to work.
+ * The filename must have a .py (Chimera) or .cxs (ChimeraX) extension for
+ * this command to work.
*
* @param filepath
* @return
*/
public boolean openSession(String filepath)
{
- sendChimeraCommand("open " + filepath, true);
+ /*
+ * 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);
// todo: test for failure - how?
return true;
}
/**
- * Returns a list of chains mapped in this viewer. Note this list is not
- * currently scoped per structure.
- *
- * @return
- */
- @Override
- public List<String> getChainNames()
- {
- return chainNames;
- }
-
- /**
- * Send a 'focus' command to Chimera to recentre the visible display
- */
- public void focusView()
- {
- sendChimeraCommand("focus", false);
- }
-
- /**
* Send a 'show' command for all atoms in the currently selected columns
*
* TODO: pull up to abstract structure viewer interface
// TODO refactor as required to pull up to an interface
AlignmentI alignment = avp.getAlignment();
- String[] files = getPdbFile();
+ String[] files = getStructureFiles();
if (files == null)
{
return 0;
StructureMappingcommandSet commandSet = ChimeraCommands
.getSetAttributeCommandsForFeatures(getSsm(), files,
- getSequence(), avp);
+ getSequence(), avp, chimeraManager.isChimeraX());
String[] commands = commandSet.commands;
if (commands.length > 10)
{
}
/**
- * Write commands to a temporary file, and send a command to Chimera to open
- * the file as a commands script. For use when sending a large number of
- * separate commands would overload the REST interface mechanism.
+ * Write commands to a temporary file, and send a command to Chimera to open the
+ * file as a commands script. For use when sending a large number of separate
+ * commands would overload the REST interface mechanism.
*
* @param commands
*/
protected void sendCommandsByFile(String[] commands)
{
+ boolean toChimeraX = chimeraManager.isChimeraX();
try
{
- File tmp = File.createTempFile("chim", ".com");
+ File tmp = File.createTempFile("chim", toChimeraX ? ".cxc" : ".com");
tmp.deleteOnExit();
PrintWriter out = new PrintWriter(new FileOutputStream(tmp));
for (String command : commands)
out.flush();
out.close();
String path = tmp.getAbsolutePath();
- sendAsynchronousCommand("open cmd:" + path, null);
+ String command = "open " + (toChimeraX ? "" : "cmd:") + path;
+ sendAsynchronousCommand(command, null);
} catch (IOException e)
{
- System.err
- .println("Sending commands to Chimera via file failed with "
- + e.getMessage());
+ System.err.println("Sending commands to Chimera via file failed with "
+ + e.getMessage());
}
}
// fails for 'average.bfactor' (which is bad):
String cmd = "list residues attr '" + attName + "'";
- List<String> residues = sendChimeraCommand(cmd, true);
+ List<String> residues = executeCommand(cmd, true);
boolean featureAdded = createFeaturesForAttributes(attName, residues);
if (featureAdded)
{
boolean featureAdded = false;
String featureGroup = getViewerFeatureGroup();
+ boolean chimeraX = chimeraManager.isChimeraX();
for (String residue : residues)
{
try
{
- spec = AtomSpec.fromChimeraAtomspec(atomSpec);
+ spec = AtomSpec.fromChimeraAtomspec(atomSpec, chimeraX);
} catch (IllegalArgumentException e)
{
System.err.println("Problem parsing atomspec " + atomSpec);
return CHIMERA_FEATURE_GROUP;
}
-
- public Hashtable<String, String> getChainFile()
+ @Override
+ public int getModelNoForFile(String pdbFile)
{
- return chainFile;
+ List<ChimeraModel> foundModels = chimeraMaps.get(pdbFile);
+ if (foundModels != null && !foundModels.isEmpty())
+ {
+ return foundModels.get(0).getModelNumber();
+ }
+ return -1;
}
- public List<ChimeraModel> getChimeraModelByChain(String chain)
+ /**
+ * Answers a (possibly empty) list of attribute names in Chimera[X], excluding
+ * any which were added from Jalview
+ *
+ * @return
+ */
+ public List<String> getChimeraAttributes()
{
- return chimeraMaps.get(chainFile.get(chain));
+ List<String> atts = chimeraManager.getAttrList();
+ Iterator<String> it = atts.iterator();
+ while (it.hasNext())
+ {
+ if (it.next().startsWith(ChimeraCommands.NAMESPACE_PREFIX))
+ {
+ /*
+ * attribute added from Jalview - exclude it
+ */
+ it.remove();
+ }
+ }
+ return atts;
}
- public int getModelNoForChain(String chain)
+ public boolean isChimeraX()
{
- List<ChimeraModel> foundModels = getChimeraModelByChain(chain);
- if (foundModels != null && !foundModels.isEmpty())
- {
- return foundModels.get(0).getModelNumber();
- }
- return -1;
+ return chimeraManager.isChimeraX();
}
}