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.
Files changed (142) hide show
  1. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/PKG-INFO +147 -35
  2. ensemble_analyzer-1a0/src/ensemble_analyzer.egg-info/PKG-INFO → ensemble_analyzer-1.2/README.md +102 -61
  3. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/pyproject.toml +61 -12
  4. ensemble_analyzer-1.2/src/enan_calculators/__init__.py +64 -0
  5. ensemble_analyzer-1.2/src/enan_calculators/_aimnet.py +44 -0
  6. ensemble_analyzer-1.2/src/enan_calculators/_fairchem.py +32 -0
  7. ensemble_analyzer-1.2/src/enan_calculators/_gaussian.py +22 -0
  8. ensemble_analyzer-1.2/src/enan_calculators/_mace.py +109 -0
  9. ensemble_analyzer-1.2/src/enan_calculators/_ml_inference.py +82 -0
  10. ensemble_analyzer-1.2/src/enan_calculators/_models.py +13 -0
  11. ensemble_analyzer-1.2/src/enan_calculators/_nwchem.py +45 -0
  12. ensemble_analyzer-1.2/src/enan_calculators/_orca.py +88 -0
  13. ensemble_analyzer-1.2/src/enan_calculators/_skala.py +56 -0
  14. ensemble_analyzer-1.2/src/enan_calculators/_tblite.py +20 -0
  15. ensemble_analyzer-1.2/src/enan_calculators/_uma.py +33 -0
  16. ensemble_analyzer-1.2/src/ensemble_analyzer/__init__.py +27 -0
  17. {ensemble_analyzer-1a0/src/ensemble_analyzer → ensemble_analyzer-1.2/src/ensemble_analyzer/_clustering}/__init__.py +0 -0
  18. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_clustering/cluster_config.py +2 -2
  19. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_clustering/cluster_manager.py +65 -54
  20. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_logger/create_log.py +1 -1
  21. ensemble_analyzer-1.2/src/ensemble_analyzer/_logger/formatter.py +44 -0
  22. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_logger/logger.py +69 -31
  23. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/calculation_config.py +39 -29
  24. ensemble_analyzer-1.2/src/ensemble_analyzer/_managers/calculation_executor.py +424 -0
  25. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/calculator_orchestration.py +8 -5
  26. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/checkpoint_manager.py +13 -4
  27. ensemble_analyzer-1.2/src/ensemble_analyzer/_managers/prism_backend.py +223 -0
  28. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/protocol_executor.py +68 -47
  29. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/protocol_manager.py +12 -3
  30. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_managers/pruning_manager.py +147 -44
  31. ensemble_analyzer-1a0/src/ensemble_analyzer/parser_arguments.py → ensemble_analyzer-1.2/src/ensemble_analyzer/_parser_arguments.py +13 -27
  32. ensemble_analyzer-1a0/src/ensemble_analyzer/parser_parameter.py → ensemble_analyzer-1.2/src/ensemble_analyzer/_parser_parameter.py +23 -13
  33. ensemble_analyzer-1.2/src/ensemble_analyzer/_spectral/base.py +333 -0
  34. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_spectral/comp_electronic.py +1 -2
  35. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_spectral/comp_vibronic.py +1 -2
  36. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_spectral/compare.py +14 -5
  37. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_spectral/experimental.py +4 -7
  38. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/_spectral/graph_default.py +4 -1
  39. ensemble_analyzer-1a0/src/ensemble_analyzer/title.py → ensemble_analyzer-1.2/src/ensemble_analyzer/_title.py +5 -2
  40. ensemble_analyzer-1.2/src/ensemble_analyzer/api.py +241 -0
  41. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/__init__.py +27 -0
  42. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/_ml_base.py +156 -0
  43. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/aimnet.py +19 -0
  44. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/base.py +169 -0
  45. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/fairchem.py +3 -0
  46. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/gaussian.py +121 -0
  47. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/mace.py +26 -0
  48. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/nwchem.py +140 -0
  49. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/orca.py +164 -0
  50. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/skala_calc.py +19 -0
  51. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/tblite.py +18 -0
  52. ensemble_analyzer-1.2/src/ensemble_analyzer/calculators/uma.py +3 -0
  53. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/check_setup.py +85 -4
  54. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/clustering.py +159 -177
  55. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/get_av_energy.py +137 -188
  56. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/pickle_editor/cli.py +21 -54
  57. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/pickle_editor/core.py +204 -199
  58. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/pickle_editor/tui.py +61 -63
  59. ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/__init__.py +1 -0
  60. ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/app_state.py +11 -0
  61. ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/fields.py +49 -0
  62. ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/main.py +30 -0
  63. ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/screens.py +1115 -0
  64. ensemble_analyzer-1.2/src/ensemble_analyzer/cli/protocol_wizard/templates.py +67 -0
  65. ensemble_analyzer-1.2/src/ensemble_analyzer/cli/regraph.py +72 -0
  66. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/clustering.py +30 -14
  67. {ensemble_analyzer-1a0/src/ensemble_analyzer/_conformer → ensemble_analyzer-1.2/src/ensemble_analyzer/conformer}/conformer.py +80 -24
  68. ensemble_analyzer-1.2/src/ensemble_analyzer/conformer/energy_data.py +256 -0
  69. {ensemble_analyzer-1a0/src/ensemble_analyzer/_conformer → ensemble_analyzer-1.2/src/ensemble_analyzer/conformer}/spectral_data.py +20 -17
  70. ensemble_analyzer-1.2/src/ensemble_analyzer/constants.py +136 -0
  71. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/ensemble_io.py +30 -12
  72. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/graph.py +8 -5
  73. ensemble_analyzer-1.2/src/ensemble_analyzer/io_utils.py +182 -0
  74. ensemble_analyzer-1.2/src/ensemble_analyzer/launch.py +163 -0
  75. ensemble_analyzer-1.2/src/ensemble_analyzer/mode_analysis.py +106 -0
  76. {ensemble_analyzer-1a0/src/ensemble_analyzer/_parsers → ensemble_analyzer-1.2/src/ensemble_analyzer/parsers}/__init__.py +3 -3
  77. ensemble_analyzer-1.2/src/ensemble_analyzer/parsers/base.py +164 -0
  78. ensemble_analyzer-1a0/src/ensemble_analyzer/_parsers/_gaussian.py → ensemble_analyzer-1.2/src/ensemble_analyzer/parsers/gaussian.py +46 -63
  79. ensemble_analyzer-1.2/src/ensemble_analyzer/parsers/nwchem.py +173 -0
  80. ensemble_analyzer-1a0/src/ensemble_analyzer/_parsers/_orca.py → ensemble_analyzer-1.2/src/ensemble_analyzer/parsers/orca.py +65 -64
  81. {ensemble_analyzer-1a0/src/ensemble_analyzer/_protocol → ensemble_analyzer-1.2/src/ensemble_analyzer/protocol}/protocol.py +96 -19
  82. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/rrho.py +115 -89
  83. ensemble_analyzer-1.2/src/ensemble_analyzer/validators.py +12 -0
  84. ensemble_analyzer-1.2/src/ensemble_analyzer.egg-info/PKG-INFO +349 -0
  85. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer.egg-info/SOURCES.txt +51 -35
  86. ensemble_analyzer-1.2/src/ensemble_analyzer.egg-info/requires.txt +52 -0
  87. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer.egg-info/top_level.txt +1 -0
  88. ensemble_analyzer-1.2/test/test_api.py +63 -0
  89. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/test/test_io_utils.py +45 -4
  90. ensemble_analyzer-1a0/README.md +0 -201
  91. ensemble_analyzer-1a0/src/ensemble_analyzer/_calculators/__init__.py +0 -12
  92. ensemble_analyzer-1a0/src/ensemble_analyzer/_calculators/_gaussian.py +0 -103
  93. ensemble_analyzer-1a0/src/ensemble_analyzer/_calculators/_orca.py +0 -118
  94. ensemble_analyzer-1a0/src/ensemble_analyzer/_calculators/base.py +0 -77
  95. ensemble_analyzer-1a0/src/ensemble_analyzer/_conformer/energy_data.py +0 -123
  96. ensemble_analyzer-1a0/src/ensemble_analyzer/_logger/formatter.py +0 -36
  97. ensemble_analyzer-1a0/src/ensemble_analyzer/_managers/calculation_executor.py +0 -114
  98. ensemble_analyzer-1a0/src/ensemble_analyzer/_parsers/base.py +0 -152
  99. ensemble_analyzer-1a0/src/ensemble_analyzer/_spectral/base.py +0 -332
  100. ensemble_analyzer-1a0/src/ensemble_analyzer/cli/protocol_wizard.py +0 -561
  101. ensemble_analyzer-1a0/src/ensemble_analyzer/cli/regraph.py +0 -105
  102. ensemble_analyzer-1a0/src/ensemble_analyzer/constants.py +0 -75
  103. ensemble_analyzer-1a0/src/ensemble_analyzer/io_utils.py +0 -90
  104. ensemble_analyzer-1a0/src/ensemble_analyzer/launch.py +0 -86
  105. ensemble_analyzer-1a0/src/ensemble_analyzer.egg-info/requires.txt +0 -8
  106. ensemble_analyzer-1a0/test/test_calculation_executor.py +0 -49
  107. ensemble_analyzer-1a0/test/test_calculator.py +0 -91
  108. ensemble_analyzer-1a0/test/test_checkpoint_manager.py +0 -75
  109. ensemble_analyzer-1a0/test/test_config.py +0 -40
  110. ensemble_analyzer-1a0/test/test_conformer.py +0 -60
  111. ensemble_analyzer-1a0/test/test_data_structure.py +0 -91
  112. ensemble_analyzer-1a0/test/test_experimental.py +0 -71
  113. ensemble_analyzer-1a0/test/test_integration.py +0 -85
  114. ensemble_analyzer-1a0/test/test_logger.py +0 -74
  115. ensemble_analyzer-1a0/test/test_parser_parameters.py +0 -154
  116. ensemble_analyzer-1a0/test/test_parsers.py +0 -112
  117. ensemble_analyzer-1a0/test/test_protocol_executor.py +0 -70
  118. ensemble_analyzer-1a0/test/test_pruning_manager.py +0 -76
  119. ensemble_analyzer-1a0/test/test_rrho.py +0 -55
  120. ensemble_analyzer-1a0/test/test_spectral.py +0 -104
  121. ensemble_analyzer-1a0/test/test_spectral_compare.py +0 -90
  122. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/LICENSE +0 -0
  123. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/setup.cfg +0 -0
  124. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/__main__.py +0 -0
  125. {ensemble_analyzer-1a0/src/ensemble_analyzer/_clustering → ensemble_analyzer-1.2/src/ensemble_analyzer/_logger}/__init__.py +0 -0
  126. {ensemble_analyzer-1a0/src/ensemble_analyzer/_conformer → ensemble_analyzer-1.2/src/ensemble_analyzer/_managers}/__init__.py +0 -0
  127. {ensemble_analyzer-1a0/src/ensemble_analyzer/_logger → ensemble_analyzer-1.2/src/ensemble_analyzer/_spectral}/__init__.py +0 -0
  128. {ensemble_analyzer-1a0/src/ensemble_analyzer/_managers → ensemble_analyzer-1.2/src/ensemble_analyzer/cli}/__init__.py +0 -0
  129. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/cli/pickle_editor/__init__.py +0 -0
  130. {ensemble_analyzer-1a0/src/ensemble_analyzer/_protocol → ensemble_analyzer-1.2/src/ensemble_analyzer/conformer}/__init__.py +0 -0
  131. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/parameters_file/basis_sets +0 -0
  132. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/parameters_file/default_protocol.json +0 -0
  133. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/parameters_file/default_threshold.json +0 -0
  134. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer/parameters_file/functionals +0 -0
  135. {ensemble_analyzer-1a0/src/ensemble_analyzer/_spectral → ensemble_analyzer-1.2/src/ensemble_analyzer/protocol}/__init__.py +0 -0
  136. {ensemble_analyzer-1a0/src/ensemble_analyzer/_protocol → ensemble_analyzer-1.2/src/ensemble_analyzer/protocol}/solvent.py +0 -0
  137. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer.egg-info/dependency_links.txt +0 -0
  138. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/src/ensemble_analyzer.egg-info/entry_points.txt +0 -0
  139. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/test/test_clustering.py +0 -0
  140. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/test/test_ensemble_io.py +0 -0
  141. {ensemble_analyzer-1a0 → ensemble_analyzer-1.2}/test/test_high_level.py +0 -0
  142. /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: 1a0
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: >=3.11
24
+ Requires-Python: <3.15,>=3.12
25
25
  Description-Content-Type: text/markdown
