/*Secondary Structure Prediction Program SIMPA96 */ /* Author Jonathan Levin E-Mail jon@glycine.jouy.inra.fr*/ #include #include #include #define mxl 200 #define totres 150000 #define mxres 1500 #define mxseq 500 #define seg 15 #define cut 13 #define conf "Hb." #define h 4 #define b 2 #define nchar 60 char dbs[] ="dbks.seq"; char dbo[] ="dbks.obs"; int readseq (char *, char [],char [][70], int [], int []); void find (char [],char [],int [],int ,int [][3], char [][70],char *, int *[],int ,int []); void regul(float (*)[3],int, char *); float big(float *); int ibig(float *); float max(float,float); void fmax(char *, int *, float *); void consensus (char [][mxseq],int ,int ,float (*)[3],int *, char *,char *); void HH (char [][mxseq],int,int,float *); void pseudo(char [][mxseq],int,int,int *, char *); void sipred (char *,char *,int,char *,int *, int, FILE *); int mat[676]; float dc[3]={.86,1.10,.81}; int main (void) { FILE *fi1,*fi2,*fi3; int dird=0,i,j,k,kk,dnseq,dnres[mxseq],dcres[mxseq],tnseq,tnres[mxseq], tcres[mxseq],tusf,ali,l,ii,ncl,*ptseq[mxres],chk[mxres][3],mc, nrts[mxseq],scor[mxres],scs[mxres]; float (*prop)[3],tprop[mxres][3],uprop[mxres][3],tmp[3]; char dseq[totres],dobs[totres],dnames[mxseq][70],usf[70], tseq[totres],tnames[mxseq][70],yes[3],ucf[70],line[mxl], clus[mxres][mxseq],prs[mxres],rpr[mxres*mxseq],mpr[mxres][mxseq], pr[mxres],lpr[mxres],file3[70],uof[70]; char file1[70]="./"; char file2[70]="/usr/local/lib/"; /* data entry */ if((fi1=fopen("./mat.data","r"))== NULL) { if((fi1=fopen("/usr/local/lib/mat.data","r"))== NULL) { printf(" can't open mat.data file from . or /usr/local/lib\n"); exit(1); } dird=1; } for(i=0;i<26;i++) { for(k=0;k<26;k++)fscanf(fi1,"%2d",&mat[i*26+k]); while(getc(fi1)!='\n'); } fclose(fi1); if(dird) { strcpy(file3,file2); strcat(file3,dbs); dnseq=readseq(file3,dseq,dnames,dnres,dcres); strcpy(file3,file2); strcat(file3,dbo); dnseq=readseq(file3,dobs,dnames,dnres,dcres); } else { strcpy(file3,file1); strcat(file3,dbs); dnseq=readseq(file3,dseq,dnames,dnres,dcres); strcpy(file3,file1); strcat(file3,dbo); dnseq=readseq(file3,dobs,dnames,dnres,dcres); } /* enter user files */ printf(" enter sequence file name (PIR,fasta format)\n"); gets(usf); tnseq=readseq(usf,tseq,tnames,tnres,tcres); if(tnseq<1) { printf(" no sequences found in file %s\n",usf); exit(1); } else for(i=0;i'Z')&&line[17]!='-') if(fgets(line,mxl,fi2)==NULL) { printf("Error reading clustal file %s\n",ucf); printf("Are you sure this file is "); printf("in CLUSTAL W(1.60) format ?\n"); exit(1); } else k++; while(line[17]>='A'&&line[17]<='Z'||line[17]=='-') { line[17]=' '; if(fgets(line,mxl,fi2)==NULL) { printf("Error reading clustal file %s\n",ucf); printf("Are you sure this file is "); printf("in CLUSTAL W(1.60) format ?\n"); exit(1); } j++; } if(j!=tnseq) { printf("ERROR no of seqs in seq file "); printf("%d no of seq clustal file %d\n",tnseq,j); exit(1); } rewind(fi2); for(i=0;i'Z')&&line[16]!='-') if(fgets(line,mxl,fi2)==NULL){l=1;line[16]='-';} ii++; ncl=j+k-16; } fclose(fi2); /* check to see if same number of residues in seq file and clus file */ for(i=0;i=t) { t=tmp[i]; j=i; } if(j==0)*c='H'; else if(j==1)*c='b'; else if(j==2)*c='.'; tmp[j]=0; for (i=0;i<3;i++) if(tmp[i]>=u) { u=tmp[i]; j=i; } *sc=(1-u/t)*10; if(*sc>9)*sc=9; } /* regularisation using dynamic programming */ void regul(float (*prop)[3],int nres, char pr[]) { float dyn[mxres][3],H,B; int i,j,k,l; for(i=0;i=b) { for(i=2;i=b)?h:b; for(i=l+1;i0) { if(i<0) { printf(" error at end of dyn **** i<0 "); exit(1); } i--; j=ibig(&dyn[i][0]); if(j==k)pr[i]=conf[j]; else if(k==0) { for(l=i;l>i-h+1;l--)pr[l]=conf[k]; i=i-h+1; k=ibig(&dyn[i][0]); pr[i]=conf[k]; } else if(k==1) { for(l=i;l>i-b+1;l--)pr[l]=conf[k]; i=i-b+1; k=ibig(&dyn[i][0]); pr[i]=conf[k]; } else if(k==2) { k=ibig(&dyn[i][0]); pr[i]=conf[k]; } } pr[0]='.'; pr[nres-1]='.'; } /* function big returns largest value in row of dyn */ float big(float dyn[]) { int i; float a=0; for(i=0;i<3;i++)if(a=dsiz)tsiz=dsiz; ijk=0;it=0; for(k=0;k=cut) for(k=0;k=cut) for(k=0;k=cut) for(k=0;k=cut) for(k=0;k=tsiz)dsiz=tsiz; ijk=0;it=0; for(k=0;k=cut) for(k=0;k=cut) for(k=0;k=cut) for(k=0;k=cut) for(k=0;k='A'&&line[i]<='Z') { seq[cr+j++]=line[i]; i++; } else if (line[i]=='@') { nres[nseq]=j; cr+=j; cres[nseq+1]=cr; nseq++; k=1; i=200; } else i++; } } } fclose(fi1); return nseq; } else { rewind(fi1); while (fgets(line,mxl-1,fi1)!=NULL) { if(line[0]=='>') { i=0;j=0,k=0; while(i<68&&line[i+1]!='\n'){names[nseq][i]=line[i+1];i++;} names[nseq][i]='\n';names[nseq][i+1]='\0'; while(k==0) { if(fgets(line,mxl-1,fi1)!=NULL) { if (line[0]=='>') { nres[nseq]=j; cr+=j; cres[nseq+1]=cr; nseq++; i=0;j=0,k=0; while(i<68&&line[i+1]!='\n') {names[nseq][i]=line[i+1];i++;} names[nseq][i]='\n';names[nseq][i+1]='\0'; } else { i=0; while(line[i]!='\n'&&i<199) if(line[i]>='A'&&line[i]<='Z') { seq[cr+j++]=line[i]; i++; } else i++; } } else { nres[nseq]=j; cr+=j; cres[nseq+1]=cr; nseq++; k=1; fclose(fi1); return nseq; } } } } } }