コード例 #1
0
ファイル: statistics.cpp プロジェクト: MelroLeandro/gromacs
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;
}
コード例 #2
0
ファイル: gmx_statistics.c プロジェクト: alwanderer/gromacs
static int low_lsq_y_ax_b(int n, real *xr, double *xd, real yr[],
                          real *a, real *b, real *r, real *chi2)
{
    int         i, ok;
    gmx_stats_t lsq;

    lsq = gmx_stats_init();
    for (i = 0; (i < n); i++)
    {
        if ((ok = gmx_stats_add_point(lsq, (NULL != xd) ? xd[i] : xr[i], yr[i], 0, 0))
            != estatsOK)
        {
            return ok;
        }
    }
    if ((ok = gmx_stats_get_ab(lsq, elsqWEIGHT_NONE, a, b, NULL, NULL, chi2, r)) != estatsOK)
    {
        return ok;
    }

    return estatsOK;
    /*
       double x,y,yx,xx,yy,sx,sy,chi2;

       yx=xx=yy=sx=sy=0.0;
       for (i=0; i<n; i++) {
       if (xd != NULL) {
       x = xd[i];
       } else {
       x = xr[i];
       }
       y =   yr[i];

       yx += y*x;
       xx += x*x;
       yy += y*y;
       sx += x;
       sy += y;
       }
     * a = (n*yx-sy*sx)/(n*xx-sx*sx);
     * b = (sy-(*a)*sx)/n;
     * r = sqrt((xx-sx*sx)/(yy-sy*sy));

       chi2 = 0;
       if (xd != NULL) {
       for(i=0; i<n; i++)
       chi2 += dsqr(yr[i] - ((*a)*xd[i] + (*b)));
       } else {
       for(i=0; i<n; i++)
       chi2 += dsqr(yr[i] - ((*a)*xr[i] + (*b)));
       }

       if (n > 2)
       return sqrt(chi2/(n-2));
       else
       return 0;
     */
}
コード例 #3
0
ファイル: statistics_test.c プロジェクト: dkarkoulis/gromacs
static void line()
{
    gmx_rng_t   rng;
    gmx_stats_t line;
    int         i, dy, ok, n = 1000;
    real        y, a, b, da, db, aver, sigma, error, chi2, R, rfit;
    const real  a0 = 0.23, b0 = 2.7;
    FILE       *fp;

    for (dy = 0; (dy < 2); dy++)
    {
        rng      = gmx_rng_init(13);
        line     = gmx_stats_init();
        for (i = 0; (i < n); i++)
        {
            y = a0*i+b0+50*(gmx_rng_uniform_real(rng)-0.5);
            if ((ok = gmx_stats_add_point(line, i, y, 0, dy*0.1)) != estatsOK)
            {
                fprintf(stderr, "%s\n", gmx_stats_message(ok));
            }
        }
        /* Line with slope test */
        if ((ok = gmx_stats_get_ab(line, elsqWEIGHT_NONE, &a, &b, &da, &db, &chi2, &rfit)) != estatsOK)
        {
            fprintf(stderr, "%s\n", gmx_stats_message(ok));
        }
        if ((ok = gmx_stats_get_corr_coeff(line, &R)) != estatsOK)
        {
            fprintf(stderr, "%s\n", gmx_stats_message(ok));
        }
        if (dy == 0)
        {
            fp = fopen("line0.xvg", "w");
        }
        else
        {
            fp = fopen("line1.xvg", "w");
        }
        if ((ok = gmx_stats_dump_xy(line, fp)) != estatsOK)
        {
            fprintf(stderr, "%s\n", gmx_stats_message(ok));
        }
        fclose(fp);
        printf("Line with eqn. y = %gx + %g with noise%s\n", a0, b0,
               (dy == 0) ? "" : " and uncertainties");
        printf("Found: a = %g +/- %g, b = %g +/- %g\n", a, da, b, db);
        if ((ok = gmx_stats_done(line)) != estatsOK)
        {
            fprintf(stderr, "%s\n", gmx_stats_message(ok));
        }
        gmx_rng_destroy(rng);
    }
}
コード例 #4
0
ファイル: statistics.cpp プロジェクト: MelroLeandro/gromacs
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;
}
コード例 #5
0
ファイル: gmx_msd.cpp プロジェクト: carryer123/gromacs
void printmol(t_corr *curr, const char *fn,
              const char *fn_pdb, int *molindex, t_topology *top,
              rvec *x, int ePBC, matrix box, const 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_done(lsq1);
        sfree(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);
    }
}
コード例 #6
0
ファイル: gmx_statistics.c プロジェクト: alwanderer/gromacs
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;
    int         i, ok;

    lsq = gmx_stats_init();
    for (i = 0; (i < n); i++)
    {
        if ((ok = gmx_stats_add_point(lsq, x[i], y[i], 0, dy[i])) != estatsOK)
        {
            return ok;
        }
    }
    if ((ok = gmx_stats_get_ab(lsq, elsqWEIGHT_Y, a, b, da, db, chi2, r)) != estatsOK)
    {
        return ok;
    }
    if ((ok = gmx_stats_done(lsq)) != estatsOK)
    {
        return ok;
    }
    sfree(lsq);

    return estatsOK;
    /*
       double sxy,sxx,syy,sx,sy,w,s_2,dx2,dy2,mins;

       sxy=sxx=syy=sx=sy=w=0.0;
       mins = dy[0];
       for(i=1; (i<n); i++)
       mins = min(mins,dy[i]);
       if (mins <= 0)
       gmx_fatal(FARGS,"Zero or negative weigths in linear regression analysis");

       for (i=0; i<n; i++) {
       s_2  = dsqr(1.0/dy[i]);
       sxx += s_2*dsqr(x[i]);
       sxy += s_2*y[i]*x[i];
       syy += s_2*dsqr(y[i]);
       sx  += s_2*x[i];
       sy  += s_2*y[i];
       w   += s_2;
       }
       sxx = sxx/w;
       sxy = sxy/w;
       syy = syy/w;
       sx  = sx/w;
       sy  = sy/w;
       dx2 = (sxx-sx*sx);
       dy2 = (syy-sy*sy);
     * a=(sxy-sy*sx)/dx2;
     * b=(sy-(*a)*sx);

     * chi2=0;
       for(i=0; i<n; i++)
     * chi2+=dsqr((y[i]-((*a)*x[i]+(*b)))/dy[i]);
     * chi2 = *chi2/w;

     * da = sqrt(*chi2/((n-2)*dx2));
     * db = *da*sqrt(sxx);
     * r  = *a*sqrt(dx2/dy2);

       if (debug)
       fprintf(debug,"sx = %g, sy = %g, sxy = %g, sxx = %g, w = %g\n"
       "chi2 = %g, dx2 = %g\n",
       sx,sy,sxy,sxx,w,*chi2,dx2);

       if (n > 2)
     * chi2 = sqrt(*chi2/(n-2));
       else
     * chi2 = 0;
     */
}