From 6905363d02254a557f93f66a2b69d85aa0b23696 Mon Sep 17 00:00:00 2001 From: amwaterhouse Date: Tue, 27 Feb 2007 13:38:21 +0000 Subject: [PATCH] Structure listener --- src/jalview/structure/SequenceListener.java | 30 ++ src/jalview/structure/StructureListener.java | 30 ++ src/jalview/structure/StructureMapping.java | 100 ++++++ .../structure/StructureSelectionManager.java | 350 ++++++++++++++++++++ 4 files changed, 510 insertions(+) create mode 100644 src/jalview/structure/SequenceListener.java create mode 100644 src/jalview/structure/StructureListener.java create mode 100644 src/jalview/structure/StructureMapping.java create mode 100644 src/jalview/structure/StructureSelectionManager.java diff --git a/src/jalview/structure/SequenceListener.java b/src/jalview/structure/SequenceListener.java new file mode 100644 index 0000000..b4eefd6 --- /dev/null +++ b/src/jalview/structure/SequenceListener.java @@ -0,0 +1,30 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package jalview.structure; + +import jalview.datamodel.*; + +public interface SequenceListener +{ + public void mouseOverSequence(SequenceI sequence, int index); + + public void highlightSequence(jalview.datamodel.SequenceI seq, int index); + + public void updateColours(SequenceI sequence, int index); +} diff --git a/src/jalview/structure/StructureListener.java b/src/jalview/structure/StructureListener.java new file mode 100644 index 0000000..0d7819e --- /dev/null +++ b/src/jalview/structure/StructureListener.java @@ -0,0 +1,30 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package jalview.structure; + +public interface StructureListener +{ + public String getPdbFile(); + + public void mouseOverStructure(int atomIndex, String strInfo); + + public void highlightAtom(int atomIndex, int pdbResNum, String chain, String pdbId); + + public void updateColours(Object source); +} diff --git a/src/jalview/structure/StructureMapping.java b/src/jalview/structure/StructureMapping.java new file mode 100644 index 0000000..06e6bc3 --- /dev/null +++ b/src/jalview/structure/StructureMapping.java @@ -0,0 +1,100 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +package jalview.structure; + +import jalview.datamodel.*; + +public class StructureMapping +{ + String mappingDetails; + SequenceI sequence; + String pdbfile; + String pdbid; + String pdbchain; + + //Mapping index 0 is resNum, index 1 is atomNo + int[][] mapping; + + public StructureMapping(SequenceI seq, + String pdbfile, + String pdbid, + String chain, + int[][] mapping, + String mappingDetails) + { + sequence = seq; + this.pdbfile = pdbfile; + this.pdbid = pdbid; + this.pdbchain = chain; + this.mapping = mapping; + this.mappingDetails = mappingDetails; + } + + public SequenceI getSequence() + { + return sequence; + } + + public String getChain() + { + return pdbchain; + } + + public String getPdbId() + { + return pdbid; + } + + public int getAtomNum(int seqpos) + { + if (mapping.length > seqpos) + { + return mapping[seqpos][1]; + } + else + { + return 0; + } + } + + public int getPDBResNum(int seqpos) + { + if (mapping.length > seqpos) + { + return mapping[seqpos][0]; + } + else + { + return 0; + } + } + + public int getSeqPos(int pdbResNum) + { + for (int i = 0; i < mapping.length; i++) + { + if (mapping[i][0] == pdbResNum) + { + return i; + } + } + return -1; + } +} diff --git a/src/jalview/structure/StructureSelectionManager.java b/src/jalview/structure/StructureSelectionManager.java new file mode 100644 index 0000000..b4e63f4 --- /dev/null +++ b/src/jalview/structure/StructureSelectionManager.java @@ -0,0 +1,350 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package jalview.structure; + +import java.io.*; +import java.util.*; + +import MCview.*; +import jalview.analysis.*; +import jalview.datamodel.*; + +public class StructureSelectionManager +{ + static StructureSelectionManager instance; + StructureMapping[] mappings; + Hashtable mappingData = new Hashtable(); + + public static StructureSelectionManager getStructureSelectionManager() + { + if (instance == null) + { + instance = new StructureSelectionManager(); + } + + return instance; + } + + Vector listeners = new Vector(); + public void addStructureViewerListener(Object svl) + { + if (!listeners.contains(svl)) + { + listeners.addElement(svl); + } + } + + public String alreadyMappedToFile(String pdbid) + { + if (mappings != null) + { + for (int i = 0; i < mappings.length; i++) + { + if (mappings[i].getPdbId().equals(pdbid)) + { + return mappings[i].pdbfile; + } + } + } + return null; + } + + /* + There will be better ways of doing this in the future, for now we'll use + the tried and tested MCview pdb mapping + */ + public MCview.PDBfile setMapping(SequenceI[] sequence, + String pdbFile, + String protocol) + { + MCview.PDBfile pdb = null; + try + { + pdb = new MCview.PDBfile(pdbFile, protocol); + } + catch (Exception ex) + { + ex.printStackTrace(); + return null; + } + + for (int s = 0; s < sequence.length; s++) + { + String targetChain = ""; + + if (sequence[s].getName().indexOf("|") > -1) + { + targetChain = sequence[s].getName().substring( + sequence[s].getName().lastIndexOf("|") + 1); + } + + int max = -10; + AlignSeq maxAlignseq = null; + String maxChainId = " "; + PDBChain maxChain = null; + + for (int i = 0; i < pdb.chains.size(); i++) + { + AlignSeq as = new AlignSeq(sequence[s], + ( (PDBChain) pdb.chains.elementAt(i)). + sequence, + AlignSeq.PEP); + as.calcScoreMatrix(); + as.traceAlignment(); + PDBChain chain = ( (PDBChain) pdb.chains.elementAt(i)); + + if (as.maxscore > max + || (as.maxscore == max && chain.id.equals(targetChain))) + { + maxChain = chain; + max = as.maxscore; + maxAlignseq = as; + maxChainId = chain.id; + } + } + + final StringBuffer mappingDetails = new StringBuffer(); + mappingDetails.append("\n\nPDB Sequence is :\nSequence = " + + maxChain.sequence.getSequenceAsString()); + mappingDetails.append("\nNo of residues = " + + maxChain.residues. + size() + + "\n\n"); + PrintStream ps = new PrintStream(System.out) + { + public void print(String x) + { + mappingDetails.append(x); + } + + public void println() + { + mappingDetails.append("\n"); + } + }; + + maxAlignseq.printAlignment(ps); + + mappingDetails.append("\nPDB start/end " + maxAlignseq.seq2start + " " + + maxAlignseq.seq2end); + mappingDetails.append("\nSEQ start/end " + + (maxAlignseq.seq1start + sequence[s].getStart() - 1) + + " " + + (maxAlignseq.seq1end + sequence[s].getEnd() - 1)); + + maxChain.makeExactMapping(maxAlignseq, sequence[s]); + + // maxChain.transferRESNUMFeatures(sequence[s], null); + + int[][] mapping = new int[sequence[s].getEnd() + 2][2]; + int resNum = -10000; + int index = 0; + + + do + { + Atom tmp = (Atom) maxChain.atoms.elementAt(index); + if (resNum != tmp.resNumber && tmp.alignmentMapping != -1) + { + resNum = tmp.resNumber; + mapping[tmp.alignmentMapping+1][0] = tmp.resNumber; + mapping[tmp.alignmentMapping+1][1] = tmp.atomIndex; + } + + index++; + } + while(index < maxChain.atoms.size()); + + if (mappings == null) + { + mappings = new StructureMapping[1]; + } + else + { + StructureMapping[] tmp = new StructureMapping[mappings.length + 1]; + System.arraycopy(mappings, 0, tmp, 0, mappings.length); + mappings = tmp; + } + + if(protocol.equals(jalview.io.AppletFormatAdapter.PASTE)) + pdbFile = "INLINE"+pdb.id; + + mappings[mappings.length - 1] + = new StructureMapping(sequence[s], pdbFile, pdb.id, maxChainId, + mapping, mappingDetails.toString()); + } + ///////// + + return pdb; + } + + public void removeStructureViewerListener(Object svl, String pdbfile) + { + listeners.removeElement(svl); + + boolean removeMapping = true; + + StructureListener sl; + for (int i = 0; i < listeners.size(); i++) + { + if (listeners.elementAt(i) instanceof StructureListener) + { + sl = (StructureListener) listeners.elementAt(i); + if (sl.getPdbFile().equals(pdbfile)) + { + removeMapping = false; + break; + } + } + } + + if (removeMapping && mappings!=null) + { + Vector tmp = new Vector(); + for (int i = 0; i < mappings.length; i++) + { + if (!mappings[i].pdbfile.equals(pdbfile)) + { + tmp.addElement(mappings[i]); + } + } + + mappings = new StructureMapping[tmp.size()]; + tmp.copyInto(mappings); + } + } + + public void mouseOverStructure(int pdbResNum, String chain, String pdbfile) + { + SequenceListener sl; + for (int i = 0; i < listeners.size(); i++) + { + if (listeners.elementAt(i) instanceof SequenceListener) + { + sl = (SequenceListener) listeners.elementAt(i); + + for (int j = 0; j < mappings.length; j++) + { + if (mappings[j].pdbfile.equals(pdbfile) && + mappings[j].pdbchain.equals(chain)) + { + sl.highlightSequence(mappings[j].sequence, + mappings[j].getSeqPos(pdbResNum)); + } + } + + sl.highlightSequence(null, pdbResNum); + } + } + } + + public void mouseOverSequence(SequenceI seq, int index) + { + StructureListener sl; + int atomNo = 0; + for (int i = 0; i < listeners.size(); i++) + { + if (listeners.elementAt(i) instanceof StructureListener) + { + sl = (StructureListener) listeners.elementAt(i); + + for (int j = 0; j < mappings.length; j++) + { + if (mappings[j].sequence == seq) + { + atomNo = mappings[j].getAtomNum(index); + + if (atomNo > 0) + { + sl.highlightAtom(atomNo, + mappings[j].getPDBResNum(index), + mappings[j].pdbchain, + mappings[j].pdbfile); + } + } + } + } + } + } + + public void structureSelectionChanged() + { + StructureListener svl; + for (int i = 0; i < listeners.size(); i++) + { + svl = (StructureListener) listeners.elementAt(i); + } + } + + public void sequenceSelectionChanged() + { + StructureListener svl; + for (int i = 0; i < listeners.size(); i++) + { + svl = (StructureListener) listeners.elementAt(i); + } + } + + public void sequenceColoursChanged(Object source) + { + StructureListener sl; + for (int i = 0; i < listeners.size(); i++) + { + if (listeners.elementAt(i) instanceof StructureListener) + { + sl = (StructureListener) listeners.elementAt(i); + sl.updateColours(source); + } + } + } + + public StructureMapping[] getMapping(String pdbfile) + { + Vector tmp = new Vector(); + for (int i = 0; i < mappings.length; i++) + { + if (mappings[i].pdbfile.equals(pdbfile)) + { + tmp.addElement(mappings[i]); + } + } + + StructureMapping[] ret = new StructureMapping[tmp.size()]; + for (int i = 0; i < tmp.size(); i++) + { + ret[i] = (StructureMapping) tmp.elementAt(i); + } + + return ret; + } + + public String printMapping(String pdbfile) + { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < mappings.length; i++) + { + if (mappings[i].pdbfile.equals(pdbfile)) + { + sb.append(mappings[i].mappingDetails); + } + } + + return sb.toString(); + } +} -- 1.7.10.2