X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fstructures%2Fmodels%2FAAStructureBindingModel.java;h=55955a8b1b94494f87016642ab54af5d2d49f234;hb=39c97de2f7b8ef87b42f121f37d4f158d1651fe9;hp=f1f2d307d4014f0a1424017e5a84a470d0561c6b;hpb=05e40b4dd4e216024024fb921d797917d74daa76;p=jalview.git diff --git a/src/jalview/structures/models/AAStructureBindingModel.java b/src/jalview/structures/models/AAStructureBindingModel.java index f1f2d30..55955a8 100644 --- a/src/jalview/structures/models/AAStructureBindingModel.java +++ b/src/jalview/structures/models/AAStructureBindingModel.java @@ -20,17 +20,17 @@ */ package jalview.structures.models; -import java.util.Locale; - import java.awt.Color; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.BitSet; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import javax.swing.SwingUtilities; @@ -41,8 +41,9 @@ import jalview.api.FeatureRenderer; import jalview.api.SequenceRenderer; import jalview.api.StructureSelectionManagerProvider; import jalview.api.structures.JalviewStructureDisplayI; -import jalview.bin.Cache; +import jalview.bin.Console; import jalview.datamodel.AlignmentI; +import jalview.datamodel.ColumnSelection; import jalview.datamodel.HiddenColumns; import jalview.datamodel.MappedFeatures; import jalview.datamodel.PDBEntry; @@ -61,6 +62,7 @@ import jalview.structure.AtomSpec; import jalview.structure.AtomSpecModel; import jalview.structure.StructureCommandI; import jalview.structure.StructureCommandsI; +import jalview.structure.StructureCommandsI.AtomSpecType; import jalview.structure.StructureListener; import jalview.structure.StructureMapping; import jalview.structure.StructureSelectionManager; @@ -69,9 +71,9 @@ import jalview.util.MessageManager; /** * - * A base class to hold common function for 3D structure model binding. - * Initial version created by refactoring JMol and Chimera binding models, but - * other structure viewers could in principle be accommodated in future. + * A base class to hold common function for 3D structure model binding. Initial + * version created by refactoring JMol and Chimera binding models, but other + * structure viewers could in principle be accommodated in future. * * @author gmcarstairs * @@ -91,6 +93,9 @@ public abstract class AAStructureBindingModel public String chain = ""; + /** + * is the mapped sequence not protein ? + */ public boolean isRna; /* @@ -167,6 +172,9 @@ public abstract class AAStructureBindingModel protected boolean colourBySequence = true; + /** + * true if all sequences appear to be nucleotide + */ private boolean nucleotide; private boolean finishedInit = false; @@ -584,7 +592,6 @@ public abstract class AAStructureBindingModel } } } - @Override public abstract void highlightAtoms(List atoms); @@ -716,7 +723,7 @@ public abstract class AAStructureBindingModel structures[pdbfnum].chain = chain; } structures[pdbfnum].pdbId = mapping.getPdbId(); - structures[pdbfnum].isRna = theSequence.getRNA() != null; + structures[pdbfnum].isRna = !theSequence.isProtein(); /* * move on to next pdb file (ignore sequences for other chains @@ -774,7 +781,7 @@ public abstract class AAStructureBindingModel if (waiting) { - System.err.println( + jalview.bin.Console.errPrintln( "Timed out waiting for structure viewer to load file " + notLoaded); return false; @@ -865,21 +872,32 @@ public abstract class AAStructureBindingModel { AlignmentI alignment = view.getAlignment(); HiddenColumns hiddenCols = alignment.getHiddenColumns(); - /* * 'matched' bit i will be set for visible alignment columns i where * all sequences have a residue with a mapping to their PDB structure */ - BitSet matched = new BitSet(); final int width = alignment.getWidth(); - for (int m = 0; m < width; m++) + BitSet matched = new BitSet(); + ColumnSelection cs = view.getAlignViewport().getColumnSelection(); + // restrict to active column selection, if there is one + if (cs != null && cs.hasSelectedColumns() + && cs.getSelected().size() >= 4) { - if (hiddenCols == null || hiddenCols.isVisible(m)) + for (int s : cs.getSelected()) { - matched.set(m); + matched.set(s); + } + } + else + { + for (int m = 0; m < width; m++) + { + if (hiddenCols == null || hiddenCols.isVisible(m)) + { + matched.set(m); + } } } - AAStructureBindingModel.SuperposeData[] structures = new AAStructureBindingModel.SuperposeData[files.length]; for (int f = 0; f < files.length; f++) { @@ -919,6 +937,11 @@ public abstract class AAStructureBindingModel // todo better way to ensure synchronous than setting getReply true!! executeCommands(commandGenerator.showBackbone(), true, null); + AtomSpecType backbone = structures[refStructure].isRna + ? AtomSpecType.PHOSPHATE + : AtomSpecType.ALPHA; + List models = new ArrayList(); + models.add(refAtoms); /* * superpose each (other) structure to the reference in turn */ @@ -928,20 +951,27 @@ public abstract class AAStructureBindingModel { AtomSpecModel atomSpec = getAtomSpec(structures[i], matched); List commands = commandGenerator - .superposeStructures(refAtoms, atomSpec); + .superposeStructures(refAtoms, atomSpec, backbone); List replies = executeCommands(commands, true, null); for (String reply : replies) { // return this error (Chimera only) to the user - if (reply.toLowerCase(Locale.ROOT).contains("unequal numbers of atoms")) + if (reply.toLowerCase(Locale.ROOT) + .contains("unequal numbers of atoms")) { error += "; " + reply; } } + models.add(atomSpec); } } + List finalView = commandGenerator + .centerViewOn(models); + if (finalView != null && finalView.size() > 0) + { + executeCommands(finalView, false, "Centered on Superposition"); + } } - return error; } @@ -1062,7 +1092,7 @@ public abstract class AAStructureBindingModel * @param getReply * @param msg */ - protected List executeCommands(List commands, + public List executeCommands(List commands, boolean getReply, String msg) { return executeCommand(getReply, msg, @@ -1270,6 +1300,12 @@ public abstract class AAStructureBindingModel @Override public void updateColours(Object source) { + if (getViewer() == null) + { + // can happen if a viewer was not instantiated or cleaned up and is still + // registered - mostly during tests + return; + } AlignmentViewPanel ap = (AlignmentViewPanel) source; // ignore events from panels not used to colour this view if (!getViewer().isUsedForColourBy(ap)) @@ -1497,13 +1533,38 @@ public abstract class AAStructureBindingModel saveSession(f); } catch (IOException e) { - Cache.log.error(String.format("Error saving %s session: %s", prefix, + Console.error(String.format("Error saving %s session: %s", prefix, e.toString())); } return f; } + + /** + * Use restoreSession when you want to restore a previously saved sesssion to + * the running viewer instance. + * + * @param absolutePath + */ + public void restoreSession(String absolutePath) + { + String prefix = getViewerType().toString(); + try { + + StructureCommandI cmd = commandGenerator.restoreSession(absolutePath); + if (cmd != null) + { + executeCommand(cmd, false); + } + } catch (Throwable e) + { + Console.error(String.format("Error restoring %s session: %s", prefix, + e.toString())); + } + + } + /** * Saves the structure viewer session to the given file * @@ -1946,4 +2007,18 @@ public abstract class AAStructureBindingModel { return 0; } + + public List getHetatmNames() { + return Collections.EMPTY_LIST; + } + /** + * Generates and executes a command to show the given hetatm types as CPK + * + * @param toShow - one or more of strings from getHetatmNames + */ + public void showHetatms(List toShow) + { + executeCommands(commandGenerator.showHetatms(toShow), false, "Adjusting hetatm visibility"); + } + }