X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FAlignedCodonFrame.java;h=3cca4533fc653e27b11acb497366fb9c7b702fba;hb=HEAD;hp=0f6a5f3ac0c307556bd126029bcdf19664c53a98;hpb=34cd990de2acbfc60802d2ab0c869481749a2406;p=jalview.git diff --git a/src/jalview/datamodel/AlignedCodonFrame.java b/src/jalview/datamodel/AlignedCodonFrame.java index 0f6a5f3..3cca453 100644 --- a/src/jalview/datamodel/AlignedCodonFrame.java +++ b/src/jalview/datamodel/AlignedCodonFrame.java @@ -118,15 +118,50 @@ public class AlignedCodonFrame */ public boolean covers(SequenceI seq) { - List mappedRanges = null; + return covers(seq, false, false); + } + + /** + * + * @param seq + * @param localCover + * - when true - compare extent of seq's dataset sequence rather + * than the local extent + * @param either + * - when true coverage is required for either seq or the mapped + * sequence + * @return true if mapping covers full length of given sequence (or the + * other if either==true) + */ + public boolean covers(SequenceI seq, boolean localCover, boolean either) + { + List mappedRanges = null, otherRanges = null; MapList mapList = mapping.getMap(); + int mstart = seq.getStart(), mend = seq.getEnd(), ostart, oend; + ; if (fromSeq == seq || fromSeq == seq.getDatasetSequence()) { + if (localCover && fromSeq != seq) + { + mstart = fromSeq.getStart(); + mend = fromSeq.getEnd(); + } mappedRanges = mapList.getFromRanges(); + otherRanges = mapList.getToRanges(); + ostart = mapping.to.getStart(); + oend = mapping.to.getEnd(); } else if (mapping.to == seq || mapping.to == seq.getDatasetSequence()) { + if (localCover && mapping.to != seq) + { + mstart = mapping.to.getStart(); + mend = mapping.to.getEnd(); + } mappedRanges = mapList.getToRanges(); + otherRanges = mapList.getFromRanges(); + ostart = fromSeq.getStart(); + oend = fromSeq.getEnd(); } else { @@ -138,28 +173,51 @@ public class AlignedCodonFrame * (necessary for circular CDS - example EMBL:J03321:AAA91567) * and mapped length covers (at least) sequence length */ + int length = countRange(mappedRanges, mstart, mend); + + if (length != -1) + { + // add 3 to mapped length to allow for a mapped stop codon + if (length + 3 >= (mend - mstart + 1)) + { + return true; + } + } + if (either) + { + // also check coverage of the other range + length = countRange(otherRanges, ostart, oend); + if (length != -1) + { + if (length + 1 >= (oend - ostart + 1)) + { + return true; + } + } + } + return false; + } + + private int countRange(List mappedRanges, int mstart, int mend) + { int length = 0; for (int[] range : mappedRanges) { int from = Math.min(range[0], range[1]); int to = Math.max(range[0], range[1]); - if (from < seq.getStart() || to > seq.getEnd()) + if (from < mstart || to > mend) { - return false; + return -1; } length += (to - from + 1); } - // add 1 to mapped length to allow for a mapped stop codon - if (length + 1 < (seq.getEnd() - seq.getStart() + 1)) - { - return false; - } - return true; + return length; } /** * Adds any regions mapped to or from position {@code pos} in sequence - * {@code seq} to the given search results + * {@code seq} to the given search results Note: recommend first using the + * .covers(,true,true) to ensure mapping covers both sequences * * @param seq * @param pos @@ -174,7 +232,7 @@ public class AlignedCodonFrame { ds = seq; } - + if (this.fromSeq == seq || this.fromSeq == ds) { codon = this.mapping.map.locateInTo(pos, pos); @@ -383,7 +441,8 @@ public class AlignedCodonFrame /** * Add search results for regions in other sequences that translate or are - * translated from a particular position in seq + * translated from a particular position in seq (which may be an aligned or + * dataset sequence) * * @param seq * @param index @@ -395,9 +454,16 @@ public class AlignedCodonFrame SearchResultsI results) { SequenceI ds = seq.getDatasetSequence(); + if (ds == null) + { + ds = seq; + } for (SequenceToSequenceMapping ssm : mappings) { - ssm.markMappedRegion(ds, index, results); + if (ssm.covers(seq, true, true)) + { + ssm.markMappedRegion(ds, index, results); + } } } @@ -641,7 +707,8 @@ public class AlignedCodonFrame ds.setSequenceFeatures(dna.getSequenceFeatures()); // dnaSeqs[i] = ds; ssm.fromSeq = ds; - System.out.println("Realised mapped sequence " + ds.getName()); + jalview.bin.Console + .outPrintln("Realised mapped sequence " + ds.getName()); } } } @@ -838,9 +905,9 @@ public class AlignedCodonFrame } /** - * 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. + * Returns the first mapping found which is between the given dataset sequence + * and another, is a triplet mapping (3:1 or 1:3), and covers the full extent + * of both sequences involved * * @param seq * @return