static void convert_mat(t_matrix *mat,t_mat *rms) { int i,j; rms->n1 = mat->nx; matrix2real(mat,rms->mat); /* free input xpm matrix data */ for(i=0; i<mat->nx; i++) sfree(mat->matrix[i]); sfree(mat->matrix); for(i=0; i<mat->nx; i++) for(j=i; j<mat->nx; j++) { rms->sumrms += rms->mat[i][j]; rms->maxrms = max(rms->maxrms, rms->mat[i][j]); if (j!=i) rms->minrms = min(rms->minrms, rms->mat[i][j]); } rms->nn = mat->nx; }
void write_combined_matrix(int ecombine, char *fn, int nmat, t_matrix *mat1, t_matrix *mat2, real *cmin,real *cmax) { int i, j, k, nlevels; t_mapping *map=NULL; FILE *out; real **rmat1, **rmat2; real rhi, rlo; out = ffopen(fn, "w"); for(k=0; k<nmat; k++) { if ( mat2[k].nx!=mat1[k].nx || mat2[k].ny!=mat1[k].ny ) gmx_fatal(FARGS,"Size of frame %d in 1st (%dx%d) and 2nd matrix (%dx%d) do" " not match.\n",k,mat1[k].nx,mat1[k].ny,mat2[k].nx,mat2[k].ny); printf("Combining two %dx%d matrices\n",mat1[k].nx,mat1[k].ny); rmat1 = matrix2real(&mat1[k], NULL); rmat2 = matrix2real(&mat2[k], NULL); rlo=1e38; rhi=-1e38; for(j=0; j<mat1[k].ny; j++) for(i=0; i<mat1[k].nx; i++) { switch (ecombine) { case ecAdd: rmat1[i][j] += rmat2[i][j]; break; case ecSub: rmat1[i][j] -= rmat2[i][j]; break; case ecMult: rmat1[i][j] *= rmat2[i][j]; break; case ecDiv: rmat1[i][j] /= rmat2[i][j]; break; default: gmx_fatal(FARGS,"No such combination rule %d for matrices",ecombine); } rlo = min(rlo, rmat1[i][j]); rhi = max(rhi, rmat1[i][j]); } if (cmin) rlo = *cmin; if (cmax) rhi = *cmax; nlevels = max(mat1[k].nmap,mat2[k].nmap); if (rhi==rlo) fprintf(stderr, "combination results in uniform matrix (%g), no output\n",rhi); /* else if (rlo>=0 || rhi<=0) write_xpm(out, mat1[k].flags, mat1[k].title, mat1[k].legend, mat1[k].label_x, mat1[k].label_y, mat1[k].nx, mat1[k].ny, mat1[k].axis_x, mat1[k].axis_y, rmat1, rlo, rhi, rhi<=0?red:white, rhi<=0?white:blue, &nlevels); else write_xpm3(out, mat2[k].flags, mat1[k].title, mat1[k].legend, mat1[k].label_x, mat1[k].label_y, mat1[k].nx, mat1[k].ny, mat1[k].axis_x, mat1[k].axis_y, rmat1, rlo, 0, rhi, red, white, blue, &nlevels); */ else write_xpm(out, mat1[k].flags, mat1[k].title, mat1[k].legend, mat1[k].label_x, mat1[k].label_y, mat1[k].nx, mat1[k].ny, mat1[k].axis_x, mat1[k].axis_y, rmat1, rlo, rhi, white, black, &nlevels); } fclose(out); }
void write_combined_matrix(int ecombine, const char *fn, int nmat, t_matrix *mat1, t_matrix *mat2, real *cmin, real *cmax) { int i, j, k, nlevels; t_mapping *map = NULL; FILE *out; real **rmat1, **rmat2; real rhi, rlo; out = ffopen(fn, "w"); for (k = 0; k < nmat; k++) { if (mat2[k].nx != mat1[k].nx || mat2[k].ny != mat1[k].ny) { gmx_fatal(FARGS, "Size of frame %d in 1st (%dx%d) and 2nd matrix (%dx%d) do" " not match.\n", k, mat1[k].nx, mat1[k].ny, mat2[k].nx, mat2[k].ny); } printf("Combining two %dx%d matrices\n", mat1[k].nx, mat1[k].ny); rmat1 = matrix2real(&mat1[k], NULL); rmat2 = matrix2real(&mat2[k], NULL); if (NULL == rmat1 || NULL == rmat2) { gmx_fatal(FARGS, "Could not extract real data from %s xpm matrices. Note that, e.g.,\n" "g_rms and g_mdmat provide such data, but not do_dssp.\n", (NULL == rmat1 && NULL == rmat2) ? "both" : "one of the" ); } rlo = 1e38; rhi = -1e38; for (j = 0; j < mat1[k].ny; j++) { for (i = 0; i < mat1[k].nx; i++) { switch (ecombine) { case ecAdd: rmat1[i][j] += rmat2[i][j]; break; case ecSub: rmat1[i][j] -= rmat2[i][j]; break; case ecMult: rmat1[i][j] *= rmat2[i][j]; break; case ecDiv: rmat1[i][j] /= rmat2[i][j]; break; default: gmx_fatal(FARGS, "No such combination rule %d for matrices", ecombine); } rlo = min(rlo, rmat1[i][j]); rhi = max(rhi, rmat1[i][j]); } } if (cmin) { rlo = *cmin; } if (cmax) { rhi = *cmax; } nlevels = max(mat1[k].nmap, mat2[k].nmap); if (rhi == rlo) { fprintf(stderr, "combination results in uniform matrix (%g), no output\n", rhi); } /* else if (rlo>=0 || rhi<=0) write_xpm(out, mat1[k].flags, mat1[k].title, mat1[k].legend, mat1[k].label_x, mat1[k].label_y, mat1[k].nx, mat1[k].ny, mat1[k].axis_x, mat1[k].axis_y, rmat1, rlo, rhi, rhi<=0?red:white, rhi<=0?white:blue, &nlevels); else write_xpm3(out, mat2[k].flags, mat1[k].title, mat1[k].legend, mat1[k].label_x, mat1[k].label_y, mat1[k].nx, mat1[k].ny, mat1[k].axis_x, mat1[k].axis_y, rmat1, rlo, 0, rhi, red, white, blue, &nlevels); */ else { write_xpm(out, mat1[k].flags, mat1[k].title, mat1[k].legend, mat1[k].label_x, mat1[k].label_y, mat1[k].nx, mat1[k].ny, mat1[k].axis_x, mat1[k].axis_y, rmat1, rlo, rhi, white, black, &nlevels); } } ffclose(out); }