pyadmd 3.2.2__tar.gz → 3.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. {pyadmd-3.2.2/src/pyadmd.egg-info → pyadmd-3.2.3}/PKG-INFO +79 -75
  2. {pyadmd-3.2.2 → pyadmd-3.2.3}/README.md +78 -74
  3. {pyadmd-3.2.2 → pyadmd-3.2.3}/pyproject.toml +1 -1
  4. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/__init__.py +1 -1
  5. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/analysis/analyzer.py +1 -1
  6. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/charmm/wrt-nm.mdu +3 -3
  7. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/cli/commands.py +11 -24
  8. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/cli/main.py +1 -1
  9. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/cli/parser.py +97 -75
  10. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/console.py +1 -1
  11. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/fel/calculator.py +244 -258
  12. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/simulation/engine.py +17 -3
  13. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/utils.py +5 -3
  14. {pyadmd-3.2.2 → pyadmd-3.2.3/src/pyadmd.egg-info}/PKG-INFO +79 -75
  15. {pyadmd-3.2.2 → pyadmd-3.2.3}/LICENSE +0 -0
  16. {pyadmd-3.2.2 → pyadmd-3.2.3}/setup.cfg +0 -0
  17. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/__main__.py +0 -0
  18. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/analysis/__init__.py +0 -0
  19. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/analysis/completion.py +0 -0
  20. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/charmm/charmm_toppar.zip +0 -0
  21. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/cli/__init__.py +0 -0
  22. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/constants.py +0 -0
  23. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/enm/__init__.py +0 -0
  24. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/enm/analysis.py +0 -0
  25. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/enm/calculator.py +0 -0
  26. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/fel/__init__.py +0 -0
  27. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/fel/completion.py +0 -0
  28. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/geometry.py +0 -0
  29. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/io/__init__.py +0 -0
  30. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/io/dcd.py +0 -0
  31. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/io/namd.py +0 -0
  32. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/io/openmm_restart.py +0 -0
  33. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/io/params.py +0 -0
  34. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/io/state.py +0 -0
  35. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/modes/__init__.py +0 -0
  36. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/modes/exciter.py +0 -0
  37. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/simulation/__init__.py +0 -0
  38. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/simulation/runner.py +0 -0
  39. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd/simulation/system_builder.py +0 -0
  40. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd.egg-info/SOURCES.txt +0 -0
  41. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd.egg-info/dependency_links.txt +0 -0
  42. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd.egg-info/entry_points.txt +0 -0
  43. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd.egg-info/requires.txt +0 -0
  44. {pyadmd-3.2.2 → pyadmd-3.2.3}/src/pyadmd.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyadmd
3
- Version: 3.2.2
3
+ Version: 3.2.3
4
4
  Summary: Adaptive Molecular Dynamics with Excited Normal Modes (aMDeNM) on OpenMM.
5
5
  Author-email: Pedro Túlio Resende-Lara <laraptr@unicamp.br>
6
6
  License-Expression: GPL-3.0-or-later
@@ -384,7 +384,7 @@ $$
384
384
 
385
385
  where $`\mathbf{M}_{\mathrm{nm}}^+`$ denotes the Moore–Penrose pseudoinverse of $`\mathbf{M}_{\mathrm{nm}}`$. These approximate coefficients are written to the `factors.csv` output file for reference but do not influence the simulation; the physical vectors $`\mathbf{q}_i`$ are used directly as excitation directions.
386
386
 
