-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
- */\r
-package jalview.structure;\r
-\r
-import java.io.*;\r
-import java.util.*;\r
-\r
-import MCview.*;\r
-import jalview.analysis.*;\r
-import jalview.datamodel.*;\r
-\r
-public class StructureSelectionManager\r
-{\r
- static StructureSelectionManager instance;\r
- StructureMapping[] mappings;\r
- Hashtable mappingData = new Hashtable();\r
-\r
- public static StructureSelectionManager getStructureSelectionManager()\r
- {\r
- if (instance == null)\r
- {\r
- instance = new StructureSelectionManager();\r
- }\r
-\r
- return instance;\r
- }\r
-\r
- Vector listeners = new Vector();\r
- public void addStructureViewerListener(Object svl)\r
- {\r
- if (!listeners.contains(svl))\r
- {\r
- listeners.addElement(svl);\r
- }\r
- }\r
-\r
- public String alreadyMappedToFile(String pdbid)\r
- {\r
- if (mappings != null)\r
- {\r
- for (int i = 0; i < mappings.length; i++)\r
- {\r
- if (mappings[i].getPdbId().equals(pdbid))\r
- {\r
- return mappings[i].pdbfile;\r
- }\r
- }\r
- }\r
- return null;\r
- }\r
-\r
- /*\r
- There will be better ways of doing this in the future, for now we'll use\r
- the tried and tested MCview pdb mapping\r
- */\r
- public MCview.PDBfile setMapping(SequenceI[] sequence,\r
- String pdbFile,\r
- String protocol)\r
- {\r
- MCview.PDBfile pdb = null;\r
- try\r
- {\r
- pdb = new MCview.PDBfile(pdbFile, protocol);\r
- }\r
- catch (Exception ex)\r
- {\r
- ex.printStackTrace();\r
- return null;\r
- }\r
-\r
- for (int s = 0; s < sequence.length; s++)\r
- {\r
- String targetChain = "";\r
-\r
- if (sequence[s].getName().indexOf("|") > -1)\r
- {\r
- targetChain = sequence[s].getName().substring(\r
- sequence[s].getName().lastIndexOf("|") + 1);\r
- }\r
-\r
- int max = -10;\r
- AlignSeq maxAlignseq = null;\r
- String maxChainId = " ";\r
- PDBChain maxChain = null;\r
-\r
- for (int i = 0; i < pdb.chains.size(); i++)\r
- {\r
- AlignSeq as = new AlignSeq(sequence[s],\r
- ( (PDBChain) pdb.chains.elementAt(i)).\r
- sequence,\r
- AlignSeq.PEP);\r
- as.calcScoreMatrix();\r
- as.traceAlignment();\r
- PDBChain chain = ( (PDBChain) pdb.chains.elementAt(i));\r
-\r
- if (as.maxscore > max\r
- || (as.maxscore == max && chain.id.equals(targetChain)))\r
- {\r
- maxChain = chain;\r
- max = as.maxscore;\r
- maxAlignseq = as;\r
- maxChainId = chain.id;\r
- }\r
- }\r
-\r
- final StringBuffer mappingDetails = new StringBuffer();\r
- mappingDetails.append("\n\nPDB Sequence is :\nSequence = " +\r
- maxChain.sequence.getSequenceAsString());\r
- mappingDetails.append("\nNo of residues = " +\r
- maxChain.residues.\r
- size() +\r
- "\n\n");\r
- PrintStream ps = new PrintStream(System.out)\r
- {\r
- public void print(String x)\r
- {\r
- mappingDetails.append(x);\r
- }\r
-\r
- public void println()\r
- {\r
- mappingDetails.append("\n");\r
- }\r
- };\r
-\r
- maxAlignseq.printAlignment(ps);\r
-\r
- mappingDetails.append("\nPDB start/end " + maxAlignseq.seq2start + " " +\r
- maxAlignseq.seq2end);\r
- mappingDetails.append("\nSEQ start/end "\r
- + (maxAlignseq.seq1start + sequence[s].getStart() - 1) +\r
- " "\r
- + (maxAlignseq.seq1end + sequence[s].getEnd() - 1));\r
-\r
- maxChain.makeExactMapping(maxAlignseq, sequence[s]);\r
-\r
- // maxChain.transferRESNUMFeatures(sequence[s], null);\r
-\r
- int[][] mapping = new int[sequence[s].getEnd() + 2][2];\r
- int resNum = -10000;\r
- int index = 0;\r
-\r
-\r
- do\r
- {\r
- Atom tmp = (Atom) maxChain.atoms.elementAt(index);\r
- if (resNum != tmp.resNumber && tmp.alignmentMapping != -1)\r
- {\r
- resNum = tmp.resNumber;\r
- mapping[tmp.alignmentMapping+1][0] = tmp.resNumber;\r
- mapping[tmp.alignmentMapping+1][1] = tmp.atomIndex;\r
- }\r
-\r
- index++;\r
- }\r
- while(index < maxChain.atoms.size());\r
-\r
- if (mappings == null)\r
- {\r
- mappings = new StructureMapping[1];\r
- }\r
- else\r
- {\r
- StructureMapping[] tmp = new StructureMapping[mappings.length + 1];\r
- System.arraycopy(mappings, 0, tmp, 0, mappings.length);\r
- mappings = tmp;\r
- }\r
-\r
- if(protocol.equals(jalview.io.AppletFormatAdapter.PASTE))\r
- pdbFile = "INLINE"+pdb.id;\r
-\r
- mappings[mappings.length - 1]\r
- = new StructureMapping(sequence[s], pdbFile, pdb.id, maxChainId,\r
- mapping, mappingDetails.toString());\r
- }\r
- /////////\r
-\r
- return pdb;\r
- }\r
-\r
- public void removeStructureViewerListener(Object svl, String pdbfile)\r
- {\r
- listeners.removeElement(svl);\r
-\r
- boolean removeMapping = true;\r
-\r
- StructureListener sl;\r
- for (int i = 0; i < listeners.size(); i++)\r
- {\r
- if (listeners.elementAt(i) instanceof StructureListener)\r
- {\r
- sl = (StructureListener) listeners.elementAt(i);\r
- if (sl.getPdbFile().equals(pdbfile))\r
- {\r
- removeMapping = false;\r
- break;\r
- }\r
- }\r
- }\r
-\r
- if (removeMapping && mappings!=null)\r
- {\r
- Vector tmp = new Vector();\r
- for (int i = 0; i < mappings.length; i++)\r
- {\r
- if (!mappings[i].pdbfile.equals(pdbfile))\r
- {\r
- tmp.addElement(mappings[i]);\r
- }\r
- }\r
-\r
- mappings = new StructureMapping[tmp.size()];\r
- tmp.copyInto(mappings);\r
- }\r
- }\r
-\r
- public void mouseOverStructure(int pdbResNum, String chain, String pdbfile)\r
- {\r
- SequenceListener sl;\r
- for (int i = 0; i < listeners.size(); i++)\r
- {\r
- if (listeners.elementAt(i) instanceof SequenceListener)\r
- {\r
- sl = (SequenceListener) listeners.elementAt(i);\r
-\r
- for (int j = 0; j < mappings.length; j++)\r
- {\r
- if (mappings[j].pdbfile.equals(pdbfile) &&\r
- mappings[j].pdbchain.equals(chain))\r
- {\r
- sl.highlightSequence(mappings[j].sequence,\r
- mappings[j].getSeqPos(pdbResNum));\r
- }\r
- }\r
-\r
- sl.highlightSequence(null, pdbResNum);\r
- }\r
- }\r
- }\r
-\r
- public void mouseOverSequence(SequenceI seq, int index)\r
- {\r
- StructureListener sl;\r
- int atomNo = 0;\r
- for (int i = 0; i < listeners.size(); i++)\r
- {\r
- if (listeners.elementAt(i) instanceof StructureListener)\r
- {\r
- sl = (StructureListener) listeners.elementAt(i);\r
-\r
- for (int j = 0; j < mappings.length; j++)\r
- {\r
- if (mappings[j].sequence == seq)\r
- {\r
- atomNo = mappings[j].getAtomNum(index);\r
-\r
- if (atomNo > 0)\r
- {\r
- sl.highlightAtom(atomNo,\r
- mappings[j].getPDBResNum(index),\r
- mappings[j].pdbchain,\r
- mappings[j].pdbfile);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- public void structureSelectionChanged()\r
- {\r
- StructureListener svl;\r
- for (int i = 0; i < listeners.size(); i++)\r
- {\r
- svl = (StructureListener) listeners.elementAt(i);\r
- }\r
- }\r
-\r
- public void sequenceSelectionChanged()\r
- {\r
- StructureListener svl;\r
- for (int i = 0; i < listeners.size(); i++)\r
- {\r
- svl = (StructureListener) listeners.elementAt(i);\r
- }\r
- }\r
-\r
- public void sequenceColoursChanged(Object source)\r
- {\r
- StructureListener sl;\r
- for (int i = 0; i < listeners.size(); i++)\r
- {\r
- if (listeners.elementAt(i) instanceof StructureListener)\r
- {\r
- sl = (StructureListener) listeners.elementAt(i);\r
- sl.updateColours(source);\r
- }\r
- }\r
- }\r
-\r
- public StructureMapping[] getMapping(String pdbfile)\r
- {\r
- Vector tmp = new Vector();\r
- for (int i = 0; i < mappings.length; i++)\r
- {\r
- if (mappings[i].pdbfile.equals(pdbfile))\r
- {\r
- tmp.addElement(mappings[i]);\r
- }\r
- }\r
-\r
- StructureMapping[] ret = new StructureMapping[tmp.size()];\r
- for (int i = 0; i < tmp.size(); i++)\r
- {\r
- ret[i] = (StructureMapping) tmp.elementAt(i);\r
- }\r
-\r
- return ret;\r
- }\r
-\r
- public String printMapping(String pdbfile)\r
- {\r
- StringBuffer sb = new StringBuffer();\r
- for (int i = 0; i < mappings.length; i++)\r
- {\r
- if (mappings[i].pdbfile.equals(pdbfile))\r
- {\r
- sb.append(mappings[i].mappingDetails);\r
- }\r
- }\r
-\r
- return sb.toString();\r
- }\r
-}\r
+/*
+ * 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();
+ }
+}