X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fstructure%2FStructureSelectionManager.java;h=7a1b1008d34592e7352a4ee011098d0d588f9103;hb=76139ef711627a3176736af47272ff55be62e720;hp=e59812032281df1fa58a5e7d5bcd692bbfa4212e;hpb=59d682209891099d46b960509907c79e3fb276fe;p=jalview.git diff --git a/src/jalview/structure/StructureSelectionManager.java b/src/jalview/structure/StructureSelectionManager.java index e598120..7a1b100 100644 --- a/src/jalview/structure/StructureSelectionManager.java +++ b/src/jalview/structure/StructureSelectionManager.java @@ -1,30 +1,44 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8) - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) + * Copyright (C) 2014 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. + * 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 . + * 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 java.io.*; -import java.util.*; - -import MCview.*; -import jalview.analysis.*; -import jalview.api.AlignmentViewPanel; +import jalview.analysis.AlignSeq; import jalview.api.StructureSelectionManagerProvider; -import jalview.datamodel.*; +import jalview.datamodel.AlignedCodonFrame; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.Annotation; +import jalview.datamodel.PDBEntry; +import jalview.datamodel.SearchResults; +import jalview.datamodel.SequenceI; +import jalview.io.FormatAdapter; +import jalview.util.MessageManager; + +import java.io.PrintStream; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.IdentityHashMap; +import java.util.Vector; + +import MCview.Atom; +import MCview.PDBChain; public class StructureSelectionManager { @@ -52,11 +66,58 @@ public class StructureSelectionManager } } - Hashtable mappingData = new Hashtable(); + /** + * map between the PDB IDs (or structure identifiers) used by Jalview and the + * absolute filenames for PDB data that corresponds to it + */ + HashMap pdbIdFileName = new HashMap(), + 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); + } + + private static StructureSelectionManager nullProvider = null; public static StructureSelectionManager getStructureSelectionManager( StructureSelectionManagerProvider context) { + if (context == null) + { + if (nullProvider == null) + { + if (instances != null) + { + throw new Error(MessageManager.getString("error.implementation_error_structure_selection_manager_null"), + new NullPointerException(MessageManager.getString("exception.ssm_context_is_null"))); + } + else + { + nullProvider = new StructureSelectionManager(); + } + return nullProvider; + } + } if (instances == null) { instances = new java.util.IdentityHashMap(); @@ -64,7 +125,15 @@ public class StructureSelectionManager StructureSelectionManager instance = instances.get(context); if (instance == null) { - instances.put(context, instance = new StructureSelectionManager()); + if (nullProvider != null) + { + instance = nullProvider; + } + else + { + instance = new StructureSelectionManager(); + } + instances.put(context, instance); } return instance; } @@ -129,9 +198,33 @@ public class StructureSelectionManager } /** + * Import structure data and register a structure mapping for broadcasting + * colouring, mouseovers and selection events (convenience wrapper). + * + * @param sequence + * - one or more sequences to be mapped to pdbFile + * @param targetChains + * - optional chain specification for mapping each sequence to pdb + * (may be nill, individual elements may be nill) + * @param pdbFile + * - structure data resource + * @param protocol + * - how to resolve data from resource + * @return null or the structure data parsed as a pdb file + */ + synchronized public MCview.PDBfile setMapping(SequenceI[] sequence, + String[] targetChains, String pdbFile, String protocol) + { + return setMapping(true, sequence, targetChains, pdbFile, protocol); + } + + /** * create sequence structure mappings between each sequence and the given * pdbFile (retrieved via the given protocol). * + * @param forStructureView + * when true, record the mapping for use in mouseOvers + * * @param sequence * - one or more sequences to be mapped to pdbFile * @param targetChains @@ -143,7 +236,8 @@ public class StructureSelectionManager * - how to resolve data from resource * @return null or the structure data parsed as a pdb file */ - synchronized public MCview.PDBfile setMapping(SequenceI[] sequence, + synchronized public MCview.PDBfile setMapping(boolean forStructureView, + SequenceI[] sequence, String[] targetChains, String pdbFile, String protocol) { /* @@ -151,9 +245,41 @@ public class StructureSelectionManager * the tried and tested MCview pdb mapping */ MCview.PDBfile pdb = null; + boolean parseSecStr=true; + if (isPDBFileRegistered(pdbFile)) + { + for (SequenceI sq : sequence) + { + SequenceI ds = sq; + while (ds.getDatasetSequence() != null) + { + ds = ds.getDatasetSequence(); + } + ; + if (ds.getAnnotation() != null) + { + for (AlignmentAnnotation ala : ds.getAnnotation()) + { + // false if any annotation present from this structure + // JBPNote this fails for jmol/chimera view because the *file* is + // passed, not the structure data ID - + if (MCview.PDBfile.isCalcIdForFile(ala, + findIdForPDBFile(pdbFile))) + { + parseSecStr = false; + } + } + } + } + } try { - pdb = new MCview.PDBfile(pdbFile, protocol); + pdb = new MCview.PDBfile(true, parseSecStr, pdbFile, protocol); + if (pdb.id != null && pdb.id.trim().length() > 0 + && FormatAdapter.FILE.equals(protocol)) + { + registerPDBFile(pdb.id.trim(), pdbFile); + } } catch (Exception ex) { ex.printStackTrace(); @@ -187,7 +313,9 @@ public class StructureSelectionManager } } else + { targetChain = ""; + } int max = -10; AlignSeq maxAlignseq = null; @@ -196,7 +324,7 @@ public class StructureSelectionManager boolean first = true; for (int i = 0; i < pdb.chains.size(); i++) { - PDBChain chain = ((PDBChain) pdb.chains.elementAt(i)); + PDBChain chain = (pdb.chains.elementAt(i)); if (targetChain.length() > 0 && !targetChain.equals(chain.id) && !infChain) { @@ -205,8 +333,8 @@ public class StructureSelectionManager // TODO: correctly determine sequence type for mixed na/peptide // structures AlignSeq as = new AlignSeq(sequence[s], - ((PDBChain) pdb.chains.elementAt(i)).sequence, - ((PDBChain) pdb.chains.elementAt(i)).isNa ? AlignSeq.DNA + pdb.chains.elementAt(i).sequence, + pdb.chains.elementAt(i).isNa ? AlignSeq.DNA : AlignSeq.PEP); as.calcScoreMatrix(); as.traceAlignment(); @@ -275,24 +403,30 @@ public class StructureSelectionManager index++; } while (index < maxChain.atoms.size()); - if (mappings == null) + if (protocol.equals(jalview.io.AppletFormatAdapter.PASTE)) { - mappings = new StructureMapping[1]; + pdbFile = "INLINE" + pdb.id; } - else + StructureMapping newMapping = new StructureMapping(sequence[s], + pdbFile, pdb.id, maxChainId, mapping, + mappingDetails.toString()); + if (forStructureView) { - 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; + 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; + } - mappings[mappings.length - 1] = new StructureMapping(sequence[s], - pdbFile, pdb.id, maxChainId, mapping, - mappingDetails.toString()); - maxChain.transferResidueAnnotation(mappings[mappings.length - 1]); + mappings[mappings.length - 1] = newMapping; + } + maxChain.transferResidueAnnotation(newMapping); } // /////// @@ -322,7 +456,9 @@ public class StructureSelectionManager String[] handlepdbs; Vector pdbs = new Vector(); for (int i = 0; i < pdbfiles.length; pdbs.addElement(pdbfiles[i++])) + { ; + } StructureListener sl; for (int i = 0; i < listeners.size(); i++) { @@ -414,7 +550,9 @@ public class StructureSelectionManager { Object li = listeners.elementAt(i); if (li instanceof SequenceListener) + { ((SequenceListener) li).highlightSequence(results); + } } } } @@ -438,7 +576,9 @@ public class StructureSelectionManager boolean hasSequenceListeners = handlingVamsasMo || seqmappings != null; SearchResults results = null; if (index == -1) + { index = seq.findPosition(indexpos); + } StructureListener sl; int atomNo = 0; for (int i = 0; i < listeners.size(); i++) @@ -656,9 +796,13 @@ public class StructureSelectionManager AlignedCodonFrame[] codonFrames) { if (!add && (seqmappings == null || seqmappings.size() == 0)) + { return; + } if (seqmappings == null) + { seqmappings = new Vector(); + } if (codonFrames != null && codonFrames.length > 0) { for (int cf = 0; cf < codonFrames.length; cf++) @@ -696,8 +840,10 @@ public class StructureSelectionManager int[] nsr = new int[(seqmappingrefs == null) ? 1 : seqmappingrefs.length + 1]; if (seqmappingrefs != null && seqmappingrefs.length > 0) + { System.arraycopy(seqmappingrefs, 0, nsr, 0, seqmappingrefs.length); + } nsr[(seqmappingrefs == null) ? 0 : seqmappingrefs.length] = 1; seqmappingrefs = nsr; } @@ -784,10 +930,10 @@ public class StructureSelectionManager listeners.clear(); listeners = null; } - if (mappingData != null) + if (pdbIdFileName != null) { - mappingData.clear(); - mappingData = null; + pdbIdFileName.clear(); + pdbIdFileName = null; } if (sel_listeners != null) { @@ -831,4 +977,13 @@ public class StructureSelectionManager } } + public void registerPDBEntry(PDBEntry pdbentry) + { + if (pdbentry.getFile() != null + && pdbentry.getFile().trim().length() > 0) + { + registerPDBFile(pdbentry.getId(), pdbentry.getFile()); + } + } + }