SequenceFeature[] sfs = sq.getSequenceFeatures();
if (sfs != null)
{
- /*
- * check whether the feature start/end (base 1)
- * overlaps the selection start/end
- */
int ist = sq.findIndex(sq.getStart());
int iend = sq.findIndex(sq.getEnd());
if (iend < startPosition || ist > endPosition)
// - findIndex wastes time by starting from first character and
// counting
- int i = sq.findIndex(sf.getBegin());
- int j = sq.findIndex(sf.getEnd());
- if (j < startPosition || i > endPosition)
+ int sfStartCol = sq.findIndex(sf.getBegin());
+ int sfEndCol = sq.findIndex(sf.getEnd());
+
+ if (sf.isContactFeature())
+ {
+ /*
+ * 'contact' feature - check for 'start' or 'end'
+ * position within the selected region
+ */
+ if (sfStartCol >= startPosition
+ && sfStartCol <= endPosition)
+ {
+ bs.set(sfStartCol - 1);
+ sequenceHasFeature = true;
+ }
+ if (sfEndCol >= startPosition && sfEndCol <= endPosition)
+ {
+ bs.set(sfEndCol - 1);
+ sequenceHasFeature = true;
+ }
+ continue;
+ }
+
+ /*
+ * contiguous feature - select feature positions (if any)
+ * within the selected region
+ */
+ if (sfStartCol > endPosition || sfEndCol < startPosition)
{
// feature is outside selected region
continue;
}
sequenceHasFeature = true;
- if (i < startPosition)
+ if (sfStartCol < startPosition)
{
- i = startPosition;
+ sfStartCol = startPosition;
}
- if (i < ist)
+ if (sfStartCol < ist)
{
- i = ist;
+ sfStartCol = ist;
}
- if (j > endPosition)
+ if (sfEndCol > endPosition)
{
- j = endPosition;
+ sfEndCol = endPosition;
}
- for (; i <= j; i++)
+ for (; sfStartCol <= sfEndCol; sfStartCol++)
{
- bs.set(i - 1); // convert to base 0
+ bs.set(sfStartCol - 1); // convert to base 0
}
}
}
null));
seq3.addSequenceFeature(new SequenceFeature("Metal", "desc", 11, 15,
0f, null));
+ // disulfide bond is a 'contact feature' - only select its 'start' and 'end'
+ seq3.addSequenceFeature(new SequenceFeature("disulfide bond", "desc", 8, 12,
+ 0f, null));
/*
* select the first three columns --> Metal in seq1 2-3
assertEquals(0, bs.cardinality());
/*
+ * columns 9-11 should not match disulfide bond at 8/12
+ */
+ sg.setStartRes(8);
+ sg.setEndRes(10);
+ bs.clear();
+ seqCount = AlignViewController.findColumnsWithFeature("disulfide bond",
+ sg, bs);
+ assertEquals(0, seqCount);
+ assertEquals(0, bs.cardinality());
+
+ /*
+ * columns 6-14 should match disulfide bond at 8/12
+ */
+ sg.setStartRes(5);
+ sg.setEndRes(13);
+ bs.clear();
+ seqCount = AlignViewController.findColumnsWithFeature("disulfide bond",
+ sg, bs);
+ assertEquals(1, seqCount);
+ assertEquals(2, bs.cardinality());
+ assertTrue(bs.get(7));
+ assertTrue(bs.get(11));
+
+ /*
* look for a feature that isn't there
*/
sg.setStartRes(0);