/* * Copyright (C) 2009-2011 by Benedict Paten (benedictpaten (at) gmail.com) and Dent Earl (dearl (at) soe.ucsc.edu) * * Released under the MIT license, see LICENSE.txt */ #include "sonLib.h" #include "cactus.h" #include "adjacencyTraversal.h" bool getTerminalAdjacencyLength_ignoreAdjacencies = 0; char *getTerminalAdjacencySubString(Cap *cap) { if(getTerminalAdjacencyLength_ignoreAdjacencies) { return stString_copy(""); } cap = getTerminalCap(cap); cap = cap_getStrand(cap) ? cap : cap_getReverse(cap); //This ensures the asserts are as expected. Cap *adjacentCap = cap_getAdjacency(cap); int32_t i = cap_getCoordinate(cap) - cap_getCoordinate(adjacentCap); assert(i != 0); if (i > 0) { assert(cap_getSide(cap)); assert(!cap_getSide(adjacentCap)); return sequence_getString(cap_getSequence(cap), cap_getCoordinate(adjacentCap) + 1, i - 1, 1); } else { assert(cap_getSide(adjacentCap)); assert(!cap_getSide(cap)); return sequence_getString(cap_getSequence(cap), cap_getCoordinate(cap) + 1, -i - 1, 1); } } int32_t getTerminalAdjacencyLength(Cap *cap) { if(getTerminalAdjacencyLength_ignoreAdjacencies) { return 0; } char *cA = getTerminalAdjacencySubString(cap); int32_t i = strlen(cA); free(cA); return i; } Cap *getTerminalCap(Cap *cap) { Flower *nestedFlower = group_getNestedFlower(end_getGroup(cap_getEnd(cap))); if (nestedFlower != NULL) { Cap *nestedCap = flower_getCap(nestedFlower, cap_getName(cap)); assert(nestedCap != NULL); return getTerminalCap(cap_getOrientation(cap) ? nestedCap : cap_getReverse(nestedCap)); } return cap; } Segment *getCapsSegment(Cap *cap) { if (cap_getSegment(cap) != NULL) { return cap_getSegment(cap); } assert(!end_isBlockEnd(cap_getEnd(cap))); assert(end_isStubEnd(cap_getEnd(cap))); //Walk up to get the next adjacency. Group *parentGroup = flower_getParentGroup(end_getFlower(cap_getEnd(cap))); if (parentGroup != NULL) { Cap *parentCap = flower_getCap(group_getFlower(parentGroup), cap_getName(cap)); if (parentCap != NULL) { assert(cap_getOrientation(parentCap)); if (!cap_getOrientation(cap)) { parentCap = cap_getReverse(parentCap); } return getCapsSegment(parentCap); } else { //Cap must be a free stub end. assert(0); //Not in the current alignments. assert(end_isFree(cap_getEnd(cap))); } } return NULL; } Segment *getAdjacentCapsSegment(Cap *cap) { cap = getTerminalCap(cap); cap = cap_getAdjacency(cap); assert(cap != NULL); return getCapsSegment(cap); } static bool capHasGivenEvents(Cap *cap, stList *eventStrings) { const char *headerSeq = event_getHeader(cap_getEvent(cap)); for (int32_t i = 0; i < stList_length(eventStrings); i++) { if (strcmp(headerSeq, stList_get(eventStrings, i)) == 0) { return 1; } } return 0; } bool trueAdjacency(Cap *cap, stList *eventStrings) { if(getTerminalAdjacencyLength(cap) > 0) { return 0; } cap = getTerminalCap(cap); assert(cap != NULL); Cap *otherCap = cap_getAdjacency(cap); assert(otherCap != NULL); assert(cap_getAdjacency(otherCap) == cap); //So is the adjacency present in one of the haplotypes? That's what we're going to answer.. End *otherEnd = end_getPositiveOrientation(cap_getEnd(otherCap)); End_InstanceIterator *endInstanceIt = end_getInstanceIterator(cap_getEnd(cap)); Cap *cap2; while ((cap2 = end_getNext(endInstanceIt)) != NULL) { Cap *otherCap2 = cap_getAdjacency(cap2); assert(otherCap2 != NULL); if (otherEnd == end_getPositiveOrientation(cap_getEnd(otherCap2))) { //const char *eventName = event_getHeader(cap_getEvent(cap2)); assert(event_getHeader(cap_getEvent(cap2)) == event_getHeader( cap_getEvent(otherCap2))); if (capHasGivenEvents(cap2, eventStrings)) { //strcmp(eventName, "hapA1") == 0 || strcmp(eventName, "hapA2") == 0) { if(getTerminalAdjacencyLength(cap2) == 0) { end_destructInstanceIterator(endInstanceIt); return 1; } } } } end_destructInstanceIterator(endInstanceIt); return 0; } bool hasCapInEvent(End *end, const char *eventString) { Cap *cap; End_InstanceIterator *instanceIt = end_getInstanceIterator(end); while ((cap = end_getNext(instanceIt)) != NULL) { if (strcmp(event_getHeader(cap_getEvent(cap)), eventString) == 0) { end_destructInstanceIterator(instanceIt); return 1; } } end_destructInstanceIterator(instanceIt); return 0; } bool hasCapNotInEvent(End *end, const char *eventString) { Cap *cap; End_InstanceIterator *instanceIt = end_getInstanceIterator(end); while ((cap = end_getNext(instanceIt)) != NULL) { if (strcmp(event_getHeader(cap_getEvent(cap)), eventString) != 0) { end_destructInstanceIterator(instanceIt); return 1; } } end_destructInstanceIterator(instanceIt); return 0; } bool hasCapInEvents(End *end, stList *eventStrings) { for(int32_t i=0; i