X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FAlignedCodonFrame.java;fp=src%2Fjalview%2Fdatamodel%2FAlignedCodonFrame.java;h=b376c80f96b82eab60d359352198e79ad84b1309;hp=2f33e43ceb7ae9ceaa866fa728220fe868fcdd54;hb=4d71acba1cc4999e8e4061ec3e9ae55e1b37084e;hpb=105b70cd101cddf62d694776852bdbf0eeca3261 diff --git a/src/jalview/datamodel/AlignedCodonFrame.java b/src/jalview/datamodel/AlignedCodonFrame.java index 2f33e43..b376c80 100644 --- a/src/jalview/datamodel/AlignedCodonFrame.java +++ b/src/jalview/datamodel/AlignedCodonFrame.java @@ -118,15 +118,44 @@ 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,29 +167,50 @@ public class AlignedCodonFrame * (necessary for circular CDS - example EMBL:J03321:AAA91567) * and mapped length covers (at least) sequence length */ - int length = 0; + 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 - * + * Note: recommend first using the .covers(,true,true) to ensure mapping covers both sequences * @param seq * @param pos * @param sr @@ -402,7 +452,9 @@ public class AlignedCodonFrame } for (SequenceToSequenceMapping ssm : mappings) { - ssm.markMappedRegion(ds, index, results); + if (ssm.covers(seq,true,true)) { + ssm.markMappedRegion(ds, index, results); + } } }