[Bio] / FigKernelScripts / fastasize.c Repository:
ViewVC logotype

Annotation of /FigKernelScripts/fastasize.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (view) (download) (as text)

1 : olson 1.3 /*
2 :     * Copyright (c) 2003-2006 University of Chicago and Fellowship
3 :     * for Interpretations of Genomes. All Rights Reserved.
4 :     *
5 :     * This file is part of the SEED Toolkit.
6 :     *
7 :     * The SEED Toolkit is free software. You can redistribute
8 :     * it and/or modify it under the terms of the SEED Toolkit
9 :     * Public License.
10 :     *
11 :     * You should have received a copy of the SEED Toolkit Public License
12 :     * along with this program; if not write to the University of Chicago
13 :     * at info@ci.uchicago.edu or the Fellowship for Interpretation of
14 :     * Genomes at veronika@thefig.info or download a copy from
15 :     * http://www.theseed.org/LICENSE.TXT.
16 :     */
17 :    
18 : olson 1.2
19 : golsen 1.1 /* fastasize.c
20 :     *
21 :     * Usage: fastasize -t < fasta_file > nseq nresidues
22 :     * or fastasize < fasta_file > id nresidues ...
23 :     *
24 :     /* These include files are appropriate for Machintosh OS X */
25 :    
26 :     #include <stdio.h>
27 :     #include <ctype.h> /* isspace() */
28 :     #include <stdlib.h> /* exit() */
29 :     #include <unistd.h> /* read() */
30 :    
31 :     #define BUFLEN (256*1024)
32 :     #define INPLEN ( 64*1024)
33 :     #define IDLEN ( 16*1024)
34 :     #define DFLT_INDEX_INTERVAL 10000
35 :    
36 :     #define fillbuf(buf, len) read( (int) 0, (void *) buf, (size_t) len )
37 :    
38 :     /* Function prototypes: */
39 :    
40 :     void report_seq( char * id, unsigned long seqlen );
41 :    
42 :     void report_ttl( int n_seq, unsigned long long ttllen );
43 :    
44 :     void usage( char *prog );
45 :    
46 :    
47 :     unsigned char buffer[BUFLEN];
48 :     char idbuf[IDLEN+1];
49 :    
50 :    
51 :     int main ( int argc, char **argv ) {
52 :     unsigned long long ttllen;
53 :     unsigned char *bptr;
54 :     unsigned long c, seqlen;
55 :     int totalonly, n_seq, idlen, ntogo;
56 :    
57 :     /* -t flag returns only the total */
58 :    
59 :     totalonly = 0;
60 :     if ( ( argc > 1 ) && ( argv[1][0] == '-' )
61 :     && ( argv[1][1] == 't' )
62 :     && ( argv[1][2] == '\0' )
63 :     ) {
64 :     totalonly = 1;
65 :     argc--;
66 :     }
67 :     else if (argc > 1 ) { usage( argv[0] ); }
68 :    
69 :     idbuf[0] = '\0'; /* initialize to empty string */
70 :     bptr = buffer; /* pointer to next character in buffer */
71 :     ntogo = 0; /* unused characters in input buffer */
72 :     n_seq = 0;
73 :     seqlen = 0;
74 :     ttllen = 0;
75 :    
76 :     /* Process one line of input */
77 :    
78 :     while ( 1 ) {
79 :     if ( ntogo <= 0 ) {
80 :     if ( ( ntogo = fillbuf( buffer, BUFLEN ) ) <= 0 ) {
81 :     if ( totalonly ) {
82 :     ttllen += seqlen;
83 :     report_ttl( n_seq, ttllen );
84 :     }
85 :     else {
86 :     report_seq( idbuf, seqlen );
87 :     }
88 :     exit( ntogo );
89 :     }
90 :     bptr= buffer;
91 :     }
92 :     c = *bptr++; ntogo--;
93 :    
94 :     /* Line could start with >, or be sequence data */
95 :    
96 :     if ( c == '>' ) {
97 :    
98 :     /* New sequence. Is there an previous sequence to report? */
99 :    
100 :     if ( ! totalonly ) report_seq( idbuf, seqlen );
101 :    
102 :     /* Adjust cumulative values and reset sequence values */
103 :    
104 :     ttllen += seqlen;
105 :     seqlen = 0;
106 :    
107 :     if ( ntogo <= 0 ) {
108 :     if ( ( ntogo = fillbuf( buffer, BUFLEN ) ) <= 0 ) {
109 :     if ( totalonly ) report_ttl( n_seq, ttllen );
110 :     exit( ntogo );
111 :     }
112 :     bptr = buffer;
113 :     }
114 :     c = *bptr++; ntogo--;
115 :    
116 :     /* Make a copy of the new id */
117 :    
118 :     idlen = 0;
119 :     while ( ( ! isspace(c) ) && ( idlen < IDLEN ) ) {
120 :     idbuf[ idlen++ ] = c;
121 :     if ( ntogo <= 0 ) {
122 :     if ( ( ntogo = fillbuf( buffer, BUFLEN ) ) <= 0 ) {
123 :     if ( totalonly ) report_ttl( n_seq, ttllen );
124 :     exit(ntogo);
125 :     }
126 :     bptr = buffer;
127 :     }
128 :     c = *bptr++; ntogo--;
129 :     }
130 :     idbuf[ idlen ] = '\0';
131 :    
132 :     /* report truncated id */
133 :    
134 :     if ( ! isspace(c) ) {
135 :     fprintf( stderr, "Sequence id truncated to %d characters:\n", (int) IDLEN );
136 :     fprintf( stderr, ">%s\n", idbuf );
137 :     }
138 :    
139 :     /* Flush the rest of the input line */
140 :    
141 :     while ( c != '\n' ) {
142 :     if ( ntogo <= 0 ) {
143 :     if ( ( ntogo = fillbuf( buffer, BUFLEN ) ) <= 0 ) {
144 :     if ( totalonly ) report_ttl( n_seq, ttllen );
145 :     exit(ntogo);
146 :     }
147 :     bptr = buffer;
148 :     }
149 :     c = *bptr++; ntogo--;
150 :     }
151 :    
152 :     n_seq++; /* First data for a new sequence */
153 :     }
154 :    
155 :     /* Not an id line, so it's data: */
156 :    
157 :     else {
158 :     while ( c != '\n' ) { /* finish the line */
159 :     if ( ! isspace( c ) ) {
160 :     seqlen++;
161 :     }
162 :    
163 :     /* Next character */
164 :    
165 :     if ( ntogo <= 0 ) {
166 :     if ( ( ntogo = fillbuf( buffer, BUFLEN ) ) <= 0 ) {
167 :     if ( totalonly ) {
168 :     ttllen += seqlen;
169 :     report_ttl( n_seq, ttllen );
170 :     }
171 :     else {
172 :     report_seq( idbuf, seqlen );
173 :     }
174 :     exit( ntogo );
175 :     }
176 :     bptr = buffer;
177 :     }
178 :     c = *bptr++; ntogo--;
179 :     }
180 :     }
181 :     /* Go back to top to process next line */
182 :     }
183 :    
184 :     exit( 0 ); /* never get here */
185 :     }
186 :    
187 :    
188 :     void report_seq( char * id, unsigned long seqlen ) {
189 :     if ( id && id[0] ) {
190 :     printf( "%s\t%lu\n", id, seqlen );
191 :     }
192 :     }
193 :    
194 :    
195 :     void report_ttl( int n_seq, unsigned long long ttllen ) {
196 :     printf( "%d\t%llu\n", n_seq, ttllen );
197 :     }
198 :    
199 :    
200 :     void usage( char *prog ) {
201 :     fprintf( stderr,
202 :     "Usage: %s -t < fasta_file > nseq \\t nresidues\n"
203 :     "or %s < fasta_file > id \\t nresidues\\n ...\n",
204 :     prog, prog
205 :     );
206 :     exit(0);
207 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3