static void computePartialReadToNodeMapping(IDnum nodeID, ReadOccurence ** readNodes, IDnum * readNodeCounts, boolean * readMarker, ReadSet * reads) { ShortReadMarker *shortMarker; IDnum index, readIndex; ReadOccurence *readArray, *readOccurence; Node *node = getNodeInGraph(graph, nodeID); ShortReadMarker *nodeArray = getNodeReads(node, graph); IDnum nodeReadCount = getNodeReadCount(node, graph); PassageMarkerI marker; for (index = 0; index < nodeReadCount; index++) { shortMarker = getShortReadMarkerAtIndex(nodeArray, index); readIndex = getShortReadMarkerID(shortMarker); readArray = readNodes[readIndex]; readOccurence = &readArray[readNodeCounts[readIndex]]; readOccurence->nodeID = nodeID; readOccurence->position = getShortReadMarkerPosition(shortMarker); readOccurence->offset = getShortReadMarkerOffset(shortMarker); readNodeCounts[readIndex]++; } for (marker = getMarker(node); marker != NULL_IDX; marker = getNextInNode(marker)) { readIndex = getPassageMarkerSequenceID(marker); if (readIndex <= 0 || reads->categories[readIndex - 1] == REFERENCE) continue; if (!readMarker[readIndex]) { readArray = readNodes[readIndex]; readOccurence = &readArray[readNodeCounts[readIndex]]; readOccurence->nodeID = nodeID; readOccurence->position = getStartOffset(marker); readOccurence->offset = getPassageMarkerStart(marker); readNodeCounts[readIndex]++; readMarker[readIndex] = true; } else { readArray = readNodes[readIndex]; readOccurence = &readArray[readNodeCounts[readIndex] - 1]; readOccurence->position = -1; readOccurence->offset = -1; } } for (marker = getMarker(node); marker != NULL_IDX; marker = getNextInNode(marker)) { readIndex = getPassageMarkerSequenceID(marker); if (readIndex > 0) readMarker[readIndex] = false; } }
void concatenateReadStarts(Node * target, Node * source, Graph * graph) { IDnum sourceLength, targetLength; ShortReadMarker *sourceArray, *targetArray, *marker; IDnum index; Coordinate position, nodeLength; if (!readStartsAreActivated(graph)) return; if (target == NULL || source == NULL) return; // Update Coordinates sourceArray = getNodeReads(source, graph); sourceLength = getNodeReadCount(source, graph); nodeLength = getNodeLength(target); for (index = 0; index < sourceLength; index++) { marker = getShortReadMarkerAtIndex(sourceArray, index); position = getShortReadMarkerPosition(marker); if (position != -1) { position += nodeLength; setShortReadMarkerPosition(marker, position); } } // Same but for symmetrical reads targetArray = getNodeReads(getTwinNode(target), graph); targetLength = getNodeReadCount(getTwinNode(target), graph); nodeLength = getNodeLength(source); for (index = 0; index < targetLength; index++) { marker = getShortReadMarkerAtIndex(targetArray, index); position = getShortReadMarkerPosition(marker); if (position != -1) { position += nodeLength; setShortReadMarkerPosition(marker, position); } } // Merging lists mergeNodeReads(target, source, graph); mergeNodeReads(getTwinNode(target), getTwinNode(source), graph); }
static void projectFromShortRead(Node * node, ShortReadMarker * shortMarker, IDnum * readPairs, Category * cats, ReadOccurence ** readNodes, IDnum * readNodeCounts, ShortLength * lengths, boolean weight) { IDnum index; IDnum readIndex = getShortReadMarkerID(shortMarker); ReadOccurence *readArray; IDnum readPairIndex; Category cat; Coordinate position = getShortReadMarkerPosition(shortMarker); Coordinate offset = getShortReadMarkerOffset(shortMarker); Coordinate length = lengths[getShortReadMarkerID(shortMarker) - 1]; Coordinate insertLength; double insertVariance; // Filter to remove useless reads if (position == -1 && offset == -1) return; // Going through single-read information if (readNodeCounts[readIndex] > 1) { readArray = readNodes[readIndex]; for (index = 0; index < readNodeCounts[readIndex]; index++) projectFromSingleRead(node, &readArray[index], position, offset, length, weight); } // Going through paired read information if (readPairs == NULL) return; readPairIndex = readPairs[readIndex - 1] + 1; if (readPairIndex == 0) return; cat = cats[readIndex - 1]; insertLength = getInsertLength(graph, cat); insertVariance = getInsertLength_var(graph, cat); readArray = readNodes[readPairIndex]; for (index = 0; index < readNodeCounts[readPairIndex]; index++) projectFromReadPair(node, &readArray[index], position, offset, insertLength, insertVariance, weight); }
static void adjustShortReadsByLength(Node * target, Coordinate nodeLength) { ShortReadMarker *targetArray, *marker; IDnum targetLength, index; Coordinate position; if (!readStartsAreActivated(graph)) return; targetArray = getNodeReads(getTwinNode(target), graph); targetLength = getNodeReadCount(getTwinNode(target), graph); for (index = 0; index < targetLength; index++) { marker = getShortReadMarkerAtIndex(targetArray, index); position = getShortReadMarkerPosition(marker); if (position != -1) { position += nodeLength; setShortReadMarkerPosition(marker, position); } } }