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, gmx_bool bPhobres[], real t, real *acc, FILE *fTArea, t_matrix *mat, int average_area[], const output_env_t oenv) { static gmx_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 = gmx_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", output_env_get_time_label(oenv)); 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); } gmx_ffclose(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; }
void read_xpm_entry(FILE *in,t_matrix *mm) { t_mapping *map; char *line=NULL,*str,buf[256]; int i,m,col_len,nch,n_axis_x,n_axis_y,llmax; unsigned int r,g,b; double u; bool bGetOnWithIt; t_xpmelmt c; mm->flags=0; mm->title[0]=0; mm->legend[0]=0; mm->label_x[0]=0; mm->label_y[0]=0; mm->matrix=NULL; mm->axis_x=NULL; mm->axis_y=NULL; mm->bDiscrete=FALSE; llmax = STRLEN; while (fgetline(&line,llmax,in) && (strncmp(line,"static",6) != 0)) { parsestring(line,"title",(mm->title)); parsestring(line,"legend",(mm->legend)); parsestring(line,"x-label",(mm->label_x)); parsestring(line,"y-label",(mm->label_y)); parsestring(line,"type",buf); } if (buf[0] && (strcasecmp(buf,"Discrete")==0)) mm->bDiscrete=TRUE; if (debug) fprintf(debug,"%s %s %s %s\n", mm->title,mm->legend,mm->label_x,mm->label_y); if (strncmp(line,"static",6) != 0) gmx_input("Invalid XPixMap"); /* Read sizes */ bGetOnWithIt=FALSE; while (!bGetOnWithIt && fgetline(&line,llmax,in)) { while (( line[0] != '\"' ) && ( line[0] != '\0' )) line++; if ( line[0] == '\"' ) { line2string(&line); sscanf(line,"%d %d %d %d",&(mm->nx),&(mm->ny),&(mm->nmap),&nch); if (nch > 2) gmx_fatal(FARGS,"Sorry can only read xpm's with at most 2 caracters per pixel\n"); llmax = max(STRLEN,mm->nx+10); bGetOnWithIt=TRUE; } } if (debug) fprintf(debug,"mm->nx %d mm->ny %d mm->nmap %d nch %d\n", mm->nx,mm->ny,mm->nmap,nch); /* Read color map */ snew(map,mm->nmap); m=0; while ((m < mm->nmap) && fgetline(&line,llmax,in)) { line=strchr(line,'\"'); if (line) { line++; /* Read xpm color map entry */ map[m].code.c1 = line[0]; if (nch==1) map[m].code.c2 = 0; else map[m].code.c2 = line[1]; line += nch; str = strchr(line,'#'); if (str) { str++; col_len = 0; while (isxdigit(str[col_len])) col_len++; if (col_len==6) { sscanf(line,"%*s #%2x%2x%2x",&r,&g,&b); map[m].rgb.r=r/255.0; map[m].rgb.g=g/255.0; map[m].rgb.b=b/255.0; } else if (col_len==12) { sscanf(line,"%*s #%4x%4x%4x",&r,&g,&b); map[m].rgb.r=r/65535.0; map[m].rgb.g=g/65535.0; map[m].rgb.b=b/65535.0; } else gmx_file("Unsupported or invalid colormap in X PixMap"); } else { str = strchr(line,'c'); if (str) str += 2; else gmx_file("Unsupported or invalid colormap in X PixMap"); fprintf(stderr,"Using white for color \"%s",str); map[m].rgb.r = 1; map[m].rgb.g = 1; map[m].rgb.b = 1; } line=strchr(line,'\"'); line++; line2string(&line); map[m].desc = strdup(line); m++; } } if ( m != mm->nmap ) gmx_fatal(FARGS,"Number of read colors map entries (%d) does not match the number in the header (%d)",m,mm->nmap); mm->map = map; /* Read axes, if there are any */ n_axis_x=0; n_axis_y=0; bGetOnWithIt=FALSE; do { if (strstr(line,"x-axis")) { line=strstr(line,"x-axis"); skipstr(&line); if (mm->axis_x==NULL) snew(mm->axis_x,mm->nx + 1); while (sscanf(line,"%lf",&u)==1) { if (n_axis_x > mm->nx) { gmx_fatal(FARGS,"Too many x-axis labels in xpm (max %d)",mm->nx); } else if (n_axis_x == mm->nx) { mm->flags |= MAT_SPATIAL_X; } mm->axis_x[n_axis_x] = u; n_axis_x++; skipstr(&line); } } else if (strstr(line,"y-axis")) { line=strstr(line,"y-axis"); skipstr(&line); if (mm->axis_y==NULL) snew(mm->axis_y,mm->ny + 1); while (sscanf(line,"%lf",&u)==1) { if (n_axis_y > mm->ny) { gmx_file("Too many y-axis labels in xpm"); } else if (n_axis_y == mm->ny) { mm->flags |= MAT_SPATIAL_Y; } mm->axis_y[n_axis_y] = u; n_axis_y++; skipstr(&line); } } } while ((line[0] != '\"') && fgetline(&line,llmax,in)); /* Read matrix */ snew(mm->matrix,mm->nx); for(i=0; i<mm->nx; i++) snew(mm->matrix[i],mm->ny); m=mm->ny-1; do { if(m%(1+mm->ny/100)==0) fprintf(stderr,"%3d%%\b\b\b\b",(100*(mm->ny-m))/mm->ny); while ((line[0] != '\"') && (line[0] != '\0')) line++; if (line[0] != '\"') gmx_fatal(FARGS,"Not enough caracters in row %d of the matrix\n",m+1); else { line++; for(i=0; i<mm->nx; i++) { c.c1=line[nch*i]; if (nch==1) c.c2=0; else c.c2=line[nch*i+1]; mm->matrix[i][m]=searchcmap(mm->nmap,mm->map,c); } m--; } } while ((m>=0) && fgetline(&line,llmax,in)); if (m>=0) gmx_incons("Not enough rows in the matrix"); }