예제 #1
0
static uint32_t remove_invalid_records( const struct ReferenceObj * const refobj,
                                        DLList * list, INSDC_coord_zero pos )
{
    uint32_t res = 0;
    spot_group * sg = ( spot_group * )DLListHead( list );
    while ( sg != NULL )
    {
        spot_group *nxt = ( spot_group * )DLNodeNext( ( DLNode * )sg );
        PlacementRecord *rec = ( PlacementRecord * )DLListHead( &sg->records );
        while ( rec != NULL )
        {
            PlacementRecord *nxt_rec = ( PlacementRecord * )DLNodeNext( ( DLNode * )rec );
            INSDC_coord_zero end_pos = ( rec->pos + rec->len );
            bool remove = ( end_pos <= pos );
            if ( !remove )
            {
                AlignmentIterator * al_iter = PlacementRecordCast ( rec, placementRecordExtension0 );
                int32_t state = AlignmentIteratorState ( al_iter, NULL );
                remove = ( ( state & align_iter_invalid ) == align_iter_invalid );
            }
            if ( remove )
            {
                DLListUnlink ( &sg->records, ( DLNode * )rec );
                PlacementRecordWhack ( rec );
            }
            else
            {
                res++;
            }
            rec = nxt_rec;
        }
        sg = nxt;
    }
    return res;
}
예제 #2
0
LIB_EXPORT uint32_t CC ReferenceIteratorBasesInserted ( const ReferenceIterator *self,
    const INSDC_4na_bin **bases )
{
    uint32_t res = align_iter_invalid;
    if ( bases != NULL )
    {
        *bases = NULL;
    }
    if ( self != NULL )
    {
        /* PlacementRecordCast returns NULL if self->current_rec is NULL */
        AlignmentIterator * al_iter = PlacementRecordCast ( self->current_rec, placementRecordExtension0 );
        if ( al_iter != NULL )
            res = AlignmentIteratorBasesInserted( al_iter, bases );
    }
    return res;
}
예제 #3
0
LIB_EXPORT int32_t CC ReferenceIteratorState ( const ReferenceIterator *self,
    INSDC_coord_zero *seq_pos )
{
    int32_t res = align_iter_invalid;
    if ( seq_pos != NULL )
    {
        *seq_pos = 0;
    }
    if ( self != NULL )
    {
        /* PlacementRecordCast returns NULL if self->current_rec is NULL */
        AlignmentIterator * al_iter = PlacementRecordCast ( self->current_rec, placementRecordExtension0 );
        if ( al_iter != NULL )
            res = AlignmentIteratorState ( al_iter, seq_pos );
    }
    return res;
}
예제 #4
0
static rc_t ref_walker_walk_alignment( struct ref_walker * self,
                                       ReferenceIterator * ref_iter,
                                       const PlacementRecord * rec,
                                       ref_walker_data * rwd )
{
    walker_rec * xrec = PlacementRecordCast ( rec, placementRecordExtension1 );
    rwd->state = ReferenceIteratorState ( ref_iter, &rwd->seq_pos );
    rwd->valid = ( ( rwd->state & align_iter_invalid ) == 0 );
    rwd->reverse = xrec->reverse;
    rwd->first = ( ( rwd->state & align_iter_first ) == align_iter_first );
    rwd->last  = ( ( rwd->state & align_iter_last ) == align_iter_last );
    rwd->skip = ( ( rwd->state & align_iter_skip ) == align_iter_skip );
    rwd->match = ( ( rwd->state & align_iter_match ) == align_iter_match );
    rwd->bin_alignment_base = ( rwd->state & 0x0F );
    rwd->ascii_alignment_base = _4na_to_ascii( rwd->state, rwd->reverse );
    if ( !self->omit_quality )
        rwd->quality = xrec->quality[ rwd->seq_pos ];
    rwd->mapq = rec->mapq;
    return self->on_alignment( rwd );
}
예제 #5
0
static void inc_alignment_iterators( DLList * list, INSDC_coord_zero pos )
{
    spot_group * sg = ( spot_group * )DLListHead( list );
    while ( sg != NULL )
    {
        spot_group *nxt = ( spot_group * )DLNodeNext( ( DLNode * )sg );
        PlacementRecord *rec = ( PlacementRecord * )DLListHead( &sg->records );
        while ( rec != NULL )
        {
            PlacementRecord *nxt_rec = ( PlacementRecord * )DLNodeNext( ( DLNode * )rec );
            AlignmentIterator * al_iter = PlacementRecordCast ( rec, placementRecordExtension0 );
            if ( rec->pos <= pos && al_iter != NULL )
            {
                AlignmentIteratorNext ( al_iter );
            }
            rec = nxt_rec;
        }
        sg = nxt;
    }
}
예제 #6
0
LIB_EXPORT uint32_t CC ReferenceIteratorBasesDeleted ( const ReferenceIterator *self,
    INSDC_coord_zero *pos, const INSDC_4na_bin **bases )
{
    uint32_t res = align_iter_invalid;
    if ( bases != NULL )
    {
        *bases = NULL;
    }
    if ( self != NULL )
    {
        /* PlacementRecordCast returns NULL if self->current_rec is NULL */
        AlignmentIterator * al_iter = PlacementRecordCast ( self->current_rec, placementRecordExtension0 );
        if ( al_iter != NULL )
        {
            INSDC_coord_zero temp_pos;
            res = AlignmentIteratorBasesDeleted( al_iter, &temp_pos );
            if ( ( res & align_iter_invalid ) != align_iter_invalid )
            {
                if ( pos != NULL ) { *pos = temp_pos; }
                /* where to get the reference-bases from ? PlacementRecord.ref ! */
                if ( res > 0 && bases != NULL )
                {
                    uint8_t * buffer = malloc( res );
                    if ( buffer != NULL )
                    {
                        INSDC_coord_len written;
                        rc_t rc = ReferenceObj_Read( self->current_rec->ref, temp_pos, res, buffer, &written );
                        if ( rc == 0 )
                        {
                            *bases = buffer;
                        }
                    }
                }
            }
        }
    }
    return res;
}
예제 #7
0
static rc_t walk_placements( walk_data * data, walk_funcs * funcs )
{
    rc_t rc;
    do
    {
        rc = ReferenceIteratorNextPlacement ( data->ref_iter, &data->rec );
        if ( GetRCState( rc ) != rcDone )
        {
            if ( rc != 0 )
            {
                LOGERR( klogInt, rc, "ReferenceIteratorNextPlacement() failed" );
            }
            else
            {
                data->state = ReferenceIteratorState ( data->ref_iter, &data->seq_pos );
                data->xrec = ( tool_rec * ) PlacementRecordCast ( data->rec, placementRecordExtension1 );
                if ( funcs->on_placement != NULL )
                    rc = funcs->on_placement( data );
            }
        }
    } while ( rc == 0 );
    if ( GetRCState( rc ) == rcDone ) { rc = 0; }
    return rc;
}
예제 #8
0
static void handle_base_pos( ReferenceIterator *ref_iter,
                             const PlacementRecord *rec,
                             uint8_t * qual,
                             bool nodebug )
{
    INSDC_coord_zero seq_pos;
    int32_t state = ReferenceIteratorState ( ref_iter, &seq_pos );
    ext_rec *xrec = ( ext_rec * ) PlacementRecordCast ( rec, placementRecordExtension1 );
    bool reverse = xrec->reverse;

    if ( !nodebug )
        OUTMSG(( "[%lu.%u ", rec->id, seq_pos ));

    *qual = xrec->quality[ seq_pos ];
    if ( ( state & align_iter_first ) == align_iter_first )
    {
        char mapq = ( rec->mapq + 33 );
        OUTMSG(( "^%c", mapq ));
    }

    if ( ( state & align_iter_last ) == align_iter_last )
        OUTMSG(( "$" ));

    if ( ( state & align_iter_insert ) == align_iter_insert )
    {
        const INSDC_4na_bin *bases;
        uint32_t n = ReferenceIteratorBasesInserted ( ref_iter, &bases );
        char * s = dup_2_ascii( bases, n, reverse );
        OUTMSG(( "+%u%s", n, s ));
        free( s );
    }

    if ( ( state & align_iter_delete ) == align_iter_delete )
    {
        const INSDC_4na_bin *bases;
        INSDC_coord_zero ref_pos;
        uint32_t n = ReferenceIteratorBasesDeleted ( ref_iter, &ref_pos, &bases );
        if ( bases != NULL )
        {
            char * s = dup_2_ascii( bases, n, reverse );
            OUTMSG(( "-%u%s", n, s ));
            free( s );
            free( (void *) bases );
        }
        else
        {
            OUTMSG(( "-%u?", n ));
        }
    }

    if ( ( state & align_iter_skip ) == align_iter_skip )
        OUTMSG(( "*" ));
    else
    {
        if ( ( state & align_iter_match ) == align_iter_match )
            OUTMSG(( "%c", reverse ? ',' : '.' ));
        else
            OUTMSG(( "%c", _4na_to_ascii( state & 0x0F, reverse ) ));
    }

    if ( !nodebug )
        OUTMSG(( "]" ));
}