static void strip_dssp(char *dsspfile,int nres, bool bPhobres[],real t, real *acc,FILE *fTArea, t_matrix *mat,int average_area[]) { static bool bFirst=TRUE; static char *ssbuf; FILE *tapeout; static int xsize,frame; char buf[STRLEN+1]; char SSTP; int i,nr,iacc; real iaccf,iaccb; t_xpmelmt c; tapeout=ffopen(dsspfile,"r"); /* Skip header */ do { fgets2(buf,STRLEN,tapeout); } while (strstr(buf,"KAPPA") == NULL); if (bFirst) { snew(ssbuf,nres+10); } iaccb=iaccf=0; for(nr=0; (fgets2(buf,STRLEN,tapeout) != NULL); nr++) { SSTP=buf[16]==' ' ? '~' : buf[16]; ssbuf[nr]=SSTP; buf[39]='\0'; sscanf(&(buf[34]),"%d",&iacc); acc[nr]=iacc; average_area[nr]+=iacc; if (bPhobres[nr]) iaccb+=iacc; else iaccf+=iacc; } ssbuf[nr]='\0'; if (bFirst) { sprintf(mat->title,"Secondary structure"); mat->legend[0]=0; sprintf(mat->label_x,"%s",time_label()); sprintf(mat->label_y,"Residue"); mat->bDiscrete=TRUE; mat->ny=nr; snew(mat->axis_y,nr); for(i=0; i<nr; i++) mat->axis_y[i]=i+1; mat->axis_x=NULL; mat->matrix=NULL; xsize=0; frame=0; bFirst=FALSE; } if (frame>=xsize) { xsize+=10; srenew(mat->axis_x,xsize); srenew(mat->matrix,xsize); } mat->axis_x[frame]=t; snew(mat->matrix[frame],nr); c.c2=0; for(i=0; i<nr; i++) { c.c1=ssbuf[i]; mat->matrix[frame][i] = max(0,searchcmap(mat->nmap,mat->map,c)); } frame++; mat->nx=frame; if (fTArea) fprintf(fTArea,"%10g %10g %10g\n",t,0.01*iaccb,0.01*iaccf); fclose(tapeout); }
static int strip_dssp(char *dsspfile,int nres, bool bPhobres[],real t, real *acc,FILE *fTArea, t_matrix *mat,int average_area[]) { static bool bFirst=TRUE; static char *ssbuf; FILE *tapeout; static int xsize,frame; char buf[STRLEN+1]; char SSTP; int i,nr,iacc,nresidues; int naccf,naccb; /* Count hydrophobic and hydrophilic residues */ real iaccf,iaccb; t_xpmelmt c; tapeout=ffopen(dsspfile,"r"); /* Skip header */ do { fgets2(buf,STRLEN,tapeout); } while (strstr(buf,"KAPPA") == NULL); if (bFirst) { /* Since we also have empty lines in the dssp output (temp) file, * and some line content is saved to the ssbuf variable, * we need more memory than just nres elements. To be shure, * we allocate 2*nres-1, since for each chain there is a * separating line in the temp file. (At most each residue * could have been defined as a separate chain.) */ snew(ssbuf,2*nres-1); } iaccb=iaccf=0; nresidues = 0; naccf = 0; naccb = 0; for(nr=0; (fgets2(buf,STRLEN,tapeout) != NULL); nr++) { if (buf[13] == '!') /* Chain separator line has '!' at pos. 13 */ SSTP='='; /* Chain separator sign '=' */ else SSTP=buf[16]==' ' ? '~' : buf[16]; ssbuf[nr]=SSTP; buf[39]='\0'; /* Only calculate solvent accessible area if needed */ if ((NULL != acc) && (buf[13] != '!')) { sscanf(&(buf[34]),"%d",&iacc); acc[nr]=iacc; /* average_area and bPhobres are counted from 0...nres-1 */ average_area[nresidues]+=iacc; if (bPhobres[nresidues]) { naccb++; iaccb+=iacc; } else { naccf++; iaccf+=iacc; } /* Keep track of the residue number (do not count chain separator lines '!') */ nresidues++; } } ssbuf[nr]='\0'; if (bFirst) { if (0 != acc) fprintf(stderr, "%d residues were classified as hydrophobic and %d as hydrophilic.\n", naccb, naccf); sprintf(mat->title,"Secondary structure"); mat->legend[0]=0; sprintf(mat->label_x,"%s",time_label()); sprintf(mat->label_y,"Residue"); mat->bDiscrete=TRUE; mat->ny=nr; snew(mat->axis_y,nr); for(i=0; i<nr; i++) mat->axis_y[i]=i+1; mat->axis_x=NULL; mat->matrix=NULL; xsize=0; frame=0; bFirst=FALSE; } if (frame>=xsize) { xsize+=10; srenew(mat->axis_x,xsize); srenew(mat->matrix,xsize); } mat->axis_x[frame]=t; snew(mat->matrix[frame],nr); c.c2=0; for(i=0; i<nr; i++) { c.c1=ssbuf[i]; mat->matrix[frame][i] = max(0,searchcmap(mat->nmap,mat->map,c)); } frame++; mat->nx=frame; if (fTArea) fprintf(fTArea,"%10g %10g %10g\n",t,0.01*iaccb,0.01*iaccf); fclose(tapeout); /* Return the number of lines found in the dssp file (i.e. number * of redidues plus chain separator lines). * This is the number of y elements needed for the area xpm file */ return nr; }