/* Function: p7_bg_FilterScore() * Synopsis: Calculates the filter null model score. * Incept: SRE, Thu Aug 28 08:52:53 2008 [Janelia] * * Purpose: Calculates the filter null model <bg> score for sequence * <dsq> of length <L>, and return it in * <*ret_sc>. * * The score is calculated as an HMM Forward score using * the two-state filter null model. It is a log-odds ratio, * relative to the iid background frequencies, in nats: * same as main model Forward scores. * * The filter null model has no length distribution of its * own; the same geometric length distribution (controlled * by <bg->p1>) that the null1 model uses is imposed. */ int p7_bg_FilterScore(P7_BG *bg, ESL_DSQ *dsq, int L, float *ret_sc) { ESL_HMX *hmx = esl_hmx_Create(L, bg->fhmm->M); /* optimization target: this can be a 2-row matrix, and it can be stored in <bg>. */ float nullsc; /* (or it could be passed in as an arg, but for sure it shouldn't be alloc'ed here */ esl_hmm_Forward(dsq, L, bg->fhmm, hmx, &nullsc); /* impose the length distribution */ *ret_sc = nullsc + (float) L * logf(bg->p1) + logf(1.-bg->p1); esl_hmx_Destroy(hmx); return eslOK; }
int main(int argc, char **argv) { ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage); ESL_ALPHABET *abc = esl_alphabet_Create(eslAMINO); ESL_SQ *sq = esl_sq_CreateDigital(abc); ESL_SQFILE *sqfp = NULL; ESL_HMM *hmm = create_test_hmm(abc); ESL_HMM *bg = create_null_hmm(abc); ESL_HMX *hmx = esl_hmx_Create(400, hmm->M); int format = eslSQFILE_UNKNOWN; char *seqfile = esl_opt_GetArg(go, 1); float fwdsc, nullsc; int status; status = esl_sqfile_OpenDigital(abc, seqfile, format, NULL, &sqfp); if (status == eslENOTFOUND) esl_fatal("No such file."); else if (status == eslEFORMAT) esl_fatal("Format unrecognized."); else if (status != eslOK) esl_fatal("Open failed, code %d.", status); while ((status = esl_sqio_Read(sqfp, sq)) == eslOK) { esl_hmx_GrowTo(hmx, sq->n, hmm->M); esl_hmm_Forward(sq->dsq, sq->n, hmm, hmx, &fwdsc); esl_hmm_Forward(sq->dsq, sq->n, bg, hmx, &nullsc); printf("%-16s %5d %11.4f %8.4f %11.4f %8.4f %11.4f %8.4f\n", sq->name, (int) sq->n, fwdsc * eslCONST_LOG2R, (fwdsc * eslCONST_LOG2R) / sq->n, nullsc * eslCONST_LOG2R, (nullsc * eslCONST_LOG2R) / sq->n, (fwdsc - nullsc) * eslCONST_LOG2R, (fwdsc-nullsc) * eslCONST_LOG2R / sq->n); esl_sq_Reuse(sq); } if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s)\n%s\n", sqfp->filename, sqfp->get_error(sqfp)); else if (status != eslEOF) esl_fatal("Unexpected error %d reading sequence file %s", status, sqfp->filename); esl_sqfile_Close(sqfp); esl_sq_Destroy(sq); esl_hmm_Destroy(hmm); esl_hmm_Destroy(bg); esl_hmx_Destroy(hmx); esl_alphabet_Destroy(abc); esl_getopts_Destroy(go); return 0; }
int main(int argc, char **argv) { ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage); ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s")); ESL_ALPHABET *abc = NULL; ESL_HMM *hmm = NULL; ESL_DSQ *dsq = NULL; int *path = NULL; ESL_HMX *fwd = NULL; ESL_HMX *bck = NULL; ESL_HMX *pp = NULL; int be_verbose = esl_opt_GetBoolean(go, "-v"); float fsc, bsc; int L; int i; float fsum, bsum; make_occasionally_dishonest_casino(&hmm, &abc); esl_hmm_Emit(r, hmm, &dsq, &path, &L); fwd = esl_hmx_Create(L, hmm->M); bck = esl_hmx_Create(L, hmm->M); pp = esl_hmx_Create(L, hmm->M); esl_hmm_Forward (dsq, L, hmm, fwd, &fsc); esl_hmm_Backward(dsq, L, hmm, bck, &bsc); esl_hmm_PosteriorDecoding(dsq, L, hmm, fwd, bck, pp); fsum = 0.0; bsum = bsc; fsum += fwd->sc[0]; if (be_verbose) printf("%4d %c %s %8.3f %8.3f\n", 0, '-', "--", fwd->sc[0], bck->sc[0]); bsum -= bck->sc[0]; for (i = 1; i <= L; i++) { fsum += fwd->sc[i]; if (be_verbose) printf("%4d %c %s %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n", i, abc->sym[dsq[i]], path[i] == 0 ? "F " : " L", fwd->sc[i], bck->sc[i], fsum, bsum, fsum+bsum, pp->dp[i][0], pp->dp[i][1]); bsum -= fwd->sc[i]; } if (be_verbose) { printf("%4d %c %s %8.3f %8.3f\n", 0, '-', "--", fwd->sc[L+1], bck->sc[L+1]); printf("Forward score = %f\n", fsc); printf("Backward score = %f\n", bsc); } free(path); free(dsq); esl_hmx_Destroy(pp); esl_hmx_Destroy(bck); esl_hmx_Destroy(fwd); esl_alphabet_Destroy(abc); esl_hmm_Destroy(hmm); esl_randomness_Destroy(r); esl_getopts_Destroy(go); return 0; }