/* Function: PrintXMGRHistogram() * Date: SRE, Wed Nov 12 11:02:00 1997 [St. Louis] * * Purpose: Print an XMGR data file that contains two data sets: * - xy data for the observed histogram * - xy data for the theoretical histogram */ void PrintXMGRHistogram(FILE *fp, struct histogram_s *h) { int sc; /* integer score in histogram structure */ double val; /* First data set is the observed histogram */ for (sc = h->lowscore; sc <= h->highscore; sc++) if (h->histogram[sc - h->min] > 0) fprintf(fp, "%-6d %f\n", sc, (float) h->histogram[sc - h->min]/ (float) h->total); fprintf(fp, "&\n"); /* Second data set is the theoretical histogram */ if (h->fit_type != HISTFIT_NONE) { for (sc = h->lowscore; sc <= h->highscore; sc++) { val = (1. - ExtremeValueP((float)sc+1, h->param[EVD_MU], h->param[EVD_LAMBDA]))- (1. - ExtremeValueP((float)sc, h->param[EVD_MU], h->param[EVD_LAMBDA])); fprintf(fp, "%-6d %f\n", sc, val); } fprintf(fp, "&\n"); } }
/* Function: PrintXMGRRegressionLine() * Date: SRE, Wed Nov 12 11:02:19 1997 [St. Louis] * * Purpose: Print an XMGR data file that contains two data sets: * - xy data for log log transform of observed distribution P(S<x) * - xy data for log log transform of theoretical distribution P(S<x) */ void PrintXMGRRegressionLine(FILE *fp, struct histogram_s *h) { int sc; /* integer score in histogram structure */ int cum; double val; /* log log transform */ /* First data set is the observed distribution; * histogram bin x contains # of scores between x and x+1, * hence the sc+1 offset. */ for (cum = 0, sc = h->lowscore; sc <= h->highscore; sc++) { cum += h->histogram[sc - h->min]; val = log (-1. * log((double) cum / (double) h->total)); if (cum < h->total) fprintf(fp, "%-6d %f\n", sc + 1, val); } fprintf(fp, "&\n"); /* Second data set is the theoretical histogram */ if (h->fit_type != HISTFIT_NONE) { for (sc = h->lowscore; sc <= h->highscore; sc++) { val = log(-1. * log(1. - ExtremeValueP((float) sc, h->param[EVD_MU], h->param[EVD_LAMBDA]))); fprintf(fp, "%-6d %f\n", sc, val); } fprintf(fp, "&\n"); } }
double ExtremeValueP2(float x, float mu, float lambda, int N) { double y; y = N * ExtremeValueP(x,mu,lambda); if (y < 1e-7) return y; else return (1.0 - exp(-1. * y)); }
/* Function: ExtremeValueE() * * Purpose: Calculate E(S>x) in a database of size N, * using P(S>x) for a single sequence: simply np. * * Args: x = score * mu = characteristic value of extreme value distribution * lambda = decay constant of extreme value distribution * N = number of trials (number of sequences) * * Return: E(S>x) for database of size N */ double ExtremeValueE(float x, float mu, float lambda, long N) { return (double)N * ExtremeValueP(x,mu,lambda); }