X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fstructure%2FStructureSelectionManager.java;h=e9aa575e1b76c402fe5a599f84fb5d0aa80eb88e;hb=53b2ec17b88081e402f60deab2723750bc4867d1;hp=b4e63f43507b37c09d1f7240f82f99b47d3b7e32;hpb=6905363d02254a557f93f66a2b69d85aa0b23696;p=jalview.git
diff --git a/src/jalview/structure/StructureSelectionManager.java b/src/jalview/structure/StructureSelectionManager.java
index b4e63f4..f0665de 100644
--- a/src/jalview/structure/StructureSelectionManager.java
+++ b/src/jalview/structure/StructureSelectionManager.java
@@ -1,350 +1,1414 @@
-/*
- * 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();
- }
-}
+/*
+ * 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.structure;
+
+import jalview.analysis.AlignSeq;
+import jalview.api.StructureSelectionManagerProvider;
+import jalview.bin.Instance;
+import jalview.commands.CommandI;
+import jalview.commands.EditCommand;
+import jalview.commands.OrderCommand;
+import jalview.datamodel.AlignedCodonFrame;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.SearchResultsI;
+import jalview.datamodel.SequenceI;
+import jalview.ext.jmol.JmolParser;
+import jalview.gui.IProgressIndicator;
+import jalview.io.AppletFormatAdapter;
+import jalview.io.DataSourceType;
+import jalview.io.StructureFile;
+import jalview.util.MappingUtils;
+import jalview.util.MessageManager;
+import jalview.ws.sifts.SiftsClient;
+import jalview.ws.sifts.SiftsException;
+import jalview.ws.sifts.SiftsSettings;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import mc_view.Atom;
+import mc_view.PDBChain;
+import mc_view.PDBfile;
+
+public class StructureSelectionManager
+{
+
+ public StructureSelectionManager()
+ {
+ }
+
+ public final static String NEWLINE = System.lineSeparator();
+
+ // BH unnecessary; IdentityHashMap can handle this
+ // private static StructureSelectionManager nullProvider;
+
+ private List mappings = new ArrayList<>();
+
+ private boolean processSecondaryStructure = false;
+
+ private boolean secStructServices = false;
+
+ private boolean addTempFacAnnot = false;
+
+ /*
+ * Set of any registered mappings between (dataset) sequences.
+ */
+ private List seqmappings = new ArrayList<>();
+
+ private List commandListeners = new ArrayList<>();
+
+ private List sel_listeners = new ArrayList<>();
+
+ /**
+ * @return true if will try to use external services for processing secondary
+ * structure
+ */
+ public boolean isSecStructServices()
+ {
+ return secStructServices;
+ }
+
+ /**
+ * control use of external services for processing secondary structure
+ *
+ * @param secStructServices
+ */
+ public void setSecStructServices(boolean secStructServices)
+ {
+ this.secStructServices = secStructServices;
+ }
+
+ /**
+ * flag controlling addition of any kind of structural annotation
+ *
+ * @return true if temperature factor annotation will be added
+ */
+ public boolean isAddTempFacAnnot()
+ {
+ return addTempFacAnnot;
+ }
+
+ /**
+ * set flag controlling addition of structural annotation
+ *
+ * @param addTempFacAnnot
+ */
+ public void setAddTempFacAnnot(boolean addTempFacAnnot)
+ {
+ this.addTempFacAnnot = addTempFacAnnot;
+ }
+
+ /**
+ *
+ * @return if true, the structure manager will attempt to add secondary
+ * structure lines for unannotated sequences
+ */
+
+ public boolean isProcessSecondaryStructure()
+ {
+ return processSecondaryStructure;
+ }
+
+ /**
+ * Control whether structure manager will try to annotate mapped sequences
+ * with secondary structure from PDB data.
+ *
+ * @param enable
+ */
+ public void setProcessSecondaryStructure(boolean enable)
+ {
+ processSecondaryStructure = enable;
+ }
+
+ /**
+ * debug function - write all mappings to stdout
+ */
+ public void reportMapping()
+ {
+ if (mappings.isEmpty())
+ {
+ System.err.println("reportMapping: No PDB/Sequence mappings.");
+ }
+ else
+ {
+ System.err.println(
+ "reportMapping: There are " + mappings.size() + " mappings.");
+ int i = 0;
+ for (StructureMapping sm : mappings)
+ {
+ System.err.println("mapping " + i++ + " : " + sm.pdbfile);
+ }
+ }
+ }
+
+ /**
+ * map between the PDB IDs (or structure identifiers) used by Jalview and the
+ * absolute filenames for PDB data that corresponds to it
+ */
+ Map pdbIdFileName = new HashMap<>();
+
+ Map pdbFileNameId = new HashMap<>();
+
+ public void registerPDBFile(String idForFile, String absoluteFile)
+ {
+ pdbIdFileName.put(idForFile, absoluteFile);
+ pdbFileNameId.put(absoluteFile, idForFile);
+ }
+
+ public String findIdForPDBFile(String idOrFile)
+ {
+ String id = pdbFileNameId.get(idOrFile);
+ return id;
+ }
+
+ public String findFileForPDBId(String idOrFile)
+ {
+ String id = pdbIdFileName.get(idOrFile);
+ return id;
+ }
+
+ public boolean isPDBFileRegistered(String idOrFile)
+ {
+ return pdbFileNameId.containsKey(idOrFile)
+ || pdbIdFileName.containsKey(idOrFile);
+ }
+
+ /**
+ * flag controlling whether SeqMappings are relayed from received sequence
+ * mouse over events to other sequences
+ */
+ boolean relaySeqMappings = true;
+
+ /**
+ * Enable or disable relay of seqMapping events to other sequences. You might
+ * want to do this if there are many sequence mappings and the host computer
+ * is slow
+ *
+ * @param relay
+ */
+ public void setRelaySeqMappings(boolean relay)
+ {
+ relaySeqMappings = relay;
+ }
+
+ /**
+ * get the state of the relay seqMappings flag.
+ *
+ * @return true if sequence mouse overs are being relayed to other mapped
+ * sequences
+ */
+ public boolean isRelaySeqMappingsEnabled()
+ {
+ return relaySeqMappings;
+ }
+
+ Vector