Mercurial > repos > nick > duplex
comparison mafft/core/dndfast7.c @ 18:e4d75f9efb90 draft
planemo upload commit b'4303231da9e48b2719b4429a29b72421d24310f4\n'-dirty
author | nick |
---|---|
date | Thu, 02 Feb 2017 18:44:31 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
17:836fa4fe9494 | 18:e4d75f9efb90 |
---|---|
1 #include "mltaln.h" | |
2 #include <sys/types.h> | |
3 #include <unistd.h> | |
4 #define DEBUG 0 | |
5 #define TEST 0 | |
6 | |
7 | |
8 int howmanyx( char *s ) | |
9 { | |
10 int val = 0; | |
11 if( scoremtx == -1 ) | |
12 { | |
13 do | |
14 { | |
15 if( !strchr( "atgcuATGCU", *s ) ) val++; | |
16 } while( *++s ); | |
17 } | |
18 else | |
19 { | |
20 do | |
21 { | |
22 if( !strchr( "ARNDCQEGHILKMFPSTWYV", *s ) ) val++; | |
23 } while( *++s ); | |
24 } | |
25 return( val ); | |
26 } | |
27 | |
28 void arguments( int argc, char *argv[] ) | |
29 { | |
30 int c; | |
31 | |
32 inputfile = NULL; | |
33 disopt = 0; | |
34 divpairscore = 0; | |
35 swopt = ""; | |
36 | |
37 while( --argc > 0 && (*++argv)[0] == '-' ) | |
38 { | |
39 while ( (c = *++argv[0]) ) | |
40 { | |
41 switch( c ) | |
42 { | |
43 case 'i': | |
44 inputfile = *++argv; | |
45 fprintf( stderr, "inputfile = %s\n", inputfile ); | |
46 --argc; | |
47 goto nextoption; | |
48 case 'I': | |
49 disopt = 1; | |
50 break; | |
51 case 'A': | |
52 swopt = "-A"; | |
53 break; | |
54 default: | |
55 fprintf( stderr, "illegal option %c\n", c ); | |
56 argc = 0; | |
57 break; | |
58 } | |
59 } | |
60 nextoption: | |
61 ; | |
62 } | |
63 if( argc != 0 ) | |
64 { | |
65 fprintf( stderr, "options: -i\n" ); | |
66 exit( 1 ); | |
67 } | |
68 } | |
69 | |
70 int main( int argc, char *argv[] ) | |
71 { | |
72 int ktuple; | |
73 int i, j; | |
74 FILE *hat2p; | |
75 FILE *hat3p; | |
76 FILE *infp; | |
77 char **seq = NULL; // by D.Mathog | |
78 char **seq1; | |
79 char **name; | |
80 char **name1; | |
81 static int nlen1[M]; | |
82 double **mtx; | |
83 double **mtx2; | |
84 static int nlen[M]; | |
85 static char b[B]; | |
86 double max; | |
87 char com[1000]; | |
88 int opt[M]; | |
89 int res; | |
90 char *home; | |
91 char *fastapath; | |
92 char queryfile[B]; | |
93 char datafile[B]; | |
94 char fastafile[B]; | |
95 char hat2file[B]; | |
96 int pid = (int)getpid(); | |
97 LocalHom **localhomtable, *tmpptr; | |
98 #if 0 | |
99 home = getenv( "HOME" ); | |
100 #else /* $HOME wo tsukau to fasta ni watasu hikisuu ga afureru */ | |
101 home = NULL; | |
102 #endif | |
103 fastapath = getenv( "FASTA_4_MAFFT" ); | |
104 if( !fastapath ) | |
105 fastapath = "fasta34"; | |
106 | |
107 #if DEBUG | |
108 if( home ) fprintf( stderr, "home = %s\n", home ); | |
109 #endif | |
110 if( !home ) home = ""; | |
111 sprintf( queryfile, "%s/tmp/query-%d", home, pid ); | |
112 sprintf( datafile, "%s/tmp/data-%d", home, pid ); | |
113 sprintf( fastafile, "%s/tmp/fasta-%d", home, pid ); | |
114 sprintf( hat2file, "hat2-%d", pid ); | |
115 | |
116 | |
117 arguments( argc, argv ); | |
118 | |
119 if( inputfile ) | |
120 { | |
121 infp = fopen( inputfile, "r" ); | |
122 if( !infp ) | |
123 { | |
124 fprintf( stderr, "Cannot open %s\n", inputfile ); | |
125 exit( 1 ); | |
126 } | |
127 } | |
128 else | |
129 infp = stdin; | |
130 | |
131 | |
132 | |
133 #if 0 | |
134 PreRead( stdin, &njob, &nlenmax ); | |
135 #else | |
136 dorp = NOTSPECIFIED; | |
137 getnumlen( infp ); | |
138 #endif | |
139 | |
140 if( dorp == 'd' ) | |
141 { | |
142 scoremtx = -1; | |
143 pamN = NOTSPECIFIED; | |
144 } | |
145 else | |
146 { | |
147 nblosum = 62; | |
148 scoremtx = 1; | |
149 } | |
150 constants( njob, seq ); | |
151 | |
152 rewind( infp ); | |
153 | |
154 name = AllocateCharMtx( njob, B+1 ); | |
155 name1 = AllocateCharMtx( njob, B+1 ); | |
156 seq = AllocateCharMtx( njob, nlenmax+1 ); | |
157 seq1 = AllocateCharMtx( 2, nlenmax+1 ); | |
158 mtx = AllocateDoubleMtx( njob, njob ); | |
159 mtx2 = AllocateDoubleMtx( njob, njob ); | |
160 localhomtable = (LocalHom **)calloc( njob, sizeof( LocalHom *) ); | |
161 for( i=0; i<njob; i++) | |
162 { | |
163 localhomtable[i] = (LocalHom *)calloc( njob, sizeof( LocalHom ) ); | |
164 for( j=0; j<njob; j++) | |
165 { | |
166 localhomtable[i][j].start1 = -1; | |
167 localhomtable[i][j].end1 = -1; | |
168 localhomtable[i][j].start2 = -1; | |
169 localhomtable[i][j].end2 = -1; | |
170 localhomtable[i][j].opt = -1.0; | |
171 localhomtable[i][j].next = NULL; | |
172 } | |
173 } | |
174 | |
175 #if 0 | |
176 FRead( infp, name, nlen, seq ); | |
177 #else | |
178 readData_pointer( infp, name, nlen, seq ); | |
179 #endif | |
180 fclose( infp ); | |
181 | |
182 if( scoremtx == -1 ) ktuple = 6; | |
183 else ktuple = 1; | |
184 | |
185 for( i=0; i<njob; i++ ) | |
186 { | |
187 gappick0( seq1[0], seq[i] ); | |
188 strcpy( seq[i], seq1[0] ); | |
189 } | |
190 for( j=0; j<njob; j++ ) | |
191 { | |
192 sprintf( name1[j], "+==========+%d ", j ); | |
193 nlen1[j] = nlen[j]; | |
194 } | |
195 hat2p = fopen( datafile, "w" ); | |
196 if( !hat2p ) ErrorExit( "Cannot open datafile." ); | |
197 WriteForFasta( hat2p, njob, name1, nlen1, seq ); | |
198 fclose( hat2p ); | |
199 | |
200 for( i=0; i<njob; i++ ) | |
201 { | |
202 // fprintf( stderr, "### i = %d\n", i ); | |
203 hat2p = fopen( datafile, "w" ); | |
204 if( !hat2p ) ErrorExit( "Cannot open datafile." ); | |
205 WriteForFasta( hat2p, njob-i, name1+i, nlen1+i, seq+i ); | |
206 fclose( hat2p ); | |
207 | |
208 seq1[0] = seq[i]; | |
209 nlen1[0] = nlen[i]; | |
210 | |
211 hat2p = fopen( queryfile, "w" ); | |
212 if( !hat2p ) ErrorExit( "Cannot open queryfile." ); | |
213 WriteForFasta( hat2p, 1, name1+i, nlen1, seq1 ); | |
214 fclose( hat2p ); | |
215 | |
216 | |
217 if( scoremtx == -1 ) | |
218 sprintf( com, "%s %s -z3 -m10 -n -Q -b%d -E%d -d%d %s %s %d > %s", fastapath, swopt, M, M, M, queryfile, datafile, ktuple, fastafile ); | |
219 else | |
220 sprintf( com, "%s %s -z3 -m10 -Q -b%d -E%d -d%d %s %s %d > %s", fastapath, swopt, M, M, M, queryfile, datafile, ktuple, fastafile ); | |
221 res = system( com ); | |
222 if( res ) ErrorExit( "error in fasta" ); | |
223 | |
224 | |
225 | |
226 hat2p = fopen( fastafile, "r" ); | |
227 if( hat2p == NULL ) | |
228 ErrorExit( "file 'fasta.$$' does not exist\n" ); | |
229 if( scoremtx == -1 ) | |
230 res = ReadFasta34m10_nuc( hat2p, mtx[i], i, name1, localhomtable[i] ); | |
231 else | |
232 res = ReadFasta34m10( hat2p, mtx[i], i, name1, localhomtable[i] ); | |
233 fclose( hat2p ); | |
234 | |
235 if( res < njob - i ) | |
236 { | |
237 fprintf( stderr, "count (fasta34 -z 3) = %d\n", res ); | |
238 exit( 1 ); | |
239 } | |
240 | |
241 | |
242 if( i == 0 ) | |
243 for( j=0; j<njob; j++ ) opt[j] = (int)mtx[0][j]; | |
244 | |
245 | |
246 #if 0 | |
247 { | |
248 int ii, jj; | |
249 if( i < njob-1 ) for( jj=i; jj<i+5; jj++ ) | |
250 fprintf( stdout, "mtx[%d][%d] = %f\n", i+1, jj+1, mtx[i][jj] ); | |
251 } | |
252 #endif | |
253 fprintf( stderr, "query : %4d / %5d\r", i+1, njob ); | |
254 } | |
255 | |
256 for( i=0; i<njob; i++ ) | |
257 { | |
258 max = mtx[i][i]; | |
259 if( max == 0.0 ) | |
260 { | |
261 for( j=0; j<njob; j++ ) | |
262 mtx2[i][j] = 2.0; | |
263 } | |
264 else | |
265 { | |
266 for( j=0; j<njob; j++ ) | |
267 { | |
268 // fprintf( stderr, "##### mtx[%d][%d] = %f\n", i, j, mtx[i][j] ); | |
269 mtx2[i][j] = ( max - mtx[MIN(i,j)][MAX(i,j)] ) / max * 2.0; | |
270 // fprintf( stdout, "max = %f, mtx[%d][%d] = %f -> %f\n", max, i+1, j+1, mtx[i][j], mtx2[i][j] ); | |
271 } | |
272 } | |
273 } | |
274 for( i=0; i<njob-1; i++ ) for( j=i+1; j<njob; j++ ) | |
275 { | |
276 // fprintf( stdout, "mtx2[%d][%d] = %f, %f\n", i+1, j+1, mtx2[i][j], mtx2[j][i] ); | |
277 mtx2[i][j] = MIN( mtx2[i][j], mtx2[j][i] ); | |
278 } | |
279 | |
280 #if 0 | |
281 { | |
282 int ii, jj; | |
283 if( i < njob-1 ) for( jj=i+1; jj<njob; jj++ ) | |
284 fprintf( stderr, "mtx2[][] = %f\n", mtx2[i][jj] ); | |
285 } | |
286 #endif | |
287 | |
288 for( i=0; i<njob; i++ ) name[i][0] = '='; | |
289 | |
290 if( disopt ) | |
291 { | |
292 strcpy( b, name[0] ); | |
293 sprintf( name[0], "=query====lgth=%04d-%04d %.*s", nlen[0], howmanyx( seq[0] ), B-30, b ); | |
294 #if 0 | |
295 strins( b, name[0] ); | |
296 #endif | |
297 for( i=1; i<njob; i++ ) | |
298 { | |
299 strcpy( b, name[i] ); | |
300 sprintf( name[i], "=opt=%04d=lgth=%04d-%04d %.*s", opt[i], nlen[i], howmanyx( seq[i] ), B-30, b ); | |
301 #if 0 | |
302 strins( b, name[i] ); | |
303 #endif | |
304 } | |
305 } | |
306 | |
307 hat2p = fopen( hat2file, "w" ); | |
308 if( !hat2p ) ErrorExit( "Cannot open hat2." ); | |
309 WriteHat2_pointer( hat2p, njob, name, mtx2 ); | |
310 fclose( hat2p ); | |
311 | |
312 #if 1 | |
313 fprintf( stderr, "##### writing hat3\n" ); | |
314 hat3p = fopen( "hat3", "w" ); | |
315 if( !hat3p ) ErrorExit( "Cannot open hat3." ); | |
316 for( i=0; i<njob-1; i++ ) for( j=i+1; j<njob; j++ ) | |
317 { | |
318 for( tmpptr=localhomtable[i]+j; tmpptr; tmpptr=tmpptr->next ) | |
319 { | |
320 if( tmpptr->opt == -1.0 ) continue; | |
321 fprintf( hat3p, "%d %d %d %6.3f %d %d %d %d %p\n", i, j, tmpptr->overlapaa, tmpptr->opt, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, (void *)tmpptr->next ); | |
322 } | |
323 } | |
324 fclose( hat3p ); | |
325 #endif | |
326 | |
327 sprintf( com, "/bin/rm %s %s %s", queryfile, datafile, fastafile ); | |
328 system( com ); | |
329 | |
330 #if 0 | |
331 sprintf( com, ALNDIR "/supgsdl < %s", hat2file ); | |
332 res = system( com ); | |
333 if( res ) ErrorExit( "error in spgsdl" ); | |
334 #endif | |
335 | |
336 sprintf( com, "mv %s hat2", hat2file ); | |
337 res = system( com ); | |
338 if( res ) ErrorExit( "error in mv" ); | |
339 | |
340 SHOWVERSION; | |
341 exit( 0 ); | |
342 } |