X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FPymolBindingModel.java;h=62dce240cd759bb47463cadc47022a8814c6477b;hb=cd669a0e8c7b91b379bca8fe6e702cf0fcbd1ce0;hp=6787c8ab2ccee1a4381c4d9a1ee1459b49fda8b2;hpb=1dd1e3cd8272449af3fe4dfa3f69239ca4ae471b;p=jalview.git diff --git a/src/jalview/gui/PymolBindingModel.java b/src/jalview/gui/PymolBindingModel.java index 6787c8a..62dce24 100644 --- a/src/jalview/gui/PymolBindingModel.java +++ b/src/jalview/gui/PymolBindingModel.java @@ -1,3 +1,23 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.gui; import java.util.ArrayList; @@ -6,21 +26,29 @@ import java.util.List; import java.util.Map; import jalview.api.AlignmentViewPanel; +import jalview.bin.Console; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; import jalview.ext.pymol.PymolCommands; import jalview.ext.pymol.PymolManager; import jalview.gui.StructureViewer.ViewerType; import jalview.structure.AtomSpec; +import jalview.structure.AtomSpecModel; +import jalview.structure.StructureCommand; import jalview.structure.StructureCommandI; import jalview.structure.StructureSelectionManager; import jalview.structures.models.AAStructureBindingModel; public class PymolBindingModel extends AAStructureBindingModel { - private PymolManager pymolManager; + /* + * format for labels shown on structures when mousing over sequence; + * see https://pymolwiki.org/index.php/Label#examples + * left not final so customisable e.g. with a Groovy script + */ + private static String LABEL_FORMAT = "\"%s %s\" % (resn,resi)"; - private Thread pymolMonitor; + private PymolManager pymolManager; /* * full paths to structure files opened in PyMOL @@ -32,6 +60,8 @@ public class PymolBindingModel extends AAStructureBindingModel */ Map pymolObjects = new HashMap<>(); + private String lastLabelSpec; + /** * Constructor * @@ -59,20 +89,39 @@ public class PymolBindingModel extends AAStructureBindingModel @Override public void highlightAtoms(List atoms) { + /* + * https://pymolwiki.org/index.php/indicate#examples + */ + StringBuilder sb = new StringBuilder(); + for (AtomSpec atom : atoms) + { + // todo promote to StructureCommandsI.showLabel() + String modelId = getModelIdForFile(atom.getPdbFile()); + sb.append(String.format(" %s//%s/%d/*", modelId, atom.getChain(), + atom.getPdbResNum())); + } + String labelSpec = sb.toString(); + if (labelSpec.equals(lastLabelSpec)) + { + return; + } + StructureCommandI command = new StructureCommand("indicate", labelSpec); + executeCommand(command, false); + + lastLabelSpec = labelSpec; } @Override - public SequenceRenderer getSequenceRenderer(AlignmentViewPanel alignment) + public SequenceRenderer getSequenceRenderer(AlignmentViewPanel avp) { - // pull up? - return new SequenceRenderer(alignment.getAlignViewport()); + return new SequenceRenderer(avp.getAlignViewport()); } @Override protected List executeCommand(StructureCommandI command, boolean getReply) { - // System.out.println(command.toString()); // debug + // jalview.bin.Console.outPrintln(command.toString()); // debug return pymolManager.sendCommand(command, getReply); } @@ -88,33 +137,17 @@ public class PymolBindingModel extends AAStructureBindingModel return ViewerType.PYMOL; } - public boolean isPymolRunning() + @Override + public boolean isViewerRunning() { - return pymolManager.isPymolLaunched(); + return pymolManager != null && pymolManager.isPymolLaunched(); } + @Override public void closeViewer(boolean closePymol) { - getSsm().removeStructureViewerListener(this, this.getStructureFiles()); - if (closePymol) - { - pymolManager.exitPymol(); - } + super.closeViewer(closePymol); pymolManager = null; - - if (pymolMonitor != null) - { - pymolMonitor.interrupt(); - } - releaseUIResources(); - } - - public boolean openSession(String pymolSessionFile) - { - StructureCommandI cmd = getCommandGenerator() - .loadFile(pymolSessionFile); - executeCommand(cmd, false); - return true; } public boolean launchPymol() @@ -124,16 +157,17 @@ public class PymolBindingModel extends AAStructureBindingModel return true; } - boolean launched = pymolManager.launchPymol(); - if (launched) + Process pymol = pymolManager.launchPymol(); + if (pymol != null) { // start listening for PyMOL selections - how?? + startExternalViewerMonitor(pymol); } else { - System.err.println("Failed to launch PyMOL!"); + Console.error("Failed to launch PyMOL!"); } - return launched; + return pymol != null; } public void openFile(PDBEntry pe) @@ -146,6 +180,22 @@ public class PymolBindingModel extends AAStructureBindingModel * a second parameter sets the pdbid as the loaded PyMOL object name */ String pdbId = pe.getId(); + try + { + String safePDBId = java.net.URLEncoder.encode(pdbId, "UTF-8"); + pdbId = safePDBId.replace('%', '_'); + pdbId = pdbId.replace("-", "__"); + char fc = pdbId.charAt(0); + // put an 's' before any numerics + if (fc >= '0' && fc <= '9') + { + pdbId = 's' + pdbId; + } + // pdbId.replace('-', 0) + } catch (Exception x) + { + Console.error("Unxpected encoding exception for '" + pdbId + "'", x); + } cmd.addParameter(pdbId); executeCommand(cmd, false); @@ -180,4 +230,28 @@ public class PymolBindingModel extends AAStructureBindingModel return ".pse"; } + @Override + public String getHelpURL() + { + return "https://pymolwiki.org/"; + } + + /** + * Constructs and sends commands to set atom properties for visible Jalview + * features on residues mapped to structure + * + * @param avp + * @return + */ + public int sendFeaturesToViewer(AlignmentViewPanel avp) + { + // todo pull up this and JalviewChimeraBinding variant + Map> featureValues = buildFeaturesMap( + avp); + List commands = getCommandGenerator() + .setAttributes(featureValues); + executeCommands(commands, false, null); + return commands.size(); + } + }