static int low_lsq_y_ax_b(int n, real *xr, double *xd, real yr[], real *a, real *b, real *r, real *chi2) { gmx_stats_t lsq = gmx_stats_init(); int ok; for (int i = 0; (i < n); i++) { double pt; if (xd != NULL) { pt = xd[i]; } else if (xr != NULL) { pt = xr[i]; } else { gmx_incons("Either xd or xr has to be non-NULL in low_lsq_y_ax_b()"); } if ((ok = gmx_stats_add_point(lsq, pt, yr[i], 0, 0)) != estatsOK) { gmx_stats_free(lsq); return ok; } } ok = gmx_stats_get_ab(lsq, elsqWEIGHT_NONE, a, b, NULL, NULL, chi2, r); gmx_stats_free(lsq); return ok; }
static void clust_stat(FILE *fp, int start, int end, t_pdbfile *pdbf[]) { int i; gmx_stats_t ed, ef; real aver, sigma; ed = gmx_stats_init(); ef = gmx_stats_init(); for (i = start; (i < end); i++) { gmx_stats_add_point(ed, i-start, pdbf[i]->edocked, 0, 0); gmx_stats_add_point(ef, i-start, pdbf[i]->efree, 0, 0); } gmx_stats_get_ase(ed, &aver, &sigma, NULL); fprintf(fp, " <%12s> = %8.3f (+/- %6.3f)\n", etitles[FALSE], aver, sigma); gmx_stats_get_ase(ef, &aver, &sigma, NULL); fprintf(fp, " <%12s> = %8.3f (+/- %6.3f)\n", etitles[TRUE], aver, sigma); gmx_stats_free(ed); gmx_stats_free(ef); }
int lsq_y_ax_b_error(int n, real x[], real y[], real dy[], real *a, real *b, real *da, real *db, real *r, real *chi2) { gmx_stats_t lsq = gmx_stats_init(); int ok; for (int i = 0; (i < n); i++) { ok = gmx_stats_add_point(lsq, x[i], y[i], 0, dy[i]); if (ok != estatsOK) { gmx_stats_free(lsq); return ok; } } ok = gmx_stats_get_ab(lsq, elsqWEIGHT_Y, a, b, da, db, chi2, r); gmx_stats_free(lsq); return ok; }
/* Old convenience functions, should be merged with the core statistics above. */ int lsq_y_ax(int n, real x[], real y[], real *a) { gmx_stats_t lsq = gmx_stats_init(); int ok; real da, chi2, Rfit; gmx_stats_add_points(lsq, n, x, y, 0, 0); ok = gmx_stats_get_a(lsq, elsqWEIGHT_NONE, a, &da, &chi2, &Rfit); gmx_stats_free(lsq); return ok; }
void printmol(t_corr *curr, const char *fn, const char *fn_pdb, int *molindex, t_topology *top, rvec *x, int ePBC, matrix box, const gmx_output_env_t *oenv) { #define NDIST 100 FILE *out; gmx_stats_t lsq1; int i, j; real a, b, D, Dav, D2av, VarD, sqrtD, sqrtD_max, scale; t_pdbinfo *pdbinfo = NULL; int *mol2a = NULL; out = xvgropen(fn, "Diffusion Coefficients / Molecule", "Molecule", "D", oenv); if (fn_pdb) { if (top->atoms.pdbinfo == NULL) { snew(top->atoms.pdbinfo, top->atoms.nr); } pdbinfo = top->atoms.pdbinfo; mol2a = top->mols.index; } Dav = D2av = 0; sqrtD_max = 0; for (i = 0; (i < curr->nmol); i++) { lsq1 = gmx_stats_init(); for (j = 0; (j < curr->nrestart); j++) { real xx, yy, dx, dy; while (gmx_stats_get_point(curr->lsq[j][i], &xx, &yy, &dx, &dy, 0) == estatsOK) { gmx_stats_add_point(lsq1, xx, yy, dx, dy); } } gmx_stats_get_ab(lsq1, elsqWEIGHT_NONE, &a, &b, NULL, NULL, NULL, NULL); gmx_stats_free(lsq1); D = a*FACTOR/curr->dim_factor; if (D < 0) { D = 0; } Dav += D; D2av += sqr(D); fprintf(out, "%10d %10g\n", i, D); if (pdbinfo) { sqrtD = std::sqrt(D); if (sqrtD > sqrtD_max) { sqrtD_max = sqrtD; } for (j = mol2a[molindex[i]]; j < mol2a[molindex[i]+1]; j++) { pdbinfo[j].bfac = sqrtD; } } } xvgrclose(out); do_view(oenv, fn, "-graphtype bar"); /* Compute variance, stddev and error */ Dav /= curr->nmol; D2av /= curr->nmol; VarD = D2av - sqr(Dav); printf("<D> = %.4f Std. Dev. = %.4f Error = %.4f\n", Dav, std::sqrt(VarD), std::sqrt(VarD/curr->nmol)); if (fn_pdb && x) { scale = 1; while (scale*sqrtD_max > 10) { scale *= 0.1; } while (scale*sqrtD_max < 0.1) { scale *= 10; } GMX_RELEASE_ASSERT(pdbinfo != NULL, "Internal error - pdbinfo not set for PDB input"); for (i = 0; i < top->atoms.nr; i++) { pdbinfo[i].bfac *= scale; } write_sto_conf(fn_pdb, "molecular MSD", &top->atoms, x, NULL, ePBC, box); } }