Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / fasta34 / mshowbest.c
diff --git a/website/archive/binaries/mac/src/fasta34/mshowbest.c b/website/archive/binaries/mac/src/fasta34/mshowbest.c
new file mode 100644 (file)
index 0000000..e1d3059
--- /dev/null
@@ -0,0 +1,504 @@
+
+/* copyright (c) 1996, 1997, 1998, 1999 William R. Pearson and the
+   U. of Virginia */
+
+/* $Name: fa_34_26_5 $ - $Id: mshowbest.c,v 1.44 2006/06/30 19:46:36 wrp Exp $ */
+
+/*   29-Oct-2003 - changes so that bbp->cont < 0 => aa1 sequence is
+     already in aa1, no re_openlib or re_getlib required
+*/
+
+/*   14-May-2003 Changes to use a more consistent coordinate numbering
+     system for displays.  aln->d_start[01] is now consistently used
+     to report the start of the alignment in all functions, and
+     mshowbest.c has been modified to use d_start[01] instead of
+     d_start[01]-1.  aln->min[01] now starts at 0 for all functions;
+     instead of 1 for some functions (dropnfa.c, dropgsw.c, dropfs2.c
+     earlier).
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "defs.h"
+#include "structs.h"
+#include "param.h"
+
+#ifndef PCOMPLIB
+#include "mm_file.h"
+#include "mw.h"
+#else
+#include "p_mw.h"
+#endif
+
+
+#define MAX_BLINE 256
+
+#ifndef PCOMPLIB
+/* function calls necessary to re_getlib() the sequence and, do
+   alignments, if necessary
+*/
+
+#define RANLIB (m_fptr->ranlib)
+
+int
+re_getlib(unsigned char *, int, int, int, int, int, long *, long *, 
+         struct lmf_str *m_fptr);
+
+#include "drop_func.h"
+
+struct lmf_str *re_openlib(struct lmf_str *, int outtty);
+#endif
+
+extern void cal_coord(int n0, int n1, long sq0off, long loffset,
+                     struct a_struct *aln);
+
+void header_aux(FILE *);
+void show_aux(FILE *, struct beststr *);
+void w_abort (char *p, char *p1);
+
+/* BBP_INFO get stuff directly from beststr or from beststr->desptr */
+#ifdef PCOMPLIB
+#define BBP_INFO(info) bbp->desptr->info
+#else
+#define BBP_INFO(info) bbp->info
+#endif
+
+extern double zs_to_bit(double, int, int);
+
+/* showbest() shows a list of high scoring sequence descriptions, and
+   their scores.  If -m 9, then an additional complete set of
+   alignment information is provided.
+
+   If PCOMPLIB or m_msg.quiet then the number of high scores to be
+   shown is pre-determined by m_msg.mshow before showbest is called.
+
+   The comp_lib.c version re_getlib()'s the sequence for its
+   discription, and then does another alignment for -m 9 (Thus, it
+   needs an f_str.  The PCOMPLIB version has everything available in
+   beststr before showbest() is called.
+*/
+
+void showbest (FILE *fp, 
+#ifndef PCOMPLIB
+              unsigned char **aa0, unsigned char *aa1, int maxn,
+#endif
+              struct beststr **bptr,int nbest, int qlib, struct mngmsg *m_msg,
+              struct pstruct pst, struct db_str db,
+              char *gstring2
+#ifndef PCOMPLIB
+              ,void **f_str
+#endif
+)
+{
+  int ntmp = 0;
+  char bline[MAX_BLINE], fmt[40], pad[MAX_BLINE], rline[40];
+  char l_name[128];
+  int istart = 0, istop, ib;
+  int nshow;
+  int quiet;
+  int r_margin;
+  struct beststr *bbp;
+  int n1tot;
+  char *bp;
+  char rel_label[12];
+  char tmp_str[20], *seqc;
+  int seqc_len;
+  long loffset, l_off;
+  int n0, n1;
+  struct rstruct rst;
+  int lc, maxc, nident, ngap;
+  float percent, gpercent;
+  struct a_struct *aln_p;
+  int *tres;
+  int gi_num;
+
+#ifndef PCOMPLIB
+  struct lmf_str *m_fptr;
+#endif
+
+  strncpy(rel_label,"\0",2);
+#ifdef SHOWREL
+  strncpy(rel_label," related",sizeof(rel_label));
+#endif
+#ifdef SHOWUN
+  strncpy(rel_label," unrelated",sizeof(rel_label));
+#endif
+  rel_label[sizeof(rel_label)-1]='\0';
+
+#ifdef PCOMPLIB
+  quiet = 1;
+#else
+  quiet = m_msg->quiet;
+#endif
+
+  n0 = m_msg->n0;
+
+  if (m_msg->aln.llen > MAX_BLINE) m_msg->aln.llen = MAX_BLINE;
+
+  if (pst.zsflag < 0) r_margin = 10;
+  else if (pst.zsflag>=0  && m_msg->srelv > 1 ) r_margin = 19;
+  else r_margin = 10;
+
+  if (m_msg->markx & MX_M9SUMM && m_msg->show_code == SHOW_CODE_ID) {
+#ifdef SHOWSIM
+    r_margin += 15;
+#else
+    r_margin += 10;
+#endif
+  }
+
+  if (m_msg->nframe < 0) 
+#ifndef SUPERFAMNUM
+    sprintf(fmt,"%%-%ds (%%4d)",m_msg->aln.llen-r_margin);
+#else
+    sprintf(fmt,"%%-%ds [%%4d](%%4d)",m_msg->aln.llen-(r_margin+4));
+#endif
+  else 
+    sprintf(fmt,"%%-%ds (%%4d)",m_msg->aln.llen-(r_margin+4));
+
+  memset(pad,' ',m_msg->aln.llen-(r_margin+6));
+  pad[m_msg->aln.llen-(r_margin+12)]='\0';
+
+  if (quiet != -1) {   /* quiet is set to -1 in comp_mlib.c to force
+                          all significant hits to be shown */
+    nshow = 20;
+    if (m_msg->mshow == -1) nshow = nbest;             /* show all */
+    /* show specified number */
+    else if (m_msg->mshow_flg) {
+      nshow = min (m_msg->mshow, nshow);
+    }
+  }
+  else nshow = m_msg->nshow;
+
+  if (quiet==0) istop = 20;
+  else istop = nshow;
+
+  if (quiet==0) {
+    printf(" How many scores would you like to see? [%d] ",m_msg->nshow);
+    fflush(stdout);
+    if (fgets(rline,20,stdin)==NULL) exit(0);
+    nshow = m_msg->nshow;
+    if (rline[0]!='\n' && rline[0]!=0) sscanf(rline,"%d",&nshow);
+    if (nshow<=0) nshow = min(20,nbest);
+  }
+
+  if ((bp = strchr (m_msg->qtitle, '\n')) != NULL) *bp = '\0';
+/*   fprintf (fp, "%3d %s\n", qlib,m_msg->qtitle); */
+
+  if (m_msg->markx & MX_HTML) fprintf(fp,"<p><tt><pre>\n");
+
+  if (pst.zsflag >= 0) {
+    if (bptr[0]->escore < m_msg->e_cut) {
+      if (m_msg->z_bits==1) {/* show bit score */
+       fprintf(fp,"The best%s scores are:%s%s bits E(%ld)",
+              rel_label,pad,m_msg->label,pst.zdb_size);
+      }
+      else {/* show z-score */
+       fprintf(fp,"The best%s scores are:%s%s z-sc E(%ld)",
+             rel_label,pad,m_msg->label,pst.zdb_size);
+      }
+      header_aux(fp);
+      if (m_msg->markx & MX_M9SUMM) {
+       if (m_msg->show_code == SHOW_CODE_ID) {
+#ifdef SHOWSIM
+         fprintf(fp," %%_id  %%_sim  alen");
+#else
+         fprintf(fp," %%_id  alen");
+#endif
+       }
+       else {
+       if (m_msg->markx & MX_HTML && m_msg->show_code !=1) { fprintf(fp,"<!-- ");}
+#ifndef SHOWSIM
+         fprintf(fp,"\t%%_id  %%_gid %4s  alen  an0  ax0  pn0  px0  an1  ax1 pn1 px1 gapq gapl  fs ",m_msg->f_id1);
+#else
+         fprintf(fp,"\t%%_id  %%_sim %4s  alen  an0  ax0  pn0  px0  an1  ax1 pn1 px1 gapq gapl  fs ",m_msg->f_id1);
+#endif
+       }
+       if (m_msg->show_code == SHOW_CODE_ALIGN) {      fprintf(fp," aln_code"); }
+       if (m_msg->markx & MX_HTML && m_msg->show_code!=1) { fprintf(fp," -->");}
+      }
+      fprintf(fp,"\n");
+    }
+    else {
+      fprintf(fp,"!! No library sequences with E() < %.2g\n",m_msg->e_cut);
+      m_msg->nshow = 0;
+      if (m_msg->markx & MX_HTML) fprintf(fp,"<p></tt></pre>\n");
+      return;
+    }
+  }
+  else {
+    fprintf(fp,"The best%s scores are:%s%s",rel_label,pad,m_msg->label);
+    header_aux(fp);
+    if (m_msg->markx & MX_M9SUMM) {
+      if (m_msg->show_code == SHOW_CODE_ID) {
+#ifdef SHOWSIM
+       fprintf(fp," %%_id  %%_sm  alen");
+#else
+       fprintf(fp," %%_id  alen");
+#endif
+      }
+      else {
+#ifndef SHOWSIM
+       fprintf(fp,"\t%%_id  %%_gid %4s  alen  an0  ax0  pn0  px0  an1  ax1 pn1 px1 gapq gapl  fs ",m_msg->f_id1);
+#else
+       fprintf(fp,"\t%%_id  %%_sim %4s  alen  an0  ax0  pn0  px0  an1  ax1 pn1 px1 gapq gapl  fs ",m_msg->f_id1);
+#endif
+      }
+    }
+    if (m_msg->show_code == SHOW_CODE_ALIGN) { fprintf(fp," aln_code"); }
+    fprintf(fp,"\n");
+  }
+
+  istart = 0;
+l1:
+  istop = min(nbest,nshow);
+  for (ib=istart; ib<istop; ib++) {
+    bbp = bptr[ib];
+#ifdef SUPERFAMNUM
+    if (BBP_INFO(nsfnum) > 0 && sfn_cmp(m_msg->qsfnum_n,BBP_INFO(sfnum))) continue;
+#ifdef SHOWUN
+    if (BBP_INFO(nsfnum) > 0 && sfn_cmp(m_msg->qsfnum,BBP_INFO(sfnum))) {
+      istop = min(istop+1,nbest);
+    /*
+      fprintf(stderr,"skipping %d: %d==%d\n",ib,m_msg->qsfnum,BBP_INFO(sfnum));
+      */
+      continue;
+    }
+#endif
+#ifdef SHOWREL
+    if (BBP_INFO(nsfnum) == 0 || (BBP_INFO(nsfnum) > 0 && !sfn_cmp(m_msg->qsfnum,BBP_INFO(sfnum)))) {
+      istop = min(istop+1,nbest);
+    /*
+      fprintf(stderr,"skipping %d: %d==%d\n",ib,m_msg->qsfnum,BBP_INFO(sfnum));
+      */
+      continue;
+    }
+#endif
+#endif
+    if (quiet==1 && pst.zsflag>=0) {
+      if (bbp->escore > m_msg->e_cut) {
+       nshow = ib;
+       goto done;
+      }
+      else if (bbp->escore < m_msg->e_low) continue;
+    }
+
+#ifndef PCOMPLIB
+    if ((m_fptr=re_openlib(bbp->m_file_p,!m_msg->quiet))==NULL) {
+      fprintf(stderr,"*** cannot re-open %s\n",bbp->m_file_p->lb_name);
+      exit(1);
+    }
+    RANLIB(bline,m_msg->aln.llen,bbp->lseek,bbp->libstr,m_fptr);
+#else
+  strncpy(bline,BBP_INFO(bline),m_msg->aln.llen-r_margin);
+  bline[m_msg->aln.llen]='\0';
+#endif
+
+  /* l_name is used to build an HTML link from the bestscore line to
+     the alignment.  It can also be used to discriminate multiple hits
+     from the same long sequence.  This requires that fast_pan use -m 6. */
+
+  strncpy(l_name,bline,sizeof(l_name)); /* get rid of text after second "|" */
+  l_name[sizeof(l_name)-1]='\0';
+  if ((bp=strchr(l_name,' '))!=NULL) *bp=0;
+  if ((bp=strchr(&l_name[3],'|'))!=NULL) *bp='\0';
+  if (m_msg->nframe > 2) sprintf(&l_name[strlen(l_name)],"_%d",bbp->frame+1);
+  else if (m_msg->nframe > 0 && bbp->frame == 1)
+    strncat(l_name,"_r",sizeof(l_name));
+  if (bbp->cont-1 > 0) {
+    sprintf(tmp_str,":%d",bbp->cont-1);
+    strncat(l_name,tmp_str,sizeof(l_name)-strlen(l_name));
+  }
+
+
+#ifndef PCOMPLIB
+  if (m_msg->stages>1 || m_msg->markx & MX_M9SUMM) {
+    if (bbp->cont >= 0) {
+      n1 = re_getlib(aa1,maxn,m_msg->maxt3,m_msg->loff,bbp->cont,m_msg->term_code,
+                    &loffset,&l_off,bbp->m_file_p);
+    }
+    else { n1 = maxn;}
+    if (! m_msg->markx & MX_M9SUMM) {
+      do_opt (aa0[bbp->frame], m_msg->n0, aa1, n1, bbp->frame, &pst, f_str[bbp->frame], &rst);
+      bbp->score[2]=rst.score[2];
+    }
+    else {
+      bbp->sw_score = 
+       do_walign(aa0[bbp->frame],m_msg->n0, aa1, n1, bbp->frame, 
+                 &pst, f_str[bbp->frame], &bbp->a_res, &bbp->have_ares);
+
+      
+      /* save the alignment encoding for future use */
+      if (bbp->have_ares && ((tres = calloc(bbp->a_res.nres+1,sizeof(int)))!=NULL)) {
+       memcpy(tres,bbp->a_res.res,sizeof(int)*bbp->a_res.nres);
+       bbp->a_res.res = tres;
+      }
+
+      aln_func_vals(bbp->frame, &m_msg->aln);
+
+      maxc = bbp->a_res.nres + 4*m_msg->aln.llen+4;
+      seqc = NULL;
+      seqc_len = 0;
+      if (m_msg->show_code == SHOW_CODE_ALIGN) {
+       if ((seqc=(char *)calloc(maxc,sizeof(char)))!=NULL) {
+         lc=calc_code(aa0[bbp->frame],m_msg->n0,
+                      aa1,n1, 
+                      &m_msg->aln,bbp->a_res,
+                      pst,seqc,maxc,f_str[bbp->frame]);
+         seqc_len = strlen(seqc);
+       }
+      }
+      else {
+       lc=calc_id(aa0[bbp->frame],m_msg->n0,aa1,n1,
+                  &m_msg->aln, bbp->a_res,
+                  pst,f_str[bbp->frame]);
+      }
+      m_msg->aln.a_len = lc;
+
+      nident = m_msg->aln.nident;
+      if (lc > 0) percent = (100.0*(float)nident)/(float)lc;
+      else percent = -1.00;
+
+      ngap = m_msg->aln.ngap_q + m_msg->aln.ngap_l;
+#ifndef SHOWSIM
+      if (lc-ngap > 0) gpercent = (100.0*(float)nident)/(float)(lc-ngap);
+      else gpercent = -1.00;
+#else
+      if (lc-ngap > 0) gpercent = (100.0*(float)m_msg->aln.nsim)/(float)(lc);
+      else gpercent = -1.00;
+#endif
+
+    }
+  }
+#endif
+
+  n1tot = (BBP_INFO(n1tot_p)) ? *BBP_INFO(n1tot_p) : bbp->n1;
+
+  bp = bline;
+  if ((m_msg->markx & MX_HTML) && !strncmp(bline,"gi|",3)) {
+    bp = strchr(bline+4,'|')+1;
+    *(bp-1) = 0;
+    gi_num = atoi(bline+3);
+  }
+
+#ifndef SUPERFAMNUM
+  bp[m_msg->aln.llen-r_margin]='\0';
+#else
+  bp[m_msg->aln.llen-r_margin-5]='\0';
+#endif
+
+  if (m_msg->nframe == -1) bp[m_msg->aln.llen-r_margin]='\0';
+  else bp[m_msg->aln.llen-(r_margin+4)]='\0';
+
+#ifndef SUPERFAMNUM
+  fprintf (fp, fmt,bp,n1tot);
+#else
+  if (m_msg->nframe == -1) {
+    fprintf (fp, fmt,bp,BBP_INFO(sfnum[0]),n1tot);
+  }
+  else {fprintf (fp, fmt,bp,n1tot);}
+#endif
+
+  if (m_msg->nframe > 2) fprintf (fp, " [%d]", bbp->frame+1);
+  else if (m_msg->nframe >= 0) fprintf(fp," [%c]",(bbp->frame > 0 ?'r':'f'));
+
+  if (m_msg->srelv == 1) fprintf (fp, " %4d", bbp->score[pst.score_ix]);
+  else {
+    if (m_msg->srelv-1 > 0) fprintf (fp, " %4d", bbp->score[0]);
+    if (m_msg->srelv-1 > 1 || m_msg->stages>1)
+      fprintf (fp, " %4d", bbp->score[1]);
+    fprintf (fp, " %4d", bbp->score[pst.score_ix]);
+  }
+
+  if (pst.zsflag>=0) { 
+    if (m_msg->z_bits==1) {
+      fprintf (fp, " %.1f %7.2g",zs_to_bit(bbp->zscore,m_msg->n0,bbp->n1),bbp->escore);
+    }
+    else fprintf (fp, " %.1f %7.2g",bbp->zscore,bbp->escore);
+  }
+  show_aux(fp,bbp);
+
+#ifdef PCOMPLIB
+  n1 = bbp->n1;
+  percent = bbp->percent;
+  gpercent = bbp->gpercent;
+  aln_p = bbp->aln_d;
+  seqc = bbp->aln_code;
+  seqc_len = bbp->aln_code_n;
+  loffset = bbp->desptr->loffset;
+  l_off = 0;
+#else
+  aln_p = &(m_msg->aln);
+#endif
+
+  if (m_msg->markx & MX_M9SUMM) {
+    if (m_msg->show_code != SHOW_CODE_ID) {
+      if (m_msg->markx & MX_HTML) fprintf(fp,"<!-- ");
+      cal_coord(m_msg->n0,bbp->n1,m_msg->sq0off,loffset+l_off-1,aln_p);
+
+      /*            %_id  %_sim s-w alen an0  ax0  pn0  px0  an1  ax1  pn1  px1 gapq gapl fs  */
+      /*                    alignment    min  max            min  max */
+      /*                    sequence coordinate    min  max            min  max */
+      fprintf(fp,"\t%5.3f %5.3f %4d %4d %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %3d %3d %3d",
+             percent/100.0,gpercent/100.0, bbp->sw_score,aln_p->a_len,
+             aln_p->d_start0,aln_p->d_stop0,
+             m_msg->sq0off, m_msg->sq0off+m_msg->n0-1,
+             aln_p->d_start1,aln_p->d_stop1,
+             loffset+l_off, loffset+l_off+bbp->n1-1,
+             aln_p->ngap_q,aln_p->ngap_l,aln_p->nfs);
+      if (m_msg->show_code == SHOW_CODE_ALIGN
+         && seqc_len > 0 && seqc != NULL) {
+       fprintf(fp,"\t%s",seqc);
+      /*      fprintf(fp," [%2d:%d]",bbp->wrkr,bbp->seqnm); */
+       free(seqc);
+       seqc = NULL;
+      }
+      if (m_msg->markx & MX_HTML) fprintf(fp," -->");
+    }
+    else {
+#ifdef SHOWSIM
+      fprintf(fp," %5.3f %5.3f %4d", percent/100.0,(float)aln_p->nsim/(float)aln_p->a_len,aln_p->a_len);
+#else
+      fprintf(fp," %5.3f %4d", percent/100.0,aln_p->a_len);
+#endif
+    }
+  }
+  if (m_msg->markx & MX_HTML) fprintf(fp," <A HREF=\"#%s\">align</A>",l_name);
+  fprintf (fp, "\n");
+  fflush(fp);
+  }
+
+  if (quiet==0) {
+    printf(" More scores? [0] ");
+    fflush(stdout);
+    if (fgets(rline,20,stdin)==NULL) exit(0);
+    ntmp = 0;
+    if (rline[0]!='\n' && rline[0]!=0) sscanf(rline,"%d",&ntmp);
+    if (ntmp<=0) ntmp = 0;
+    if (ntmp>0) {
+      istart = istop;
+      nshow += ntmp;
+      goto l1;
+    }
+  }
+  else if (quiet == 1)
+    if (ib < nbest && (pst.zsflag>=0 && bbp->escore < m_msg->e_cut)) {
+      if (m_msg->mshow_flg && istop >= m_msg->mshow) goto done;
+      istart=istop;
+      nshow += 10;
+      goto l1;
+    }
+
+ done:
+  m_msg->nshow = nshow;
+  if (m_msg->markx & MX_HTML) fprintf(fp,"</pre></tt><p><hr><p>\n");
+  if (fp!=stdout) fprintf(fp,"\n");
+}
+
+/*
+  q[] has one set of sfnums, 0 terminated
+  s[] has second
+  return first match or 0
+*/