/* read energy parameters from a file Stephan Kopp, Ivo Hofacker Vienna RNA Package */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include "ViennaRNA/utils.h" #include "ViennaRNA/energy_const.h" #include "ViennaRNA/energy_par.h" #include "ViennaRNA/read_epars.h" #define PUBLIC #define PRIVATE static #define PARSET 20 #define DEF -50 #define NST 0 PRIVATE FILE *fp; PRIVATE void display_array(int *p, int size, int line, FILE *fp); PRIVATE char *get_array1(int *arr, int size); PRIVATE void ignore_comment(char *line); PRIVATE void check_symmetry(void); PRIVATE void update_nst(int array[NBPAIRS+1][NBPAIRS+1][5][5][5][5]); /** *** read a 1dimensional array from file *** \param array a pointer to the first element in the array *** \param dim the size of the array *** \param shift the first position the new values will be written in **/ PRIVATE void rd_1dim(int *array, int dim, int shift); PRIVATE void rd_1dim_slice(int *array, int dim, int shift, int post); PRIVATE void rd_2dim(int *array, int dim1, int dim2, int shift1, int shift2); PRIVATE void rd_2dim_slice(int *array, int dim1, int dim2, int shift1, int shift2, int post1, int post2); PRIVATE void rd_3dim(int *array, int dim1, int dim2, int dim3, int shift1, int shift2, int shift3); PRIVATE void rd_3dim_slice(int *array, int dim1, int dim2, int dim3, int shift1, int shift2, int shift3, int post1, int post2, int post3); PRIVATE void rd_4dim(int *array, int dim1, int dim2, int dim3, int dim4, int shift1, int shift2, int shift3, int shift4); PRIVATE void rd_4dim_slice(int *array, int dim1, int dim2, int dim3, int dim4, int shift1, int shift2, int shift3, int shift4, int post1, int post2, int post3, int post4); PRIVATE void rd_5dim(int *array, int dim1, int dim2, int dim3, int dim4, int dim5, int shift1, int shift2, int shift3, int shift4, int shift5); PRIVATE void rd_5dim_slice(int *array, int dim1, int dim2, int dim3, int dim4, int dim5, int shift1, int shift2, int shift3, int shift4, int shift5, int post1, int post2, int post3, int post4, int post5); PRIVATE void rd_6dim(int *array, int dim1, int dim2, int dim3, int dim4, int dim5, int dim6, int shift1, int shift2, int shift3, int shift4, int shift5, int shift6); PRIVATE void rd_6dim_slice(int *array, int dim1, int dim2, int dim3, int dim4, int dim5, int dim6, int shift1, int shift2, int shift3, int shift4, int shift5, int shift6, int post1, int post2, int post3, int post4, int post5, int post6); PRIVATE void rd_Tetraloop37(void); PRIVATE void rd_Triloop37(void); PRIVATE void rd_Hexaloop37(void); /*------------------------------------------------------------*/ PUBLIC void read_parameter_file(const char fname[]){ char *line, ident[256]; enum parset type; int r; if (!(fp=fopen(fname,"r"))) { vrna_message_warning("\nread_parameter_file:\n" "\t\tcan't open file %s\n" "\t\tusing default parameters instead.", fname); return; } if (!(line = vrna_read_line(fp))) { vrna_message_warning(" File %s is improper.\n", fname); fclose(fp); return; } if (strncmp(line,"## RNAfold parameter file v2.0",30)!=0) { vrna_message_warning( "Missing header line in file.\n" "May be this file has not v2.0 format.\n" "Use INTERRUPT-key to stop."); } free(line); while((line=vrna_read_line(fp))) { r = sscanf(line, "# %255s", ident); if (r==1) { type = gettype(ident); switch (type){ case QUIT: break; case S: rd_2dim(&(stack37[0][0]), NBPAIRS+1, NBPAIRS+1, 1, 1); break; case S_H: rd_2dim(&(stackdH[0][0]), NBPAIRS+1, NBPAIRS+1, 1, 1); break; case HP: rd_1dim(&(hairpin37[0]), 31, 0); break; case HP_H: rd_1dim(&(hairpindH[0]), 31, 0); break; case B: rd_1dim(&(bulge37[0]), 31, 0); break; case B_H: rd_1dim(&(bulgedH[0]), 31, 0); break; case IL: rd_1dim(&(internal_loop37[0]), 31, 0); break; case IL_H: rd_1dim(&(internal_loopdH[0]), 31, 0); break; case MME: rd_3dim(&(mismatchExt37[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MME_H: rd_3dim(&(mismatchExtdH[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MMH: rd_3dim(&(mismatchH37[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MMH_H: rd_3dim(&(mismatchHdH[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MMI: rd_3dim(&(mismatchI37[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MMI_H: rd_3dim(&(mismatchIdH[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MMI1N: rd_3dim(&(mismatch1nI37[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MMI1N_H: rd_3dim(&(mismatch1nIdH[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MMI23: rd_3dim(&(mismatch23I37[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MMI23_H: rd_3dim(&(mismatch23IdH[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MMM: rd_3dim(&(mismatchM37[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case MMM_H: rd_3dim(&(mismatchMdH[0][0][0]), NBPAIRS+1, 5, 5, 1, 0, 0); break; case INT11: rd_4dim(&(int11_37[0][0][0][0]), NBPAIRS+1, NBPAIRS+1, 5, 5, 1, 1, 0, 0); break; case INT11_H: rd_4dim(&(int11_dH[0][0][0][0]), NBPAIRS+1, NBPAIRS+1, 5, 5, 1, 1, 0, 0); break; case INT21: rd_5dim(&(int21_37[0][0][0][0][0]), NBPAIRS+1, NBPAIRS+1, 5, 5, 5, 1, 1, 0, 0, 0); break; case INT21_H: rd_5dim(&(int21_dH[0][0][0][0][0]), NBPAIRS+1, NBPAIRS+1, 5, 5, 5, 1, 1, 0, 0, 0); break; case INT22: rd_6dim_slice(&(int22_37[0][0][0][0][0][0]), NBPAIRS+1, NBPAIRS+1, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0); update_nst(int22_37); break; case INT22_H: rd_6dim_slice(&(int22_dH[0][0][0][0][0][0]), NBPAIRS+1, NBPAIRS+1, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0); update_nst(int22_dH); break; case D5: rd_2dim(&(dangle5_37[0][0]), NBPAIRS+1, 5, 1, 0); break; case D5_H: rd_2dim(&(dangle5_dH[0][0]), NBPAIRS+1, 5, 1, 0); break; case D3: rd_2dim(&(dangle3_37[0][0]), NBPAIRS+1, 5, 1, 0); break; case D3_H: rd_2dim(&(dangle3_dH[0][0]), NBPAIRS+1, 5, 1, 0); break; case ML: { int values[6]; rd_1dim(&values[0], 6, 0); ML_BASE37 = values[0]; ML_BASEdH = values[1]; ML_closing37 = values[2]; ML_closingdH = values[3]; ML_intern37 = values[4]; ML_interndH = values[5]; } break; case NIN: { int values[3]; rd_1dim(&values[0], 3, 0); ninio37 = values[0]; niniodH = values[1]; MAX_NINIO = values[2]; } break; case MISC: { int values[4]; rd_1dim(&values[0], 4, 0); DuplexInit37 = values[0]; DuplexInitdH = values[1]; TerminalAU37 = values[2]; TerminalAUdH = values[3]; } break; case TL: rd_Tetraloop37(); break; case TRI: rd_Triloop37(); break; case HEX: rd_Hexaloop37(); break; default: /* do nothing but complain */ vrna_message_warning("read_epars: Unknown field identifier in `%s'", line); } } /* else ignore line */ free(line); } fclose(fp); check_symmetry(); return; } /*------------------------------------------------------------*/ PRIVATE void display_array(int *p, int size, int nl, FILE *fp) { int i; for (i=1; i<=size; i++, p++) { switch(*p) { case INF: fprintf(fp," INF"); break; case -INF: fprintf(fp," -INf"); break; case DEF: fprintf(fp," DEF"); break; default: fprintf(fp,"%6d", *p); break; } if ((i%nl)==0) fprintf(fp,"\n"); } if (size%nl) fprintf(fp,"\n"); return; } /*------------------------------------------------------------*/ PRIVATE char *get_array1(int *arr, int size) { int i, p, pos, pp, r, last; char *line, buf[16]; i = last = 0; while( i