1 /*****************************************************************
2 * HMMER - Biological sequence analysis with profile HMMs
3 * Copyright (C) 1992-1999 Washington University School of Medicine
6 * This source code is distributed under the terms of the
7 * GNU General Public License. See the files COPYING and LICENSE
9 *****************************************************************/
12 * Thu Nov 21 09:58:05 1996
14 * Printing out or naming various useful things from HMMER
17 * CVS $Id: debug.c,v 1.1.1.1 2005/03/22 08:33:58 cmzmasek Exp $
30 /* Function: Statetype()
32 * Purpose: Returns the state type in text.
33 * Example: Statetype(S) = "S"
49 default: return "BOGUS";
53 /* Function: AlphabetType2String()
54 * Date: SRE, Sun Dec 24 11:33:40 2000 [St. Louis]
56 * Purpose: Returns a string "protein" for hmmAMINO,
57 * "nucleic acid" for hmmNUCLEIC, etc... used
58 * for formatting diagnostics.
60 * Args: type - Alphabet type, e.g. hmmAMINO
65 AlphabetType2String(int type)
68 case hmmAMINO: return "protein";
69 case hmmNUCLEIC: return "nucleic acid";
70 case hmmNOTSETYET: return "unknown";
71 default: return "BOGUS";
76 /* Function: P7PrintTrace()
78 * Purpose: Print out a traceback structure.
79 * If hmm is non-NULL, also print transition and emission scores.
81 * Args: fp - stderr or stdout, often
82 * tr - trace structure to print
83 * hmm - NULL or hmm containing scores to print
84 * dsq - NULL or digitized sequence trace refers to.
87 P7PrintTrace(FILE *fp, struct p7trace_s *tr, struct plan7_s *hmm, char *dsq)
89 int tpos; /* counter for trace position */
94 fprintf(fp, "st node rpos - traceback len %d\n", tr->tlen);
95 fprintf(fp, "-- ---- ------\n");
96 for (tpos = 0; tpos < tr->tlen; tpos++) {
97 fprintf(fp, "%1s %4d %6d\n",
98 Statetype(tr->statetype[tpos]),
103 if (!(hmm->flags & PLAN7_HASBITS))
104 Die("oi, you can't print scores from that hmm, it's not ready.");
107 fprintf(fp, "st node rpos transit emission - traceback len %d\n", tr->tlen);
108 fprintf(fp, "-- ---- ------ ------- --------\n");
109 for (tpos = 0; tpos < tr->tlen; tpos++) {
110 if (dsq != NULL) sym = (int) dsq[tr->pos[tpos]];
112 fprintf(fp, "%1s %4d %6d %7d",
113 Statetype(tr->statetype[tpos]),
116 (tpos < tr->tlen-1) ?
117 TransitionScoreLookup(hmm, tr->statetype[tpos], tr->nodeidx[tpos],
118 tr->statetype[tpos+1], tr->nodeidx[tpos+1]) : 0);
120 if (tpos < tr->tlen-1)
121 sc += TransitionScoreLookup(hmm, tr->statetype[tpos], tr->nodeidx[tpos],
122 tr->statetype[tpos+1], tr->nodeidx[tpos+1]);
125 if (tr->statetype[tpos] == STM)
127 fprintf(fp, " %8d %c", hmm->msc[sym][tr->nodeidx[tpos]],
129 sc += hmm->msc[sym][tr->nodeidx[tpos]];
131 else if (tr->statetype[tpos] == STI)
133 fprintf(fp, " %8d %c", hmm->isc[sym][tr->nodeidx[tpos]],
134 (char) tolower((int) Alphabet[sym]));
135 sc += hmm->isc[sym][tr->nodeidx[tpos]];
137 else if ((tr->statetype[tpos] == STN && tr->statetype[tpos-1] == STN) ||
138 (tr->statetype[tpos] == STC && tr->statetype[tpos-1] == STC) ||
139 (tr->statetype[tpos] == STJ && tr->statetype[tpos-1] == STJ))
141 fprintf(fp, " %8d %c", 0, (char) tolower((int) Alphabet[sym]));
144 fprintf(fp, " %8s %c", "-", '-');
150 fprintf(fp, " ------- --------\n");
151 fprintf(fp, " total: %6d\n\n", sc);
155 /* Function: P7PrintPrior()
157 * Purpose: Print out a Plan 7 prior structure.
160 P7PrintPrior(FILE *fp, struct p7prior_s *pri)
162 int q, x; /* counters for mixture component, element */
164 if (pri->strategy == PRI_DCHLET) fputs("Dirichlet\n", fp);
165 else if (pri->strategy == PRI_PAM) fputs("PAM\n", fp);
166 else Die("No such strategy.");
168 if (Alphabet_type == hmmAMINO) fputs("Amino\n", fp);
169 else if (Alphabet_type == hmmNUCLEIC) fputs("Nucleic\n", fp);
173 fprintf(fp, "\n%d\n", pri->tnum);
174 for (q = 0; q < pri->tnum; q++)
176 fprintf(fp, "%.4f\n", pri->tq[q]);
177 for (x = 0; x < 7; x++)
178 fprintf(fp, "%.4f ", pri->t[q][x]);
184 fprintf(fp, "\n%d\n", pri->mnum);
185 for (q = 0; q < pri->mnum; q++)
187 fprintf(fp, "%.4f\n", pri->mq[q]);
188 for (x = 0; x < Alphabet_size; x++)
189 fprintf(fp, "%.4f ", pri->m[q][x]);
195 fprintf(fp, "\n%d\n", pri->inum);
196 for (q = 0; q < pri->inum; q++)
198 fprintf(fp, "%.4f\n", pri->iq[q]);
199 for (x = 0; x < Alphabet_size; x++)
200 fprintf(fp, "%.4f ", pri->i[q][x]);
205 /* Function: TraceVerify()
206 * Date: SRE, Mon Feb 2 07:48:52 1998 [St. Louis]
208 * Purpose: Check a traceback structure for internal consistency.
209 * Used in Shiva testsuite, for example.
211 * Args: tr - traceback to verify
213 * N - length of sequence
215 * Returns: 1 if OK. 0 if not.
218 TraceVerify(struct p7trace_s *tr, int M, int N)
220 int tpos; /* position in trace */
221 int k; /* current position in HMM nodes 1..M */
222 int i; /* current position in seq 1..N */
223 int nn, nc, nj; /* number of STN's, STC's, STJ's seen */
224 int nm; /* number of STM's seen */
226 /* Basic checks on ends.
228 if (tr->statetype[0] != STS) return 0;
229 if (tr->statetype[1] != STN) return 0;
230 if (tr->statetype[tr->tlen-2] != STC) return 0;
231 if (tr->statetype[tr->tlen-1] != STT) return 0;
232 if (tr->pos[1] != 0) return 0;
234 /* Check for consistency throughout trace
236 k = i = nn = nc = nj = nm = 0;
237 for (tpos = 0; tpos < tr->tlen; tpos++)
239 switch (tr->statetype[tpos]) {
241 if (tr->nodeidx[tpos] != 0) return 0;
242 if (tr->pos[tpos] != 0) return 0;
243 if (k != 0) return 0;
244 if (i != 0) return 0;
245 if (tpos != 0) return 0;
248 case STN: /* first N doesn't emit. */
249 if (tr->nodeidx[tpos] != 0) return 0;
250 if (k != 0) return 0;
253 if (tr->pos[tpos] != i+1) return 0;
258 if (tr->pos[tpos] != 0) return 0;
259 if (i != 0) return 0;
265 if (tr->nodeidx[tpos] != 0) return 0;
266 if (tr->pos[tpos] != 0) return 0;
270 case STM: /* can enter anywhere on first M */
271 if (tr->pos[tpos] != i+1) return 0;
272 if (tr->nodeidx[tpos] < 1 || tr->nodeidx[tpos] > M) return 0;
274 if (nm == 0) k = tr->nodeidx[tpos];
276 if (tr->nodeidx[tpos] != k+1) return 0;
283 if (tr->pos[tpos] != i+1) return 0;
284 if (tr->nodeidx[tpos] != k) return 0;
285 if (tr->nodeidx[tpos] < 1 || tr->nodeidx[tpos] > M-1) return 0;
286 if (k >= M) return 0;
291 if (tr->pos[tpos] != 0) return 0;
292 if (tr->nodeidx[tpos] != k+1) return 0;
293 if (tr->nodeidx[tpos] < 1 || tr->nodeidx[tpos] > M) return 0;
298 if (tr->nodeidx[tpos] != 0) return 0;
299 if (tr->pos[tpos] != 0) return 0;
304 if (tr->nodeidx[tpos] != 0) return 0;
307 if (tr->pos[tpos] != i+1) return 0;
310 else if (tr->pos[tpos] != 0) return 0;
315 if (tr->nodeidx[tpos] != 0) return 0;
318 if (tr->pos[tpos] != i+1) return 0;
321 else if (tr->pos[tpos] != 0) return 0;
326 if (tpos != tr->tlen - 1) return 0;
327 if (tr->nodeidx[tpos] != 0) return 0;
328 if (tr->pos[tpos] != 0) return 0;
329 if (i != N) return 0;
335 } /* end switch over statetypes */
336 } /* end loop over trace positions */
342 /* Function: TraceCompare()
343 * Date: SRE, Wed Mar 4 17:26:49 1998 [St. Louis]
345 * Purpose: Compare two tracebacks; return 1 if they're
346 * identical, else 0. Written for Shiva testsuite.
348 * Args: t1 - first trace
351 * Returns: 1 if identical; 0 elsewise
354 TraceCompare(struct p7trace_s *t1, struct p7trace_s *t2)
358 if (t1->tlen != t2->tlen) return 0;
360 for (tpos = 0; tpos < t1->tlen; tpos++)
362 if (t1->statetype[tpos] != t2->statetype[tpos]) return 0;
363 if (t1->nodeidx[tpos] != t2->nodeidx[tpos]) return 0;
364 if (t1->pos[tpos] != t2->pos[tpos]) return 0;