#include #include struct class_struct { char name[1]; char members[100]; int score; int cardinality; }; main (argc, argv) int argc; char *argv []; { int i, j, k, m, getenv_p; struct class_struct class[100]; char alphabet[100], path[80]; char input_filename[60], weight_mat_name[60], class_mat_name[60]; FILE * finp, *foutp_weight, *foutp_class; double p[127], P, log20 = log(20.0); int numg, lastg, len, n_gaps, total_len; char seq[5000], seq_name[480]; /* Find path to auxillarily files */ getenv_p = getenv("PIMA_HOME"); if (getenv_p != NULL) { strcpy(path, getenv_p); strcat(path, "/"); } argv++; strcpy(input_filename, path); if (!(*argv)) { fprintf(stderr, "usage: calc-IC aaclass-definition-filename < pattern-file\n"); exit (1); } strcat(input_filename, *argv); if (!(finp = fopen (input_filename, "r"))) { if (!(finp = fopen (*argv, "r"))) { fprintf(stderr, "usage: calc-IC aaclass-definition-filename < pattern-file\n"); fprintf (stderr, "Could not read \"%s\" or \"%s\" ", input_filename, *argv); perror ("because"); exit (1); } } fscanf(finp, "%s", alphabet); i = 0; while (fscanf(finp, "%s%s%d%d", class[i].name, class[i].members, &class[i].score, &class[i].cardinality) != EOF) { p[class[i].name[0]] = (class[i].cardinality) / 20.0; i++; } i--; while (fscanf(stdin, "%s%s", seq_name, seq) != EOF) { P = 0.0; numg = lastg = n_gaps = 0; total_len = len = strlen(seq); for (i = 0; i < total_len; i++) { if (seq[i] == 'g') { numg++; lastg = 1; } else if (seq[i] == '-') { len--; } else { P = P + (-log(p[seq[i]]) / log20); if (lastg == 1) { P = P - (log( (double) (numg + 1) ) / log20); n_gaps += numg - 1; lastg = 0; numg = 0; } } } /* printf("%g\t%g\n", P, -log(P)/log(20.0)); */ printf("%s\t%g\t%g\t%d\t%d\n", seq_name, P, P / (len - n_gaps), len - n_gaps, len); } }