pythonQEPest 2.0.0a3__tar.gz → 2.0.0a4__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.
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/LICENSE +21 -21
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/PKG-INFO +1 -1
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/README.md +198 -198
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pyproject.toml +46 -46
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/.env.example +3 -3
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/__init__.py +11 -11
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/cli/__init__.py +7 -7
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/cli/cli.py +101 -101
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/config/__init__.py +11 -11
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/config/config_provider.py +9 -9
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/config/normalise.py +12 -12
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/config/qepest_config.py +31 -31
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/core/__init__.py +7 -7
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/core/qepest.py +98 -98
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/core/qepest_meta.py +28 -28
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/data.txt +1 -1
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/data.txt.out +2 -2
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/QEPestData.py +21 -21
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/QEPestFile.py +34 -34
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/QEPestInput.py +60 -60
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/QEPestOutput.py +13 -13
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/__init__.py +27 -27
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/coefficients/QEPestCoefficient.py +57 -57
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/coefficients/QEPestCoefficientList.py +29 -29
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/coefficients/QEPestCoefficientNumerics.py +44 -44
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/coefficients/__init__.py +7 -7
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/normalisation/Normaliser.py +15 -15
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/pest_type/PestTypeCoefficient.py +30 -30
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/pest_type/PestTypeConfig.py +9 -9
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/pest_type/__init__.py +4 -4
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/__init__.py +7 -7
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/actions/__init__.py +9 -9
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/actions/action_clicks.py +42 -42
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/actions/actions_crud.py +131 -131
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/actions/actions_other.py +126 -126
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/ButtonsFrame.py +50 -50
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/DataTree.py +23 -23
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/EditWindow.py +63 -63
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/Menu.py +12 -12
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/ResultTree.py +22 -22
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/SaveButton.py +10 -10
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/__init__.py +17 -17
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/gui.py +87 -87
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/gui_meta.py +17 -17
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/utility/DataManager.py +76 -76
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/utility/DataManagerMeta.py +8 -8
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/utility/__init__.py +6 -6
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/__init__.py +17 -17
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/check_nan.py +8 -8
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/compute_df.py +5 -5
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/get_num_of_cols.py +2 -2
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/get_values_from_line.py +5 -5
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/round_to_4digs.py +2 -2
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/logger.py +58 -58
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/main.py +4 -4
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/providers/__init__.py +6 -6
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/providers/default_provider.py +23 -23
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/providers/json_provider.py +30 -30
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/services/QEPestFileService.py +125 -125
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/services/__init__.py +3 -3
- pythonqepest-2.0.0a3/pythonQEPest/providers/txt_provider.py +0 -46
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/config/qepest_default.py +0 -0
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/normalisation/__init__.py +0 -0
- {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/norm.py +0 -0
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 PonyLianna
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 PonyLianna
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -1,198 +1,198 @@
|
|
|
1
|
-
# pythonQEPest
|
|
2
|
-
|
|
3
|
-
[](https://github.com/PonyLianna/pythonQEPest/actions/workflows/python-package.yml)
|
|
4
|
-
[](https://pypi.org/project/pythonQEPest/)
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Python implementation of QEPest (Quantitative Estimation of Pesticide), a program for scoring molecules as herbicides (QEH), insecticides (QEI), and fungicides (QEF).
|
|
8
|
-
|
|
9
|
-
Originally published in: [J Cheminform - QEPest](https://jcheminf.biomedcentral.com/articles/10.1186/s13321-014-0042-6)
|
|
10
|
-
Original Program Link is [here](https://static-content.springer.com/esm/art%3A10.1186%2Fs13321-014-0042-6/MediaObjects/13321_2014_42_MOESM2_ESM.zip)
|
|
11
|
-
|
|
12
|
-
## Features
|
|
13
|
-
|
|
14
|
-
- Calculate pesticide scores for herbicidal, insecticidal, and fungicidal activity
|
|
15
|
-
- Command-line interface (CLI)
|
|
16
|
-
- Graphical User Interface (GUI)
|
|
17
|
-
- Support for JSON and TXT output formats
|
|
18
|
-
|
|
19
|
-
### Pre-built binaries
|
|
20
|
-
|
|
21
|
-
Download ready-to-use executables from [Releases](https://github.com/PonyLianna/pythonQEPest/releases):
|
|
22
|
-
|
|
23
|
-
| Platform | Download |
|
|
24
|
-
|----------|----------|
|
|
25
|
-
| Windows CLI | [main.exe](https://github.com/PonyLianna/pythonQEPest/releases/download/v2.0.0-alpha/main.exe) |
|
|
26
|
-
| Windows GUI | [gui.exe](https://github.com/PonyLianna/pythonQEPest/releases/download/v2.0.0-alpha/gui.exe) |
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
## Installation
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
pip install pythonQEPest
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Or from source:
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
git clone https://github.com/PonyLianna/pythonQEPest.git
|
|
39
|
-
cd pythonQEPest
|
|
40
|
-
poetry install
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### With GUI support
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
pip install pythonQEPest[gui]
|
|
47
|
-
# or
|
|
48
|
-
poetry install --extras ui
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
## Quick Start
|
|
53
|
-
|
|
54
|
-
### CLI
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
pythonqepest -i data.txt -o result.txt
|
|
58
|
-
pythonqepest --input data.txt --format json
|
|
59
|
-
pythonqepest -v # show version
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### GUI
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
pythonqepest-gui
|
|
66
|
-
# or
|
|
67
|
-
python -m pythonQEPest.gui.gui
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Python API
|
|
71
|
-
|
|
72
|
-
```python
|
|
73
|
-
from pythonQEPest import QEPest, QEPestInput
|
|
74
|
-
|
|
75
|
-
# Create input data
|
|
76
|
-
qepest = QEPest()
|
|
77
|
-
qepest.initialize_coefficients()
|
|
78
|
-
qepest.initialize_normalisers()
|
|
79
|
-
|
|
80
|
-
# From individual values
|
|
81
|
-
inp = QEPestInput(
|
|
82
|
-
name="mol1",
|
|
83
|
-
mol_weight=240.2127,
|
|
84
|
-
log_p=3.2392,
|
|
85
|
-
hbond_acceptors=5,
|
|
86
|
-
hbond_donors=1,
|
|
87
|
-
rotatable_bonds=4,
|
|
88
|
-
aromatic_rings=1
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
result = qepest.compute_params(inp)
|
|
92
|
-
|
|
93
|
-
print(result.name) # mol1
|
|
94
|
-
print(result.data.qe_herb) # 0.8511
|
|
95
|
-
print(result.data.qe_insect) # 0.5339
|
|
96
|
-
print(result.data.qe_fung) # 0.6224
|
|
97
|
-
|
|
98
|
-
# Convert to array
|
|
99
|
-
print(result.to_array()) # ["mol1", 0.6224, 0.8511, 0.5339]
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## Input Format
|
|
103
|
-
|
|
104
|
-
The input file should be a tab-separated text file with the following columns:
|
|
105
|
-
|
|
106
|
-
| Column | Description |
|
|
107
|
-
|--------|-------------|
|
|
108
|
-
| Name | Molecule name |
|
|
109
|
-
| MW | Molecular weight (g/mol) |
|
|
110
|
-
| LogP | Hydrophobicity (octanol-water partition coefficient) |
|
|
111
|
-
| HBA | Number of hydrogen bond acceptors |
|
|
112
|
-
| HBD | Number of hydrogen bond donors |
|
|
113
|
-
| RB | Number of rotatable bonds |
|
|
114
|
-
| arR | Number of aromatic rings |
|
|
115
|
-
|
|
116
|
-
Example `data.txt`:
|
|
117
|
-
|
|
118
|
-
```
|
|
119
|
-
Name MW LogP HBA HBD RB arR
|
|
120
|
-
mol1 240.2127 3.2392 5 1 4 1
|
|
121
|
-
mol2 249.091 3.0273 3 1 5 1
|
|
122
|
-
mol3 308.354 2.1086 1 0 7 1
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## Output Format
|
|
126
|
-
|
|
127
|
-
### TXT (default output for CLI)
|
|
128
|
-
|
|
129
|
-
```
|
|
130
|
-
Name QEF QEH QEI
|
|
131
|
-
mol1 0.6224 0.8511 0.5339
|
|
132
|
-
mol2 0.7310 0.9750 0.6913
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### JSON
|
|
136
|
-
|
|
137
|
-
```json
|
|
138
|
-
[
|
|
139
|
-
{"name": "mol1", "qe_fung": 0.6224, "qe_herb": 0.8511, "qe_insect": 0.5339},
|
|
140
|
-
{"name": "mol2", "qe_fung": 0.731, "qe_herb": 0.975, "qe_insect": 0.6913}
|
|
141
|
-
]
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
## Configuration
|
|
145
|
-
|
|
146
|
-
### Custom Coefficients
|
|
147
|
-
|
|
148
|
-
```python
|
|
149
|
-
from pythonQEPest import QEPest
|
|
150
|
-
|
|
151
|
-
custom_coefficients = {
|
|
152
|
-
"herb": [
|
|
153
|
-
(70.77, 283.0, 84.97, -1.185),
|
|
154
|
-
(93.81, 3.077, 1.434, 0.6164),
|
|
155
|
-
# ... 6 tuples total
|
|
156
|
-
],
|
|
157
|
-
"insect": [...],
|
|
158
|
-
"fung": [...]
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
qepest = QEPest(coefficients=custom_coefficients)
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
### Custom Normalisers
|
|
165
|
-
|
|
166
|
-
```python
|
|
167
|
-
from pythonQEPest import QEPest
|
|
168
|
-
from pythonQEPest.dto.normalisation.Normaliser import Normaliser
|
|
169
|
-
|
|
170
|
-
qepest = QEPest(normalisers={"herb": Normaliser(...), ...})
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
## CLI Options
|
|
174
|
-
|
|
175
|
-
| Option | Description | Default |
|
|
176
|
-
|--------|-------------|---------|
|
|
177
|
-
| `-i`, `--input` | Input file path | data.txt |
|
|
178
|
-
| `-o`, `--output` | Output file path | data.out.txt |
|
|
179
|
-
| `-f`, `--format` | Output format (json, txt) | txt |
|
|
180
|
-
| `-v`, `--version` | Show version | - |
|
|
181
|
-
|
|
182
|
-
## Development
|
|
183
|
-
|
|
184
|
-
### Run tests
|
|
185
|
-
|
|
186
|
-
```bash
|
|
187
|
-
poetry run pytest
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
### Build
|
|
191
|
-
|
|
192
|
-
```bash
|
|
193
|
-
# CLI executable
|
|
194
|
-
poetry run poe build-simple
|
|
195
|
-
|
|
196
|
-
# GUI executable
|
|
197
|
-
poetry run poe build-gui
|
|
198
|
-
```
|
|
1
|
+
# pythonQEPest
|
|
2
|
+
|
|
3
|
+
[](https://github.com/PonyLianna/pythonQEPest/actions/workflows/python-package.yml)
|
|
4
|
+
[](https://pypi.org/project/pythonQEPest/)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Python implementation of QEPest (Quantitative Estimation of Pesticide), a program for scoring molecules as herbicides (QEH), insecticides (QEI), and fungicides (QEF).
|
|
8
|
+
|
|
9
|
+
Originally published in: [J Cheminform - QEPest](https://jcheminf.biomedcentral.com/articles/10.1186/s13321-014-0042-6)
|
|
10
|
+
Original Program Link is [here](https://static-content.springer.com/esm/art%3A10.1186%2Fs13321-014-0042-6/MediaObjects/13321_2014_42_MOESM2_ESM.zip)
|
|
11
|
+
|
|
12
|
+
## Features
|
|
13
|
+
|
|
14
|
+
- Calculate pesticide scores for herbicidal, insecticidal, and fungicidal activity
|
|
15
|
+
- Command-line interface (CLI)
|
|
16
|
+
- Graphical User Interface (GUI)
|
|
17
|
+
- Support for JSON and TXT output formats
|
|
18
|
+
|
|
19
|
+
### Pre-built binaries
|
|
20
|
+
|
|
21
|
+
Download ready-to-use executables from [Releases](https://github.com/PonyLianna/pythonQEPest/releases):
|
|
22
|
+
|
|
23
|
+
| Platform | Download |
|
|
24
|
+
|----------|----------|
|
|
25
|
+
| Windows CLI | [main.exe](https://github.com/PonyLianna/pythonQEPest/releases/download/v2.0.0-alpha/main.exe) |
|
|
26
|
+
| Windows GUI | [gui.exe](https://github.com/PonyLianna/pythonQEPest/releases/download/v2.0.0-alpha/gui.exe) |
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
## Installation
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
pip install pythonQEPest
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Or from source:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
git clone https://github.com/PonyLianna/pythonQEPest.git
|
|
39
|
+
cd pythonQEPest
|
|
40
|
+
poetry install
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### With GUI support
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pip install pythonQEPest[gui]
|
|
47
|
+
# or
|
|
48
|
+
poetry install --extras ui
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
## Quick Start
|
|
53
|
+
|
|
54
|
+
### CLI
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pythonqepest -i data.txt -o result.txt
|
|
58
|
+
pythonqepest --input data.txt --format json
|
|
59
|
+
pythonqepest -v # show version
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### GUI
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pythonqepest-gui
|
|
66
|
+
# or
|
|
67
|
+
python -m pythonQEPest.gui.gui
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Python API
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
from pythonQEPest import QEPest, QEPestInput
|
|
74
|
+
|
|
75
|
+
# Create input data
|
|
76
|
+
qepest = QEPest()
|
|
77
|
+
qepest.initialize_coefficients()
|
|
78
|
+
qepest.initialize_normalisers()
|
|
79
|
+
|
|
80
|
+
# From individual values
|
|
81
|
+
inp = QEPestInput(
|
|
82
|
+
name="mol1",
|
|
83
|
+
mol_weight=240.2127,
|
|
84
|
+
log_p=3.2392,
|
|
85
|
+
hbond_acceptors=5,
|
|
86
|
+
hbond_donors=1,
|
|
87
|
+
rotatable_bonds=4,
|
|
88
|
+
aromatic_rings=1
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
result = qepest.compute_params(inp)
|
|
92
|
+
|
|
93
|
+
print(result.name) # mol1
|
|
94
|
+
print(result.data.qe_herb) # 0.8511
|
|
95
|
+
print(result.data.qe_insect) # 0.5339
|
|
96
|
+
print(result.data.qe_fung) # 0.6224
|
|
97
|
+
|
|
98
|
+
# Convert to array
|
|
99
|
+
print(result.to_array()) # ["mol1", 0.6224, 0.8511, 0.5339]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Input Format
|
|
103
|
+
|
|
104
|
+
The input file should be a tab-separated text file with the following columns:
|
|
105
|
+
|
|
106
|
+
| Column | Description |
|
|
107
|
+
|--------|-------------|
|
|
108
|
+
| Name | Molecule name |
|
|
109
|
+
| MW | Molecular weight (g/mol) |
|
|
110
|
+
| LogP | Hydrophobicity (octanol-water partition coefficient) |
|
|
111
|
+
| HBA | Number of hydrogen bond acceptors |
|
|
112
|
+
| HBD | Number of hydrogen bond donors |
|
|
113
|
+
| RB | Number of rotatable bonds |
|
|
114
|
+
| arR | Number of aromatic rings |
|
|
115
|
+
|
|
116
|
+
Example `data.txt`:
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
Name MW LogP HBA HBD RB arR
|
|
120
|
+
mol1 240.2127 3.2392 5 1 4 1
|
|
121
|
+
mol2 249.091 3.0273 3 1 5 1
|
|
122
|
+
mol3 308.354 2.1086 1 0 7 1
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Output Format
|
|
126
|
+
|
|
127
|
+
### TXT (default output for CLI)
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
Name QEF QEH QEI
|
|
131
|
+
mol1 0.6224 0.8511 0.5339
|
|
132
|
+
mol2 0.7310 0.9750 0.6913
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### JSON
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
[
|
|
139
|
+
{"name": "mol1", "qe_fung": 0.6224, "qe_herb": 0.8511, "qe_insect": 0.5339},
|
|
140
|
+
{"name": "mol2", "qe_fung": 0.731, "qe_herb": 0.975, "qe_insect": 0.6913}
|
|
141
|
+
]
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Configuration
|
|
145
|
+
|
|
146
|
+
### Custom Coefficients
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
from pythonQEPest import QEPest
|
|
150
|
+
|
|
151
|
+
custom_coefficients = {
|
|
152
|
+
"herb": [
|
|
153
|
+
(70.77, 283.0, 84.97, -1.185),
|
|
154
|
+
(93.81, 3.077, 1.434, 0.6164),
|
|
155
|
+
# ... 6 tuples total
|
|
156
|
+
],
|
|
157
|
+
"insect": [...],
|
|
158
|
+
"fung": [...]
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
qepest = QEPest(coefficients=custom_coefficients)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Custom Normalisers
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
from pythonQEPest import QEPest
|
|
168
|
+
from pythonQEPest.dto.normalisation.Normaliser import Normaliser
|
|
169
|
+
|
|
170
|
+
qepest = QEPest(normalisers={"herb": Normaliser(...), ...})
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## CLI Options
|
|
174
|
+
|
|
175
|
+
| Option | Description | Default |
|
|
176
|
+
|--------|-------------|---------|
|
|
177
|
+
| `-i`, `--input` | Input file path | data.txt |
|
|
178
|
+
| `-o`, `--output` | Output file path | data.out.txt |
|
|
179
|
+
| `-f`, `--format` | Output format (json, txt) | txt |
|
|
180
|
+
| `-v`, `--version` | Show version | - |
|
|
181
|
+
|
|
182
|
+
## Development
|
|
183
|
+
|
|
184
|
+
### Run tests
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
poetry run pytest
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Build
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# CLI executable
|
|
194
|
+
poetry run poe build-simple
|
|
195
|
+
|
|
196
|
+
# GUI executable
|
|
197
|
+
poetry run poe build-gui
|
|
198
|
+
```
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
[project]
|
|
2
|
-
name = "pythonQEPest"
|
|
3
|
-
version = "2.0.
|
|
4
|
-
description = "Java QEPest but written in Python"
|
|
5
|
-
readme = "README.md"
|
|
6
|
-
requires-python = ">=3.12,<3.15"
|
|
7
|
-
authors = [{ name = "Lina", email = "knocker767@gmail.com" }]
|
|
8
|
-
dependencies = ["pydantic==2.12.5", "python-dotenv>=1.2.1,<2.0.0"]
|
|
9
|
-
|
|
10
|
-
[project.optional-dependencies]
|
|
11
|
-
gui = ["pyperclip>=1.11.0,<2.0.0"]
|
|
12
|
-
rdkit = ["rdkit (>=2024.3.1,<2026.0.0)"]
|
|
13
|
-
|
|
14
|
-
[project.scripts]
|
|
15
|
-
pythonqepest = "pythonQEPest.cli.cli:main"
|
|
16
|
-
|
|
17
|
-
[project.gui-scripts]
|
|
18
|
-
pythonqepest-gui = "pythonQEPest.gui.gui:main"
|
|
19
|
-
|
|
20
|
-
[tool.poetry]
|
|
21
|
-
packages = [{ include = "pythonQEPest" }]
|
|
22
|
-
|
|
23
|
-
[dependency-groups]
|
|
24
|
-
dev = [
|
|
25
|
-
"pytest (>=9.0.0)",
|
|
26
|
-
"pre-commit (>=4.3.0,<5.0.0)",
|
|
27
|
-
"pyinstaller (>=6.18.0,<7.0.0)",
|
|
28
|
-
"poethepoet[poetry_plugin] (>=0.39.0)",
|
|
29
|
-
"pytest-cov (>=7.0.0,<8.0.0)",
|
|
30
|
-
"twine (>=6.2.0,<7.0.0)",
|
|
31
|
-
]
|
|
32
|
-
|
|
33
|
-
[build-system]
|
|
34
|
-
requires = ["poetry-core>=1.0.0", "setuptools>=40.8.0"]
|
|
35
|
-
build-backend = "poetry.core.masonry.api"
|
|
36
|
-
|
|
37
|
-
[tool.flake8]
|
|
38
|
-
max-line-length = 88
|
|
39
|
-
extend-ignore = ["E203", "W503"]
|
|
40
|
-
exclude = [".venv", ".git", "__pycache__", "build", "dist"]
|
|
41
|
-
|
|
42
|
-
[tool.poe.tasks]
|
|
43
|
-
test = "pytest"
|
|
44
|
-
build-simple = "pyinstaller --onefile pythonQEPest/main.py"
|
|
45
|
-
build-gui = "pyinstaller --onefile --noconsole pythonQEPest/gui/gui.py"
|
|
46
|
-
publish-pypi = "twine upload --repository pythonQEPest dist/*"
|
|
1
|
+
[project]
|
|
2
|
+
name = "pythonQEPest"
|
|
3
|
+
version = "2.0.0a4"
|
|
4
|
+
description = "Java QEPest but written in Python"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.12,<3.15"
|
|
7
|
+
authors = [{ name = "Lina", email = "knocker767@gmail.com" }]
|
|
8
|
+
dependencies = ["pydantic==2.12.5", "python-dotenv>=1.2.1,<2.0.0"]
|
|
9
|
+
|
|
10
|
+
[project.optional-dependencies]
|
|
11
|
+
gui = ["pyperclip>=1.11.0,<2.0.0"]
|
|
12
|
+
rdkit = ["rdkit (>=2024.3.1,<2026.0.0)"]
|
|
13
|
+
|
|
14
|
+
[project.scripts]
|
|
15
|
+
pythonqepest = "pythonQEPest.cli.cli:main"
|
|
16
|
+
|
|
17
|
+
[project.gui-scripts]
|
|
18
|
+
pythonqepest-gui = "pythonQEPest.gui.gui:main"
|
|
19
|
+
|
|
20
|
+
[tool.poetry]
|
|
21
|
+
packages = [{ include = "pythonQEPest" }]
|
|
22
|
+
|
|
23
|
+
[dependency-groups]
|
|
24
|
+
dev = [
|
|
25
|
+
"pytest (>=9.0.0)",
|
|
26
|
+
"pre-commit (>=4.3.0,<5.0.0)",
|
|
27
|
+
"pyinstaller (>=6.18.0,<7.0.0)",
|
|
28
|
+
"poethepoet[poetry_plugin] (>=0.39.0)",
|
|
29
|
+
"pytest-cov (>=7.0.0,<8.0.0)",
|
|
30
|
+
"twine (>=6.2.0,<7.0.0)",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
[build-system]
|
|
34
|
+
requires = ["poetry-core>=1.0.0", "setuptools>=40.8.0"]
|
|
35
|
+
build-backend = "poetry.core.masonry.api"
|
|
36
|
+
|
|
37
|
+
[tool.flake8]
|
|
38
|
+
max-line-length = 88
|
|
39
|
+
extend-ignore = ["E203", "W503"]
|
|
40
|
+
exclude = [".venv", ".git", "__pycache__", "build", "dist"]
|
|
41
|
+
|
|
42
|
+
[tool.poe.tasks]
|
|
43
|
+
test = "pytest"
|
|
44
|
+
build-simple = "pyinstaller --onefile pythonQEPest/main.py"
|
|
45
|
+
build-gui = "pyinstaller --onefile --noconsole pythonQEPest/gui/gui.py"
|
|
46
|
+
publish-pypi = "twine upload --repository pythonQEPest dist/*"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
LOG_LEVEL="INFO"
|
|
2
|
-
LOG_FILE_LOCATION="logs/app.log"
|
|
3
|
-
|
|
1
|
+
LOG_LEVEL="INFO"
|
|
2
|
+
LOG_FILE_LOCATION="logs/app.log"
|
|
3
|
+
|
|
4
4
|
APP_DEBUG_ENABLE="false"
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
from pythonQEPest.core import QEPest
|
|
2
|
-
from pythonQEPest.dto import QEPestData
|
|
3
|
-
from pythonQEPest.dto import QEPestInput
|
|
4
|
-
from pythonQEPest.dto import QEPestOutput
|
|
5
|
-
|
|
6
|
-
__all__ = [
|
|
7
|
-
"QEPest",
|
|
8
|
-
"QEPestData",
|
|
9
|
-
"QEPestInput",
|
|
10
|
-
"QEPestOutput",
|
|
11
|
-
]
|
|
1
|
+
from pythonQEPest.core import QEPest
|
|
2
|
+
from pythonQEPest.dto import QEPestData
|
|
3
|
+
from pythonQEPest.dto import QEPestInput
|
|
4
|
+
from pythonQEPest.dto import QEPestOutput
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"QEPest",
|
|
8
|
+
"QEPestData",
|
|
9
|
+
"QEPestInput",
|
|
10
|
+
"QEPestOutput",
|
|
11
|
+
]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
def main():
|
|
2
|
-
from pythonQEPest.cli.cli import main as _main
|
|
3
|
-
|
|
4
|
-
return _main()
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
__all__ = ["main"]
|
|
1
|
+
def main():
|
|
2
|
+
from pythonQEPest.cli.cli import main as _main
|
|
3
|
+
|
|
4
|
+
return _main()
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
__all__ = ["main"]
|