コード例 #1
0
ファイル: pileup_counters.c プロジェクト: Bhumi28/sra-tools
static void walk_counter_state( ReferenceIterator *ref_iter, int32_t state, bool reverse,
                                pileup_counters * counters )
{
    if ( ( state & align_iter_invalid ) == align_iter_invalid )
        return;

    if ( ( state & align_iter_skip ) != align_iter_skip )
    {
        if ( ( state & align_iter_match ) == align_iter_match )
            (counters->matches)++;
        else
        {
            char c = _4na_to_ascii( state, false );
            switch( c )
            {
                case 'A' : ( counters->mismatches[ 0 ] )++; break;
                case 'C' : ( counters->mismatches[ 1 ] )++; break;
                case 'G' : ( counters->mismatches[ 2 ] )++; break;
                case 'T' : ( counters->mismatches[ 3 ] )++; break;
            }
        }
    }

    if ( reverse )
        (counters->reverse)++;
    else
        (counters->forward)++;

    if ( ( state & align_iter_insert ) == align_iter_insert )
    {
        const INSDC_4na_bin *bases;
        uint32_t n = ReferenceIteratorBasesInserted ( ref_iter, &bases );
        (counters->inserts) += n;
        count_indel_fragment( &(counters->insert_fragments), bases, n );
    }

    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 )
        {
            (counters->deletes) += n;
            count_indel_fragment( &(counters->delete_fragments), bases, n );
            free( (void *) bases );
        }
    }

    if ( ( state & align_iter_first ) == align_iter_first )
        ( counters->starting)++;

    if ( ( state & align_iter_last ) == align_iter_last )
        ( counters->ending)++;
}
コード例 #2
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(( "]" ));
}