X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fstructure%2FStructureSelectionManager.java;h=db0b47edc14e51f0648e37f1096e7d743784f89b;hb=136c0793b90b72b928c4d77dc109dd5c644e00d3;hp=b6bb70d198c455626cf6c438ee773796f9ba24cf;hpb=3429e8b2a3fceff4350d5554853403e903b4fc68;p=jalview.git diff --git a/src/jalview/structure/StructureSelectionManager.java b/src/jalview/structure/StructureSelectionManager.java index b6bb70d..db0b47e 100644 --- a/src/jalview/structure/StructureSelectionManager.java +++ b/src/jalview/structure/StructureSelectionManager.java @@ -29,11 +29,16 @@ 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; @@ -319,8 +324,8 @@ public class StructureSelectionManager * - how to resolve data from resource * @return null or the structure data parsed as a pdb file */ - synchronized public PDBfile setMapping(SequenceI[] sequence, - String[] targetChains, String pdbFile, String protocol) + synchronized public StructureFile setMapping(SequenceI[] sequence, + String[] targetChains, String pdbFile, DataSourceType protocol) { return setMapping(true, sequence, targetChains, pdbFile, protocol); } @@ -339,14 +344,13 @@ public class StructureSelectionManager * (may be nill, individual elements may be nill) * @param pdbFile * - structure data resource - * @param protocol + * @param sourceType * - how to resolve data from resource * @return null or the structure data parsed as a pdb file */ - synchronized public PDBfile setMapping(boolean forStructureView, + synchronized public StructureFile setMapping(boolean forStructureView, SequenceI[] sequenceArray, String[] targetChainIds, - String pdbFile, - String protocol) + String pdbFile, DataSourceType sourceType) { /* * There will be better ways of doing this in the future, for now we'll use @@ -378,18 +382,21 @@ public class StructureSelectionManager } } } - PDBfile pdb = null; + StructureFile pdb = null; boolean isMapUsingSIFTs = SiftsSettings.isMapWithSifts(); try { - pdb = new PDBfile(addTempFacAnnot, parseSecStr, secStructServices, - pdbFile, protocol); + sourceType = AppletFormatAdapter.checkProtocol(pdbFile); + pdb = new JmolParser(pdbFile, sourceType); - if (pdb.id != null && pdb.id.trim().length() > 0 - && AppletFormatAdapter.FILE.equals(protocol)) + if (pdb.getId() != null && pdb.getId().trim().length() > 0 + && DataSourceType.FILE == sourceType) { - registerPDBFile(pdb.id.trim(), pdbFile); + registerPDBFile(pdb.getId().trim(), pdbFile); } + // if PDBId is unavailable then skip SIFTS mapping execution path + isMapUsingSIFTs = isMapUsingSIFTs && pdb.isPPDBIdAvailable(); + } catch (Exception ex) { ex.printStackTrace(); @@ -413,6 +420,12 @@ public class StructureSelectionManager { boolean infChain = true; final SequenceI seq = sequenceArray[s]; + SequenceI ds = seq; + while (ds.getDatasetSequence() != null) + { + ds = ds.getDatasetSequence(); + } + if (targetChainIds != null && targetChainIds[s] != null) { infChain = false; @@ -444,12 +457,12 @@ public class StructureSelectionManager * Attempt pairwise alignment of the sequence with each chain in the PDB, * and remember the highest scoring chain */ - int max = -10; + float max = -10; AlignSeq maxAlignseq = null; String maxChainId = " "; PDBChain maxChain = null; boolean first = true; - for (PDBChain chain : pdb.chains) + for (PDBChain chain : pdb.getChains()) { if (targetChainId.length() > 0 && !targetChainId.equals(chain.id) && !infChain) @@ -481,40 +494,94 @@ public class StructureSelectionManager continue; } - if (protocol.equals(jalview.io.AppletFormatAdapter.PASTE)) + if (sourceType == DataSourceType.PASTE) { - pdbFile = "INLINE" + pdb.id; + pdbFile = "INLINE" + pdb.getId(); } - ArrayList seqToStrucMapping = new ArrayList(); - if (isMapUsingSIFTs) + List seqToStrucMapping = new ArrayList(); + if (isMapUsingSIFTs && seq.isProtein()) { setProgressBar(null); - setProgressBar("Obtaining mapping with SIFTS"); + setProgressBar(MessageManager + .getString("status.obtaining_mapping_with_sifts")); jalview.datamodel.Mapping sqmpping = maxAlignseq .getMappingFromS1(false); if (targetChainId != null && !targetChainId.trim().isEmpty()) { - StructureMapping mapping = getStructureMapping(seq, pdbFile, - targetChainId, pdb, maxChain, sqmpping, maxAlignseq); - seqToStrucMapping.add(mapping); + StructureMapping siftsMapping; + try + { + siftsMapping = getStructureMapping(seq, pdbFile, targetChainId, + pdb, maxChain, sqmpping, maxAlignseq); + seqToStrucMapping.add(siftsMapping); + maxChain.makeExactMapping(maxAlignseq, seq); + maxChain.transferRESNUMFeatures(seq, null);// FIXME: is this + // "IEA:SIFTS" ? + maxChain.transferResidueAnnotation(siftsMapping, sqmpping); + ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0)); + + } catch (SiftsException e) + { + // fall back to NW alignment + System.err.println(e.getMessage()); + StructureMapping nwMapping = getNWMappings(seq, pdbFile, + targetChainId, maxChain, pdb, maxAlignseq); + seqToStrucMapping.add(nwMapping); + maxChain.makeExactMapping(maxAlignseq, seq); + maxChain.transferRESNUMFeatures(seq, null); // FIXME: is this + // "IEA:Jalview" ? + maxChain.transferResidueAnnotation(nwMapping, sqmpping); + ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0)); + } } else { - for (PDBChain chain : pdb.chains) + List foundSiftsMappings = new ArrayList(); + for (PDBChain chain : pdb.getChains()) + { + try + { + StructureMapping siftsMapping = getStructureMapping(seq, + pdbFile, chain.id, pdb, chain, sqmpping, maxAlignseq); + foundSiftsMappings.add(siftsMapping); + } catch (SiftsException e) + { + System.err.println(e.getMessage()); + } + } + if (!foundSiftsMappings.isEmpty()) { - StructureMapping mapping = getStructureMapping(seq, pdbFile, - chain.id, pdb, chain, sqmpping, maxAlignseq); - seqToStrucMapping.add(mapping); + seqToStrucMapping.addAll(foundSiftsMappings); + maxChain.makeExactMapping(maxAlignseq, seq); + maxChain.transferRESNUMFeatures(seq, null);// FIXME: is this + // "IEA:SIFTS" ? + maxChain.transferResidueAnnotation(foundSiftsMappings.get(0), + sqmpping); + ds.addPDBId(sqmpping.getTo().getAllPDBEntries().get(0)); + } + else + { + StructureMapping nwMapping = getNWMappings(seq, pdbFile, + maxChainId, maxChain, pdb, maxAlignseq); + seqToStrucMapping.add(nwMapping); + maxChain.transferRESNUMFeatures(seq, null); // FIXME: is this + // "IEA:Jalview" ? + maxChain.transferResidueAnnotation(nwMapping, sqmpping); + ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0)); } } } else { setProgressBar(null); - setProgressBar("Obtaining mapping with NW alignment"); - seqToStrucMapping.add(getNWMappings(seq, pdbFile, maxChainId, - maxChain, pdb, maxAlignseq)); + setProgressBar(MessageManager + .getString("status.obtaining_mapping_with_nw_alignment")); + StructureMapping nwMapping = getNWMappings(seq, pdbFile, + maxChainId, maxChain, pdb, maxAlignseq); + seqToStrucMapping.add(nwMapping); + ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0)); + } if (forStructureView) @@ -525,36 +592,48 @@ public class StructureSelectionManager return pdb; } + public void addStructureMapping(StructureMapping sm) + { + mappings.add(sm); + } + + /** + * retrieve a mapping for seq from SIFTs using associated DBRefEntry for + * uniprot or PDB + * + * @param seq + * @param pdbFile + * @param targetChainId + * @param pdb + * @param maxChain + * @param sqmpping + * @param maxAlignseq + * @return + * @throws SiftsException + */ private StructureMapping getStructureMapping(SequenceI seq, - String pdbFile, String targetChainId, PDBfile pdb, + String pdbFile, String targetChainId, StructureFile pdb, PDBChain maxChain, jalview.datamodel.Mapping sqmpping, - AlignSeq maxAlignseq) + AlignSeq maxAlignseq) throws SiftsException { - String maxChainId = targetChainId; + StructureMapping curChainMapping = siftsClient + .getSiftsStructureMapping(seq, pdbFile, targetChainId); try { - StructureMapping curChainMapping = siftsClient - .getSiftsStructureMapping(seq, pdbFile, targetChainId); PDBChain chain = pdb.findChain(targetChainId); if (chain != null) { chain.transferResidueAnnotation(curChainMapping, sqmpping); } - return curChainMapping; - } catch (SiftsException e) + } catch (Exception e) { - System.err.println(e.getMessage()); - System.err.println(">>> Now switching mapping with NW alignment..."); - setProgressBar(null); - setProgressBar(">>> Now switching mapping with NW alignment..."); - return getNWMappings(seq, pdbFile, maxChainId, maxChain, pdb, - maxAlignseq); + e.printStackTrace(); } + return curChainMapping; } - private StructureMapping getNWMappings(SequenceI seq, - String pdbFile, - String maxChainId, PDBChain maxChain, PDBfile pdb, + private StructureMapping getNWMappings(SequenceI seq, String pdbFile, + String maxChainId, PDBChain maxChain, StructureFile pdb, AlignSeq maxAlignseq) { final StringBuilder mappingDetails = new StringBuilder(128); @@ -605,17 +684,18 @@ public class StructureSelectionManager HashMap mapping = new HashMap(); int resNum = -10000; int index = 0; + char insCode = ' '; do { Atom tmp = maxChain.atoms.elementAt(index); - if (resNum != tmp.resNumber && tmp.alignmentMapping != -1) + if ((resNum != tmp.resNumber || insCode != tmp.insCode) + && tmp.alignmentMapping != -1) { resNum = tmp.resNumber; + insCode = tmp.insCode; if (tmp.alignmentMapping >= -1) { - // TODO (JAL-1836) address root cause: negative residue no in PDB - // file mapping.put(tmp.alignmentMapping + 1, new int[] { tmp.resNumber, tmp.atomIndex }); } @@ -625,7 +705,7 @@ public class StructureSelectionManager } while (index < maxChain.atoms.size()); StructureMapping nwMapping = new StructureMapping(seq, pdbFile, - pdb.id, maxChainId, mapping, mappingDetails.toString()); + pdb.getId(), maxChainId, mapping, mappingDetails.toString()); maxChain.transferResidueAnnotation(nwMapping, sqmpping); return nwMapping; } @@ -662,7 +742,7 @@ public class StructureSelectionManager if (listeners.elementAt(i) instanceof StructureListener) { sl = (StructureListener) listeners.elementAt(i); - for (String pdbfile : sl.getPdbFile()) + for (String pdbfile : sl.getStructureFiles()) { pdbs.remove(pdbfile); } @@ -727,7 +807,28 @@ public class StructureSelectionManager return; } - SearchResults results = new SearchResults(); + SearchResultsI results = findAlignmentPositionsForStructurePositions(atoms); + for (Object li : listeners) + { + if (li instanceof SequenceListener) + { + ((SequenceListener) li).highlightSequence(results); + } + } + } + + /** + * Constructs a SearchResults object holding regions (if any) in the Jalview + * alignment which have a mapping to the structure viewer positions in the + * supplied list + * + * @param atoms + * @return + */ + public SearchResultsI findAlignmentPositionsForStructurePositions( + List atoms) + { + SearchResultsI results = new SearchResults(); for (AtomSpec atom : atoms) { SequenceI lastseq = null; @@ -752,13 +853,7 @@ public class StructureSelectionManager } } } - for (Object li : listeners) - { - if (li instanceof SequenceListener) - { - ((SequenceListener) li).highlightSequence(results); - } - } + return results; } /** @@ -777,7 +872,7 @@ public class StructureSelectionManager { boolean hasSequenceListeners = handlingVamsasMo || !seqmappings.isEmpty(); - SearchResults results = null; + SearchResultsI results = null; if (seqPos == -1) { seqPos = seq.findPosition(indexpos); @@ -855,7 +950,10 @@ public class StructureSelectionManager List atoms = new ArrayList(); for (StructureMapping sm : mappings) { - if (sm.sequence == seq || sm.sequence == seq.getDatasetSequence()) + if (sm.sequence == seq + || sm.sequence == seq.getDatasetSequence() + || (sm.sequence.getDatasetSequence() != null && sm.sequence + .getDatasetSequence() == seq.getDatasetSequence())) { for (int index : positions) { @@ -1106,13 +1204,14 @@ public class StructureSelectionManager public synchronized void sendSelection( jalview.datamodel.SequenceGroup selection, - jalview.datamodel.ColumnSelection colsel, SelectionSource source) + jalview.datamodel.ColumnSelection colsel, HiddenColumns hidden, + SelectionSource source) { for (SelectionListener slis : sel_listeners) { if (slis != source) { - slis.selection(selection, colsel, source); + slis.selection(selection, colsel, hidden, source); } } } @@ -1262,6 +1361,10 @@ public class StructureSelectionManager public void setProgressBar(String message) { + if (progressIndicator == null) + { + return; + } progressIndicator.setProgressBar(message, progressSessionId); }