static stList *mergeSimpleCycles2(stList *chosenEdges, stList *nonZeroWeightAdjacencyEdges, stSortedSet *allAdjacencyEdges, stList *stubEdges, stList *chainEdges) { /* * Returns a new set of chosen edges, modified by adjacency switches such that every simple cycle * contains at least one stub edge. */ /* * Calculate components. */ stList *components = getComponents2(chosenEdges, stubEdges, chainEdges); /* * Divide the components by the presence of one or more stub edges. */ stSortedSet *stubEdgesSet = stList_getSortedSet(stubEdges, (int(*)(const void *, const void *)) stIntTuple_cmpFn); stList *stubContainingComponents = stList_construct(); stList *stubFreeComponents = stList_construct(); for (int64_t i = 0; i < stList_length(components); i++) { stList *component = stList_get(components, i); stList_append( intersectionSize(stubEdgesSet, component) > 0 ? stubContainingComponents : stubFreeComponents, component); } assert(stList_length(stubContainingComponents) > 0); stSortedSet_destruct(stubEdgesSet); /* * Merge the stub containing components into one 'global' component */ stList *globalComponent = stList_join(stubContainingComponents); stList_destruct(stubContainingComponents); /* * Remove the stub/chain edges from the components. */ stList_append(stubFreeComponents, globalComponent); stList *adjacencyOnlyComponents = getStubAndChainEdgeFreeComponents( stubFreeComponents, stubEdges, chainEdges); stList_destruct(stubFreeComponents); stList_destruct(globalComponent); stList_destruct(components); //We only clean this up now, as this frees the components it contains. /* * Merge stub free components into the others. */ stList *updatedChosenEdges = mergeSimpleCycles(adjacencyOnlyComponents, nonZeroWeightAdjacencyEdges, allAdjacencyEdges); stList_destruct(adjacencyOnlyComponents); return updatedChosenEdges; }
void tAddTrf(struct chainNet *net, struct cnFill *fillList, struct rbTree *tree) /* Add t simple repeats's to all things underneath fillList. */ { struct cnFill *fill; for (fill = fillList; fill != NULL; fill = fill->next) { int s = liftStart(net->name, fill->tStart, liftHashT); fill->tTrf = intersectionSize(tree, s, s + fill->tSize); if (fill->children) tAddTrf(net, fill->children, tree); } }
void qAddTrf(struct chainNet *net, struct cnFill *fillList, struct hash *qChromHash) /* Add q new repeats to all things underneath fillList. */ { struct cnFill *fill; for (fill = fillList; fill != NULL; fill = fill->next) { struct chrom *qChrom = getQChrom(fill->qName, qChromHash); int s = liftStart(fill->qName, fill->qStart, liftHashQ); fill->qTrf = intersectionSize(qChrom->trf, s, s + fill->qSize); if (fill->children) qAddTrf(net, fill->children, qChromHash); } }
void qAddN(struct chainNet *net, struct cnFill *fillList, struct hash *qChromHash) /* Add qN's to all gaps underneath fillList. */ { struct cnFill *fill; for (fill = fillList; fill != NULL; fill = fill->next) { struct chrom *qChrom = getQChrom(fill->qName, qChromHash); struct rbTree *tree = qChrom->nGaps; int s = liftStart(fill->qName, fill->qStart, liftHashQ); fill->qN = intersectionSize(tree, s, s + fill->qSize); if (fill->children) qAddN(net, fill->children, qChromHash); } }