Beispiel #1
0
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);
}
Beispiel #2
0
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);
}
Beispiel #3
0
 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);
     }
 }