*/
package jalview.ext.rbvi.chimera;
+import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
-import jalview.api.SequenceRenderer;
import jalview.api.structures.JalviewStructureDisplayI;
import jalview.bin.Cache;
import jalview.datamodel.AlignmentI;
private static final String ALPHACARBON = "CA";
- private List<String> chainNames = new ArrayList<String>();
+ private List<String> chainNames = new ArrayList<>();
+
+ private Hashtable<String, String> chainFile = new Hashtable<>();
- private Hashtable<String, String> chainFile = new Hashtable<String, String>();
-
/*
* Object through which we talk to Chimera
*/
/*
* 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;
String file = pe.getFile();
try
{
- List<ChimeraModel> modelsToMap = new ArrayList<ChimeraModel>();
+ List<ChimeraModel> modelsToMap = new ArrayList<>();
List<ChimeraModel> oldList = viewer.getModelList();
boolean alreadyOpen = false;
* @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));
viewer.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);
}
/**
* @see
* https://www.cgl.ucsf.edu/chimera/docs/UsersGuide/midas/match.html
*/
- command.append("match ").append(getModelSpec(pdbfnum)).append(":");
+ command.append("match ").append(getModelSpec(pdbfnum))
+ .append(":");
command.append(selcom[pdbfnum]);
command.append("@").append(
structures[pdbfnum].isRna ? PHOSPHORUS : ALPHACARBON);
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; chain @CA|P; ribbon ")
- .append(selectioncom.toString())
+ allComs/*.append("~display all; chain @CA|P; ribbon ")
+ .append(selectioncom.toString())*/
.append(";" + command.toString());
}
}
{
System.out.println("Select regions:\n" + selectioncom.toString());
}
- allComs.append("; ~display all; chain @CA|P; ribbon ")
- .append(selectioncom.toString()).append("; focus");
+ allComs.append("; ~display "); // all");
+ if (!isShowAlignmentOnly())
+ {
+ allComs.append("; ribbon; chain @CA|P");
+ }
+ else
+ {
+ allComs.append("; ~ribbon");
+ }
+ allComs.append("; ribbon ").append(selectioncom.toString())
+ .append("; focus");
List<String> chimeraReplies = sendChimeraCommand(allComs.toString(),
true);
for (String reply : chimeraReplies)
{
- if (reply.toLowerCase().contains("unequal numbers of atoms"))
+ String lowerCase = reply.toLowerCase();
+ if (lowerCase.contains("unequal numbers of atoms")
+ || lowerCase.contains("at least"))
{
error = reply;
}
* @param pdbfnum
* @return
*/
- protected String getModelSpec(int pdbfnum)
+ @Override
+ public String getModelSpec(int pdbfnum)
{
if (pdbfnum < 0 || pdbfnum >= getPdbCount())
{
*/
List<ChimeraModel> maps = chimeraMaps.get(getStructureFiles()[pdbfnum]);
boolean hasSubModels = maps != null && maps.size() > 1;
- return "#" + String.valueOf(pdbfnum) + (hasSubModels ? ".1" : "");
+ String spec = "#" + String.valueOf(pdbfnum);
+ return hasSubModels ? spec + ".1" : spec;
}
/**
return true;
}
- boolean launched = viewer.launchChimera(StructureManager
- .getChimeraPaths());
+ boolean launched = viewer
+ .launchChimera(StructureManager.getChimeraPaths());
if (launched)
{
startChimeraProcessMonitor();
/**
* Sends a set of colour commands to the structure viewer
*
- * @param colourBySequenceCommands
+ * @param commands
*/
@Override
- protected void colourBySequence(
- StructureMappingcommandSet[] colourBySequenceCommands)
+ protected void colourBySequence(String[] commands)
{
- for (StructureMappingcommandSet cpdbbyseq : colourBySequenceCommands)
+ for (String command : commands)
{
- for (String command : cpdbbyseq.commands)
- {
- sendAsynchronousCommand(command, COLOURING_CHIMERA);
- }
+ sendAsynchronousCommand(command, COLOURING_CHIMERA);
}
}
/**
+ * Computes and returns a set of commands to colour residues in Chimera the same
+ * as mapped residues in the alignment
+ *
* @param files
- * @param sr
* @param viewPanel
* @return
*/
@Override
- protected StructureMappingcommandSet[] getColourBySequenceCommands(
- String[] files, SequenceRenderer sr, AlignmentViewPanel viewPanel)
+ protected String[] getColourBySequenceCommands(
+ String[] files, AlignmentViewPanel viewPanel)
{
- return ChimeraCommands.getColourBySequenceCommand(getSsm(), files,
- getSequence(), sr, viewPanel);
+ Map<Object, AtomSpecModel> colourMap = buildColoursMap(viewPanel);
+
+ return ChimeraCommands.getColourBySequenceCommand(colourMap, this);
}
/**
*/
private int _modelFileNameMap[];
-
// ////////////////////////////////
// /StructureListener
@Override
return new String[0];
}
- return chimeraMaps.keySet().toArray(
- modelFileNames = new String[chimeraMaps.size()]);
+ return chimeraMaps.keySet()
+ .toArray(modelFileNames = new String[chimeraMaps.size()]);
}
/**
* 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>();
+ List<AtomSpec> atomSpecs = new ArrayList<>();
for (String atomSpec : structureSelection)
{
try
return;
}
- // Chimera expects RBG values in the range 0-1
+ // Chimera expects RGB values in the range 0-1
final double normalise = 255D;
viewerCommandHistory(false);
StringBuilder command = new StringBuilder(128);
false);
for (String resName : residueSet)
{
- char res = resName.length() == 3 ? ResidueProperties
- .getSingleCharacterCode(resName) : resName.charAt(0);
+ 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 + ";");
+ command.append("color ")
+ .append(String.valueOf(col.getRed() / normalise)).append(",")
+ .append(String.valueOf(col.getGreen() / normalise))
+ .append(",").append(String.valueOf(col.getBlue() / normalise))
+ .append(" ::").append(resName).append(";");
}
sendAsynchronousCommand(command.toString(), COLOURING_CHIMERA);
/**
* Send the Chimera 'background solid <color>" command.
*
- * @see https
+ * @see https
* ://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/background
* .html
* @param col
viewerCommandHistory(false);
double normalise = 255D;
final String command = "background solid " + col.getRed() / normalise
- + "," + col.getGreen() / normalise + "," + col.getBlue()
- / normalise + ";";
+ + "," + col.getGreen() / normalise + ","
+ + col.getBlue() / normalise + ";";
viewer.sendChimeraCommand(command, false);
viewerCommandHistory(true);
}
}
StructureMappingcommandSet commandSet = ChimeraCommands
- .getSetAttributeCommandsForFeatures(getSsm(), files,
- getSequence(), avp);
+ .getSetAttributeCommandsForFeatures(avp, this);
String[] commands = commandSet.commands;
if (commands.length > 10)
{
sendAsynchronousCommand("open cmd:" + path, 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());
}
}
return CHIMERA_FEATURE_GROUP;
}
-
public Hashtable<String, String> getChainFile()
{
return chainFile;
}
return -1;
}
+
+ @Override
+ public void showStructures(AlignViewportI av, boolean refocus)
+ {
+ StringBuilder cmd = new StringBuilder(128);
+ cmd.append("~display; ~ribbon;");
+
+ AtomSpecModel model = getShownResidues(av);
+ String atomSpec = ChimeraCommands.getAtomSpec(model, this);
+
+ cmd.append("ribbon ").append(atomSpec);
+ if (!isShowAlignmentOnly())
+ {
+ cmd.append("chain @CA|P; ribbon");
+ }
+ if (refocus)
+ {
+ cmd.append("; focus");
+ }
+ sendChimeraCommand(cmd.toString(), false);
+ }
}