double get_lambda(int **pam2p, int n0, int nsq, char *aa0) { double lambda, H; double *pr, tot, sum; int i, ioff, j, min, max; /* get min and max scores */ min = BIGNUM; max = -BIGNUM; if(pam2p[0][1] == -BIGNUM) { ioff = 1; n0++; } else { ioff = 0; } for (i = ioff ; i < n0 ; i++) { for (j = 1; j <= nsq ; j++) { if (min > pam2p[i][j]) min = pam2p[i][j]; if (max < pam2p[i][j]) max = pam2p[i][j]; } } /* fprintf(stderr, "min: %d\tmax:%d\n", min, max); */ if ((pr = (double *) calloc(max - min + 1, sizeof(double))) == NULL) { fprintf(stderr, "Couldn't allocate memory for score probabilities: %d\n", max - min + 1); exit(1); } tot = (double) rrtotal * (double) rrtotal * (double) n0; for (i = ioff ; i < n0 ; i++) { for (j = 1; j <= nsq ; j++) { pr[pam2p[i][j] - min] += (double) ((double) rrcounts[aascii[aa0[i]]] * (double) rrcounts[j]) / tot; } } sum = 0.0; for(i = 0 ; i <= max-min ; i++) { sum += pr[i]; /* fprintf(stderr, "%3d: %g %g\n", i+min, pr[i], sum); */ } /* fprintf(stderr, "sum: %g\n", sum); */ for(i = 0 ; i <= max-min ; i++) { pr[i] /= sum; } if (!karlin(min, max, pr, &lambda, &H)) { fprintf(stderr, "Karlin lambda estimation failed\n"); } /* fprintf(stderr, "lambda: %g\n", lambda); */ free(pr); return lambda; }
MATRIX_T *convert_score_to_target( MATRIX_T *score, /* score matrix */ ARRAY_T *prob /* letter frequencies */ ) { int i, j; KARLIN_INPUT_T *karlin_input; double lambda, K, H; MATRIX_T *target; /* target freq. matrix */ int alen = get_num_rows(score); /* alphabet length */ /* make input for karlin() */ karlin_input = make_karlin_input(score, prob); /* get lambda */ karlin(karlin_input->low, karlin_input->high, karlin_input->prob->items, &lambda, &K, &H); /*printf("lambda %f K %f H %f\n", lambda, K, H);*/ /* calculate target frequencies */ target = allocate_matrix(alen, alen); for (i=0; i<alen; i++) { for (j=0; j<alen; j++) { double pi = get_array_item(i, prob); double pj = get_array_item(j, prob); double sij = get_matrix_cell(i, j, score); double f = pi * pj * exp(lambda * sij); set_matrix_cell(i, j, f, target); } } // Free local dynamic memory. free_array(karlin_input->prob); myfree(karlin_input); return(target); } /* convert_score_to_target */