1 /************************************************************
2 * Copyright (C) 1998 Ian Holmes
3 * HMMER - Biological sequence analysis with profile HMMs
4 * Copyright (C) 1992-1999 Washington University School of Medicine
7 * This source code is distributed under the terms of the
8 * GNU General Public License. See the files COPYING and LICENSE
10 ************************************************************/
13 * Author: Ian Holmes (ihh@sanger.ac.uk, Jun 5 1998)
14 * Derived from core_algorithms.c (SRE, Nov 11 1996)
15 * Incorporated SRE, Sat Nov 6 10:09:41 1999
17 * Functions for displaying HMMer2.0 structures.
19 * RCS $Id: display.c,v 1.1.1.1 2005/03/22 08:33:59 cmzmasek Exp $
27 void PrintIscore(int sc);
29 void PrintTransition(char src,
36 struct p7trace_s **alignment,
43 /* Function: DisplayPlan7Posteriors()
45 * Purpose: Print out posterior transition probabilities
46 * in modelpost format.
47 * NB only prints out transitions that touch
48 * either the Viterbi or the optimal accuracy path.
50 * Args: L - the length of the sequence
52 * forward - forward matrix
53 * backward - backward matrix
54 * viterbi - Viterbi trace
55 * optacc - optimal accuracy trace
60 void DisplayPlan7Posteriors(int L, struct plan7_s *hmm,
61 struct dpmatrix_s *forward,
62 struct dpmatrix_s *backward,
63 struct p7trace_s *viterbi,
64 struct p7trace_s *optacc)
66 struct p7trace_s* alignment[2];
67 alignment[0] = viterbi;
68 alignment[1] = optacc;
69 DisplayPlan7PostAlign (L, hmm, forward, backward, alignment, 2);
73 /* Function: DisplayPlan7PostAlign()
75 * Purpose: Print out posterior transition probabilities
76 * in modelpost format, for any set of alignments.
78 * Args: L - the length of the sequence
80 * forward - forward matrix
81 * backward - backward matrix
82 * alignment - array of traces
83 * A - size of alignment array
88 void DisplayPlan7PostAlign(int L, struct plan7_s *hmm,
89 struct dpmatrix_s *forward,
90 struct dpmatrix_s *backward,
91 struct p7trace_s **alignment,
105 sc = forward->xmx[L][XMC] + hmm->xsc[XTC][MOVE]; /* total Forward score */
107 min = (int*) calloc (A, sizeof(int));
108 max = (int*) calloc (A, sizeof(int));
109 on = (int*) calloc (A, sizeof(int));
111 for (i = 0; i <= L; i++)
113 for (j = 0; j < A; j++) {
114 while (alignment[j]->pos[min[j]] < i - 1 && min[j] < alignment[j]->tlen - 1)
117 while (alignment[j]->pos[max[j]] <= i + 1 && max[j] < alignment[j]->tlen - 1)
121 for (state = STM; state <= STJ; state++)
123 if (state == STM || state == STB)
128 else if (state == STD)
133 else if (state == STI)
141 for (k = kmin; k <= kmax; k++)
147 PrintTransition (STM,i,k, STM,i+1,k+1,
148 forward->mmx[i][k] + hmm->tsc[k][TMM] + backward->mmx[i+1][k+1] - sc,
149 alignment, min, max, on, A);
152 PrintTransition (STM,i,k, STI,i+1,k,
153 forward->mmx[i][k] + hmm->tsc[k][TMI] + backward->imx[i+1][k] - sc,
154 alignment, min, max, on, A);
157 PrintTransition (STM,i,k, STD,i,k+1,
158 forward->mmx[i][k] + hmm->tsc[k][TMD] + backward->dmx[i][k+1] - sc,
159 alignment, min, max, on, A);
161 PrintTransition (STM,i,k, STE,i,0,
162 forward->mmx[i][k] + hmm->esc[k] + backward->xmx[i][XME] - sc,
163 alignment, min, max, on, A);
168 PrintTransition (STD,i,k, STM,i+1,k+1,
169 forward->dmx[i][k] + hmm->tsc[k][TDM] + backward->mmx[i+1][k+1] - sc,
170 alignment, min, max, on, A);
172 PrintTransition (STD,i,k, STD,i,k+1,
173 forward->dmx[i][k] + hmm->tsc[k][TDD] + backward->dmx[i][k+1] - sc,
174 alignment, min, max, on, A);
180 PrintTransition (STI,i,k, STM,i+1,k+1,
181 forward->imx[i][k] + hmm->tsc[k][TIM] + backward->mmx[i+1][k+1] - sc,
182 alignment, min, max, on, A);
185 PrintTransition (STI,i,k, STI,i+1,k,
186 forward->imx[i][k] + hmm->tsc[k][TII] + backward->imx[i+1][k] - sc,
187 alignment, min, max, on, A);
193 PrintTransition (STB,i,0, STM,i+1,k,
194 forward->xmx[i][XMB] + hmm->bsc[k] + backward->mmx[i+1][k] - sc,
195 alignment, min, max, on, A);
207 PrintTransition (STN,i,0, STB,i,0,
208 forward->xmx[i][XMN] + hmm->xsc[XTN][MOVE] + backward->xmx[i][XMB] - sc,
209 alignment, min, max, on, A);
212 PrintTransition (STN,i,0, STN,i+1,0,
213 forward->xmx[i][XMN] + hmm->xsc[XTN][LOOP] + backward->xmx[i+1][XMN] - sc,
214 alignment, min, max, on, A);
218 PrintTransition (STJ,i,0, STB,i,0,
219 forward->xmx[i][XMJ] + hmm->xsc[XTJ][MOVE] + backward->xmx[i][XMB] - sc,
220 alignment, min, max, on, A);
223 PrintTransition (STJ,i,0, STJ,i+1,0,
224 forward->xmx[i][XMJ] + hmm->xsc[XTJ][LOOP] + backward->xmx[i+1][XMJ] - sc,
225 alignment, min, max, on, A);
229 PrintTransition (STC,i,0, STT,i,0,
230 forward->xmx[i][XMC] + hmm->xsc[XTC][MOVE] - sc, /* should be 1 */
231 alignment, min, max, on, A);
234 PrintTransition (STC,i,0, STC,i+1,0,
235 forward->xmx[i][XMC] + hmm->xsc[XTC][LOOP] + backward->xmx[i+1][XMC] - sc,
236 alignment, min, max, on, A);
240 PrintTransition (STE,i,0, STC,i,0,
241 forward->xmx[i][XME] + hmm->xsc[XTE][MOVE] + backward->xmx[i][XMC] - sc,
242 alignment, min, max, on, A);
244 PrintTransition (STE,i,0, STJ,i,0,
245 forward->xmx[i][XME] + hmm->xsc[XTE][LOOP] + backward->xmx[i][XMJ] - sc,
246 alignment, min, max, on, A);
251 PrintTransition (STS,i,0, STN,i,0,
252 backward->xmx[i][XMN] - sc, /* should be 1 */
253 alignment, min, max, on, A);
264 Die ("unknown state");
278 /* Function: DisplayPlan7Matrix()
280 * Purpose: Print out a dynamic programming matrix.
282 * Args: dsq - sequence in digitized form
289 * The output of this function inverts HMMer's concept of rows and columns
290 * (i.e. each row represents a state, and each column, a residue);
291 * also, probabilities are displayed as natural logs, not bit scores.
292 * It should probably only be used by ihh...
296 DisplayPlan7Matrix(char *dsq, int L, struct plan7_s *hmm, struct dpmatrix_s *mx)
302 for (i=1;i<=L;i++) printf(" %c ",Alphabet[dsq[i]]);
304 for (i=0;i<=L;i++) PrintIscore(mx->xmx[i][XMN]);
305 for (k=1;k<=hmm->M;k++) {
306 printf("\nM%-3d ",k);
307 for (i=0;i<=L;i++) PrintIscore(mx->mmx[i][k]);
309 for (k=1;k<hmm->M;k++) {
310 printf("\nI%-3d ",k);
311 for (i=0;i<=L;i++) PrintIscore(mx->imx[i][k]);
314 for (i=0;i<=L;i++) PrintIscore(mx->xmx[i][XME]);
316 for (i=0;i<=L;i++) PrintIscore(mx->xmx[i][XMC]);
318 for (i=0;i<=L;i++) PrintIscore(mx->xmx[i][XMJ]);
320 for (i=0;i<=L;i++) PrintIscore(mx->xmx[i][XMB]);
321 for (k=2;k<hmm->M;k++) {
322 printf("\nD%-3d ",k);
323 for (i=0;i<=L;i++) PrintIscore(mx->dmx[i][k]);
329 void PrintIscore(int sc) {
333 div = INTSCALE / 0.693147180559945; /* == INTSCALE / log(2) */
335 printf("%- #11.3e",dsc);
339 void PrintTransition(char src,
346 struct p7trace_s **alignment,
352 char src_str[6]; /* buffer for source state label */
353 char dest_str[6]; /* buffer for destination state label */
363 for (j = 0; j < A; j++) {
365 for (pos = 0, tpos = min[j]; tpos <= max[j]; tpos++) {
367 if (alignment[j]->pos[tpos] != 0)
368 pos = alignment[j]->pos[tpos];
370 if (src == alignment[j]->statetype[tpos]
371 && ksrc == alignment[j]->nodeidx[tpos]
375 if (dest == alignment[j]->statetype[tpos]
376 && kdest == alignment[j]->nodeidx[tpos]
380 if (tpos < alignment[j]->tlen - 1)
384 /* fold up B->D->M transitions into pseudo- B->M transitions */
386 if (alignment[j]->statetype[tpos] == STB)
387 while (alignment[j]->statetype[tnext] == STD && tnext < alignment[j]->tlen - 1)
390 next = alignment[j]->pos[tnext];
394 if (src == alignment[j]->statetype[tpos]
395 && ksrc == alignment[j]->nodeidx[tpos]
397 && dest == alignment[j]->statetype[tnext]
398 && kdest == alignment[j]->nodeidx[tnext]
409 case STM: sprintf (src_str, "M%d", ksrc); break;
410 case STD: sprintf (src_str, "D%d", ksrc); break;
411 case STI: sprintf (src_str, "I%d", ksrc); break;
412 case STS: sprintf (src_str, "S"); break;
413 case STN: sprintf (src_str, "N"); break;
414 case STB: sprintf (src_str, "B"); break;
415 case STE: sprintf (src_str, "E"); break;
416 case STC: sprintf (src_str, "C"); break;
417 case STJ: sprintf (src_str, "J"); break;
418 case STT: sprintf (src_str, "T"); break;
419 default: Die ("bad transition");
424 case STM: sprintf (dest_str, "M%d", kdest); break;
425 case STD: sprintf (dest_str, "D%d", kdest); break;
426 case STI: sprintf (dest_str, "I%d", kdest); break;
427 case STS: sprintf (dest_str, "S"); break;
428 case STN: sprintf (dest_str, "N"); break;
429 case STB: sprintf (dest_str, "B"); break;
430 case STE: sprintf (dest_str, "E"); break;
431 case STC: sprintf (dest_str, "C"); break;
432 case STJ: sprintf (dest_str, "J"); break;
433 case STT: sprintf (dest_str, "T"); break;
434 default: Die ("bad transition");
437 printf ("%d\t%s\t%d\t%s\t%-14.7g\t", isrc, src_str, idest, dest_str, (double) Score2Prob(sc,1.));
439 for (j = 0; j < A; j++) {
440 if (on[j]) printf ("*");
441 if (j < A - 1) printf ("\t");