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;
SequenceStructureBinding, StructureSelectionManagerProvider
{
+ private static final String PHOSPHORUS = "P";
+
+ private static final String ALPHACARBON = "CA";
+
private StructureManager csm;
private ChimeraManager viewer;
/**
* 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();
+ List<String> atomsPicked = new ArrayList<String>();
- public Vector chainNames;
+ public List<String> chainNames;
- Hashtable chainFile;
+ private Map<String, String> chainFile;
/**
- * array of target chains for seuqences - tied to pdbentry and sequence[]
+ * array of target chains for sequences - tied to pdbentry and sequence[]
*/
protected String[][] chains;
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())
{
* 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()
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
long starttime = System.currentTimeMillis();
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]);
}
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;
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)
{
+ // TODO remove debug output
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() + "");
// evalStateCommand("select *; backbone; select "+selcom.toString()+"; cartoons; center "+selcom.toString());
- evalStateCommand(allComs.toString(),false);
+ evalStateCommand(allComs.toString(), true /* false */);
}
}
// @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(), resp);
+ if (debug && resp)
{
log("Response from command ('" + command + "') was:\n"
+ lastReply);
jalview.api.AlignmentViewPanel alignmentv)
{
if (!colourBySequence || !loadingFinished)
+ {
return;
+ }
if (ssm == null)
{
return;
for (jalview.structure.StructureMappingcommandSet cpdbbyseq : ChimeraCommands
.getColourBySequenceCommand(ssm, files, sequence, sr, fr,
alignment))
+ {
for (String cbyseq : cpdbbyseq.commands)
{
waitForChimera();
evalStateCommand(cbyseq, false);
waitForChimera();
}
+ }
}
private void waitForChimera()
this.colourBySequence = colourBySequence;
}
- public void createImage(String file, String type, int quality)
- {
- System.out.println("JMOL CREATE IMAGE");
- }
-
- public String createImage(String fileName, String type,
- Object textOrBytes, int quality)
- {
- System.out.println("JMOL CREATE IMAGE");
- return null;
- }
-
- public String eval(String strEval)
- {
- // System.out.println(strEval);
- // "# 'eval' is implemented only for the applet.";
- return null;
- }
-
// End StructureListener
// //////////////////////////
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;
}
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);
+ }
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
colourBySequence = false;
if (cs == null)
+ {
return;
+ }
String res;
int index;
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
public synchronized PDBEntry[] addSequenceAndChain(PDBEntry[] pdbe,
SequenceI[][] seq, String[][] chns)
{
- int pe = -1;
- Vector v = new Vector();
- Vector rtn = new Vector();
+ List<PDBEntry> v = new ArrayList<PDBEntry>();
+ List<int[]> rtn = new ArrayList<int[]>();
for (int i = 0; i < pdbentry.length; i++)
{
- v.addElement(pdbentry[i]);
+ v.add(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[]
+ rtn.add(new int[]
{ v.size(), i });
- v.addElement(pdbe[i]);
+ v.add(pdbe[i]);
}
else
{
addSequenceAndChain(r, seq[i], chns[i]);
}
}
- pdbe = new PDBEntry[v.size()];
- v.copyInto(pdbe);
+ pdbe = v.toArray(new PDBEntry[v.size()]);
pdbentry = pdbe;
if (rtn.size() > 0)
{
- // expand the tied seuqence[] and string[] arrays
+ // expand the tied sequence[] and string[] arrays
SequenceI[][] sqs = new SequenceI[pdbentry.length][];
String[][] sch = new String[pdbentry.length][];
System.arraycopy(sequence, 0, sqs, 0, sequence.length);
pdbe = new PDBEntry[rtn.size()];
for (int r = 0; r < pdbe.length; r++)
{
- int[] stri = ((int[]) rtn.elementAt(r));
+ int[] stri = (rtn.get(r));
// record the pdb file as a new addition
pdbe[r] = pdbentry[stri[0]];
// and add the new sequence/chain entries
return pdbe;
}
+ /**
+ * Adds sequences to the pe'th pdbentry's sequence set.
+ *
+ * @param pe
+ * @param seq
+ */
public void addSequence(int pe, SequenceI[] seq)
{
- // add sequences to the pe'th pdbentry's seuqence set.
addSequenceAndChain(pe, seq, null);
}
{
if (pe < 0 || pe >= pdbentry.length)
{
- throw new Error(MessageManager.formatMessage("error.implementation_error_no_pdbentry_from_index", new String[]{Integer.valueOf(pe).toString()}));
+ throw new Error(MessageManager.formatMessage(
+ "error.implementation_error_no_pdbentry_from_index",
+ new Object[]
+ { Integer.valueOf(pe).toString() }));
}
final String nullChain = "TheNullChain";
- Vector s = new Vector();
- Vector c = new Vector();
+ List<SequenceI> s = new ArrayList<SequenceI>();
+ List<String> c = new ArrayList<String>();
if (chains == null)
{
chains = new String[pdbentry.length][];
{
for (int i = 0; i < sequence[pe].length; i++)
{
- s.addElement(sequence[pe][i]);
+ s.add(sequence[pe][i]);
if (chains[pe] != null)
{
if (i < chains[pe].length)
{
- c.addElement(chains[pe][i]);
+ c.add(chains[pe][i]);
}
else
{
- c.addElement(nullChain);
+ c.add(nullChain);
}
}
else
{
if (tchain != null && tchain.length > 0)
{
- c.addElement(nullChain);
+ c.add(nullChain);
}
}
}
{
if (!s.contains(seq[i]))
{
- s.addElement(seq[i]);
+ s.add(seq[i]);
if (tchain != null && i < tchain.length)
{
- c.addElement(tchain[i] == null ? nullChain : tchain[i]);
+ c.add(tchain[i] == null ? nullChain : tchain[i]);
}
}
}
- SequenceI[] tmp = new SequenceI[s.size()];
- s.copyInto(tmp);
+ SequenceI[] tmp = s.toArray(new SequenceI[s.size()]);
sequence[pe] = tmp;
if (c.size() > 0)
{
- String[] tch = new String[c.size()];
- c.copyInto(tch);
+ String[] tch = c.toArray(new String[c.size()]);
for (int i = 0; i < tch.length; i++)
{
if (tch[i] == nullChain)