/*--------------------------- rnaSecStr.c P. Clote ---------------------------*/ #include #include #include #include #include #include #define DEBUG 0 #define NMAX 1000 #define INF INT_MAX/2 #define GUbond -1 #define AUbond -1 #define CGbond -1 #define THRESHOLD 3 // for i and j to basepair, |i-j| >= THRESHOLD /*---------prototypes ----------*/ void error(char *); int guPair(char, char); int auPair(char, char); int cgPair(char, char); int a(int, int, char *); int basePair(char, char); int watsonCrick(char, char); void initialEnergyMatrix(int[NMAX][NMAX], int); void printMatrix(int[NMAX][NMAX],int); void computeEnergyMatrix(int[NMAX][NMAX],char[NMAX],int); int backtrack(int,int,int[NMAX][NMAX],char[NMAX],char[NMAX]); void error(char *s){ fprintf(stderr,"%s\n",s); exit(1); } int guPair(char x, char y){ return ( x=='G'&&y=='U' || x=='U'&&y=='G' ); } int auPair(char x, char y){ return ( x=='A'&&y=='U' || x=='U'&&y=='A' ); } int cgPair(char x, char y){ return ( x=='C'&&y=='G' || x=='G'&&y=='C' ); } int a(int i, int j, char *s){ if (iTHRESHOLD){ k = E[j][i]; if(k != -1) { if (DEBUG) printf("Base pair k=%d,j=%d %c %c\n",k,j, S[k], S[j] ); paren[k] = '('; paren[j] = ')'; if( THRESHOLD <= (j-1)-(k+1)) backtrack(k+1,j-1,E,S,paren); if (THRESHOLD <= k-1-i ) backtrack(i,k-1,E,S,paren); } else{ // k==-1 if (DEBUG) printf("k=-1\n"); if( THRESHOLD <= j-1-i ){ // printf("i=%d j=%d\n",i,j-1); backtrack(i,j-1,E,S,paren); } else return 0; } } }// endBacktrack