();
PDBEntry thePdbEntry = null;
try
{
String[] curfiles = jmb.getPdbFile(); // files currently in viewer
// TODO: replace with reference fetching/transfer code (validate PDBentry
// as a DBRef?)
for (int pi = 0; pi < jmb.getPdbCount(); pi++)
{
String file = null;
thePdbEntry = jmb.getPdbEntry(pi);
if (thePdbEntry.getFile() == null)
{
/*
* Retrieve PDB data, save to file, attach to PDBEntry
*/
file = fetchPdbFile(thePdbEntry);
if (file == null)
{
errormsgs.append("'" + thePdbEntry.getId() + "' ");
}
}
else
{
/*
* Got file already - ignore if already loaded in Chimera.
*/
file = new File(thePdbEntry.getFile()).getAbsoluteFile()
.getPath();
if (curfiles != null && curfiles.length > 0)
{
addingStructures = true; // already files loaded.
for (int c = 0; c < curfiles.length; c++)
{
if (curfiles[c].equals(file))
{
file = null;
break;
}
}
}
}
if (file != null)
{
filePDB.add(thePdbEntry);
filePDBpos.add(Integer.valueOf(pi));
files.append(" \"" + Platform.escapeString(file) + "\"");
}
}
} catch (OutOfMemoryError oomerror)
{
new OOMWarning("Retrieving PDB files: " + thePdbEntry.getId(),
oomerror);
} catch (Exception ex)
{
ex.printStackTrace();
errormsgs.append("When retrieving pdbfiles for '"
+ thePdbEntry.getId() + "'");
}
if (errormsgs.length() > 0)
{
JOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager
.formatMessage("label.pdb_entries_couldnt_be_retrieved",
new Object[] { errormsgs.toString() }),
MessageManager.getString("label.couldnt_load_file"),
JOptionPane.ERROR_MESSAGE);
}
if (files.length() > 0)
{
if (!addingStructures)
{
try
{
initChimera();
} catch (Exception ex)
{
Cache.log.error("Couldn't open Chimera viewer!", ex);
}
}
int num = -1;
for (PDBEntry pe : filePDB)
{
num++;
if (pe.getFile() != null)
{
try
{
int pos = filePDBpos.get(num).intValue();
long startTime = startProgressBar("Chimera "
+ MessageManager.getString("status.opening_file_for")
+ " " + pe.getId());
jmb.openFile(pe);
jmb.addSequence(pos, jmb.getSequence()[pos]);
File fl = new File(pe.getFile());
String protocol = AppletFormatAdapter.URL;
try
{
if (fl.exists())
{
protocol = AppletFormatAdapter.FILE;
}
} catch (Throwable e)
{
} finally
{
stopProgressBar("", startTime);
}
// Explicitly map to the filename used by Chimera ;
jmb.getSsm().setMapping(jmb.getSequence()[pos],
jmb.getChains()[pos], pe.getFile(), protocol);
} catch (OutOfMemoryError oomerror)
{
new OOMWarning(
"When trying to open and map structures from Chimera!",
oomerror);
} catch (Exception ex)
{
Cache.log.error("Couldn't open " + pe.getFile()
+ " in Chimera viewer!", ex);
} finally
{
Cache.log.debug("File locations are " + files);
}
}
}
jmb.setFinishedInit(true);
jmb.setLoadingFromArchive(false);
// refresh the sequence colours for the new structure(s)
for (AlignmentPanel ap : _colourwith)
{
jmb.updateColours(ap);
}
// do superposition if asked to
if (Cache.getDefault("AUTOSUPERIMPOSE", true) && alignAddedStructures)
{
new Thread(new Runnable()
{
@Override
public void run()
{
alignStructs_withAllAlignPanels();
}
}).start();
alignAddedStructures = false;
}
addingStructures = false;
}
_started = false;
worker = null;
}
/**
* Fetch PDB data and save to a local file. Returns the full path to the file,
* or null if fetch fails.
*
* @param processingEntry
* @return
* @throws Exception
*/
private String fetchPdbFile(PDBEntry processingEntry) throws Exception
{
// FIXME: this is duplicated code with Jmol frame ?
String filePath = null;
Pdb pdbclient = new Pdb();
AlignmentI pdbseq = null;
String pdbid = processingEntry.getId();
long handle = System.currentTimeMillis()
+ Thread.currentThread().hashCode();
/*
* Write 'fetching PDB' progress on AlignFrame as we are not yet visible
*/
String msg = MessageManager.formatMessage("status.fetching_pdb",
new Object[] { pdbid });
getAlignmentPanel().alignFrame.setProgressBar(msg, handle);
// long hdl = startProgressBar(MessageManager.formatMessage(
// "status.fetching_pdb", new Object[]
// { pdbid }));
try
{
pdbseq = pdbclient.getSequenceRecords(pdbid);
} catch (OutOfMemoryError oomerror)
{
new OOMWarning("Retrieving PDB id " + pdbid, oomerror);
} finally
{
msg = pdbid + " " + MessageManager.getString("label.state_completed");
getAlignmentPanel().alignFrame.setProgressBar(msg, handle);
// stopProgressBar(msg, hdl);
}
/*
* If PDB data were saved and are not invalid (empty alignment), return the
* file path.
*/
if (pdbseq != null && pdbseq.getHeight() > 0)
{
// just use the file name from the first sequence's first PDBEntry
filePath = new File(pdbseq.getSequenceAt(0).getAllPDBEntries()
.elementAt(0).getFile()).getAbsolutePath();
processingEntry.setFile(filePath);
}
return filePath;
}
/**
* Convenience method to update the progress bar if there is one. Be sure to
* call stopProgressBar with the returned handle to remove the message.
*
* @param msg
* @param handle
*/
public long startProgressBar(String msg)
{
// TODO would rather have startProgress/stopProgress as the
// IProgressIndicator interface
long tm = random.nextLong();
if (progressBar != null)
{
progressBar.setProgressBar(msg, tm);
}
return tm;
}
/**
* End the progress bar with the specified handle, leaving a message (if not
* null) on the status bar
*
* @param msg
* @param handle
*/
public void stopProgressBar(String msg, long handle)
{
if (progressBar != null)
{
progressBar.setProgressBar(msg, handle);
}
}
@Override
public void pdbFile_actionPerformed(ActionEvent actionEvent)
{
JalviewFileChooser chooser = new JalviewFileChooser(
jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
chooser.setFileView(new JalviewFileView());
chooser.setDialogTitle(MessageManager.getString("label.save_pdb_file"));
chooser.setToolTipText(MessageManager.getString("action.save"));
int value = chooser.showSaveDialog(this);
if (value == JalviewFileChooser.APPROVE_OPTION)
{
BufferedReader in = null;
try
{
// TODO: cope with multiple PDB files in view
in = new BufferedReader(new FileReader(jmb.getPdbFile()[0]));
File outFile = chooser.getSelectedFile();
PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
String data;
while ((data = in.readLine()) != null)
{
if (!(data.indexOf("") > -1 || data.indexOf("
") > -1))
{
out.println(data);
}
}
out.close();
} catch (Exception ex)
{
ex.printStackTrace();
} finally
{
if (in != null)
{
try
{
in.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
@Override
public void viewMapping_actionPerformed(ActionEvent actionEvent)
{
jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();
try
{
cap.appendText(jmb.printMappings());
} catch (OutOfMemoryError e)
{
new OOMWarning(
"composing sequence-structure alignments for display in text box.",
e);
cap.dispose();
return;
}
jalview.gui.Desktop.addInternalFrame(cap,
MessageManager.getString("label.pdb_sequence_mapping"), 550,
600);
}
@Override
public void eps_actionPerformed(ActionEvent e)
{
throw new Error(
MessageManager
.getString("error.eps_generation_not_implemented"));
}
@Override
public void png_actionPerformed(ActionEvent e)
{
throw new Error(
MessageManager
.getString("error.png_generation_not_implemented"));
}
@Override
public void viewerColour_actionPerformed(ActionEvent actionEvent)
{
if (viewerColour.isSelected())
{
// disable automatic sequence colouring.
jmb.setColourBySequence(false);
}
}
@Override
public void seqColour_actionPerformed(ActionEvent actionEvent)
{
jmb.setColourBySequence(seqColour.isSelected());
if (_colourwith == null)
{
_colourwith = new Vector();
}
if (jmb.isColourBySequence())
{
if (!jmb.isLoadingFromArchive())
{
if (_colourwith.size() == 0 && getAlignmentPanel() != null)
{
// Make the currently displayed alignment panel the associated view
_colourwith.add(getAlignmentPanel().alignFrame.alignPanel);
}
}
// Set the colour using the current view for the associated alignframe
for (AlignmentPanel ap : _colourwith)
{
jmb.colourBySequence(ap.av.isShowSequenceFeatures(), ap);
}
}
}
@Override
public void chainColour_actionPerformed(ActionEvent actionEvent)
{
chainColour.setSelected(true);
jmb.colourByChain();
}
@Override
public void chargeColour_actionPerformed(ActionEvent actionEvent)
{
chargeColour.setSelected(true);
jmb.colourByCharge();
}
@Override
public void zappoColour_actionPerformed(ActionEvent actionEvent)
{
zappoColour.setSelected(true);
jmb.setJalviewColourScheme(new ZappoColourScheme());
}
@Override
public void taylorColour_actionPerformed(ActionEvent actionEvent)
{
taylorColour.setSelected(true);
jmb.setJalviewColourScheme(new TaylorColourScheme());
}
@Override
public void hydroColour_actionPerformed(ActionEvent actionEvent)
{
hydroColour.setSelected(true);
jmb.setJalviewColourScheme(new HydrophobicColourScheme());
}
@Override
public void helixColour_actionPerformed(ActionEvent actionEvent)
{
helixColour.setSelected(true);
jmb.setJalviewColourScheme(new HelixColourScheme());
}
@Override
public void strandColour_actionPerformed(ActionEvent actionEvent)
{
strandColour.setSelected(true);
jmb.setJalviewColourScheme(new StrandColourScheme());
}
@Override
public void turnColour_actionPerformed(ActionEvent actionEvent)
{
turnColour.setSelected(true);
jmb.setJalviewColourScheme(new TurnColourScheme());
}
@Override
public void buriedColour_actionPerformed(ActionEvent actionEvent)
{
buriedColour.setSelected(true);
jmb.setJalviewColourScheme(new BuriedColourScheme());
}
@Override
public void purinePyrimidineColour_actionPerformed(ActionEvent actionEvent)
{
setJalviewColourScheme(new PurinePyrimidineColourScheme());
}
@Override
public void userColour_actionPerformed(ActionEvent actionEvent)
{
userColour.setSelected(true);
new UserDefinedColours(this, null);
}
@Override
public void backGround_actionPerformed(ActionEvent actionEvent)
{
java.awt.Color col = JColorChooser
.showDialog(this, MessageManager
.getString("label.select_backgroud_colour"), null);
if (col != null)
{
jmb.setBackgroundColour(col);
}
}
@Override
public void showHelp_actionPerformed(ActionEvent actionEvent)
{
try
{
jalview.util.BrowserLauncher
.openURL("https://www.cgl.ucsf.edu/chimera/docs/UsersGuide");
} catch (Exception ex)
{
}
}
public void updateTitleAndMenus()
{
if (jmb.fileLoadingError != null && jmb.fileLoadingError.length() > 0)
{
repaint();
return;
}
setChainMenuItems(jmb.getChainNames());
this.setTitle(jmb.getViewerTitle("Chimera", true));
if (jmb.getPdbFile().length > 1 && jmb.getSequence().length > 1)
{
viewerActionMenu.setVisible(true);
}
if (!jmb.isLoadingFromArchive())
{
seqColour_actionPerformed(null);
}
}
/*
* (non-Javadoc)
*
* @see
* jalview.jbgui.GStructureViewer#alignStructs_actionPerformed(java.awt.event
* .ActionEvent)
*/
@Override
protected void alignStructs_actionPerformed(ActionEvent actionEvent)
{
alignStructs_withAllAlignPanels();
}
private void alignStructs_withAllAlignPanels()
{
if (getAlignmentPanel() == null)
{
return;
}
if (_alignwith.size() == 0)
{
_alignwith.add(getAlignmentPanel());
}
try
{
AlignmentI[] als = new Alignment[_alignwith.size()];
ColumnSelection[] alc = new ColumnSelection[_alignwith.size()];
int[] alm = new int[_alignwith.size()];
int a = 0;
for (AlignmentPanel ap : _alignwith)
{
als[a] = ap.av.getAlignment();
alm[a] = -1;
alc[a++] = ap.av.getColumnSelection();
}
jmb.superposeStructures(als, alm, alc);
} catch (Exception e)
{
StringBuffer sp = new StringBuffer();
for (AlignmentPanel ap : _alignwith)
{
sp.append("'" + ap.alignFrame.getTitle() + "' ");
}
Cache.log.info("Couldn't align structures with the " + sp.toString()
+ "associated alignment panels.", e);
}
}
@Override
public void setJalviewColourScheme(ColourSchemeI ucs)
{
jmb.setJalviewColourScheme(ucs);
}
/**
*
* @param alignment
* @return first alignment panel displaying given alignment, or the default
* alignment panel
*/
public AlignmentPanel getAlignmentPanelFor(AlignmentI alignment)
{
for (AlignmentPanel ap : getAllAlignmentPanels())
{
if (ap.av.getAlignment() == alignment)
{
return ap;
}
}
return getAlignmentPanel();
}
@Override
public AAStructureBindingModel getBinding()
{
return jmb;
}
/**
* Ask Chimera to save its session to the designated file path, or to a
* temporary file if the path is null. Returns the file path if successful,
* else null.
*
* @param filepath
* @see getStateInfo
*/
protected String saveSession(String filepath)
{
String pathUsed = filepath;
try
{
if (pathUsed == null)
{
File tempFile = File.createTempFile("chimera", ".py");
tempFile.deleteOnExit();
pathUsed = tempFile.getPath();
}
boolean result = jmb.saveSession(pathUsed);
if (result)
{
this.chimeraSessionFile = pathUsed;
return pathUsed;
}
} catch (IOException e)
{
}
return null;
}
/**
* Returns a string representing the state of the Chimera session. This is
* done by requesting Chimera to save its session to a temporary file, then
* reading the file contents. Returns an empty string on any error.
*/
@Override
public String getStateInfo()
{
String sessionFile = saveSession(null);
if (sessionFile == null)
{
return "";
}
InputStream is = null;
try
{
File f = new File(sessionFile);
byte[] bytes = new byte[(int) f.length()];
is = new FileInputStream(sessionFile);
is.read(bytes);
return new String(bytes);
} catch (IOException e)
{
return "";
} finally
{
if (is != null)
{
try
{
is.close();
} catch (IOException e)
{
// ignore
}
}
}
}
@Override
protected void fitToWindow_actionPerformed()
{
jmb.focusView();
}
@Override
public ViewerType getViewerType()
{
return ViewerType.CHIMERA;
}
@Override
protected AAStructureBindingModel getBindingModel()
{
return jmb;
}
}