387
- **Reproducibility:** the only stochastic step in this procedure is the initial placement of the $`P`$ points on $`S^{N-1}`$ before the repulsion loop runs (skipped entirely when $`P=2N`$, see above). This is now controlled by a seeded RNG (`-seed`/`--seed`, default `42`), so `pyadmd run` calls with identical arguments produce identical excitation vectors and `factors.csv` — see [Run Parameters](#parameters).
387
+ **Reproducibility:** the only stochastic step in this procedure is the initial placement of the $`P`$ points on $`S^{N-1}`$ before the repulsion loop runs (skipped entirely when $`P=2N`$, see above). This is controlled by a seeded RNG (`-seed`/`--seed`, default `42`), so `pyadmd run` calls with identical arguments produce identical excitation vectors and `factors.csv` — see [Run Parameters](#parameters).
388
388
 
389
389
  **Note:** ENM recomputation under `--recalc` (see [Excitation Direction Update](#excitation-direction-update)) draws a *new* random combination each time it fires and is intentionally **not** covered by `--seed`, since its purpose is to re-diversify the excitation direction mid-simulation.
390
390
 
@@ -502,7 +502,7 @@ below into it.
502
502
  - **`-rst`/`--rstfile`**: OpenMM XML restart file (`.rst`), written via `XmlSerializer.serialize(state)` from a state built with `getPositions=True, getVelocities=True`
503
503
 
504
504
  ### Feature Flags
505
- - **`-n`/`--no_correc`**: Disable excitation vector direction correction and compute standard MDeNM
505
+ - **`-n`/`--no-correc`**: Disable excitation vector direction correction and compute standard MDeNM
506
506
 
507
507
  - **`-f`/`--fixed`**: Disable excitation vector correction and keep constant excitation energy injections
508
508
 
@@ -517,15 +517,15 @@ below into it.
517
517
  ## Free Energy
518
518
  All parameters are optional; the `fel` subcommand reads its input trajectories and reference state from files already produced by `run`/`restart`/`append`, so no additional files need to be supplied.
519
519
 
520
- - **`-c`/`--cutoff`**: GROMOS RMSD clustering cutoff, in Å (**optional**. Default: **`0.8`**)
520
+ - **`-c`/`--cutoff`**: GROMOS RMSD clustering cutoff, in Å (**optional**. Default: **`1.0`**)
521
521
  - **`-d`/`--deexcite`**: Total restrained de-excitation MD length per centroid, in ps, split evenly over 4 restraint phases (**optional**. Default: **`200`**)
522
522
  - **`-p`/`--production`**: Unrestrained production MD length per centroid, in ps (**optional**. Default: **`800`**)
523
523
  - **`-nm`/`--modes`**: Comma-separated mode indices to project for the FEL (**optional**. Default: same modes used in `run`, *e.g.* `7,8,9`)
524
- - **`--modes_2d`**: Mode pairs for 2D FEL plots, as space-separated `"m1,m2"` tokens, *e.g.* `"7,8 7,9 8,9"` (**optional**. Default: all pairwise combinations of `--modes`)
525
- - **`-b`/`--bins`**: Number of histogram bins used for the FEL (**optional**. Default: **`50`**)
524
+ - **`--modes-2d`**: Mode pairs for 2D FEL plots, as space-separated `"m1,m2"` tokens (**optional**. Default: all pairwise combinations of --modes, *e.g.* "7,8 7,9 8,9")
525
+ - **`-b`/`--bins`**: Number of histogram bins used for the FEL (**optional**. Default: **`100`**)
526
526
  - **`-T`/`--temp`**: Temperature for k<sub>B</sub>T scaling and the production ensemble, in K (**optional**. Default: **`303.15`**)
527
527
  - **`-s`/`--sel`**: MDAnalysis selection string used for GROMOS RMSD clustering (**optional**. Default: **`"protein and name CA"`**)
528
- - **`--max_centroids`**: Maximum number of centroids submitted to MD. When the cluster count exceeds this value, exactly this many centroids are selected by greedy farthest-point (MaxMin) sampling to maximize conformational diversity (**optional**. Default: **`50`**)
528
+ - **`--max-centroids`**: Maximum number of centroids submitted to MD. When the cluster count exceeds this value, exactly this many centroids are selected by greedy farthest-point (MaxMin) sampling to maximize conformational diversity (**optional**. Default: **`50`**)
529
529
 
530
530
  **Note:** `-s`/`--sel` and `-T`/`--temp` must stay the same across repeated `fel` calls on the same simulation — see [Extending a Previous Free Energy Calculation](#extending-a-previous-free-energy-calculation). This `-s`/`--sel` selection is independent of `run`'s `-sel`/`--selection`: it controls GROMOS clustering only, while `run`'s selection controls both energy injection and (by default) the scope of most `pyadmd analyze` metrics — see [Analysis Selection Scope](#analysis-selection-scope).
531
531
 
@@ -539,19 +539,19 @@ All parameters are optional; the `fel` subcommand reads its input trajectories a
539
539
  ### Skip Flags
540
540
  Each analysis step can be independently disabled. When skipped, that metric will not appear in any CSV, plot, or HTML summary output.
541
541
 
542
- - **`--no_rmsd`**: Skip RMSD calculation
543
- - **`--no_rg`**: Skip radius of gyration calculation
544
- - **`--no_sasa`**: Skip SASA and hydrophobic exposure calculation
545
- - **`--no_rmsf`**: Skip RMSF calculation
546
- - **`--no_dssp`**: Skip secondary structure analysis via DSSP
547
- - **`--no_dccm`**: Skip DCCM (dynamic cross-correlation matrix) calculation
548
- - **`--no_lmi`**: Skip LMI (Linear Mutual Information) calculation
542
+ - **`--no-rmsd`**: Skip RMSD calculation
543
+ - **`--no-rg`**: Skip radius of gyration calculation
544
+ - **`--no-sasa`**: Skip SASA and hydrophobic exposure calculation
545
+ - **`--no-rmsf`**: Skip RMSF calculation
546
+ - **`--no-dssp`**: Skip secondary structure analysis via DSSP
547
+ - **`--no-dccm`**: Skip DCCM (dynamic cross-correlation matrix) calculation
548
+ - **`--no-lmi`**: Skip LMI (Linear Mutual Information) calculation
549
549
 
550
550
  **Note:** Before analysis, the program checks if `pyadmd` or `fel` calls are properly completed. If any unit (pyAdMD replica or free energy centroid) hasn't finished running, `analyze` prints a warning listing the incomplete units and their cycles completed/target, but proceeds anyway — see [Handling Incomplete Units](#handling-incomplete-units) below.
551
551
 
552
552
  ## ENM
553
553
  ### Parameters
554
- - **`-i`/`--input`**: Input PDB file (**required**, unless **`-w`/`--write_modes`** is used)
554
+ - **`-i`/`--input`**: Input PDB file (**required**, unless **`-w`/`--write-modes`** is used)
555
555
 
556
556
  - **`-o`/`--output`**: Output folder name (**optional**. Default: **`output`**)
557
557
 
@@ -561,25 +561,25 @@ Each analysis step can be independently disabled. When skipped, that metric will
561
561
 
562
562
  - **`-c`/`--cutoff`**: Interaction cutoff distance, in Å (**optional**. Default: **`15.0`** for CA, **`12.0`** for HEAVY)
563
563
 
564
- - **`-k`/`--spring_constant`**: ENM harmonic spring constant, in kcal/mol/Ų (**optional**. Default: **`1.0`**)
564
+ - **`-k`/`--spring-constant`**: ENM harmonic spring constant, in kcal/mol/Ų (**optional**. Default: **`1.0`**)
565
565
 
566
- - **`--max_modes`**: Number of non-rigid-body vibrational modes to compute (**optional**. Default: **`50`**)
566
+ - **`--max-modes`**: Number of non-rigid-body vibrational modes to compute (**optional**. Default: **`50`**)
567
567
 
568
- - **`--output_modes`**: Number of modes (file-labeled 1 through N, where label 1 is the first non-rigid mode) to write vectors/trajectories for (**optional**. Default: **`10`**)
568
+ - **`--output-modes`**: Number of modes (file-labeled 1 through N, where label 1 is the first non-rigid mode) to write vectors/trajectories for (**optional**. Default: **`10`**)
569
569
 
570
570
  ### Skip Flags
571
571
  Collectivity, contributions, RMSF, DCCM, and mode vector/trajectory writing can each be independently disabled:
572
572
 
573
- - **`--no_nm_vec`**: Skip writing mode vectors (`.xyz`)
574
- - **`--no_nm_trj`**: Skip writing mode trajectories (`_traj.pdb`)
575
- - **`--no_collectivity`**: Skip mode collectivity calculation
576
- - **`--no_contributions`**: Skip the variance-contributions plot
577
- - **`--no_rmsf`**: Skip the NMA-predicted RMSF plot (analytical, from the harmonic approximation — not derived from an MD trajectory; see [Analysis](#analysis-1) for the trajectory-based RMSF computed elsewhere in the package)
578
- - **`--no_dccm`**: Skip the NMA-predicted DCCM plot (same analytical distinction as RMSF above)
579
- - **`--no_gpu`**: Disable GPU acceleration
573
+ - **`--no-vec`**: Skip writing mode vectors (`.xyz`)
574
+ - **`--no-trj`**: Skip writing mode trajectories (`_traj.pdb`)
575
+ - **`--no-collectivity`**: Skip mode collectivity calculation
576
+ - **`--no-contributions`**: Skip the variance-contributions plot
577
+ - **`--no-rmsf`**: Skip the NMA-predicted RMSF plot (analytical, from the harmonic approximation — not derived from an MD trajectory; see [Analysis](#analysis-1) for the trajectory-based RMSF computed elsewhere in the package)
578
+ - **`--no-dccm`**: Skip the NMA-predicted DCCM plot (same analytical distinction as RMSF above)
579
+ - **`--no-gpu`**: Disable GPU acceleration
580
580
 
581
581
  ### Post-hoc Mode Re-writer
582
- - **`-w`/`--write_modes`**: Write mode vectors/trajectories from a previously completed `enm` run's saved `*_modes.npy`/`*_frequencies.npy`/structure PDB, without recomputing the ENM. Accepts comma-separated integers and inclusive ranges (`start:end`), *e.g.* `"26,41"`, `"7:10"`, `"42,44:50"`. Requires **`-o`/`--output`** pointing to an existing `enm` output directory.
582
+ - **`-w`/`--write-modes`**: Write mode vectors/trajectories from a previously completed `enm` run's saved `*_modes.npy`/`*_frequencies.npy`/structure PDB, without recomputing the ENM. Accepts comma-separated integers and inclusive ranges (`start:end`), *e.g.* `"26,41"`, `"7:10"`, `"42,44:50"`. Requires **`-o`/`--output`** pointing to an existing `enm` output directory.
583
583
 
584
584
  **Note on mode-file resolution:** `pyadmd enm`'s mode vector/trajectory files (`_mode_{N}.xyz`/`_mode_{N}_traj.pdb`) are written at the ENM's **native reduced resolution** (Cα-only or heavy-atom only, matching whatever the modes were computed on).
585
585
 
@@ -590,21 +590,21 @@ enm_output/
590
590
  ├── {base_name}_{model}_structure.pdb # reduced‑resolution structure (Cα or heavy atoms)
591
591
  ├── {base_name}_{model}_frequencies.npy # vibrational frequencies (filtered, non‑rigid modes)
592
592
  ├── {base_name}_{model}_modes.npy # eigenvector matrix (filtered, non‑rigid modes)
593
- ├── collectivity.csv # per‑mode collectivity (κ) and frequency (cm⁻¹) (omitted with --no_collectivity)
594
- ├── mode_contributions.png # per‑mode and cumulative variance contributions (omitted with --no_contributions)
595
- ├── rmsf_plot.png # NMA‑predicted residue RMSF (harmonic approximation) (omitted with --no_rmsf)
596
- ├── dccm_plot.png # NMA‑predicted residue cross‑correlation matrix (omitted with --no_dccm)
597
- ├── dccm_matrix.npy # raw NMA‑DCCM matrix (omitted with --no_dccm)
598
- ├── {base_name}_{model}_mode_{N}.xyz # displacement vector of mode N (XYZ format) (omitted with --no_nm_vec)
599
- └── {base_name}_{model}_mode_{N}_traj.pdb # oscillatory PDB trajectory along mode N (multi‑model) (omitted with --no_nm_trj)
593
+ ├── collectivity.csv # per‑mode collectivity (κ) and frequency (cm⁻¹) (omitted with --no-collectivity)
594
+ ├── mode_contributions.png # per‑mode and cumulative variance contributions (omitted with --no-contributions)
595
+ ├── rmsf_plot.png # NMA‑predicted residue RMSF (harmonic approximation) (omitted with --no-rmsf)
596
+ ├── dccm_plot.png # NMA‑predicted residue cross‑correlation matrix (omitted with --no-dccm)
597
+ ├── dccm_matrix.npy # raw NMA‑DCCM matrix (omitted with --no-dccm)
598
+ ├── {base_name}_{model}_mode_{N}.xyz # displacement vector of mode N (XYZ format) (omitted with --no-vec)
599
+ └── {base_name}_{model}_mode_{N}_traj.pdb # oscillatory PDB trajectory along mode N (multi‑model) (omitted with --no-trj)
600
600
  ```
601
601
 
602
602
 
603
603
  **Notes:**
604
604
  - `{base_name}` is the stem of the input PDB file (e.g., `system`).
605
605
  - `{model}` is either `ca` (Cα‑only) or `heavy` (heavy atoms).
606
- - The mode vector and trajectory files are written only for the modes specified by `‑‑output_modes` (default: first 10 non‑rigid modes).
607
- - The `-w` / `‑‑write_modes` option re‑uses an existing output directory to write **additional** mode files (vectors/trajectories) without recomputing the ENM.
606
+ - The mode vector and trajectory files are written only for the modes specified by `‑‑output-modes` (default: first 10 non‑rigid modes).
607
+ - The `-w` / `‑‑write-modes` option re‑uses an existing output directory to write **additional** mode files (vectors/trajectories) without recomputing the ENM.
608
608
 
609
609
  ### Output Files Description
610
610
 
@@ -614,17 +614,17 @@ enm_output/
614
614
  - **`{base_name}_{model}_modes.npy`**: 2D array of shape `(3N, M)`, where column `i` is the mass‑weighted eigenvector for mode `i` (matching the order of `frequencies`). These two NumPy files enable fast post‑hoc re‑writing of vectors/trajectories via `-w`.
615
615
 
616
616
  2. **Collectivity and Variance Contributions**
617
- - **`collectivity.csv`**: CSV with columns `Mode`, `Frequency (cm⁻¹)`, and `Collectivity`. Omitted with `‑‑no_collectivity`.
618
- - **`mode_contributions.png`**: Two‑panel figure showing (left) the proportion of total mean‑square fluctuation contributed by each of the first `‑‑max_modes` non‑rigid modes (proportional to `1/λ_k` under equipartition), and (right) the cumulative fraction. Omitted with `‑‑no_contributions`.
617
+ - **`collectivity.csv`**: CSV with columns `Mode`, `Frequency (cm⁻¹)`, and `Collectivity`. Omitted with `‑‑no-collectivity`.
618
+ - **`mode_contributions.png`**: Two‑panel figure showing (left) the proportion of total mean‑square fluctuation contributed by each of the first `‑‑max-modes` non‑rigid modes (proportional to `1/λ_k` under equipartition), and (right) the cumulative fraction. Omitted with `‑‑no-contributions`.
619
619
 
620
620
  3. **NMA‑Predicted RMSF and DCCM**
621
- - **`rmsf_plot.png`**: Residue‑averaged root‑mean‑square fluctuation (Å) derived from the harmonic approximation. The plot is based on the sum over modes of `(kBT/λ_k) * |u_i^(k)|² / m_i`. Omitted with `‑‑no_rmsf`.
621
+ - **`rmsf_plot.png`**: Residue‑averaged root‑mean‑square fluctuation (Å) derived from the harmonic approximation. The plot is based on the sum over modes of `(kBT/λ_k) * |u_i^(k)|² / m_i`. Omitted with `‑‑no-rmsf`.
622
622
  - **`dccm_plot.png`**: DCCM heatmap, diverging colormap (red = fully correlated, white = uncorrelated, blue = fully anti-correlated).
623
- - **`dccm_matrix.npy`**: Raw correlation matrix, saved alongside the plot. Both are omitted with `‑‑no_dccm`.
623
+ - **`dccm_matrix.npy`**: Raw correlation matrix, saved alongside the plot. Both are omitted with `‑‑no-dccm`.
624
624
 
625
625
  4. **Mode‑Specific Vector and Trajectory Files**
626
- - **`{base_name}_{model}_mode_{N}.xyz`**: XYZ‑formatted file listing the displacement vector for mode `N`. The header includes the mode frequency in cm⁻¹. Omitted with `‑‑no_nm_vec`.
627
- - **`{base_name}_{model}_mode_{N}_traj.pdb`**: Multi‑model PDB showing a smooth oscillation along mode `N`. The trajectory is mass‑weighted and scaled to a peak amplitude (default 4 Å). Omitted with `‑‑no_nm_trj`.
626
+ - **`{base_name}_{model}_mode_{N}.xyz`**: XYZ‑formatted file listing the displacement vector for mode `N`. The header includes the mode frequency in cm⁻¹. Omitted with `‑‑no-vec`.
627
+ - **`{base_name}_{model}_mode_{N}_traj.pdb`**: Multi‑model PDB showing a smooth oscillation along mode `N`. The trajectory is mass‑weighted and scaled to a peak amplitude (default 4 Å). Omitted with `‑‑no-trj`.
628
628
 
629
629
  **Note:** When using the post‑hoc mode re‑writer (`pyadmd enm -w "..." -o enm_output`), only the mode‑specific vector and trajectory files are newly written for the requested modes; all other files (core data, collectivity, plots) are left untouched and must already exist from a previous full ENM run.
630
630
 
@@ -636,17 +636,21 @@ The **`fel`** subcommand computes a free energy landscape (FEL) from a completed
636
636
 
637
637
  ## Method Overview
638
638
  1. **Merge trajectories**: all `rep*.dcd` replica trajectories are concatenated into a single pseudo-trajectory.
639
- 2. **GROMOS clustering**: frames are clustered by Cα RMSD (`-s`/`-c`); when the number of clusters exceeds `--max_centroids`, a maximally diverse subset is selected via greedy farthest-point (MaxMin) sampling on the cluster centroids.
640
- 3. **Centroid MD**: each centroid undergoes a 4-phase restrained de-excitation (`-d`, progressively decreasing positional restraints on backbone and sidechain heavy atoms) followed by unrestrained production MD (`-p`).
639
+ 2. **GROMOS clustering**: frames are clustered by Cα RMSD (`-s`/`-c`); when the number of clusters exceeds `--max-centroids`, a maximally diverse subset is selected via greedy farthest-point (MaxMin) sampling on the cluster centroids.
640
+ 3. **Centroid MD**: each centroid undergoes a 4-phase NVT restrained
641
+ de-excitation (`-d`, progressively decreasing positional restraints on
642
+ backbone and sidechain heavy atoms) followed by unrestrained NPT production
643
+ MD (`-p`). Each de-excitation phase is further split into a
644
+ 30%/20%/30%/20% pattern of nominal restraint / brief relief dip, where the dip targets a gentler restraint level rather than the nominal one, periodically releasing local strain due to the force constraints. If a centroid's de-excitation fails, it is automatically retried using an alternative member frame from the same cluster (up to 4 substitutes), and if all of those also fail, retried once more with a reinforced integrator ($`1 fs`$ timestep, $`5 ps^{-1}`$ friction, applied to de-excitation only) before the centroid is finally marked failed and excluded from the FEL.
641
645
  4. **Mode projection**: every production frame is projected onto each individual normal mode vector as a signed mass-weighted RMS displacement.
642
- 5. **FEL computation**: a population histogram (`-b` bins) is converted to $`\Delta G`$ via $`\Delta G = -k_{BT} \cdot ln[P(q)/P_{max}]`$, computed independently per mode (1D) and for user-specified mode pairs (2D, `--modes_2d`).
646
+ 5. **FEL computation**: a population histogram (`-b` bins) is converted to $`\Delta G`$ via $`\Delta G = -k_{BT} \cdot ln[P(q)/P_{max}]`$, computed independently per mode (1D) and for user-specified mode pairs (2D, `--modes-2d`).
643
647
 
644
648
  ## Extending a Previous Free Energy Calculation
645
- `fel` can be re-invoked on the same simulation with a larger `--max_centroids` and/or longer `-p`/`--production` to extend an earlier calculation, rather than starting over:
649
+ `fel` can be re-invoked on the same simulation with a larger `--max-centroids` and/or longer `-p`/`--production` to extend an earlier calculation, rather than starting over:
646
650
 
647
651
  - **Free to change**: `-c`/`--cutoff` and `-d`/`--deexcite`. Changing the cutoff only affects the re-thresholding of the cached pairwise-RMSD matrix. Changing the de-excitation length only affects newly-created centroids going forward; existing centroids keep whatever de-excitation they originally had and are simply extended in production.
648
652
  - **Must stay the same**: `-s`/`--sel`, `-T`/`--temp`. Mixing clustering selections or temperatures inside one pooled FEL is not physically valid.
649
- - **Never shrinks existing work**: if `--max_centroids` or `-p`/`--production` is *smaller* than the previous call, the program warns and uses the larger of the two values instead. We suggest start with smaller values and append more data, if necessary.
653
+ - **Never shrinks existing work**: if `--max-centroids` or `-p`/`--production` is *smaller* than the previous call, the program warns and uses the larger of the two values instead. We suggest start with smaller values and append more data, if necessary.
650
654
 
651
655
  ## Output Structure
652
656
  ### Directory Organization
@@ -671,9 +675,9 @@ fel/
671
675
 
672
676
  ## Output Files Description
673
677
  1. **Cache Files**
674
- - **`run_metadata.json`**: the clustering selection, temperature, cutoff, de-excitation length, `max_centroids`, and production length used.
678
+ - **`run_metadata.json`**: the clustering selection, temperature, cutoff, de-excitation length, `max-centroids`, and production length used.
675
679
  - **`clustering_rmsd_cache.npz`/`.json`**: the pairwise-RMSD matrix over subsampled frames.
676
- - **`clustering_summary.csv`**: summary containing cluster ID, frame index, cluster size, status this run (fresh/extended/skipped), and cycles/ps completed.
680
+ - **`clustering_summary.csv`**: summary containing cluster ID, frame index, cluster size, status this run (`fresh`/`extended`/`skipped`/`failed`, annotated with `substitute frame {N}` and/or `reinforced` when a centroid needed those fallbacks), `source_frame_used` (the frame whose coordinates actually produced a successful run — equal to `centroid_frame` unless a substitute member was used), `md_attempts` (total attempts across the standard and reinforced passes), and cycles/ps completed. A `status` of `failed` means every attempt (original frame + substitutes, standard + reinforced settings) failed; that centroid is excluded from the FEL rather than blocking the run.
677
681
  2. **Plot Files**
678
682
  - **`fel_mode[N].csv`/`fel_mode[N]_plot.png`**: 1D free energy landscape per mode, in Å and kcal/mol.
679
683
  - **`fel_2d_mode[N]_mode[M].png`**: 2D free energy landscape for a mode pair.
@@ -751,31 +755,31 @@ When `-src fel` is used, the shared production time axis (applied uniformly acro
751
755
  ```
752
756
  analysis/{fel/}
753
757
  ├── analysis_results.csv # Combined analysis data from all units
754
- ├── rmsf.csv # Combined RMSF data (omitted with --no_rmsf)
758
+ ├── rmsf.csv # Combined RMSF data (omitted with --no-rmsf)
755
759
  ├── analysis_summary.html # HTML summary report
756
- ├── rmsd_plot.png # RMSD plot (omitted with --no_rmsd)
757
- ├── radius_gyration_plot.png # Radius of gyration plot (omitted with --no_rg)
758
- ├── sasa_plot.png # SASA plot (omitted with --no_sasa)
759
- ├── hydrophobic_exposure_plot.png # Hydrophobic exposure plot (omitted with --no_sasa)
760
- ├── rmsf_average.png # Average RMSF plot (omitted with --no_rmsf)
761
- ├── secondary_structure_average.png # Average secondary structure plot (omitted with --no_dssp)
762
- ├── dccm_average.png # Average DCCM heatmap (omitted with --no_dccm)
763
- ├── dccm_average.npy # Average DCCM matrix, raw (omitted with --no_dccm)
764
- ├── lmi_average.png # Average LMI heatmap (omitted with --no_lmi)
765
- ├── lmi_average.npy # Average LMI matrix, raw (omitted with --no_lmi)
760
+ ├── rmsd_plot.png # RMSD plot (omitted with --no-rmsd)
761
+ ├── radius_gyration_plot.png # Radius of gyration plot (omitted with --no-rg)
762
+ ├── sasa_plot.png # SASA plot (omitted with --no-sasa)
763
+ ├── hydrophobic_exposure_plot.png # Hydrophobic exposure plot (omitted with --no-sasa)
764
+ ├── rmsf_average.png # Average RMSF plot (omitted with --no-rmsf)
765
+ ├── secondary_structure_average.png # Average secondary structure plot (omitted with --no-dssp)
766
+ ├── dccm_average.png # Average DCCM heatmap (omitted with --no-dccm)
767
+ ├── dccm_average.npy # Average DCCM matrix, raw (omitted with --no-dccm)
768
+ ├── lmi_average.png # Average LMI heatmap (omitted with --no-lmi)
769
+ ├── lmi_average.npy # Average LMI matrix, raw (omitted with --no-lmi)
766
770
  └── {rep[1-N]}/ or {centroid_frame[F]}/ # Unit-specific directories
767
771
  ├── analysis_results.csv # Unit-specific analysis data
768
- ├── rmsf.csv # Unit-specific RMSF data (omitted with --no_rmsf)
769
- ├── rmsd_plot.png # Unit-specific RMSD plot (omitted with --no_rmsd)
770
- ├── radius_gyration_plot.png # Unit-specific RoG plot (omitted with --no_rg)
771
- ├── sasa_plot.png # Unit-specific SASA plot (omitted with --no_sasa)
772
- ├── hydrophobic_exposure_plot.png # Unit-specific hydrophobic exposure plot (omitted with --no_sasa)
773
- ├── rmsf_plot.png # Unit-specific RMSF plot (omitted with --no_rmsf)
774
- ├── secondary_structure.png # Unit-specific secondary structure plot (omitted with --no_dssp)
775
- ├── dccm_matrix.npy # Unit-specific DCCM matrix, raw (omitted with --no_dccm)
776
- ├── dccm_plot.png # Unit-specific DCCM heatmap (omitted with --no_dccm)
777
- ├── lmi_matrix.npy # Unit-specific LMI matrix, raw (omitted with --no_lmi)
778
- └── lmi_plot.png # Unit-specific LMI heatmap (omitted with --no_lmi)
772
+ ├── rmsf.csv # Unit-specific RMSF data (omitted with --no-rmsf)
773
+ ├── rmsd_plot.png # Unit-specific RMSD plot (omitted with --no-rmsd)
774
+ ├── radius_gyration_plot.png # Unit-specific RoG plot (omitted with --no-rg)
775
+ ├── sasa_plot.png # Unit-specific SASA plot (omitted with --no-sasa)
776
+ ├── hydrophobic_exposure_plot.png # Unit-specific hydrophobic exposure plot (omitted with --no-sasa)
777
+ ├── rmsf_plot.png # Unit-specific RMSF plot (omitted with --no-rmsf)
778
+ ├── secondary_structure.png # Unit-specific secondary structure plot (omitted with --no-dssp)
779
+ ├── dccm_matrix.npy # Unit-specific DCCM matrix, raw (omitted with --no-dccm)
780
+ ├── dccm_plot.png # Unit-specific DCCM heatmap (omitted with --no-dccm)
781
+ ├── lmi_matrix.npy # Unit-specific LMI matrix, raw (omitted with --no-lmi)
782
+ └── lmi_plot.png # Unit-specific LMI heatmap (omitted with --no-lmi)
779
783
  ```
780
784
  **Note:** With `-src fel`, the same set of files is written under `analysis/fel/` instead, with one subdirectory per centroid (named by frame index, mirroring `fel/centroids/centroid_frame[F]/`) in place of `rep[1-N]/`.
781
785
 
@@ -790,9 +794,9 @@ analysis/{fel/}
790
794
  - Average plots across all units
791
795
 
792
796
  3. **Correlation Matrix Files**
793
- - **`dccm_matrix.npy`** (per-unit) / **`dccm_average.npy`** (cross-unit): raw (n_Cα × n_Cα) DCCM matrix, values in [-1, 1]. Omitted with `--no_dccm`.
797
+ - **`dccm_matrix.npy`** (per-unit) / **`dccm_average.npy`** (cross-unit): raw (n_Cα × n_Cα) DCCM matrix, values in [-1, 1]. Omitted with `--no-dccm`.
794
798
  - **`dccm_plot.png`** / **`dccm_average.png`**: DCCM heatmap, diverging colormap (red = fully correlated, white = uncorrelated, blue = fully anti-correlated).
795
- - **`lmi_matrix.npy`** / **`lmi_average.npy`**: raw (n_Cα × n_Cα) LMI matrix, values in [0, 1]. Omitted with `--no_lmi`.
799
+ - **`lmi_matrix.npy`** / **`lmi_average.npy`**: raw (n_Cα × n_Cα) LMI matrix, values in [0, 1]. Omitted with `--no-lmi`.
796
800
  - **`lmi_plot.png`** / **`lmi_average.png`**: LMI heatmap, sequential colormap (LMI has no sign).
797
801
 
798
802
  4. **HTML Summary**
@@ -850,7 +854,7 @@ pyadmd run -src NAMD \
850
854
  -vel tutorial/system.vel \
851
855
  -xsc tutorial/system.xsc \
852
856
  -str tutorial/system.str \
853
- --no_correc
857
+ --no-correc
854
858
  ```
855
859
  ## Restart unfinished pyAdMD simulations
856
860
  ```
@@ -866,7 +870,7 @@ pyadmd analyze
866
870
  ```
867
871
  ## Analyze every 5 ps skipping DSSP and LMI
868
872
  ```
869
- pyadmd analyze -r --no_dssp --no_lmi
873
+ pyadmd analyze -r --no-dssp --no-lmi
870
874
  ```
871
875
  ## Compute a free energy landscape
872
876
  ```
@@ -874,7 +878,7 @@ pyadmd fel -c 2 -p 100
874
878
  ```
875
879
  ## Extend a previous free energy calculation with more centroids and production time
876
880
  ```
877
- pyadmd fel -c 2 -p 500 --max_centroids 100
881
+ pyadmd fel -c 2 -p 500 --max-centroids 100
878
882
  ```
879
883
  ## Compute a standalone ENM (Cα model, writing modes 7-16)
880
884
  ```
@@ -356,7 +356,7 @@ $$
356
356
 
357
357
  where $`\mathbf{M}_{\mathrm{nm}}^+`$ denotes the Moore–Penrose pseudoinverse of $`\mathbf{M}_{\mathrm{nm}}`$. These approximate coefficients are written to the `factors.csv` output file for reference but do not influence the simulation; the physical vectors $`\mathbf{q}_i`$ are used directly as excitation directions.
358
358
 
359
- **Reproducibility:** the only stochastic step in this procedure is the initial placement of the $`P`$ points on $`S^{N-1}`$ before the repulsion loop runs (skipped entirely when $`P=2N`$, see above). This is now controlled by a seeded RNG (`-seed`/`--seed`, default `42`), so `pyadmd run` calls with identical arguments produce identical excitation vectors and `factors.csv` — see [Run Parameters](#parameters).
359
+ **Reproducibility:** the only stochastic step in this procedure is the initial placement of the $`P`$ points on $`S^{N-1}`$ before the repulsion loop runs (skipped entirely when $`P=2N`$, see above). This is controlled by a seeded RNG (`-seed`/`--seed`, default `42`), so `pyadmd run` calls with identical arguments produce identical excitation vectors and `factors.csv` — see [Run Parameters](#parameters).
360
360
 
361
361
  **Note:** ENM recomputation under `--recalc` (see [Excitation Direction Update](#excitation-direction-update)) draws a *new* random combination each time it fires and is intentionally **not** covered by `--seed`, since its purpose is to re-diversify the excitation direction mid-simulation.
362
362
 
@@ -474,7 +474,7 @@ below into it.
474
474
  - **`-rst`/`--rstfile`**: OpenMM XML restart file (`.rst`), written via `XmlSerializer.serialize(state)` from a state built with `getPositions=True, getVelocities=True`
475
475
 
476
476
  ### Feature Flags
477
- - **`-n`/`--no_correc`**: Disable excitation vector direction correction and compute standard MDeNM
477
+ - **`-n`/`--no-correc`**: Disable excitation vector direction correction and compute standard MDeNM
478
478
 
479
479
  - **`-f`/`--fixed`**: Disable excitation vector correction and keep constant excitation energy injections
480
480
 
@@ -489,15 +489,15 @@ below into it.
489
489
  ## Free Energy
490
490
  All parameters are optional; the `fel` subcommand reads its input trajectories and reference state from files already produced by `run`/`restart`/`append`, so no additional files need to be supplied.
491
491
 
492
- - **`-c`/`--cutoff`**: GROMOS RMSD clustering cutoff, in Å (**optional**. Default: **`0.8`**)
492
+ - **`-c`/`--cutoff`**: GROMOS RMSD clustering cutoff, in Å (**optional**. Default: **`1.0`**)
493
493
  - **`-d`/`--deexcite`**: Total restrained de-excitation MD length per centroid, in ps, split evenly over 4 restraint phases (**optional**. Default: **`200`**)
494
494
  - **`-p`/`--production`**: Unrestrained production MD length per centroid, in ps (**optional**. Default: **`800`**)
495
495
  - **`-nm`/`--modes`**: Comma-separated mode indices to project for the FEL (**optional**. Default: same modes used in `run`, *e.g.* `7,8,9`)
496
- - **`--modes_2d`**: Mode pairs for 2D FEL plots, as space-separated `"m1,m2"` tokens, *e.g.* `"7,8 7,9 8,9"` (**optional**. Default: all pairwise combinations of `--modes`)
497
- - **`-b`/`--bins`**: Number of histogram bins used for the FEL (**optional**. Default: **`50`**)
496
+ - **`--modes-2d`**: Mode pairs for 2D FEL plots, as space-separated `"m1,m2"` tokens (**optional**. Default: all pairwise combinations of --modes, *e.g.* "7,8 7,9 8,9")
497
+ - **`-b`/`--bins`**: Number of histogram bins used for the FEL (**optional**. Default: **`100`**)
498
498
  - **`-T`/`--temp`**: Temperature for k<sub>B</sub>T scaling and the production ensemble, in K (**optional**. Default: **`303.15`**)
499
499
  - **`-s`/`--sel`**: MDAnalysis selection string used for GROMOS RMSD clustering (**optional**. Default: **`"protein and name CA"`**)
500
- - **`--max_centroids`**: Maximum number of centroids submitted to MD. When the cluster count exceeds this value, exactly this many centroids are selected by greedy farthest-point (MaxMin) sampling to maximize conformational diversity (**optional**. Default: **`50`**)
500
+ - **`--max-centroids`**: Maximum number of centroids submitted to MD. When the cluster count exceeds this value, exactly this many centroids are selected by greedy farthest-point (MaxMin) sampling to maximize conformational diversity (**optional**. Default: **`50`**)
501
501
 
502
502
  **Note:** `-s`/`--sel` and `-T`/`--temp` must stay the same across repeated `fel` calls on the same simulation — see [Extending a Previous Free Energy Calculation](#extending-a-previous-free-energy-calculation). This `-s`/`--sel` selection is independent of `run`'s `-sel`/`--selection`: it controls GROMOS clustering only, while `run`'s selection controls both energy injection and (by default) the scope of most `pyadmd analyze` metrics — see [Analysis Selection Scope](#analysis-selection-scope).
503
503
 
@@ -511,19 +511,19 @@ All parameters are optional; the `fel` subcommand reads its input trajectories a
511
511
  ### Skip Flags
512
512
  Each analysis step can be independently disabled. When skipped, that metric will not appear in any CSV, plot, or HTML summary output.
513
513
 
514
- - **`--no_rmsd`**: Skip RMSD calculation
515
- - **`--no_rg`**: Skip radius of gyration calculation
516
- - **`--no_sasa`**: Skip SASA and hydrophobic exposure calculation
517
- - **`--no_rmsf`**: Skip RMSF calculation
518
- - **`--no_dssp`**: Skip secondary structure analysis via DSSP
519
- - **`--no_dccm`**: Skip DCCM (dynamic cross-correlation matrix) calculation
520
- - **`--no_lmi`**: Skip LMI (Linear Mutual Information) calculation
514
+ - **`--no-rmsd`**: Skip RMSD calculation
515
+ - **`--no-rg`**: Skip radius of gyration calculation
516
+ - **`--no-sasa`**: Skip SASA and hydrophobic exposure calculation
517
+ - **`--no-rmsf`**: Skip RMSF calculation
518
+ - **`--no-dssp`**: Skip secondary structure analysis via DSSP
519
+ - **`--no-dccm`**: Skip DCCM (dynamic cross-correlation matrix) calculation
520
+ - **`--no-lmi`**: Skip LMI (Linear Mutual Information) calculation
521
521
 
522
522
  **Note:** Before analysis, the program checks if `pyadmd` or `fel` calls are properly completed. If any unit (pyAdMD replica or free energy centroid) hasn't finished running, `analyze` prints a warning listing the incomplete units and their cycles completed/target, but proceeds anyway — see [Handling Incomplete Units](#handling-incomplete-units) below.
523
523
 
524
524
  ## ENM
525
525
  ### Parameters
526
- - **`-i`/`--input`**: Input PDB file (**required**, unless **`-w`/`--write_modes`** is used)
526
+ - **`-i`/`--input`**: Input PDB file (**required**, unless **`-w`/`--write-modes`** is used)
527
527
 
528
528
  - **`-o`/`--output`**: Output folder name (**optional**. Default: **`output`**)
529
529
 
@@ -533,25 +533,25 @@ Each analysis step can be independently disabled. When skipped, that metric will
533
533
 
534
534
  - **`-c`/`--cutoff`**: Interaction cutoff distance, in Å (**optional**. Default: **`15.0`** for CA, **`12.0`** for HEAVY)
535
535
 
536
- - **`-k`/`--spring_constant`**: ENM harmonic spring constant, in kcal/mol/Ų (**optional**. Default: **`1.0`**)
536
+ - **`-k`/`--spring-constant`**: ENM harmonic spring constant, in kcal/mol/Ų (**optional**. Default: **`1.0`**)
537
537
 
538
- - **`--max_modes`**: Number of non-rigid-body vibrational modes to compute (**optional**. Default: **`50`**)
538
+ - **`--max-modes`**: Number of non-rigid-body vibrational modes to compute (**optional**. Default: **`50`**)
539
539
 
540
- - **`--output_modes`**: Number of modes (file-labeled 1 through N, where label 1 is the first non-rigid mode) to write vectors/trajectories for (**optional**. Default: **`10`**)
540
+ - **`--output-modes`**: Number of modes (file-labeled 1 through N, where label 1 is the first non-rigid mode) to write vectors/trajectories for (**optional**. Default: **`10`**)
541
541
 
542
542
  ### Skip Flags
543
543
  Collectivity, contributions, RMSF, DCCM, and mode vector/trajectory writing can each be independently disabled:
544
544
 
545
- - **`--no_nm_vec`**: Skip writing mode vectors (`.xyz`)
546
- - **`--no_nm_trj`**: Skip writing mode trajectories (`_traj.pdb`)
547
- - **`--no_collectivity`**: Skip mode collectivity calculation
548
- - **`--no_contributions`**: Skip the variance-contributions plot
549
- - **`--no_rmsf`**: Skip the NMA-predicted RMSF plot (analytical, from the harmonic approximation — not derived from an MD trajectory; see [Analysis](#analysis-1) for the trajectory-based RMSF computed elsewhere in the package)
550
- - **`--no_dccm`**: Skip the NMA-predicted DCCM plot (same analytical distinction as RMSF above)
551
- - **`--no_gpu`**: Disable GPU acceleration
545
+ - **`--no-vec`**: Skip writing mode vectors (`.xyz`)
546
+ - **`--no-trj`**: Skip writing mode trajectories (`_traj.pdb`)
547
+ - **`--no-collectivity`**: Skip mode collectivity calculation
548
+ - **`--no-contributions`**: Skip the variance-contributions plot
549
+ - **`--no-rmsf`**: Skip the NMA-predicted RMSF plot (analytical, from the harmonic approximation — not derived from an MD trajectory; see [Analysis](#analysis-1) for the trajectory-based RMSF computed elsewhere in the package)
550
+ - **`--no-dccm`**: Skip the NMA-predicted DCCM plot (same analytical distinction as RMSF above)
551
+ - **`--no-gpu`**: Disable GPU acceleration
552
552
 
553
553
  ### Post-hoc Mode Re-writer
554
- - **`-w`/`--write_modes`**: Write mode vectors/trajectories from a previously completed `enm` run's saved `*_modes.npy`/`*_frequencies.npy`/structure PDB, without recomputing the ENM. Accepts comma-separated integers and inclusive ranges (`start:end`), *e.g.* `"26,41"`, `"7:10"`, `"42,44:50"`. Requires **`-o`/`--output`** pointing to an existing `enm` output directory.
554
+ - **`-w`/`--write-modes`**: Write mode vectors/trajectories from a previously completed `enm` run's saved `*_modes.npy`/`*_frequencies.npy`/structure PDB, without recomputing the ENM. Accepts comma-separated integers and inclusive ranges (`start:end`), *e.g.* `"26,41"`, `"7:10"`, `"42,44:50"`. Requires **`-o`/`--output`** pointing to an existing `enm` output directory.
555
555
 
556
556
  **Note on mode-file resolution:** `pyadmd enm`'s mode vector/trajectory files (`_mode_{N}.xyz`/`_mode_{N}_traj.pdb`) are written at the ENM's **native reduced resolution** (Cα-only or heavy-atom only, matching whatever the modes were computed on).
557
557
 
@@ -562,21 +562,21 @@ enm_output/
562
562
  ├── {base_name}_{model}_structure.pdb # reduced‑resolution structure (Cα or heavy atoms)
563
563
  ├── {base_name}_{model}_frequencies.npy # vibrational frequencies (filtered, non‑rigid modes)
564
564
  ├── {base_name}_{model}_modes.npy # eigenvector matrix (filtered, non‑rigid modes)
565
- ├── collectivity.csv # per‑mode collectivity (κ) and frequency (cm⁻¹) (omitted with --no_collectivity)
566
- ├── mode_contributions.png # per‑mode and cumulative variance contributions (omitted with --no_contributions)
567
- ├── rmsf_plot.png # NMA‑predicted residue RMSF (harmonic approximation) (omitted with --no_rmsf)
568
- ├── dccm_plot.png # NMA‑predicted residue cross‑correlation matrix (omitted with --no_dccm)
569
- ├── dccm_matrix.npy # raw NMA‑DCCM matrix (omitted with --no_dccm)
570
- ├── {base_name}_{model}_mode_{N}.xyz # displacement vector of mode N (XYZ format) (omitted with --no_nm_vec)
571
- └── {base_name}_{model}_mode_{N}_traj.pdb # oscillatory PDB trajectory along mode N (multi‑model) (omitted with --no_nm_trj)
565
+ ├── collectivity.csv # per‑mode collectivity (κ) and frequency (cm⁻¹) (omitted with --no-collectivity)
566
+ ├── mode_contributions.png # per‑mode and cumulative variance contributions (omitted with --no-contributions)
567
+ ├── rmsf_plot.png # NMA‑predicted residue RMSF (harmonic approximation) (omitted with --no-rmsf)
568
+ ├── dccm_plot.png # NMA‑predicted residue cross‑correlation matrix (omitted with --no-dccm)
569
+ ├── dccm_matrix.npy # raw NMA‑DCCM matrix (omitted with --no-dccm)
570
+ ├── {base_name}_{model}_mode_{N}.xyz # displacement vector of mode N (XYZ format) (omitted with --no-vec)
571
+ └── {base_name}_{model}_mode_{N}_traj.pdb # oscillatory PDB trajectory along mode N (multi‑model) (omitted with --no-trj)
572
572
  ```
573
573
 
574
574
 
575
575
  **Notes:**
576
576
  - `{base_name}` is the stem of the input PDB file (e.g., `system`).
577
577
  - `{model}` is either `ca` (Cα‑only) or `heavy` (heavy atoms).
578
- - The mode vector and trajectory files are written only for the modes specified by `‑‑output_modes` (default: first 10 non‑rigid modes).
579
- - The `-w` / `‑‑write_modes` option re‑uses an existing output directory to write **additional** mode files (vectors/trajectories) without recomputing the ENM.
578
+ - The mode vector and trajectory files are written only for the modes specified by `‑‑output-modes` (default: first 10 non‑rigid modes).
579
+ - The `-w` / `‑‑write-modes` option re‑uses an existing output directory to write **additional** mode files (vectors/trajectories) without recomputing the ENM.
580
580
 
581
581
  ### Output Files Description
582
582
 
@@ -586,17 +586,17 @@ enm_output/
586
586
  - **`{base_name}_{model}_modes.npy`**: 2D array of shape `(3N, M)`, where column `i` is the mass‑weighted eigenvector for mode `i` (matching the order of `frequencies`). These two NumPy files enable fast post‑hoc re‑writing of vectors/trajectories via `-w`.
587
587
 
588
588
  2. **Collectivity and Variance Contributions**
589
- - **`collectivity.csv`**: CSV with columns `Mode`, `Frequency (cm⁻¹)`, and `Collectivity`. Omitted with `‑‑no_collectivity`.
590
- - **`mode_contributions.png`**: Two‑panel figure showing (left) the proportion of total mean‑square fluctuation contributed by each of the first `‑‑max_modes` non‑rigid modes (proportional to `1/λ_k` under equipartition), and (right) the cumulative fraction. Omitted with `‑‑no_contributions`.
589
+ - **`collectivity.csv`**: CSV with columns `Mode`, `Frequency (cm⁻¹)`, and `Collectivity`. Omitted with `‑‑no-collectivity`.
590
+ - **`mode_contributions.png`**: Two‑panel figure showing (left) the proportion of total mean‑square fluctuation contributed by each of the first `‑‑max-modes` non‑rigid modes (proportional to `1/λ_k` under equipartition), and (right) the cumulative fraction. Omitted with `‑‑no-contributions`.
591
591
 
592
592
  3. **NMA‑Predicted RMSF and DCCM**
593
- - **`rmsf_plot.png`**: Residue‑averaged root‑mean‑square fluctuation (Å) derived from the harmonic approximation. The plot is based on the sum over modes of `(kBT/λ_k) * |u_i^(k)|² / m_i`. Omitted with `‑‑no_rmsf`.
593
+ - **`rmsf_plot.png`**: Residue‑averaged root‑mean‑square fluctuation (Å) derived from the harmonic approximation. The plot is based on the sum over modes of `(kBT/λ_k) * |u_i^(k)|² / m_i`. Omitted with `‑‑no-rmsf`.
594
594
  - **`dccm_plot.png`**: DCCM heatmap, diverging colormap (red = fully correlated, white = uncorrelated, blue = fully anti-correlated).
595
- - **`dccm_matrix.npy`**: Raw correlation matrix, saved alongside the plot. Both are omitted with `‑‑no_dccm`.
595
+ - **`dccm_matrix.npy`**: Raw correlation matrix, saved alongside the plot. Both are omitted with `‑‑no-dccm`.
596
596
 
597
597
  4. **Mode‑Specific Vector and Trajectory Files**
598
- - **`{base_name}_{model}_mode_{N}.xyz`**: XYZ‑formatted file listing the displacement vector for mode `N`. The header includes the mode frequency in cm⁻¹. Omitted with `‑‑no_nm_vec`.
599
- - **`{base_name}_{model}_mode_{N}_traj.pdb`**: Multi‑model PDB showing a smooth oscillation along mode `N`. The trajectory is mass‑weighted and scaled to a peak amplitude (default 4 Å). Omitted with `‑‑no_nm_trj`.
598
+ - **`{base_name}_{model}_mode_{N}.xyz`**: XYZ‑formatted file listing the displacement vector for mode `N`. The header includes the mode frequency in cm⁻¹. Omitted with `‑‑no-vec`.
599
+ - **`{base_name}_{model}_mode_{N}_traj.pdb`**: Multi‑model PDB showing a smooth oscillation along mode `N`. The trajectory is mass‑weighted and scaled to a peak amplitude (default 4 Å). Omitted with `‑‑no-trj`.
600
600
 
601
601
  **Note:** When using the post‑hoc mode re‑writer (`pyadmd enm -w "..." -o enm_output`), only the mode‑specific vector and trajectory files are newly written for the requested modes; all other files (core data, collectivity, plots) are left untouched and must already exist from a previous full ENM run.
602
602
 
@@ -608,17 +608,21 @@ The **`fel`** subcommand computes a free energy landscape (FEL) from a completed
608
608
 
609
609
  ## Method Overview
610
610
  1. **Merge trajectories**: all `rep*.dcd` replica trajectories are concatenated into a single pseudo-trajectory.
611
- 2. **GROMOS clustering**: frames are clustered by Cα RMSD (`-s`/`-c`); when the number of clusters exceeds `--max_centroids`, a maximally diverse subset is selected via greedy farthest-point (MaxMin) sampling on the cluster centroids.
612
- 3. **Centroid MD**: each centroid undergoes a 4-phase restrained de-excitation (`-d`, progressively decreasing positional restraints on backbone and sidechain heavy atoms) followed by unrestrained production MD (`-p`).
611
+ 2. **GROMOS clustering**: frames are clustered by Cα RMSD (`-s`/`-c`); when the number of clusters exceeds `--max-centroids`, a maximally diverse subset is selected via greedy farthest-point (MaxMin) sampling on the cluster centroids.
612
+ 3. **Centroid MD**: each centroid undergoes a 4-phase NVT restrained
613
+ de-excitation (`-d`, progressively decreasing positional restraints on
614
+ backbone and sidechain heavy atoms) followed by unrestrained NPT production
615
+ MD (`-p`). Each de-excitation phase is further split into a
616
+ 30%/20%/30%/20% pattern of nominal restraint / brief relief dip, where the dip targets a gentler restraint level rather than the nominal one, periodically releasing local strain due to the force constraints. If a centroid's de-excitation fails, it is automatically retried using an alternative member frame from the same cluster (up to 4 substitutes), and if all of those also fail, retried once more with a reinforced integrator ($`1 fs`$ timestep, $`5 ps^{-1}`$ friction, applied to de-excitation only) before the centroid is finally marked failed and excluded from the FEL.
613
617
  4. **Mode projection**: every production frame is projected onto each individual normal mode vector as a signed mass-weighted RMS displacement.
614
- 5. **FEL computation**: a population histogram (`-b` bins) is converted to $`\Delta G`$ via $`\Delta G = -k_{BT} \cdot ln[P(q)/P_{max}]`$, computed independently per mode (1D) and for user-specified mode pairs (2D, `--modes_2d`).
618
+ 5. **FEL computation**: a population histogram (`-b` bins) is converted to $`\Delta G`$ via $`\Delta G = -k_{BT} \cdot ln[P(q)/P_{max}]`$, computed independently per mode (1D) and for user-specified mode pairs (2D, `--modes-2d`).
615
619
 
616
620
  ## Extending a Previous Free Energy Calculation
617
- `fel` can be re-invoked on the same simulation with a larger `--max_centroids` and/or longer `-p`/`--production` to extend an earlier calculation, rather than starting over:
621
+ `fel` can be re-invoked on the same simulation with a larger `--max-centroids` and/or longer `-p`/`--production` to extend an earlier calculation, rather than starting over:
618
622
 
619
623
  - **Free to change**: `-c`/`--cutoff` and `-d`/`--deexcite`. Changing the cutoff only affects the re-thresholding of the cached pairwise-RMSD matrix. Changing the de-excitation length only affects newly-created centroids going forward; existing centroids keep whatever de-excitation they originally had and are simply extended in production.
620
624
  - **Must stay the same**: `-s`/`--sel`, `-T`/`--temp`. Mixing clustering selections or temperatures inside one pooled FEL is not physically valid.
621
- - **Never shrinks existing work**: if `--max_centroids` or `-p`/`--production` is *smaller* than the previous call, the program warns and uses the larger of the two values instead. We suggest start with smaller values and append more data, if necessary.
625
+ - **Never shrinks existing work**: if `--max-centroids` or `-p`/`--production` is *smaller* than the previous call, the program warns and uses the larger of the two values instead. We suggest start with smaller values and append more data, if necessary.
622
626
 
623
627
  ## Output Structure
624
628
  ### Directory Organization
@@ -643,9 +647,9 @@ fel/
643
647
 
644
648
  ## Output Files Description
645
649
  1. **Cache Files**
646
- - **`run_metadata.json`**: the clustering selection, temperature, cutoff, de-excitation length, `max_centroids`, and production length used.
650
+ - **`run_metadata.json`**: the clustering selection, temperature, cutoff, de-excitation length, `max-centroids`, and production length used.
647
651
  - **`clustering_rmsd_cache.npz`/`.json`**: the pairwise-RMSD matrix over subsampled frames.
648
- - **`clustering_summary.csv`**: summary containing cluster ID, frame index, cluster size, status this run (fresh/extended/skipped), and cycles/ps completed.
652
+ - **`clustering_summary.csv`**: summary containing cluster ID, frame index, cluster size, status this run (`fresh`/`extended`/`skipped`/`failed`, annotated with `substitute frame {N}` and/or `reinforced` when a centroid needed those fallbacks), `source_frame_used` (the frame whose coordinates actually produced a successful run — equal to `centroid_frame` unless a substitute member was used), `md_attempts` (total attempts across the standard and reinforced passes), and cycles/ps completed. A `status` of `failed` means every attempt (original frame + substitutes, standard + reinforced settings) failed; that centroid is excluded from the FEL rather than blocking the run.
649
653
  2. **Plot Files**
650
654
  - **`fel_mode[N].csv`/`fel_mode[N]_plot.png`**: 1D free energy landscape per mode, in Å and kcal/mol.
651
655
  - **`fel_2d_mode[N]_mode[M].png`**: 2D free energy landscape for a mode pair.
@@ -723,31 +727,31 @@ When `-src fel` is used, the shared production time axis (applied uniformly acro
723
727
  ```
724
728
  analysis/{fel/}
725
729
  ├── analysis_results.csv # Combined analysis data from all units
726
- ├── rmsf.csv # Combined RMSF data (omitted with --no_rmsf)
730
+ ├── rmsf.csv # Combined RMSF data (omitted with --no-rmsf)
727
731
  ├── analysis_summary.html # HTML summary report
728
- ├── rmsd_plot.png # RMSD plot (omitted with --no_rmsd)
729
- ├── radius_gyration_plot.png # Radius of gyration plot (omitted with --no_rg)
730
- ├── sasa_plot.png # SASA plot (omitted with --no_sasa)
731
- ├── hydrophobic_exposure_plot.png # Hydrophobic exposure plot (omitted with --no_sasa)
732
- ├── rmsf_average.png # Average RMSF plot (omitted with --no_rmsf)
733
- ├── secondary_structure_average.png # Average secondary structure plot (omitted with --no_dssp)
734
- ├── dccm_average.png # Average DCCM heatmap (omitted with --no_dccm)
735
- ├── dccm_average.npy # Average DCCM matrix, raw (omitted with --no_dccm)
736
- ├── lmi_average.png # Average LMI heatmap (omitted with --no_lmi)
737
- ├── lmi_average.npy # Average LMI matrix, raw (omitted with --no_lmi)
732
+ ├── rmsd_plot.png # RMSD plot (omitted with --no-rmsd)
733
+ ├── radius_gyration_plot.png # Radius of gyration plot (omitted with --no-rg)
734
+ ├── sasa_plot.png # SASA plot (omitted with --no-sasa)
735
+ ├── hydrophobic_exposure_plot.png # Hydrophobic exposure plot (omitted with --no-sasa)
736
+ ├── rmsf_average.png # Average RMSF plot (omitted with --no-rmsf)
737
+ ├── secondary_structure_average.png # Average secondary structure plot (omitted with --no-dssp)
738
+ ├── dccm_average.png # Average DCCM heatmap (omitted with --no-dccm)
739
+ ├── dccm_average.npy # Average DCCM matrix, raw (omitted with --no-dccm)
740
+ ├── lmi_average.png # Average LMI heatmap (omitted with --no-lmi)
741
+ ├── lmi_average.npy # Average LMI matrix, raw (omitted with --no-lmi)
738
742
  └── {rep[1-N]}/ or {centroid_frame[F]}/ # Unit-specific directories
739
743
  ├── analysis_results.csv # Unit-specific analysis data
740
- ├── rmsf.csv # Unit-specific RMSF data (omitted with --no_rmsf)
741
- ├── rmsd_plot.png # Unit-specific RMSD plot (omitted with --no_rmsd)
742
- ├── radius_gyration_plot.png # Unit-specific RoG plot (omitted with --no_rg)
743
- ├── sasa_plot.png # Unit-specific SASA plot (omitted with --no_sasa)
744
- ├── hydrophobic_exposure_plot.png # Unit-specific hydrophobic exposure plot (omitted with --no_sasa)
745
- ├── rmsf_plot.png # Unit-specific RMSF plot (omitted with --no_rmsf)
746
- ├── secondary_structure.png # Unit-specific secondary structure plot (omitted with --no_dssp)
747
- ├── dccm_matrix.npy # Unit-specific DCCM matrix, raw (omitted with --no_dccm)
748
- ├── dccm_plot.png # Unit-specific DCCM heatmap (omitted with --no_dccm)
749
- ├── lmi_matrix.npy # Unit-specific LMI matrix, raw (omitted with --no_lmi)
750
- └── lmi_plot.png # Unit-specific LMI heatmap (omitted with --no_lmi)
744
+ ├── rmsf.csv # Unit-specific RMSF data (omitted with --no-rmsf)
745
+ ├── rmsd_plot.png # Unit-specific RMSD plot (omitted with --no-rmsd)
746
+ ├── radius_gyration_plot.png # Unit-specific RoG plot (omitted with --no-rg)
747
+ ├── sasa_plot.png # Unit-specific SASA plot (omitted with --no-sasa)
748
+ ├── hydrophobic_exposure_plot.png # Unit-specific hydrophobic exposure plot (omitted with --no-sasa)
749
+ ├── rmsf_plot.png # Unit-specific RMSF plot (omitted with --no-rmsf)
750
+ ├── secondary_structure.png # Unit-specific secondary structure plot (omitted with --no-dssp)
751
+ ├── dccm_matrix.npy # Unit-specific DCCM matrix, raw (omitted with --no-dccm)
752
+ ├── dccm_plot.png # Unit-specific DCCM heatmap (omitted with --no-dccm)
753
+ ├── lmi_matrix.npy # Unit-specific LMI matrix, raw (omitted with --no-lmi)
754
+ └── lmi_plot.png # Unit-specific LMI heatmap (omitted with --no-lmi)
751
755
  ```
752
756
  **Note:** With `-src fel`, the same set of files is written under `analysis/fel/` instead, with one subdirectory per centroid (named by frame index, mirroring `fel/centroids/centroid_frame[F]/`) in place of `rep[1-N]/`.
753
757
 
@@ -762,9 +766,9 @@ analysis/{fel/}
762
766
  - Average plots across all units
763
767
 
764
768
  3. **Correlation Matrix Files**
765
- - **`dccm_matrix.npy`** (per-unit) / **`dccm_average.npy`** (cross-unit): raw (n_Cα × n_Cα) DCCM matrix, values in [-1, 1]. Omitted with `--no_dccm`.
769
+ - **`dccm_matrix.npy`** (per-unit) / **`dccm_average.npy`** (cross-unit): raw (n_Cα × n_Cα) DCCM matrix, values in [-1, 1]. Omitted with `--no-dccm`.
766
770
  - **`dccm_plot.png`** / **`dccm_average.png`**: DCCM heatmap, diverging colormap (red = fully correlated, white = uncorrelated, blue = fully anti-correlated).
767
- - **`lmi_matrix.npy`** / **`lmi_average.npy`**: raw (n_Cα × n_Cα) LMI matrix, values in [0, 1]. Omitted with `--no_lmi`.
771
+ - **`lmi_matrix.npy`** / **`lmi_average.npy`**: raw (n_Cα × n_Cα) LMI matrix, values in [0, 1]. Omitted with `--no-lmi`.
768
772
  - **`lmi_plot.png`** / **`lmi_average.png`**: LMI heatmap, sequential colormap (LMI has no sign).
769
773
 
770
774
  4. **HTML Summary**
@@ -822,7 +826,7 @@ pyadmd run -src NAMD \
822
826
  -vel tutorial/system.vel \
823
827
  -xsc tutorial/system.xsc \
824
828
  -str tutorial/system.str \
825
- --no_correc
829
+ --no-correc
826
830
  ```
827
831
  ## Restart unfinished pyAdMD simulations
828
832
  ```
@@ -838,7 +842,7 @@ pyadmd analyze
838
842
  ```
839
843
  ## Analyze every 5 ps skipping DSSP and LMI
840
844
  ```
841
- pyadmd analyze -r --no_dssp --no_lmi
845
+ pyadmd analyze -r --no-dssp --no-lmi
842
846
  ```
843
847
  ## Compute a free energy landscape
844
848
  ```
@@ -846,7 +850,7 @@ pyadmd fel -c 2 -p 100
846
850
  ```
847
851
  ## Extend a previous free energy calculation with more centroids and production time
848
852
  ```
849
- pyadmd fel -c 2 -p 500 --max_centroids 100
853
+ pyadmd fel -c 2 -p 500 --max-centroids 100
850
854
  ```
851
855
  ## Compute a standalone ENM (Cα model, writing modes 7-16)
852
856
  ```