/* Last changed Time-stamp: <2006-02-26 00:05:58 ivo> */ /* Access to alifold Routines c Ivo L Hofacker Vienna RNA package */ #include #include #include #include #include #include #include "fold.h" #include "part_func.h" #include "fold_vars.h" #include "PS_dot.h" #include "utils.h" #include "pair_mat.h" #include "alifold.h" #include "aln_util.h" extern void read_parameter_file(const char fname[]); extern float circalifold(const char **strings, char *structure); extern float energy_of_circ_struct(const char *seq, const char *structure); /*@unused@*/ static const char rcsid[] = "$Id: RNAalifold.c,v 1.14 2006/02/28 14:56:47 ivo Exp $"; #define PRIVATE static static const char scale[] = "....,....1....,....2....,....3....,....4" "....,....5....,....6....,....7....,....8"; PRIVATE void /*@exits@*/ usage(void); PRIVATE char *annote(const char *structure, const char *AS[]); PRIVATE void print_pi(const pair_info pi, FILE *file); PRIVATE cpair *make_color_pinfo(const pair_info *pi); PRIVATE void mark_endgaps(char *seq, char egap); /*--------------------------------------------------------------------------*/ #define MAX_NUM_NAMES 500 int main(int argc, char *argv[]) { char *string; char *structure=NULL, *cstruc=NULL; char ffname[20], gfname[20], fname[13]=""; char *ParamFile=NULL; char *ns_bases=NULL, *c; int n_seq, i, length, sym, r; int endgaps=0, mis=0; double min_en, real_en, sfact=1.07; int pf=0, istty; char *AS[MAX_NUM_NAMES]; /* aligned sequences */ char *names[MAX_NUM_NAMES]; /* sequence names */ FILE *clust_file = stdin; int circ=0; do_backtrack = 1; string=NULL; dangles=2; for (i=1; i : base i is paired with a base j>i\n"); printf("matching brackets ( ): base i pairs base j\n"); } if (fold_constrained) { if (istty) printf("%s\n", scale); cstruc = get_line(stdin); } if (istty && (clust_file == stdin)) { printf("\nInput aligned sequences in clustalw format\n"); if (!fold_constrained) printf("%s\n", scale); } n_seq = read_clustal(clust_file, AS, names); if (endgaps) for (i=0; i2000) fprintf(stderr, "scaling factor %f\n", pf_scale); fflush(stdout); /* init_alipf_fold(length); */ if (cstruc!=NULL) strncpy(structure, cstruc, length+1); energy = alipf_fold(AS, structure, &pi); if (do_backtrack) { printf("%s", structure); if (!istty) printf(" [%6.2f]\n", energy); else printf("\n"); } if ((istty)||(!do_backtrack)) printf(" free energy of ensemble = %6.2f kcal/mol\n", energy); printf(" frequency of mfe structure in ensemble %g\n", exp((energy-min_en)/kT)); if (do_backtrack) { FILE *aliout; cpair *cp; if (fname[0]!='\0') { strcpy(ffname, fname); strcat(ffname, "_ali.out"); } else strcpy(ffname, "alifold.out"); aliout = fopen(ffname, "w"); if (!aliout) { fprintf(stderr, "can't open %s skipping output\n", ffname); } else { short *ptable; int k; ptable = make_pair_table(mfe_struc); fprintf(aliout, "%d sequence; length of alignment %d\n", n_seq, length); fprintf(aliout, "alifold output\n"); for (k=0; pi[k].i>0; k++) { pi[k].comp = (ptable[pi[k].i] == pi[k].j) ? 1:0; print_pi(pi[k], aliout); } fprintf(aliout, "%s\n", structure); free(ptable); } fclose(aliout); if (fname[0]!='\0') { strcpy(ffname, fname); strcat(ffname, "_dp.ps"); } else strcpy(ffname, "alidot.ps"); cp = make_color_pinfo(pi); (void) PS_color_dot_plot(string, cp, ffname); free(cp); } free(mfe_struc); free(pi); } if (cstruc!=NULL) free(cstruc); free(base_pair); (void) fflush(stdout); free(string); free(structure); for (i=0; AS[i]; i++) { free(AS[i]); free(names[i]); } return 0; } void mark_endgaps(char *seq, char egap) { int i,n; n = strlen(seq); for (i=0; i0 && (seq[i]=='-'); i--) { seq[i] = egap; } } void print_pi(const pair_info pi, FILE *file) { const char *pname[8] = {"","CG","GC","GU","UG","AU","UA", "--"}; int i; /* numbering starts with 1 in output */ fprintf(file, "%5d %5d %2d %5.1f%% %7.3f", pi.i, pi.j, pi.bp[0], 100.*pi.p, pi.ent); for (i=1; i<=7; i++) if (pi.bp[i]) fprintf(file, " %s:%-4d", pname[i], pi.bp[i]); /* if ((!pi.sym)&&(pi.j>=0)) printf(" *"); */ if (!pi.comp) fprintf(file, " +"); fprintf(file, "\n"); } #define MIN2(A, B) ((A) < (B) ? (A) : (B)) PRIVATE cpair *make_color_pinfo(const pair_info *pi) { cpair *cp; int i, n; for (n=0; pi[n].i>0; n++); cp = (cpair *) space(sizeof(cpair)*(n+1)); for (i=0; i0) { snprintf(pps, 64, "%d %d %d gmark\n", i, j, pfreq[0]); strcat(ps, pps); } if (vi>1) { snprintf(pps, 64, "%d cmark\n", i); strcat(ps, pps); } if (vj>1) { snprintf(pps, 64, "%d cmark\n", j); strcat(ps, pps); } } free(ptable); return ps; } /*-------------------------------------------------------------------------*/ PRIVATE void usage(void) { nrerror("usage:\n" "RNAalifold [-cv float] [-nc float] [-E] [-mis] [-circ]\n" " [-p[0]] [-C] [-T temp] [-4] [-d] [-noGU] [-noCloseGU]\n" " [-noLP] [-e e_set] [-P paramfile] [-nsp pairs] [-S scale]\n" ); }