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)++; }
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(( "]" )); }