Пример #1
0
static rc_t read_loop( statistic * data,
                       context *ctx,
                       statistic_reader *reader,
                       const VCursor *my_cursor )
{
    int64_t first;
    uint64_t count;
    rc_t rc = query_reader_rowrange( reader, &first, &count );
    if ( rc != 0 )
        LogErr( klogInt, rc, "query_statistic_rowrange() failed\n" );
    else
    {
        if ( num_gen_empty( ctx->row_generator ) )
        {
            rc = num_gen_add( ctx->row_generator, first, count );
            if ( rc != 0 )
                LogErr( klogInt, rc, "num_gen_add() failed() failed\n" );
        }
        else
        {
            rc = num_gen_trim( ctx->row_generator, first, count );
            if ( rc != 0 )
                LogErr( klogInt, rc, "num_gen_trim() failed() failed\n" );
        }

        if ( rc == 0 )
        {
            const num_gen_iter *iter;
            rc = num_gen_iterator_make( ctx->row_generator, &iter );
            if ( rc != 0 )
                LogErr( klogInt, rc, "num_gen_iterator_make() failed\n" );
            else
            {
                uint64_t row_id;
                progressbar * progress;

                rc = make_progressbar( &progress );
                if ( rc != 0 )
                    LogErr( klogInt, rc, "make_progressbar() failed\n" );
                else
                {
                    uint8_t fract_digits = calc_fract_digits( iter );
                    uint32_t percent;
                    row_input row_data;

                    while ( ( num_gen_iterator_next( iter, &row_id ) == 0 )&&
                            ( rc == 0 ) )
                    {
                        rc = Quitting();
                        if ( rc == 0 )
                        {
                            /* ******************************************** */
                            rc = reader_get_data( reader, &row_data, row_id );
                            if ( rc == 0 )
                            {
                                rc = extract_statistic_from_row( data, &row_data, row_id );
                            }
                            /* ******************************************** */
                            if ( ctx->show_progress )
                                if ( num_gen_iterator_percent( iter, fract_digits, &percent ) == 0 )
                                    update_progressbar( progress, fract_digits, percent );
                        }
                    }
                    destroy_progressbar( progress );
                    if ( ctx->show_progress )
                        OUTMSG(( "\n" ));
                }
                num_gen_iterator_destroy( iter );
            }
        }
    }
    return rc;
}
Пример #2
0
static
rc_t CC qstats_trigger_impl(void *data, const VXformInfo *info, int64_t row_id,
    VRowResult *rslt, uint32_t argc, const VRowData argv[])
{
    self_t *self = data;
    unsigned const nreads = argv[2].u.data.elem_count;
    unsigned nrofs = 0;
    unsigned i;
    unsigned start;
    rc_t rc = 0;
    
    uint8_t              const *read = argv[0].u.data.base;
    uint8_t              const *qual = argv[1].u.data.base;
    uint32_t             const *rlen = argv[2].u.data.base;
    INSDC_SRA_xread_type const *rtyp = argv[3].u.data.base;
    char                 const *sgrp = argv[4].u.data.base;
    bool                 const *hmis = NULL;
    bool                 const *hrof = NULL;
    int32_t              const *rofs = NULL;
    
    read += argv[0].u.data.first_elem;
    qual += argv[1].u.data.first_elem;
    rlen += argv[2].u.data.first_elem;
    rtyp += argv[3].u.data.first_elem;
    sgrp += argv[4].u.data.first_elem;
    
    if (argc > 5) {
        hmis = argv[5].u.data.base;
        hmis += argv[5].u.data.first_elem;

        hrof = argv[6].u.data.base;
        hrof += argv[6].u.data.first_elem;
        
        rofs = argv[7].u.data.base;
        rofs += argv[7].u.data.first_elem;
        
        nrofs = argv[7].u.data.elem_count;
    }
    for (start = i = 0; i < nreads && rc == 0; ++i) {
        row_input row;
        unsigned const len = rlen[i];
        
        memset(&row, 0, sizeof(row));
        
        row.spotgroup = sgrp;
        row.spotgroup_len = argv[4].u.data.elem_count;
        
        row.read = &read[start];
        row.quality = &qual[start];
        row.read_len = row.quality_len = len;
        
        row.reversed = (rtyp[i] & SRA_READ_TYPE_REVERSE) != 0;
        row.base_pos_offset = start;
        
        start += len;
        
        if (hmis) {
            row.has_mismatch = hmis;
            row.has_roffs = hrof;
            row.roffs = rofs;
            
            row.has_mismatch_len = row.has_roffs_len = len;
            row.roffs_len = nrofs;
        }
        rc = extract_statistic_from_row(&self->stats, &row);
    }
    return rc;
}