LIB_EXPORT rc_t CC AlignAccessDBEnumerateAlignments(const AlignAccessDB *self, AlignAccessAlignmentEnumerator **align_enum) { rc_t rc; *align_enum = NULL; rc = BAMFileRewind(self->innerSelf); if (rc) return rc; rc = AlignAccessDBMakeEnumerator(self, align_enum); if (rc) return rc; return AlignAccessAlignmentEnumeratorNext(*align_enum); }
LIB_EXPORT rc_t CC AlignAccessDBWindowedAlignments(const AlignAccessDB *self, AlignAccessAlignmentEnumerator **align_enum, const char *refSeqName, uint64_t pos, uint64_t wsize ) { AlignAccessAlignmentEnumerator *lhs; unsigned i, n; const BAMRefSeq *rs; uint64_t endpos = pos + wsize; rc_t rc; BAMFileSlice *slice; *align_enum = NULL; BAMFileGetRefSeqCount(self->innerSelf, &n); for (i = 0; i != n; ++i) { BAMFileGetRefSeq(self->innerSelf, i, &rs); if (strcmp(refSeqName, rs->name) == 0) break; } if (i == n || pos >= rs->length) { return RC(rcAlign, rcTable, rcConstructing, rcParam, rcInvalid); } if (endpos > rs->length || wsize == 0) endpos = rs->length; rc = BAMFileMakeSlice(self->innerSelf, &slice, i, pos, endpos); if (rc == 0 && slice == NULL) return RC(rcAlign, rcTable, rcConstructing, rcMemory, rcExhausted); if ( rc != 0 ) { if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == (enum RCObject)rcData ) rc = AlignAccessAlignmentEnumeratorEOFCode; return rc; } rc = AlignAccessDBMakeEnumerator(self, &lhs); if (rc) return rc; lhs->refSeqID = i; lhs->endpos = endpos; lhs->startpos = pos; lhs->slice = slice; *align_enum = lhs; return AlignAccessAlignmentEnumeratorNext(*align_enum); }
void run() { GUARD(); AlignAccessAlignmentEnumerator* iter = 0; rc_t rc; { GUARD(); rc = AlignAccessDBWindowedAlignments(bam, &iter, ref, 0, 0); } while ( rc == 0 ) { ++count; GUARD(); rc = AlignAccessAlignmentEnumeratorNext(iter); } if ( !AlignAccessAlignmentEnumeratorIsEOF(rc) ) { CALL(rc); } { GUARD(); AlignAccessAlignmentEnumeratorRelease(iter); } }