PUBLIC float alifold(const char **strings, char *structure){ int length, energy, s, n_seq; circ = 0; length = (int) strlen(strings[0]); if (length>init_length) init_alifold(length); if ((P==NULL)||(fabs(P->temperature - temperature)>1e-6)) { update_fold_params(); P = scale_parameters(); } for (s=0; strings[s]!=NULL; s++); n_seq = s; alloc_sequence_arrays(strings, &S, &S5, &S3, &a2s, &Ss, circ); make_pscores((const short **) S, strings, n_seq, structure); energy = fill_arrays((const char **)strings); backtrack((const char **)strings, 0); parenthesis_structure(structure, length); free_sequence_arrays(n_seq, &S, &S5, &S3, &a2s, &Ss); if (backtrack_type=='C') return (float) c[indx[length]+1]/(n_seq*100.); else if (backtrack_type=='M') return (float) fML[indx[length]+1]/(n_seq*100.); else return (float) f5[length]/(n_seq*100.); }
PUBLIC paramT *copy_parameters(void) { paramT *copy; if (p.id != id) scale_parameters(); copy = (paramT *) space(sizeof(paramT)); memcpy(copy, &p, sizeof(paramT)); return copy; }
PUBLIC void update_alifold_params(void){ if(P) free(P); P = scale_parameters(); make_pair_matrix(); if (init_length < 0) init_length=0; }
duplexT duplexfold(const char *s1, const char *s2) { int i, j, l1, Emin=INF, i_min=0, j_min=0; char *struc; duplexT mfe; n1 = (int) strlen(s1); n2 = (int) strlen(s2); if ((!P) || (fabs(P->temperature - temperature)>1e-6)) { update_fold_params(); P = scale_parameters(); make_pair_matrix(); } c = (int **) space(sizeof(int *) * (n1+1)); for (i=1; i<=n1; i++) c[i] = (int *) space(sizeof(int) * (n2+1)); encode_seq(s1, s2); for (i=1; i<=n1; i++) { for (j=n2; j>0; j--) { int type, type2, E, k,l; type = pair[S1[i]][S2[j]]; c[i][j] = type ? P->DuplexInit : INF; if (!type) continue; if (i>1) c[i][j] += P->dangle5[type][SS1[i-1]]; if (j<n2) c[i][j] += P->dangle3[type][SS2[j+1]]; if (type>2) c[i][j] += P->TerminalAU; for (k=i-1; k>0 && k>i-MAXLOOP-2; k--) { for (l=j+1; l<=n2; l++) { if (i-k+l-j-2>MAXLOOP) break; type2 = pair[S1[k]][S2[l]]; if (!type2) continue; E = LoopEnergy(i-k-1, l-j-1, type2, rtype[type], SS1[k+1], SS2[l-1], SS1[i-1], SS2[j+1]); c[i][j] = MIN2(c[i][j], c[k][l]+E); } } E = c[i][j]; if (i<n1) E += P->dangle3[rtype[type]][SS1[i+1]]; if (j>1) E += P->dangle5[rtype[type]][SS2[j-1]]; if (type>2) E += P->TerminalAU; if (E<Emin) { Emin=E; i_min=i; j_min=j; } } } struc = backtrack(i_min, j_min); if (i_min<n1) i_min++; if (j_min>1 ) j_min--; l1 = strchr(struc, '&')-struc; /* printf("%s %3d,%-3d : %3d,%-3d (%5.2f)\n", struc, i_min+1-l1, i_min, j_min, j_min+strlen(struc)-l1-2, Emin*0.01); */ mfe.i = i_min; mfe.j = j_min; mfe.energy = (float) Emin/100.; mfe.structure = struc; if (!delay_free) { for (i=1; i<=n1; i++) free(c[i]); free(c); free(S1); free(S2); free(SS1); free(SS2); } return mfe; }