Beispiel #1
0
static void dump_stats(FILE *log, int nsteps, int ndr, t_ilist *disres,
                       t_iparams ip[], t_dr_result *dr,
                       int isize, atom_id index[], t_atoms *atoms)
{
    int         i, j, nra;
    t_dr_stats *drs;

    fprintf(log, "\n");
    fprintf(log, "++++++++++++++ STATISTICS ++++++++++++++++++++++++\n");
    snew(drs, ndr);
    j         = 0;
    nra       = interaction_function[F_DISRES].nratoms+1;
    for (i = 0; (i < ndr); i++)
    {
        /* Search for the appropriate restraint */
        for (; (j < disres->nr); j += nra)
        {
            if (ip[disres->iatoms[j]].disres.label == i)
            {
                break;
            }
        }
        drs[i].index  = i;
        drs[i].bCore  = is_core(i, isize, index);
        drs[i].up1    = ip[disres->iatoms[j]].disres.up1;
        drs[i].r      = dr->aver1[i]/nsteps;
        drs[i].rT3    = std::pow(dr->aver_3[i]/nsteps, static_cast<real>(-1.0/3.0));
        drs[i].rT6    = std::pow(dr->aver_6[i]/nsteps, static_cast<real>(-1.0/6.0));
        drs[i].viol   = std::max(0.0, static_cast<double>(drs[i].r-drs[i].up1));
        drs[i].violT3 = std::max(0.0, static_cast<double>(drs[i].rT3-drs[i].up1));
        drs[i].violT6 = std::max(0.0, static_cast<double>(drs[i].rT6-drs[i].up1));
        if (atoms)
        {
            int j1 = disres->iatoms[j+1];
            int j2 = disres->iatoms[j+2];
            atoms->pdbinfo[j1].bfac += drs[i].violT3*5;
            atoms->pdbinfo[j2].bfac += drs[i].violT3*5;
        }
    }
    dump_viol(log, ndr, drs, FALSE);

    fprintf(log, "+++ Sorted by linear averaged violations: +++\n");
    qsort(drs, ndr, sizeof(drs[0]), drs_comp);
    dump_viol(log, ndr, drs, TRUE);

    dump_dump(log, ndr, drs);

    sfree(drs);
}
Beispiel #2
0
static void dump_clust_stats(FILE *fp,int ndr,t_ilist *disres,
			     t_iparams ip[],t_blocka *clust,t_dr_result dr[],
			     char *clust_name[],int isize,atom_id index[])
{
  int    i,j,k,nra,mmm=0;
  double sumV,maxV,sumVT3,sumVT6,maxVT3,maxVT6;
  t_dr_stats *drs;

  fprintf(fp,"\n");
  fprintf(fp,"++++++++++++++ STATISTICS ++++++++++++++++++++++\n");  
  fprintf(fp,"Cluster  NFrames    SumV      MaxV     SumVT     MaxVT     SumVS     MaxVS\n");

  snew(drs,ndr);
  
  for(k=0; (k<clust->nr); k++) {
    if (dr[k].nframes == 0)
      continue;
    if (dr[k].nframes != (clust->index[k+1]-clust->index[k])) 
      gmx_fatal(FARGS,"Inconsistency in cluster %s.\n"
		"Found %d frames in trajectory rather than the expected %d\n",
		clust_name[k],dr[k].nframes,
		clust->index[k+1]-clust->index[k]);
    if (!clust_name[k])
      gmx_fatal(FARGS,"Inconsistency with cluster %d. Invalid name",k);
    j         = 0;
    nra       = interaction_function[F_DISRES].nratoms+1;
    sumV = sumVT3 = sumVT6 = maxV = maxVT3 = maxVT6 = 0;
    for(i=0; (i<ndr); i++) {
      /* Search for the appropriate restraint */
      for( ; (j<disres->nr); j+=nra) {
	if (ip[disres->iatoms[j]].disres.label == i)
	  break;
      }
      drs[i].index  = i;
      drs[i].bCore  = is_core(i,isize,index);
      drs[i].up1    = ip[disres->iatoms[j]].disres.up1;
      drs[i].r      = dr[k].aver1[i]/dr[k].nframes;
      if ((dr[k].aver_3[i] <= 0) || (dr[k].aver_3[i] != dr[k].aver_3[i]))
	gmx_fatal(FARGS,"dr[%d].aver_3[%d] = %f",k,i,dr[k].aver_3[i]);
      drs[i].rT3    = pow(dr[k].aver_3[i]/dr[k].nframes,-1.0/3.0);
      drs[i].rT6    = pow(dr[k].aver_6[i]/dr[k].nframes,-1.0/6.0);
      drs[i].viol   = max(0,drs[i].r-drs[i].up1);
      drs[i].violT3 = max(0,drs[i].rT3-drs[i].up1);
      drs[i].violT6 = max(0,drs[i].rT6-drs[i].up1);
      sumV   += drs[i].viol;
      sumVT3 += drs[i].violT3;
      sumVT6 += drs[i].violT6;
      maxV    = max(maxV,drs[i].viol);
      maxVT3  = max(maxVT3,drs[i].violT3);
      maxVT6  = max(maxVT6,drs[i].violT6);
    }
    if (strcmp(clust_name[k],"1000") == 0) {
      mmm ++;
    }
    fprintf(fp,"%-10s%6d%8.3f  %8.3f  %8.3f  %8.3f  %8.3f  %8.3f\n",
	    clust_name[k],
	    dr[k].nframes,sumV,maxV,sumVT3,maxVT3,sumVT6,maxVT6);
  
  }
  fflush(fp);
  sfree(drs);
}