00001 #include <ctype.h>
00002 #define NBASES 8
00003
00004
00005 static const char Law_and_Order[] = "_ACGUTXKI";
00006 static int BP_pair[NBASES][NBASES]=
00007
00008 {{ 0, 0, 0, 0, 0, 0, 0, 0},
00009 { 0, 0, 0, 0, 5, 0, 0, 5},
00010 { 0, 0, 0, 1, 0, 0, 0, 0},
00011 { 0, 0, 2, 0, 3, 0, 0, 0},
00012 { 0, 6, 0, 4, 0, 0, 0, 6},
00013 { 0, 0, 0, 0, 0, 0, 2, 0},
00014 { 0, 0, 0, 0, 0, 1, 0, 0},
00015 { 0, 6, 0, 0, 5, 0, 0, 0}};
00016
00017 #define MAXALPHA 20
00018
00019 static short alias[MAXALPHA+1];
00020 static int pair[MAXALPHA+1][MAXALPHA+1];
00021
00022 static int rtype[8] = {0, 2, 1, 4, 3, 6, 5, 7};
00023
00024 #ifdef _OPENMP
00025 #pragma omp threadprivate(Law_and_Order, BP_pair, alias, pair, rtype)
00026 #endif
00027
00028
00029 #define ENCODE(c) encode_char(c)
00030
00031 static int encode_char(char c) {
00032
00033 int code;
00034 if (energy_set>0) code = (int) (c-'A')+1;
00035 else {
00036 const char *pos;
00037 pos = strchr(Law_and_Order, c);
00038 if (pos==NULL) code=0;
00039 else code = (int) (pos-Law_and_Order);
00040 if (code>5) code = 0;
00041 if (code>4) code--;
00042 }
00043 return code;
00044 }
00045
00046
00047
00048 extern char *nonstandards;
00049 extern void nrerror(const char message[]);
00050 static void make_pair_matrix(void)
00051 {
00052 int i,j;
00053
00054 if (energy_set==0) {
00055 for (i=0; i<5; i++) alias[i] = (short) i;
00056 alias[5] = 3;
00057 alias[6] = 2;
00058 alias[7] = 0;
00059 for (i=0; i<NBASES; i++) {
00060 for (j=0; j<NBASES; j++)
00061 pair[i][j] = BP_pair[i][j];
00062 }
00063 if (noGU) pair[3][4] = pair[4][3] =0;
00064 if (nonstandards!=NULL) {
00065 for (i=0; i<(int)strlen(nonstandards); i+=2)
00066 pair[encode_char(nonstandards[i])]
00067 [encode_char(nonstandards[i+1])]=7;
00068 }
00069 for (i=0; i<NBASES; i++) {
00070 for (j=0; j<NBASES; j++)
00071 rtype[pair[i][j]] = pair[j][i];
00072 }
00073 } else {
00074 for (i=0; i<=MAXALPHA; i++) {
00075 for (j=0; j<=MAXALPHA; j++)
00076 pair[i][j] = 0;
00077 }
00078 if (energy_set==1) {
00079 for (i=1; i<MAXALPHA;) {
00080 alias[i++] = 3;
00081 alias[i++] = 2;
00082 }
00083 for (i=1; i<MAXALPHA; i++) {
00084 pair[i][i+1] = 2;
00085 i++;
00086 pair[i][i-1] = 1;
00087 }
00088 }
00089 else if (energy_set==2) {
00090 for (i=1; i<MAXALPHA;) {
00091 alias[i++] = 1;
00092 alias[i++] = 4;
00093 }
00094 for (i=1; i<MAXALPHA; i++) {
00095 pair[i][i+1] = 5;
00096 i++;
00097 pair[i][i-1] = 6;
00098 }
00099 }
00100 else if (energy_set==3) {
00101 for (i=1; i<MAXALPHA-2; ) {
00102 alias[i++] = 3;
00103 alias[i++] = 2;
00104 alias[i++] = 1;
00105 alias[i++] = 4;
00106 }
00107 for (i=1; i<MAXALPHA-2; i++) {
00108 pair[i][i+1] = 2;
00109 i++;
00110 pair[i][i-1] = 1;
00111 i++;
00112 pair[i][i+1] = 5;
00113 i++;
00114 pair[i][i-1] = 6;
00115 }
00116 }
00117 else nrerror("What energy_set are YOU using??");
00118 for (i=0; i<=MAXALPHA; i++) {
00119 for (j=0; j<=MAXALPHA; j++)
00120 rtype[pair[i][j]] = pair[j][i];
00121 }
00122 }
00123 }
00124
00125 static short *encode_sequence(const char *sequence, short how){
00126 unsigned int i,l = (unsigned int)strlen(sequence);
00127 short *S = (short *) space(sizeof(short)*(l+2));
00128
00129 switch(how){
00130
00131 case 0: for(i=1; i<=l; i++)
00132 S[i]= (short) encode_char(toupper(sequence[i-1]));
00133 S[l+1] = S[1];
00134 S[0] = (short) l;
00135 break;
00136
00137 case 1: for(i=1; i<=l; i++)
00138 S[i] = alias[(short) encode_char(toupper(sequence[i-1]))];
00139 S[l+1] = S[1];
00140 S[0] = S[l];
00141 break;
00142 }
00143
00144 return S;
00145 }