static boolean checkSnapOk(struct vertex *vOld, struct vertex *vNew, boolean isRev, int bleedSize, int maxUncheckedSize, struct nibTwoCache *seqCache, char *chromName) /* Load sequence that corresponds to bleed-over, and make sure that sequence of next * exon is similar. */ { if (vertexPartOfUncuttableEdge(vOld, isRev)) return FALSE; if (bleedSize <= maxUncheckedSize) return TRUE; int minScore = bleedSize-2; boolean similar = FALSE; if (isRev) { int oldStart = vOld->position; struct slRef *eRef; struct dnaSeq *oldSeq = nibTwoCacheSeqPartExt(seqCache, chromName, oldStart, bleedSize, FALSE, NULL); for (eRef = vNew->waysIn; eRef != NULL; eRef = eRef->next) { struct edge *edge = eRef->val; struct vertex *vRest = edge->start; int newStart = vRest->position - bleedSize; struct dnaSeq *newSeq = nibTwoCacheSeqPartExt(seqCache, chromName, newStart, bleedSize, FALSE, NULL); similar = checkSeqSimilar(oldSeq, newSeq, minScore); dnaSeqFree(&newSeq); if (similar) break; } dnaSeqFree(&oldSeq); } else { int oldStart = vOld->position - bleedSize; struct slRef *eRef; struct dnaSeq *oldSeq = nibTwoCacheSeqPartExt(seqCache, chromName, oldStart, bleedSize, FALSE, NULL); for (eRef = vNew->waysOut; eRef != NULL; eRef = eRef->next) { struct edge *edge = eRef->val; struct vertex *vRest = edge->end; int newStart = vRest->position; struct dnaSeq *newSeq = nibTwoCacheSeqPartExt(seqCache, chromName, newStart, bleedSize, FALSE, NULL); similar = checkSeqSimilar(oldSeq, newSeq, minScore); dnaSeqFree(&newSeq); if (similar) break; } } return similar; }
struct dnaSeq *nibTwoCacheSeqPart(struct nibTwoCache *ntc, char *seqName, int start, int size, int *retFullSeqSize) /* Return part of sequence. If *retFullSeqSize is non-null then return full size of * sequence (not just loaded part) there. This will have repeats in lower case. */ { return nibTwoCacheSeqPartExt(ntc, seqName, start, size, TRUE, retFullSeqSize); }
static struct dnaSeq *seqReaderGet(struct seqReader *seqReader, char *seqName, int start, int end, int *retFullSeqSize) /* return part of a sequence from a seqReader. dnaSeqFree result when * complete. */ { assert(start <= end); if (seqReader->nibTwo != NULL) return nibTwoCacheSeqPartExt(seqReader->nibTwo, seqName, start, end-start, gMasked, retFullSeqSize); else return seqReaderTblGet(seqReader, seqName, start, end, retFullSeqSize); }
struct dnaSeq *loadSeqStrand(struct nibTwoCache *ntc, char *seqName, int start, int end, char strand) /* Load in a mixed case sequence, from reverse strand if * strand is '-'. */ { struct dnaSeq *seq; int size = end - start; assert(size >= 0); if (strand == '-') { reverseIntRange(&start, &end, nibTwoGetSize(ntc, seqName)); seq = nibTwoCacheSeqPartExt(ntc, seqName, start, size, TRUE, NULL); reverseComplement(seq->dna, seq->size); } else { seq = nibTwoCacheSeqPartExt(ntc, seqName, start, size, TRUE, NULL); } return seq; }