*/
public boolean covers(SequenceI seq)
{
- return covers(seq,false);
+ return covers(seq,false,false);
}
/**
*
* @param seq
- * @param localCover - when true - compare extent of seq's dataset sequence rather than the local extent
- * @return true if mapping covers full length of given sequence
+ * @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)
+ public boolean covers(SequenceI seq, boolean localCover,boolean either)
{
- List<int[]> mappedRanges = null;
+ List<int[]> mappedRanges = null,otherRanges=null;
MapList mapList = mapping.getMap();
- int mstart=seq.getStart(),mend=seq.getEnd()
+ int mstart=seq.getStart(),mend=seq.getEnd(),ostart,oend;
;
if (fromSeq == seq || fromSeq == seq.getDatasetSequence())
{
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())
{
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 = 0;
+ int length = countRange(mappedRanges,mstart,mend);
+
+ if (length != -1)
+ {
+ // add 1 to mapped length to allow for a mapped stop codon
+ if (length + 1 >= (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 < 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 < (mend - mstart + 1))
- {
- return false;
- }
- return true;
+ return length;
+ }
}
}
{
for (SequenceI sourceAligned : al.getSequences())
{
- if (ssm.covers(sourceAligned,true))
+ if (ssm.covers(sourceAligned,true,false))
{
if (map != null)
{
{
for (SequenceI sourceAligned : al.getSequences())
{
- if (ssm.covers(sourceAligned,true))
+ if (ssm.covers(sourceAligned,true,true))
{
if (map != null)
{