X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fpymol%2FPymolCommands.java;h=b8b6a98af71dc10e523b84cb7abfb47fc254e4cb;hb=d654b1f014790b7ae25e6eec631847170a930987;hp=115efa15f7408d0f4ed070020e36824537acf608;hpb=1dd1e3cd8272449af3fe4dfa3f69239ca4ae471b;p=jalview.git diff --git a/src/jalview/ext/pymol/PymolCommands.java b/src/jalview/ext/pymol/PymolCommands.java index 115efa1..b8b6a98 100644 --- a/src/jalview/ext/pymol/PymolCommands.java +++ b/src/jalview/ext/pymol/PymolCommands.java @@ -1,8 +1,30 @@ +/* + * 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.ext.pymol; import java.awt.Color; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Map; import jalview.structure.AtomSpecModel; import jalview.structure.StructureCommand; @@ -21,23 +43,31 @@ import jalview.structure.StructureCommandsBase; */ public class PymolCommands extends StructureCommandsBase { - private static final StructureCommand COLOUR_BY_CHAIN = new StructureCommand("spectrum", "chain"); + // https://pymol.org/dokuwiki/doku.php?id=command:zoom + // not currently documented on + // https://pymolwiki.org/index.php/Category:Commands + private static final StructureCommand FOCUS_VIEW = new StructureCommand( + "zoom"); - private static final List COLOR_BY_CHARGE = new ArrayList<>(); + // https://pymolwiki.org/index.php/Quit + private static final StructureCommand CLOSE_PYMOL = new StructureCommand( + "quit"); - private static final List SHOW_BACKBONE = new ArrayList<>(); + // not currently documented on + // https://pymolwiki.org/index.php/Category:Commands + private static final StructureCommand COLOUR_BY_CHAIN = new StructureCommand( + "spectrum", "chain"); - static { - COLOR_BY_CHARGE.add(new StructureCommand("color", "white", "*")); - COLOR_BY_CHARGE - .add(new StructureCommand("color", "red", "resn ASP resn GLU")); - COLOR_BY_CHARGE.add( - new StructureCommand("color", "blue", "resn LYS resn ARG")); - COLOR_BY_CHARGE - .add(new StructureCommand("color", "yellow", "resn CYS")); - SHOW_BACKBONE.add(new StructureCommand("hide", "everything")); - SHOW_BACKBONE.add(new StructureCommand("show", "ribbon")); - } + private static final List COLOR_BY_CHARGE = Arrays + .asList(new StructureCommand("color", "white", "*"), + new StructureCommand("color", "red", "resn ASP resn GLU"), + new StructureCommand("color", "blue", + "resn LYS resn ARG"), + new StructureCommand("color", "yellow", "resn CYS")); + + private static final List SHOW_BACKBONE = Arrays + .asList(new StructureCommand("hide", "everything"), + new StructureCommand("show", "ribbon")); @Override public StructureCommandI colourByChain() @@ -74,8 +104,7 @@ public class PymolCommands extends StructureCommandsBase @Override public StructureCommandI focusView() { - // TODO what? - return null; + return FOCUS_VIEW; } @Override @@ -90,26 +119,34 @@ public class PymolCommands extends StructureCommandsBase { chains.append(" chain ").append(chain); } - commands.add(new StructureCommand("show", "cartoon", chains.toString())); + commands.add( + new StructureCommand("show", "cartoon", chains.toString())); return commands; } @Override public List superposeStructures(AtomSpecModel refAtoms, - AtomSpecModel atomSpec) + AtomSpecModel atomSpec, AtomSpecType specType) { + // https://pymolwiki.org/index.php/Super List commands = new ArrayList<>(); - String refAtomsAlphaOnly = getAtomSpec(refAtoms, true); - String atomSpec2AlphaOnly = getAtomSpec(atomSpec, true); - commands.add(new StructureCommand("super", refAtomsAlphaOnly, - atomSpec2AlphaOnly)); + String refAtomsAlphaOnly = "(" + getAtomSpec(refAtoms, specType) + + " and (altloc '' or altloc 'a'))"; + String atomSpec2AlphaOnly = "(" + getAtomSpec(atomSpec, specType) + + " and (altloc '' or altloc 'a'))"; + // pair_fit mobile -> reference + // crashes when undo is enabled on 2.5.2 (incentive) + commands.add(new StructureCommand("undo_disable")); + commands.add(new StructureCommand("pair_fit", atomSpec2AlphaOnly, + refAtomsAlphaOnly)); + commands.add(new StructureCommand("undo_enable")); /* * and show superposed residues as cartoon */ - String refAtomsAll = getAtomSpec(refAtoms, false); - String atomSpec2All = getAtomSpec(atomSpec, false); + String refAtomsAll = getAtomSpec(refAtoms, AtomSpecType.RESIDUE_ONLY); + String atomSpec2All = getAtomSpec(atomSpec, AtomSpecType.RESIDUE_ONLY); commands.add(new StructureCommand("show", "cartoon", refAtomsAll + " " + atomSpec2All)); @@ -143,7 +180,7 @@ public class PymolCommands extends StructureCommandsBase * @see https://pymolwiki.org/index.php/Selection_Macros */ @Override - public String getAtomSpec(AtomSpecModel model, boolean alphaOnly) + public String getAtomSpec(AtomSpecModel model, AtomSpecType specType) { StringBuilder sb = new StringBuilder(64); boolean first = true; @@ -174,10 +211,14 @@ public class PymolCommands extends StructureCommandsBase } } sb.append("/"); - if (alphaOnly) + if (specType == AtomSpecType.ALPHA) { sb.append("CA"); } + if (specType == AtomSpecType.PHOSPHATE) + { + sb.append("P"); + } } } return sb.toString(); @@ -190,7 +231,7 @@ public class PymolCommands extends StructureCommandsBase } @Override - protected StructureCommandI getColourCommand(String atomSpec, Color colour) + protected StructureCommandI colourResidues(String atomSpec, Color colour) { // https://pymolwiki.org/index.php/Color return new StructureCommand("color", getColourString(colour), atomSpec); @@ -209,4 +250,117 @@ public class PymolCommands extends StructureCommandsBase return new StructureCommand("load", file); } + /** + * Overrides the default implementation (which generates concatenated + * commands) to generate one per colour (because the XML-RPC interface to + * PyMOL only accepts one command at a time) + * + * @param colourMap + * @return + */ + @Override + public List colourBySequence( + Map colourMap) + { + List commands = new ArrayList<>(); + for (Object key : colourMap.keySet()) + { + Color colour = (Color) key; + final AtomSpecModel colourData = colourMap.get(colour); + commands.add(getColourCommand(colourData, colour)); + } + + return commands; + } + + /** + * Returns a viewer command to set the given atom property value on atoms + * specified by the AtomSpecModel, for example + * + *
+   * iterate 4zho//B/12-34,48-55/CA,jv_chain='primary'
+   * 
+ * + * @param attributeName + * @param attributeValue + * @param atomSpecModel + * @return + */ + protected StructureCommandI setAttribute(String attributeName, + String attributeValue, AtomSpecModel atomSpecModel) + { + StringBuilder sb = new StringBuilder(128); + sb.append("p.").append(attributeName).append("='") + .append(attributeValue).append("'"); + String atomSpec = getAtomSpec(atomSpecModel, AtomSpecType.RESIDUE_ONLY); + return new StructureCommand("iterate", atomSpec, sb.toString()); + } + + /** + * Traverse the map of features/values/models/chains/positions to construct a + * list of 'set property' commands (one per distinct feature type and value). + * The values are stored in the 'p' dictionary of user-defined properties of + * each atom. + *

+ * The format of each command is + * + *

+   * 
iterate atomspec, p.featureName='value' + * e.g. iterate 4zho//A/23,28-29/CA, p.jv_Metal='Fe' + *
+ *
+ * + * @param featureMap + * @return + */ + @Override + public List setAttributes( + Map> featureMap) + { + List commands = new ArrayList<>(); + for (String featureType : featureMap.keySet()) + { + String attributeName = makeAttributeName(featureType); + + /* + * todo: clear down existing attributes for this feature? + */ + // commands.add(new StructureCommand("iterate", "all", + // "p."+attributeName+"='None'"); //? + + Map values = featureMap.get(featureType); + for (Object value : values.keySet()) + { + /* + * for each distinct value recorded for this feature type, + * add a command to set the attribute on the mapped residues + * Put values in single quotes, encoding any embedded single quotes + */ + AtomSpecModel atomSpecModel = values.get(value); + String featureValue = value.toString(); + featureValue = featureValue.replaceAll("\\'", "'"); + StructureCommandI cmd = setAttribute(attributeName, featureValue, + atomSpecModel); + commands.add(cmd); + } + } + + return commands; + } + + @Override + public StructureCommandI openSession(String filepath) + { + // https://pymolwiki.org/index.php/Load + // this version of the command has no dependency on file extension + return new StructureCommand("load", filepath, "", "0", "pse"); + } + + @Override + public StructureCommandI closeViewer() + { + // https://pymolwiki.org/index.php/Quit + return CLOSE_PYMOL; + } + }