8 #define ARRAY_SIZE ( 1 << ( BLOCK32 * 2 ) )
12 #define T 3 /* 11 on the rightmost two bits of bin. */
13 #define C 1 /* 01 on the rightmost two bits of bin. */
14 #define G 2 /* 10 on the rightmost two bits of bin. */
17 uint mask_create( int size );
18 void block_count( char *path, uint **array_ppt, seq_entry **entry_ppt, uint mask );
21 int main( int argc, char *argv[] )
26 seq_entry *entry = NULL;
28 mask = mask_create( BLOCK_SIZE );
30 array = mem_get_zero( sizeof( uint ) * ARRAY_SIZE );
32 seq_new( &entry, MAX_SEQ_NAME, MAX_SEQ );
34 printf( "mask: %d\n", mask );
36 for ( i = 1; i < argc; i++ ) {
37 block_count( argv[ i ], &array, &entry, mask );
44 uint mask_create( int size )
46 /* Martin A. Hansen, June 2008 */
48 /* Create a bit mask. */
53 for ( i = 0; i < size; i++ )
57 mask |= 3; /* add 11 to mask */
64 void block_count( char *path, uint **array_ppt, seq_entry **entry_ppt, uint mask )
66 /* Martin A. Hansen, August 2008 */
68 /* Scan a FASTA file for ... */
70 uint *array = *array_ppt;
71 seq_entry *entry = *entry_ppt;
78 fp = read_open( path );
80 fprintf( stderr, "Processing: %s\n", path );
82 while ( ( fasta_get_entry( fp, &entry ) ) != 0 )
84 fprintf( stderr, " Counting blocks in: %s ... ", entry->seq_name );
89 for ( i = 0; entry->seq[ i ]; i++ )
93 switch( entry->seq[ i ] )
95 case 'A': case 'a': j++; break;
96 case 'T': case 't': bin |= T; j++; break;
97 case 'C': case 'c': bin |= C; j++; break;
98 case 'G': case 'g': bin |= G; j++; break;
99 default: bin = 0; j = 0; break;
104 array[ ( bin & mask ) ]++;
107 printf( "mask : %s\n", bits2string( mask ) );
108 printf( "bin : %s\n", bits2string( bin ) );
109 printf( "bin & mask: %s\n", bits2string( bin & mask ) );
114 fprintf( stderr, "done.\n" );
117 fprintf( stderr, "done.\n" );