Ejemplo n.º 1
0
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;
}  
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}