From 96a5726c430b26ed83fc8ee3be0c7ea871519fa1 Mon Sep 17 00:00:00 2001 From: gmungoc Date: Thu, 8 Oct 2020 15:06:57 +0100 Subject: [PATCH] JAL-3763 refactored getCoveringMapping for virtual feature discovery --- src/jalview/datamodel/AlignedCodonFrame.java | 90 ++++++++++++++------ .../seqfeatures/FeatureRendererModel.java | 14 +-- 2 files changed, 72 insertions(+), 32 deletions(-) diff --git a/src/jalview/datamodel/AlignedCodonFrame.java b/src/jalview/datamodel/AlignedCodonFrame.java index aca523e..d59078b 100644 --- a/src/jalview/datamodel/AlignedCodonFrame.java +++ b/src/jalview/datamodel/AlignedCodonFrame.java @@ -156,6 +156,40 @@ public class AlignedCodonFrame } return true; } + + /** + * Adds any regions mapped to or from position {@code pos} in sequence + * {@code seq} to the given search results + * + * @param seq + * @param pos + * @param sr + */ + public void markMappedRegion(SequenceI seq, int pos, SearchResultsI sr) + { + int[] codon = null; + SequenceI mappedSeq = null; + SequenceI ds = seq.getDatasetSequence(); + + if (this.fromSeq == seq || this.fromSeq == ds) + { + codon = this.mapping.map.locateInTo(pos, pos); + mappedSeq = this.mapping.to; + } + else if (this.mapping.to == seq || this.mapping.to == ds) + { + codon = this.mapping.map.locateInFrom(pos, pos); + mappedSeq = this.fromSeq; + } + + if (codon != null) + { + for (int i = 0; i < codon.length; i += 2) + { + sr.addResult(mappedSeq, codon[i], codon[i + 1]); + } + } + } } private List mappings; @@ -356,34 +390,10 @@ public class AlignedCodonFrame public void markMappedRegion(SequenceI seq, int index, SearchResultsI results) { - int[] codon; SequenceI ds = seq.getDatasetSequence(); for (SequenceToSequenceMapping ssm : mappings) { - if (ssm.fromSeq == seq || ssm.fromSeq == ds) - { - codon = ssm.mapping.map.locateInTo(index, index); - if (codon != null) - { - for (int i = 0; i < codon.length; i += 2) - { - results.addResult(ssm.mapping.to, codon[i], codon[i + 1]); - } - } - } - else if (ssm.mapping.to == seq || ssm.mapping.to == ds) - { - { - codon = ssm.mapping.map.locateInFrom(index, index); - if (codon != null) - { - for (int i = 0; i < codon.length; i += 2) - { - results.addResult(ssm.fromSeq, codon[i], codon[i + 1]); - } - } - } - } + ssm.markMappedRegion(ds, index, results); } } @@ -856,4 +866,34 @@ public class AlignedCodonFrame } return null; } + + /** + * Returns the first mapping found which is between the given sequence and + * another, is a triplet mapping (3:1 or 1:3), and covers the full extent of + * both sequences involved. + * + * @param seq + * @return + */ + public SequenceToSequenceMapping getCoveringCodonMapping(SequenceI seq) + { + for (SequenceToSequenceMapping mapping : mappings) + { + if (mapping.getMapping().getMap().isTripletMap() + && mapping.covers(seq)) + { + if (mapping.fromSeq == seq + && mapping.covers(mapping.getMapping().getTo())) + { + return mapping; + } + else if (mapping.getMapping().getTo() == seq + && mapping.covers(mapping.fromSeq)) + { + return mapping; + } + } + } + return null; + } } diff --git a/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java b/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java index 3608626..937094b 100644 --- a/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java +++ b/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java @@ -39,9 +39,9 @@ import jalview.api.AlignViewportI; import jalview.api.FeatureColourI; import jalview.api.FeaturesDisplayedI; import jalview.datamodel.AlignedCodonFrame; +import jalview.datamodel.AlignedCodonFrame.SequenceToSequenceMapping; import jalview.datamodel.AlignmentI; import jalview.datamodel.MappedFeatures; -import jalview.datamodel.Mapping; import jalview.datamodel.SearchResultMatchI; import jalview.datamodel.SearchResults; import jalview.datamodel.SearchResultsI; @@ -1227,18 +1227,18 @@ public abstract class FeatureRendererModel * todo: direct lookup of CDS for peptide and vice-versa; for now, * have to search through an unordered list of mappings for a candidate */ - Mapping mapping = null; + SequenceToSequenceMapping mapping = null; SequenceI mapFrom = null; for (AlignedCodonFrame acf : mappings) { - mapping = acf.getMappingForSequence(sequence); - if (mapping == null || !mapping.getMap().isTripletMap()) + mapping = acf.getCoveringCodonMapping(ds); + if (mapping == null) { - continue; // we are only looking for 3:1 or 1:3 mappings + continue; } SearchResultsI sr = new SearchResults(); - acf.markMappedRegion(ds, pos, sr); + mapping.markMappedRegion(ds, pos, sr); for (SearchResultMatchI match : sr.getResults()) { int fromRes = match.getStart(); @@ -1291,7 +1291,7 @@ public abstract class FeatureRendererModel } } - return new MappedFeatures(mapping, mapFrom, pos, residue, result); + return new MappedFeatures(mapping.getMapping(), mapFrom, pos, residue, result); } @Override -- 1.7.10.2