Exemple #1
0
static rc_t walk_ref_iter( ReferenceIterator *ref_iter,
                           bool skip_empty,
                           bool nodebug )
{
    rc_t rc = 0;
    while( rc == 0 )
    {
        struct ReferenceObj const * refobj;
        INSDC_coord_zero first_pos;
        INSDC_coord_len len;
        rc = ReferenceIteratorNextReference( ref_iter, &first_pos, &len, &refobj );
        if ( rc == 0 && refobj != NULL )
        {
            const char *name;
            rc = ReferenceObj_SeqId( refobj, &name );
            if ( rc != 0 )
                LOGERR( klogInt, rc, "ReferenceObj_SeqId() failed" );
            else
            {
                OUTMSG(( "walking ref-iter on reference: >%s< ( from %u to %u )\n",
                         name, first_pos, first_pos + len - 1 ));
                rc = walk_ref_iter_reference( ref_iter, refobj, skip_empty, nodebug );
            }
        }
    }
    if ( GetRCState( rc ) == rcDone ) rc = 0;
    return rc;
}
Exemple #2
0
static rc_t walk_ref_iter_position( ReferenceIterator *ref_iter,
                                    struct ReferenceObj const * refobj,
                                    bool skip_empty,
                                    bool nodebug )
{
    INSDC_coord_zero pos;
    uint32_t depth;
    INSDC_4na_bin base;

    rc_t rc = ReferenceIteratorPosition ( ref_iter, &pos, &depth, &base );
    if ( rc != 0 )
    {
        if ( GetRCState( rc ) != rcDone )
            LOGERR( klogInt, rc, "ReferenceIteratorNextPos() failed" );
    }
    else
    {
        rc_t rc1 = 0;
        const char * reference_name = NULL;
        char c = _4na_to_ascii( base, false );
        rc = ReferenceObj_SeqId( refobj, &reference_name );
        if ( rc == 0 )
        {
            OUTMSG(( "%s\t%u\t%c\t%u", reference_name, pos, c, depth ));
            if ( depth > 0 )
            {
                const PlacementRecord *rec;
                rc1 = ReferenceIteratorNextPlacement ( ref_iter, &rec );
                if ( rc1 == 0 )
                {
                    uint8_t qualities[ 4096 ];
                    uint32_t i = 0;
                    OUTMSG(( "\t" ));
                    while ( rc1 == 0 )
                    {
                        handle_base_pos( ref_iter, rec, &( qualities[ i++ ] ), nodebug );
                        rc1 = ReferenceIteratorNextPlacement ( ref_iter, &rec );
                    }
                    OUTMSG(( "\t" ));
                    for ( i = 0; i < depth; ++i )
                    {
                        char c = ( qualities[ i ] + 33 );
                        OUTMSG(( "%c", c ));
                    }
                }
            }
            OUTMSG(( "\n" ));
        }
        if ( GetRCState( rc1 ) == rcDone ) rc1 = 0;
        rc = rc1;
    } 
    return rc;
}
Exemple #3
0
static rc_t build_seq_id_tree( BSTree * tree, input_files * ifs )
{
    rc_t rc = 0;
    uint32_t i;
    for ( i = 0; i < ifs->database_count && rc == 0; ++i )
    {
        input_database * id = VectorGet( &ifs->dbs, i );
        if ( id != NULL )
        {
            uint32_t rcount;
            rc = ReferenceList_Count( id->reflist, &rcount );
            if ( rc == 0 && rcount > 0 )
            {
                uint32_t r_idx;
                for ( r_idx = 0; r_idx < rcount && rc == 0; ++r_idx )
                {
                    const ReferenceObj * ref_obj;
                    rc = ReferenceList_Get( id->reflist, &ref_obj, r_idx );
                    if ( rc == 0 && ref_obj != NULL )
                    {
                        const char * seqid;
                        rc = ReferenceObj_SeqId( ref_obj, &seqid );
                        if ( rc == 0 )
                        {
                            const char * name;
                            rc = ReferenceObj_Name( ref_obj, &name );
                            if ( rc == 0 )
                            {
                                INSDC_coord_len seq_len;
                                rc = ReferenceObj_SeqLength( ref_obj, &seq_len );
                                if ( rc == 0 )
                                {
                                    seq_id_node * node = find_seq_id_node( tree, seqid );
                                    if ( node != NULL )
                                    {
                                        if ( node->seq_len != seq_len )
                                            rc = RC( rcApp, rcNoTarg, rcConstructing, rcData, rcInvalid );
                                    }
                                    else
                                        rc = add_seq_id_node( tree, seqid, name, seq_len );
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return rc;
}
Exemple #4
0
static rc_t report_ref_obj( const VDBManager *vdb_mgr, VFSManager * vfs_mgr, const char * path, uint32_t idx,
                            const ReferenceObj* ref_obj, bool extended )
{
    const char * s;
    const char * seq_id;
    INSDC_coord_len len;
    bool circular, external;
    int64_t start, stop;

    rc_t rc = ReferenceObj_Name( ref_obj, &s );
    if ( rc == 0 )
        rc = KOutMsg( "\nREF[%u].Name     = '%s'\n", idx, s );

    if ( rc == 0 )
        rc = ReferenceObj_SeqId( ref_obj, &seq_id );
    if ( rc == 0 )
        rc = KOutMsg( "REF[%u].SeqId    = '%s'\n", idx, seq_id );

    if ( rc == 0 )
        rc = ReferenceObj_SeqLength( ref_obj, &len );
    if ( rc == 0 )
        rc = KOutMsg( "REF[%u].Length   = %,u\n", idx, len );

    if ( rc == 0 )
        rc = ReferenceObj_Circular( ref_obj, &circular );
    if ( rc == 0 )
        rc = KOutMsg( "REF[%u].Circular = %s\n", idx, circular ? "yes" : "no" );

    if ( rc == 0 )
        rc = ReferenceObj_IdRange( ref_obj, &start, &stop );
    if ( rc == 0 )
        rc = KOutMsg( "REF[%u].IdRange  = [%,lu]...[%,lu]\n", idx, start, stop );

    if ( rc == 0 )
        rc = ReferenceObj_External( ref_obj, &external, NULL );
    if ( rc == 0 )
        rc = KOutMsg( "REF[%u].Extern   = %s\n", idx, external ? "yes" : "no" );
    if ( rc == 0 && external )
    {
        rc = report_ref_loc( vdb_mgr, vfs_mgr, seq_id );
    }

    if ( rc == 0 && extended )
        rc = report_ref_table2( ref_obj, start, stop );

    return rc;
}
Exemple #5
0
static rc_t ref_walker_walk_ref_range( struct ref_walker * self, ref_walker_data * rwd )
{
    ReferenceIterator * ref_iter;
    rc_t rc = AlignMgrMakeReferenceIterator ( self->amgr, &ref_iter, &self->cb_block, self->min_mapq ); /* align/iterator.h */
    if ( rc == 0 )
    {
        /* construct the reference iterator */

        uint32_t idx, count;
        uint32_t reflist_options = ref_walker_make_reflist_options( self ); /* above */
        Vector cur_id_vector;
        VectorInit ( &cur_id_vector, 0, 12 );

        rc = VNameListCount ( self->sources, &count );
        for ( idx = 0; idx < count && rc == 0; ++idx )
        {
            const char * src_name = NULL;
            rc = VNameListGet ( self->sources, idx, &src_name );
            if ( rc == 0 && src_name != NULL )
            {
                const VDatabase *db;
                rc = VDBManagerOpenDBRead ( self->vmgr, &db, self->vschema, "%s", src_name );
                if ( rc == 0 )
                {
                    const ReferenceList * ref_list;
                    rc = ReferenceList_MakeDatabase( &ref_list, db, reflist_options, 0, NULL, 0 );
                    if ( rc == 0 )
                    {
                        const ReferenceObj * ref_obj;
                        rc = ReferenceList_Find( ref_list, &ref_obj, rwd->ref_name, string_size( rwd->ref_name ) );
                        if ( rc == 0 )
                        {
                            INSDC_coord_len len;
                            rc = ReferenceObj_SeqLength( ref_obj, &len );
                            if ( rc == 0 )
                            {
                                if ( rwd->ref_start == 0 )
                                    rwd->ref_start = 1;
                                if ( ( rwd->ref_end == 0 )||( rwd->ref_end > len + 1 ) )
                                    rwd->ref_end = ( len - rwd->ref_start ) + 1;

                                if ( self->primary_alignments )
                                    rc = ref_walker_add_iterator( self, rwd->ref_name, rwd->ref_start, rwd->ref_end, src_name, 
                                            &cur_id_vector, db, ref_obj, ref_iter, TBL_PRIM, primary_align_ids );

                                if ( rc == 0 && self->secondary_alignments )
                                    rc = ref_walker_add_iterator( self, rwd->ref_name, rwd->ref_start, rwd->ref_end, src_name, 
                                            &cur_id_vector, db, ref_obj, ref_iter, TBL_SEC, secondary_align_ids );

                                if ( rc == 0 && self->evidence_alignments )
                                    rc = ref_walker_add_iterator( self, rwd->ref_name, rwd->ref_start, rwd->ref_end, src_name, 
                                            &cur_id_vector, db, ref_obj, ref_iter, TBL_EV, evidence_align_ids );

                            }
                            ReferenceObj_Release( ref_obj );
                        }
                        ReferenceList_Release( ref_list );
                    }
                    VDatabaseRelease( db );
                }
            }
        }

        if ( rc == 0 )
        {
            /* walk the reference iterator */
            struct ReferenceObj const * ref_obj;
            rc = ReferenceIteratorNextReference( ref_iter, NULL, NULL, &ref_obj );
            if ( rc == 0 && ref_obj != NULL )
            {
                if ( self->use_seq_name )
                    rc = ReferenceObj_Name( ref_obj, &rwd->ref_name );
                else
                    rc = ReferenceObj_SeqId( ref_obj, &rwd->ref_name );
                if ( rc == 0 )
                {
                    INSDC_coord_zero first_pos;
                    INSDC_coord_len len;
                    rc_t rc_w = ReferenceIteratorNextWindow ( ref_iter, &first_pos, &len );
                    while ( rc == 0 && rc_w == 0 )
                    {
                        rc_t rc_p = ReferenceIteratorNextPos ( ref_iter, !self->no_skip );
                        if ( rc_p == 0 )
                        {
                            rc = ReferenceIteratorPosition ( ref_iter, &rwd->pos, &rwd->depth, &rwd->bin_ref_base );
                            if ( rwd->depth > 0 && rc == 0 )
                            {
                                rc_t rc_sg = 0;
                                rwd->ascii_ref_base = _4na_to_ascii( rwd->bin_ref_base, false );
                                if ( self->on_enter_ref_pos != NULL )
                                    rc = self->on_enter_ref_pos( rwd );

                                while ( rc_sg == 0 && rc == 0 )
                                {
                                    rc_sg = ReferenceIteratorNextSpotGroup ( ref_iter, &rwd->spot_group, &rwd->spot_group_len );
                                    if ( rc_sg == 0 )
                                    {
                                        rc_t rc_pr = 0;
                                        if ( self->on_enter_spot_group != NULL )
                                            rc = self->on_enter_spot_group( rwd );

                                        while ( rc == 0 && rc_pr == 0 )
                                        {
                                            const PlacementRecord * rec;
                                            rc_pr = ReferenceIteratorNextPlacement ( ref_iter, &rec );
                                            if ( rc_pr == 0 && self->on_alignment != NULL )
                                                rc = ref_walker_walk_alignment( self, ref_iter, rec, rwd );
                                        }

                                        if ( self->on_exit_spot_group != NULL )
                                            rc = self->on_exit_spot_group( rwd );
                                    }
                                }
                                if ( self->on_exit_ref_pos != NULL )
                                    rc = self->on_exit_ref_pos( rwd );
                            }
                            rc = Quitting();
                        }
                    }
                }
            }
        }

        /* free cur_id_vector */

        ReferenceIteratorRelease ( ref_iter );
    }
    return rc;
}
Exemple #6
0
static rc_t ref_walker_prepare_1_src( struct ref_walker * self, const char * name )
{
    VPath * path = NULL;
    const VPath * local_cache = NULL;
    const KFile * remote_file = NULL;
    rc_t rc = VFSManagerResolveSpec ( self->vfs_mgr, name, &path, &remote_file, &local_cache, true );
    if ( rc != 0 )
    {
        PLOGERR( klogErr, ( klogErr, rc, "cannot resolve '$(n)' via VFSManager", "n=%s", name ) );
    }
    else
    {
        char buffer[ 4096 ];
        size_t num_read;
        rc = VPathReadPath ( path, buffer, sizeof buffer, &num_read );
        if ( rc != 0 )
        {
            PLOGERR( klogErr, ( klogErr, rc, "cannot read path from vpath for '$(n)'", "n=%s", name ) );
        }
        else
        {
            if ( rc == 0 )
            {
                int path_type = ( VDBManagerPathType ( self->vmgr, "%s", buffer ) & ~ kptAlias );
                if ( path_type == kptDatabase )
                {
                    const ReferenceList * reflist;
                    uint32_t options = ( ereferencelist_usePrimaryIds | 
                                         ereferencelist_useSecondaryIds |
                                         ereferencelist_useEvidenceIds );
                    rc = ReferenceList_MakePath( &reflist, self->vmgr, name, options, 0, NULL, 0 );
                    if ( rc != 0 )
                    {
                        PLOGERR( klogErr, ( klogErr, rc, "cannot create ReferenceList for '$(n)'", "n=%s", name ) );
                    }
                    else
                    {
                        uint32_t count;
                        rc = ReferenceList_Count( reflist, &count );
                        if ( rc != 0 )
                        {
                            PLOGERR( klogErr, ( klogErr, rc, "ReferenceList_Count() for '$(n)' failed", "n=%s", name ) );
                        }
                        else
                        {
                            uint32_t idx;
                            for ( idx = 0; idx < count && rc == 0; ++idx )
                            {
                                const ReferenceObj * refobj;
                                rc = ReferenceList_Get( reflist, &refobj, idx );
                                if ( rc != 0 )
                                {
                                    LOGERR( klogInt, rc, "ReferenceList_Get() failed" );
                                }
                                else
                                {
                                    const char * seqid;
                                    rc = ReferenceObj_SeqId( refobj, &seqid );
                                    if ( rc == 0 )
                                    {
                                        INSDC_coord_len seqlen;
                                        rc = ReferenceObj_SeqLength( refobj, &seqlen );
                                        if ( rc == 0 )
                                        {
                                            rc = add_region( &self->regions, seqid, 0, seqlen - 1 );
                                        }
                                    }
                                    ReferenceObj_Release( refobj );
                                }
                            }
                        }
                        ReferenceList_Release( reflist );
                    }
                }
            }
        }
        KFileRelease( remote_file );
        VPathRelease ( local_cache );
        VPathRelease ( path );
    }
    return rc;
}
Exemple #7
0
rc_t walk_0( walk_data * data, walk_funcs * funcs )
{
    rc_t rc;

    data->ref_start = 0;
    data->ref_len = 0;
    data->ref_name = NULL;
    data->ref_obj = NULL;
    data->ref_window_start = 0;
    data->ref_window_len = 0;
    data->ref_pos = 0;
    data->depth = 0;
    data->ref_base = 0;
    data->spotgroup = NULL;
    data->spotgroup_len = 0;
    data->rec = NULL;
    data->xrec = NULL;
    data->state = 0;
    data->seq_pos = 0;

    do
    {
        rc = ReferenceIteratorNextReference( data->ref_iter, &data->ref_start, &data->ref_len, &data->ref_obj );
        if ( GetRCState( rc ) != rcDone )
        {
            if ( rc != 0 )
            {
                LOGERR( klogInt, rc, "ReferenceIteratorNextReference() failed" );
            }
            else if ( data->ref_obj != NULL )
            {
                if ( data->options->use_seq_name )
                    rc = ReferenceObj_Name( data->ref_obj, &data->ref_name );
                else
                    rc = ReferenceObj_SeqId( data->ref_obj, &data->ref_name );

                if ( data->options->skiplist != NULL )
                    skiplist_enter_ref( data->options->skiplist, data->ref_name );

                if ( rc != 0 )
                {
                    if ( data->options->use_seq_name )
                    {
                        LOGERR( klogInt, rc, "ReferenceObj_Name() failed" );
                    }
                    else
                    {
                        LOGERR( klogInt, rc, "ReferenceObj_SeqId() failed" );
                    }
                }
                else
                {
					rc = ReferenceObj_SeqLength( data->ref_obj, &data->ref_len );
					if ( rc != 0 )
                    {
                        LOGERR( klogInt, rc, "ReferenceObj_SeqLength() failed" );
                    }
					else
					{
						if ( funcs->on_enter_ref != NULL )
							rc = funcs->on_enter_ref( data );
						if ( rc == 0 )
							rc = walk_ref_window( data, funcs );
						if ( rc == 0 && funcs->on_exit_ref != NULL )
							rc = funcs->on_exit_ref( data );
					}
                }
            }
        }
    } while ( rc == 0 );
    if ( GetRCState( rc ) == rcDone ) { rc = 0; }
    if ( GetRCState( rc ) == rcCanceled ) { rc = 0; }
    return rc;
}