X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FStructureViewer.java;h=0c12eb2fdd5b91b2e7bb24d90b08981b15d36775;hb=4b7d3640209c4434d569c746672cf9eed4250ace;hp=a1913c6d4021c144507383170426dddfaf49f344;hpb=cfa72c2cceb390460b4f08c320146bd6910d8484;p=jalview.git diff --git a/src/jalview/gui/StructureViewer.java b/src/jalview/gui/StructureViewer.java index a1913c6..0c12eb2 100644 --- a/src/jalview/gui/StructureViewer.java +++ b/src/jalview/gui/StructureViewer.java @@ -20,14 +20,6 @@ */ package jalview.gui; -import jalview.api.structures.JalviewStructureDisplayI; -import jalview.bin.Cache; -import jalview.datamodel.PDBEntry; -import jalview.datamodel.SequenceI; -import jalview.datamodel.StructureViewerModel; -import jalview.structure.StructureSelectionManager; - -import java.awt.Rectangle; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; @@ -35,25 +27,76 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import jalview.api.structures.JalviewStructureDisplayI; +import jalview.bin.Cache; +import jalview.bin.Console; +import jalview.datamodel.PDBEntry; +import jalview.datamodel.SequenceI; +import jalview.datamodel.StructureViewerModel; +import jalview.structure.StructureSelectionManager; + /** - * proxy for handling structure viewers. - * - * this allows new views to be created with the currently configured viewer, the - * preferred viewer to be set/read and existing views created previously with a - * particular viewer to be recovered + * A proxy for handling structure viewers, that orchestrates adding selected + * structures, associated with sequences in Jalview, to an existing viewer, or + * opening a new one. Currently supports either Jmol or Chimera as the structure + * viewer. * * @author jprocter */ public class StructureViewer { + private static final String UNKNOWN_VIEWER_TYPE = "Unknown structure viewer type "; + StructureSelectionManager ssm; + /** + * decide if new structures are aligned to existing ones + */ + private boolean superposeAdded = true; + public enum ViewerType { - JMOL, CHIMERA + JMOL, CHIMERA, CHIMERAX, PYMOL }; - public ViewerType getViewerType() + /** + * Constructor + * + * @param structureSelectionManager + */ + public StructureViewer( + StructureSelectionManager structureSelectionManager) + { + ssm = structureSelectionManager; + } + + /** + * Factory to create a proxy for modifying existing structure viewer + * + */ + public static StructureViewer reconfigure( + JalviewStructureDisplayI display) + { + StructureViewer sv = new StructureViewer(display.getBinding().getSsm()); + sv.sview = display; + return sv; + } + + @Override + public String toString() + { + if (sview != null) + { + return sview.toString(); + } + return "New View"; + } + + /** + * + * @return ViewerType for currently configured structure viewer + */ + public static ViewerType getViewerType() { String viewType = Cache.getDefault(Preferences.STRUCTURE_DISPLAY, ViewerType.JMOL.name()); @@ -65,24 +108,24 @@ public class StructureViewer Cache.setProperty(Preferences.STRUCTURE_DISPLAY, type.name()); } - public StructureViewer( - StructureSelectionManager structureSelectionManager) - { - ssm = structureSelectionManager; - } - /** * View multiple PDB entries, each with associated sequences * * @param pdbs - * @param seqsForPdbs + * @param seqs * @param ap * @return */ public JalviewStructureDisplayI viewStructures(PDBEntry[] pdbs, - SequenceI[] seqsForPdbs, AlignmentPanel ap) + SequenceI[] seqs, AlignmentPanel ap) { - JalviewStructureDisplayI viewer = onlyOnePdb(pdbs, seqsForPdbs, ap); + return viewStructures(pdbs, seqs, ap, null); + } + + public JalviewStructureDisplayI viewStructures(PDBEntry[] pdbs, + SequenceI[] seqs, AlignmentPanel ap, ViewerType viewerType) + { + JalviewStructureDisplayI viewer = onlyOnePdb(pdbs, seqs, ap); if (viewer != null) { /* @@ -91,33 +134,62 @@ public class StructureViewer return viewer; } - ViewerType viewerType = getViewerType(); + if (viewerType == null) + viewerType = getViewerType(); - // old way: - // PDBEntry[] pdbsForFile = getUniquePdbFiles(pdbs); + Map seqsForPdbs = getSequencesForPdbs(pdbs, + seqs); + PDBEntry[] pdbsForFile = seqsForPdbs.keySet() + .toArray(new PDBEntry[seqsForPdbs.size()]); + SequenceI[][] theSeqs = seqsForPdbs.values() + .toArray(new SequenceI[seqsForPdbs.size()][]); + if (sview != null) + { + sview.setAlignAddedStructures(superposeAdded); + new Thread(new Runnable() + { + @Override + public void run() + { + + for (int pdbep = 0; pdbep < pdbsForFile.length; pdbep++) + { + PDBEntry pdb = pdbsForFile[pdbep]; + if (!sview.addAlreadyLoadedFile(theSeqs[pdbep], null, ap, + pdb.getId())) + { + sview.addToExistingViewer(pdb, theSeqs[pdbep], null, ap, + pdb.getId()); + } + } + + sview.updateTitleAndMenus(); + } + }).start(); + return sview; + } - // new way: - Map seqsForPdb = getSequencesForPdbs(pdbs, - seqsForPdbs); - PDBEntry[] pdbsForFile = seqsForPdb.keySet().toArray( - new PDBEntry[seqsForPdb.size()]); - SequenceI[][] theSeqs = seqsForPdb.values().toArray( - new SequenceI[seqsForPdb.size()][]); - JalviewStructureDisplayI sview = null; if (viewerType.equals(ViewerType.JMOL)) { - sview = new AppJmol(ap, pdbsForFile, theSeqs); - // ap.av.collateForPDB(pdbsForFile)); + sview = new AppJmol(ap, superposeAdded, pdbsForFile, theSeqs); } else if (viewerType.equals(ViewerType.CHIMERA)) { - sview = new ChimeraViewFrame(pdbsForFile, theSeqs, ap); - // ap.av.collateForPDB(pdbsForFile), ap); + sview = new ChimeraViewFrame(pdbsForFile, superposeAdded, theSeqs, + ap); + } + else if (viewerType.equals(ViewerType.CHIMERAX)) + { + sview = new ChimeraXViewFrame(pdbsForFile, superposeAdded, theSeqs, + ap); + } + else if (viewerType.equals(ViewerType.PYMOL)) + { + sview = new PymolViewer(pdbsForFile, superposeAdded, theSeqs, ap); } else { - Cache.log.error("Unknown structure viewer type " - + getViewerType().toString()); + Console.error(UNKNOWN_VIEWER_TYPE + getViewerType().toString()); } return sview; } @@ -132,7 +204,7 @@ public class StructureViewer * @param seqs * @return */ - static Map getSequencesForPdbs(PDBEntry[] pdbs, + Map getSequencesForPdbs(PDBEntry[] pdbs, SequenceI[] seqs) { if (pdbs == null || seqs == null || pdbs.length != seqs.length) @@ -156,6 +228,10 @@ public class StructureViewer PDBEntry pdb = pdbs[i]; SequenceI seq = seqs[i]; String pdbFile = pdb.getFile(); + if (pdbFile == null || pdbFile.length() == 0) + { + pdbFile = pdb.getId(); + } if (!pdbsSeen.containsKey(pdbFile)) { pdbsSeen.put(pdbFile, pdb); @@ -201,7 +277,7 @@ public class StructureViewer private JalviewStructureDisplayI onlyOnePdb(PDBEntry[] pdbs, SequenceI[] seqsForPdbs, AlignmentPanel ap) { - List seqs = new ArrayList(); + List seqs = new ArrayList<>(); if (pdbs == null || pdbs.length == 0) { return null; @@ -225,11 +301,31 @@ public class StructureViewer ap); } + JalviewStructureDisplayI sview = null; + public JalviewStructureDisplayI viewStructures(PDBEntry pdb, SequenceI[] seqsForPdb, AlignmentPanel ap) { - ViewerType viewerType = getViewerType(); - JalviewStructureDisplayI sview = null; + return viewStructures(pdb, seqsForPdb, ap, null); + } + + public JalviewStructureDisplayI viewStructures(PDBEntry pdb, + SequenceI[] seqsForPdb, AlignmentPanel ap, ViewerType viewerType) + { + if (sview != null) + { + sview.setAlignAddedStructures(superposeAdded); + String pdbId = pdb.getId(); + if (!sview.addAlreadyLoadedFile(seqsForPdb, null, ap, pdbId)) + { + sview.addToExistingViewer(pdb, seqsForPdb, null, ap, pdbId); + } + sview.updateTitleAndMenus(); + sview.raiseViewer(); + return sview; + } + if (viewerType == null) + viewerType = getViewerType(); if (viewerType.equals(ViewerType.JMOL)) { sview = new AppJmol(pdb, seqsForPdb, null, ap); @@ -238,52 +334,94 @@ public class StructureViewer { sview = new ChimeraViewFrame(pdb, seqsForPdb, null, ap); } + else if (viewerType.equals(ViewerType.CHIMERAX)) + { + sview = new ChimeraXViewFrame(pdb, seqsForPdb, null, ap); + } + else if (viewerType.equals(ViewerType.PYMOL)) + { + sview = new PymolViewer(pdb, seqsForPdb, null, ap); + } else { - Cache.log.error("Unknown structure viewer type " - + getViewerType().toString()); + Console.error(UNKNOWN_VIEWER_TYPE + getViewerType().toString()); } return sview; } /** - * Create a new panel controlling a structure viewer. + * Creates a new panel controlling a structure viewer * * @param type - * @param pdbf - * @param id - * @param sq * @param alignPanel * @param viewerData - * @param fileloc - * @param rect + * @param sessionFile * @param vid * @return */ - public JalviewStructureDisplayI createView(ViewerType type, String[] pdbf, - String[] id, SequenceI[][] sq, AlignmentPanel alignPanel, - StructureViewerModel viewerData, String fileloc, Rectangle rect, - String vid) + public static JalviewStructureDisplayI createView(ViewerType type, + AlignmentPanel alignPanel, StructureViewerModel viewerData, + String sessionFile, String vid) { - final boolean useinViewerSuperpos = viewerData.isAlignWithPanel(); - final boolean usetoColourbyseq = viewerData.isColourWithAlignPanel(); - final boolean viewerColouring = viewerData.isColourByViewer(); - - JalviewStructureDisplayI sview = null; + JalviewStructureDisplayI viewer = null; switch (type) { case JMOL: - sview = new AppJmol(pdbf, id, sq, alignPanel, usetoColourbyseq, - useinViewerSuperpos, viewerColouring, fileloc, rect, vid); + viewer = new AppJmol(viewerData, alignPanel, sessionFile, vid); + // todo or construct and then openSession(sessionFile)? break; case CHIMERA: - Cache.log.error( - "Unsupported structure viewer type " + type.toString()); + viewer = new ChimeraViewFrame(viewerData, alignPanel, sessionFile, + vid); + break; + case CHIMERAX: + viewer = new ChimeraXViewFrame(viewerData, alignPanel, sessionFile, + vid); + break; + case PYMOL: + viewer = new PymolViewer(viewerData, alignPanel, sessionFile, vid); break; default: - Cache.log.error("Unknown structure viewer type " + type.toString()); + Console.error(UNKNOWN_VIEWER_TYPE + type.toString()); } - return sview; + return viewer; + } + + public boolean isBusy() + { + if (sview != null) + { + if (!sview.hasMapping()) + { + return true; + } + } + return false; + } + + /** + * + * @param pDBid + * @return true if view is already showing PDBid + */ + public boolean hasPdbId(String pDBid) + { + if (sview == null) + { + return false; + } + + return sview.getBinding().hasPdbId(pDBid); + } + + public boolean isVisible() + { + return sview != null && sview.isVisible(); + } + + public void setSuperpose(boolean alignAddedStructures) + { + superposeAdded = alignAddedStructures; } }