26
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
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
- [![Python](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
73
+ [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13%20%7C%203.14-blue.svg)](https://www.python.org/downloads/)
39
74
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](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 Gaussian
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** ≥ 3.11
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
- - Install [ORCA](https://orcaforum.kofo.mpg.de/app.php/portal) from the ORCA Forum
77
- - *Optional*: Install Gaussian, if licensed
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
- - Export ORCA verion
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 ORCAVERSION="x.y.z"
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": {"funcional": "r2SCAN-3c", "opt": true, "freq": true,"cluster": 5, "comment": "Initial Optimization cluster into 5 families"},
91
- "1": {"funcional": "wB97X-D4rev", "basis": "def2-QZVPPD", "comment": "Single Point energy evaluation"}
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. Restart from Checkpoint
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
- | `calculator` | str | Set the calculator | `orca` (default), `gaussian` |
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⁻¹] | `30.0`, `50.0` |
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
- | `solvent` | dict | Implicit solvation | `{"solvent": "water", "model": "SMD"}` |
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 setting.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.
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}] [--preview] [--no-strict]
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 colour
279
+ Change color
190
280
  --linestyle LABEL STYLE, -ls LABEL STYLE
191
- Change line linestyle (e.g., -, --, :, -. )
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
- python enan_graph_editor plot.pkl
294
+ enan_graph_editor plot.pkl
203
295
 
