Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / fasta34 / mshowalign.c
diff --git a/website/archive/binaries/mac/src/fasta34/mshowalign.c b/website/archive/binaries/mac/src/fasta34/mshowalign.c
new file mode 100644 (file)
index 0000000..a3c2a9d
--- /dev/null
@@ -0,0 +1,596 @@
+
+/* copyright (c) 1996, 1997, 1998, 1999 William R. Pearson and the
+   U. of Virginia */
+
+/* $Name: fa_34_26_5 $ - $Id: mshowalign.c,v 1.43 2007/01/08 15:38:46 wrp Exp $ */
+
+/* mshowalign.c - show sequence alignments in pvcomplib */
+
+/* 
+   this is a merged version of showalign.c that works properly with
+   both the comp_lib (serial, threaded) and PCOMPLIB parallel versions
+   of the programs.
+
+   In the serial and current threaded versions of the programs,
+   showalign gets a list of high scoring sequences and must
+   re_getlib() the sequence, do_walign(), and then calculate the
+   alignment.
+
+   In the PCOMPLIB parallel versions, the worker programs do the
+   aligning, so showalign() must send them the appropriate messages to
+   have the alignment done, and then collect the alignment results
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "defs.h"
+#include "msg.h"
+#include "structs.h"
+#include "param.h"
+
+#ifdef PCOMPLIB
+#ifdef PVM_SRC
+#include "pvm3.h"
+extern int pinums[];
+#endif
+#ifdef MPI_SRC
+#include "mpi.h"
+#endif
+#include "p_mw.h"
+#else
+#include "mm_file.h"
+#include "mw.h"
+#endif
+
+#ifndef PCOMPLIB
+
+/* used to position the library sequence for re_getlib - also gets
+   description */
+#define RANLIB (m_fptr->ranlib)
+
+extern struct lmf_str *
+re_openlib(struct lmf_str *, int outtty);
+
+int
+re_getlib(unsigned char *aa1, int maxn, int maxt,
+         int loff, int cont, int term_code,
+         long *loffset, long *l_off, 
+         struct lmf_str *m_fptr);
+
+#include "drop_func.h"
+
+#endif
+
+
+extern void cal_coord(int n0, int n1, long sq0off, long loffset,
+                     struct a_struct *aln);
+
+void initseq(char **, char **, char **, char **, int);
+void freeseq(char **, char **, char **, char **);
+
+void do_show(FILE *fp, int n0, int n1, int score,
+            char *name0, char *name1, int nml,
+            struct mngmsg m_msg, struct pstruct pst,
+            char *seqc0, char *seqc0a,  char *seqc1, char *seqca, int nc,
+            float percent, float gpercent, int lc,
+            struct a_struct *aln, long loffset);
+
+extern void discons(FILE *fd, struct mngmsg m_msg, struct pstruct pst,
+                   char *seqc0, char *seqc0a, char *seqc1, char *seqca,
+                   int nc, 
+                   int n0, int n1, char *name0, char *name1, int nml,
+                   struct a_struct *aln,
+                   long loffset);
+
+extern void disgraph(FILE *fd, int n0, int n1,
+                    float percent, int score,
+                    int min0, int min1, int max0, int max1, long sq0off,
+                    char *name0, char *name1, int nml, int llen, int markx);
+
+extern double zs_to_bit(double, int, int);
+
+extern void
+do_url1(FILE *, struct mngmsg, struct pstruct, char *, int,
+       struct a_struct , long);
+
+#ifndef A_MARK
+#define A_MARK ">>"
+#endif
+
+static char l_name[200];       /* link name */
+
+#ifdef PCOMPLIB
+#define BBP_INFO(info) bbp->desptr->info
+#else
+#define BBP_INFO(info) bbp->info
+#endif
+
+/* this version does not check for m_msg.e_cut because nshow/nbest has
+   already been set to limit on e_cut */
+
+void showalign (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, char *gstring2
+#ifndef PCOMPLIB
+               , void **f_str
+#endif
+)
+{
+  char tmp_str[20];
+  char info_str[200];
+  char bline[2048], *bl_ptr, *bp, fmt[40];
+  int tmp_len, l_llen;
+  int t_have_ares;
+  char name0[80], name0s[80], name1[200];
+  int istart = 0, istop, i = 0, ib, nml;
+  int  n1tot;
+  struct beststr *bbp;
+  int nc, lc, maxc;
+  float percent, gpercent;
+  char *seqc0, *seqc0a, *seqc1, *seqca;
+  long loffset, l_off;
+#ifdef PCOMPLIB
+  struct stage2_str liblist;
+  struct qmng_str qm_msg;
+#ifdef MPI_SRC
+  int int_msg_b[10];
+  MPI_Status mpi_status;
+#endif
+#else
+  int n1;
+  struct lmf_str *m_fptr;
+  int ngap;
+#endif
+
+#ifdef PCOMPLIB
+  /* this function has its own copy of qm_msg, so we must fill it
+     appropriately */
+  qm_msg.n0 = m_msg.n0;
+  strncpy(qm_msg.libstr,m_msg.qtitle,sizeof(qm_msg.libstr));
+#endif
+
+  /* set the name0,1 label length */
+  if (m_msg.markx & MX_M10FORM) nml = 12;
+  else nml = m_msg.nmlen;
+
+  if (strlen(m_msg.qtitle) > 0) {
+    if (m_msg.qtitle[0]=='>') strncpy(name0s,&m_msg.qtitle[1],sizeof(name0s));
+    else strncpy(name0s,m_msg.qtitle,sizeof(name0s));
+  }
+  else {
+    strncpy(name0s,m_msg.tname,sizeof(name0s));
+  }
+  name0s[sizeof(name0s)-1]='\0';
+
+  if ((bp=strchr(name0s,' '))!=NULL) *bp='\0';
+
+  if (m_msg.revcomp) name0[nml-1]='-';
+
+  l_llen = m_msg.aln.llen;
+  if ((m_msg.markx & MX_M9SUMM) && m_msg.show_code != SHOW_CODE_ID) {
+    l_llen += 40;
+    if (l_llen > 200) l_llen=200;
+  }
+
+  sprintf(fmt,"%s%%-%ds (%%d %s)\n",A_MARK,l_llen-5,m_msg.sqnam);
+
+  if (!(m_msg.markx&MX_M10FORM)) fprintf(fp,"\n");
+
+  if (m_msg.ashow < 0) m_msg.ashow = m_msg.nshow;
+  istart = 0; istop = min(min(nbest,m_msg.ashow),m_msg.nshow);
+
+  for (ib=istart; ib<istop; ib++) {
+    bbp = bptr[ib];
+
+#ifdef SHOWUN
+    if (BBP_INFO(nsfnum) > 0 && sfn_cmp(m_msg.qsfnum,BBP_INFO(sfnum))) {
+      istop = min(istop+1,nbest);
+      continue;
+    }
+#endif
+    if (bbp->score[0] <= 0) break;
+
+    if (m_msg.quiet==1 && pst.zsflag>=0 
+       && bbp->escore < m_msg.e_low) continue;
+
+#ifndef PCOMPLIB
+    /* get the alignment and score by re-aligning */
+
+    if ((m_fptr=re_openlib(bbp->m_file_p,!m_msg.quiet))==NULL)
+      exit(1);
+
+    /* get the description - do not "edit" it yet */
+
+    if (!(m_msg.markx & MX_M10FORM)){
+      if (m_msg.long_info) {tmp_len = sizeof(bline)-1;}
+      else {tmp_len = l_llen-5;}
+      RANLIB(bline,tmp_len,bbp->lseek,bbp->libstr,bbp->m_file_p);
+      bline[tmp_len]='\0';
+    }
+    else {
+      RANLIB(bline,sizeof(bline),bbp->lseek,bbp->libstr,bbp->m_file_p);
+      bline[sizeof(bline)-1]='\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);
+#ifdef DEBUG
+    if (n1 != bbp->n1) {
+      fprintf(stderr," library sequence: %s lengths differ: %d != %d\n",
+             bline,bbp->n1, n1);
+      fprintf(stderr, "offset is: %lld\n",bbp->lseek);
+    }
+#endif
+
+    if (!bbp->have_ares) {
+      bbp->sw_score = 
+       do_walign(aa0[bbp->frame],m_msg.n0, aa1, n1, bbp->frame, &pst,
+                 f_str[bbp->frame], &bbp->a_res, &t_have_ares);
+    }
+    else {
+      pre_cons(aa1,n1,bbp->frame,f_str[bbp->frame]);
+    }
+
+    aln_func_vals(bbp->frame, &m_msg.aln);
+
+#else  /* PCOMPLIB - get the alignment information from a worker */
+
+    /* we have a sequence that we need an alignment for -
+       send a message to the appropriate worker to produce an alignment 
+       qm_msg.slist == 1  -> one alignment
+       qm_msg.s_func == DO_ALIGN_FLG -> use the alignment function
+       send mngmsg (MSEQTYPE)
+       then send number of sequence to be aligned
+    */
+
+    qm_msg.slist = 1;
+    qm_msg.s_func = DO_ALIGN_FLG;
+
+    liblist.seqnm = bbp->seqnm;
+    liblist.frame = bbp->frame;
+#ifdef PVM_SRC
+    pvm_initsend(PvmDataRaw);
+    pvm_pkbyte((char *)&qm_msg,sizeof(struct qmng_str),1);
+    pvm_send(pinums[bbp->wrkr],MSEQTYPE);
+
+    pvm_initsend(PvmDataRaw);
+    pvm_pkbyte((char *)&liblist,sizeof(struct stage2_str),1);
+    pvm_send(pinums[bbp->wrkr],LISTTYPE);
+#endif
+#ifdef MPI_SRC
+    MPI_Send(&qm_msg,sizeof(struct qmng_str),MPI_BYTE,bbp->wrkr,
+            MSEQTYPE,MPI_COMM_WORLD);
+    MPI_Send(&liblist,sizeof(struct stage2_str),MPI_BYTE,bbp->wrkr,
+            LISTTYPE,MPI_COMM_WORLD);
+#endif
+    /* information should be sent */
+    /* pick up description */
+    strncpy(bline,bbp->desptr->bline,l_llen-5);
+    bline[l_llen-5]='\0';
+#endif /* PCOMPLIB */
+
+    if (strlen(bline)==0) {
+      bline[0]='>';
+      strncpy(&bline[1],m_msg.lname,l_llen-5);
+      bline[l_llen-5]='\0';
+    }
+    /* re-format bline */
+    while ((bp=strchr(bline,'\n'))!=NULL) *bp=' ';
+    if (m_msg.long_info) {
+      tmp_len = strlen(bline);
+      bl_ptr = bline;
+      if (!(m_msg.markx & MX_M10FORM)) while (tmp_len > l_llen) {
+       for (i=l_llen; i>10; i--)
+         if (bl_ptr[i]==' ') {
+           bl_ptr[i]='\n';
+           break;
+         }
+       if (i <= 10) break;
+       tmp_len -= i;
+       bl_ptr += i;
+      }
+      bline[sizeof(bline)-1]='\0';
+    }
+
+    n1tot = (BBP_INFO(n1tot_p)) ? *BBP_INFO(n1tot_p) : bbp->n1;
+
+    strncpy(name1,bline,sizeof(name1));
+
+    if ((!m_msg.markx & MX_M10FORM)) name1[nml]='\0';
+    if ((bp = strchr(name1,' '))!=NULL) *bp = '\0';
+
+  /* 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.  Text must match that in showbest.c */
+
+    strncpy(name1,bline,sizeof(name1));
+    name1[sizeof(name1)-1]='\0';
+    if ((bp = strchr(name1,' '))!=NULL) *bp = '\0';
+    strncpy(l_name,name1,sizeof(l_name));
+    l_name[sizeof(l_name)-1]='\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.qframe >= 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));
+    }
+
+    if (!(m_msg.markx & MX_M10FORM)) name1[nml]='\0';
+
+    /* print out score information; */
+
+    if (m_msg.markx & MX_HTML ) {
+      fprintf (fp,"<A name=%s>\n<tt><pre>\n",l_name);
+    }
+    strncpy(name0,name0s,nml);
+    name0[nml]='\0';
+
+    if (pst.zsflag%10 == 6) {
+      sprintf(info_str," comp: %.5f H: %.5f",bbp->comp,bbp->H);
+    }
+    else info_str[0]='\0';
+
+    if ((m_msg.markx & MX_ATYPE)!=7 && !(m_msg.markx & MX_M10FORM)) {
+      fprintf (fp, fmt,bp=bline,n1tot);
+      if (m_msg.nframe > 2) 
+       fprintf (fp, "Frame: %d",bbp->frame+1);
+      else if (m_msg.nframe > 1) 
+       fprintf (fp, "Frame: %c",(bbp->frame? 'r': 'f'));
+      else if (m_msg.qframe >= 0 && bbp->frame > 0 ) {
+         fputs("rev-comp",fp);
+         name0[nml-1]='\0';
+         strcat(name0,"-");
+      }
+
+      if (m_msg.arelv > 0)
+       fprintf (fp, " %s: %3d", m_msg.alab[0],bbp->score[0]);
+      if (m_msg.arelv > 1)
+       fprintf (fp, " %s: %3d", m_msg.alab[1],bbp->score[1]);
+      if (m_msg.arelv > 2)
+       fprintf (fp, " %s: %3d", m_msg.alab[2],bbp->score[2]);
+      fprintf(fp,"%s",info_str);
+      if (pst.zsflag>=0) 
+       fprintf (fp, "  Z-score: %4.1f  bits: %3.1f E(): %4.2g", 
+                bbp->zscore,zs_to_bit(bbp->zscore,m_msg.n0,bbp->n1),bbp->escore);
+      fprintf (fp, "\n");
+    }
+    else if (m_msg.markx & MX_M10FORM) {
+      fprintf(fp,">>%s\n",bline);
+      if (m_msg.qframe > -1) {
+       if (m_msg.nframe > 2) {
+         fprintf(fp,"; %s_frame: %d\n",m_msg.f_id0,bbp->frame+1);
+       }
+       else {
+         fprintf(fp,"; %s_frame: %c\n",m_msg.f_id0,(bbp->frame > 0? 'r':'f'));
+       }
+      }
+      fprintf (fp, "; %s_%s: %3d\n", m_msg.f_id0,m_msg.alab[0],bbp->score[0]);
+      if (m_msg.arelv > 1)
+       fprintf (fp,"; %s_%s: %3d\n", m_msg.f_id0,m_msg.alab[1],bbp->score[1]);
+      if (m_msg.arelv > 2)
+       fprintf (fp,"; %s_%s: %3d\n", m_msg.f_id0,m_msg.alab[2],bbp->score[2]);
+      if (info_str[0]) fprintf(fp,"; %s_info: %s\n",m_msg.f_id0,info_str);
+      if (pst.zsflag>=0) 
+     fprintf (fp,"; %s_z-score: %4.1f\n; %s_bits: %3.1f\n; %s_expect: %6.2g\n",
+             m_msg.f_id0,bbp->zscore,
+             m_msg.f_id0,zs_to_bit(bbp->zscore,m_msg.n0,bbp->n1),
+             m_msg.f_id0,bbp->escore);
+    }
+      
+
+#ifdef PCOMPLIB
+    /*  get the sw_score, alignment  information,  get seqc0, seqc1 */
+
+#ifdef PVM_SRC
+    /* get alignment lengths, percents */
+    pvm_recv(pinums[bbp->wrkr],ALN1TYPE);
+    pvm_upkint(&nc,1,1);
+    pvm_upkint(&lc,1,1);
+    pvm_upkint(&maxc,1,1);
+
+    pvm_upkfloat(&percent,1,1);
+    pvm_upkfloat(&gpercent,1,1);
+
+    pvm_upkint(&bbp->sw_score,1,1);
+    pvm_upkbyte((char *)&m_msg.aln,sizeof(struct a_struct),1);
+
+    initseq(&seqc0, &seqc0a, &seqc1, &seqca, maxc);
+
+    pvm_recv(pinums[bbp->wrkr],ALN2TYPE);
+    pvm_upkbyte(seqc0,maxc,1);
+    if (m_msg.ann_flg) pvm_upkbyte(seqc0a,maxc,1);
+    pvm_upkbyte(seqc1,maxc,1);
+    pvm_upkbyte(seqca,maxc,1);
+#endif
+#ifdef MPI_SRC
+    MPI_Recv(int_msg_b,4,MPI_INT,bbp->wrkr,ALN1TYPE,MPI_COMM_WORLD,
+            &mpi_status);
+    nc = int_msg_b[0];
+    lc = int_msg_b[1];
+    maxc = int_msg_b[2];
+    bbp->sw_score = int_msg_b[3];
+    MPI_Recv(&percent,1,MPI_FLOAT,bbp->wrkr,ALN2TYPE,MPI_COMM_WORLD,
+            &mpi_status);
+    MPI_Recv(&gpercent,1,MPI_FLOAT,bbp->wrkr,ALN2TYPE,MPI_COMM_WORLD,
+            &mpi_status);
+    MPI_Recv(&m_msg.aln,sizeof(struct a_struct),MPI_BYTE,
+            bbp->wrkr,ALN3TYPE,MPI_COMM_WORLD,&mpi_status);
+
+    initseq(&seqc0, &seqc0a, &seqc1, &seqca, maxc);
+    MPI_Recv(seqc0,maxc,MPI_BYTE,bbp->wrkr,ALN2TYPE,MPI_COMM_WORLD,&mpi_status);
+    if (m_msg.ann_flg)
+      MPI_Recv(seqc0a,maxc,MPI_BYTE,bbp->wrkr,ALN2TYPE,MPI_COMM_WORLD,&mpi_status);
+    MPI_Recv(seqc1,maxc,MPI_BYTE,bbp->wrkr,ALN3TYPE,MPI_COMM_WORLD,&mpi_status);
+    MPI_Recv(seqca,maxc,MPI_BYTE,bbp->wrkr,ALN3TYPE,MPI_COMM_WORLD,&mpi_status);
+#endif
+
+    /* l_off is the coordinate of the first residue */
+    l_off = 1;
+    /* loffset is the offset of the aa1 in the full sequence */
+    loffset = bbp->desptr->loffset-l_off;
+
+#else  /* not PCOMPLIB */
+
+    /* estimate space for alignment consensus */
+    if (m_msg.aln.showall==1) {
+      maxc = bbp->a_res.nres + max(bbp->a_res.min0,bbp->a_res.min1)+
+       max((m_msg.n0-bbp->a_res.max0),(n1-bbp->a_res.max1))+4;
+    }
+    else {
+      maxc = bbp->a_res.nres + 4*m_msg.aln.llen+4;
+    }
+
+    /* get space to put the sequence alignment consensus */
+    initseq(&seqc0, &seqc0a, &seqc1, &seqca, maxc);
+
+    /* build consensus from res, nres (done by workers if PCOMPLIB) */
+    if (!m_msg.ann_flg) {
+      nc=calcons(aa0[bbp->frame],m_msg.n0,aa1,n1,
+                &lc,&m_msg.aln, bbp->a_res, pst, seqc0, seqc1, seqca,
+                f_str[bbp->frame]);
+      memset(seqc0a,' ',nc);
+      seqc0a[nc]='\0';
+    }
+    else {
+      nc=calcons_a(aa0[bbp->frame],m_msg.aa0a,m_msg.n0,aa1,n1,
+                  &lc,&m_msg.aln,bbp->a_res,pst, seqc0, seqc0a, 
+                  seqc1, seqca, m_msg.ann_arr,f_str[bbp->frame]);
+    }
+
+    /* PCOMPLIB workers return percent, gpercent, so calculate it here */
+    if (lc > 0) percent = (100.0*(float)m_msg.aln.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)m_msg.aln.nident)/(float)(lc-ngap);
+#else
+    if (lc > 0) gpercent =(100.0*(float)m_msg.aln.nsim)/(float)lc;
+#endif
+    else gpercent = -1.00;
+#endif
+
+    if (max(strlen(seqc0),strlen(seqc1)) > nc) {
+      fprintf(stderr," mshowalign: nc/maxc: %d/%d seqc0/1: %u/%u\n",
+             nc,maxc,strlen(seqc0),strlen(seqc1));
+    }
+
+    /* here PCOMPLIB/comp_lib logic is the same */
+
+#ifdef DEBUG
+    if (bbp->sw_score < bbp->score[pst.score_ix]) {
+      fprintf(stderr," *** warning - SW score=%d < opt score=%d ***\n",
+             bbp->sw_score, bbp->score[pst.score_ix]);
+    }
+#endif
+
+    cal_coord(m_msg.n0,bbp->n1,m_msg.sq0off,loffset+l_off-1,&m_msg.aln);
+
+#ifndef PCOMPLIB
+    if (bbp->a_res.nres > 0)
+#endif
+      do_show(fp, m_msg.n0, bbp->n1, bbp->sw_score, name0, name1, nml,
+             m_msg, pst, seqc0, seqc0a, seqc1, seqca,
+             nc, percent, gpercent, lc, &m_msg.aln,
+             loffset+l_off-1);
+
+    if (m_msg.markx & MX_HTML) fprintf(fp,"</pre></tt>\n<hr>\n");
+    fflush(fp);
+
+    freeseq(&seqc0,&seqc0a,&seqc1, &seqca);
+  }
+  if (fp!=stdout) fprintf(fp,"\n");
+}
+
+void do_show(FILE *fp, int n0,int n1, int score,
+            char *name0, char *name1, int nml,
+            struct mngmsg m_msg, struct pstruct pst,
+            char *seqc0, char *seqc0a,  char *seqc1, char *seqca, int nc,
+            float percent, float gpercent, int lc,
+            struct a_struct *aln, long loffset)
+{
+  int tmp;
+
+  if (m_msg.markx & MX_AMAP && (m_msg.markx & MX_ATYPE)==7)
+    disgraph(fp, n0, n1, percent, score,
+            aln->amin0, aln->amin1, aln->amax0, aln->amax1, m_msg.sq0off,
+            name0, name1, nml, aln->llen, m_msg.markx);
+  else if (m_msg.markx & MX_M10FORM) {
+    if (pst.sw_flag && m_msg.arelv>0)
+      fprintf(fp,"; %s_score: %d\n",m_msg.f_id1,score);
+    fprintf(fp,"; %s_ident: %5.3f\n",m_msg.f_id1,percent/100.0);
+#ifndef SHOWSIM
+    fprintf(fp,"; %s_gident: %5.3f\n",m_msg.f_id1,gpercent/100.0);
+#else
+    fprintf(fp,"; %s_sim: %5.3f\n",m_msg.f_id1,gpercent/100.0);
+#endif
+
+    fprintf(fp,"; %s_overlap: %d\n",m_msg.f_id1,lc);
+    discons(fp, m_msg, pst, seqc0, seqc0a, seqc1, seqca, nc,
+           n0, n1, name0, name1, nml, aln, loffset);
+  }
+  else {
+    if (pst.sw_flag) fprintf(fp,"Smith-Waterman score: %d; ",score);
+    else fprintf(fp,"banded Smith-Waterman score: %d; ",score);
+#ifndef SHOWSIM
+    fprintf(fp," %6.3f%% identity (%6.3f%% ungapped) in %d %s overlap (%ld-%ld:%ld-%ld)\n",
+           percent,gpercent,lc,m_msg.sqnam,aln->d_start0,aln->d_stop0,
+           aln->d_start1,aln->d_stop1);
+#else
+    fprintf(fp," %6.3f%% identity (%6.3f%% similar) in %d %s overlap (%ld-%ld:%ld-%ld)\n",
+           percent,gpercent,lc,m_msg.sqnam,aln->d_start0,aln->d_stop0,
+           aln->d_start1,aln->d_stop1);
+#endif
+
+    if (m_msg.markx & MX_HTML) {
+      do_url1(fp, m_msg, pst, l_name,n1,*aln,loffset);
+    }
+
+    if (m_msg.markx & MX_AMAP && (m_msg.markx & MX_ATYPE)!=7) {
+      fputc('\n',fp);
+      tmp = n0;
+
+      if (m_msg.qdnaseq == SEQT_DNA && m_msg.ldnaseq== SEQT_PROT)
+       tmp /= 3;
+
+      disgraph(fp, tmp, n1, percent, score,
+              aln->amin0, aln->amin1,
+              aln->amax0, aln->amax1,
+              m_msg.sq0off,
+              name0, name1, nml, aln->llen,m_msg.markx);
+    }
+
+    discons(fp, m_msg, pst, seqc0, seqc0a, seqc1, seqca, nc,
+           n0, n1, name0, name1, nml, aln, loffset);
+
+    fputc('\n',fp);
+
+  }
+}
+
+
+#ifndef MPI_SRC
+void   /* initialize consensus arrays */
+initseq(char **seqc0, char **seqc0a, char **seqc1, char **seqca, int seqsiz)
+{
+  *seqc0=(char *)calloc((size_t)seqsiz*4,sizeof(char));
+  if (*seqc0==NULL)
+    {fprintf(stderr,"cannot allocate consensus arrays %d\n",seqsiz);
+     exit(1);}
+  *seqc0a=*seqc0 + seqsiz;
+  *seqc1=*seqc0a + seqsiz;
+  *seqca=*seqc1 + seqsiz;
+}
+
+void freeseq(char **seqc0, char **seqc0a, char **seqc1, char **seqca)
+{
+  free(*seqc0);
+}
+#endif