import jalview.api.AlignmentViewPanel;
import jalview.api.FeatureRenderer;
import jalview.api.SequenceRenderer;
-import jalview.api.SequenceStructureBinding;
-import jalview.api.StructureSelectionManagerProvider;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.ColumnSelection;
import jalview.datamodel.PDBEntry;
import jalview.io.AppletFormatAdapter;
import jalview.schemes.ColourSchemeI;
import jalview.schemes.ResidueProperties;
-import jalview.structure.StructureListener;
import jalview.structure.StructureMapping;
+import jalview.structure.StructureMappingcommandSet;
import jalview.structure.StructureSelectionManager;
-import jalview.structures.models.SequenceStructureBindingModel;
+import jalview.structures.models.AAStructureBindingModel;
+import jalview.util.Comparison;
import jalview.util.MessageManager;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
-import java.util.Hashtable;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.Vector;
import ext.edu.ucsf.rbvi.strucviz2.ChimeraManager;
import ext.edu.ucsf.rbvi.strucviz2.ChimeraModel;
import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
import ext.edu.ucsf.rbvi.strucviz2.StructureManager.ModelType;
-public abstract class JalviewChimeraBinding extends
- SequenceStructureBindingModel implements StructureListener,
- SequenceStructureBinding, StructureSelectionManagerProvider
-
+public abstract class JalviewChimeraBinding extends AAStructureBindingModel
{
+
+ private static final boolean debug = false;
+
+ private static final String PHOSPHORUS = "P";
+
+ private static final String ALPHACARBON = "CA";
+
private StructureManager csm;
private ChimeraManager viewer;
private boolean loadingFromArchive = false;
/**
- * second flag to indicate if the jmol viewer should ignore sequence colouring
- * events from the structure manager because the GUI is still setting up
+ * second flag to indicate if the Chimera viewer should ignore sequence
+ * colouring events from the structure manager because the GUI is still
+ * setting up
*/
private boolean loadingFinished = true;
/**
- * state flag used to check if the Jmol viewer's paint method can be called
+ * state flag used to check if the Chimera viewer's paint method can be called
*/
private boolean finishedInit = false;
/**
* when true, try to search the associated datamodel for sequences that are
- * associated with any unknown structures in the Jmol view.
+ * associated with any unknown structures in the Chimera view.
*/
private boolean associateNewStructs = false;
- Vector atomsPicked = new Vector();
-
- public Vector chainNames;
-
- Hashtable chainFile;
+ List<String> atomsPicked = new ArrayList<String>();
- /**
- * array of target chains for seuqences - tied to pdbentry and sequence[]
- */
- protected String[][] chains;
+ public List<String> chainNames;
- boolean colourBySequence = true;
+ private Map<String, String> chainFile;
StringBuffer eval = new StringBuffer();
public String fileLoadingError;
- private Map<String, List<ChimeraModel>> chimmaps = new HashMap<String, List<ChimeraModel>>();
+ private Map<String, List<ChimeraModel>> chimmaps = new LinkedHashMap<String, List<ChimeraModel>>();
private List<String> mdlToFile = new ArrayList<String>();
try
{
List<ChimeraModel> oldList = viewer.getModelList();
- viewer.openModel(file, ModelType.PDB_MODEL);
+ viewer.openModel(file, pe.getId(), ModelType.PDB_MODEL);
List<ChimeraModel> newList = viewer.getModelList();
if (oldList.size() < newList.size())
{
} catch (Error e)
{
}
- // Explicitly map to the filename used by Jmol ;
+ // Explicitly map to the filename used by Chimera ;
// pdbentry[pe].getFile(), protocol);
- if (ssm != null)
+ if (getSsm() != null)
{
- ssm.addStructureViewerListener(this);
+ getSsm().addStructureViewerListener(this);
// ssm.addSelectionListener(this);
FeatureRenderer fr = getFeatureRenderer(null);
if (fr != null)
*/
String[] modelFileNames = null;
- public PDBEntry[] pdbentry;
-
- /**
- * datasource protocol for access to PDBEntrylatest
- */
- String protocol = null;
StringBuffer resetLastRes = new StringBuffer();
- /**
- * sequences mapped to each pdbentry
- */
- public SequenceI[][] sequence;
-
- public StructureSelectionManager ssm;
-
private List<String> lastReply;
+ /**
+ * Constructor
+ *
+ * @param ssm
+ * @param pdbentry
+ * @param sequenceIs
+ * @param chains
+ * @param protocol
+ */
public JalviewChimeraBinding(StructureSelectionManager ssm,
PDBEntry[] pdbentry, SequenceI[][] sequenceIs, String[][] chains,
String protocol)
{
- this.ssm = ssm;
- this.sequence = sequenceIs;
- this.chains = chains;
- this.pdbentry = pdbentry;
- this.protocol = protocol;
- if (chains == null)
- {
- this.chains = new String[pdbentry.length][];
- }
+ super(ssm, pdbentry, sequenceIs, chains, protocol);
viewer = new ChimeraManager(
csm = new ext.edu.ucsf.rbvi.strucviz2.StructureManager(true));
- /*
- * viewer = JmolViewer.allocateViewer(renderPanel, new SmarterJmolAdapter(),
- * "jalviewJmol", ap.av.applet .getDocumentBase(),
- * ap.av.applet.getCodeBase(), "", this);
- *
- * jmolpopup = JmolPopup.newJmolPopup(viewer, true, "Jmol", true);
- */
}
+ /**
+ * Constructor
+ *
+ * @param ssm
+ * @param theViewer
+ */
public JalviewChimeraBinding(StructureSelectionManager ssm,
- ChimeraManager viewer2)
+ ChimeraManager theViewer)
{
- this.ssm = ssm;
- viewer = viewer2;
+ super(ssm, null);
+ viewer = theViewer;
csm = viewer.getStructureManager();
}
/**
- * construct a title string for the viewer window based on the data jalview
+ * Construct a title string for the viewer window based on the data Jalview
* knows about
*
+ * @param verbose
* @return
*/
- public String getViewerTitle()
+ public String getViewerTitle(boolean verbose)
{
- if (sequence == null || pdbentry == null || sequence.length < 1
- || pdbentry.length < 1 || sequence[0].length < 1)
- {
- return ("Jalview Chimera Window");
- }
- // TODO: give a more informative title when multiple structures are
- // displayed.
- StringBuffer title = new StringBuffer("Chimera view for "
- + sequence[0][0].getName() + ":" + pdbentry[0].getId());
-
- if (pdbentry[0].getProperty() != null)
- {
- if (pdbentry[0].getProperty().get("method") != null)
- {
- title.append(" Method: ");
- title.append(pdbentry[0].getProperty().get("method"));
- }
- if (pdbentry[0].getProperty().get("chains") != null)
- {
- title.append(" Chain:");
- title.append(pdbentry[0].getProperty().get("chains"));
- }
- }
- return title.toString();
+ return getViewerTitle("Chimera", verbose);
}
/**
* prepare the view for a given set of models/chains. chainList contains
* strings of the form 'pdbfilename:Chaincode'
*
- * @param chainList
+ * @param toshow
* list of chains to make visible
*/
- public void centerViewer(Vector chainList)
+ public void centerViewer(List<String> toshow)
{
- StringBuffer cmd = new StringBuffer();
- String lbl;
+ StringBuilder cmd = new StringBuilder(64);
int mlength, p;
- for (int i = 0, iSize = chainList.size(); i < iSize; i++)
+ for (String lbl : toshow)
{
mlength = 0;
- lbl = (String) chainList.elementAt(i);
do
{
p = mlength;
mlength = lbl.indexOf(":", p);
} while (p < mlength && mlength < (lbl.length() - 2));
// TODO: lookup each pdb id and recover proper model number for it.
- cmd.append("#" + getModelNum((String) chainFile.get(lbl)) + "."
+ cmd.append("#" + getModelNum(chainFile.get(lbl)) + "."
+ lbl.substring(mlength + 1) + " or ");
}
if (cmd.length() > 0)
+ {
cmd.setLength(cmd.length() - 4);
- evalStateCommand("~display #*; ~ribbon #*; ribbon " + cmd + ";focus "
- + cmd,false);
+ }
+ String cmdstring = cmd.toString();
+ evalStateCommand("~display #*; ~ribbon #*; ribbon " + cmdstring
+ + ";focus " + cmdstring, false);
}
- public void closeViewer()
+ /**
+ * Close down the Jalview viewer, and (optionally) the associated Chimera
+ * window.
+ */
+ public void closeViewer(boolean closeChimera)
{
- ssm.removeStructureViewerListener(this, this.getPdbFile());
- // and shut down Chimera
- viewer.exitChimera();
- // viewer.evalStringQuiet("zap");
- // viewer.setJmolStatusListener(null);
+ getSsm().removeStructureViewerListener(this, this.getPdbFile());
+ if (closeChimera)
+ {
+ viewer.exitChimera();
+ }
lastCommand = null;
viewer = null;
releaseUIResources();
}
- /**
- * called by JalviewJmolbinding after closeViewer is called - release any
- * resources and references so they can be garbage collected.
- */
- protected abstract void releaseUIResources();
-
public void colourByChain()
{
colourBySequence = false;
- // TODO: colour by chain should colour each chain distinctly across all
- // visible models
- // TODO: http://issues.jalview.org/browse/JAL-628
- evalStateCommand("select *;color chain",false);
+ evalStateCommand("rainbow chain", false);
}
public void colourByCharge()
{
colourBySequence = false;
- evalStateCommand("colour *;color white;select ASP,GLU;color red;"
- + "select LYS,ARG;color blue;select CYS;color yellow", false);
+ evalStateCommand(
+ "color white;color red ::ASP;color red ::GLU;color blue ::LYS;color blue ::ARG;color yellow ::CYS",
+ false);
}
/**
int[] _refStructure, ColumnSelection[] _hiddenCols)
{
assert (_alignment.length == _refStructure.length && _alignment.length != _hiddenCols.length);
- StringBuffer allComs = new StringBuffer(); // whole shebang for superposition
+ StringBuilder allComs = new StringBuilder(128); // Chimera superposition cmd
String[] files = getPdbFile();
- // check to see if we are still waiting for Jmol files
+ // check to see if we are still waiting for Chimera files
long starttime = System.currentTimeMillis();
boolean waiting = true;
do
{
// HACK - in Jalview 2.8 this call may not be threadsafe so we catch
// every possible exception
- StructureMapping[] sm = ssm.getMapping(file);
+ StructureMapping[] sm = getSsm().getMapping(file);
if (sm == null || sm.length == 0)
{
waiting = true;
if (waiting)
{
System.err
- .println("RUNTIME PROBLEM: Jmol seems to be taking a long time to process all the structures.");
+ .println("RUNTIME PROBLEM: Chimera seems to be taking a long time to process all the structures.");
return;
}
refreshPdbEntries();
{
refStructure = -1;
}
- StringBuffer command = new StringBuffer();
boolean matched[] = new boolean[alignment.getWidth()];
for (int m = 0; m < matched.length; m++)
int commonrpositions[][] = new int[files.length][alignment.getWidth()];
String isel[] = new String[files.length];
- // reference structure - all others are superposed in it
String[] targetC = new String[files.length];
String[] chainNames = new String[files.length];
- String[] atomS = new String[files.length];
+ String[] atomSpec = new String[files.length];
for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)
{
- StructureMapping[] mapping = ssm.getMapping(files[pdbfnum]);
+ StructureMapping[] mapping = getSsm().getMapping(files[pdbfnum]);
// RACE CONDITION - getMapping only returns Jmol loaded filenames once
// Jmol callback has completed.
if (mapping == null || mapping.length < 1)
throw new Error(MessageManager.getString("error.implementation_error_chimera_getting_data"));
}
int lastPos = -1;
- for (int s = 0; s < sequence[pdbfnum].length; s++)
+ final int seqCountForPdbFile = getSequence()[pdbfnum].length;
+ for (int s = 0; s < seqCountForPdbFile; s++)
{
for (int sp, m = 0; m < mapping.length; m++)
{
- if (mapping[m].getSequence() == sequence[pdbfnum][s]
- && (sp = alignment.findIndex(sequence[pdbfnum][s])) > -1)
+ final SequenceI theSequence = getSequence()[pdbfnum][s];
+ if (mapping[m].getSequence() == theSequence
+ && (sp = alignment.findIndex(theSequence)) > -1)
{
if (refStructure == -1)
{
continue;
}
- if (jalview.util.Comparison.isGap(asp.getCharAt(r)))
+ if (Comparison.isGap(asp.getCharAt(r)))
{
// no mapping to gaps in sequence
continue;
}
chainNames[pdbfnum] = mapping[m].getPdbId()
+ targetC[pdbfnum];
- atomS[pdbfnum] = asp.getRNA()!=null ? "P" : "CA";
+ atomSpec[pdbfnum] = asp.getRNA() != null ? PHOSPHORUS : ALPHACARBON;
// move on to next pdb file
- s = sequence[pdbfnum].length;
+ s = seqCountForPdbFile;
break;
}
}
}
}
}
+ StringBuilder command = new StringBuilder(256);
for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)
{
if (pdbfnum == refStructure || selcom[pdbfnum] == null
{
continue;
}
- if (command.length()>0)
+ if (command.length() > 0)
{
command.append(";");
}
- command.append("match");
- // form the matched pair strings
- for (int s = 0; s < 2; s++)
- {
- command.append(" #"+(s == 0 ? pdbfnum : refStructure)+".1");
- // note - need to select on first model, otherwise it all goes wrong!
- command.append(selcom[(s == 0 ? pdbfnum : refStructure)]);
- command.append("@"+atomS[(s == 0 ? pdbfnum : refStructure)]); // match on backbone alpha/polyphosphate
- }
+ /*
+ * Form Chimera match command, from the 'new' structure to the
+ * 'reference' structure e.g. (residues 1-91, chain B/A, alphacarbons):
+ *
+ * match #1:1-91.B@CA #0:1-91.A@CA
+ *
+ * @see
+ * https://www.cgl.ucsf.edu/chimera/docs/UsersGuide/midas/match.html
+ */
+ command.append("match #" + pdbfnum /* +".1" */);
+ // TODO: handle sub-models
+ command.append(selcom[pdbfnum]);
+ command.append("@" + atomSpec[pdbfnum]);
+ command.append(" #" + refStructure /* +".1" */);
+ command.append(selcom[refStructure]);
+ command.append("@" + atomSpec[refStructure]);
}
if (selectioncom.length() > 0)
{
- System.out.println("Select regions:\n" + selectioncom.toString());
- System.out
- .println("Superimpose command(s):\n" + command.toString());
+ if (debug)
+ {
+ System.out.println("Select regions:\n" + selectioncom.toString());
+ System.out.println("Superimpose command(s):\n"
+ + command.toString());
+ }
allComs.append("~display all; chain @CA|P; ribbon "
+ selectioncom.toString() + ";"+command.toString());
// selcom.append("; ribbons; ");
{
selectioncom.setLength(selectioncom.length() - 1);
}
- System.out.println("Select regions:\n" + selectioncom.toString());
+ if (debug)
+ {
+ System.out.println("Select regions:\n" + selectioncom.toString());
+ }
allComs.append("; ~display all; chain @CA|P; ribbon "
- + selectioncom.toString() + "");
+ + selectioncom.toString() + "; focus");
// evalStateCommand("select *; backbone; select "+selcom.toString()+"; cartoons; center "+selcom.toString());
- evalStateCommand(allComs.toString(),false);
+ evalStateCommand(allComs.toString(), true /* false */);
}
}
}
}
- public void evalStateCommand(final String command, boolean resp)
+ /**
+ * Answers true if the Chimera process is still running, false if ended or not
+ * started.
+ *
+ * @return
+ */
+ public boolean isChimeraRunning()
+ {
+ return viewer.isChimeraLaunched();
+ }
+
+ /**
+ * Send a command to Chimera, and optionally log any responses.
+ *
+ * @param command
+ * @param logResponse
+ */
+ public void evalStateCommand(final String command, boolean logResponse)
{
viewerCommandHistory(false);
checkLaunched();
// @Override
// public void run()
// {
- lastReply = viewer.sendChimeraCommand(command, resp);
- if (debug)
+ // trim command or it may never find a match in the replyLog!!
+ lastReply = viewer.sendChimeraCommand(command.trim(), logResponse);
+ if (debug && logResponse)
{
log("Response from command ('" + command + "') was:\n"
+ lastReply);
jalview.api.AlignmentViewPanel alignmentv)
{
if (!colourBySequence || !loadingFinished)
+ {
return;
- if (ssm == null)
+ }
+ if (getSsm() == null)
{
return;
}
}
AlignmentI alignment = alignmentv.getAlignment();
- for (jalview.structure.StructureMappingcommandSet cpdbbyseq : ChimeraCommands
- .getColourBySequenceCommand(ssm, files, sequence, sr, fr,
- alignment))
- for (String cbyseq : cpdbbyseq.commands)
+ for (jalview.structure.StructureMappingcommandSet cpdbbyseq : getColourBySequenceCommands(files, sr, fr, alignment))
+ {
+ for (String command : cpdbbyseq.commands)
{
- waitForChimera();
- evalStateCommand(cbyseq, false);
- waitForChimera();
+ executeWhenReady(command);
}
- }
-
- private void waitForChimera()
- {
- while (viewer.isBusy())
- {
- try {
- Thread.sleep(15);
- } catch (InterruptedException q)
- {}
}
}
- public boolean isColourBySequence()
- {
- return colourBySequence;
- }
-
- public void setColourBySequence(boolean colourBySequence)
+ /**
+ * @param files
+ * @param sr
+ * @param fr
+ * @param alignment
+ * @return
+ */
+ protected StructureMappingcommandSet[] getColourBySequenceCommands(
+ String[] files, SequenceRenderer sr, FeatureRenderer fr,
+ AlignmentI alignment)
{
- this.colourBySequence = colourBySequence;
+ return ChimeraCommands
+ .getColourBySequenceCommand(getSsm(), files, getSequence(), sr,
+ fr,
+ alignment);
}
- public void createImage(String file, String type, int quality)
+ /**
+ * @param command
+ */
+ protected void executeWhenReady(String command)
{
- System.out.println("JMOL CREATE IMAGE");
+ waitForChimera();
+ evalStateCommand(command, false);
+ waitForChimera();
}
- public String createImage(String fileName, String type,
- Object textOrBytes, int quality)
+ private void waitForChimera()
{
- System.out.println("JMOL CREATE IMAGE");
- return null;
+ while (viewer != null && viewer.isBusy())
+ {
+ try {
+ Thread.sleep(15);
+ } catch (InterruptedException q)
+ {}
+ }
}
- public String eval(String strEval)
- {
- // System.out.println(strEval);
- // "# 'eval' is implemented only for the applet.";
- return null;
- }
+
// End StructureListener
// //////////////////////////
- public float[][] functionXY(String functionName, int x, int y)
- {
- return null;
- }
-
- public float[][][] functionXYZ(String functionName, int nx, int ny, int nz)
- {
- // TODO Auto-generated method stub
- return null;
- }
-
public Color getColour(int atomIndex, int pdbResNum, String chain,
String pdbfile)
{
if (getModelNum(pdbfile) < 0)
+ {
return null;
+ }
log("get model / residue colour attribute unimplemented");
return null;
}
for (int i = 0; i < mfn.length; i++)
{
if (mfn[i].equalsIgnoreCase(modelFileName))
+ {
return i;
+ }
}
return -1;
}
}
}
- boolean debug = true;
-
private void log(String message)
{
System.err.println("## Chimera log: " + message);
private void viewerCommandHistory(boolean enable)
{
- log("(Not yet implemented) History "
- + ((debug || enable) ? "on" : "off"));
+ // log("(Not yet implemented) History "
+ // + ((debug || enable) ? "on" : "off"));
}
public void loadInline(String string)
String chainId;
if (strInfo.indexOf(":") > -1)
+ {
chainId = strInfo.substring(strInfo.indexOf(":") + 1,
strInfo.indexOf("."));
+ }
else
{
chainId = " ";
;
}
if (lastMessage == null || !lastMessage.equals(strInfo))
- ssm.mouseOverStructure(pdbResNum, chainId, pdbfilename);
+ {
+ getSsm().mouseOverStructure(pdbResNum, chainId, pdbfilename);
+ }
lastMessage = strInfo;
}
int chainSeparator = strInfo.indexOf(":");
int p = 0;
if (chainSeparator == -1)
+ {
chainSeparator = strInfo.indexOf(".");
+ }
String picked = strInfo.substring(strInfo.indexOf("]") + 1,
chainSeparator);
String mdlString = "";
if ((p = strInfo.indexOf(":")) > -1)
+ {
picked += strInfo.substring(p + 1, strInfo.indexOf("."));
+ }
if ((p = strInfo.indexOf("/")) > -1)
{
if (!atomsPicked.contains(picked))
{
viewer.select(picked);
- atomsPicked.addElement(picked);
+ atomsPicked.add(picked);
}
else
{
viewer.select("not " + picked);
- atomsPicked.removeElement(picked);
+ atomsPicked.remove(picked);
}
viewerCommandHistory(true);
// TODO: in application this happens
// incremented every time a load notification is successfully handled -
// lightweight mechanism for other threads to detect when they can start
- // referrring to new structures.
+ // referring to new structures.
private long loadNotifiesHandled = 0;
public long getLoadNotifiesHandled()
fileLoadingError = null;
String[] oldmodels = modelFileNames;
modelFileNames = null;
- chainNames = new Vector();
- chainFile = new Hashtable();
+ chainNames = new ArrayList<String>();
+ chainFile = new HashMap<String, String>();
boolean notifyLoaded = false;
String[] modelfilenames = getPdbFile();
// first check if we've lost any structures
}
// deregister the Jmol instance for these structures - we'll add
// ourselves again at the end for the current structure set.
- ssm.removeStructureViewerListener(this, oldmfn);
+ getSsm().removeStructureViewerListener(this, oldmfn);
}
}
// register ourselves as a listener and notify the gui that it needs to
// update itself.
- ssm.addStructureViewerListener(this);
+ getSsm().addStructureViewerListener(this);
if (notifyLoaded)
{
colourBySequence = false;
if (cs == null)
+ {
return;
+ }
String res;
int index;
Color col;
+ // Chimera expects RBG values in the range 0-1
+ final double normalise = 255D;
viewerCommandHistory(false);
// TODO: Switch between nucleotide or aa selection expressions
Enumeration en = ResidueProperties.aa3Hash.keys();
- StringBuffer command = new StringBuffer("select *;color white;");
+ StringBuilder command = new StringBuilder(128);
+ command.append("color white;");
while (en.hasMoreElements())
{
res = en.nextElement().toString();
index = ((Integer) ResidueProperties.aa3Hash.get(res)).intValue();
if (index > 20)
+ {
continue;
+ }
col = cs.findColour(ResidueProperties.aa[index].charAt(0));
- // TODO: need colour string function and res selection here
- command.append("select " + res + ";color[" + col.getRed() + ","
- + col.getGreen() + "," + col.getBlue() + "];");
+ command.append("color " + col.getRed() / normalise + ","
+ + col.getGreen() / normalise + "," + col.getBlue()
+ / normalise + " ::" + res + ";");
}
evalStateCommand(command.toString(),false);
viewerCommandHistory(true);
}
- public void showHelp()
- {
- // chimera help
- showUrl("http://jmol.sourceforge.net/docs/JmolUserGuide/", "jmolHelp");
- }
-
- /**
- * open the URL somehow
- *
- * @param target
- */
- public abstract void showUrl(String url, String target);
-
/**
- * called when the binding thinks the UI needs to be refreshed after a Jmol
+ * 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
- * error has occured.
+ * error has occurred.
*/
public abstract void refreshGUI();
- public void componentResized(ComponentEvent e)
- {
-
- }
-
- public void componentMoved(ComponentEvent e)
- {
-
- }
-
- public void componentShown(ComponentEvent e)
- {
- }
-
- public void componentHidden(ComponentEvent e)
- {
- }
-
public void setLoadingFromArchive(boolean loadingFromArchive)
{
this.loadingFromArchive = loadingFromArchive;
/**
*
- * @return true if Jmol is still restoring state or loading is still going on
- * (see setFinsihedLoadingFromArchive)
+ * @return true if Chimeral is still restoring state or loading is still going
+ * on (see setFinsihedLoadingFromArchive)
*/
public boolean isLoadingFromArchive()
{
loadingFinished = finishedLoading;
}
- public void setBackgroundColour(java.awt.Color col)
+ /**
+ * Send the Chimera 'background solid <color>" command.
+ *
+ * @see https
+ * ://www.cgl.ucsf.edu/chimera/current/docs/UsersGuide/midas/background
+ * .html
+ * @param col
+ */
+ public void setBackgroundColour(Color col)
{
viewerCommandHistory(false);
- // todo set background colour
- viewer.sendChimeraCommand(
- "background [" + col.getRed() + "," + col.getGreen() + ","
- + col.getBlue() + "];", false);
+ double normalise = 255D;
+ final String command = "background solid " + col.getRed() / normalise + ","
+ + col.getGreen() / normalise + "," + col.getBlue()
+ / normalise + ";";
+ viewer.sendChimeraCommand(command, false);
viewerCommandHistory(true);
}
/**
- * add structures and any known sequence associations
*
- * @returns the pdb entries added to the current set.
+ * @param pdbfile
+ * @return text report of alignment between pdbfile and any associated
+ * alignment sequences
*/
- public synchronized PDBEntry[] addSequenceAndChain(PDBEntry[] pdbe,
- SequenceI[][] seq, String[][] chns)
- {
- int pe = -1;
- Vector v = new Vector();
- Vector rtn = new Vector();
- for (int i = 0; i < pdbentry.length; i++)
- {
- v.addElement(pdbentry[i]);
- }
- for (int i = 0; i < pdbe.length; i++)
- {
- int r = v.indexOf(pdbe[i]);
- if (r == -1 || r >= pdbentry.length)
- {
- rtn.addElement(new int[]
- { v.size(), i });
- v.addElement(pdbe[i]);
- }
- else
- {
- // just make sure the sequence/chain entries are all up to date
- addSequenceAndChain(r, seq[i], chns[i]);
- }
- }
- pdbe = new PDBEntry[v.size()];
- v.copyInto(pdbe);
- pdbentry = pdbe;
- if (rtn.size() > 0)
- {
- // expand the tied seuqence[] and string[] arrays
- SequenceI[][] sqs = new SequenceI[pdbentry.length][];
- String[][] sch = new String[pdbentry.length][];
- System.arraycopy(sequence, 0, sqs, 0, sequence.length);
- System.arraycopy(chains, 0, sch, 0, this.chains.length);
- sequence = sqs;
- chains = sch;
- pdbe = new PDBEntry[rtn.size()];
- for (int r = 0; r < pdbe.length; r++)
- {
- int[] stri = ((int[]) rtn.elementAt(r));
- // record the pdb file as a new addition
- pdbe[r] = pdbentry[stri[0]];
- // and add the new sequence/chain entries
- addSequenceAndChain(stri[0], seq[stri[1]], chns[stri[1]]);
- }
- }
- else
- {
- pdbe = null;
- }
- return pdbe;
- }
-
- public void addSequence(int pe, SequenceI[] seq)
- {
- // add sequences to the pe'th pdbentry's seuqence set.
- addSequenceAndChain(pe, seq, null);
- }
-
- private void addSequenceAndChain(int pe, SequenceI[] seq, String[] tchain)
+ public String printMapping(String pdbfile)
{
- if (pe < 0 || pe >= pdbentry.length)
- {
- throw new Error(MessageManager.formatMessage("error.implementation_error_no_pdbentry_from_index", new String[]{Integer.valueOf(pe).toString()}));
- }
- final String nullChain = "TheNullChain";
- Vector s = new Vector();
- Vector c = new Vector();
- if (chains == null)
- {
- chains = new String[pdbentry.length][];
- }
- if (sequence[pe] != null)
- {
- for (int i = 0; i < sequence[pe].length; i++)
- {
- s.addElement(sequence[pe][i]);
- if (chains[pe] != null)
- {
- if (i < chains[pe].length)
- {
- c.addElement(chains[pe][i]);
- }
- else
- {
- c.addElement(nullChain);
- }
- }
- else
- {
- if (tchain != null && tchain.length > 0)
- {
- c.addElement(nullChain);
- }
- }
- }
- }
- for (int i = 0; i < seq.length; i++)
- {
- if (!s.contains(seq[i]))
- {
- s.addElement(seq[i]);
- if (tchain != null && i < tchain.length)
- {
- c.addElement(tchain[i] == null ? nullChain : tchain[i]);
- }
- }
- }
- SequenceI[] tmp = new SequenceI[s.size()];
- s.copyInto(tmp);
- sequence[pe] = tmp;
- if (c.size() > 0)
- {
- String[] tch = new String[c.size()];
- c.copyInto(tch);
- for (int i = 0; i < tch.length; i++)
- {
- if (tch[i] == nullChain)
- {
- tch[i] = null;
- }
- }
- chains[pe] = tch;
- }
- else
- {
- chains[pe] = null;
- }
+ return getSsm().printMapping(pdbfile);
}
/**
+ * Ask Chimera to save its session to the given file. Returns true if
+ * successful, else false.
*
- * @param pdbfile
- * @return text report of alignment between pdbfile and any associated
- * alignment sequences
+ * @param filepath
+ * @return
*/
- public String printMapping(String pdbfile)
+ public boolean saveSession(String filepath)
{
- return ssm.printMapping(pdbfile);
+ if (isChimeraRunning())
+ {
+ List<String> reply = viewer.sendChimeraCommand("save " + filepath,
+ true);
+ System.out.println(reply);
+ }
+ return false;
}
}