/* 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 #include #include #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,"

\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,"");}
      }
      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,"

\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 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,""); } 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," align",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,"


\n"); if (fp!=stdout) fprintf(fp,"\n"); } /* q[] has one set of sfnums, 0 terminated s[] has second return first match or 0 */