struct slRef *rbTreeItemsInRange(struct rbTree *tree, void *minItem, void *maxItem) /* Return a sorted list of references to items in tree between range. * slFreeList this list when done. */ { itList = NULL; rbTreeTraverseRange(tree, minItem, maxItem, addRef); slReverse(&itList); return itList; }
int intersectionSize(struct rbTree *tree, int start, int end) /* Return total size of things intersecting range start-end. */ { if (tree == NULL) return 0; interRange.start = start; interRange.end = end; interSize = 0; rbTreeTraverseRange(tree, &interRange, &interRange, addInterSize); return interSize; }
double averageWigForBed(struct rbTree *wigTree, struct bed *bed) /* Return average value for wig over bed. Return 0 if no data. */ { aveCount = 0; aveSum = 0.0; aveBed = bed; rbTreeTraverseRange(wigTree, bed, bed, addToAve); if (aveCount == 0) return 0; else return aveSum/aveCount; }
struct slRef *findSpaces(struct rbTree *tree, int start, int end) /* Return a list of spaces that intersect interval between start * and end. */ { static struct space space; space.start = start; space.end = end; fsList = NULL; rbTreeTraverseRange(tree, &space, &space, fsAdd); slReverse(&fsList); return fsList; }
struct range *rangeTreeAllOverlapping(struct rbTree *tree, int start, int end) /* Return list of all items in range tree that overlap interval start-end. * Do not free this list, it is owned by tree. However it is only good until * next call to rangeTreeFindInRange or rangeTreeList. Not thread safe. */ { struct range tempR; tempR.start = start; tempR.end = end; rangeList = NULL; rbTreeTraverseRange(tree, &tempR, &tempR, rangeListAdd); slReverse(&rangeList); return rangeList; }
int rangeTreeOverlapSize(struct rbTree *tree, int start, int end) /* Return the total size of intersection between interval * from start to end, and items in range tree. Sadly not * thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ { struct range tempR; tempR.start = overlapStart = start; tempR.end = overlapEnd = end; totalOverlap = 0; rbTreeTraverseRange(tree, &tempR, &tempR, addOverlap); return totalOverlap; }