1 /* doinit.c general and function-specific initializations */
3 /* copyright (c) 1996, 1997, 1998 William R. Pearson and the U. of Virginia */
5 /* $Name: fa_34_26_5 $ - $Id: doinit.c,v 1.62 2007/01/08 15:38:46 wrp Exp $ */
7 /* this file performs general initializations of search parameters
9 In addition, it calls several functions in init??.c that provide
10 program-specific initializations:
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
24 #include "upam.h" /* required for 'U' option change of nascii */
32 extern char *s_optstr;
33 extern int optind; /* used by getopt() */
39 extern char managepgm[];
40 extern char workerpgm[];
41 extern int max_buf_cnt;
42 #define MAX_WORKERS MAXWRKR
45 char prog_name[MAX_FN];
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);
55 int max_workers=MAX_WORKERS;
62 /* initenv () initializes the environment */
63 void initenv (int argc, char **argv, struct mngmsg *m_msg,
64 struct pstruct *ppst, unsigned char **aa0)
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];
73 /* these initializations will be used by all functions */
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';
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);
85 m_msg->ltitle[0] = '\0';
87 if ((cptr=getenv("FASTLIBS"))!=NULL) {
88 strncpy(m_msg->flstr,cptr,MAX_FN);
89 m_msg->flstr[MAX_FN-1] = '\0';
91 else m_msg->flstr[0]='\0';
93 m_msg->hist.hist_a = NULL;
94 m_msg->outfile[0] = '\0';
95 m_msg->ldnaseq = SEQT_PROT; /* library is protein */
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 */
101 m_msg->pamd1 = MAXSQ;
102 m_msg->pamd2 = MAXSQ;
104 m_msg->term_code = 0;
108 #if defined(PCOMPLIB)
116 m_msg->nmlen = DEF_NMLEN;
118 m_msg->mshow_flg = 0;
120 m_msg->aln.llcntx = 30;
121 m_msg->aln.llcntx_flg = 0;
124 m_msg->e_cut_set = 0;
127 m_msg->long_info = 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;
136 m_msg->sq0off = m_msg->sq1off = 1;
137 strncpy(m_msg->sqnam,"aa",4);
138 strncpy(m_msg->sqtype,"protein",10);
140 m_msg->ann_arr[0] = '\0';
143 ppst->zsflag = ppst->zsflag_f = 1;
147 ppst->dnaseq = SEQT_PROT; /* default is protein */
150 f_initenv (m_msg, ppst, aa0);
152 strncpy (optstring, g_optstr, sizeof (optstring));
153 strncat (optstring, s_optstr, sizeof (optstring));
155 while ((copt = getopt (argc, argv, optstring)) != EOF)
157 if (strchr (g_optstr, copt) != NULL)
159 switch (copt) { /* switches for all options */
160 case 'a': m_msg->aln.showall = 1; break;
162 if (optarg[0] == '$') {
164 m_msg->e_cut = 10000000.0;
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;
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;
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)*/
180 case 'D': ppst->debug_lib = 1;
183 sscanf(optarg,"%lf",&m_msg->e_cut);
184 m_msg->e_cut_set = 1;
187 sscanf(optarg,"%lg",&m_msg->e_low);
188 m_msg->e_cut_set = 1;
191 #if defined(PCOMPLIB)
192 m_msg->nohist = 0; break;
194 m_msg->nohist = 1; break;
197 m_msg->revcomp = 1; break;
200 m_msg->self = 1; break;
202 if (optarg[0]==':') {
204 sscanf(optarg,":%d",&m_msg->ql_stop);
207 else if (!strchr(optarg,':')) {
208 m_msg->ql_stop = BIGNUM;
209 sscanf(optarg,"%d",&m_msg->ql_start);
212 sscanf(optarg,"%d:%d",&m_msg->ql_start,&m_msg->ql_stop);
217 sscanf(optarg,"%d",&max_buf_cnt);
221 strncpy(m_msg->flstr,optarg,MAX_FN);
222 m_msg->flstr[MAX_FN-1]='\0';
225 m_msg->long_info = 1; break;
227 sscanf(optarg,"%d%c",&itmp,&ctmp);
228 if (itmp==9 && ctmp=='c') {
229 m_msg->show_code = SHOW_CODE_ALIGN;
231 else if (itmp==9 && ctmp=='i') {
232 m_msg->show_code = SHOW_CODE_ID;
234 if (itmp > 6 && itmp != 10 && itmp != 9) itmp = 0;
235 m_msg->markx = set_markx(m_msg->markx,itmp);
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;
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);
248 m_msg->n1_high = BIGNUM;
252 sscanf(optarg,"%d",&m_msg->maxn);
255 m_msg->qdnaseq = SEQT_PROT;
256 ppst->dnaseq = SEQT_PROT;
257 strncpy(m_msg->sqnam,"aa",4);
260 strncpy(m_msg->outfile,optarg,MAX_FN);
261 m_msg->outfile[MAX_FN-1]='\0';
268 strncpy (m_msg->dfile, optarg, MAX_FN);
269 m_msg->dfile[MAX_FN-1]='\0';
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;
281 sscanf (optarg, "%d", &max_workers);
282 if (max_workers < 0) max_workers=1;
285 sscanf (optarg,"%d",&ppst->zs_win);
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';
292 ann_ascii(qascii, m_msg->ann_arr);
296 fprintf(stderr," -V option not currently supported in parallel\n");
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;
306 sscanf (optarg,"%d",&m_msg->aln.llcntx);
307 m_msg->aln.llcntx_flg = 1;
310 sscanf (optarg,"%ld %ld",&m_msg->sq0off,&m_msg->sq1off); break;
312 sscanf(optarg,"%d",&ppst->zsflag);
315 sscanf(optarg,"%ld",&ppst->zdb_size);
319 else if (strchr (s_optstr, copt))
320 f_getopt (copt, optarg, m_msg, ppst);
324 f_lastenv (m_msg, ppst);
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);
334 ann_scan(unsigned char *aa0, int n0, struct mngmsg *m_msg, int seqtype)
336 unsigned char *aa0p, *aa0d, *aa0ad;
339 /* count how many "real" residues */
341 if (seqtype==SEQT_UNK) {
342 for (n_n0=0, aa0p = aa0; aa0p < aa0+n0; aa0p++) {
343 if (*aa0p > '@' || *aa0p == ESS ) n_n0++;
347 for (n_n0=0, aa0p = aa0; aa0p < aa0+n0; aa0p++) {
348 if (*aa0p < NANN ) n_n0++;
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);
357 if (seqtype==SEQT_UNK) {
358 for (aa0p = aa0; aa0p < aa0+n0; aa0p++) {
359 if (*aa0p > '@' || *aa0p == ESS) {*aa0d++ = *aa0p;}
363 for (aa0p = aa0; aa0p < aa0+n0; aa0p++) {
364 if (*aa0p < NANN) {*aa0d++ = *aa0p;}
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;}
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;}
384 *aa0ad = *aa0d = '\0';
389 ann_ascii(int *qascii, char *ann_arr)
395 if (strchr(ann_arr+1,'*')) {qascii['*'] = NA;}
397 for (ann_p = ann_arr+1; *ann_p; ann_p++) {
398 if (qascii[*ann_p] == NA) { qascii[*ann_p] = ann_ix++;}
403 set_markx(int markx, int val) {
406 return markx | (MX_ATYPE & val);
409 markx |= (MX_ATYPE + MX_ASEP);
412 markx |= (MX_ATYPE + MX_AMAP);
423 else if (val == 10) {