Delete unneeded directory
[jabaws.git] / website / archive / binaries / mac / src / fasta34 / compacc.c
diff --git a/website/archive/binaries/mac/src/fasta34/compacc.c b/website/archive/binaries/mac/src/fasta34/compacc.c
deleted file mode 100644 (file)
index 7c5a2b6..0000000
+++ /dev/null
@@ -1,833 +0,0 @@
-
-/* copyright (c) 1996, 1997, 1998, 1999 William R. Pearson and the
-   U. of Virginia */
-
-/* $Name: fa_34_26_5 $ - $Id: compacc.c,v 1.61 2007/04/26 18:37:18 wrp Exp $ */
-
-/* Concurrent read version */
-
-#include <stdio.h>
-#include <stdlib.h>
-#if defined(UNIX) || defined(WIN32)
-#include <sys/types.h>
-#endif
-
-#include <limits.h>
-#include <float.h>
-
-#include <string.h>
-#include <time.h>
-#include <math.h>
-
-#include "defs.h"
-#include "param.h"
-#include "structs.h"
-
-#ifndef PCOMPLIB
-#include "mw.h"
-#else
-#include "p_mw.h"
-#endif
-
-#define XTERNAL
-#include "uascii.h"
-#include "upam.h"
-#undef XTERNAL
-
-#ifdef PCOMPLIB
-#include "msg.h"
-extern int nnodes;
-#ifdef PVM_SRC
-#include "pvm3.h"
-extern int pinums[],hosttid;
-#endif
-#ifdef MPI_SRC
-#include "mpi.h"
-#endif
-#endif
-
-extern time_t tdone, tstart;           /* Timing */
-extern void abort ();
-extern void ptime ();
-
-/* because it is used to pre-allocate space, maxn has various
-   constraints.  For "simple" comparisons, it is simply the length of
-   the longest library sequence.  But for translated comparisons, it
-   must be 3 or 6X the length of the query sequence. 
-
-   In addition, however, it can be reduced to make certain that
-   sequences are read in smaller chunks.  And, maxn affect how large
-   overlaps must be when sequences are read in chunks.
-*/
-
-int
-reset_maxn(struct mngmsg *m_msg, int maxn) {
-
-  /* reduce maxn if requested */
-  if (m_msg->maxn > 0 && m_msg->maxn < maxn) maxn = m_msg->maxn;
-
-  if (m_msg->qdnaseq==m_msg->ldnaseq || m_msg->qdnaseq==SEQT_DNA ||
-      m_msg->qdnaseq == SEQT_RNA) {/* !TFAST - either FASTA or FASTX*/
-
-   if (m_msg->n0> m_msg->max_tot/3) {
-      fprintf(stderr," query sequence is too long %d > %d %s\n",
-             m_msg->n0,
-             m_msg->max_tot/3,
-             m_msg->sqnam);
-      exit(1);
-    }
-    m_msg->loff = m_msg->n0;
-    m_msg->maxt3 = maxn-m_msg->loff;
-  }
-  else {       /* is TFAST */
-    if (m_msg->n0 > MAXTST) {
-      fprintf(stderr," query sequence is too long %d %s\n",m_msg->n0,m_msg->sqnam);
-      exit(1);
-    }
-
-    if (m_msg->n0*3 > maxn ) { /* n0*3 for the three frames - this
-                                  will only happen if maxn has been
-                                  set low manually */
-
-      if (m_msg->n0*4+2 < m_msg->max_tot) { /* m_msg0*3 + m_msg0 */
-       fprintf(stderr,
-               " query sequence too long for library segment: %d - resetting to %d\n",
-             maxn,m_msg->n0*3);
-       maxn = m_msg->maxn = m_msg->n0*3;
-      }
-      else {
-       fprintf(stderr," query sequence too long for translated search: %d * 4 > %d %s\n",
-             m_msg->n0,maxn, m_msg->sqnam);
-       exit(1);
-      }
-    }
-
-    /* set up some constants for overlaps */
-    m_msg->loff = 3*m_msg->n0;
-    m_msg->maxt3 = maxn-m_msg->loff-3;
-    m_msg->maxt3 -= m_msg->maxt3%3;
-    m_msg->maxt3++;
-
-    maxn = maxn - 3; maxn -= maxn%3; maxn++;
-  }
-  return maxn;
-}
-
-
-int
-scanseq(unsigned char *seq, int n, char *str) {
-  int tot,i;
-  char aaray[128];             /* this must be set > nsq */
-       
-  for (i=0; i<128; i++)  aaray[i]=0;
-  for (i=0; (size_t)i < strlen(str); i++) aaray[qascii[str[i]]]=1;
-  for (i=tot=0; i<n; i++) tot += aaray[seq[i]];
-  return tot;
-}
-
-/* subs_env takes a string, possibly with ${ENV}, and looks up all the
-   potential environment variables and substitutes them into the
-   string */
-
-void subs_env(char *dest, char *src, int dest_size) {
-  char *last_src, *bp, *bp1;
-
-  last_src = src;
-
-  if ((bp = strchr(src,'$'))==NULL) {
-    strncpy(dest, src, dest_size);
-    dest[dest_size-1] = '\0';
-  }
-  else {
-    *dest = '\0';
-    while (strlen(dest) < dest_size-1 && bp != NULL ) {
-      /* copy stuff before ${*/
-      *bp = '\0';
-      strncpy(dest, last_src, dest_size);
-      *bp = '$';
-
-      /* copy ENV */
-      if (*(bp+1) != '{') {
-       strncat(dest, "$", dest_size - strlen(dest) -1);
-       dest[dest_size-1] = '\0';
-       bp += 1;
-      }
-      else {   /* have  ${ENV} - put it in */
-       if ((bp1 = strchr(bp+2,'}'))==NULL) {
-         fprintf(stderr, "Unterminated ENV: %s\n",src);
-         break;
-       }
-       else {
-         *bp1 = '\0';
-         if (getenv(bp+2)!=NULL) {
-           strncat(dest, getenv(bp+2), dest_size - strlen(dest) - 1);
-           dest[dest_size-1] = '\0';
-           *bp1 = '}';
-         }
-         bp = bp1+1;   /* bump bp even if getenv == NULL */
-       }
-      }
-      last_src = bp;
-
-      /* now get the next ${ENV} if present */
-      bp = strchr(last_src,'$');
-    }
-    /* now copy the last stuff */
-    strncat(dest, last_src, dest_size - strlen(dest) - 1);
-    dest[dest_size-1]='\0';
-  }
-}
-
-
-void selectbest(bptr,k,n)      /* k is rank in array */
-     struct beststr **bptr;
-     int k,n;
-{
-  int v, i, j, l, r;
-  struct beststr *tmptr;
-
-  l=0; r=n-1;
-
-  while ( r > l ) {
-    v = bptr[r]->score[0];
-    i = l-1;
-    j = r;
-    do {
-      while (bptr[++i]->score[0] > v) ;
-      while (bptr[--j]->score[0] < v) ;
-      tmptr = bptr[i]; bptr[i]=bptr[j]; bptr[j]=tmptr;
-    } while (j > i);
-    bptr[j]=bptr[i]; bptr[i]=bptr[r]; bptr[r]=tmptr;
-    if (i>=k) r = i-1;
-    if (i<=k) l = i+1;
-  }
-}
-
-void selectbestz(bptr,k,n)     /* k is rank in array */
-     struct beststr **bptr;
-     int k,n;
-{
-  int i, j, l, r;
-  struct beststr *tmptr;
-  double v;
-
-  l=0; r=n-1;
-
-  while ( r > l ) {
-    v = bptr[r]->zscore;
-    i = l-1;
-    j = r;
-    do {
-      while (bptr[++i]->zscore > v) ;
-      while (bptr[--j]->zscore < v) ;
-      tmptr = bptr[i]; bptr[i]=bptr[j]; bptr[j]=tmptr;
-    } while (j > i);
-    bptr[j]=bptr[i]; bptr[i]=bptr[r]; bptr[r]=tmptr;
-    if (i>=k) r = i-1;
-    if (i<=k) l = i+1;
-  }
-}
-
-/* improved shellsort with high-performance increments */
-/*
-shellsort(itemType a[], int l, int r)
-{ int i, j, k, h; itemType v;
- int incs[16] = { 1391376, 463792, 198768, 86961, 33936,
-                 13776, 4592, 1968, 861, 336, 
-                 112, 48, 21, 7, 3, 1 };
- for ( k = 0; k < 16; k++)
-   for (h = incs[k], i = l+h; i <= r; i++)
-     { 
-       v = a[i]; j = i;
-       while (j > h && a[j-h] > v)
-        { a[j] = a[j-h]; j -= h; }
-       a[j] = v; 
-     } 
-}
-*/
-
-/* ?improved? version of sortbestz using optimal increments and fewer
-   exchanges */
-void sortbestz(struct beststr **bptr, int nbest)
-{
-  int gap, i, j, k;
-  struct beststr *tmp;
-  double v;
-  int incs[16] = { 1391376, 463792, 198768, 86961, 33936,
-                  13776, 4592, 1968, 861, 336, 
-                  112, 48, 21, 7, 3, 1 };
-
-  for ( k = 0; k < 16; k++) {
-    gap = incs[k];
-    for (i=gap; i < nbest; i++) {
-      tmp = bptr[i];
-      j = i;
-      v = bptr[i]->zscore;
-      while ( j >= gap && bptr[j-gap]->zscore < v) {
-       bptr[j] = bptr[j - gap];
-       j -= gap;
-      }
-      bptr[j] = tmp;
-    }
-  }
-}
-
-
-void sortbeste(struct beststr **bptr, int nbest)
-{
-  int gap, i, j, k;
-  struct beststr *tmp;
-  double v;
-  int incs[16] = { 1391376, 463792, 198768, 86961, 33936,
-                  13776, 4592, 1968, 861, 336, 
-                  112, 48, 21, 7, 3, 1 };
-
-  for ( k = 0; k < 16; k++) {
-    gap = incs[k]; 
-    for (i=gap; i < nbest; i++) {
-      j = i;
-      tmp = bptr[i];
-      v = tmp->escore;
-      while ( j >= gap && bptr[j-gap]->escore > v) {
-       bptr[j] = bptr[j - gap];
-       j -= gap;
-      }
-      bptr[j] = tmp;
-    }
-  }
-
-  /* sometimes there are many high scores with E()==0.0, sort
-     those by z() score */
-
-  j = 0;
-  while (j < nbest && bptr[j]->escore <= 2.0*DBL_MIN ) {j++;}
-  if (j > 1) sortbestz(bptr,j);
-}
-
-extern double zs_to_Ec(double zs, long entries);
-
-/*
-extern double ks_dev;
-extern int ks_df; */
-extern char hstring1[];
-
-void
-prhist(FILE *fd, struct mngmsg m_msg,
-       struct pstruct pst, 
-       struct hist_str hist, 
-       int nstats,
-       struct db_str ntt,
-       char *gstring2)
-{
-  int i,j,hl,hll, el, ell, ev;
-  char hline[80], pch, *bp;
-  int mh1, mht;
-  int maxval, maxvalt, dotsiz, ddotsiz,doinset;
-  double cur_e, prev_e, f_int;
-  double max_dev, x_tmp;
-  double db_tt;
-  int n_chi_sq, cum_hl=0, max_i;
-
-
-  fprintf(fd,"\n");
-  
-  if (pst.zsflag_f < 0) {
-    fprintf(fd, "%7ld residues in %5ld sequences\n", ntt.length,ntt.entries);
-    fprintf(fd,"\n%s\n",gstring2);
-    return;
-  }
-
-  if (nstats > 20) { 
-    max_dev = 0.0;
-    mh1 = hist.maxh-1;
-    mht = (3*hist.maxh-3)/4 - 1;
-
-    if (!m_msg.nohist && mh1 > 0) {
-      for (i=0,maxval=0,maxvalt=0; i<hist.maxh; i++) {
-       if (hist.hist_a[i] > maxval) maxval = hist.hist_a[i];
-       if (i >= mht &&  hist.hist_a[i]>maxvalt) maxvalt = hist.hist_a[i];
-      }
-      n_chi_sq = 0;
-      cum_hl = -hist.hist_a[0];
-      dotsiz = (maxval-1)/60+1;
-      ddotsiz = (maxvalt-1)/50+1;
-      doinset = (ddotsiz < dotsiz && dotsiz > 2);
-
-      if (pst.zsflag_f>=0)
-       fprintf(fd,"       opt      E()\n");
-      else 
-       fprintf(fd,"     opt\n");
-
-      prev_e =  zs_to_Ec((double)(hist.min_hist-hist.histint/2),hist.entries);
-      for (i=0; i<=mh1; i++) {
-       pch = (i==mh1) ? '>' : ' ';
-       pch = (i==0) ? '<' : pch;
-       hll = hl = hist.hist_a[i];
-       if (pst.zsflag_f>=0) {
-         cum_hl += hl;
-         f_int = (double)(i*hist.histint+hist.min_hist)+(double)hist.histint/2.0;
-         cur_e = zs_to_Ec(f_int,hist.entries);
-         ev = el = ell = (int)(cur_e - prev_e + 0.5);
-         if (hl > 0  && i > 5 && i < (90-hist.min_hist)/hist.histint) {
-           x_tmp  = fabs(cum_hl - cur_e);
-           if ( x_tmp > max_dev) {
-             max_dev = x_tmp;
-             max_i = i;
-           }
-           n_chi_sq++;
-         }
-         if ((el=(el+dotsiz-1)/dotsiz) > 60) el = 60;
-         if ((ell=(ell+ddotsiz-1)/ddotsiz) > 40) ell = 40;
-         fprintf(fd,"%c%3d %5d %5d:",
-                 pch,(i<mh1)?(i)*hist.histint+hist.min_hist :
-                 mh1*hist.histint+hist.min_hist,hl,ev);
-       }
-       else fprintf(fd,"%c%3d %5d :",
-                    pch,(i<mh1)?(i)*hist.histint+hist.min_hist :
-                    mh1*hist.histint+hist.min_hist,hl);
-
-       if ((hl=(hl+dotsiz-1)/dotsiz) > 60) hl = 60;
-       if ((hll=(hll+ddotsiz-1)/ddotsiz) > 40) hll = 40;
-       for (j=0; j<hl; j++) hline[j]='='; 
-       if (pst.zsflag_f>=0) {
-         if (el <= hl ) {
-           if (el > 0) hline[el-1]='*';
-           hline[hl]='\0';
-         }
-         else {
-           for (j = hl; j < el; j++) hline[j]=' ';
-           hline[el-1]='*';
-           hline[hl=el]='\0';
-         }
-       }
-       else hline[hl] = 0;
-       if (i==1) {
-         for (j=hl; j<10; j++) hline[j]=' ';
-         sprintf(&hline[10]," one = represents %d library sequences",dotsiz);
-       }
-       if (doinset && i == mht-2) {
-         for (j = hl; j < 10; j++) hline[j]=' ';
-         sprintf(&hline[10]," inset = represents %d library sequences",ddotsiz);
-       }
-       if (i >= mht&& doinset ) {
-         for (j = hl; j < 10; j++) hline[j]=' ';
-         hline[10]=':';
-         for (j = 11; j<11+hll; j++) hline[j]='=';
-         hline[11+hll]='\0';
-         if (pst.zsflag_f>=0) {
-           if (ell <= hll) hline[10+ell]='*';
-           else {
-             for (j = 11+hll; j < 10+ell; j++) hline[j]=' ';
-             hline[10+ell] = '*';
-             hline[11+ell] = '\0';
-           }
-         }
-       }
-
-       fprintf(fd,"%s\n",hline);
-       prev_e = cur_e;
-      }
-    }
-  }
-
-  if (ntt.carry==0) {
-    fprintf(fd, "%7ld residues in %5ld sequences\n", ntt.length, ntt.entries);
-  }
-  else {
-    db_tt = (double)ntt.carry*(double)LONG_MAX + (double)ntt.length;
-    fprintf(fd, "%.0f residues in %5ld library sequences\n", db_tt, ntt.entries);
-  }
-
-  if (pst.zsflag_f>=0) {
-    if (MAXSTATS < hist.entries)
-#ifdef SAMP_STATS
-      fprintf(fd," statistics sampled from %d to %ld sequences\n",
-             MAXSTATS,hist.entries);
-#else
-      fprintf(fd," statistics extrapolated from %d to %ld sequences\n",
-             MAXSTATS,hist.entries);
-#endif
-    /*    summ_stats(stat_info); */
-    fprintf(fd," %s\n",hist.stat_info);
-    if (!m_msg.nohist && cum_hl > 0)
-      fprintf(fd," Kolmogorov-Smirnov  statistic: %6.4f (N=%d) at %3d\n",
-             max_dev/(float)cum_hl, n_chi_sq,max_i*hist.histint+hist.min_hist);
-    if (m_msg.markx & MX_M10FORM) {
-      while ((bp=strchr(hist.stat_info,'\n'))!=NULL) *bp=' ';
-      if (cum_hl <= 0) cum_hl = -1;
-      sprintf(hstring1,"; mp_extrap: %d %ld\n; mp_stats: %s\n; mp_KS: %6.4f (N=%d) at %3d\n",
-             MAXSTATS,hist.entries,hist.stat_info,max_dev/(float)cum_hl, n_chi_sq,max_i*hist.histint+hist.min_hist);
-    }
-  }
-  fprintf(fd,"\n%s\n",gstring2);
-  fflush(fd);
-}
-
-extern char prog_name[], *verstr;
-
-void s_abort (char *p,  char *p1)
-{
-  int i;
-
-  fprintf (stderr, "\n***[%s] %s%s***\n", prog_name, p, p1);
-#ifdef PCOMPLIB
-#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
-#endif
-  exit (1);
-}
-
-#ifndef MPI_SRC
-void w_abort (char *p, char *p1)
-{
-  fprintf (stderr, "\n***[%s] %s%s***\n\n", prog_name, p, p1);
-  exit (1);
-}
-#endif
-
-#ifndef PCOMPLIB
-/* copies from from to to shuffling */
-
-extern int nrand(int);
-
-void
-shuffle(unsigned char *from, unsigned char *to, int n)
-{
-  int i,j; unsigned char tmp;
-
-  if (from != to) memcpy((void *)to,(void *)from,n);
-
-  for (i=n; i>0; i--) {
-    j = nrand(i);
-    tmp = to[j];
-    to[j] = to[i-1];
-    to[i-1] = tmp;
-  }
-  to[n] = 0;
-}
-
-/* copies from from to from shuffling, ieven changed for threads */
-void
-wshuffle(unsigned char *from, unsigned char *to, int n, int wsiz, int *ieven)
-{
-  int i,j, k, mm; 
-  unsigned char tmp, *top;
-
-  memcpy((void *)to,(void *)from,n);
-       
-  mm = n%wsiz;
-
-  if (*ieven) {
-    for (k=0; k<(n-wsiz); k += wsiz) {
-      top = &to[k];
-      for (i=wsiz; i>0; i--) {
-       j = nrand(i);
-       tmp = top[j];
-       top[j] = top[i-1];
-       top[i-1] = tmp;
-      }
-    }
-    top = &to[n-mm];
-    for (i=mm; i>0; i--) {
-      j = nrand(i);
-      tmp = top[j];
-      top[j] = top[i-1];
-      top[i-1] = tmp;
-    }
-    *ieven = 0;
-  }
-  else {
-    for (k=n; k>=wsiz; k -= wsiz) {
-      top = &to[k-wsiz];
-      for (i=wsiz; i>0; i--) {
-       j = nrand(i);
-       tmp = top[j];
-       top[j] = top[i-1];
-       top[i-1] = tmp;
-      }
-    }
-    top = &to[0];
-    for (i=mm; i>0; i--) {
-      j = nrand(i);
-      tmp = top[j];
-      top[j] = top[i-1];
-      top[i-1] = tmp;
-    }
-    *ieven = 1;
-  }
-  to[n] = 0;
-}
-
-#endif
-
-int
-sfn_cmp(int *q, int *s)
-{
-  if (*q == *s) return *q;
-  while (*q && *s) {
-    if (*q == *s) return *q;
-    else if (*q < *s) q++;
-    else if (*q > *s) s++;
-  }
-  return 0;
-}
-
-#ifndef MPI_SRC
-
-#define ESS 49
-
-void
-revcomp(unsigned char *seq, int n, int *c_nt)
-{
-  unsigned char tmp;
-  int i, ni;
-
-  for (i=0, ni = n-1; i< n/2; i++,ni--) {
-    tmp = c_nt[seq[i]];
-    seq[i] = c_nt[seq[ni]];
-    seq[ni] = tmp;
-  }
-  if ((n%2)==1) {
-    i = n/2;
-    seq[i] = c_nt[seq[i]];
-  }
-  seq[n]=0;
-}
-#endif
-
-#ifdef PCOMPLIB
-
-/* init_stage2 sets up the data structures necessary to send a subset
-   of sequences to the nodes, and then collects the results
-*/
-
-/* wstage2[] FIRSTNODE .. nnodes has the next sequence to be do_opt()/do_walign()ed */
-/* wstage2p[] is a list of sequence numbers/frames, to be sent to workers */
-/* wstage2b[] is a list of bptr's that shares the index with wstage2p[] */
-
-static int  wstage2[MAXWRKR +1];       /* count of second stage scores */
-static struct stage2_str  *wstage2p[MAXWRKR+1]; /* list of second stage sequences */
-static int  wstage2i[MAXWRKR+1];       /* index into second stage sequences */
-static struct beststr *bbptr,
-     **wstage2b[MAXWRKR+1];    /* reverse pointers to bestr */
-
-void
-do_stage2(struct beststr **bptr, int nbest, struct mngmsg m_msg0,
-         int s_func, struct qmng_str *qm_msp) {
-
-  int i, is, ib, iw, nres;
-  int node, snode, node_done;
-  int bufid, numt, tid;
-  char errstr[120];
-  struct comstr2 bestr2[BFR2+1];       /* temporary structure array */
-  char *seqc_buff, *seqc;
-  int seqc_buff_len, aln_code_n;
-#ifdef MPI_SRC
-  MPI_Status mpi_status;
-#endif
-
-  /* initialize the counter for each worker to 0 */
-  for (iw = FIRSTNODE; iw < nnodes; iw++) wstage2[iw] = 0;
-
-  /* for each result, bump the counter for the worker that has
-     the sequence */
-  for (ib = 0; ib < nbest; ib++ ) { wstage2[bptr[ib]->wrkr]++;  }
-
-  /* now allocate enough space to send each worker a 
-     list of its sequences stage2_str {seqnm, frame} */
-  for (iw = FIRSTNODE; iw < nnodes; iw++) {
-    if (wstage2[iw]>0) {
-      if ((wstage2p[iw]=
-          (struct stage2_str *)
-          calloc(wstage2[iw],sizeof(struct stage2_str)))==NULL) {
-       sprintf(errstr," cannot allocate sequence listp %d %d",
-               iw,wstage2[iw]);
-       s_abort(errstr,"");
-      }
-
-      /* allocate space to remember the bptr's for each result */
-      if ((wstage2b[iw]=(struct beststr **)
-          calloc(wstage2[iw],sizeof(struct beststr *)))==NULL) {
-       sprintf(errstr," cannot allocate sequence listb %d %d",
-               iw,wstage2[iw]);
-       s_abort(errstr,"");
-      }
-      wstage2i[iw]=0;
-    }
-    else {
-      wstage2p[iw] = NULL;
-      wstage2b[iw] = NULL;
-    }
-  }
-
-  /* for each result, set wstage2p[worker][result_index_in_worker] */
-  for (is = 0; is < nbest; is++) {
-    iw=bptr[is]->wrkr;
-    wstage2p[iw][wstage2i[iw]].seqnm = bptr[is]->seqnm;
-    wstage2p[iw][wstage2i[iw]].frame = bptr[is]->frame;
-    wstage2b[iw][wstage2i[iw]] = bptr[is];
-    wstage2i[iw]++;
-  }
-
-
-  /* at this point, wstage2i[iw] should equal wstage2[iw] */
-  node_done = 0;
-  for (node = FIRSTNODE; node < nnodes; node++) {
-
-    /*    fprintf(stderr,"node: %d stage2: %d\n",node,wstage2[node]); */
-
-    /* if a worker has no results, move on */
-    if (wstage2[node]<=0) { node_done++; continue;}
-
-    qm_msp->slist = wstage2[node];     /* set number of results to return */
-    qm_msp->s_func = s_func;           /* set s_funct for do_opt/do_walign */
-#ifdef PVM_SRC
-    pvm_initsend(PvmDataRaw);
-    pvm_pkbyte((char *)qm_msp,sizeof(struct qmng_str),1);
-    pvm_send(pinums[node],MSEQTYPE);   /* send qm_msp */
-    pvm_initsend(PvmDataRaw);  /* send the list of seqnm/frame */
-    pvm_pkbyte((char *)wstage2p[node],wstage2[node]*sizeof(struct stage2_str),1);
-    pvm_send(pinums[node],LISTTYPE);
-#endif
-#ifdef MPI_SRC
-    MPI_Send(qm_msp,sizeof(struct qmng_str),MPI_BYTE,node,MSEQTYPE,
-            MPI_COMM_WORLD);
-    MPI_Send((char *)wstage2p[node],wstage2[node]*
-            sizeof(struct stage2_str),MPI_BYTE,node,LISTTYPE,
-            MPI_COMM_WORLD);
-#endif
-  }
-       
-  /* all the workers have their list of sequences */
-  /* reset the index of results to obtain */
-  for (iw = 0; iw < nnodes; iw++) wstage2i[iw]=0;
-       
-  while (node_done < nnodes-FIRSTNODE) {
-#ifdef PVM_SRC
-    bufid = pvm_recv(-1,LISTRTYPE);    /* wait for results */
-    pvm_bufinfo(bufid,NULL,NULL,&tid);
-    /* get a chunk of comstr2 results */
-    pvm_upkbyte((char *)&bestr2[0],sizeof(struct comstr2)*(BFR2+1),1);
-    snode = (iw=tidtonode(tid));
-    pvm_freebuf(bufid);
-#endif
-#ifdef MPI_SRC
-    MPI_Recv((char *)&bestr2[0],sizeof(struct comstr2)*(BFR2+1),
-            MPI_BYTE,MPI_ANY_SOURCE,LISTRTYPE,MPI_COMM_WORLD,
-            &mpi_status);
-    snode = mpi_status.MPI_SOURCE;
-    iw = snode;
-#endif
-
-    seqc_buff = NULL;
-    if (s_func == DO_OPT_FLG && m_msg0.show_code==SHOW_CODE_ALIGN) {
-#ifdef PVM_SRC
-      bufid = pvm_recv(tid,CODERTYPE);
-      pvm_upkint(&seqc_buff_len,1,1);  /* get the code string length */
-#endif
-#ifdef MPI_SRC
-      MPI_Recv((char *)&seqc_buff_len,1,MPI_INT, snode,
-              CODERTYPE,MPI_COMM_WORLD, &mpi_status);
-#endif
-
-      seqc=seqc_buff = NULL;
-      if (seqc_buff_len > 0) {         /* allocate space for it */
-       if ((seqc=seqc_buff=calloc(seqc_buff_len,sizeof(char)))==NULL) {
-         fprintf(stderr,"Cannot allocate seqc_buff: %d\n",seqc_buff_len);
-         seqc_buff_len=0;
-       }
-       else {
-#ifdef PVM_SRC
-         pvm_upkbyte(seqc_buff,seqc_buff_len*sizeof(char),1);
-#endif
-#ifdef MPI_SRC
-         MPI_Recv((char *)seqc_buff,seqc_buff_len*sizeof(char),
-                  MPI_BYTE,snode,CODERTYPE,MPI_COMM_WORLD, &mpi_status);
-#endif
-       }
-      }
-#ifdef PVM_SRC
-      pvm_freebuf(bufid);
-#endif
-    }
-
-    /* get number of results in this message */
-    nres = bestr2[BFR2].seqnm & ~FINISHED;
-    /* check to see if finished */
-    if (bestr2[BFR2].seqnm&FINISHED) {node_done++;}
-
-    seqc = seqc_buff;
-
-    /* count through results from a specific worker */
-    for (i=0,is=wstage2i[iw]; i < nres; i++,is++) {
-
-      /* get the (saved) bptr for this result */
-      bbptr=wstage2b[iw][is];
-      /* consistency check seqnm's must agree */
-      if (wstage2p[iw][is].seqnm ==  bbptr->seqnm) {
-       if (s_func == DO_CALC_FLG && m_msg0.last_calc_flg) {
-         bbptr->score[0] = bestr2[i].score[0];
-         bbptr->score[1] = bestr2[i].score[1];
-         bbptr->score[2] = bestr2[i].score[2];
-         bbptr->escore = bestr2[i].escore;
-         bbptr->segnum = bestr2[i].segnum;
-         bbptr->seglen = bestr2[i].seglen;
-       }
-       else if (m_msg0.stages > 1) {
-         bbptr->score[0] = bestr2[i].score[0];
-         bbptr->score[1] = bestr2[i].score[1];
-         bbptr->score[2] = bestr2[i].score[2];
-       }
-
-       if (s_func == DO_OPT_FLG && m_msg0.markx & MX_M9SUMM) {
-         /* get score, alignment information, percents */
-         bbptr->sw_score = bestr2[i].sw_score;
-         memcpy(bbptr->aln_d,&bestr2[i].aln_d,sizeof(struct a_struct));
-         bbptr->percent = bestr2[i].percent;
-         bbptr->gpercent = bestr2[i].gpercent;
-
-         if (m_msg0.show_code == 2) {  /* if show code */
-           /* length of encoding */
-           aln_code_n = bbptr->aln_code_n = bestr2[i].aln_code_n;
-           if (aln_code_n > 0) {
-             if ((bbptr->aln_code = 
-                  (char *)calloc(aln_code_n+1,sizeof(char)))==NULL) {
-               fprintf(stderr,"cannot allocate seq_code[%d:%d]: %d\n",
-                       bbptr->wrkr,bbptr->seqnm,aln_code_n);
-               seqc += aln_code_n+1;
-               bbptr->aln_code_n = 0;
-             }
-             else {
-               strncpy(bbptr->aln_code,seqc,aln_code_n);
-               bbptr->aln_code[aln_code_n]='\0';
-               seqc += aln_code_n+1;
-             }
-           }
-           else {
-             fprintf(stderr," aln_code_n <=0: %d\n",aln_code_n);
-           }
-         }
-       }
-      }
-      else fprintf(stderr,"phase error in phase II return %d %d", iw,i);
-    }
-    if (seqc_buff != NULL) {
-      free(seqc_buff);
-      seqc_buff = NULL;
-    }
-    wstage2i[iw] += nres;
-  }
-
-  for (iw=FIRSTNODE; iw < nnodes; iw++) {
-    if ((void *)wstage2p[iw]!=NULL) free((void *)wstage2p[iw]);
-    if ((void *)wstage2b[iw]!=NULL) free((void *)wstage2b[iw]);
-  }
-}
-
-#endif