Next version of JABA
[jabaws.git] / binaries / src / fasta34 / doinit.c
1 /*      doinit.c        general and function-specific initializations */
2
3 /* copyright (c) 1996, 1997, 1998  William R. Pearson and the U. of Virginia */
4
5 /* $Name: fa_34_26_5 $ - $Id: doinit.c,v 1.62 2007/01/08 15:38:46 wrp Exp $ */
6
7 /* this file performs general initializations of search parameters
8
9    In addition, it calls several functions in init??.c that provide
10    program-specific initializations:
11
12    f_initenv()  - called from initenv()
13    f_getopt()   - called from initenv() during a getopt() scan
14    f_getarg()   - called from initenv() after the getopt() scan
15
16 */
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21
22 #include "defs.h"
23 #include "param.h"
24 #include "upam.h"       /* required for 'U' option change of nascii */
25
26 #include "structs.h"
27
28 #define XTERNAL
29 #include "uascii.h"
30 #undef XTERNAL
31
32 extern char *s_optstr;
33 extern int optind;              /* used by getopt() */
34
35 #ifdef PCOMPLIB
36 #define PARALLEL
37 #include "p_mw.h"
38 extern char pgmdir[];
39 extern char managepgm[];
40 extern char workerpgm[];
41 extern int max_buf_cnt;
42 #define MAX_WORKERS MAXWRKR
43 #endif
44
45 char prog_name[MAX_FN];
46
47 extern void f_initenv(struct mngmsg *, struct pstruct *, unsigned char **);
48 extern void f_lastenv(struct mngmsg *, struct pstruct *);
49 extern void f_getopt(char, char *, struct mngmsg *, struct pstruct *);
50 extern void f_getarg(int, char **, int, struct mngmsg *, struct pstruct *);
51 void ann_ascii(int *qascii, char *ann_arr);
52 int set_markx(int markx, int val);
53
54 int optcnt;
55 int max_workers=MAX_WORKERS;
56 #ifdef PCOMPLIB
57 int worker_1=0;
58 int worker_n=0;
59 #endif
60 extern char *optarg;
61
62 /* initenv ()  initializes the environment */
63 void initenv (int argc, char **argv, struct mngmsg *m_msg, 
64                  struct pstruct *ppst, unsigned char **aa0)
65 {
66    char   *cptr, ctmp;
67    int     copt, itmp;
68
69    /* options for all search functions */
70    char   *g_optstr = "ab:BC:d:DE:F:HiIJ:K:l:Lm:M:N:O:QqR:T:v:V:w:W:X:z:Z:";
71    char    optstring[MAX_STR];
72
73 /*  these initializations will be used by all functions */
74
75    /* prog_name[] is only used for error messages */
76    strncpy(prog_name,argv[0],sizeof(prog_name));
77    prog_name[sizeof(prog_name)-1]='\0';
78
79 #ifdef PARALLEL
80    if ((cptr = getenv ("MANAGEPGM")) != NULL) strncpy (managepgm, cptr, 120);
81    if ((cptr = getenv ("WORKERPGM")) != NULL) strncpy (workerpgm, cptr, 120);
82    if ((cptr = getenv ("PGMDIR")) != NULL) strncpy (pgmdir, cptr, 120);
83 #endif
84
85    m_msg->ltitle[0] = '\0';
86
87    if ((cptr=getenv("FASTLIBS"))!=NULL) {
88      strncpy(m_msg->flstr,cptr,MAX_FN);
89      m_msg->flstr[MAX_FN-1] = '\0';
90    }
91    else m_msg->flstr[0]='\0';
92
93    m_msg->hist.hist_a = NULL;
94    m_msg->outfile[0] = '\0';
95    m_msg->ldnaseq = SEQT_PROT;  /* library is protein */
96    m_msg->n1_low = 0;
97    m_msg->n1_high = BIGNUM;
98    m_msg->ql_start = 1; /* start with first query sequence */
99    m_msg->ql_stop = BIGNUM;     /* end with the last query sequence */
100
101    m_msg->pamd1 = MAXSQ;
102    m_msg->pamd2 = MAXSQ;
103
104    m_msg->term_code = 0;
105    ppst->tr_type = 0;
106    ppst->debug_lib = 0;
107    m_msg->nshow = 20;
108 #if defined(PCOMPLIB)
109    m_msg->nohist = 1;
110    m_msg->mshow = 20;
111 #else
112    m_msg->nohist = 0;
113    m_msg->mshow = 50;
114 #endif
115    m_msg->ashow = -1;
116    m_msg->nmlen = DEF_NMLEN;
117    m_msg->z_bits = 1;
118    m_msg->mshow_flg = 0;
119    m_msg->aln.llen = 0;
120    m_msg->aln.llcntx = 30;
121    m_msg->aln.llcntx_flg = 0;
122    m_msg->e_cut = 10.0;
123    m_msg->e_low = 0.0;
124    m_msg->e_cut_set = 0;
125    m_msg->revcomp = 0;
126    m_msg->self = 0;
127    m_msg->long_info = 0;
128    m_msg->maxn = 0;
129    m_msg->dupn = SEQDUP;
130    m_msg->dfile[0] = '\0';
131    m_msg->tname[0] = '\0';
132    m_msg->lname[0] = '\0';
133    m_msg->show_code = 0;
134    m_msg->aln.showall = 0;
135    m_msg->markx = 0;
136    m_msg->sq0off = m_msg->sq1off = 1;
137    strncpy(m_msg->sqnam,"aa",4);
138    strncpy(m_msg->sqtype,"protein",10);
139    m_msg->ann_flg = 0;
140    m_msg->ann_arr[0] = '\0';
141    m_msg->aa0a = NULL;
142    
143    ppst->zsflag = ppst->zsflag_f = 1;
144    ppst->zs_win = 0;
145
146    ppst->zdb_size = -1;
147    ppst->dnaseq = SEQT_PROT;    /* default is protein */
148    ppst->nt_align = 0;
149
150    f_initenv (m_msg, ppst, aa0);
151
152    strncpy (optstring, g_optstr, sizeof (optstring));
153    strncat (optstring, s_optstr, sizeof (optstring));
154
155    while ((copt = getopt (argc, argv, optstring)) != EOF)
156    {
157       if (strchr (g_optstr, copt) != NULL)
158       {
159         switch (copt) {  /* switches for all options */
160         case 'a': m_msg->aln.showall = 1; break;
161         case 'b':
162           if (optarg[0] == '$') {
163             m_msg->mshow = -1;
164             m_msg->e_cut = 10000000.0;
165             break;
166           }
167           else sscanf (optarg, "%d", &m_msg->mshow);
168           m_msg->e_cut = 10000000.0;
169           m_msg->e_cut_set = 1;
170           m_msg->mshow_flg = 1;
171           break;
172         case 'B': m_msg->z_bits = 0; break;
173         case 'C': sscanf(optarg,"%d",&m_msg->nmlen);
174           if (m_msg->nmlen > MAX_UID-1) m_msg->nmlen = MAX_UID-1;
175           break;
176         case 'd': sscanf(optarg,"%d",&m_msg->ashow);
177           if (m_msg->ashow > m_msg->mshow) m_msg->mshow=m_msg->ashow;
178           /* m_msg->ashow_flg = 1; (ashow_flg not in structs.h, not used)*/
179           break;
180         case 'D': ppst->debug_lib = 1;
181           break;
182         case 'E':
183           sscanf(optarg,"%lf",&m_msg->e_cut);
184           m_msg->e_cut_set = 1;
185           break;
186         case 'F':
187           sscanf(optarg,"%lg",&m_msg->e_low);
188           m_msg->e_cut_set = 1;
189           break;
190         case 'H':
191 #if defined(PCOMPLIB)
192           m_msg->nohist = 0; break;
193 #else
194           m_msg->nohist = 1; break;
195 #endif
196         case 'i':
197           m_msg->revcomp = 1; break;
198 #ifdef PARALLEL
199         case 'I':
200           m_msg->self = 1; break;
201         case 'J':
202           if (optarg[0]==':') {
203             m_msg->ql_start = 0;
204             sscanf(optarg,":%d",&m_msg->ql_stop);
205             m_msg->ql_stop++;
206           }
207           else if (!strchr(optarg,':')) {
208             m_msg->ql_stop = BIGNUM;
209             sscanf(optarg,"%d",&m_msg->ql_start);
210           }
211           else {
212             sscanf(optarg,"%d:%d",&m_msg->ql_start,&m_msg->ql_stop);
213             m_msg->ql_stop++;
214           }
215           break;
216         case 'K':
217           sscanf(optarg,"%d",&max_buf_cnt);
218           break;
219 #endif
220         case 'l':
221           strncpy(m_msg->flstr,optarg,MAX_FN);
222           m_msg->flstr[MAX_FN-1]='\0';
223           break;
224         case 'L':
225           m_msg->long_info = 1; break;
226         case 'm':
227           sscanf(optarg,"%d%c",&itmp,&ctmp);
228           if (itmp==9 && ctmp=='c') {
229             m_msg->show_code = SHOW_CODE_ALIGN;
230           }
231           else if (itmp==9 && ctmp=='i') {
232             m_msg->show_code = SHOW_CODE_ID;
233           }
234           if (itmp > 6 && itmp != 10 && itmp != 9) itmp = 0;
235           m_msg->markx = set_markx(m_msg->markx,itmp);
236           break;
237         case 'M':
238           sscanf(optarg,"%d-%d",&m_msg->n1_low,&m_msg->n1_high);
239           if (m_msg->n1_low < 0) {
240             m_msg->n1_high = -m_msg->n1_low;
241             m_msg->n1_low = 0;
242           }
243           if (m_msg->n1_high == 0) m_msg->n1_high = BIGNUM;
244           if (m_msg->n1_low > m_msg->n1_high) {
245             fprintf(stderr," low cutoff %d greater than high %d\n",
246                     m_msg->n1_low, m_msg->n1_high);
247             m_msg->n1_low = 0;
248             m_msg->n1_high = BIGNUM;
249           }
250           break;
251         case 'N':
252           sscanf(optarg,"%d",&m_msg->maxn);
253           break;
254         case 'p':
255           m_msg->qdnaseq = SEQT_PROT;
256           ppst->dnaseq = SEQT_PROT;
257           strncpy(m_msg->sqnam,"aa",4);
258           break;
259         case 'O':
260           strncpy(m_msg->outfile,optarg,MAX_FN);
261           m_msg->outfile[MAX_FN-1]='\0';
262           break;
263         case 'q':
264         case 'Q':
265           m_msg->quiet = 1;
266           break;
267         case 'R':
268           strncpy (m_msg->dfile, optarg, MAX_FN);
269           m_msg->dfile[MAX_FN-1]='\0';
270           break;
271         case 'T':
272 #ifdef PCOMPLIB
273           if (strchr(optarg,'-') != NULL) {
274             sscanf(optarg,"%d-%d",&worker_1,&worker_n);
275             if (worker_1 > worker_n) {
276               worker_1 = worker_n = 0;
277             }
278           }
279           else 
280 #endif
281             sscanf (optarg, "%d", &max_workers);
282           if (max_workers < 0) max_workers=1;
283           break;
284         case 'v':
285           sscanf (optarg,"%d",&ppst->zs_win);
286           break;
287         case 'V':
288           strncpy(m_msg->ann_arr+1,optarg,MAX_FN-2);
289           m_msg->ann_arr[0]='\0';
290           m_msg->ann_arr[MAX_FN-2]='\0';
291           m_msg->ann_flg = 1;
292           ann_ascii(qascii, m_msg->ann_arr);
293           break;
294 /*
295         case 'V':
296           fprintf(stderr," -V option not currently supported in parallel\n");
297           break;
298 */
299         case 'w':
300           sscanf (optarg,"%d",&m_msg->aln.llen);
301           if (m_msg->aln.llen < 10) m_msg->aln.llen = 10;
302           if (m_msg->aln.llen > 200) m_msg->aln.llen = 200;
303           if (!m_msg->aln.llcntx_flg) m_msg->aln.llcntx = m_msg->aln.llen/2;
304           break;
305         case 'W':
306           sscanf (optarg,"%d",&m_msg->aln.llcntx);
307           m_msg->aln.llcntx_flg = 1;
308           break;
309         case 'X':
310           sscanf (optarg,"%ld %ld",&m_msg->sq0off,&m_msg->sq1off); break;
311         case 'z':
312           sscanf(optarg,"%d",&ppst->zsflag);
313           break;
314         case 'Z':
315           sscanf(optarg,"%ld",&ppst->zdb_size);
316           break;
317         }
318       }
319       else if (strchr (s_optstr, copt))
320          f_getopt (copt, optarg, m_msg, ppst);
321    }
322    optind--;
323
324    f_lastenv (m_msg, ppst);
325
326    if (argc - optind < 3) return;
327    m_msg->tnamesize = sizeof (m_msg->tname);
328    if (argc - optind > 1) strncpy (m_msg->tname, argv[optind + 1],MAX_FN);
329    if (argc - optind > 2) { strncpy(m_msg->lname, argv[optind + 2],MAX_FN); }
330    f_getarg (argc, argv, optind, m_msg, ppst);
331 }
332
333 int
334 ann_scan(unsigned char *aa0, int n0, struct mngmsg *m_msg, int seqtype)
335 {
336   unsigned char *aa0p, *aa0d, *aa0ad;
337   int n_n0;
338
339   /* count how many "real" residues */
340
341   if (seqtype==SEQT_UNK) {
342     for (n_n0=0, aa0p = aa0; aa0p < aa0+n0; aa0p++) {
343       if (*aa0p > '@' || *aa0p == ESS ) n_n0++;
344     }
345   }
346   else {
347     for (n_n0=0, aa0p = aa0; aa0p < aa0+n0; aa0p++) {
348       if (*aa0p < NANN ) n_n0++;
349     }
350   }
351
352   aa0d = aa0;
353   /* n_n0 has the real sequence length */
354   if ((m_msg->aa0a = calloc(n_n0+2, sizeof(char)))==NULL) {
355     fprintf(stderr," cannot allocate annotation sequence: %d\n",n_n0);
356     m_msg->ann_flg = 0;
357     if (seqtype==SEQT_UNK) {
358       for (aa0p = aa0; aa0p < aa0+n0; aa0p++) {
359         if (*aa0p > '@' || *aa0p == ESS) {*aa0d++ = *aa0p;}
360       }
361     }
362     else {
363       for (aa0p = aa0; aa0p < aa0+n0; aa0p++) {
364         if (*aa0p < NANN) {*aa0d++ = *aa0p;}
365       }
366     }
367       *aa0d = '\0';
368     return n_n0;
369   }
370
371   aa0ad = m_msg->aa0a;
372   if (seqtype==SEQT_UNK) {
373     for (aa0p = aa0; aa0p<aa0+n0; aa0p++) {
374       if (*aa0p > '@' || *aa0p == ESS) {*aa0d++ = *aa0p; *aa0ad++='\0';}
375       else if (aa0ad > m_msg->aa0a) { aa0ad[-1] = *aa0p - NANN;}
376     }
377   }
378   else {
379     for (aa0p = aa0; aa0p<aa0+n0; aa0p++) {
380       if (*aa0p < NANN) {*aa0d++ = *aa0p; *aa0ad++='\0';}
381       else if (aa0ad > m_msg->aa0a) { aa0ad[-1] = *aa0p - NANN;}
382     }
383   }
384   *aa0ad = *aa0d = '\0';
385   return n_n0;
386 }
387
388 void
389 ann_ascii(int *qascii, char *ann_arr)
390 {
391   char *ann_p;
392   int ann_ix = NANN+1;
393
394   ann_arr[0] = ' ';
395   if (strchr(ann_arr+1,'*')) {qascii['*'] = NA;}
396
397   for (ann_p = ann_arr+1; *ann_p; ann_p++) {
398     if (qascii[*ann_p] == NA) { qascii[*ann_p] = ann_ix++;}
399   }
400 }
401
402 int 
403 set_markx(int markx, int val) {
404
405   if (val < 3) {
406     return markx | (MX_ATYPE & val);
407   }
408   else if (val == 3) {
409     markx |= (MX_ATYPE + MX_ASEP);
410   }
411   else if (val == 4) {
412     markx |= (MX_ATYPE + MX_AMAP);
413   }
414   else if (val == 5) {
415     markx |= MX_AMAP;
416   }
417   else if (val == 6) {
418     markx |= (MX_HTML) ;
419   }
420   else if (val == 9) {
421     markx |= MX_M9SUMM;
422   }
423   else if (val == 10) {
424     markx |= MX_M10FORM;
425   }
426
427   return markx;
428 }