From e17fd50136e5e56d2695002d00047281ca0fa4e3 Mon Sep 17 00:00:00 2001 From: Jim Procter Date: Tue, 14 Sep 2021 17:11:53 +0100 Subject: [PATCH] JAL-3829 JAL-3855 moved routing for retrieving structures prior to opening a Jmol view to AppJmolBinding - this could be refactored further --- src/jalview/gui/AppJmol.java | 133 +--------------------------- src/jalview/gui/AppJmolBinding.java | 139 ++++++++++++++++++++++++++++++ src/jalview/gui/StructureViewerBase.java | 11 ++- 3 files changed, 150 insertions(+), 133 deletions(-) diff --git a/src/jalview/gui/AppJmol.java b/src/jalview/gui/AppJmol.java index 9280caa..458abc6 100644 --- a/src/jalview/gui/AppJmol.java +++ b/src/jalview/gui/AppJmol.java @@ -26,7 +26,6 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.io.File; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -38,7 +37,6 @@ import javax.swing.event.InternalFrameEvent; import jalview.api.AlignmentViewPanel; import jalview.bin.Cache; -import jalview.datamodel.AlignmentI; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; import jalview.datamodel.StructureViewerModel; @@ -52,9 +50,6 @@ import jalview.util.BrowserLauncher; import jalview.util.ImageMaker; import jalview.util.MessageManager; import jalview.util.Platform; -import jalview.ws.dbsources.EBIAlfaFold; -import jalview.ws.dbsources.Pdb; -import jalview.ws.utils.UrlDownloadClient; public class AppJmol extends StructureViewerBase { @@ -274,7 +269,7 @@ public class AppJmol extends StructureViewerBase _started = true; try { - List files = fetchPdbFiles(); + List files = jmb.fetchPdbFiles(this); if (files.size() > 0) { showFilesInViewer(files); @@ -420,132 +415,6 @@ public class AppJmol extends StructureViewerBase } /** - * Retrieves and saves as file any modelled PDB entries for which we do not - * already have a file saved. Returns a list of absolute paths to structure - * files which were either retrieved, or already stored but not modelled in - * the structure viewer (i.e. files to add to the viewer display). - * - * @return - */ - List fetchPdbFiles() - { - // todo - record which pdbids were successfully imported. - StringBuilder errormsgs = new StringBuilder(); - - List files = new ArrayList<>(); - String pdbid = ""; - try - { - String[] filesInViewer = jmb.getStructureFiles(); - // TODO: replace with reference fetching/transfer code (validate PDBentry - // as a DBRef?) - Pdb pdbclient = new Pdb(); - EBIAlfaFold afclient = new EBIAlfaFold(); - - for (int pi = 0; pi < jmb.getPdbCount(); pi++) - { - String file = jmb.getPdbEntry(pi).getFile(); - if (file == null) - { - // todo: extract block as method and pull up (also ChimeraViewFrame) - // retrieve the pdb and store it locally - AlignmentI pdbseq = null; - PDBEntry strucEntry = jmb.getPdbEntry(pi); - pdbid = strucEntry.getId(); - long hdl = pdbid.hashCode() - System.currentTimeMillis(); - setProgressMessage(MessageManager - .formatMessage("status.fetching_pdb", new String[] - { pdbid }), hdl); - try - { - if (afclient.isValidReference(pdbid)) - { - pdbseq = afclient.getSequenceRecords(pdbid); - } else { - if (strucEntry.hasRetrievalUrl()) - { - File tmpFile = File.createTempFile(pdbid, "cif"); - String fromUrl = strucEntry.getRetrievalUrl(); - UrlDownloadClient.download(fromUrl, tmpFile); - - // may not need this check ? - file = tmpFile.getAbsolutePath(); - if (file != null) - { - pdbseq = EBIAlfaFold.importDownloadedStructureFromUrl(fromUrl,tmpFile,pdbid,null,null,null); - } - } else { - pdbseq = pdbclient.getSequenceRecords(pdbid); - } - } - } catch (OutOfMemoryError oomerror) - { - new OOMWarning("Retrieving PDB id " + pdbid, oomerror); - } catch (Exception ex) - { - ex.printStackTrace(); - errormsgs.append("'").append(pdbid).append("'"); - } finally - { - setProgressMessage( - MessageManager.getString("label.state_completed"), hdl); - } - if (pdbseq != null) - { - // just transfer the file name from the first sequence's first - // PDBEntry - file = new File(pdbseq.getSequenceAt(0).getAllPDBEntries() - .elementAt(0).getFile()).getAbsolutePath(); - jmb.getPdbEntry(pi).setFile(file); - files.add(file); - } - else - { - errormsgs.append("'").append(pdbid).append("' "); - } - } - else - { - if (filesInViewer != null && filesInViewer.length > 0) - { - addingStructures = true; // already files loaded. - for (int c = 0; c < filesInViewer.length; c++) - { - if (Platform.pathEquals(filesInViewer[c], file)) - { - file = null; - break; - } - } - } - if (file != null) - { - files.add(file); - } - } - } - } catch (OutOfMemoryError oomerror) - { - new OOMWarning("Retrieving PDB files: " + pdbid, oomerror); - } catch (Exception ex) - { - ex.printStackTrace(); - errormsgs.append("When retrieving pdbfiles : current was: '") - .append(pdbid).append("'"); - } - if (errormsgs.length() > 0) - { - JvOptionPane.showInternalMessageDialog(Desktop.desktop, - MessageManager.formatMessage( - "label.pdb_entries_couldnt_be_retrieved", new String[] - { errormsgs.toString() }), - MessageManager.getString("label.couldnt_load_file"), - JvOptionPane.ERROR_MESSAGE); - } - return files; - } - - /** * Outputs the Jmol viewer image as an image file, after prompting the user to * choose a file and (for EPS) choice of Text or Lineart character rendering * (unless a preference for this is set) diff --git a/src/jalview/gui/AppJmolBinding.java b/src/jalview/gui/AppJmolBinding.java index 98787cb..037b97e 100644 --- a/src/jalview/gui/AppJmolBinding.java +++ b/src/jalview/gui/AppJmolBinding.java @@ -22,6 +22,7 @@ package jalview.gui; import java.awt.Container; import java.io.File; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -33,12 +34,17 @@ import org.openscience.jmol.app.jmolpanel.console.AppConsole; import jalview.api.AlignmentViewPanel; import jalview.api.structures.JalviewStructureDisplayI; import jalview.bin.Cache; +import jalview.datamodel.AlignmentI; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; import jalview.ext.jmol.JalviewJmolBinding; import jalview.io.DataSourceType; import jalview.structure.StructureSelectionManager; +import jalview.util.MessageManager; import jalview.util.Platform; +import jalview.ws.dbsources.EBIAlfaFold; +import jalview.ws.dbsources.Pdb; +import jalview.ws.utils.UrlDownloadClient; import javajs.util.BS; public class AppJmolBinding extends JalviewJmolBinding @@ -189,4 +195,137 @@ public class AppJmolBinding extends JalviewJmolBinding Platform.cacheFileData(f); } } + + /** + * Retrieves and saves as file any modelled PDB entries for which we do not + * already have a file saved. Returns a list of absolute paths to structure + * files which were either retrieved, or already stored but not modelled in + * the structure viewer (i.e. files to add to the viewer display). + * + * Currently only used by Jmol - similar but different code used for Chimera/X + * and Pymol so still need to refactor + * + * @param structureViewer + * UI proxy for the structure viewer + * @return list of absolute paths to structures retrieved that need to be + * added to the display + */ + public List fetchPdbFiles(StructureViewerBase structureViewer) + { + // todo - record which pdbids were successfully imported. + StringBuilder errormsgs = new StringBuilder(); + + List files = new ArrayList<>(); + String pdbid = ""; + try + { + String[] filesInViewer = getStructureFiles(); + // TODO: replace with reference fetching/transfer code (validate PDBentry + // as a DBRef?) + Pdb pdbclient = new Pdb(); + EBIAlfaFold afclient = new EBIAlfaFold(); + + for (int pi = 0; pi < getPdbCount(); pi++) + { + String file = getPdbEntry(pi).getFile(); + if (file == null) + { + // todo: extract block as method and pull up (also ChimeraViewFrame) + // retrieve the pdb and store it locally + AlignmentI pdbseq = null; + PDBEntry strucEntry = getPdbEntry(pi); + pdbid = strucEntry.getId(); + long hdl = pdbid.hashCode() - System.currentTimeMillis(); + structureViewer.setProgressMessage(MessageManager + .formatMessage("status.fetching_pdb", new String[] + { pdbid }), hdl); + try + { + if (afclient.isValidReference(pdbid)) + { + pdbseq = afclient.getSequenceRecords(pdbid); + } else { + if (strucEntry.hasRetrievalUrl()) + { + File tmpFile = File.createTempFile(pdbid, ".cif"); + String fromUrl = strucEntry.getRetrievalUrl(); + UrlDownloadClient.download(fromUrl, tmpFile); + + // may not need this check ? + file = tmpFile.getAbsolutePath(); + if (file != null) + { + pdbseq = EBIAlfaFold.importDownloadedStructureFromUrl(fromUrl,tmpFile,pdbid,null,null,null); + } + } else { + pdbseq = pdbclient.getSequenceRecords(pdbid); + } + } + } catch (OutOfMemoryError oomerror) + { + new OOMWarning("Retrieving PDB id " + pdbid, oomerror); + } catch (Exception ex) + { + ex.printStackTrace(); + errormsgs.append("'").append(pdbid).append("'"); + } finally + { + structureViewer.setProgressMessage( + MessageManager.getString("label.state_completed"), hdl); + } + if (pdbseq != null) + { + // just transfer the file name from the first sequence's first + // PDBEntry + file = new File(pdbseq.getSequenceAt(0).getAllPDBEntries() + .elementAt(0).getFile()).getAbsolutePath(); + getPdbEntry(pi).setFile(file); + files.add(file); + } + else + { + errormsgs.append("'").append(pdbid).append("' "); + } + } + else + { + if (filesInViewer != null && filesInViewer.length > 0) + { + structureViewer.setAddingStructures(true); // already files loaded. + for (int c = 0; c < filesInViewer.length; c++) + { + if (Platform.pathEquals(filesInViewer[c], file)) + { + file = null; + break; + } + } + } + if (file != null) + { + files.add(file); + } + } + } + } catch (OutOfMemoryError oomerror) + { + new OOMWarning("Retrieving PDB files: " + pdbid, oomerror); + } catch (Exception ex) + { + ex.printStackTrace(); + errormsgs.append("When retrieving pdbfiles : current was: '") + .append(pdbid).append("'"); + } + if (errormsgs.length() > 0) + { + JvOptionPane.showInternalMessageDialog(Desktop.desktop, + MessageManager.formatMessage( + "label.pdb_entries_couldnt_be_retrieved", new String[] + { errormsgs.toString() }), + MessageManager.getString("label.couldnt_load_file"), + JvOptionPane.ERROR_MESSAGE); + } + return files; + } + } diff --git a/src/jalview/gui/StructureViewerBase.java b/src/jalview/gui/StructureViewerBase.java index b349559..11bf50f 100644 --- a/src/jalview/gui/StructureViewerBase.java +++ b/src/jalview/gui/StructureViewerBase.java @@ -154,6 +154,15 @@ public abstract class StructureViewerBase extends GStructureViewer { alignAddedStructures = alignAdded; } + + /** + * called by the binding model to indicate when adding structures is happening or has been completed + * @param addingStructures + */ + public synchronized void setAddingStructures(boolean addingStructures) + { + this.addingStructures = addingStructures; + } /** * @@ -1077,7 +1086,7 @@ public abstract class StructureViewerBase extends GStructureViewer progressBar = pi; } - protected void setProgressMessage(String message, long id) + public void setProgressMessage(String message, long id) { if (progressBar != null) { -- 1.7.10.2