{
/**
+ * track last start for quick insertion of ordered features
+ */
+ protected int lastStart = -1, lastContactStart = -1;
+
+ /**
* Answers the 'length' of the feature, counting 0 for non-positional features
* and 1 for contact features
*
/*
* locate the first entry in the list which does not precede the feature
*/
- int pos = findFirstBegin(list, feature.begin);
+ int begin = feature.begin;
+ int pos = findFirstBegin(list, begin);
int len = list.size();
while (pos < len)
{
SequenceFeature sf = list.get(pos);
- if (sf.begin > feature.begin)
+ if (sf.begin > begin)
{
return -1; // no match found
}
if (feature.isContactFeature())
{
+ if (feature.begin > lastContactStart)
+ {
+ lastContactStart = feature.begin;
+ }
addContactFeature(feature);
}
else if (feature.isNonPositional())
else
{
addPositionalFeature(feature);
+ if (feature.begin > lastStart)
+ {
+ lastStart = feature.begin;
+ }
}
/*
if (feature.isContactFeature())
{
return contactFeatureStarts != null
+ && feature.begin <= lastContactStart
&& listContains(contactFeatureStarts, feature);
}
- return features == null ? false : containsFeature(feature);
+ return features == null || feature.begin > lastStart ? false
+ : containsFeature(feature);
}
{
boolean contactsTainted = true;
+
/**
* internal reference to features as an ArrayList
*/
getContactEndOverlaps(from, to, result);
}
+ /**
+ * Locate the first feature start that is at or after this position.
+ *
+ */
+
+ static int ntotal = 0, ncaught = 0;
+
@Override
protected int findFirstBegin(List<SequenceFeature> list, long pos)
{
- int start = 0;
- int end = list.size() - 1;
int matched = list.size();
+ int end = matched - 1;
+ int start = (end < 0 || list.get(end).begin < pos ? matched : 0);
+ // if (end < 0)
+ // {
+ //
+ // }
+ // else if (start > end)
+ // {
+ // ncaught++;
+ // }
+ // ntotal++;
+ //
+ // System.out.println(
+ // "FSJS " + ncaught + "/" + ntotal + " " + pos + "/"
+ // + (end < 0 ? -1 : list.get(end).begin) + " "
+ // + start + "/" + matched);
while (start <= end)
{
return matched;
}
+ /**
+ * Locate the feature start that is after or at this position.
+ *
+ */
+
@Override
protected int findFirstEnd(List<SequenceFeature> list, long pos)
{
{
if (begin <= sf.end)
{
- System.out.println("\nFS found " + sf0 + "\nFS in " + sf);
+ // System.out.println("\nFSJS found " + sf0 + "\nFS in " + sf);
return sf;
}
sf = sf.containedBy;