ensemble-analyzer 1a0__tar.gz → 1.2__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.
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/PKG-INFO +147 -35
- ensemble_analyzer-1a0/src/ensemble_analyzer.egg-info/PKG-INFO → ensemble_analyzer-1.2/README.md +102 -61
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/pyproject.toml +61 -12
- ensemble_analyzer-1.2/src/enan_calculators/__init__.py +64 -0
- ensemble_analyzer-1.2/src/enan_calculators/_aimnet.py +44 -0
- ensemble_analyzer-1.2/src/enan_calculators/_fairchem.py +32 -0
- ensemble_analyzer-1.2/src/enan_calculators/_gaussian.py +22 -0
- ensemble_analyzer-1.2/src/enan_calculators/_mace.py +109 -0
- ensemble_analyzer-1.2/src/enan_calculators/_ml_inference.py +82 -0
- ensemble_analyzer-1.2/src/enan_calculators/_models.py +13 -0
- ensemble_analyzer-1.2/src/enan_calculators/_nwchem.py +45 -0
- ensemble_analyzer-1.2/src/enan_calculators/_orca.py +88 -0
- ensemble_analyzer-1.2/src/enan_calculators/_skala.py +56 -0
- ensemble_analyzer-1.2/src/enan_calculators/_tblite.py +20 -0
- ensemble_analyzer-1.2/src/enan_calculators/_uma.py +33 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/__init__.py +27 -0
- {ensemble_analyzer-1a0/src/ensemble_analyzer → ensemble_analyzer-1.2/src/ensemble_analyzer/_clustering}/__init__.py +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_clustering/cluster_config.py +2 -2
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_clustering/cluster_manager.py +65 -54
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_logger/create_log.py +1 -1
- ensemble_analyzer-1.2/src/ensemble_analyzer/_logger/formatter.py +44 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_logger/logger.py +69 -31
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/calculation_config.py +39 -29
- ensemble_analyzer-1.2/src/ensemble_analyzer/_managers/calculation_executor.py +424 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/calculator_orchestration.py +8 -5
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/checkpoint_manager.py +13 -4
- ensemble_analyzer-1.2/src/ensemble_analyzer/_managers/prism_backend.py +223 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/protocol_executor.py +68 -47
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/protocol_manager.py +12 -3
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/pruning_manager.py +147 -44
- ensemble_analyzer-1a0/src/ensemble_analyzer/parser_arguments.py → ensemble_analyzer-1.2/src/ensemble_analyzer/_parser_arguments.py +13 -27
- ensemble_analyzer-1a0/src/ensemble_analyzer/parser_parameter.py → ensemble_analyzer-1.2/src/ensemble_analyzer/_parser_parameter.py +23 -13
- ensemble_analyzer-1.2/src/ensemble_analyzer/_spectral/base.py +333 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_spectral/comp_electronic.py +1 -2
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_spectral/comp_vibronic.py +1 -2
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_spectral/compare.py +14 -5
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_spectral/experimental.py +4 -7
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_spectral/graph_default.py +4 -1
- ensemble_analyzer-1a0/src/ensemble_analyzer/title.py → ensemble_analyzer-1.2/src/ensemble_analyzer/_title.py +5 -2
- ensemble_analyzer-1.2/src/ensemble_analyzer/api.py +241 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/__init__.py +27 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/_ml_base.py +156 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/aimnet.py +19 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/base.py +169 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/fairchem.py +3 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/gaussian.py +121 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/mace.py +26 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/nwchem.py +140 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/orca.py +164 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/skala_calc.py +19 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/tblite.py +18 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/uma.py +3 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/check_setup.py +85 -4
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/clustering.py +159 -177
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/get_av_energy.py +137 -188
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/pickle_editor/cli.py +21 -54
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/pickle_editor/core.py +204 -199
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/pickle_editor/tui.py +61 -63
- ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/__init__.py +1 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/app_state.py +11 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/fields.py +49 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/main.py +30 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/screens.py +1115 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/templates.py +67 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/cli/regraph.py +72 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/clustering.py +30 -14
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_conformer → ensemble_analyzer-1.2/src/ensemble_analyzer/conformer}/conformer.py +80 -24
- ensemble_analyzer-1.2/src/ensemble_analyzer/conformer/energy_data.py +256 -0
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_conformer → ensemble_analyzer-1.2/src/ensemble_analyzer/conformer}/spectral_data.py +20 -17
- ensemble_analyzer-1.2/src/ensemble_analyzer/constants.py +136 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/ensemble_io.py +30 -12
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/graph.py +8 -5
- ensemble_analyzer-1.2/src/ensemble_analyzer/io_utils.py +182 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/launch.py +163 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer/mode_analysis.py +106 -0
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_parsers → ensemble_analyzer-1.2/src/ensemble_analyzer/parsers}/__init__.py +3 -3
- ensemble_analyzer-1.2/src/ensemble_analyzer/parsers/base.py +164 -0
- ensemble_analyzer-1a0/src/ensemble_analyzer/_parsers/_gaussian.py → ensemble_analyzer-1.2/src/ensemble_analyzer/parsers/gaussian.py +46 -63
- ensemble_analyzer-1.2/src/ensemble_analyzer/parsers/nwchem.py +173 -0
- ensemble_analyzer-1a0/src/ensemble_analyzer/_parsers/_orca.py → ensemble_analyzer-1.2/src/ensemble_analyzer/parsers/orca.py +65 -64
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_protocol → ensemble_analyzer-1.2/src/ensemble_analyzer/protocol}/protocol.py +96 -19
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/rrho.py +115 -89
- ensemble_analyzer-1.2/src/ensemble_analyzer/validators.py +12 -0
- ensemble_analyzer-1.2/src/ensemble_analyzer.egg-info/PKG-INFO +349 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer.egg-info/SOURCES.txt +51 -35
- ensemble_analyzer-1.2/src/ensemble_analyzer.egg-info/requires.txt +52 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer.egg-info/top_level.txt +1 -0
- ensemble_analyzer-1.2/test/test_api.py +63 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/test/test_io_utils.py +45 -4
- ensemble_analyzer-1a0/README.md +0 -201
- ensemble_analyzer-1a0/src/ensemble_analyzer/_calculators/__init__.py +0 -12
- ensemble_analyzer-1a0/src/ensemble_analyzer/_calculators/_gaussian.py +0 -103
- ensemble_analyzer-1a0/src/ensemble_analyzer/_calculators/_orca.py +0 -118
- ensemble_analyzer-1a0/src/ensemble_analyzer/_calculators/base.py +0 -77
- ensemble_analyzer-1a0/src/ensemble_analyzer/_conformer/energy_data.py +0 -123
- ensemble_analyzer-1a0/src/ensemble_analyzer/_logger/formatter.py +0 -36
- ensemble_analyzer-1a0/src/ensemble_analyzer/_managers/calculation_executor.py +0 -114
- ensemble_analyzer-1a0/src/ensemble_analyzer/_parsers/base.py +0 -152
- ensemble_analyzer-1a0/src/ensemble_analyzer/_spectral/base.py +0 -332
- ensemble_analyzer-1a0/src/ensemble_analyzer/cli/protocol_wizard.py +0 -561
- ensemble_analyzer-1a0/src/ensemble_analyzer/cli/regraph.py +0 -105
- ensemble_analyzer-1a0/src/ensemble_analyzer/constants.py +0 -75
- ensemble_analyzer-1a0/src/ensemble_analyzer/io_utils.py +0 -90
- ensemble_analyzer-1a0/src/ensemble_analyzer/launch.py +0 -86
- ensemble_analyzer-1a0/src/ensemble_analyzer.egg-info/requires.txt +0 -8
- ensemble_analyzer-1a0/test/test_calculation_executor.py +0 -49
- ensemble_analyzer-1a0/test/test_calculator.py +0 -91
- ensemble_analyzer-1a0/test/test_checkpoint_manager.py +0 -75
- ensemble_analyzer-1a0/test/test_config.py +0 -40
- ensemble_analyzer-1a0/test/test_conformer.py +0 -60
- ensemble_analyzer-1a0/test/test_data_structure.py +0 -91
- ensemble_analyzer-1a0/test/test_experimental.py +0 -71
- ensemble_analyzer-1a0/test/test_integration.py +0 -85
- ensemble_analyzer-1a0/test/test_logger.py +0 -74
- ensemble_analyzer-1a0/test/test_parser_parameters.py +0 -154
- ensemble_analyzer-1a0/test/test_parsers.py +0 -112
- ensemble_analyzer-1a0/test/test_protocol_executor.py +0 -70
- ensemble_analyzer-1a0/test/test_pruning_manager.py +0 -76
- ensemble_analyzer-1a0/test/test_rrho.py +0 -55
- ensemble_analyzer-1a0/test/test_spectral.py +0 -104
- ensemble_analyzer-1a0/test/test_spectral_compare.py +0 -90
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/LICENSE +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/setup.cfg +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/__main__.py +0 -0
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_clustering → ensemble_analyzer-1.2/src/ensemble_analyzer/_logger}/__init__.py +0 -0
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_conformer → ensemble_analyzer-1.2/src/ensemble_analyzer/_managers}/__init__.py +0 -0
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_logger → ensemble_analyzer-1.2/src/ensemble_analyzer/_spectral}/__init__.py +0 -0
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_managers → ensemble_analyzer-1.2/src/ensemble_analyzer/cli}/__init__.py +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/pickle_editor/__init__.py +0 -0
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_protocol → ensemble_analyzer-1.2/src/ensemble_analyzer/conformer}/__init__.py +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/parameters_file/basis_sets +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/parameters_file/default_protocol.json +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/parameters_file/default_threshold.json +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/parameters_file/functionals +0 -0
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_spectral → ensemble_analyzer-1.2/src/ensemble_analyzer/protocol}/__init__.py +0 -0
- {ensemble_analyzer-1a0/src/ensemble_analyzer/_protocol → ensemble_analyzer-1.2/src/ensemble_analyzer/protocol}/solvent.py +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer.egg-info/dependency_links.txt +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer.egg-info/entry_points.txt +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/test/test_clustering.py +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/test/test_ensemble_io.py +0 -0
- {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/test/test_high_level.py +0 -0
- /ensemble_analyzer-1a0/src/ensemble_analyzer/cli/__init__.py → /ensemble_analyzer-1.2/test/test_mode_analysis.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ensemble-analyzer
|
|
3
|
-
Version:
|
|
3
|
+
Version: 1.2
|
|
4
4
|
Summary: Automatic Refinement of Conformational Ensemble
|
|
5
5
|
Author-email: Andrea Pellegrini <andrea.pellegrini15@unibo.it>, Paolo Righi <paolo.righi@unibo.it>, Andrea Mazzanti <andrea.mazzanti@unibo.it>, Michele Mancinelli <michele.mancinelli@unibo.it>
|
|
6
6
|
Maintainer-email: Andrea Pellegrini <andrea.pellegrini15@unibo.it>, Paolo Righi <paolo.righi@unibo.it>
|
|
@@ -15,27 +15,62 @@ Classifier: Topic :: Scientific/Engineering :: Chemistry
|
|
|
15
15
|
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
16
16
|
Classifier: License :: OSI Approved :: MIT License
|
|
17
17
|
Classifier: Programming Language :: Python :: 3
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
21
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
22
22
|
Classifier: Operating System :: OS Independent
|
|
23
23
|
Classifier: Typing :: Typed
|
|
24
|
-
Requires-Python:
|
|
24
|
+
Requires-Python: <3.15,>=3.12
|
|
25
25
|
Description-Content-Type: text/markdown
|
|
26
26
|
License-File: LICENSE
|
|
27
|
-
Requires-Dist: numpy>=2.
|
|
28
|
-
Requires-Dist: scipy>=1.
|
|
29
|
-
Requires-Dist: matplotlib>=3.
|
|
30
|
-
Requires-Dist: scikit-learn>=1.
|
|
31
|
-
Requires-Dist: ase>=3.
|
|
32
|
-
Requires-Dist: numba>=0.
|
|
33
|
-
Requires-Dist: tabulate>=0.
|
|
27
|
+
Requires-Dist: numpy>=2.4.0
|
|
28
|
+
Requires-Dist: scipy>=1.17.0
|
|
29
|
+
Requires-Dist: matplotlib>=3.11.0
|
|
30
|
+
Requires-Dist: scikit-learn>=1.9.0
|
|
31
|
+
Requires-Dist: ase>=3.28.0
|
|
32
|
+
Requires-Dist: numba>=0.65.0
|
|
33
|
+
Requires-Dist: tabulate>=0.10.0
|
|
34
34
|
Requires-Dist: InquirerPy>=0.3.4
|
|
35
|
+
Requires-Dist: textual>=2.0.0
|
|
36
|
+
Requires-Dist: sella>=2.4.0
|
|
37
|
+
Requires-Dist: prism_pruner>=0.1.2
|
|
38
|
+
Provides-Extra: tblite
|
|
39
|
+
Requires-Dist: tblite; extra == "tblite"
|
|
40
|
+
Provides-Extra: aimnet
|
|
41
|
+
Requires-Dist: torch; extra == "aimnet"
|
|
42
|
+
Requires-Dist: aimnet; extra == "aimnet"
|
|
43
|
+
Provides-Extra: uma
|
|
44
|
+
Requires-Dist: torch; extra == "uma"
|
|
45
|
+
Requires-Dist: fairchem-core; extra == "uma"
|
|
46
|
+
Provides-Extra: fairchem
|
|
47
|
+
Requires-Dist: torch; extra == "fairchem"
|
|
48
|
+
Requires-Dist: fairchem-core; extra == "fairchem"
|
|
49
|
+
Provides-Extra: mace
|
|
50
|
+
Requires-Dist: torch; extra == "mace"
|
|
51
|
+
Requires-Dist: mace-torch; extra == "mace"
|
|
52
|
+
Provides-Extra: skala
|
|
53
|
+
Requires-Dist: torch; extra == "skala"
|
|
54
|
+
Requires-Dist: skala; extra == "skala"
|
|
55
|
+
Provides-Extra: ml
|
|
56
|
+
Requires-Dist: tblite; extra == "ml"
|
|
57
|
+
Requires-Dist: torch; extra == "ml"
|
|
58
|
+
Requires-Dist: aimnet; extra == "ml"
|
|
59
|
+
Requires-Dist: fairchem-core; extra == "ml"
|
|
60
|
+
Requires-Dist: mace-torch; extra == "ml"
|
|
61
|
+
Provides-Extra: all
|
|
62
|
+
Requires-Dist: tblite; extra == "all"
|
|
63
|
+
Requires-Dist: torch; extra == "all"
|
|
64
|
+
Requires-Dist: aimnet; extra == "all"
|
|
65
|
+
Requires-Dist: fairchem-core; extra == "all"
|
|
66
|
+
Requires-Dist: mace-torch; extra == "all"
|
|
67
|
+
Requires-Dist: skala; extra == "all"
|
|
68
|
+
Provides-Extra: dev
|
|
69
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
35
70
|
Dynamic: license-file
|
|
36
71
|
|
|
37
72
|
# Ensemble Analyzer <img src="logo.png" align="right" width="150">
|
|
38
|
-
[](https://www.python.org/downloads/)
|
|
39
74
|
[](LICENSE)
|
|
40
75
|
|
|
41
76
|
## Conformer Ensemble Pruning Software
|
|
@@ -48,7 +83,8 @@ Dynamic: license-file
|
|
|
48
83
|
|
|
49
84
|
### Core Capabilities
|
|
50
85
|
- ⚡ **Multi-Protocol Workflows**: Sequential optimization/frequency calculations with automatic pruning
|
|
51
|
-
- 🔬 **Quantum Chemistry Integration**: Support for ORCA and
|
|
86
|
+
- 🔬 **Quantum Chemistry Integration**: Support for ORCA, Gaussian, NWChem, semi-empirical (TBLite), and ML potentials (AIMNet)
|
|
87
|
+
- 🧪 **Transition State Optimization**: TS mode validation with fragment localization, automatic displacement and re-optimization of spurious imaginary frequencies
|
|
52
88
|
- 📊 **Advanced Clustering**: PCA-based conformer clustering with multiple feature extraction methods
|
|
53
89
|
- 🎨 **Spectral Analysis**: Generate weighted IR, VCD, UV-vis, and ECD spectra
|
|
54
90
|
- 🔄 **Checkpoint System**: Automatic restart capability with atomic file operations
|
|
@@ -64,21 +100,43 @@ Dynamic: license-file
|
|
|
64
100
|
## 📦 Installation
|
|
65
101
|
|
|
66
102
|
### Requirements
|
|
67
|
-
- **Python**
|
|
103
|
+
- **Python** 3.12 – 3.14
|
|
68
104
|
- **Core**: NumPy, SciPy, Matplotlib, ASE
|
|
69
105
|
- **Clustering**: scikit-learn
|
|
106
|
+
- **Pruning**: [PRISM Pruner](https://github.com/ntampellini/prism_pruner)
|
|
70
107
|
- **Acceleration**: Numba
|
|
71
108
|
|
|
72
109
|
```bash
|
|
110
|
+
# Base install (ORCA/Gaussian only)
|
|
73
111
|
pip install ensemble-analyzer
|
|
112
|
+
|
|
113
|
+
# With ML potentials (TBLite, AIMNet, UMA, FairChem, MACE)
|
|
114
|
+
pip install "ensemble-analyzer[ml]"
|
|
74
115
|
```
|
|
75
116
|
|
|
76
|
-
|
|
77
|
-
|
|
117
|
+
### External QM Programs (optional)
|
|
118
|
+
|
|
119
|
+
| Program | Requirement | Env Var |
|
|
120
|
+
|---------|-------------|---------|
|
|
121
|
+
| [ORCA](https://orcaforum.kofo.mpg.de/app.php/portal) | Installed binary | `ORCAVERSION="x.y.z"` |
|
|
122
|
+
| [Gaussian](https://gaussian.com) | Licensed installation | — |
|
|
123
|
+
| [NWChem](https://www.nwchem-sw.org) | Installed binary | `NWCHEMCOMMAND` or `PATH` |
|
|
124
|
+
|
|
125
|
+
### Semi-empirical & ML Potentials (optional)
|
|
78
126
|
|
|
79
|
-
|
|
127
|
+
| Calculator | Type | Extra | Model Weights |
|
|
128
|
+
|------------|------|-------|---------------|
|
|
129
|
+
| **TBLite** | Semi-empirical (GFN-xTB) | `[tblite]` | Built-in |
|
|
130
|
+
| **AIMNet** | ML potential | `[aimnet]` | `ENAN_MODELS_DIR/aimnet/` |
|
|
131
|
+
| **UMA** | ML potential | `[uma]` | `ENAN_MODELS_DIR/uma/` |
|
|
132
|
+
| **FairChem** | ML potential | `[fairchem]` | `ENAN_MODELS_DIR/fairchem/` |
|
|
133
|
+
| **Mace** | ML potential | `[mace]` | `ENAN_MODELS_DIR/mace/` |
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
Point to your model weights directory:
|
|
80
137
|
```bash
|
|
81
|
-
export
|
|
138
|
+
export ENAN_MODELS_DIR="/path/to/ml_weights"
|
|
139
|
+
# Default: ~/.ensemble_analyzer/models/<calculator>/
|
|
82
140
|
```
|
|
83
141
|
|
|
84
142
|
## 🚀 Quick Start
|
|
@@ -87,8 +145,8 @@ export ORCAVERSION="x.y.z"
|
|
|
87
145
|
Create `protocol.json`
|
|
88
146
|
```json
|
|
89
147
|
{
|
|
90
|
-
"0": {"
|
|
91
|
-
"1": {"
|
|
148
|
+
"0": {"functional": "r2SCAN-3c", "opt": true, "freq": true,"cluster": 5, "comment": "Initial Optimization cluster into 5 families"},
|
|
149
|
+
"1": {"functional": "wB97X-D4rev", "basis": "def2-QZVPPD", "comment": "Single Point energy evaluation"}
|
|
92
150
|
}
|
|
93
151
|
|
|
94
152
|
```
|
|
@@ -98,7 +156,27 @@ Create `protocol.json`
|
|
|
98
156
|
ensemble_analyzer --ensemble conformers.xyz --protocol protocol.json --output calculation.out --cpu 8 --temperature 298.15
|
|
99
157
|
```
|
|
100
158
|
|
|
101
|
-
### 3.
|
|
159
|
+
### 3. Using Semi-empirical & ML Potentials
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"0": {"calculator": "tblite", "functional": "GFN2-xTB", "opt": true, "freq": true},
|
|
163
|
+
"1": {"calculator": "aimnet", "functional": "<aimnet_weights.pt", "cluster": 10},
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
ML calculators skip file I/O and parsing — energies are read directly from ASE atoms.
|
|
168
|
+
|
|
169
|
+
### 4. Transition State Optimization with Mode Validation
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"0": {"calculator": "orca", "functional": "wB97X-D4rev", "basis": "def2-TZVPPD", "opt": true, "ts": true, "freq": true,
|
|
173
|
+
"loc_freq": [[0, 1, 2, 3], [4, 5, 6, 7, 8, 9]],
|
|
174
|
+
"comment": "TS optimization with fragment-based imag mode validation"}
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
`ts: true` enables Sella optimizer for ML calculators and `OptTS`/`opt=(ts,…)` for QM programs. When `loc_freq` is set, the localization logic validates whether the imaginary frequency is mainly on the listed atom groups (`Frag1`, `Frag2`, …), displaces and re-optimizes when a spurious mode is detected.
|
|
178
|
+
|
|
179
|
+
### 5. Restart from Checkpoint
|
|
102
180
|
```bash
|
|
103
181
|
# Automatically resumes from last completed protocol
|
|
104
182
|
ensemble_analyzer --restart
|
|
@@ -112,21 +190,33 @@ ensemble_analyzer --restart
|
|
|
112
190
|
| **Calculation Settings** ||||
|
|
113
191
|
| `functional` | str | DFT functional or method | `"B3LYP"`, `"xtb"`, `"HF-3c"` |
|
|
114
192
|
| `basis` | str | Basis set (auto for composite methods) | `"def2-SVP"`, `"def2-TZVP"` |
|
|
115
|
-
| `calculator` | str | QM program | `"orca"` (default), `"gaussian"` |
|
|
193
|
+
| `calculator` | str | QM program / ML potential | `"orca"` (default), `"gaussian"`, `"nwchem"`, `"tblite"`, `"aimnet"` |
|
|
116
194
|
| `opt` | bool | Optimize geometry | `true`, `false` |
|
|
117
195
|
| `freq` | bool | Calculate frequencies | `true`, `false` |
|
|
118
196
|
| `mult` | int | Spin multiplicity | `1` (singlet), `2` (doublet) |
|
|
119
|
-
| `charge` | int | Molecular charge | |
|
|
120
|
-
| `
|
|
197
|
+
| `charge` | int | Molecular charge | `0` (default) |
|
|
198
|
+
| `fmax` | float | Convergence threshold for ML optimizers (BFGS/Sella) [eV/Å] | `0.01` (default) |
|
|
199
|
+
| `solvent` | dict | Implicit solvation | `{"solvent": "water", "smd": true}` |
|
|
200
|
+
| **TS Analysis** ||||
|
|
201
|
+
| `ts` | bool | Enable TS optimization (uses Sella for ML calculators) | `false` |
|
|
202
|
+
| `loc_freq` | list[list] | Atom index groups for TS mode validation | `[[0,1,2], [3,4,5]]` |
|
|
203
|
+
| `min_localization` | float | Min % displacement on `loc_freq` fragments to accept negative freq | `50.0` |
|
|
204
|
+
| `auto_displace` | bool | Auto-displace along imaginary mode + re-optimize | `false` |
|
|
205
|
+
| `displace_scale` | float | Displacement scale factor [Å] | `0.3` |
|
|
206
|
+
| `neg_freq_threshold` | float | Frequencies with |ν| ≤ threshold treated as noise [cm⁻¹] | `20.0` |
|
|
121
207
|
| **Pruning Thresholds** ||||
|
|
122
208
|
| `thrG` | float | Energy similarity threshold [kcal/mol] | `3.0`, `5.0` |
|
|
123
|
-
| `thrB` | float | Rotatory constant threshold [cm⁻¹] | `
|
|
209
|
+
| `thrB` | float | Rotatory constant threshold [cm⁻¹] | `5e-5`, `1e-5` |
|
|
124
210
|
| `thrGMAX` | float | Energy window cutoff [kcal/mol] | `10.0` |
|
|
125
211
|
| `cluster` | bool/int | Enable clustering | `true` (auto), `5` (fixed) |
|
|
126
212
|
| `no_prune` | bool | Disable pruning | `false` (default) |
|
|
213
|
+
| `prune_method` | str | Duplicate-removal backend: `rotconst` (E + rotational constants) or [PRISM Pruner](https://github.com/ntampellini/prism_pruner) `prism` / `prism_rotcorr` | `"rotconst"` (default) |
|
|
214
|
+
| `prism_max_rmsd` | float | PRISM heavy-atom RMSD threshold [Å] (also `prism_max_dev`, `prism_moi`, `prism_moi_dev`, `prism_timeout`) | `0.25` |
|
|
215
|
+
| **TD-DFT Settings** (Note: Not supported for MLIPs or tblite) ||||
|
|
216
|
+
| `nroots` | int | Number of excited states for TD-DFT calculation | `10`, `30` |
|
|
217
|
+
| `tda` | bool | Use Tamm-Dancoff approximation (ORCA defaults to `true`, set `false` for full TD-DFT) | `true`, `false` |
|
|
127
218
|
| **Advanced** ||||
|
|
128
|
-
| `
|
|
129
|
-
| `constrains` | list | Geometry constraints (only on cartesians)| `[1,2]` (fix cartesians) |
|
|
219
|
+
| `constraints` | list[list] | Geometry constraints (only on cartesians)| `[[1,2],[1],[1,2,3],[4,3,2,1]]` |
|
|
130
220
|
| `monitor_internals` | list | Track bond/angle/dihedral | `[[0,1], [0,1,2]]` |
|
|
131
221
|
| `skip_opt_fail` | bool | Skip failed optimizations | `false` (default) |
|
|
132
222
|
| `block_on_retention_rate` | bool | Block the calculation has a retention rate lower than the `MIN_RETENTION_RATE` (20%) | `false` (default) |
|
|
@@ -143,7 +233,7 @@ Feel free to browse all the possible protocol options and parameters.
|
|
|
143
233
|
|
|
144
234
|
### Regrapher
|
|
145
235
|
|
|
146
|
-
If you want to change the convolution of your graphs, you can edit the
|
|
236
|
+
If you want to change the convolution of your graphs, you can edit the `settings.json` file. Here, all the global settings are present. When finished, the command `enan_regraph` come handy. It re-run the Graph workflow with these new setting and in few time, you'll have your new graphs.
|
|
147
237
|
```bash
|
|
148
238
|
usage: enan_regraph [-h] [-rb READ_BOLTZ] [-no-nm] [-w] [--disable-color] idx [idx ...]
|
|
149
239
|
|
|
@@ -164,7 +254,7 @@ options:
|
|
|
164
254
|
All graphs are saved also as a pickle. This file can be reloaded and from there you can modify every single element of the Matplotlib Figure store in it. This requires some programming skills and, especially, time. Here is where `enan_graph_editor` comes to play. It is once again an interactive terminal interface (based both on rich or InquierPy library) where you can change and personalize every pickle. If you have to modify more files at once, a *batch* mode is implemented as well, so to by-pass the limitation of the manual selection of the interactive TUI.
|
|
165
255
|
|
|
166
256
|
```bash
|
|
167
|
-
usage: enan_graph_editor [-h] [--batch] [--list] [--rename OLD NEW] [--rename-file RENAME_FILE] [--color LABEL COLOR] [--linestyle LABEL STYLE] [--linewidth LABEL WIDTH] [--alpha LABEL ALPHA] [--output OUTPUT] [--format {pickle,png,pdf,svg}] [--
|
|
257
|
+
usage: enan_graph_editor [-h] [--batch] [--list] [--rename OLD NEW] [--rename-file RENAME_FILE] [--color LABEL COLOR] [--linestyle LABEL STYLE] [--linewidth LABEL WIDTH] [--alpha LABEL ALPHA] [--visibility LABEL bool] [--output OUTPUT] [--format {pickle,png,pdf,svg}] [--no-strict]
|
|
168
258
|
[--verbose]
|
|
169
259
|
pickle_file
|
|
170
260
|
|
|
@@ -186,26 +276,48 @@ batch mode options:
|
|
|
186
276
|
--rename-file RENAME_FILE, -rf RENAME_FILE
|
|
187
277
|
Mapping file OLD=NEW
|
|
188
278
|
--color LABEL COLOR, -c LABEL COLOR
|
|
189
|
-
Change
|
|
279
|
+
Change color
|
|
190
280
|
--linestyle LABEL STYLE, -ls LABEL STYLE
|
|
191
|
-
Change line
|
|
281
|
+
Change line style (e.g., -, --, :, -.)
|
|
192
282
|
--linewidth LABEL WIDTH, -lw LABEL WIDTH
|
|
193
283
|
Change line linewidth (float)
|
|
194
284
|
--alpha LABEL ALPHA, -a LABEL ALPHA
|
|
195
285
|
Change line transparency (0-1)
|
|
286
|
+
--visibility LABEL bool, -vis LABEL bool
|
|
287
|
+
Toggle line visibility (True/False)
|
|
196
288
|
--output OUTPUT, -o OUTPUT
|
|
197
289
|
Output file
|
|
198
290
|
--format {pickle,png,pdf,svg}, -f {pickle,png,pdf,svg}
|
|
199
291
|
Output format
|
|
200
292
|
|
|
201
293
|
DEFAULT MODE: Interactive TUI
|
|
202
|
-
|
|
294
|
+
enan_graph_editor plot.pkl
|
|
203
295
|
|
|
204
296
|
BATCH MODE (examples):
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
297
|
+
enan_graph_editor plot.pkl --batch --list
|
|
298
|
+
enan_graph_editor plot.pkl --batch --rename "Protocol 1" "Proto A"
|
|
299
|
+
enan_graph_editor plot.pkl --batch --color "Experimental" red --output new.pkl
|
|
208
300
|
```
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Cite
|
|
304
|
+
|
|
305
|
+
```BibLaTex
|
|
306
|
+
@article{
|
|
307
|
+
title = {Ensemble Analyzer: An Open-Source Python Framework for Automated Conformer Ensemble Refinement},
|
|
308
|
+
shorttitle = {Ensemble Analyzer},
|
|
309
|
+
author = {Pellegrini, Andrea and Righi, Paolo and Mazzanti, Andrea and Mancinelli, Michele},
|
|
310
|
+
date = {2026-05-11},
|
|
311
|
+
journaltitle = {Journal of Chemical Information and Modeling},
|
|
312
|
+
shortjournal = {J. Chem. Inf. Model.},
|
|
313
|
+
volume = {66},
|
|
314
|
+
number = {9},
|
|
315
|
+
pages = {5018--5025},
|
|
316
|
+
doi = {10.1021/acs.jcim.6c00273},
|
|
317
|
+
url = {https://pubs.acs.org/doi/10.1021/acs.jcim.6c00273},
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
209
321
|
|
|
210
322
|
---
|
|
211
323
|
## 🤝 Contributing
|
|
@@ -230,7 +342,7 @@ git push origin feature/awesome-feature
|
|
|
230
342
|
|
|
231
343
|
## 📄 License
|
|
232
344
|
|
|
233
|
-
This software is licensed under the MIT
|
|
345
|
+
This software is licensed under the MIT License. See the LICENSE file for details.
|
|
234
346
|
|
|
235
347
|
## 📞 Support and contact
|
|
236
348
|
|
ensemble_analyzer-1a0/src/ensemble_analyzer.egg-info/PKG-INFO → ensemble_analyzer-1.2/README.md
RENAMED
|
@@ -1,41 +1,5 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: ensemble-analyzer
|
|
3
|
-
Version: 1a0
|
|
4
|
-
Summary: Automatic Refinement of Conformational Ensemble
|
|
5
|
-
Author-email: Andrea Pellegrini <andrea.pellegrini15@unibo.it>, Paolo Righi <paolo.righi@unibo.it>, Andrea Mazzanti <andrea.mazzanti@unibo.it>, Michele Mancinelli <michele.mancinelli@unibo.it>
|
|
6
|
-
Maintainer-email: Andrea Pellegrini <andrea.pellegrini15@unibo.it>, Paolo Righi <paolo.righi@unibo.it>
|
|
7
|
-
License: MIT
|
|
8
|
-
Project-URL: Homepage, https://github.com/andre-cloud/ensemble_analyzer
|
|
9
|
-
Project-URL: Documentation, https://enan.readthedocs.io/en/latest/
|
|
10
|
-
Keywords: computational-chemistry,conformational-analysis,ensemble-refinement,automatization,ase,quantum-chemistry
|
|
11
|
-
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
-
Classifier: Intended Audience :: Science/Research
|
|
13
|
-
Classifier: Intended Audience :: Developers
|
|
14
|
-
Classifier: Topic :: Scientific/Engineering :: Chemistry
|
|
15
|
-
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
16
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
-
Classifier: Programming Language :: Python :: 3
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
|
22
|
-
Classifier: Operating System :: OS Independent
|
|
23
|
-
Classifier: Typing :: Typed
|
|
24
|
-
Requires-Python: >=3.11
|
|
25
|
-
Description-Content-Type: text/markdown
|
|
26
|
-
License-File: LICENSE
|
|
27
|
-
Requires-Dist: numpy>=2.2.0
|
|
28
|
-
Requires-Dist: scipy>=1.16.3
|
|
29
|
-
Requires-Dist: matplotlib>=3.10.7
|
|
30
|
-
Requires-Dist: scikit-learn>=1.7.2
|
|
31
|
-
Requires-Dist: ase>=3.24.0
|
|
32
|
-
Requires-Dist: numba>=0.61.2
|
|
33
|
-
Requires-Dist: tabulate>=0.9.0
|
|
34
|
-
Requires-Dist: InquirerPy>=0.3.4
|
|
35
|
-
Dynamic: license-file
|
|
36
|
-
|
|
37
1
|
# Ensemble Analyzer <img src="logo.png" align="right" width="150">
|
|
38
|
-
[](https://www.python.org/downloads/)
|
|
39
3
|
[](LICENSE)
|
|
40
4
|
|
|
41
5
|
## Conformer Ensemble Pruning Software
|
|
@@ -48,7 +12,8 @@ Dynamic: license-file
|
|
|
48
12
|
|
|
49
13
|
### Core Capabilities
|
|
50
14
|
- ⚡ **Multi-Protocol Workflows**: Sequential optimization/frequency calculations with automatic pruning
|
|
51
|
-
- 🔬 **Quantum Chemistry Integration**: Support for ORCA and
|
|
15
|
+
- 🔬 **Quantum Chemistry Integration**: Support for ORCA, Gaussian, NWChem, semi-empirical (TBLite), and ML potentials (AIMNet)
|
|
16
|
+
- 🧪 **Transition State Optimization**: TS mode validation with fragment localization, automatic displacement and re-optimization of spurious imaginary frequencies
|
|
52
17
|
- 📊 **Advanced Clustering**: PCA-based conformer clustering with multiple feature extraction methods
|
|
53
18
|
- 🎨 **Spectral Analysis**: Generate weighted IR, VCD, UV-vis, and ECD spectra
|
|
54
19
|
- 🔄 **Checkpoint System**: Automatic restart capability with atomic file operations
|
|
@@ -64,21 +29,43 @@ Dynamic: license-file
|
|
|
64
29
|
## 📦 Installation
|
|
65
30
|
|
|
66
31
|
### Requirements
|
|
67
|
-
- **Python**
|
|
32
|
+
- **Python** 3.12 – 3.14
|
|
68
33
|
- **Core**: NumPy, SciPy, Matplotlib, ASE
|
|
69
34
|
- **Clustering**: scikit-learn
|
|
35
|
+
- **Pruning**: [PRISM Pruner](https://github.com/ntampellini/prism_pruner)
|
|
70
36
|
- **Acceleration**: Numba
|
|
71
37
|
|
|
72
38
|
```bash
|
|
39
|
+
# Base install (ORCA/Gaussian only)
|
|
73
40
|
pip install ensemble-analyzer
|
|
41
|
+
|
|
42
|
+
# With ML potentials (TBLite, AIMNet, UMA, FairChem, MACE)
|
|
43
|
+
pip install "ensemble-analyzer[ml]"
|
|
74
44
|
```
|
|
75
45
|
|
|
76
|
-
|
|
77
|
-
|
|
46
|
+
### External QM Programs (optional)
|
|
47
|
+
|
|
48
|
+
| Program | Requirement | Env Var |
|
|
49
|
+
|---------|-------------|---------|
|
|
50
|
+
| [ORCA](https://orcaforum.kofo.mpg.de/app.php/portal) | Installed binary | `ORCAVERSION="x.y.z"` |
|
|
51
|
+
| [Gaussian](https://gaussian.com) | Licensed installation | — |
|
|
52
|
+
| [NWChem](https://www.nwchem-sw.org) | Installed binary | `NWCHEMCOMMAND` or `PATH` |
|
|
53
|
+
|
|
54
|
+
### Semi-empirical & ML Potentials (optional)
|
|
55
|
+
|
|
56
|
+
| Calculator | Type | Extra | Model Weights |
|
|
57
|
+
|------------|------|-------|---------------|
|
|
58
|
+
| **TBLite** | Semi-empirical (GFN-xTB) | `[tblite]` | Built-in |
|
|
59
|
+
| **AIMNet** | ML potential | `[aimnet]` | `ENAN_MODELS_DIR/aimnet/` |
|
|
60
|
+
| **UMA** | ML potential | `[uma]` | `ENAN_MODELS_DIR/uma/` |
|
|
61
|
+
| **FairChem** | ML potential | `[fairchem]` | `ENAN_MODELS_DIR/fairchem/` |
|
|
62
|
+
| **Mace** | ML potential | `[mace]` | `ENAN_MODELS_DIR/mace/` |
|
|
63
|
+
|
|
78
64
|
|
|
79
|
-
|
|
65
|
+
Point to your model weights directory:
|
|
80
66
|
```bash
|
|
81
|
-
export
|
|
67
|
+
export ENAN_MODELS_DIR="/path/to/ml_weights"
|
|
68
|
+
# Default: ~/.ensemble_analyzer/models/<calculator>/
|
|
82
69
|
```
|
|
83
70
|
|
|
84
71
|
## 🚀 Quick Start
|
|
@@ -87,8 +74,8 @@ export ORCAVERSION="x.y.z"
|
|
|
87
74
|
Create `protocol.json`
|
|
88
75
|
```json
|
|
89
76
|
{
|
|
90
|
-
"0": {"
|
|
91
|
-
"1": {"
|
|
77
|
+
"0": {"functional": "r2SCAN-3c", "opt": true, "freq": true,"cluster": 5, "comment": "Initial Optimization cluster into 5 families"},
|
|
78
|
+
"1": {"functional": "wB97X-D4rev", "basis": "def2-QZVPPD", "comment": "Single Point energy evaluation"}
|
|
92
79
|
}
|
|
93
80
|
|
|
94
81
|
```
|
|
@@ -98,7 +85,27 @@ Create `protocol.json`
|
|
|
98
85
|
ensemble_analyzer --ensemble conformers.xyz --protocol protocol.json --output calculation.out --cpu 8 --temperature 298.15
|
|
99
86
|
```
|
|
100
87
|
|
|
101
|
-
### 3.
|
|
88
|
+
### 3. Using Semi-empirical & ML Potentials
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"0": {"calculator": "tblite", "functional": "GFN2-xTB", "opt": true, "freq": true},
|
|
92
|
+
"1": {"calculator": "aimnet", "functional": "<aimnet_weights.pt", "cluster": 10},
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
ML calculators skip file I/O and parsing — energies are read directly from ASE atoms.
|
|
97
|
+
|
|
98
|
+
### 4. Transition State Optimization with Mode Validation
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"0": {"calculator": "orca", "functional": "wB97X-D4rev", "basis": "def2-TZVPPD", "opt": true, "ts": true, "freq": true,
|
|
102
|
+
"loc_freq": [[0, 1, 2, 3], [4, 5, 6, 7, 8, 9]],
|
|
103
|
+
"comment": "TS optimization with fragment-based imag mode validation"}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
`ts: true` enables Sella optimizer for ML calculators and `OptTS`/`opt=(ts,…)` for QM programs. When `loc_freq` is set, the localization logic validates whether the imaginary frequency is mainly on the listed atom groups (`Frag1`, `Frag2`, …), displaces and re-optimizes when a spurious mode is detected.
|
|
107
|
+
|
|
108
|
+
### 5. Restart from Checkpoint
|
|
102
109
|
```bash
|
|
103
110
|
# Automatically resumes from last completed protocol
|
|
104
111
|
ensemble_analyzer --restart
|
|
@@ -112,21 +119,33 @@ ensemble_analyzer --restart
|
|
|
112
119
|
| **Calculation Settings** ||||
|
|
113
120
|
| `functional` | str | DFT functional or method | `"B3LYP"`, `"xtb"`, `"HF-3c"` |
|
|
114
121
|
| `basis` | str | Basis set (auto for composite methods) | `"def2-SVP"`, `"def2-TZVP"` |
|
|
115
|
-
| `calculator` | str | QM program | `"orca"` (default), `"gaussian"` |
|
|
122
|
+
| `calculator` | str | QM program / ML potential | `"orca"` (default), `"gaussian"`, `"nwchem"`, `"tblite"`, `"aimnet"` |
|
|
116
123
|
| `opt` | bool | Optimize geometry | `true`, `false` |
|
|
117
124
|
| `freq` | bool | Calculate frequencies | `true`, `false` |
|
|
118
125
|
| `mult` | int | Spin multiplicity | `1` (singlet), `2` (doublet) |
|
|
119
|
-
| `charge` | int | Molecular charge | |
|
|
120
|
-
| `
|
|
126
|
+
| `charge` | int | Molecular charge | `0` (default) |
|
|
127
|
+
| `fmax` | float | Convergence threshold for ML optimizers (BFGS/Sella) [eV/Å] | `0.01` (default) |
|
|
128
|
+
| `solvent` | dict | Implicit solvation | `{"solvent": "water", "smd": true}` |
|
|
129
|
+
| **TS Analysis** ||||
|
|
130
|
+
| `ts` | bool | Enable TS optimization (uses Sella for ML calculators) | `false` |
|
|
131
|
+
| `loc_freq` | list[list] | Atom index groups for TS mode validation | `[[0,1,2], [3,4,5]]` |
|
|
132
|
+
| `min_localization` | float | Min % displacement on `loc_freq` fragments to accept negative freq | `50.0` |
|
|
133
|
+
| `auto_displace` | bool | Auto-displace along imaginary mode + re-optimize | `false` |
|
|
134
|
+
| `displace_scale` | float | Displacement scale factor [Å] | `0.3` |
|
|
135
|
+
| `neg_freq_threshold` | float | Frequencies with |ν| ≤ threshold treated as noise [cm⁻¹] | `20.0` |
|
|
121
136
|
| **Pruning Thresholds** ||||
|
|
122
137
|
| `thrG` | float | Energy similarity threshold [kcal/mol] | `3.0`, `5.0` |
|
|
123
|
-
| `thrB` | float | Rotatory constant threshold [cm⁻¹] | `
|
|
138
|
+
| `thrB` | float | Rotatory constant threshold [cm⁻¹] | `5e-5`, `1e-5` |
|
|
124
139
|
| `thrGMAX` | float | Energy window cutoff [kcal/mol] | `10.0` |
|
|
125
140
|
| `cluster` | bool/int | Enable clustering | `true` (auto), `5` (fixed) |
|
|
126
141
|
| `no_prune` | bool | Disable pruning | `false` (default) |
|
|
142
|
+
| `prune_method` | str | Duplicate-removal backend: `rotconst` (E + rotational constants) or [PRISM Pruner](https://github.com/ntampellini/prism_pruner) `prism` / `prism_rotcorr` | `"rotconst"` (default) |
|
|
143
|
+
| `prism_max_rmsd` | float | PRISM heavy-atom RMSD threshold [Å] (also `prism_max_dev`, `prism_moi`, `prism_moi_dev`, `prism_timeout`) | `0.25` |
|
|
144
|
+
| **TD-DFT Settings** (Note: Not supported for MLIPs or tblite) ||||
|
|
145
|
+
| `nroots` | int | Number of excited states for TD-DFT calculation | `10`, `30` |
|
|
146
|
+
| `tda` | bool | Use Tamm-Dancoff approximation (ORCA defaults to `true`, set `false` for full TD-DFT) | `true`, `false` |
|
|
127
147
|
| **Advanced** ||||
|
|
128
|
-
| `
|
|
129
|
-
| `constrains` | list | Geometry constraints (only on cartesians)| `[1,2]` (fix cartesians) |
|
|
148
|
+
| `constraints` | list[list] | Geometry constraints (only on cartesians)| `[[1,2],[1],[1,2,3],[4,3,2,1]]` |
|
|
130
149
|
| `monitor_internals` | list | Track bond/angle/dihedral | `[[0,1], [0,1,2]]` |
|
|
131
150
|
| `skip_opt_fail` | bool | Skip failed optimizations | `false` (default) |
|
|
132
151
|
| `block_on_retention_rate` | bool | Block the calculation has a retention rate lower than the `MIN_RETENTION_RATE` (20%) | `false` (default) |
|
|
@@ -143,7 +162,7 @@ Feel free to browse all the possible protocol options and parameters.
|
|
|
143
162
|
|
|
144
163
|
### Regrapher
|
|
145
164
|
|
|
146
|
-
If you want to change the convolution of your graphs, you can edit the
|
|
165
|
+
If you want to change the convolution of your graphs, you can edit the `settings.json` file. Here, all the global settings are present. When finished, the command `enan_regraph` come handy. It re-run the Graph workflow with these new setting and in few time, you'll have your new graphs.
|
|
147
166
|
```bash
|
|
148
167
|
usage: enan_regraph [-h] [-rb READ_BOLTZ] [-no-nm] [-w] [--disable-color] idx [idx ...]
|
|
149
168
|
|
|
@@ -164,7 +183,7 @@ options:
|
|
|
164
183
|
All graphs are saved also as a pickle. This file can be reloaded and from there you can modify every single element of the Matplotlib Figure store in it. This requires some programming skills and, especially, time. Here is where `enan_graph_editor` comes to play. It is once again an interactive terminal interface (based both on rich or InquierPy library) where you can change and personalize every pickle. If you have to modify more files at once, a *batch* mode is implemented as well, so to by-pass the limitation of the manual selection of the interactive TUI.
|
|
165
184
|
|
|
166
185
|
```bash
|
|
167
|
-
usage: enan_graph_editor [-h] [--batch] [--list] [--rename OLD NEW] [--rename-file RENAME_FILE] [--color LABEL COLOR] [--linestyle LABEL STYLE] [--linewidth LABEL WIDTH] [--alpha LABEL ALPHA] [--output OUTPUT] [--format {pickle,png,pdf,svg}] [--
|
|
186
|
+
usage: enan_graph_editor [-h] [--batch] [--list] [--rename OLD NEW] [--rename-file RENAME_FILE] [--color LABEL COLOR] [--linestyle LABEL STYLE] [--linewidth LABEL WIDTH] [--alpha LABEL ALPHA] [--visibility LABEL bool] [--output OUTPUT] [--format {pickle,png,pdf,svg}] [--no-strict]
|
|
168
187
|
[--verbose]
|
|
169
188
|
pickle_file
|
|
170
189
|
|
|
@@ -186,26 +205,48 @@ batch mode options:
|
|
|
186
205
|
--rename-file RENAME_FILE, -rf RENAME_FILE
|
|
187
206
|
Mapping file OLD=NEW
|
|
188
207
|
--color LABEL COLOR, -c LABEL COLOR
|
|
189
|
-
Change
|
|
208
|
+
Change color
|
|
190
209
|
--linestyle LABEL STYLE, -ls LABEL STYLE
|
|
191
|
-
Change line
|
|
210
|
+
Change line style (e.g., -, --, :, -.)
|
|
192
211
|
--linewidth LABEL WIDTH, -lw LABEL WIDTH
|
|
193
212
|
Change line linewidth (float)
|
|
194
213
|
--alpha LABEL ALPHA, -a LABEL ALPHA
|
|
195
214
|
Change line transparency (0-1)
|
|
215
|
+
--visibility LABEL bool, -vis LABEL bool
|
|
216
|
+
Toggle line visibility (True/False)
|
|
196
217
|
--output OUTPUT, -o OUTPUT
|
|
197
218
|
Output file
|
|
198
219
|
--format {pickle,png,pdf,svg}, -f {pickle,png,pdf,svg}
|
|
199
220
|
Output format
|
|
200
221
|
|
|
201
222
|
DEFAULT MODE: Interactive TUI
|
|
202
|
-
|
|
223
|
+
enan_graph_editor plot.pkl
|
|
203
224
|
|
|
204
225
|
BATCH MODE (examples):
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
226
|
+
enan_graph_editor plot.pkl --batch --list
|
|
227
|
+
enan_graph_editor plot.pkl --batch --rename "Protocol 1" "Proto A"
|
|
228
|
+
enan_graph_editor plot.pkl --batch --color "Experimental" red --output new.pkl
|
|
208
229
|
```
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Cite
|
|
233
|
+
|
|
234
|
+
```BibLaTex
|
|
235
|
+
@article{
|
|
236
|
+
title = {Ensemble Analyzer: An Open-Source Python Framework for Automated Conformer Ensemble Refinement},
|
|
237
|
+
shorttitle = {Ensemble Analyzer},
|
|
238
|
+
author = {Pellegrini, Andrea and Righi, Paolo and Mazzanti, Andrea and Mancinelli, Michele},
|
|
239
|
+
date = {2026-05-11},
|
|
240
|
+
journaltitle = {Journal of Chemical Information and Modeling},
|
|
241
|
+
shortjournal = {J. Chem. Inf. Model.},
|
|
242
|
+
volume = {66},
|
|
243
|
+
number = {9},
|
|
244
|
+
pages = {5018--5025},
|
|
245
|
+
doi = {10.1021/acs.jcim.6c00273},
|
|
246
|
+
url = {https://pubs.acs.org/doi/10.1021/acs.jcim.6c00273},
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
209
250
|
|
|
210
251
|
---
|
|
211
252
|
## 🤝 Contributing
|
|
@@ -230,7 +271,7 @@ git push origin feature/awesome-feature
|
|
|
230
271
|
|
|
231
272
|
## 📄 License
|
|
232
273
|
|
|
233
|
-
This software is licensed under the MIT
|
|
274
|
+
This software is licensed under the MIT License. See the LICENSE file for details.
|
|
234
275
|
|
|
235
276
|
## 📞 Support and contact
|
|
236
277
|
|