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
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
try
{
chimeraListener = new ChimeraListener(this);
- chimeraManager.startListening(chimeraListener.getUri());
+ startListening(chimeraListener.getUri());
} catch (BindException e)
{
System.err.println(
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;
}
/*
* 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
}
/**
- * 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
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);
{
boolean featureAdded = false;
String featureGroup = getViewerFeatureGroup();
- boolean chimeraX = chimeraManager.isChimeraX();
for (String residue : residues)
{
try
{
- spec = AtomSpec.fromChimeraAtomspec(atomSpec, chimeraX);
+ spec = parseAtomSpec(atomSpec);
} catch (IllegalArgumentException e)
{
System.err.println("Problem parsing atomspec " + atomSpec);