X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fstructure%2FStructureSelectionManager.java;h=83a055e7392ba1c5063701e20abd806ca54cf7dd;hb=f2eadfd123e9540bd9af1e5c0ff73f6080ec03c7;hp=b993be2c0d4b056b2d51db58b84662c86c038d43;hpb=e0aacff0a162fdf1beb71cd5965b6ff4f8c9de0d;p=jalview.git diff --git a/src/jalview/structure/StructureSelectionManager.java b/src/jalview/structure/StructureSelectionManager.java index b993be2..83a055e 100644 --- a/src/jalview/structure/StructureSelectionManager.java +++ b/src/jalview/structure/StructureSelectionManager.java @@ -29,12 +29,14 @@ 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; @@ -159,8 +161,8 @@ public class StructureSelectionManager } else { - System.err.println("reportMapping: There are " + mappings.size() - + " mappings."); + System.err.println( + "reportMapping: There are " + mappings.size() + " mappings."); int i = 0; for (StructureMapping sm : mappings) { @@ -212,9 +214,8 @@ public class StructureSelectionManager { if (instances != null) { - throw new Error( - MessageManager - .getString("error.implementation_error_structure_selection_manager_null"), + throw new Error(MessageManager.getString( + "error.implementation_error_structure_selection_manager_null"), new NullPointerException(MessageManager .getString("exception.ssm_context_is_null"))); } @@ -339,7 +340,9 @@ public class StructureSelectionManager * - one or more sequences to be mapped to pdbFile * @param targetChainIds * - optional chain specification for mapping each sequence to pdb - * (may be nill, individual elements may be nill) + * (may be nill, individual elements may be nill) - JBPNote: JAL-2693 + * - this should be List>, empty lists indicate no + * predefined mappings * @param pdbFile * - structure data resource * @param sourceType @@ -384,6 +387,7 @@ public class StructureSelectionManager boolean isMapUsingSIFTs = SiftsSettings.isMapWithSifts(); try { + sourceType = AppletFormatAdapter.checkProtocol(pdbFile); pdb = new JmolParser(pdbFile, sourceType); if (pdb.getId() != null && pdb.getId().trim().length() > 0 @@ -430,8 +434,8 @@ public class StructureSelectionManager } else if (seq.getName().indexOf("|") > -1) { - targetChainId = seq.getName().substring( - seq.getName().lastIndexOf("|") + 1); + targetChainId = seq.getName() + .substring(seq.getName().lastIndexOf("|") + 1); if (targetChainId.length() > 1) { if (targetChainId.trim().length() == 0) @@ -459,6 +463,9 @@ public class StructureSelectionManager String maxChainId = " "; PDBChain maxChain = null; boolean first = true; + List maximalChain = new ArrayList<>(); + List maximalAlignseqs = new ArrayList<>(); + List maximalChainIds = new ArrayList<>(); for (PDBChain chain : pdb.getChains()) { if (targetChainId.length() > 0 && !targetChainId.equals(chain.id) @@ -476,14 +483,39 @@ public class StructureSelectionManager // as.calcScoreMatrix(); // as.traceAlignment(); - if (first || as.maxscore > max - || (as.maxscore == max && chain.id.equals(targetChainId))) + if (targetChainId.length() > 0 && chain.id.equals(targetChainId)) { - first = false; + // Don't care - just pick this chain as the mapping maxChain = chain; max = as.maxscore; maxAlignseq = as; maxChainId = chain.id; + // if targetChainId is specified then it is expected to be unique, so + // precisely one maximal chain will be added + maximalChainIds.add(chain.id); + maximalChain.add(chain); + maximalAlignseqs.add(as); + } + else + { + // select chains with maximal mappings to this sequence + if (first || as.maxscore > max) + { + // clear out old maximal mappings (if any) + max = as.maxscore; + maximalChain.clear(); + maxChain = chain; + max = as.maxscore; + maxAlignseq = as; + maxChainId = chain.id; + first = false; + } + if (as.maxscore == max) + { + maximalChainIds.add(chain.id); + maximalChain.add(chain); + maximalAlignseqs.add(as); + } } } if (maxChain == null) @@ -496,7 +528,7 @@ public class StructureSelectionManager pdbFile = "INLINE" + pdb.getId(); } - List seqToStrucMapping = new ArrayList(); + List seqToStrucMapping = new ArrayList<>(); if (isMapUsingSIFTs && seq.isProtein()) { setProgressBar(null); @@ -523,7 +555,8 @@ public class StructureSelectionManager // fall back to NW alignment System.err.println(e.getMessage()); StructureMapping nwMapping = getNWMappings(seq, pdbFile, - targetChainId, maxChain, pdb, maxAlignseq); + maximalChainIds, maximalChain, pdb, maximalAlignseqs) + .get(0); seqToStrucMapping.add(nwMapping); maxChain.makeExactMapping(maxAlignseq, seq); maxChain.transferRESNUMFeatures(seq, null); // FIXME: is this @@ -534,7 +567,7 @@ public class StructureSelectionManager } else { - List foundSiftsMappings = new ArrayList(); + List foundSiftsMappings = new ArrayList<>(); for (PDBChain chain : pdb.getChains()) { try @@ -560,7 +593,8 @@ public class StructureSelectionManager else { StructureMapping nwMapping = getNWMappings(seq, pdbFile, - maxChainId, maxChain, pdb, maxAlignseq); + maximalChainIds, maximalChain, pdb, maximalAlignseqs) + .get(0); seqToStrucMapping.add(nwMapping); maxChain.transferRESNUMFeatures(seq, null); // FIXME: is this // "IEA:Jalview" ? @@ -574,10 +608,14 @@ public class StructureSelectionManager setProgressBar(null); 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)); + List nwMapping = getNWMappings(seq, pdbFile, + maximalChainIds, maximalChain, pdb, maximalAlignseqs); + seqToStrucMapping.addAll(nwMapping); + for (PDBChain mc : maximalChain) + { + ds.addPDBId(mc.sequence.getAllPDBEntries().get(0)); + } + ; } @@ -629,13 +667,20 @@ public class StructureSelectionManager return curChainMapping; } - private StructureMapping getNWMappings(SequenceI seq, String pdbFile, - String maxChainId, PDBChain maxChain, StructureFile pdb, - AlignSeq maxAlignseq) + private List getNWMappings(SequenceI seq, + String pdbFile, + List maximalChainId, List maximalChain, + StructureFile pdb, List maximalAlignseq) { + List nwMappings = new ArrayList(); + for (int ch = 0; ch < maximalChain.size(); ch++) + { + String maxChainId = maximalChainId.get(ch); + PDBChain maxChain = maximalChain.get(ch); + AlignSeq maxAlignseq = maximalAlignseq.get(ch); final StringBuilder mappingDetails = new StringBuilder(128); - mappingDetails.append(NEWLINE).append( - "Sequence \u27f7 Structure mapping details"); + mappingDetails.append(NEWLINE) + .append("Sequence \u27f7 Structure mapping details"); mappingDetails.append(NEWLINE); mappingDetails .append("Method: inferred with Needleman & Wunsch alignment"); @@ -667,11 +712,12 @@ public class StructureSelectionManager .append(" "); mappingDetails.append(String.valueOf(maxAlignseq.seq2end)); mappingDetails.append(NEWLINE).append("SEQ start/end "); - mappingDetails.append( - String.valueOf(maxAlignseq.seq1start + (seq.getStart() - 1))) + mappingDetails + .append(String + .valueOf(maxAlignseq.seq1start + (seq.getStart() - 1))) .append(" "); - mappingDetails.append(String.valueOf(maxAlignseq.seq1end - + (seq.getStart() - 1))); + mappingDetails.append( + String.valueOf(maxAlignseq.seq1end + (seq.getStart() - 1))); mappingDetails.append(NEWLINE); maxChain.makeExactMapping(maxAlignseq, seq); jalview.datamodel.Mapping sqmpping = maxAlignseq @@ -693,8 +739,9 @@ public class StructureSelectionManager insCode = tmp.insCode; if (tmp.alignmentMapping >= -1) { - mapping.put(tmp.alignmentMapping + 1, new int[] { tmp.resNumber, - tmp.atomIndex }); + mapping.put(tmp.alignmentMapping + 1, + new int[] + { tmp.resNumber, tmp.atomIndex }); } } @@ -704,7 +751,9 @@ public class StructureSelectionManager StructureMapping nwMapping = new StructureMapping(seq, pdbFile, pdb.getId(), maxChainId, mapping, mappingDetails.toString()); maxChain.transferResidueAnnotation(nwMapping, sqmpping); - return nwMapping; + nwMappings.add(nwMapping); + } + return nwMappings; } public void removeStructureViewerListener(Object svl, String[] pdbfiles) @@ -772,7 +821,8 @@ public class StructureSelectionManager * @param chain * @param pdbfile */ - public void mouseOverStructure(int pdbResNum, String chain, String pdbfile) + public void mouseOverStructure(int pdbResNum, String chain, + String pdbfile) { AtomSpec atomSpec = new AtomSpec(pdbfile, chain, pdbResNum, 0); List atoms = Collections.singletonList(atomSpec); @@ -804,7 +854,8 @@ public class StructureSelectionManager return; } - SearchResultsI results = findAlignmentPositionsForStructurePositions(atoms); + SearchResultsI results = findAlignmentPositionsForStructurePositions( + atoms); for (Object li : listeners) { if (li instanceof SequenceListener) @@ -947,8 +998,7 @@ 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())) { @@ -958,8 +1008,8 @@ public class StructureSelectionManager if (atomNo > 0) { - atoms.add(new AtomSpec(sm.pdbfile, sm.pdbchain, sm - .getPDBResNum(index), atomNo)); + atoms.add(new AtomSpec(sm.pdbfile, sm.pdbchain, + sm.getPDBResNum(index), atomNo)); } } } @@ -1201,13 +1251,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); } } } @@ -1324,8 +1375,8 @@ public class StructureSelectionManager { if (command instanceof EditCommand) { - return MappingUtils.mapEditCommand((EditCommand) command, undo, - mapTo, gapChar, seqmappings); + return MappingUtils.mapEditCommand((EditCommand) command, undo, mapTo, + gapChar, seqmappings); } else if (command instanceof OrderCommand) {