static void thread_mark ( KmerSet * set, unsigned char thrdID ) { int i, in_num, out_num, cvgSingle; int l_cvg, r_cvg; kmer_t * rs; long long counter = 0; set->iter_ptr = 0; while ( set->iter_ptr < set->size ) { if ( !is_kmer_entity_null ( set->flags, set->iter_ptr ) ) { in_num = out_num = l_cvg = r_cvg = 0; rs = set->array + set->iter_ptr; for ( i = 0; i < 4; i++ ) { cvgSingle = get_kmer_left_cov ( *rs, i ); if ( cvgSingle > 0 ) { in_num++; l_cvg += cvgSingle; } cvgSingle = get_kmer_right_cov ( *rs, i ); if ( cvgSingle > 0 ) { out_num++; r_cvg += cvgSingle; } } if ( rs->single ) { kmerFreq[thrdID][1]++; counter++; } else { kmerFreq[thrdID][ ( l_cvg > r_cvg ? l_cvg : r_cvg )]++; } if ( in_num == 1 && out_num == 1 ) { rs->linear = 1; tips[thrdID]++; } } set->iter_ptr++; } //printf("%lld single nodes, %lld linear\n",counter,tips[thrdID]); }
static void thread_delow ( KmerSet * set, unsigned char thrdID ) { int i, in_num, out_num, cvgSingle; int l_cvg, r_cvg; kmer_t * rs; set->iter_ptr = 0; while ( set->iter_ptr < set->size ) { if ( !is_kmer_entity_null ( set->flags, set->iter_ptr ) ) { in_num = out_num = l_cvg = r_cvg = 0; rs = set->array + set->iter_ptr; for ( i = 0; i < 4; i++ ) { cvgSingle = get_kmer_left_cov ( *rs, i ); if ( cvgSingle > 0 && cvgSingle <= deLowKmer ) { set_kmer_left_cov ( *rs, i, 0 ); } cvgSingle = get_kmer_right_cov ( *rs, i ); if ( cvgSingle > 0 && cvgSingle <= deLowKmer ) { set_kmer_right_cov ( *rs, i, 0 ); } } if ( rs->l_links == 0 && rs->r_links == 0 ) { rs->deleted = 1; tips[thrdID]++; } } set->iter_ptr++; } //printf("%lld single nodes, %lld linear\n",counter,tips[thrdID]); }
void output_vertex ( char * outfile ) { char temp[256]; FILE * fp; int i; kmer_t * node; KmerSet * set; sprintf ( temp, "%s.vertex", outfile ); fp = ckopen ( temp, "w" ); for ( i = 0; i < thrd_num; i++ ) { set = KmerSets[i]; set->iter_ptr = 0; while ( set->iter_ptr < set->size ) { if ( !is_kmer_entity_null ( set->flags, set->iter_ptr ) ) { node = set->array + set->iter_ptr; output1vt ( node, fp ); } set->iter_ptr ++; } } fprintf ( fp, "\n" ); printf ( "%d vertex outputed\n", outvCounter ); fclose ( fp ); sprintf ( temp, "%s.preGraphBasic", outfile ); fp = ckopen ( temp, "w" ); fprintf ( fp, "VERTEX %d K %d\n", outvCounter, overlaplen ); fprintf ( fp, "\nEDGEs %d\n", num_ed ); fprintf ( fp, "\nMaxReadLen %d MinReadLen %d MaxNameLen %d\n", maxReadLen4all, minReadLen, maxNameLen ); fclose ( fp ); }
void make_edge ( FILE * fp ) { int i = 0; kmer_t * node1; KmerSet * set; KmerSetsPatch = ( KmerSet ** ) ckalloc ( thrd_num * sizeof ( KmerSet * ) ); for ( i = 0; i < thrd_num; i++ ) { KmerSetsPatch[i] = init_kmerset ( 1000, K_LOAD_FACTOR ); } nodeStack = ( STACK * ) createStack ( KMERPTBLOCKSIZE, sizeof ( KMER_PT ) ); bal_nodeStack = ( STACK * ) createStack ( KMERPTBLOCKSIZE, sizeof ( KMER_PT ) ); edge_c = nodeCounter = 0; edgeCounter = 0; for ( i = 0; i < thrd_num; i++ ) { set = KmerSets[i]; set->iter_ptr = 0; while ( set->iter_ptr < set->size ) { if ( !is_kmer_entity_null ( set->flags, set->iter_ptr ) ) { node1 = set->array + set->iter_ptr; startEdgeFromNode ( node1, fp ); } set->iter_ptr ++; } } printf ( "%d (%d) edges %d extra nodes\n", edge_c, edgeCounter, nodeCounter ); freeStack ( nodeStack ); freeStack ( bal_nodeStack ); }