/* read energy parameters from a file Stephan Kopp, Ivo Hofacker Vienna RNA Package */ #include #include #include #include #include #include "utils.h" #include "energy_const.h" #include "energy_par.h" static char rcsid[] = "$Id: read_epars.c,v 1.10 2004/12/10 16:32:35 ivo Exp $"; #define PUBLIC #define PRIVATE static #define PARSET 20 enum parset {UNKNOWN= -1, QUIT, S, SH, HP, B, IL, MMI, MMH, MMM, MM_H, DE5, DE3, DE5_H, DE3_H, ML, TL, TRI, TE, NIN, MISC, INT11, INT11_H, INT21, INT21_H, INT22, INT22_H, DUMP, HELP}; /*------------------ identifiers ----------------------------*/ #define DEF -50 #define NST 0 #define DEF_TEMP 37.0 /* default temperature */ /*----------------------- prototypes -------------------------*/ PUBLIC void read_parameter_file(const char fname[]); PUBLIC void write_parameter_file(const char fname[]); PRIVATE void rd_stacks(int stack[NBPAIRS+1][NBPAIRS+1]); PRIVATE void rd_loop(int looparray[31]); PRIVATE void rd_mismatch(int mismatch[NBPAIRS+1][5][5]); PRIVATE void rd_int11(int int11[NBPAIRS+1][NBPAIRS+1][5][5]); PRIVATE void rd_int21(int int21[NBPAIRS+1][NBPAIRS+1][5][5][5]); PRIVATE void rd_int22(int int22[NBPAIRS+1][NBPAIRS+1][5][5][5][5]); PRIVATE void rd_dangle(int dangles[NBPAIRS+1][5]); PRIVATE void rd_MLparams(void); PRIVATE void rd_misc(void); PRIVATE void rd_ninio(void); PRIVATE void rd_Tetra_loop(void); PRIVATE void rd_Tri_loop(void); PRIVATE void check_symmetry(void); PRIVATE enum parset gettype(char ident[]); PRIVATE char *get_array1(int *arr, int size); PRIVATE void ignore_comment(char *line); PRIVATE void display_array(int *p, int size, int line, FILE *fp); /*------------------------------------------------------------*/ PRIVATE FILE *fp; PRIVATE float rtemp=DEF_TEMP; /*------------------------------------------------------------*/ PUBLIC void read_parameter_file(const char fname[]) { char *line, ident[32]; enum parset type; int r, changed=0; if (!(fp=fopen(fname,"r"))) { fprintf(stderr, "\nread_parameter_file:\n" "\t\tcan't open file %s\n" "\t\tusing default parameters instead.\n", fname); return; } if (!(line = get_line(fp))) { fprintf(stderr," File %s is inproper.\n", fname); fclose(fp); return; } if (strncmp(line,"## RNAfold parameter file",25)!=0) { fprintf(stderr, "Missing header line in file.\n" "May be this file has incorrect format.\n" "Use INTERRUPT-key to stop.\n"); } free(line); while((line=get_line(fp))) { r = sscanf(line, "# %31s", ident); if (r==1) { type = gettype(ident); switch (type) { case QUIT: break; case SH: rd_stacks(enthalpies); changed |= SH; break; case S: rd_stacks(stack37); changed |= S; break; case HP: rd_loop(hairpin37); changed |= HP; break; case B: rd_loop(bulge37); changed |= B; break; case IL: rd_loop(internal_loop37); changed |= IL; break; case MMH: rd_mismatch(mismatchH37); changed |= MMH; break; case MMI: rd_mismatch(mismatchI37); changed |= MMI; break; case MMM: rd_mismatch(mismatchM37); changed |= MMM; break; case MM_H: rd_mismatch(mism_H); changed |= MM_H; break; case INT11: rd_int11(int11_37); changed |= INT11; break; case INT11_H:rd_int11(int11_H); changed |= INT11_H; break; case INT21: rd_int21(int21_37); changed |= INT21; break; case INT21_H:rd_int21(int21_H); changed |= INT21_H; break; case INT22: rd_int22(int22_37); changed |= INT22; break; case INT22_H:rd_int22(int22_H); changed |= INT22_H; break; case DE5: rd_dangle(dangle5_37); changed |= DE5; break; case DE5_H: rd_dangle(dangle5_H); changed |= DE5_H; break; case DE3: rd_dangle(dangle3_37); changed |= DE3; break; case DE3_H: rd_dangle(dangle3_H); changed |= DE3_H; break; case ML: rd_MLparams(); changed |= ML; break; case NIN: rd_ninio(); changed |= NIN; break; case TL: rd_Tetra_loop(); changed |= TL; break; case TRI: rd_Tri_loop(); changed |= TRI; break; case MISC: rd_misc(); changed |= MISC; break; default: /* maybe it's a temperature */ r=sscanf(ident, "%f", &rtemp); if (r!=1) fprintf(stderr," Unknown field identifier in `%s'\n", 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