204
296
  BATCH MODE (examples):
205
- python enan_graph_editor plot.pkl --batch --list
206
- python enan_graph_editor plot.pkl --batch --rename "Protocol 1" "Proto A"
207
- python enan_graph_editor plot.pkl --batch --color "Experimental" red --output new.pkl
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-3.0 License. See the LICENSE file for details.
345
+ This software is licensed under the MIT License. See the LICENSE file for details.
234
346
 
235
347
  ## 📞 Support and contact
236
348
 
@@ -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
- [![Python](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
2
+ [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13%20%7C%203.14-blue.svg)](https://www.python.org/downloads/)
39
3
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](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 Gaussian
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** ≥ 3.11
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
- - Install [ORCA](https://orcaforum.kofo.mpg.de/app.php/portal) from the ORCA Forum
77
- - *Optional*: Install Gaussian, if licensed
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
- - Export ORCA verion
65
+ Point to your model weights directory:
80
66
  ```bash
81
- export ORCAVERSION="x.y.z"
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": {"funcional": "r2SCAN-3c", "opt": true, "freq": true,"cluster": 5, "comment": "Initial Optimization cluster into 5 families"},
91
- "1": {"funcional": "wB97X-D4rev", "basis": "def2-QZVPPD", "comment": "Single Point energy evaluation"}
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. Restart from Checkpoint
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
- | `calculator` | str | Set the calculator | `orca` (default), `gaussian` |
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⁻¹] | `30.0`, `50.0` |
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
- | `solvent` | dict | Implicit solvation | `{"solvent": "water", "model": "SMD"}` |
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 setting.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.
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}] [--preview] [--no-strict]
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 colour
208
+ Change color
190
209
  --linestyle LABEL STYLE, -ls LABEL STYLE
191
- Change line linestyle (e.g., -, --, :, -. )
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
- python enan_graph_editor plot.pkl
223
+ enan_graph_editor plot.pkl
203
224
 
204
225
  BATCH MODE (examples):
205
- python enan_graph_editor plot.pkl --batch --list
206
- python enan_graph_editor plot.pkl --batch --rename "Protocol 1" "Proto A"
207
- python enan_graph_editor plot.pkl --batch --color "Experimental" red --output new.pkl
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-3.0 License. See the LICENSE file for details.
274
+ This software is licensed under the MIT License. See the LICENSE file for details.
234
275
 
235
276
  ## 📞 Support and contact
236
277