From 23e1ca45f5adac64d191f1e3e7d4d64ae52eaa03 Mon Sep 17 00:00:00 2001 From: gmungoc Date: Mon, 7 Nov 2016 10:58:24 +0000 Subject: [PATCH] JAL-2295 (unoptimised) write Jalview features as Chimera attributes --- resources/lang/Messages.properties | 2 + .../ext/rbvi/chimera/JalviewChimeraBinding.java | 86 ++++++++++++++++++++ src/jalview/gui/ChimeraViewFrame.java | 17 ++-- 3 files changed, 100 insertions(+), 5 deletions(-) diff --git a/resources/lang/Messages.properties b/resources/lang/Messages.properties index 864e34a..bd8f63a 100644 --- a/resources/lang/Messages.properties +++ b/resources/lang/Messages.properties @@ -714,6 +714,8 @@ label.colour_with_chimera = Colour with Chimera label.align_structures = Align Structures label.jmol = Jmol label.chimera = Chimera +label.create_chimera_attributes = Write Jalview features +label.create_chimera_attributes_tip = Set Chimera residue attributes for visible features label.sort_alignment_by_tree = Sort Alignment By Tree label.mark_unlinked_leaves = Mark Unlinked Leaves label.associate_leaves_with = Associate Leaves With diff --git a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java index 7ba9186..2534421 100644 --- a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java +++ b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java @@ -27,14 +27,17 @@ import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.datamodel.ColumnSelection; import jalview.datamodel.PDBEntry; +import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.httpserver.AbstractRequestHandler; import jalview.schemes.ColourSchemeI; import jalview.schemes.ResidueProperties; import jalview.structure.AtomSpec; +import jalview.structure.StructureMapping; import jalview.structure.StructureMappingcommandSet; import jalview.structure.StructureSelectionManager; import jalview.structures.models.AAStructureBindingModel; +import jalview.util.Comparison; import jalview.util.MessageManager; import java.awt.Color; @@ -1125,4 +1128,87 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel sm.highlightStructure(this, seq, positions); } } + + /** + * Constructs and send commands to Chimera to set attributes on residues for + * features visible in Jalview + * + * @param avp + */ + public void sendFeaturesToChimera(AlignmentViewPanel avp) + { + // TODO send a command per feature with the range of residues it applies to + AlignmentI alignment = avp.getAlignment(); + FeatureRenderer fr = getFeatureRenderer(avp); + + /* + * fr is null if feature display is turned off + */ + if (fr == null) + { + return; + } + + String[] files = getPdbFile(); + if (files == null) + { + return; + } + for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++) + { + StructureMapping[] mapping = getSsm().getMapping(files[pdbfnum]); + + if (mapping == null || mapping.length < 1) + { + continue; + } + + int lastPos = -1; + for (int seqNo = 0; seqNo < getSequence()[pdbfnum].length; seqNo++) + { + for (int m = 0; m < mapping.length; m++) + { + final SequenceI seq = getSequence()[pdbfnum][seqNo]; + int sp = alignment.findIndex(seq); + if (mapping[m].getSequence() == seq && sp > -1) + { + SequenceI asp = alignment.getSequenceAt(sp); + for (int r = 0; r < asp.getLength(); r++) + { + // no mapping to gaps in sequence + if (Comparison.isGap(asp.getCharAt(r))) + { + continue; + } + int residuePos = asp.findPosition(r); + int pos = mapping[m].getPDBResNum(residuePos); + + if (pos < 1 || pos == lastPos) + { + continue; + } + final String chain = mapping[m].getChain(); + List features = fr.findFeaturesAtRes(asp, + residuePos); + for (SequenceFeature feature : features) + { + String desc = feature.getDescription(); + float score = feature.getScore(); + if (score != 0 && score != Float.NaN) + { + desc = Float.toString(score); + } + String attName = "jv:" + + feature.getType().replace(" ", "_"); + String cmd = "setattr r " + attName + " \"" + + desc + "\" #" + pdbfnum + ":" + pos + "." + chain; + System.out.println(cmd); + sendAsynchronousCommand(cmd, null); + } + } + } + } + } + } + } } diff --git a/src/jalview/gui/ChimeraViewFrame.java b/src/jalview/gui/ChimeraViewFrame.java index b9fb2c9..ae3ff9e 100644 --- a/src/jalview/gui/ChimeraViewFrame.java +++ b/src/jalview/gui/ChimeraViewFrame.java @@ -181,9 +181,10 @@ public class ChimeraViewFrame extends StructureViewerBase // TODO Auto-generated method stub } }); - JMenuItem writeFeatures = new JMenuItem("Write Jalview features"); - writeFeatures - .setToolTipText("Create attributes in Chimera for features in Jalview"); + JMenuItem writeFeatures = new JMenuItem( + MessageManager.getString("label.create_chimera_attributes")); + writeFeatures.setToolTipText(MessageManager + .getString("label.create_chimera_attributes_tip")); writeFeatures.addActionListener(new ActionListener() { @Override @@ -195,10 +196,16 @@ public class ChimeraViewFrame extends StructureViewerBase viewerActionMenu.add(writeFeatures); } + /** + * Send a command to Chimera to create residue attributes for Jalview features + *

+ * The syntax is: setattr r + *

+ * For example: setattr r jv:chain "Ferredoxin-1, Chloroplastic" #0:94.A + */ protected void sendFeaturesToChimera() { - // TODO Auto-generated method stub - + jmb.sendFeaturesToChimera(getAlignmentPanel()); } /** -- 1.7.10.2