{"id":51317666,"url":"https://github.com/aditya1707/forcekernel-eabf","last_synced_at":"2026-07-01T09:02:27.649Z","repository":{"id":355666029,"uuid":"1177087189","full_name":"aditya1707/ForceKernel-eABF","owner":"aditya1707","description":"Force-kernel eABF: a PLUMED enhanced-sampling plugin that delivers smooth mean-force estimates and free-energy landscapes from the earliest stages of sampling.","archived":false,"fork":false,"pushed_at":"2026-06-22T22:56:09.000Z","size":3962,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-06-23T00:22:59.070Z","etag":null,"topics":["abf","aimd","biophysics","collective-variables","computational-chemistry","eabf","enhanced-sampling","free-energy-calculations","kernel-methods","metadynamics","molecular-dynamics","nadaraya-watson-regression","opes","plumed","rare-events"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aditya1707.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-09T17:21:24.000Z","updated_at":"2026-06-22T22:56:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/aditya1707/ForceKernel-eABF","commit_stats":null,"previous_names":["aditya1707/forcekernel-eabf"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/aditya1707/ForceKernel-eABF","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aditya1707%2FForceKernel-eABF","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aditya1707%2FForceKernel-eABF/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aditya1707%2FForceKernel-eABF/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aditya1707%2FForceKernel-eABF/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aditya1707","download_url":"https://codeload.github.com/aditya1707/ForceKernel-eABF/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aditya1707%2FForceKernel-eABF/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34999792,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["abf","aimd","biophysics","collective-variables","computational-chemistry","eabf","enhanced-sampling","free-energy-calculations","kernel-methods","metadynamics","molecular-dynamics","nadaraya-watson-regression","opes","plumed","rare-events"],"created_at":"2026-07-01T09:02:26.475Z","updated_at":"2026-07-01T09:02:27.630Z","avatar_url":"https://github.com/aditya1707.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FK-eABF\n\nA toolkit for running FK-eABF (Force-Kernel eABF) enhanced sampling simulations in PLUMED and recovering free energy landscapes from the results.\n\nFK-eABF is an adaptive biasing force method that uses an extended Lagrangian (fictitious particle λ coupled to the real collective variable z) and a kernel-based mean force estimator. The CZAR estimator on the real CV z provides an unbiased free energy gradient that is integrated into a free energy landscape in post-processing.\n\n---\n\n## Citation\n\nIf you use FK-eABF in your work, please cite:\n\n\u003e Kang, C.; Verma, R.; Sonpal, A.; Shoji, A.; Chipot, C.; Pfaendtner, J. *A Force-Kernel Reformulation of the Extended-System Adaptive Biasing Force for Free-Energy Calculations*. *J. Chem. Theory Comput.*, **submitted (2026)**.\n\u003e DOI: *to be added upon acceptance*.\n\n---\n\n## Requirements\n\n- PLUMED (with `forcekernel.cpp` compiled as a plugin via `LOAD`)\n- A MD engine supported by PLUMED, or the built-in `pesmd` toy integrator for 2D potentials\n- Python 3 with NumPy and SciPy for post-processing\n\n---\n\n## Workflow\n\n### 1. Setting up an FK-eABF simulation\n\nThe plugin is loaded at runtime via the PLUMED `LOAD` directive — no recompilation of PLUMED is required. Configure your `plumed.dat` to load the plugin and define the `FKERNELABF` action:\n\n```plumed\nLOAD FILE=./forcekernel.cpp\n\ncv: \u003cYOUR_CV_DEFINITION\u003e\n\nfk: FKERNELABF ...\n    \n    # CV Definition\n    ARG=cv\n\n    # Extended Lagrangian Options\n    KAPPA=3000.0          # coupling spring constant (kJ/mol/nm^2)\n    TAU=0.5               # fictitious particle time constant (ps)\n    FRICTION=8.0          # Langevin friction (ps^-1)\n    TEMP=300              # temperature (K)\n\n    # FK-eABF Options\n    GRIDMIN=-1.5          # CV domain lower bound\n    GRIDMAX=1.5           # CV domain upper bound\n    SIGMA=0.05            # initial kernel width\n    SIGMA_MIN=0.01        # minimum kernel width\n    GRIDSIZE=100\n\n    # Data Accumulation and Biasing Force Update options\n    PACE=5                # steps between data accumulation\n    GRIDPACE=1000         # steps between biasing force updates\n\n    # Output options\n    CZARSTRIDE=50000      # steps between CZAR kernel file writes\n    KERNELINFOSTRIDE=500  # match this to your PRINT STRIDE\n...\n\nPRINT FILE=COLVAR STRIDE=500 ARG=*\n```\n\n#### Parameter selection at a glance\n\nIf you're setting up a new system, the following decision tree walks through the main parameter choices in roughly the order they should be made:\n\n```mermaid\n%%{init: {'flowchart': {'nodeSpacing': 25, 'rankSpacing': 35}}}%%\nflowchart TD\n    Start([Configure FKERNELABF]) --\u003e CV{Periodic CV?}\n    CV --\u003e|No| CVN[Set GRIDMIN, GRIDMAX]\n    CV --\u003e|Yes| Sigma\n    CVN --\u003e Sigma{Bin width\u003cbr/\u003eknown?}\n\n    Sigma --\u003e|Yes| SS[SIGMA = bin width\u003cbr/\u003eSIGMA_MIN ≈ SIGMA / 2]\n    Sigma --\u003e|No| SA[Omit SIGMA, set SIGMA_MIN\u003cbr/\u003eadaptive σ₀ warmup]\n\n    SS --\u003e Kappa[\"KAPPA so √(kT/κ) ≪ SIGMA_MIN\u003cbr/\u003etypically 1000–5000\"]\n    SA --\u003e Kappa\n\n    Kappa --\u003e Engine{Engine?}\n    Engine --\u003e|Classical| MD[GRIDPACE 500–1000]\n    Engine --\u003e|AIMD| AIMD[PACE = 1, GRIDPACE 50–200]\n\n    MD --\u003e Bias[BIASFACTOR 2–10]\n    AIMD --\u003e Bias\n    Bias --\u003e Out[CZARSTRIDE as needed\u003cbr/\u003eKERNELINFOSTRIDE = PRINT STRIDE]\n    Out --\u003e End([Run])\n```\n\n**TLDR; set `SIGMA`, `SIGMA_MIN`, and `GRIDSIZE` (plus `GRIDMIN`/`GRIDMAX` for non-periodic CVs). Everything else can be left at its default.** The three parameters above are technically optional but should be treated as mandatory in practice — getting them right is the difference between a simulation that converges efficiently and one that wastes compute time.\n\n**SIGMA and SIGMA_MIN.** `SIGMA` is the initial kernel bandwidth; `SIGMA_MIN` is the floor below which adaptive Silverman rescaling cannot shrink it. Omitting `SIGMA_MIN` lets the kernel population grow without bound as the bandwidth contracts, wasting memory and slowing the kernel search. Use the bin width you would adopt for eABF as a guide: set `SIGMA` to that value and `SIGMA_MIN` to half of it (e.g., a 5° dihedral bin → `SIGMA` ≈ 0.087 rad, `SIGMA_MIN` ≈ 0.04 rad).\n\n**GRIDSIZE.** The mean-force grid is where NW regression is evaluated and multilinearly interpolated between rebuilds. The grid resolution does not affect kernel accumulation or the recovered free energy — it controls how faithfully the cancellation force is applied between updates. By default (`GRIDSIZE=0`), FK-eABF auto-sizes the grid so that spacing equals `2 × SIGMA_MIN` (the effective kernel diameter), with a floor of 72 points per dimension. An explicit `GRIDSIZE` producing coarser spacing triggers a warning but does not abort the run.\n\n#### Compulsory Keywords\n\n| Keyword | Default | Description |\n|---------|---------|-------------|\n| `ARG` | — | Collective variables (1–3 supported). |\n| `KAPPA` | — | Spring constant(s) for z–λ coupling (kJ/mol/unit²). Larger κ → tighter coupling, smaller σ = √(kT/κ). One value or one per CV. |\n| `TAU` | `0.5` | Oscillation period(s) of λ (time units). Sets the fictitious mass m = κτ²/(4π²). |\n| `FRICTION` | `10.0` | Langevin friction on λ (1/time_unit). One value or one per CV. |\n| `TEMP` | `300.0` | Temperature (K). |\n| `PACE` | `5` | Force-sample deposition interval (MD steps). |\n| `THRESH` | `1.0` | Kernel merge threshold in σ-normalised distance. OPES standard; lower → more compression, higher → more kernels. |\n| `NSIGMACUT` | `4.0` | Kernel cutoff in σ per dimension for NW regression. 4.0 gives \u003c2% contribution at the boundary. |\n| `BIASFACTOR` | `1.0` | Exploration factor γ. `1.0` = pure ABF. `\u003e1.0` adds density-based exploration on λ via V_ex = c·ln(1 + Z/Z₀) where c = kT(γ−1). The CZAR estimator on z is unaffected. |\n| `EXPLORSCALE` | `1.0` | Per-CV scaling of the exploration force. `0.0` disables exploration on that CV (e.g., `1.0, 0.0` to drive only the first of two CVs). |\n| `MUXCLAMP` | `500.0` | Per-kernel mean-force clamp on absorption (kJ/mol/unit). |\n| `MAXFORCE` | `500.0` | Grid mean-force clamp per node before interpolation (kJ/mol/unit). |\n| `GRIDSIZE` | `0` (auto) | Grid points per dimension. Auto-size: N = ceil(range / (2 × SIGMA_MIN)), floor 72. Defaults to 72 when `SIGMA_MIN` is unset. |\n| `GRIDPACE` | `500` | Mean-force grid rebuild interval. Reduce for AIMD. |\n\n#### Optional Keywords — Bandwidth\n\n| Keyword | Default | Description |\n|---------|---------|-------------|\n| `SIGMA` | *(auto)* | Initial kernel bandwidth σ₀. Omit entirely for adaptive mode (CV variance measured during an unbiased warmup). |\n| `SIGMA_MIN` | *(none)* | Bandwidth floor. Set to roughly half `SIGMA` so free-energy resolution can sharpen with more sampling. |\n| `ADAPTIVE_SIGMA_STRIDE` | `10 × PACE` | Length of the unbiased warmup for automatic σ₀ determination. Used only when `SIGMA` is omitted. |\n| `FIXED_SIGMA` | `false` | Disable Silverman rescaling — all kernels use σ₀ permanently. |\n\n#### Optional Keywords — Grid Bounds\n\n| Keyword | Default | Description |\n|---------|---------|-------------|\n| `GRIDMIN` | *(from CV)* | Lower grid bound(s) for non-periodic CVs. Reflecting walls applied automatically. |\n| `GRIDMAX` | *(from CV)* | Upper grid bound(s) for non-periodic CVs. |\n\n#### Optional Keywords — Neighbor List\n\n| Keyword | Default | Description |\n|---------|---------|-------------|\n| `NONLIST` | `false` | Disable the neighbor list (brute-force kernel search). |\n| `NLIST_PARAMETERS` | `3.0 0.5` | Cutoff factor and skin factor. Includes kernels within `cutoff × NSIGMACUT × σ`; rebuilds when the query point drifts by `skin × dev²`. |\n\n#### Optional Keywords — Output Files\n\nAll filenames are derived from the action label (e.g., `fk: FKERNELABF ...` → `fk.*`).\n\n| Keyword | Default | Description |\n|---------|---------|-------------|\n| `CZARSTRIDE` | *(off)* | Step-stamped CZAR z-kernel snapshots → `{label}.czar_kernels_{step:08d}.dat`. Feed to `czar_integrate` to recover A(z). |\n| `KERNELSTRIDE` | *(off)* | Step-stamped λ-kernel snapshots → `{label}.kernels_{step:08d}.dat`. |\n| `LAMBDAGRIDSTRIDE` | *(off)* | NW mean-force debug grid every N steps → `{label}.lambda_grid_{step:08d}.dat`. Bias force on the λ grid, **not** the free energy. |\n| `STATESTRIDE` | `CZARSTRIDE`, else `10 × GRIDPACE` | Restart state cadence → `{label}.state.dat` (overwritten in place). State is also written automatically whenever the MD engine writes its own checkpoint. See [Restarts](#restarts) below. |\n| `KERNELINFOSTRIDE` | `PACE` | Kernel diagnostics line every N steps → `{label}.kernelinfo.dat`. **Set this to match your `PRINT STRIDE` (e.g. 500); the default of `PACE` writes at every kernel deposition and adds significant I/O overhead.** |\n\n\u003cbr\u003e\n\n---\n\n\u003cbr\u003e\n\n### 2. Running the simulation\n\nFor the included Müller-Brown benchmark, run with PLUMED's built-in 2D toy integrator:\n\n```bash\nplumed pesmd \u003c pesmd.in\n```\n\nThis executes the simulation defined in `pesmd.in` (10M steps on the 2D Müller-Brown potential) driven by `plumed.dat`, and writes CZAR kernel snapshots at the configured stride.\n\n#### Restarts\n\nFK-eABF writes a complete restart state to `{label}.state.dat` at `STATESTRIDE` intervals, and additionally whenever the host MD engine writes its own checkpoint (e.g., a GROMACS `.cpt`). Coupling to the engine checkpoint keeps the PLUMED state coherent with the trajectory frame; without it, a restart can pick up a state from a slightly different step than the trajectory and the `|z − s_fict|` diagnostic will flag the mismatch.\n\nThe state file contains everything needed to resume bit-for-bit: kernel populations (with stable IDs), σ₀ and adaptive-warmup status, fictitious-particle position and velocity, exploration density Z₀, ID counters, and the full mt19937 RNG state. The mean-force grid itself is *not* serialized — it is rebuilt from the kernels on restart.\n\nTo resume, add `RESTART` to your `plumed.dat` (or pass `--restart` to the MD engine):\n\n```plumed\nRESTART\nLOAD FILE=./forcekernel.cpp\nfk: FKERNELABF ...\n```\n\nOn restart, FK-eABF prints a banner summarising what was loaded (kernel counts, totalN, σ₀, adaptive status, fictitious particle, RNG), reconstructs the mean-force grid from the kernels, and reports rebuild statistics (populated fraction, |F_abf| max). On the first MD step it also logs `|z − s_fict|` per CV; this should be small relative to √(kT/κ). A large value usually means the trajectory checkpoint and state file are out of sync.\n\n**Reliability features.** State writes use a write-to-tmp + atomic rename strategy with `fsync()` for on-disk durability, falling back to direct overwrite if rename fails (common on Lustre/GPFS/NFS). On a successful read, the loaded file is copied to `bck.{label}.state.dat.{N}` (DRR-style backup-on-load) so the next overwrite cannot clobber a known-good restart point. Dimensionality or temperature mismatches between the state file and the current input abort with an error; a missing state file under `RESTART` warns and starts from scratch.\n\n\u003cbr\u003e\n\n---\n\n\u003cbr\u003e\n\n### 3. Recover the free energy landscape\n\nCompile `czar_integrate.cpp`:\n\n```bash\ng++ -O2 -o czar_integrate czar_integrate.cpp -lm \n```\n\nUse the executable to process CZAR kernel files:\n\n```bash\n./czar_integrate FEL_snapshots -d /path/to/scan\n```\n\nThe only required argument is the output directory for PMFs. By default `czar_integrate` scans the current directory; use `-d` to point elsewhere. All files matching `*czar_kernels_XXXXXXXX.dat` are integrated and written as `FEL_XXXXXXXX.dat`.\n\nFor 1D systems, integration uses the trapezoidal rule. For 2D and higher, integration uses an MC random walk (same conventions as `abf_integrate`). The `sigma0` and `sigma_min` headers in the kernel files enable proper KDE normalization (α_k = ∏ σ₀/σ_k) for variable-bandwidth kernels and automatic grid sizing.\n\n#### Options\n\n| Flag | Argument | Default | Description |\n|------|----------|---------|-------------|\n| `-n` | `\u003csteps\u003e` | `0` | MC integration steps. `0` = auto-converge on RMSD. |\n| `-h` | `\u003cheight\u003e` | `0.01` | Initial MC hill height. |\n| `-f` | `\u003cfactor\u003e` | `0.5` | Hill reduction factor (applied after warmup). |\n| `-t` | `\u003ckT\u003e` | *(from file)* | Override kT (kJ/mol). |\n| `-g` | `\u003cpts\u003e` | `0` (auto) | Integration grid points. Auto-sized from `sigma_min` header (default 100 if absent). |\n| `-s` | `\u003cnsigma\u003e` | `4.0` | Kernel cutoff in σ units. |\n| `-m` | `\u003cminpop\u003e` | `1e-3` | Minimum density fraction for the allowed region (below → NaN). |\n| `-d` | `\u003cdir\u003e` | `.` | Directory to scan (batch mode). |\n| `-i` | `\u003cfile\u003e` | — | Process a single kernel file. |\n| `-o` | `\u003cfile\u003e` | `FEL_czar.dat` | Output filename (single-file mode). |\n| `-v` | — | off | Verbose progress and convergence diagnostics. |\n| `-S` | `\u003cstep\u003e` | `0` | Skip kernel files before this step. |\n\n#### Examples\n\n```bash\n# Batch: scan current directory, write FEL snapshots\n./czar_integrate FEL_snapshots\n\n# Batch with fixed MC steps and user-specified height\n./czar_integrate FEL_snapshots -n 5000000 -h 0.2\n\n# Skip files before step 5M\n./czar_integrate FEL_snapshots -n 5000000 -h 0.2 -S 5000000\n\n# Scan a different directory\n./czar_integrate FEL_snapshots -d /path/to/run\n\n# Single file\n./czar_integrate -i fk.czar_kernels_10000000.dat -o PMF.dat\n\n# Fine grid, verbose\n./czar_integrate FEL_snapshots -g 150 -v\n```\n\n#### Output Format\n\n**Single-file mode** (`-i`): space-separated columns `z0, z1, …, czar_grad0, czar_grad1, …, ptilde, A_czar`, where `ptilde` is the biased density (NW denominator) and `A_czar` is the free energy in kJ/mol shifted to zero at the minimum.\n\n**Batch mode** (default): a simpler format with columns `z0, z1, …, A`.\n\nIn both modes, points below the population threshold are written as `nan`. For 2D+ grids, blank lines separate slices along the first dimension (gnuplot `pm3d` compatible).\n\n\u003cbr\u003e\n\n---\n\n\u003cbr\u003e\n\n### 4. Additional diagnostics\n\n`fkabf_diagnostics.py` processes the `COLVAR` and `{label}.kernelinfo.dat` files in the current directory to produce summary plots:\n\n```bash\npython fkabf_diagnostics.py\n```\n\n#### Options\n\n| Flag | Argument | Default | Description |\n|------|----------|---------|-------------|\n| `--colvar` | `\u003cfile\u003e` | `COLVAR` | PLUMED COLVAR file. |\n| `--kernelinfo` | `\u003cfile\u003e` | *(auto)* | `{label}.kernelinfo.dat`. Skipped if absent. |\n| `--prefix` | `\u003clabel\u003e` | *(auto)* | Action label prefix. Auto-detected from `_fict` columns. |\n| `--dt` | `\u003cfloat\u003e` | `0.001` | MD timestep (for converting time → steps). |\n| `--thinning` | `\u003cint\u003e` | `10` | Plot every Nth point in scatter / trajectory plots. |\n| `--periodic` | `\u003cspec\u003e` | *(none)* | Periodic CV spec for minimum-image z−λ. Format: `\"cv1:min:max,cv2:min:max\"` or `\"cv1:period\"`. Supports `pi`. |\n| `--outdir` | `\u003cdir\u003e` | `.` | Figure output directory. |\n\n#### Examples\n\n```bash\n# Auto-detect everything in current directory\npython fkabf_diagnostics.py\n\n# Specify files and output location\npython fkabf_diagnostics.py --colvar COLVAR --kernelinfo fk.kernelinfo.dat --outdir plots/\n\n# Alanine dipeptide with periodic CVs\npython fkabf_diagnostics.py --periodic \"phi:-pi:pi,psi:-pi:pi\" --dt 0.002\n\n# Dense trajectory, less thinning\npython fkabf_diagnostics.py --thinning 2\n```\n\n#### Output Figures\n\n| File | Contents |\n|------|----------|\n| `fig_trajectory.pdf` | Per-CV: z and λ time series, z−λ over time, and z−λ histogram (minimum-image for periodic CVs). |\n| `fig_bias.pdf` | \\|F_bias\\| and V_ex over time. |\n| `fig_kernels.pdf` | Kernel counts M and M_z, n_eff, compression N/M, Silverman σ per CV, Z₀ and Z(λ) if present. |\n| `fig_exploration.pdf` | 2D scatter of z and λ trajectories side-by-side, colored by time (2+ CVs only). |\n| `fig_phase.pdf` | z vs λ scatter per CV, colored by time. Spread indicates coupling width √(kT/κ). |\n| `fig_nlist.pdf` | Neighbor list size and nlker/M fraction over time. |\n\nA text summary (CV ranges, z−λ standard deviation, kernel counts, compression ratio, convergence metrics) is printed to stdout before figure generation.\n\n\u003cbr\u003e\n\n---\n\n\u003cbr\u003e\n\n### 5. Validating your results\n\nFK-eABF is designed to converge quickly, but fast convergence does not absolve the practitioner of proving that convergence has actually been achieved. A free-energy surface that looks reasonable is not the same as one that is correct. The following checks should be treated as mandatory.\n\n**Verify extended-system synchronization.** All extended-system ABF methods rely on λ remaining well coupled to z; if they desynchronize, CZAR receives corrupted force samples. Confirm that the z − λ distribution is centered at zero with a width consistent with σ ≈ √(kT/κ) — `fkabf_diagnostics.py` produces this histogram automatically (`fig_phase.pdf`, `fig_trajectory.pdf`). A bimodal, skewed, or excessively broad distribution means κ or τ should be adjusted before trusting the result.\n\n**Run multiple independent replicas.** A single trajectory that appears converged may have settled into a local minimum of the estimator without sampling all relevant basins. Run at least two — preferably three — independent replicas from different initial conditions and compare the resulting FELs. Agreement between replicas, not internal smoothness of a single run, is the minimum standard for convergence.\n\n**Cross-method validation.** Self-consistency within a single method is necessary but not sufficient: simulations can satisfy every standard self-convergence criterion while producing quantitatively incorrect free-energy profiles. For at least one system in any study, run a parallel calculation with an independent method (OPES, WTM-eABF, REUS) and compare. Cross-method agreement is the only reliable criterion currently available for validating free-energy calculations on systems where the true answer is unknown.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faditya1707%2Fforcekernel-eabf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faditya1707%2Fforcekernel-eabf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faditya1707%2Fforcekernel-eabf/lists"}