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.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.ColorUtils;
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;
// 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<>();
-
- private Hashtable<String, String> chainFile = new Hashtable<>();
-
/*
* Object through which we talk to Chimera
*/
int modelNumber = chimeraMaps.size() + 1;
String command = "setattr #" + modelNumber + " models name "
+ pe.getId();
- sendChimeraCommand(command, false);
+ executeCommand(command, false);
modelsToMap.add(new ChimeraModel(pe.getId(), ModelType.PDB_MODEL,
modelNumber, 0));
}
chimeraManager = new ChimeraManager(new StructureManager(true));
String viewerType = Cache.getProperty(Preferences.STRUCTURE_DISPLAY);
chimeraManager.setChimeraX(ViewerType.CHIMERAX.name().equals(viewerType));
-
+ setStructureCommands(new ChimeraCommands());
}
/**
}
/**
- * 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;
- }
-
- /*
- * 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);
- }
-
- /**
* Close down the Jalview viewer and listener, and (optionally) the associated
* Chimera window.
*/
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 = chimeraManager.isChimeraX()
- ? "color white;color :ASP,GLU red;color :LYS,ARG blue;color :CYS yellow"
- : "color white;color red ::ASP;color red ::GLU;color blue ::LYS;color blue ::ARG;color yellow ::CYS";
- sendAsynchronousCommand(command, COLOURING_CHIMERA);
- }
-
/**
* {@inheritDoc}
*/
}
// allComs.append("; ~display all; chain @CA|P; ribbon ")
// .append(selectioncom.toString()).append("; focus");
- List<String> chimeraReplies = sendChimeraCommand(allComs.toString(),
+ List<String> chimeraReplies = executeCommand(allComs.toString(),
true);
for (String reply : chimeraReplies)
{
* @param command
* @param getResponse
*/
- public List<String> sendChimeraCommand(final String command,
+ @Override
+ public List<String> executeCommand(final String command,
boolean getResponse)
{
- if (chimeraManager == null)
+ if (chimeraManager == null || command == null)
{
// ? thread running after viewer shut down
return null;
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, chimeraManager.isChimeraX());
- }
-
- /**
* @param command
*/
protected void executeWhenReady(String command)
{
waitForChimera();
- sendChimeraCommand(command, false);
+ executeCommand(command, false);
waitForChimera();
}
return loadNotifiesHandled;
}
- @Override
- public void setJalviewColourScheme(ColourSchemeI cs)
- {
- colourBySequence = false;
-
- if (cs == null)
- {
- return;
- }
-
- viewerCommandHistory(false);
- StringBuilder command = new StringBuilder(128);
-
- List<String> residueSet = ResidueProperties.getResidues(isNucleotide(),
- false);
-
- /*
- * concatenate colour commands, one per residue symbol
- * Chimera format: color colorCode ::VAL
- * ChimeraX format: color :VAL colourCode
- */
- boolean chimeraX = chimeraManager.isChimeraX();
- 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 ");
- String colorSpec = ColorUtils.toTkCode(col);
- if (chimeraX)
- {
- command.append(":").append(resName).append(" ").append(colorSpec);
- }
- else
- {
- command.append(colorSpec).append(" ::").append(resName);
- }
- command.append(";");
- }
-
- 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);
- String command = "set bgColor " + ColorUtils.toTkCode(col);
- chimeraManager.sendChimeraCommand(command, false);
- viewerCommandHistory(true);
- }
-
- /**
* Ask Chimera to save its session to the given file. Returns true if
* successful, else false.
*
* 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
*/
- sendChimeraCommand("open " + filepath, true);
+ 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(chimeraManager.isChimeraX() ? "view" : "focus", false);
- }
-
- /**
* Send a 'show' command for all atoms in the currently selected columns
*
* TODO: pull up to abstract structure viewer interface
// 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)
return CHIMERA_FEATURE_GROUP;
}
- public Hashtable<String, String> getChainFile()
- {
- return chainFile;
- }
-
- public List<ChimeraModel> getChimeraModelByChain(String chain)
- {
- return chimeraMaps.get(chainFile.get(chain));
- }
-
- public int getModelNoForChain(String chain)
+ @Override
+ public int getModelNoForFile(String pdbFile)
{
- List<ChimeraModel> foundModels = getChimeraModelByChain(chain);
+ List<ChimeraModel> foundModels = chimeraMaps.get(pdbFile);
if (foundModels != null && !foundModels.isEmpty())
{
return foundModels.get(0).getModelNumber();