*/
public boolean covers(SequenceI seq)
{
- List<int[]> 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<int[]> 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
{
* (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<int[]> 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
{
ds = seq;
}
-
+
if (this.fromSeq == seq || this.fromSeq == ds)
{
codon = this.mapping.map.locateInTo(pos, pos);
}
for (SequenceToSequenceMapping ssm : mappings)
{
- ssm.markMappedRegion(ds, index, results);
+ if (ssm.covers(seq, true, true))
+ {
+ ssm.markMappedRegion(ds, index, results);
+ }
}
}