Delete unneeded directory
[jabaws.git] / website / archive / binaries / mac / src / fasta34 / p2_complib.c
diff --git a/website/archive/binaries/mac/src/fasta34/p2_complib.c b/website/archive/binaries/mac/src/fasta34/p2_complib.c
deleted file mode 100644 (file)
index 1ca9e44..0000000
+++ /dev/null
@@ -1,1893 +0,0 @@
-/* copyright (c) 1996, 1997, 1998, 1999 William R. Pearson and the
-   U. of Virginia */
-
-/* $Name: fa_34_26_5 $ - $Id: p2_complib.c,v 1.96 2007/01/12 20:15:16 wrp Exp $ */
-
-/*
- * pcomplib.c : Parallel library search
- * 
- *     #define FIRSTNODE 0/1 (in msg.h) can be used to reserve one node
- *     for collecting results
- *
- * Parallel specific options (from doinit.c):
- *     -J # jump to query #
- *     -I   self-comparison, do (N choose 2) comparisons
- *     -T # number of workers
- */
-
-/* This version is modifed to read all files, query and database,
-   through the manager process. Workers will now receive their
-   database from the manager, rather than reading it themselves.  This
-   cuts down considerably on NFS traffic, simplifies searches of
-   multiple files, and allows use of clusters of slave nodes that do
-   not have NFS access
-*/
-
-/* modified 5-November-2004 to ensure 15 byte (SEQ_PAD) NULL
-   padding
-
-   modified 12-December-2006 to ensure n0>0 before SEQ_PAD padding.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <time.h>
-
-#include <limits.h>
-#include <float.h>
-#include <math.h>
-
-#include <unistd.h>
-#include <sys/types.h>
-#include <signal.h>
-#include <sys/stat.h>
-
-#ifdef PVM_SRC
-#include "pvm3.h"
-char *mp_verstr="34.26, January 12, 2007 PVM";
-#endif
-
-#ifdef MPI_SRC
-#include "mpi.h"
-char *mp_verstr="34.26, January 12, 2007 MPI";
-#endif
-
-#include "msg.h"
-#include "defs.h"
-#include "mm_file.h"
-
-#include "structs.h"
-#include "param.h"
-#include "p_mw.h"
-
-#define XTERNAL
-#include "uascii.h"
-
-char pgmdir[MAX_FN];
-char workerpgm[MAX_FN];
-char managepgm[MAX_FN];
-
-#define XTERNAL
-#include "upam.h"
-#undef XTERNAL
-
-/********************************/
-/* global variable declarations */
-/********************************/
-char gstring2[MAX_STR];                  /* string for label */
-char gstring3[MAX_STR];                  /* string for label */
-char hstring1[MAX_STR];
-
-int nsfnum;    /* number of superfamily numbers */
-int sfnum[10]; /* superfamily number from types 0 and 5 */
-int nsfnum_n;
-int sfnum_n[10];
-
-/********************************/
-/* extern variable declarations */
-/********************************/
-extern char *prog_func;                /* function label */
-extern char *verstr, *iprompt0, *iprompt1, *iprompt2, *refstr;
-
-/********************************/
-/*extern function declarations  */
-/********************************/
-
-void libchoice(char *lname, int, struct mngmsg *); /* lib_sel.c */
-void libselect(char *lname, struct mngmsg *);  /* lib_sel.c */
-
-extern void closelib();
-/* check for DNA sequence (nxgetaa.c) */
-extern int scanseq(unsigned char *seq, int n, char *str);
-extern void re_ascii(int *qascii, int *sascii);
-extern int recode(unsigned char *seq, int n, int *qascii, int nsq);
-
-/* 1d to 2d pam (initxx.c) */
-extern void initpam2 (struct pstruct *ppst);
-/* initialize environment (doinit.c) */
-extern void h_init (struct pstruct *ppst, struct mngmsg *, char *);
-extern void s_abort (char *p,  char *p1);
-extern void query_parm (struct mngmsg *m_msp, struct pstruct *ppst);
-extern void last_init (struct mngmsg *, struct pstruct *, int);
-
-extern void initenv (int argc, char **argv, struct mngmsg *m_msg,
-                    struct pstruct *ppst, unsigned char **aa0);
-
-/* print hist, summaries, timing information */
-void prhist(FILE *, struct mngmsg, struct pstruct, struct hist_str, int nstats, struct db_str, char *);
-void printsum(FILE *);
-extern void ptime (FILE *, time_t);
-
-/* reset parameters if DNA sequence (initxx.c) */
-extern void resetp (struct mngmsg *, struct pstruct *);
-
-/* read a sequence (nmgetlib.c) */
-struct lmf_str *openlib(char *, int, int *, int, struct lmf_str *);
-
-#define QGETLIB (q_file_p->getlib)
-#define LGETLIB (l_file_p->getlib)
-
-/* these functions are in scaleswn.c */
-extern int process_hist(struct stat_str *sptr, int nstat,
-                       struct mngmsg m_msg, struct pstruct pst,
-                       struct hist_str *hist, void **pstat_void, int);
-extern double zs_to_E(double zs, int n1, int isdna, long, struct db_str ntt);
-extern double (*find_zp)(int score, double escore, int length, double comp, void *);
-void addhistz(double zscore, struct hist_str *);       /* scaleswn.c */
-void last_stats(const unsigned char *aa0, int n0,  
-               struct stat_str *sptr, int nstats,
-               struct beststr **bestp_arr, int nbest,
-               struct mngmsg m_msg, struct pstruct pst,
-               struct hist_str *histp, void *rs);
-
-void selectbestz(struct beststr **, int, int);
-void sortbest(struct beststr **, int, int);
-
-void showbest (FILE *fp, struct beststr **bptr, int nbest,
-              int qlib, struct mngmsg *m_msg, struct pstruct pst,
-              struct db_str ntt, char *gstring2);
-
-void showalign (FILE *fp, 
-               struct beststr **bptr, int nbest,int qlib, struct mngmsg m_msg,
-               struct pstruct pst, char *gstring2);
-
-#ifdef PVM_SRC
-char worknode[120];
-int pinums[MAXNOD],hosttid;
-int narch;
-struct pvmhostinfo *hostp;
-#endif
-
-FILE *outfd;                   /* Output file */
-
-extern time_t s_time ();                 /* fetches time for timing */
-
-/* this information is global for fsigint() */
-time_t tstart, tscan, tprev, tdone;    /* Timing */
-time_t tdstart, tddone, time();
-int max_nodes, nnodes;                 /* number of nodes */
-int node_map[MAXWRKR], node_id[MAXWRKR];
-int tot_speed,h_speed;
-int  qlib = 0; /* number of sequences scanned */
-struct db_str ntt, qtt;
-
-extern int max_workers, worker_1, worker_n;
-int  wlsn [MAXWRKR + 1];       /* number of library sequences in worker */
-int  clsn [MAXWRKR + 1];       /* number of 1st library sequence in worker */
-
-int max_buf_cnt;
-
-#ifdef PVM_SRC
-#ifndef WORKERPGM
-#define WORKERPGM "c34.work"
-#endif
-#endif
-
-main (int argc, char *argv[])
-{
-  unsigned char *aa00, *aa01, *aa0p0, *aa0p1;
-  unsigned char *aa1, *aa1ptr, *aa1prev;
-  int aa1i, *aa1i_arr; /* integer offset of sequence in buffer */
-
-  int n1;
-  int *n1tot_ptr=NULL, *n1tot_cur;
-  int n1tot_cnt=0;
-  int n1tot_v;
-
-  long l_off;
-  char nodefile[240];
-  struct pstruct pst;
-  int i_score;
-  struct lmf_str *q_file_p;
-  struct lmf_str *l_file_p;
-
-  /* from manage code */
-  struct mngmsg m_msg0, m_msg1;        /* Message from host to manager */
-  struct mngmsg *m_msp0, *m_msp1;      /* alternating pointers */
-  struct qmng_str qm_msg0, qm_msg1;    /* stuff updated for each query */
-  char q_sqnam[4]; 
-  int sstart, sstop;
-    
-  struct qmng_str *qm_msp0, *qm_msp1;  /* pointer to stuff updated */
-  int last_msg_b[10];  /* last set of numbers */
-  long curtype = ONETYPE;      /* current message type */
-  int nclib;
-  struct beststr *best,                /* array of best scores */
-                 **bptr;       /* array of pointers */
-  struct comstr bestr[BFR+1];  /* temporary structure array */
-  struct comstr2 bestr2[BFR2+1];       /* temporary structure array */
-  struct a_struct *aln_d_base=NULL;    /* alignment info for -m 9 */
-  int qres_bufsize;            /* buffer size for results */
-  struct stat_str *stats=NULL, *qstats=NULL;
-  int best_flag = 1;           /* bptr[] must be re-initialized */
-  int fast_flag = 0;           /* send new sequences before old displayed */
-  int nstats, nqstats, kstats, jstats;
-  int nbest, nres;             /* number of best scores */
-  double zbestcut = -BIGNUM;   /* z-value cutoff */
-  int lcnt;                    /* counters */
-  int nopt;
-  int i, j, k, is, id, iw, ires, naa0 = 0;
-
-  FILE *fdata=NULL;            /* file for full results */
-  struct sql *desptr;
-  struct sql *ldes;            /* descriptive lines for all lib sequences */
-  char *bline_buf, *bline_bufp;
-  char *bline_buf_mx;  /* buffer for blines */
-  char q_bline[256];
-  char t_bline[256];
-  int max_bline_b, bline_inc;
-  int *n1_arr, *m_seqnm_arr;
-  unsigned char *aa1_buf;
-
-  char tlibstr[11];            /* used only for fdata *.res files */
-  
-  int node, snode, zero;       /* Number of nodes */
-  int bufid, numt, tid;
-
-  int ave_seq_len;
-  int max_sql;
-  int ntbuff, nseq, m_seqnm;
-  int iln, ocont, maxt;
-  long loffset;
-
-  int leng;                    /* leng is length of the descriptive line */
-  fseek_t qseek,lseek;         /* seek into library of current sequence */
-  int qlcont,lcont;                    /* continued sequence */
-  int n_proc, n_tmp;
-  char errstr[120];
-  int stats_done =0;                   /* flag for z-value processing */
-  int tm_best, t_rbest, t_qrbest, t_best, t_n1;
-  double e_score, tm_escore, t_rescore, t_qrescore;
-  double zscore;                       /* tmp value */
-  double k_H, k_comp;
-  char tmp_str[MAX_FN];
-  char pgm_abbr[MAX_SSTR];
-  char *bp;
-#ifdef MPI_SRC
-  MPI_Status mpi_status;
-#endif
-
-  void fsigint();
-  
-  signal(SIGHUP,SIG_IGN);
-  if (signal(SIGINT,SIG_IGN) != SIG_IGN) signal(SIGINT,fsigint);
-  if (signal(SIGQUIT,SIG_IGN) != SIG_IGN) signal(SIGQUIT,fsigint);
-/*  if (signal(SIGSEGV,SIG_IGN) != SIG_IGN) signal(SIGSEGV,fsigint); */
-
-  /* Initialization */
-
-
-#if defined(UNIX)
-  m_msg0.quiet = !isatty(1);
-#endif
-
-  /* BFR must be %6 = 0 for TFASTA */
-  if ((BFR%6) != 0) {
-    fprintf(stderr," BFR size %d not %%6=0 - recompile\n",BFR);
-    exit(1);
-  }
-
-#ifdef MPI_SRC
-  MPI_Init(&argc, &argv);
-  MPI_Comm_rank(MPI_COMM_WORLD,&tid);
-  if (tid > 0) {
-    workcomp(tid); 
-    MPI_Finalize();
-    exit(0);
-  }
-#endif
-
-  printf("#");
-  for (i=0; i<argc; i++) {
-    if (strchr(argv[i],' ')) printf(" \"%s\"",argv[i]);
-    else printf(" %s",argv[i]);
-  }
-  printf("\n");
-
-#ifdef MPI_SRC
-  MPI_Comm_size(MPI_COMM_WORLD,&nnodes);
-  if (nnodes <= 1) {
-    fprintf(stderr," nnodes = %d; no workers available\n",nnodes);
-    exit(1);
-  }
-  else fprintf(stderr," have %d nodes\n",nnodes);
-
-  tot_speed = nnodes*100;
-#endif
-
-  h_init (&pst,&m_msg0, pgm_abbr);
-
-  initenv (argc, argv, &m_msg0, &pst, &aa00);
-
-#ifdef PVM_SRC
-  strncpy (workerpgm, WORKERPGM,sizeof(workerpgm)-1);
-  strncat(workerpgm, pgm_abbr, sizeof(workerpgm)-strlen(workerpgm)-1);
-  workerpgm[sizeof(workerpgm)-1] = '\0';
-#endif
-  
-  strncpy(q_sqnam,"aa",sizeof(q_sqnam));
-  m_msg0.quiet = 1;
-  if (m_msg0.qdnaseq != SEQT_UNK && 
-      (m_msg0.qdnaseq == SEQT_DNA || m_msg0.qdnaseq == SEQT_RNA))
-    strncpy(q_sqnam,"nt",sizeof(q_sqnam));
-
-  m_msg0.pstat_void = NULL;
-  m_msg0.hist.hist_a = NULL;
-
-  fprintf (stderr, "Pcomp library processor\n");
-  fprintf (stderr, "Using %s\n", prog_func);
-  
-  tstart = tscan = s_time();
-  tdstart = time(NULL);
-  
-
-#ifdef PVM_SRC
-  if ((hosttid=pvm_mytid())<0) {
-    pvm_perror("initialization");
-    fprintf(stderr,"can't initialize %s\n", argv[0]);
-    pvm_exit();
-    exit(1);
-  }
-  
-  pvm_config(&nnodes,&narch,&hostp);
-  fprintf(stderr,"nnodes: %d, narch: %d\n",nnodes, narch);
-  max_nodes = nnodes;
-
-#ifdef DEBUG
-  pvm_catchout(stderr);
-#endif
-
-/*  if (nnodes < 2 ) nnodes = 4; */
-  if (max_workers > 0  && nnodes > max_workers) {
-    nnodes = max_workers+FIRSTNODE;
-    fprintf(stderr," workers reset from %d to %d\n",
-           max_nodes,nnodes-FIRSTNODE);
-  }
-  else max_workers = nnodes;
-  
-  strncpy(nodefile,pgmdir,sizeof(nodefile)-1);
-  strncat(nodefile,workerpgm,sizeof(nodefile)-strlen(nodefile)-1);
-  nodefile[sizeof(nodefile)-1] = '\0';
-
-  if (worker_1 > 0) {
-    /* remap configuration to specific nodes */
-    for (i=FIRSTNODE, j=worker_1; i<nnodes && j<=worker_n; i++,j++)
-      node_id[i]=j;
-    nnodes = i;
-    max_workers = i-FIRSTNODE;
-    fprintf(stderr," workers remapped from %d to %d\n",
-           max_nodes,nnodes-FIRSTNODE);
-    max_nodes = nnodes;
-  }
-  else {
-    for (i=0; i< nnodes; i++) node_map[i]=node_id[i] = i;
-  }
-
-  if (nnodes < max_nodes) {
-    hostp++;   /* bump over host name for spawn */
-    rand_nodes(node_map,nnodes,max_nodes-1);
-    for (i=FIRSTNODE; i<nnodes; i++) {
-      numt+=pvm_spawn(nodefile,NULL,PvmTaskHost,hostp[node_map[i]].hi_name,
-                     1,&pinums[i]);
-    }
-  }
-  else {
-    /* i counts through nodes (machines) */
-    /* j counts through processes (multiple processes/node) */
-    /* node map maps the process (virtual node) to a physical node (machine) */
-
-    for (i=j=FIRSTNODE; i<nnodes && j < MAXWRKR; i++) {
-      n_proc = hostp[node_id[i]].hi_speed%100;
-      if (n_proc == 0) n_proc = 1;
-      if (n_proc > max_workers) n_proc = max_workers;
-
-      n_tmp =pvm_spawn(nodefile,NULL,PvmTaskHost,hostp[node_id[i]].hi_name,
-                      n_proc,&pinums[j]);
-      if (n_tmp < n_proc)
-       fprintf(stderr," spawn problem: %d\n", pinums[j]);
-      if (n_tmp > 0) {
-       for (k=j; k < j+n_tmp; k++) node_map[k]=node_id[i];
-       j += n_tmp;
-      }
-    }
-    nnodes = numt = j;
-  }
-
-  if (numt < nnodes) {
-    if (numt <= 0) {
-      pvm_perror("");
-      pvm_exit();
-      exit(1);
-    }
-    nnodes = numt;
-  }
-
-  for (tot_speed=0,i=FIRSTNODE; i<nnodes; i++) {
-    if (pinums[i]<0) {
-      fprintf(stderr," tids %d %8o\n",i,pinums[i]);
-      pvm_perror("");
-      pvm_exit();
-      exit(1);
-    }
-    else {
-      h_speed = hostp[node_map[tidtonode(pinums[i])]].hi_speed;
-      if (h_speed <= 0) h_speed = 100;
-      fprintf(stderr," tids %d %8o %s %5d\n",i,pinums[i],
-             hostp[node_map[tidtonode(pinums[i])]].hi_name,
-             h_speed);
-      tot_speed +=(hostp[node_map[tidtonode(pinums[i])]].hi_speed);
-    }
-  }
-
-  strncpy(worknode,nodefile,sizeof(worknode));
-  fprintf (stderr, "%3d worker programs loaded from %s\n",
-          nnodes-FIRSTNODE,worknode);
-#endif  
-
-  /* need to allocate two aa0 arrays so that the old is saved for alignments */
-
-  /* Allocate space for the query sequence */
-  if ((aa00 = (unsigned char *) malloc ((MAXTST + SEQ_PAD + 1)* sizeof (char))) == NULL)
-    s_abort ("Unable to allocate query sequence", "");
-  
-  if ((aa01 = (unsigned char *) malloc ((MAXTST + SEQ_PAD + 1) * sizeof (char))) == NULL)
-    s_abort ("Unable to allocate query sequence", "");
-  
-  fputs(iprompt0,stdout);
-  fprintf(stdout," %s%s\n",verstr,refstr);
-
-  /* Query library */
-  if (m_msg0.tname[0] == '\0') {
-      if (m_msg0.quiet == 1) s_abort("query sequence undefined","");
-      
-      fprintf(stderr, "Pvcomplib [%s]\n",mp_verstr);
-    l1:        fputs (iprompt1, stdout);
-      fflush  (stdout);
-      if (fgets (m_msg0.tname, 80, stdin) == NULL)
-       s_abort ("Unable to read query library name","");
-      if ((bp=strchr(m_msg0.tname,'\n'))!=NULL) *bp='\0';
-      if (m_msg0.tname[0] == '\0') goto l1;
-    }
-  
-  /* Open query library */
-  if ((q_file_p=
-       openlib(m_msg0.tname, m_msg0.qdnaseq,qascii,!m_msg0.quiet,NULL))==NULL) {
-      s_abort(" cannot open library ",m_msg0.tname);
-    }
-  /*
-  else {
-    printf ("searching %s library\n",m_msg0.tname);
-  }
-  */
-
-  ntt.entries = qtt.entries = 0;
-  ntt.carry = qtt.carry = 0;
-  ntt.length = qtt.length = 0l;
-
-  /* Fetch first sequence */
-  qlcont = 0;
-  while (qlib < m_msg0.ql_start) {     /* skip through query sequences */
-    pst.n0 = qm_msg0.n0 = m_msg0.n0 = 
-      QGETLIB (aa00, MAXTST, q_bline, sizeof(q_bline), &qseek, &qlcont,
-              q_file_p,&m_msg0.sq0off);
-
-    strncpy(qm_msg0.libstr,q_bline,sizeof(qm_msg0.libstr)-20);
-    qm_msg0.libstr[sizeof(qm_msg0.libstr)-21]='\0';
-    if ((bp=strchr(qm_msg0.libstr,' '))!=NULL) *bp='\0';
-
-    /* if annotations are included in sequence, remove them */
-    if (m_msg0.ann_flg) {
-      pst.n0 = qm_msg0.n0 = m_msg0.n0 = 
-       ann_scan(aa00, m_msg0.n0, &m_msg0, m_msg0.qdnaseq);
-#ifdef DEBUG
-      fprintf(stderr,"m_msp0->/aa0a is: %o/%o\n",&m_msg0,m_msg0.aa0a);
-#endif
-    }
-
-    if (m_msg0.term_code && 
-       !(m_msg0.qdnaseq == SEQT_DNA || m_msg0.qdnaseq==SEQT_RNA) &&
-       aa00[m_msg0.n0-1]!='*') {
-      aa00[m_msg0.n0++]='*';
-      aa00[m_msg0.n0]=0;
-      pst.n0 = qm_msg0.n0 = m_msg0.n0;
-    }
-
-    /* check for subset */
-    if (q_file_p->opt_text[0]!='\0') {
-      if (q_file_p->opt_text[0]=='-') {
-       sstart=0; sscanf(&q_file_p->opt_text[1],"%d",&sstop);
-      }
-      else {
-       sscanf(&q_file_p->opt_text[0],"%d-%d",&sstart,&sstop);
-       sstart--;
-       if (sstop <= 0 ) sstop = BIGNUM;
-      }
-      for (id=0,is=sstart; is<min(m_msg0.n0,sstop); ) aa00[id++]=aa00[is++];
-      aa00[id]=0;
-      pst.n0 = qm_msg0.n0 = m_msg0.n0 = min(m_msg0.n0,sstop)-sstart;
-      if (m_msg0.sq0off==1) m_msg0.sq0off = sstart+1;
-    }
-
-    qlib++;
-
-    if (m_msg0.n0 <= 0)
-      s_abort ("Unable to fetch sequence from library: ", m_msg0.tname);
-  }
-  qtt.entries=1;
-  qm_msg0.slist = 0;
-
-  /* now have correct query sequence - check sequence type and reset */
-  if (m_msg0.qdnaseq == SEQT_UNK) {    /* check for DNA sequence */
-    if (m_msg0.n0 > 20 &&
-       (float)scanseq(aa00,m_msg0.n0,"ACGTUNacgtun")/(float)m_msg0.n0>0.85) {
-      pascii = nascii;
-      m_msg0.qdnaseq = SEQT_DNA;
-    }
-    else {     /* its protein */
-      pascii = aascii;
-      m_msg0.qdnaseq = SEQT_PROT;
-    }
-
-    re_ascii(qascii,pascii);
-    init_ascii(pst.ext_sq_set,qascii,m_msg0.qdnaseq);
-    m_msg0.n0 = recode(aa00,m_msg0.n0,qascii,pst.nsqx);
-  }
-
-  /* for ALTIVEC, must pad with 15 NULL's */
-  for (i=0; i<SEQ_PAD+1; i++) {aa00[m_msg0.n0+i]=0;}
-
-  qtt.length = m_msg0.n0;
-
-  if (qlib <= 0) {
-    fprintf(stderr," no sequences found in query library\n");
-    exit(1);
-  }
-
-  resetp (&m_msg0, &pst);
-
-  sprintf(tmp_str," %d %s", qm_msg0.n0, q_sqnam);
-  leng = strlen (qm_msg0.libstr);
-  if (leng + strlen(tmp_str) >= sizeof(qm_msg0.libstr))
-    qm_msg0.libstr[sizeof(qm_msg0.libstr)-strlen(tmp_str)-2] = '\0';
-  strncat(&qm_msg0.libstr[0],tmp_str,
-         sizeof(qm_msg0.libstr)-strlen(qm_msg0.libstr)-1);
-  qm_msg0.libstr[sizeof(qm_msg0.libstr)-1]='\0';
-
-  qm_msg0.seqnm = qlib-1;
-  
-  /* Library */
-
-  if (strlen (m_msg0.lname) == 0) {
-    if (m_msg0.quiet == 1) s_abort("library name undefined","");
-    libchoice(m_msg0.lname, sizeof(m_msg0.lname), &m_msg0);
-  }
-
-  libselect(m_msg0.lname, &m_msg0);
-
-  /* Get additional parameters here */
-  if (!m_msg0.quiet) query_parm (&m_msg0, &pst);
-  
-  last_init(&m_msg0, &pst,nnodes-FIRSTNODE);
-  memcpy(&m_msg1, &m_msg0, sizeof(m_msg0));
-  
-  /* m_msg0.maxn needs to be set to MAXLIB or MAXTRN, depending on the
-     function - max_tot has the MAXTST + (MAXLIB|MAXTRN) */
-  if (m_msg0.maxn <= 0) m_msg0.maxn = m_msg0.max_tot - MAXTST;
-
-  if (m_msg0.maxn < 2 * m_msg0.dupn) m_msg0.maxn = 5*m_msg0.dupn;
-  pst.maxlen = m_msg0.maxn;
-
-  m_msg0.loff = m_msg0.dupn;
-  m_msg0.maxt3 = m_msg0.maxn-m_msg0.loff;
-
-
-  /* ******************** */
-  /* initial manager code */
-  /* ******************** */
-  
-  outfd = stdout;
-  if (m_msg0.outfile[0]!='\0') {
-    if ((outfd = fopen(m_msg0.outfile,"w"))==NULL) {
-      fprintf(stderr, "cannot open %s for output\n", m_msg0.outfile);
-      outfd = stdout;
-    }
-  }
-
-  /* Label the output */
-  printf("Query library %s vs %s library\n", m_msg0.tname, m_msg0.lname);
-  
-  /* Allocate space for saved scores */
-  if ((best = 
-       (struct beststr *)malloc((MAXBEST+1)*sizeof(struct beststr)))==NULL)
-    s_abort ("Cannot allocate best struct","");
-  if ((bptr = 
-       (struct beststr **)malloc((MAXBEST+1)*sizeof(struct beststr *)))==NULL)
-    s_abort ("Cannot allocate bptr","");
-  
-  /* Initialize bptr */
-  for (nbest = 0; nbest < MAXBEST+1; nbest++)
-    bptr[nbest] = &best[nbest];
-
-  best++; bptr++;
-  best[-1].score[0]=best[-1].score[1]=best[-1].score[2]=INT_MAX;
-  best[-1].zscore = FLT_MAX;
-  best[-1].escore = FLT_MIN;
-  best_flag = 0;
-  
-  if ((stats =
-       (struct stat_str *)calloc((size_t)MAXSTATS,sizeof(struct stat_str)))
-      ==NULL)
-    s_abort ("Cannot allocate stats struct","");
-  nstats = 0;
-
-  /* Now open the second library, divide it, send sequences to all workers */
-  /* Set up buffer for reading the library:
-
-     We will start by using a 2 Mbyte buffer for each worker.  For
-     proteins, that means 5,000 sequences of length 400 (average).
-     For DNA, that means 2,000 sequences of length 1000.  At the moment,
-     those are good averages.
-     */
-
-  if (max_buf_cnt <= 0) {
-    if (m_msg0.ldnaseq==SEQT_DNA) max_buf_cnt = MAX_NT_BUF;
-    else max_buf_cnt = MAX_AA_BUF;
-  }
-
-  if (m_msg0.ldnaseq==SEQT_DNA) ave_seq_len = AVE_NT_LEN;
-  else ave_seq_len = AVE_AA_LEN;
-
-  /* however - buffer sizes should be a function of the number of
-     workers so that all the workers are kept busy.  Assuming a 10,000
-     entry library is the smallest we want to schedule, then
-     */
-
-  if (max_buf_cnt > 10000/(nnodes-FIRSTNODE)) 
-    max_buf_cnt = 10000/(2*(nnodes-FIRSTNODE));
-
-  /* allocate space for sequence buffers */
-
-  m_msg0.pbuf_siz=max_buf_cnt*ave_seq_len;
-  if (m_msg0.pbuf_siz < 5*m_msg0.maxn)
-    m_msg0.pbuf_siz = 5*m_msg0.maxn;
-
-#ifdef PVM_SRC 
-#ifdef ROUTE_DIRECT
-  pvm_setopt(PvmRoute,PvmRouteDirect);
-#endif
-  pvm_initsend(PvmDataRaw);
-  pvm_pkint(&nnodes,1,1);
-  pvm_pkint(pinums,nnodes,1);
-  pvm_pkbyte((char *)&m_msg0,(int)sizeof(m_msg0),1);
-  for (node = FIRSTNODE; node<nnodes; node++) 
-    if (pvm_send(pinums[node],STARTTYPE0)<0) {
-      pvm_perror("pvm_send1");
-      pvm_exit();
-      exit(1);
-    }
-#endif
-#ifdef MPI_SRC
-  for (node = FIRSTNODE; node<nnodes; node++)  {
-    MPI_Send(&m_msg0,(int)sizeof(m_msg0),MPI_BYTE,node,STARTTYPE0,
-            MPI_COMM_WORLD);
-  }
-#endif
-
-  /* now send pst, sascii */
-#ifdef PVM_SRC
-  pvm_initsend(PvmDataRaw);
-  pvm_pkbyte((char *)&pst,(int)sizeof(pst),1);
-  pvm_pkbyte((char *)pascii,(int)sizeof(aascii),1);
-
-  for (node = FIRSTNODE; node< nnodes; node++)
-    pvm_send(pinums[node],STARTTYPE1);
-
-  /* send pam12 */
-  pvm_initsend(PvmDataRaw);
-  pvm_pkint(pam12,m_msg0.pamd1*m_msg0.pamd2,1);
-  for (node = FIRSTNODE; node< nnodes; node++)
-    pvm_send(pinums[node],STARTTYPE2);
-
-  /* send pam12x */
-  pvm_initsend(PvmDataRaw);
-  pvm_pkint(pam12x,m_msg0.pamd1*m_msg0.pamd2,1);
-  for (node = FIRSTNODE; node< nnodes; node++)
-    pvm_send(pinums[node],STARTTYPE3);
-
-#endif
-#ifdef MPI_SRC
-  for (node=FIRSTNODE; node < nnodes; node++) {
-    MPI_Send(&pst,(int)sizeof(pst),MPI_BYTE,node,STARTTYPE1,
-            MPI_COMM_WORLD);
-    MPI_Send(pascii,(int)sizeof(aascii),MPI_BYTE,node,STARTTYPE1,
-            MPI_COMM_WORLD);
-    MPI_Send(pam12,m_msg0.pamd1*m_msg0.pamd2,MPI_INT,node,STARTTYPE2,
-            MPI_COMM_WORLD);
-    MPI_Send(pam12x,m_msg0.pamd1*m_msg0.pamd2,MPI_INT,node,STARTTYPE3,
-            MPI_COMM_WORLD);
-  }
-#endif
-
-  if ((n1_arr =
-       (int *)calloc((size_t)(max_buf_cnt+1),sizeof(int)))
-      ==NULL) {
-    fprintf(stderr," cannot allocate n1_arr %d\n",max_buf_cnt+1);
-    s_abort(" cannot allocate n1_arr","");
-    exit(1);
-  }
-
-  if ((aa1i_arr =
-       (int *)calloc((size_t)(max_buf_cnt+1),sizeof(int)))
-      ==NULL) {
-    fprintf(stderr," cannot allocate aa1i_arr %d\n",max_buf_cnt+1);
-    s_abort(" cannot allocate aa1i_arr","");
-    exit(1);
-  }
-
-  if ((m_seqnm_arr=
-       (int *)calloc((size_t)(max_buf_cnt+1),sizeof(int)))
-      ==NULL) {
-    fprintf(stderr," cannot allocate m_seqnm_arr %d\n",max_buf_cnt+1);
-    s_abort(" cannot allocate m_seqnm_arr","");
-    exit(1);
-  }
-
-  if ((aa1_buf =
-       (unsigned char *)calloc((size_t)(m_msg0.pbuf_siz),sizeof(unsigned char)))
-      ==NULL) {
-    s_abort(" cannot allocate library buffer %d","");
-    exit(1);
-  }
-
-
-  /* also allocate space for descriptions.  Assume max of 250,000 sequences/
-     worker for now
-  */
-
-  /* max_sql is the maxinum number of library sequences that can be stored */
-  max_sql = MAXSQL;
-
-  if ((ldes=(struct sql *)calloc(max_sql,sizeof(struct sql)))==NULL) {
-    fprintf(stderr," failure to allocate ldes(%d) %ld\n",
-           max_sql,max_sql*sizeof(struct sql));
-    s_abort("cannot allocate ldes","");
-    exit(1);
-  }
-
-  max_bline_b = MAXSQL * (m_msg0.aln.llen+1)/4;
-  bline_inc = m_msg0.aln.llen;
-  if (m_msg0.markx & MX_M9SUMM) bline_inc += 40;
-
-  i = 4;
-  while (i-- > 0) {
-    if ((bline_buf=(char *)calloc(max_bline_b,sizeof(char)))!=NULL) break;
-    max_bline_b /= 2;
-    bline_inc /= 2;
-  }
-  if (bline_buf == NULL) {
-    fprintf(stderr," failure to allocate bline_buf(%d) %d\n",
-           max_sql,max_bline_b);
-    s_abort(" cannot allocate bline_buf","");
-  }
-
-  bline_bufp = bline_buf;
-  bline_buf_mx = bline_buf+max_bline_b;
-
-  /* the code for filling the buffers is copied from comp_thr.c */
-  /* the major differences reflect the fact that all library descriptions
-     will be kept in memory, indexed by sequence number.
-
-     As a result, one buffer is filled by this loop -
-       ldes[] has the descriptive information for every sequence
-       this array could potentially be quite large
-  */
-
-  /* now open the library and start reading */
-  /* get a buffer and fill it up */
-
-  ntbuff = 0;
-  m_seqnm = 0; /* m_seqnm is the number of this library sequence */
-  nseq = 0;
-
-  node = FIRSTNODE;
-
-  /* sqs2_buf[0].aa1 = aa1_buf; */
-  aa1 = aa1_buf;
-
-  /* iln counts through each library */
-  for (iln = 0; iln < m_msg0.nln; iln++) {
-    if ((l_file_p=
-        openlib(m_msg0.lbnames[iln], m_msg0.ldnaseq,lascii,!m_msg0.quiet,NULL))==NULL) {
-      fprintf(stderr," cannot open library %s\n",m_msg0.lbnames[iln]);
-      continue;
-    }
-    else {
-      printf ("searching %s library\n",m_msg0.lbnames[iln]);
-    }
-
-    lcont = ocont = 0;
-    n1tot_v = n1tot_cnt = 0;
-    n1tot_ptr = n1tot_cur = NULL;
-    maxt = m_msg0.maxn;
-    loffset = 0l;
-
-    /* read sequence directly into buffer */
-    aa1ptr = aa1; /* = sqs2_buf[0].aa1; */
-
-    while ((n1= LGETLIB(aa1ptr,maxt,t_bline,sizeof(t_bline),&lseek,&lcont,
-                       l_file_p,&l_off))>=0) {
-
-      /* skip sequences outside range */
-      if (n1 < m_msg0.n1_low || n1 > m_msg0.n1_high) goto loop1;
-      
-      /* add termination code for proteins, if asked */
-      if (m_msg0.term_code && !lcont && 
-         m_msg0.ldnaseq==SEQT_PROT && aa1ptr[n1-1]!=m_msg0.term_code) {
-       aa1ptr[n1++]=m_msg0.term_code;
-       aa1ptr[n1]=0;
-      }
-
-      /* check for a continued sequence and provide a pointer to 
-        the n1_tot array if lcont || ocont */
-      n1tot_v += n1;
-      if (lcont && !ocont) {   /* get a new pointer */
-       if (n1tot_cnt <= 0) {
-         if ((n1tot_ptr=calloc(1000,sizeof(int)))==NULL) {
-           fprintf(stderr," cannot allocate n1tot_ptr\n");
-           exit(1);
-         }
-         else {n1tot_cnt=1000;}
-       }
-       n1tot_cnt--;
-       n1tot_cur = n1tot_ptr++;
-      }
-
-      if (bline_bufp + bline_inc > bline_buf_mx) {
-       i = 4;
-       while (i-- > 0) {
-         if ((bline_buf=(char *)calloc(max_bline_b,sizeof(char)))!=NULL)
-           break;
-         fprintf(stderr," failure to allocate bline_buf(%d) %d\n",
-                 max_sql,max_bline_b);
-         max_bline_b /= 2;
-         bline_inc /= 2;
-       }
-       if (bline_buf != NULL) {
-         bline_bufp = bline_buf;
-         bline_buf_mx = bline_buf+max_bline_b;
-       }
-       else {
-         s_abort("cannot allocate bline_buf ","");
-         exit(1);
-       }
-      }
-
-      if (bline_bufp+bline_inc < bline_buf_mx ) {
-       strncpy(bline_bufp,t_bline,bline_inc);
-       ldes[m_seqnm].bline = bline_bufp;
-       bline_bufp[bline_inc]= '\0';
-       bline_bufp += bline_inc+1;
-      }
-      else {
-       fprintf(stderr," bline_buf overrun\n");
-      }
-
-      ntt.entries++;           /* inc number of sequences */
-      ntt.length += n1;        /* update total library length */
-      if (ntt.length > LONG_MAX) {ntt.length -= LONG_MAX; ntt.carry++;}
-
-#ifdef DEBUG
-      /* This discovers most reasons for core dumps */
-      if (pst.debug_lib)
-       for (i=0; i<n1; i++)
-         if (aa1[i]>pst.nsq) {
-           fprintf(stderr,
-                   "%s residue[%d/%d] %d range (%d) lcont/ocont: %d/%d\n%s\n",
-                   qm_msg0.libstr,i,n1,aa1[i],pst.nsq,lcont,ocont,aa1ptr+i);
-           aa1[i]=0;
-           n1=i-1;
-           break;
-         }
-#endif
-
-      /* for ALTIVEC, must pad with 15 NULL's */
-      for (i=0; i<SEQ_PAD+1; i++) {aa1ptr[n1+i]=0;}
-
-      /* don't count long sequences more than once */
-      if (aa1!=aa1ptr) {
-       n1 += m_msg0.loff; m_msg0.db.entries--; ntt.entries--;
-      }
-
-      if (n1>1) {
-
-       desptr = &ldes[m_seqnm];
-
-       aa1i_arr[nseq] = (int)(aa1-aa1_buf);
-       m_seqnm_arr[nseq] = m_seqnm;
-       desptr->n1 = n1_arr[nseq] = n1;
-       desptr->n1tot_p = n1tot_cur;
-       desptr->lseek = lseek;
-       desptr->loffset = loffset+l_off;
-       desptr->cont = ocont;
-       desptr->wrkr = node;
-       desptr->nsfnum = nsfnum;
-#ifdef SUPERFAMNUM
-       if ((desptr->sfnum[0]=sfnum[0])>0 &&
-           (desptr->sfnum[1]=sfnum[1])>0 &&
-           (desptr->sfnum[2]=sfnum[2])>0 &&
-           (desptr->sfnum[3]=sfnum[3])>0 &&
-           (desptr->sfnum[4]=sfnum[4])>0 &&
-           (desptr->sfnum[5]=sfnum[5])>0 &&
-           (desptr->sfnum[6]=sfnum[6])>0 &&
-           (desptr->sfnum[7]=sfnum[7])>0 &&
-           (desptr->sfnum[8]=sfnum[8])>0 &&
-           (desptr->sfnum[9]=sfnum[9])>0) ;
-#endif
-       m_seqnm++;
-       nseq++;
-
-       if (m_seqnm >= max_sql) {
-         max_sql += MAXSQL;
-         if ((ldes=(struct sql *)realloc(ldes,max_sql*sizeof(struct sql)))
-             ==NULL) {
-           fprintf(stderr," failure to realloc ldes(%d) %ld\n",
-                   max_sql,max_sql*sizeof(struct sql));
-           s_abort("cannot allocate ldes","");
-           exit(1);
-         }
-       }
-
-       /* increment ptrs */
-       aa1prev = aa1;
-
-       aa1 += n1+1+SEQ_PAD;
-       ntbuff += n1+1+SEQ_PAD;
-
-       /* if the buffer is filled */
-       if (nseq >= max_buf_cnt || ntbuff >= m_msg0.pbuf_siz - m_msg0.maxn) {
-         /* provide filled buffer to workers */
-#ifdef PVM_SRC
-         pvm_initsend(PvmDataRaw);
-         pvm_pkint(&nseq,1,1);
-         pvm_pkint(&ntbuff,1,1);
-         pvm_pkint(n1_arr,nseq,1);
-         pvm_pkint(aa1i_arr,nseq,1);
-         pvm_pkint(m_seqnm_arr,nseq,1);
-         pvm_send(pinums[node],STARTTYPE4);
-
-         pvm_initsend(PvmDataRaw);
-         pvm_pkbyte((char *)aa1_buf,ntbuff,1);
-         pvm_send(pinums[node],STARTTYPE5);
-#endif
-#ifdef MPI_SRC
-         MPI_Send(&nseq,1,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-         MPI_Send(&ntbuff,1,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-         MPI_Send(n1_arr,nseq,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-         MPI_Send(aa1i_arr,nseq,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-         MPI_Send(m_seqnm_arr,nseq,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-
-         MPI_Send(aa1_buf,ntbuff,MPI_BYTE,node,STARTTYPE5,MPI_COMM_WORLD);
-#endif
-         nseq =  0;
-
-         aa1 = aa1_buf;
-         ntbuff = 0;
-         if (++node >= nnodes) node = FIRSTNODE;
-       }
-
-      loop1:
-       if (lcont) {
-         memcpy(aa1,&aa1prev[n1-m_msg0.loff],m_msg0.loff);
-         aa1ptr = &aa1[m_msg0.loff];
-         ocont = lcont;
-         maxt = m_msg0.maxt3;
-         loffset += n1 - m_msg0.loff;
-       }
-       else {
-         if (ocont) *n1tot_cur = n1tot_v;
-         n1tot_v = 0;
-         n1tot_cur = NULL;
-
-         ocont = 0;
-         aa1ptr = aa1;
-         maxt = m_msg0.maxn;
-         loffset = 0l;
-       }
-      }
-    }
-  }    /* for (iln < nln) */
-
-  if (nseq > 0) {
-#ifdef PVM_SRC
-    pvm_initsend(PvmDataRaw);
-    pvm_pkint(&nseq,1,1);
-    pvm_pkint(&ntbuff,1,1);
-    pvm_pkint(n1_arr,nseq,1);
-    pvm_pkint(aa1i_arr,nseq,1);
-    pvm_pkint(m_seqnm_arr,nseq,1);
-    pvm_send(pinums[node],STARTTYPE4);
-
-    pvm_initsend(PvmDataRaw);
-    pvm_pkbyte((char *)aa1_buf,ntbuff,1);
-    pvm_send(pinums[node],STARTTYPE5);
-#endif
-#ifdef MPI_SRC
-    MPI_Send(&nseq,1,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-    MPI_Send(&ntbuff,1,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-    MPI_Send(n1_arr,nseq,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-    MPI_Send(aa1i_arr,nseq,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-    MPI_Send(m_seqnm_arr,nseq,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-
-    MPI_Send(aa1_buf,ntbuff,MPI_BYTE,node,STARTTYPE5,MPI_COMM_WORLD);
-#endif
-  }
-
-  /*   fprintf(stderr," all sequences sent\n"); */
-
-  if (ntt.entries <= 0) {
-    s_abort("no reference library sequences found\n","");
-  }
-
-  zero = 0;
-  for (node=FIRSTNODE; node < nnodes; node++) {
-#ifdef PVM_SRC
-    pvm_initsend(PvmDataRaw);
-    pvm_pkint(&zero,1,1);
-    pvm_pkint(&zero,1,1);
-    pvm_pkint(n1_arr,1,1);
-    pvm_pkint(aa1i_arr,1,1);
-    pvm_pkint(m_seqnm_arr,1,1);
-    pvm_send(pinums[node],STARTTYPE4);
-#endif
-#ifdef MPI_SRC
-    MPI_Send(&zero,1,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-    MPI_Send(&zero,1,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-    MPI_Send(n1_arr,0,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-    MPI_Send(aa1i_arr,0,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-    MPI_Send(m_seqnm_arr,0,MPI_INT,node,STARTTYPE4, MPI_COMM_WORLD);
-#endif
-  }
-
-  for (node = FIRSTNODE; node < nnodes; node++) {
-#ifdef PVM_SRC
-    bufid = pvm_recv(-1,STARTTYPE0);
-    pvm_bufinfo(bufid,NULL,NULL,&tid);
-    snode = tidtonode(tid);
-    pvm_upkint(&lcnt,1,1);
-    pvm_freebuf(bufid);
-#endif
-#ifdef MPI_SRC
-    MPI_Recv(&lcnt,1,MPI_INT,MPI_ANY_SOURCE,STARTTYPE0,
-            MPI_COMM_WORLD,&mpi_status);
-    snode= mpi_status.MPI_SOURCE;
-#endif
-    wlsn [snode-FIRSTNODE] = lcnt;
-    fprintf(stderr," %d sequences at %d\n",lcnt,snode);
-  }
-
-  /* print out all descriptions */
-  /*
-  for (node = FIRSTNODE; node < nnodes; node++)
-    for (lcnt = 0; lcnt < wlsn[node-FIRSTNODE]; lcnt ++)
-      printf("%2d:%3d\t%s\n",node,lcnt,ldes[lcnt].bline);
-  */
-
-  /* Calculate cumulative totals and send to workers for a self search */
-
-  clsn [0] = nclib= 0;
-  for (node = FIRSTNODE; node < nnodes-1; node++) {
-    /* clsn[] is for the next node */
-    clsn[node-FIRSTNODE+1] = nclib += wlsn[node-FIRSTNODE];
-  }
-
-  if (m_msg0.self)
-    for (node = FIRSTNODE; node < nnodes; node++) {
-#ifdef PVM_SRC
-      pvm_initsend(PvmDataRaw);
-      pvm_pkint(&clsn[node-FIRSTNODE],1,1);
-      pvm_send(pinums[node],STARTTYPE1);
-#endif
-#ifdef MPI_SRC
-    MPI_Send(&clsn[node-FIRSTNODE],1,MPI_INT,node,STARTTYPE1,MPI_COMM_WORLD);
-#endif
-      fprintf(stderr,"sending lend: %d to worker %d\n",clsn[node-FIRSTNODE],node);
-    }
-
-  last_msg_b[0] = m_msg0.nbr_seq = m_msg1.nbr_seq = ntt.entries;
-
-  qres_bufsize = BFR;
-  /* if BFR is too big for this library, reduce it */
-  while ( ntt.entries*(m_msg0.nitt1+1)/(2*nnodes) < qres_bufsize) {
-    qres_bufsize /= 2;
-    if ((qres_bufsize%(m_msg0.nitt1+1))!= 0) {
-      qres_bufsize *= (m_msg0.nitt1+1);
-      break;
-    }
-    if (qres_bufsize < 50) break;
-  }
-  last_msg_b[1] = qres_bufsize;
-
-  fprintf(stderr," using BFR=%d/%d\n",qres_bufsize,BFR);
-
-#ifdef PVM_SRC
-  pvm_initsend(PvmDataRaw);
-  pvm_pkint(last_msg_b,2,1);
-  for (node=FIRSTNODE; node < nnodes; node++)
-    pvm_send(pinums[node],STARTTYPE0);
-#endif
-#ifdef MPI_SRC
-  for (node=FIRSTNODE; node < nnodes; node++)
-    MPI_Send(last_msg_b,2,MPI_INT,node,STARTTYPE0,MPI_COMM_WORLD);
-#endif  
-
-  tscan = tprev = s_time();
-
-/**************************************
-  The logic of this section has been simplified to allow multistage
-  comparison functions to be used and alignments to be generated.
-
-       send 1st query to workers
-       get next query sequence from host (m_msp1)
-    L1:        get results from next-1 search (m_msp0)
-       sort the results of the next-1 search
-       (possibly) do additional stages of search
-       (possibly produce alignments for search
-       send next query to workers (m_msp1)
-       display result of next-1 search (m_msp0)
-       get next query sequence from host (m_msp1)
-       goto L1;
-
-As a result of the interleaving, there must be two qm_msg structures,
-one for the next-1 sequence (which is required for labeling the
-output), and one for the next sequence (which is sent to the workers
-while the results are being displayed.  qm_msp0 and qm_msp1 alternate
-between these two structures.
-***************************************/
-
-/*
-  qm_msp0 points to the older qm_msg 
-  qm_msp1 points to the newer qm_msg
-  the assignment below goes with curtype==ONETYPE
-*/
-  m_msp0 = &m_msg0;
-  m_msp1 = &m_msg1;
-
-  qm_msp0 = &qm_msg0;
-  qm_msp1 = &qm_msg1;
-  
-  aa0p0 = aa00;                /* aa0p0 is the "old" sequence */
-  aa0p1 = aa01;                /* aa0p1 is the "new" sequence */
-
-  last_params(aa00,m_msp0->n0,m_msp0,&pst,qm_msp0);
-
-  /* process_hist() is called here to get find_zp(), and some other
-     structures initialized that would otherwise not be initialized
-     because z-scores are not being calculated */
-
-  if (m_msp0->escore_flg) {
-     pst.zsflag_f = process_hist(stats,nstats,*m_msp0,pst,
-                                &m_msp0->hist,&m_msp0->pstat_void,0);
-     stats_done=1;
-  }
-
-  if (m_msp0->qshuffle && qstats==NULL) {
-    if ((qstats =
-        (struct stat_str *)calloc(m_msg0.shuff_max+1,sizeof(struct stat_str)))==NULL)
-      s_abort ("Cannot allocate qstats struct","");
-  }
-  nqstats = 0;
-
-/* Send first query sequence to each worker */
-
-  if (m_msg0.dfile[0] && (fdata=fopen(m_msg0.dfile,"w"))!=NULL)
-    fprintf(fdata,"%3d>%-50s\n",qlib,qm_msp0->libstr);
-
-#ifdef PVM_SRC
-  pvm_initsend(PvmDataRaw);
-  pvm_pkbyte((char *)qm_msp0,sizeof(qm_msg0),1);
-  if (qm_msp0->n0 > 0) {
-    pvm_pkbyte((char *)aa0p0,qm_msp0->n0+1+SEQ_PAD,1);
-    if (m_msg0.ann_flg) pvm_pkbyte((char *)m_msp0->aa0a,qm_msp0->n0+1,1);
-  }
-  for (node = FIRSTNODE; node < nnodes; node++)
-    pvm_send(pinums[node],MSEQTYPE);
-#endif
-#ifdef MPI_SRC
-  for (node = FIRSTNODE; node < nnodes; node++) {
-    MPI_Send(qm_msp0,sizeof(qm_msg0),MPI_BYTE,node,MSEQTYPE,MPI_COMM_WORLD);
-    if (qm_msp0->n0 > 0) {
-      MPI_Send(aa0p0,qm_msp0->n0+1+SEQ_PAD,MPI_BYTE,node,
-              MSEQTYPE1,MPI_COMM_WORLD);
-      if (m_msg0.ann_flg) {
-       if (m_msp0->aa0a == NULL) {
-         fprintf(stderr," m_msp0: %o/%oaa0a is null\n",m_msp0,m_msp0->aa0a);
-       }
-       MPI_Send(m_msp0->aa0a,qm_msp0->n0+1,MPI_BYTE,node, MSEQTYPE2,MPI_COMM_WORLD);
-      }
-    }
-  }
-#endif
-
-  /* Get second query sequence (additional query sequences are read in
-     the main loop */
-
-  m_msp1->n0 = qm_msp1->n0 = 
-    QGETLIB(aa0p1,MAXTST,q_bline, sizeof(q_bline),&qseek, &qlcont,q_file_p,&m_msp1->sq0off);
-  strncpy(qm_msp1->libstr,q_bline,sizeof(qm_msg0.libstr)-20);
-  qm_msp1->libstr[sizeof(qm_msg0.libstr)-21]='\0';
-  if ((bp=strchr(qm_msp1->libstr,' '))!=NULL) *bp='\0';
-
-  /* if annotations are included in sequence, remove them */
-  if (m_msg0.ann_flg) {
-    m_msp1->n0 = qm_msp1->n0 = 
-      ann_scan(aa0p1,qm_msp1->n0,m_msp1,m_msp1->qdnaseq);
-#ifdef DEBUG
-    fprintf(stderr,"m_msp1->/aa0a is: %o/%o\n",m_msp1,m_msp1->aa0a);
-#endif
-  }
-
-  if (qm_msp1->n0 > 0 && m_msg0.term_code && !qlcont && 
-      m_msg0.qdnaseq == SEQT_PROT &&
-      aa0p1[m_msp1->n0-1]!=m_msg0.term_code) {
-    aa0p1[m_msp1->n0++]=m_msg0.term_code;
-    aa0p1[m_msp1->n0]=0;
-    qm_msp1->n0 = m_msp1->n0;
-  }
-
-  /* for ALTIVEC, must pad with 15 NULL's */
-  if (m_msp1->n0 > 0) {
-    for (i=0; i<SEQ_PAD+1; i++) {aa0p1[m_msp1->n0+i]=0;}
-  }
-
-  qm_msp1->slist = 0;
-  qm_msp1->seqnm = qlib;
-
-  last_params(aa0p1,m_msp1->n0,m_msp1,&pst,qm_msp1);
-
-  sprintf(tmp_str," - %d %s", qm_msp1->n0, q_sqnam);
-  if (strlen(qm_msp1->libstr) + strlen(tmp_str) >= sizeof(qm_msg0.libstr))
-    qm_msp1->libstr[sizeof(qm_msg0.libstr)-strlen(tmp_str)-2] = '\0';
-  strncat(qm_msp1->libstr,tmp_str,
-         sizeof(qm_msg0.libstr)-strlen(qm_msp1->libstr)-1);
-  qm_msp1->libstr[sizeof(qm_msg0.libstr)-1]='\0';
-
-  naa0 = 0;  /* reset node counter */
-
-  /* sit in loop and collect results */
-  nbest = nopt = 0;
-  zbestcut = -BIGNUM;
-
-
-  while (1) {
-
-#ifdef PVM_SRC
-    bufid = pvm_recv(-1,curtype);
-    pvm_bufinfo(bufid,NULL,NULL,&tid);
-    pvm_upkbyte((char *)&bestr[0],sizeof(struct comstr)*(qres_bufsize+1),1);
-    snode = tidtonode(tid);
-    pvm_freebuf(bufid);
-#endif
-#ifdef MPI_SRC
-    MPI_Recv(bestr,sizeof(struct comstr)*(qres_bufsize+1),
-            MPI_BYTE,MPI_ANY_SOURCE,curtype,MPI_COMM_WORLD,&mpi_status);
-    snode = mpi_status.MPI_SOURCE;
-#endif
-
-    nres = bestr[qres_bufsize].seqnm & ~FINISHED;
-
-#ifdef DEBUG
-    fprintf(stderr,"%d results from %d\n",nres,snode);
-#endif
-
-    if (bestr[qres_bufsize].seqnm&FINISHED) {  /* a worker is finished */
-      naa0++;
-
-      /* fast_flag == 1 => send new sequences immediately */
-      fast_flag = ((m_msp0->stages==1) && !(m_msp0->markx & MX_M9SUMM) &&
-                  (m_msp0->ashow == 0) && (m_msp0->last_calc_flg==0));
-      /* send a new query sequence if no more processing required */
-      if (fast_flag) {
-#ifdef PVM_SRC
-       pvm_initsend(PvmDataRaw);
-       pvm_pkbyte((char *)qm_msp1,sizeof(qm_msg1),1);
-       if (qm_msp1->n0 != -1) {
-         pvm_pkbyte((char *)aa0p1,qm_msp1->n0+1+SEQ_PAD,1);
-         if (m_msp1->ann_flg) pvm_pkbyte((char *)m_msp1->aa0a,qm_msp1->n0+1,1);
-       }
-       pvm_send(tid,MSEQTYPE);
-#endif
-#ifdef MPI_SRC
-       MPI_Send(qm_msp1,sizeof(qm_msg1),MPI_BYTE,snode,MSEQTYPE,MPI_COMM_WORLD);
-       if (qm_msp1->n0 != -1) {
-         MPI_Send(aa0p1,qm_msp1->n0+1+SEQ_PAD,MPI_BYTE,snode,MSEQTYPE1,MPI_COMM_WORLD);
-         if (m_msp1->ann_flg)
-           MPI_Send(m_msp1->aa0a,qm_msp1->n0+1,MPI_BYTE,snode,MSEQTYPE2,MPI_COMM_WORLD);
-       }
-#endif
-      }
-    }
-
-#ifdef DEBUG
-    if (pst.debug_lib)
-      fprintf(stderr," unpacking %d from %d; nbest %d\n",nres,snode,nbest);
-#endif
-
-    /* this section is now more complex because can get groups of
-       sequence results; e.g. forward and reverse frame */
-
-    t_best = t_rbest = t_qrbest = -1;
-    tm_escore = t_rescore = t_qrescore = FLT_MAX;
-    for (ires = 0; ires < nres; ires++) {
-      desptr = &ldes[bestr[ires].m_seqnm];
-
-      /* save raw results */
-      if (fdata) {
-       strncpy(tlibstr,desptr->bline,10);
-       if ((bp=strchr(tlibstr,' '))!=NULL) *bp='\0';
-       fprintf(fdata,"%-10s\t%4d\t%4d\t%d\t%4d\t%4d\t%4d\t%8ld\n",
-               tlibstr,desptr->sfnum[0],desptr->n1,bestr[ires].frame,
-               bestr[ires].score[0],bestr[ires].score[1],bestr[ires].score[2],
-               desptr->lseek);
-      }
-
-      i_score = bestr[ires].score[pst.score_ix];
-      e_score = bestr[ires].escore;
-      k_comp = bestr[ires].comp;
-      k_H = bestr[ires].H;
-
-      t_n1 = desptr->n1;
-      if (i_score > t_best) {tm_best = t_best = i_score;}
-      if (e_score < tm_escore) tm_escore = e_score;
-
-      if (m_msp0->qshuffle) {
-       if (bestr[ires].qr_score > t_qrbest) 
-         t_qrbest = bestr[ires].qr_score;
-       if (bestr[ires].qr_escore < t_qrescore) 
-         t_qrescore = bestr[ires].qr_escore;
-
-       if (bestr[ires].frame==m_msp0->nitt1 && 
-           nqstats < m_msp0->shuff_max &&
-           bestr[ires].qr_score >= 0) {
-         qstats[nqstats].n1 = t_n1;    /* save the best score */
-         qstats[nqstats].comp =  bestr[ires].comp;
-         qstats[nqstats].H = bestr[ires].H;
-         qstats[nqstats].escore = t_qrescore;
-         qstats[nqstats++].score = t_qrbest;
-         t_qrbest = -1;        /* reset t_qrbest, t_qrescore */
-         t_qrescore = FLT_MAX;
-       }
-      }
-
-      if (pst.zsflag >= 10 && bestr[ires].r_score > t_rbest) {
-       t_rbest = bestr[ires].r_score;
-       t_rescore = bestr[ires].r_escore;
-      }
-
-      if (nstats < MAXSTATS) {
-       if (bestr[ires].frame == m_msg0.nitt1) {
-         stats[nstats].n1 = t_n1;
-         stats[nstats].comp = k_comp;
-         stats[nstats].H = k_H;
-
-         if (pst.zsflag > 10) {
-           tm_best = t_rbest;
-           tm_escore = t_rescore;
-           t_rbest = -1;
-           t_rescore = FLT_MAX;
-         }
-         stats[nstats].escore = tm_escore;
-         stats[nstats++].score = tm_best;
-         tm_escore = FLT_MAX;
-         t_best = -1;
-       }
-      }
-      else if (pst.zsflag >=0) {       /* nstats >= MAXSTATS, zsflag >=0 */
-       if (!stats_done ) {
-         pst.n0 = qm_msp0->n0;
-         pst.zsflag_f = process_hist(stats,nstats,*m_msp0,pst,
-                                     &m_msp0->hist, &m_msp0->pstat_void,0);
-         stats_done = 1;
-         kstats = nstats;
-         for (i=0; i<nbest; i++) {
-           bptr[i]->zscore = (*find_zp)(bptr[i]->score[pst.score_ix],
-                                        bptr[i]->escore,bptr[i]->n1,
-                                        bptr[i]->comp, m_msp0->pstat_void);
-         }
-       }
-#ifdef SAMP_STATS
-       if (!m_msp0->escore_flg) {
-         jstats = nrand(kstats++);
-         if (jstats < MAXSTATS) {
-           stats[jstats].n1 = t_n1;    /* save the best score */
-           stats[jstats].comp =  k_comp;
-           stats[jstats].H = k_H;
-           if (pst.zsflag >=10) t_best = t_rbest;
-           stats[jstats].score = t_best;
-         }
-       }
-#endif
-      }
-
-      if (stats_done) {
-       zscore=(*find_zp)(i_score,e_score,desptr->n1,k_comp,
-                         m_msp0->pstat_void);
-       if (bestr[ires].frame == m_msg0.nitt1) {
-         addhistz((*find_zp)(tm_best,tm_escore,t_n1,k_comp,
-                             m_msp0->pstat_void),
-                  &(m_msp0->hist));
-         t_best = t_rbest = -1;
-       }
-
-      }
-      else zscore = (double) i_score;
-
-      if (zscore > zbestcut) {
-       if (nbest>=MAXBEST) {
-         selectbestz(bptr, nbest-MAXBEST/4-1, nbest); 
-         nbest -= MAXBEST/4;
-         zbestcut = bptr[nbest-1]->zscore;
-         best_flag = 0;
-       }
-       /* if zbestcut == -BIGNUM, bptr[] has not been reinitialized */
-       else if (best_flag) bptr[nbest]=&best[nbest];
-
-       bptr[nbest]->m_seqnm  = bestr[ires].m_seqnm ;
-       bptr[nbest]->seqnm  = bestr[ires].seqnm;
-       bptr[nbest]->score[0] = bestr[ires].score[0];
-       bptr[nbest]->score[1] = bestr[ires].score[1];
-       bptr[nbest]->score[2] = bestr[ires].score[2];
-       bptr[nbest]->escore = bestr[ires].escore;
-       bptr[nbest]->segnum = bestr[ires].segnum;
-       bptr[nbest]->seglen = bestr[ires].seglen;
-       bptr[nbest]->comp = bestr[ires].comp;
-       bptr[nbest]->H = bestr[ires].H;
-       bptr[nbest]->zscore = zscore;
-       bptr[nbest]->wrkr   = snode;
-       bptr[nbest]->desptr = desptr;
-       bptr[nbest]->lseek = desptr->lseek; /* needed for identifying alternate
-                                           strand scores from same sequence */
-       bptr[nbest]->n1 = desptr->n1;
-       bptr[nbest]->frame = bestr[ires].frame;
-
-       /*      this was used when -m 9 info was calculated in 1st scan */
-       /*
-       bptr[nbest]->sw_score = bestr[ires].sw_score;
-       if (bestr[ires].sw_score > -1) {
-         nopt++;
-         bptr[nbest]->a_len = bestr[ires].a_len;
-         bptr[nbest]->percent = bestr[ires].percent;
-         bptr[nbest]->gpercent = bestr[ires].gpercent;
-         bptr[nbest]->min0 = bestr[ires].min0;
-         bptr[nbest]->min1 = bestr[ires].min1;
-         bptr[nbest]->max0 = bestr[ires].max0;
-         bptr[nbest]->max1 = bestr[ires].max1;
-         bptr[nbest]->ngap_q = bestr[ires].ngap_q;
-         bptr[nbest]->ngap_l = bestr[ires].ngap_l;
-       }
-       else {
-         bptr[nbest]->percent = -1.0;
-         bptr[nbest]->min0 = bptr[nbest]->min1 = bptr[nbest]->max0 = 
-           bptr[nbest]->max1 = 0;
-       }
-       */
-
-       nbest++;
-      }
-    }  /* for loop */
-    if (naa0 < nnodes-FIRSTNODE) continue;
-
-    gstring2[0]='\0';
-
-    /* get gstring2,3 - algorithm/parameter description */
-#ifdef PVM_SRC
-    bufid = pvm_recv(pinums[FIRSTNODE],PARAMTYPE);
-    pvm_upkbyte(gstring2,sizeof(gstring2),1);
-    pvm_upkbyte(gstring3,sizeof(gstring3),1);
-    pvm_freebuf(bufid);
-#endif
-#ifdef MPI_SRC
-    MPI_Recv(gstring2,sizeof(gstring2),MPI_BYTE,FIRSTNODE,PARAMTYPE,
-            MPI_COMM_WORLD,&mpi_status);
-    MPI_Recv(gstring3,sizeof(gstring3),MPI_BYTE,FIRSTNODE,PARAMTYPE,
-            MPI_COMM_WORLD,&mpi_status);
-#endif
-
-/* ********************** */
-/* analyze the results    */
-/* ********************** */
-    
-    if (!stats_done) {
-      if (nbest < 20 || pst.zsflag <= 0) {
-       pst.zsflag_f = -1;
-      }
-      else {
-       pst.n0 = qm_msp0->n0;
-       pst.zsflag_f = process_hist(stats,nstats,*m_msp0,pst,
-                                   &m_msp0->hist, &m_msp0->pstat_void,stats_done);
-
-       for (i=0; i<nbest; i++)
-         bptr[i]->zscore = (*find_zp)(bptr[i]->score[pst.score_ix],
-                                      bptr[i]->escore, bptr[i]->n1,
-                                      bptr[i]->comp, m_msp0->pstat_void);
-      }
-    }
-
-    m_msp0->db.entries = ntt.entries;
-    m_msp0->db.length = ntt.length;
-    m_msp0->db.carry = ntt.carry;
-
-    if (pst.zdb_size < 1) pst.zdb_size = ntt.entries;
-
-    if (!qm_msp0->qshuffle) {
-      last_stats(aa0p0, m_msp0->n0,
-                stats,nstats, bptr,nbest, *m_msp0, pst, 
-                &m_msp0->hist, &m_msp0->pstat_void);
-    }
-    else {
-      last_stats(aa0p0, m_msp0->n0,
-                qstats,nqstats, bptr,nbest, *m_msp0, pst, 
-                &m_msp0->hist, &m_msp0->pstat_void);
-    }
-
-    if (m_msp0->last_calc_flg) {
-      nbest = last_calc(bptr,nbest, *m_msp0, &pst,qm_msp0,
-                       m_msp0->pstat_void);
-    }
-
-    sortbeste(bptr,nbest);
-    scale_scores(bptr,nbest,m_msp0->db,pst,m_msp0->pstat_void);
-
-    if (pst.zsflag >= 0 && bptr[0]->escore >= m_msg0.e_cut) goto no_results;
-
-    /*      else sortorder(bptr,nbest,wlsn,nnodes); */
-
-/* if more than one stage or markx==9, calculate opt scores or do alignment */
-/* send results to workers as available */
-
-    if (m_msg0.stages > 1 || m_msg0.markx & MX_M9SUMM) {
-
-      /* to determine how many sequences to re-align (either for
-        do_opt() or calc_id() we need to modify m_msg.mshow to get
-        the correct number of alignments */
-
-      if (m_msg0.mshow_flg != 1 && pst.zsflag >= 0) {
-       for (i=0; i<nbest && bptr[i]->escore< m_msg0.e_cut; i++) {}
-       m_msg0.mshow = i;
-      }
-
-      /* allocate space for a_struct info */
-      if (m_msg0.markx & MX_M9SUMM && m_msg0.mshow > 0) {
-       if ((aln_d_base=(struct a_struct *)
-            calloc((size_t)m_msg0.mshow,sizeof(struct a_struct)))==NULL) {
-         fprintf(stderr," cannot allocate a_struct %d\n", m_msg0.mshow);
-         exit(1);
-       }
-
-       for (is = 0; is < m_msg0.mshow; is++ ) {
-         bptr[is]->aln_d = &aln_d_base[is];
-       }
-      }
-
-      do_stage2(bptr,m_msg0.mshow, *m_msp0, DO_OPT_FLG, qm_msp0);
-    }
-
-  no_results:
-    tdone = s_time();
-    tddone = time(NULL);
-
-    /* changed from >> to >>> because qm_msp0->libstr is missing '>' */
-    fprintf (outfd, "%3d>>>%s\n", qlib,qm_msp0->libstr);
-
-    /* make certain that m_msp0->n0, libstr are current */
-    m_msp0->n0 = qm_msp0->n0;
-    /*    strncpy(m_msp0->libstr,qm_msp0->libstr,sizeof(m_msg0.libstr)); */
-
-    prhist (outfd,*m_msp0,pst,m_msp0->hist,nstats,m_msp0->db,gstring2);
-
-    if (bptr[0]->escore < m_msg0.e_cut) {
-
-      showbest (outfd, bptr, nbest, qlib, m_msp0,pst,ntt,gstring2);
-
-      if (m_msg0.markx & MX_M9SUMM) {
-       fprintf(outfd,"\n>>>%s#%d %s%s, %d %s vs %s library\n",
-               m_msg0.tname,qlib,qm_msp0->libstr,
-               (m_msg0.revcomp ? "-":"\0"), qm_msp0->n0, m_msg0.sqnam,
-               m_msg0.lname);
-      }
-      else if (m_msg0.markx & MX_M10FORM) {
-       if ((bp=strchr(qm_msp0->libstr,' '))!=NULL) *bp = '\0';
-       fprintf(outfd,"\n>>>%s#%d %s%s, %d %s vs %s library\n",
-               m_msg0.tname,qlib,qm_msp0->libstr,
-               (m_msg0.revcomp ? "-":"\0"), qm_msp0->n0, m_msg0.sqnam,
-               m_msg0.lname);
-       if (bp!=NULL) *bp=' ';
-       fprintf(outfd,"; mp_name: %s\n",argv[0]);
-       fprintf(outfd,"; mp_ver: %s\n",mp_verstr);
-       fprintf(outfd,"; mp_argv:");
-       for (i=0; i<argc; i++)
-         fprintf(outfd," %s",argv[i]);
-       fputc('\n',outfd);
-       fputs(gstring3,outfd);
-       fputs(hstring1,outfd);
-      }
-
-      /* ashow is -1 if not set, -d 0 indicates no alignments, > 0 if set */
-      /* if ashow is -1, m_msg.nshow (set by e_cut above) sets limit
-        in showalign */
-      
-      if (m_msp0->ashow != 0) {
-       /* showalign needs m_msp->qtitle, so fill it in */
-       strncpy(m_msp0->qtitle,qm_msp0->libstr,MAX_FN-1);
-       m_msp0->qtitle[MAX_FN-1]='\0';
-       showalign (outfd, bptr, nbest, qlib, *m_msp0, pst, gstring2);
-      }
-    }
-    else {
-      if (m_msg0.markx & (MX_M9SUMM + MX_M10FORM)) {
-       fprintf(outfd,"\n>>>%s#%d %s%s, %d %s vs %s library\n",
-               m_msg0.tname,qlib,qm_msp0->libstr,(m_msg0.revcomp ? "-":"\0"), qm_msg0.n0, m_msg0.sqnam,
-               m_msg0.lname);
-       fprintf(outfd,">>>!!! No sequences with E() < %f\n",m_msg0.e_cut);
-      }
-      else fprintf(outfd,"!! No sequences with E() < %f\n",m_msg0.e_cut);
-    }
-
-    if (! (m_msg0.markx & (MX_M9SUMM + MX_M10FORM))) {
-      fprintf(outfd,"/** search time: ");
-      ptime(outfd,tdone-tprev);
-      fprintf(outfd," **/\n");
-      tprev = tdone;
-    }
-    else if (m_msg0.markx & MX_M9SUMM) {
-      if (aln_d_base != NULL) {
-       free((void *)aln_d_base);
-       aln_d_base = NULL;
-      }
-      fprintf(outfd,">>>***\n");
-      fprintf(outfd,"/** %s **/\n",gstring2);
-      fprintf(outfd,"/** %s **/\n",m_msp0->hist.stat_info);
-      fprintf(outfd,">>><<<\n");
-    }
-    else if (m_msg0.markx & MX_M10FORM) {
-      fprintf(outfd,">>><<<\n");
-    }
-    fflush(outfd);
-    
-/* *********************** */
-/* end of analysis/display */
-/* *********************** */
-
-
-/* *********************** */
-/* start the next search   */                                           
-/* *********************** */
-
-    if (fdata) {               /* label the results file */
-      fprintf(fdata,"/** %s **/\n",gstring2);
-      fprintf(fdata,"%3d>%-50s\n",qlib-1,qm_msp1->libstr);
-      fflush(fdata);
-    }
-    
-    if (m_msp1->escore_flg) {  /* re-initialize some stats stuff before search */
-      pst.zsflag_f = process_hist(stats,nstats,*m_msp1,pst,
-                                 &m_msp1->hist,&m_msp1->pstat_void,0);
-      stats_done=1;
-    }
-    else stats_done = 0;
-
-    /* set up qstats if necessary - different queries have different qshuffle */
-    if (m_msp1->qshuffle && qstats==NULL) {
-      if ((qstats =
-          (struct stat_str *)calloc(m_msg0.shuff_max+1,sizeof(struct stat_str)))==NULL)
-       s_abort ("Cannot allocate qstats struct","");
-    }
-
-    nqstats = nstats = 0;
-
-    /* send new qm_msp, sequence */
-    if (!fast_flag) {
-#ifdef PVM_SRC
-      pvm_initsend(PvmDataRaw);
-      pvm_pkbyte((char *)qm_msp1,sizeof(qm_msg1),1);
-      if (qm_msp1->n0 != -1) {
-       pvm_pkbyte((char *)aa0p1,qm_msp1->n0+1+SEQ_PAD,1);
-       if (m_msp1->ann_flg) {
-         pvm_pkbyte((char *)m_msp1->aa0a,qm_msp1->n0+1,1);
-       }         
-      }
-      for (node = FIRSTNODE; node < nnodes; node++)
-       pvm_send(pinums[node],MSEQTYPE);
-#endif
-#ifdef MPI_SRC
-      for (node=FIRSTNODE; node < nnodes; node++) {
-       MPI_Send(qm_msp1,sizeof(qm_msg1),MPI_BYTE,node,MSEQTYPE,
-                MPI_COMM_WORLD);
-       if (qm_msp1->n0 != -1) {
-         MPI_Send(aa0p1,qm_msp1->n0+1+SEQ_PAD,MPI_BYTE,node,MSEQTYPE1,MPI_COMM_WORLD);
-         if (m_msp1->ann_flg)
-           MPI_Send(m_msp1->aa0a,qm_msp1->n0+1,MPI_BYTE,snode,MSEQTYPE2,MPI_COMM_WORLD);
-       }
-      }
-#endif
-    }
-
-    qlib++;
-    if (qm_msp1->n0 != -1) {
-      qtt.entries++;
-      qtt.length += qm_msp1->n0;
-    }
-    else goto done;
-    
-/* ******************************** */
-/* flip m_msg, qm_msg, aa0 pointers */
-/* ******************************** */
-
-    naa0 = 0;
-    best_flag = 1;
-    nbest = nopt = 0;
-    zbestcut = -BIGNUM;
-    if (curtype == ONETYPE) {
-      curtype = TWOTYPE;
-      qm_msp0 = &qm_msg1;
-      qm_msp1 = &qm_msg0;
-      m_msp0 = &m_msg1;
-      m_msp1 = &m_msg0;
-      aa0p0 = aa01;
-      aa0p1 = aa00;
-    }
-    else  {
-      curtype = ONETYPE;
-      qm_msp0 = &qm_msg0;
-      qm_msp1 = &qm_msg1;
-      m_msp0 = &m_msg0;
-      m_msp1 = &m_msg1;
-      aa0p0 = aa00;
-      aa0p1 = aa01;
-    }
-
-
-/* **********************************************************/
-/* all library sequences are done get next library sequence */
-/* **********************************************************/
-
-    m_msp1->n0 = qm_msp1->n0 = 
-      QGETLIB(aa0p1,MAXTST,q_bline, sizeof(q_bline),&qseek, &qlcont,q_file_p,&m_msp1->sq0off);
-    strncpy(qm_msp1->libstr,q_bline,sizeof(qm_msg0.libstr)-20);
-    qm_msp1->libstr[sizeof(qm_msg0.libstr)-21]='\0';
-
-    if ((qlib+1) >= m_msg0.ql_stop) { qm_msp1->n0 = m_msp1->n0 = -1;}
-
-    if (qm_msp1->n0 > 0 && m_msg0.term_code && !qlcont &&
-       m_msg0.qdnaseq==SEQT_PROT &&
-       aa0p1[m_msp1->n0-1]!=m_msg0.term_code) {
-      aa0p1[m_msp1->n0++]=m_msg0.term_code;
-      aa0p1[m_msp1->n0]=0;
-      qm_msp1->n0 = m_msp1->n0;
-    }
-
-    /* for ALTIVEC, must pad with 15 NULL's */
-    if (m_msg0.n0 > 0) {
-       for (i=0; i<SEQ_PAD+1; i++) {aa00[m_msg0.n0+i]=0;}
-    }
-
-    qm_msp1->slist = 0;
-    /*
-    leng = strlen (qm_msp1->libstr);
-    sprintf (&(qm_msp1->libstr[leng]), " %d %s", qm_msp1->n0, q_sqnam);
-    */
-    sprintf(tmp_str," %d %s", qm_msp1->n0, q_sqnam);
-    if (strlen(qm_msp1->libstr) + strlen(tmp_str) >= sizeof(qm_msg0.libstr))
-      qm_msp1->libstr[sizeof(qm_msg0.libstr)-strlen(tmp_str)-2] = '\0';
-    strncat(qm_msp1->libstr,tmp_str,
-           sizeof(qm_msg0.libstr)-strlen(qm_msp1->libstr)-1);
-    qm_msp1->libstr[sizeof(qm_msg0.libstr)-1]='\0';
-
-    qm_msp1->seqnm = qlib;
-
-    last_params(aa0p1,m_msp1->n0,m_msp1,&pst,qm_msp1);
-
-  }        /* while loop */
-  
-  /* ******************** */
-  /* end of library while */
-  /* ******************** */
-
- done:
-  tdone = s_time();
-  if (m_msg0.markx & (MX_M9SUMM + MX_M10FORM)) fputs(">>>///\n",outfd);
-  printsum(outfd);
-  if (outfd!=stdout) printsum(stdout);
-  printsum(stderr);
-#ifdef PVM_SRC
-  pvm_exit();
-#endif
-#ifdef MPI_SRC
-  MPI_Finalize();
-#endif
-
-  exit(0);
-}   /* End of main program */
-
-void
-printsum(FILE *fd)
-{
-  double db_tt;
-  char tstr1[26], tstr2[26];
-
-  strncpy(tstr1,ctime(&tdstart),sizeof(tstr1));
-  strncpy(tstr2,ctime(&tddone),sizeof(tstr1));
-  tstr1[24]=tstr2[24]='\0';
-
-  /* Print timing to output file as well */
-  if (qtt.carry==0) {
-    fprintf(fd, "\n%ld residues in %d query   sequences\n", qtt.length, qtt.entries);
-  }
-  else {
-    db_tt = (double)qtt.carry*(double)LONG_MAX + (double)qtt.length;
-    fprintf(fd, "\n%.0g residues in %d query   sequences\n", db_tt, qtt.entries);
-  }
-
-  if (ntt.carry==0) {
-    fprintf(fd, "%ld residues in %ld library sequences\n", ntt.length, ntt.entries);
-  }
-  else {
-    db_tt = (double)ntt.carry*(double)LONG_MAX + (double)ntt.length;
-    fprintf(fd, "%.6f residues in %ld library sequences\n", db_tt, ntt.entries);
-  }
-
-  fprintf(fd," %d processors (%d workers) were used\n",
-         nnodes+-FIRSTNODE+1,nnodes-FIRSTNODE);
-  fprintf(fd," Pvcomplib [%s]\n start: %s done: %s\n",mp_verstr,tstr1,tstr2);
-  fprintf(fd," Loading time: ");
-  ptime(fd, tscan - tstart);
-  fprintf (fd," Scan time: ");
-  ptime (fd, tdone - tscan);
-  fprintf (fd,"\n");
-  fprintf (fd, "\nFunction used was %s [%s]\n", prog_func,verstr);
-}
-
-void fsigint()
-{
-  int i;
-
-  tdone = s_time();
-  tddone = time(NULL);
-
-  if (outfd!=stdout) fprintf(outfd,"/*** interrupted ***/\n");
-  fprintf(stderr,"/*** interrupted ***/\n");
-
-  printsum(stdout);
-  if (outfd!=stdout) printsum(outfd);
-
-#ifdef PVM_SRC
-  for (i=FIRSTNODE; i<nnodes; i++) pvm_kill(pinums[i]);
-  pvm_exit();
-#endif
-#ifdef MPI_SRC
-  MPI_Abort(MPI_COMM_WORLD,1);
-  MPI_Finalize();
-#endif
-  exit(1);
-}