PRIVATE void heat_capacity(char *string, float T_min, float T_max, float h, int m) { int length, i; char *structure; float hc, kT, min_en; length = (int) strlen(string); do_backtrack = 0; temperature = T_min -m*h; /* initialize_fold(length); <- obsolete */ structure = (char *) vrna_alloc((unsigned) length+1); min_en = fold(string, structure); free(structure); free_arrays(); kT = (temperature+K0)*GASCONST/1000; /* in kcal */ pf_scale = exp(-(1.07*min_en)/kT/length ); /* init_pf_fold(length); <- obsolete */ vrna_exp_param_t *pf_parameters = NULL; vrna_md_t md; set_model_details(&md); pf_parameters = get_boltzmann_factors(temperature, 1.0, md, pf_scale); update_pf_params_par(length, pf_parameters); for (i=0; i<2*m+1; i++) { F[i] = pf_fold_par(string, NULL, pf_parameters, 0, 0, 0); /* T_min -2h */ md.temperature = temperature += h; kT = (temperature+K0)*GASCONST/1000; pf_scale=exp(-(F[i]/length +h*0.00727)/kT); /* try to extrapolate F */ free(pf_parameters); pf_parameters = get_boltzmann_factors(temperature, 1.0, md, pf_scale); update_pf_params_par(length, pf_parameters); } while (temperature <= (T_max+m*h+h)) { hc = - ddiff(F,h,m)* (temperature +K0 - m*h -h); printf("%g %g\n", (temperature-m*h-h), hc); for (i=0; i<2*m; i++) F[i] = F[i+1]; F[2*m] = pf_fold_par(string, NULL, pf_parameters, 0, 0, 0); /* printf("%g\n", F[2*m]);*/ temperature += h; kT = (temperature+K0)*GASCONST/1000; pf_scale=exp(-(F[i]/length +h*0.00727)/kT); free(pf_parameters); md.temperature = temperature; pf_parameters = get_boltzmann_factors(temperature, 1.0, md, pf_scale); update_pf_params_par(length, pf_parameters); } free_pf_arrays(); }
float ffiwrap_pf_circ_fold_constrained (const char *sequence, char *structure, int constrained) { return pf_fold_par (sequence, structure, 0, 1, constrained, 1); }
double score_seq( int s, char* seq, int ip ) { double score = 0.0; if( !is_legal( seq ) ) return score; int length = strlen( seq ); int* ix = get_iindx( length ); double betaScale = 1.0; double kT = ( betaScale*( ( temperature+K0 )*GASCONST ) )/1000.; /* in Kcal */ model_detailsT md; set_model_details( &md ); char* secstr = strdup( seq ); secstr[0] = 0; fold_constrained = 0; paramT* params = get_scaled_parameters( temperature, md ); double min_en = fold_par( seq, secstr, params, fold_constrained, 0 ); if( strncmp( secstr + ip, cnf->hairpin_ss, strlen( cnf->hairpin_ss ) ) != 0 || strcmp( secstr + length - strlen( cnf->tail3p_ss ), cnf->tail3p_ss ) != 0 ) { free( params ); free( secstr ); free( ix ); return score; } if( !is_legal_pair_content( seq, secstr, ip ) ) { free( params ); free( secstr ); free( ix ); return score; } #pragma omp atomic update num_scored++; double pf_scale = exp( -( 1.07*min_en )/kT/length ); pf_paramT* pf_params = get_boltzmann_factors( temperature, betaScale, md, pf_scale ); // Either patch fold_vars.h by inserting following at line 166 // // #ifdef _OPENMP // #pragma omp threadprivate(iindx) // #endif // // or uncomment this pragma below // // #pragma omp critical(pf_fold) double e = pf_fold_par( seq, NULL, pf_params, 1, fold_constrained, 0 ); FLT_OR_DBL* ppm = export_bppm(); #define pr_ij(i,j) (i == j? 0.0 : (i < j ? ppm[ix[i]-j] : ppm[ix[j]-i])) score = cnf->s_max; int i, o; for( i = 1; i <= length; i++ ) { for( o = 1; o <= strlen( cnf->hairpin_ss ); o++ ) { int j = ip + o; double v = pr_ij( i, j ); score -= v * ( 1.0 - v ); } } score *= cnf->s_scale; free( pf_params ); free( params ); free( secstr ); free( ix ); return score; }