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; }
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; }
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; }
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; }
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; }
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; }
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; }