pxmeter 0.1.0__tar.gz → 0.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.
- pxmeter-0.1.2/PKG-INFO +32 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/README.md +24 -13
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/cli.py +5 -2
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/configs/data_config.py +26 -8
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/data/ccd.py +3 -16
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/data/utils.py +13 -2
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/mapping.py +1 -1
- pxmeter-0.1.2/pxmeter.egg-info/PKG-INFO +32 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/setup.py +1 -1
- pxmeter-0.1.0/PKG-INFO +0 -10
- pxmeter-0.1.0/pxmeter.egg-info/PKG-INFO +0 -10
- {pxmeter-0.1.0 → pxmeter-0.1.2}/LICENSE +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/MANIFEST.in +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/__init__.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/calc_metric.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/configs/__init__.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/configs/run_config.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/constants.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/data/__init__.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/data/parser.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/data/struct.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/data/writer.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/eval.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/metrics/__init__.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/metrics/lddt_metrics.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/metrics/rmsd.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/metrics/rmsd_metrics.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/permutation/__init__.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/permutation/atom.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/permutation/chain.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter/utils.py +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter.egg-info/SOURCES.txt +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter.egg-info/dependency_links.txt +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter.egg-info/entry_points.txt +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter.egg-info/requires.txt +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/pxmeter.egg-info/top_level.txt +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/requirements.txt +0 -0
- {pxmeter-0.1.0 → pxmeter-0.1.2}/setup.cfg +0 -0
pxmeter-0.1.2/PKG-INFO
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pxmeter
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: PXMeter is a comprehensive toolkit for evaluating the quality of structures generated by biomolecular structure prediction models.
|
|
5
|
+
Author: Bytedance Inc.
|
|
6
|
+
Author-email: ai4s-bio@bytedance.com
|
|
7
|
+
License: Apache 2.0 License
|
|
8
|
+
Platform: manylinux1
|
|
9
|
+
Requires-Python: >=3.11
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: biotite>=1.2.0
|
|
12
|
+
Requires-Dist: dockq==2.1.3
|
|
13
|
+
Requires-Dist: gemmi==0.7.0
|
|
14
|
+
Requires-Dist: joblib
|
|
15
|
+
Requires-Dist: ml_collections
|
|
16
|
+
Requires-Dist: numpy
|
|
17
|
+
Requires-Dist: pandas
|
|
18
|
+
Requires-Dist: pdbeccdutils==0.8.5
|
|
19
|
+
Requires-Dist: posebusters==0.3.1
|
|
20
|
+
Requires-Dist: rdkit>=2024.09.6
|
|
21
|
+
Requires-Dist: scipy
|
|
22
|
+
Requires-Dist: tabulate
|
|
23
|
+
Requires-Dist: tqdm
|
|
24
|
+
Requires-Dist: click
|
|
25
|
+
Dynamic: author
|
|
26
|
+
Dynamic: author-email
|
|
27
|
+
Dynamic: license
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
Dynamic: platform
|
|
30
|
+
Dynamic: requires-dist
|
|
31
|
+
Dynamic: requires-python
|
|
32
|
+
Dynamic: summary
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
[](https://www.python.org/downloads/)
|
|
5
5
|
|
|
6
6
|
<div align="left" style="margin: 20px 0;">
|
|
7
|
-
<span style="margin: 0 10px;">📄 <a href="
|
|
8
|
-
Structure Prediction Benchmarks with PXMeter</a></span>
|
|
7
|
+
<span style="margin: 0 10px;">📄 <a href="https://www.biorxiv.org/content/10.1101/2025.07.17.664878v1">From Dataset Curation to Unified Evaluation: Revisiting
|
|
8
|
+
Structure Prediction Benchmarks with PXMeter</a></span>
|
|
9
9
|
</div>
|
|
10
10
|
|
|
11
11
|
PXMeter is a comprehensive toolkit for evaluating the quality of structures generated by biomolecular structure prediction models, with support for proteins, nucleic acids, and small molecules.
|
|
@@ -86,7 +86,12 @@ Refer to [benchmark/README.md](./benchmark/README.md) for evaluation protocols o
|
|
|
86
86
|
- PoseBusters V2
|
|
87
87
|
|
|
88
88
|
The benchmark data is released under the CC0 license.
|
|
89
|
-
We include code in the `benchmark` directory that evaluates various models using PXMeter and aggregates their metrics.
|
|
89
|
+
We include code in the `benchmark` directory that evaluates various models using PXMeter and aggregates their metrics.
|
|
90
|
+
This serves as an example of best practices for using the tool. For more details, please refer to our paper:
|
|
91
|
+
|
|
92
|
+
📄 <a href="https://www.biorxiv.org/content/10.1101/2025.07.17.664878v1">From Dataset Curation to Unified Evaluation: Revisiting
|
|
93
|
+
Structure Prediction Benchmarks with PXMeter</a>
|
|
94
|
+
|
|
90
95
|
|
|
91
96
|
|
|
92
97
|
## 💪 Contributing to PXMeter
|
|
@@ -102,21 +107,27 @@ pre-commit install
|
|
|
102
107
|
```
|
|
103
108
|
|
|
104
109
|
|
|
105
|
-
## 🚧 Limitations
|
|
106
|
-
- PXMeter supports chain/atom permutations but not residue-level permutations. As a result, the accuracy of evaluation for branched chains, such as glycans, cannot be fully guaranteed.
|
|
107
|
-
- It is recommended to use CIF files from the RCSB PDB as references, as they ensure content accuracy. All development and testing were conducted exclusively on CIF files from this source.
|
|
108
|
-
|
|
109
|
-
|
|
110
110
|
## ✍️ Citing PXMeter
|
|
111
|
+
If you use PXMeter in your research, please cite the following:
|
|
111
112
|
```bibtex
|
|
112
|
-
@
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
113
|
+
@article {Ma2025.07.17.664878,
|
|
114
|
+
author = {Ma, Wenzhi and Liu, Zhenyu and Yang, Jincai and Lu, Chan and Zhang, Hanyu and Xiao, Wenzhi},
|
|
115
|
+
title = {From Dataset Curation to Unified Evaluation: Revisiting Structure Prediction Benchmarks with PXMeter},
|
|
116
|
+
year = {2025},
|
|
117
|
+
doi = {10.1101/2025.07.17.664878},
|
|
118
|
+
publisher = {Cold Spring Harbor Laboratory},
|
|
119
|
+
URL = {https://www.biorxiv.org/content/early/2025/07/22/2025.07.17.664878},
|
|
120
|
+
eprint = {https://www.biorxiv.org/content/early/2025/07/22/2025.07.17.664878.full.pdf},
|
|
121
|
+
journal = {bioRxiv}
|
|
117
122
|
}
|
|
118
123
|
```
|
|
119
124
|
|
|
125
|
+
|
|
126
|
+
## 🚧 Limitations
|
|
127
|
+
- PXMeter supports chain/atom permutations but not residue-level permutations. As a result, the accuracy of evaluation for branched chains, such as glycans, cannot be fully guaranteed.
|
|
128
|
+
- It is recommended to use CIF files from the RCSB PDB as references, as they ensure content accuracy. All development and testing were conducted exclusively on CIF files from this source.
|
|
129
|
+
|
|
130
|
+
|
|
120
131
|
## 🛡️ Security
|
|
121
132
|
If you discover a potential security issue in this project, or think you may
|
|
122
133
|
have discovered a security issue, we ask that you notify Bytedance Security via our [security center](https://security.bytedance.com/src) or [vulnerability reporting email](sec@bytedance.com).
|
|
@@ -18,9 +18,10 @@ from pathlib import Path
|
|
|
18
18
|
import click
|
|
19
19
|
|
|
20
20
|
from pxmeter.configs.data_config import (
|
|
21
|
+
CCD_BLOCKS_JSON,
|
|
21
22
|
COMPONENTS_FILE,
|
|
22
23
|
download_ccd_cif,
|
|
23
|
-
|
|
24
|
+
make_precomputed_json_from_ccd,
|
|
24
25
|
ONE_LETTER_CODE_JSON,
|
|
25
26
|
)
|
|
26
27
|
from pxmeter.eval import evaluate, MetricResult
|
|
@@ -176,4 +177,6 @@ def update():
|
|
|
176
177
|
Update the CCD database.
|
|
177
178
|
"""
|
|
178
179
|
download_ccd_cif(output_path=COMPONENTS_FILE.parent)
|
|
179
|
-
|
|
180
|
+
make_precomputed_json_from_ccd(
|
|
181
|
+
COMPONENTS_FILE, CCD_BLOCKS_JSON, ONE_LETTER_CODE_JSON
|
|
182
|
+
)
|
|
@@ -55,7 +55,9 @@ def download_ccd_cif(output_path: Path):
|
|
|
55
55
|
logging.info("Download CCD CIF file successfully: %s", output_cif)
|
|
56
56
|
|
|
57
57
|
|
|
58
|
-
def
|
|
58
|
+
def make_precomputed_json_from_ccd(
|
|
59
|
+
components_file: Path, ccd_blocks_json: Path, one_letter_code_json: Path
|
|
60
|
+
):
|
|
59
61
|
"""
|
|
60
62
|
Make a one-letter code JSON file from the CCD CIF file.
|
|
61
63
|
|
|
@@ -65,17 +67,23 @@ def make_one_letter_code_json_from_ccd(components_file: Path, output_json: Path)
|
|
|
65
67
|
ccd_cif = gemmi.cif.read(str(components_file))
|
|
66
68
|
|
|
67
69
|
ccd_code_to_one_letter_code = {}
|
|
70
|
+
ccd_code_to_block = {}
|
|
68
71
|
for block in ccd_cif:
|
|
69
72
|
ccd_code = block.find_value("_chem_comp.id")
|
|
70
73
|
one_letter_code = block.find_value("_chem_comp.one_letter_code")
|
|
74
|
+
ccd_code_to_block[ccd_code] = block.as_string()
|
|
71
75
|
if one_letter_code is None or one_letter_code == "?":
|
|
72
76
|
continue
|
|
73
77
|
ccd_code_to_one_letter_code[ccd_code] = one_letter_code
|
|
74
78
|
|
|
75
|
-
with open(
|
|
76
|
-
json.dump(
|
|
79
|
+
with open(ccd_blocks_json, "w") as f:
|
|
80
|
+
json.dump(ccd_code_to_block, f, indent=4)
|
|
81
|
+
|
|
82
|
+
logging.info("Make CCD_BLOCKS_JSON successfully: %s", ccd_blocks_json)
|
|
77
83
|
|
|
78
|
-
|
|
84
|
+
with open(one_letter_code_json, "w") as f:
|
|
85
|
+
json.dump(ccd_code_to_one_letter_code, f, indent=4)
|
|
86
|
+
logging.info("Make ONE_LETTER_CODE_JSON successfully: %s", one_letter_code_json)
|
|
79
87
|
|
|
80
88
|
|
|
81
89
|
# default is <repo_dir>/ccd_cache/components.cif Your path for components file
|
|
@@ -84,20 +92,30 @@ def make_one_letter_code_json_from_ccd(components_file: Path, output_json: Path)
|
|
|
84
92
|
repo_dir = Path(__file__).absolute().parent.parent.parent
|
|
85
93
|
ccd_file_in_repo = repo_dir / "ccd_cache" / "components.cif"
|
|
86
94
|
COMPONENTS_FILE = Path(os.environ.get("PXM_CCD_FILE", ccd_file_in_repo))
|
|
87
|
-
|
|
95
|
+
|
|
96
|
+
CCD_BLOCKS_JSON = COMPONENTS_FILE.with_suffix(".json")
|
|
97
|
+
ONE_LETTER_CODE_JSON = COMPONENTS_FILE.parent / "one_letter_code.json"
|
|
88
98
|
|
|
89
99
|
if not COMPONENTS_FILE.exists():
|
|
90
100
|
logging.debug(
|
|
91
101
|
"CCD CIF file not found. Downloading CCD CIF file to %s", COMPONENTS_FILE.parent
|
|
92
102
|
)
|
|
93
103
|
download_ccd_cif(output_path=COMPONENTS_FILE.parent)
|
|
94
|
-
|
|
104
|
+
make_precomputed_json_from_ccd(
|
|
105
|
+
COMPONENTS_FILE, CCD_BLOCKS_JSON, ONE_LETTER_CODE_JSON
|
|
106
|
+
)
|
|
95
107
|
else:
|
|
96
108
|
logging.debug("Load CCD CIF file from: %s", COMPONENTS_FILE)
|
|
97
109
|
|
|
98
|
-
if not ONE_LETTER_CODE_JSON.exists():
|
|
99
|
-
|
|
110
|
+
if not ONE_LETTER_CODE_JSON.exists() or not CCD_BLOCKS_JSON.exists():
|
|
111
|
+
make_precomputed_json_from_ccd(
|
|
112
|
+
COMPONENTS_FILE, CCD_BLOCKS_JSON, ONE_LETTER_CODE_JSON
|
|
113
|
+
)
|
|
100
114
|
|
|
101
115
|
logging.debug("Load CCD one-letter code from: %s", ONE_LETTER_CODE_JSON)
|
|
102
116
|
with open(ONE_LETTER_CODE_JSON, "r") as f:
|
|
103
117
|
CCD_ONE_LETTER_CODE = json.load(f)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
with open(CCD_BLOCKS_JSON, "r") as f:
|
|
121
|
+
CCD_BLOCKS = json.load(f)
|
|
@@ -24,7 +24,7 @@ from pdbeccdutils.core import ccd_reader
|
|
|
24
24
|
from rdkit import Chem
|
|
25
25
|
from rdkit.Geometry import Point3D
|
|
26
26
|
|
|
27
|
-
from pxmeter.configs.data_config import
|
|
27
|
+
from pxmeter.configs.data_config import CCD_BLOCKS
|
|
28
28
|
from pxmeter.data.utils import (
|
|
29
29
|
get_inter_residue_bonds,
|
|
30
30
|
get_mol_graph_matches,
|
|
@@ -34,17 +34,6 @@ from pxmeter.data.utils import (
|
|
|
34
34
|
logging.getLogger("rdkit").setLevel(logging.ERROR)
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
@functools.lru_cache
|
|
38
|
-
def _gemmi_load_ccd_cif() -> gemmi.cif.Document:
|
|
39
|
-
"""
|
|
40
|
-
Load the CCD components file using the gemmi library.
|
|
41
|
-
|
|
42
|
-
Returns:
|
|
43
|
-
gemmi.cif.Document: gemmi ccd components file
|
|
44
|
-
"""
|
|
45
|
-
return gemmi.cif.read(str(COMPONENTS_FILE))
|
|
46
|
-
|
|
47
|
-
|
|
48
37
|
@functools.lru_cache
|
|
49
38
|
def get_ccd_mol_from_cif(ccd_code: str) -> Chem.Mol:
|
|
50
39
|
"""
|
|
@@ -57,10 +46,8 @@ def get_ccd_mol_from_cif(ccd_code: str) -> Chem.Mol:
|
|
|
57
46
|
mol (Chem.Mol): The RDKit molecule object corresponding to the given CCD code.
|
|
58
47
|
Returns None if the CCD code is not found.
|
|
59
48
|
"""
|
|
60
|
-
ccd_cif = _gemmi_load_ccd_cif()
|
|
61
|
-
|
|
62
49
|
try:
|
|
63
|
-
ccd_block =
|
|
50
|
+
ccd_block = gemmi.cif.read_string(CCD_BLOCKS[ccd_code])[0]
|
|
64
51
|
except KeyError:
|
|
65
52
|
return
|
|
66
53
|
ccd_reader_result = ccd_reader._parse_pdb_mmcif(ccd_block, sanitize=True)
|
|
@@ -232,7 +219,7 @@ def get_ccd_perm_info(ccd_code: str) -> dict[str, Any]:
|
|
|
232
219
|
for node in removed_nodes:
|
|
233
220
|
mol_graph.remove_node(node)
|
|
234
221
|
|
|
235
|
-
matches = get_mol_graph_matches(mol_graph, mol_graph)
|
|
222
|
+
matches = get_mol_graph_matches(mol_graph, mol_graph, max_matches=1000)
|
|
236
223
|
|
|
237
224
|
# re-index after removing H
|
|
238
225
|
reverted_old_atom_map = {v: k for k, v in mol.atom_map.items()}
|
|
@@ -234,13 +234,16 @@ def rdkit_mol_to_nx_graph(mol: Chem.Mol) -> nx.Graph:
|
|
|
234
234
|
return G
|
|
235
235
|
|
|
236
236
|
|
|
237
|
-
def get_mol_graph_matches(
|
|
237
|
+
def get_mol_graph_matches(
|
|
238
|
+
mol_graph1: nx.Graph, mol_graph2: nx.Graph, max_matches: int = 1000
|
|
239
|
+
) -> list[dict]:
|
|
238
240
|
"""
|
|
239
241
|
Find all isomorphisms between subgraph of mol_graph1 and mol_graph2.
|
|
240
242
|
|
|
241
243
|
Args:
|
|
242
244
|
mol_graph1 (nx.Graph): Source molecular graph (typically larger subgraph)
|
|
243
245
|
mol_graph2 (nx.Graph): Target molecular graph (typically smaller supergraph)
|
|
246
|
+
max_matches (int): Maximum number of matches to return. Default is 1000.
|
|
244
247
|
|
|
245
248
|
Returns:
|
|
246
249
|
list[dict]: List of node mapping dictionaries where each dictionary represents
|
|
@@ -254,4 +257,12 @@ def get_mol_graph_matches(mol_graph1: nx.Graph, mol_graph2: nx.Graph) -> list[di
|
|
|
254
257
|
mol_graph2,
|
|
255
258
|
node_match=lambda x, y: x["atomic_num"] == y["atomic_num"],
|
|
256
259
|
)
|
|
257
|
-
|
|
260
|
+
|
|
261
|
+
matches = []
|
|
262
|
+
num = 0
|
|
263
|
+
for i in isomatcher.subgraph_isomorphisms_iter():
|
|
264
|
+
matches.append(i)
|
|
265
|
+
num += 1
|
|
266
|
+
if num >= max_matches:
|
|
267
|
+
break
|
|
268
|
+
return matches
|
|
@@ -584,7 +584,7 @@ class MappingCIF:
|
|
|
584
584
|
ref_graph = rdkit_mol_to_nx_graph(ref_mol)
|
|
585
585
|
model_graph = rdkit_mol_to_nx_graph(model_mol)
|
|
586
586
|
try:
|
|
587
|
-
matches = get_mol_graph_matches(model_graph, ref_graph)
|
|
587
|
+
matches = get_mol_graph_matches(model_graph, ref_graph, max_matches=1)
|
|
588
588
|
assert len(matches) > 0
|
|
589
589
|
match = matches[0]
|
|
590
590
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pxmeter
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: PXMeter is a comprehensive toolkit for evaluating the quality of structures generated by biomolecular structure prediction models.
|
|
5
|
+
Author: Bytedance Inc.
|
|
6
|
+
Author-email: ai4s-bio@bytedance.com
|
|
7
|
+
License: Apache 2.0 License
|
|
8
|
+
Platform: manylinux1
|
|
9
|
+
Requires-Python: >=3.11
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: biotite>=1.2.0
|
|
12
|
+
Requires-Dist: dockq==2.1.3
|
|
13
|
+
Requires-Dist: gemmi==0.7.0
|
|
14
|
+
Requires-Dist: joblib
|
|
15
|
+
Requires-Dist: ml_collections
|
|
16
|
+
Requires-Dist: numpy
|
|
17
|
+
Requires-Dist: pandas
|
|
18
|
+
Requires-Dist: pdbeccdutils==0.8.5
|
|
19
|
+
Requires-Dist: posebusters==0.3.1
|
|
20
|
+
Requires-Dist: rdkit>=2024.09.6
|
|
21
|
+
Requires-Dist: scipy
|
|
22
|
+
Requires-Dist: tabulate
|
|
23
|
+
Requires-Dist: tqdm
|
|
24
|
+
Requires-Dist: click
|
|
25
|
+
Dynamic: author
|
|
26
|
+
Dynamic: author-email
|
|
27
|
+
Dynamic: license
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
Dynamic: platform
|
|
30
|
+
Dynamic: requires-dist
|
|
31
|
+
Dynamic: requires-python
|
|
32
|
+
Dynamic: summary
|
|
@@ -20,7 +20,7 @@ with open("requirements.txt") as f:
|
|
|
20
20
|
setup(
|
|
21
21
|
name="pxmeter",
|
|
22
22
|
python_requires=">=3.11",
|
|
23
|
-
version="0.1.
|
|
23
|
+
version="0.1.2",
|
|
24
24
|
description="PXMeter is a comprehensive toolkit for evaluating the quality of \
|
|
25
25
|
structures generated by biomolecular structure prediction models.",
|
|
26
26
|
author="Bytedance Inc.",
|
pxmeter-0.1.0/PKG-INFO
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: pxmeter
|
|
3
|
-
Version: 0.1.0
|
|
4
|
-
Summary: PXMeter is a comprehensive toolkit for evaluating the quality of structures generated by biomolecular structure prediction models.
|
|
5
|
-
Author: Bytedance Inc.
|
|
6
|
-
Author-email: ai4s-bio@bytedance.com
|
|
7
|
-
License: Apache 2.0 License
|
|
8
|
-
Platform: manylinux1
|
|
9
|
-
Requires-Python: >=3.11
|
|
10
|
-
License-File: LICENSE
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: pxmeter
|
|
3
|
-
Version: 0.1.0
|
|
4
|
-
Summary: PXMeter is a comprehensive toolkit for evaluating the quality of structures generated by biomolecular structure prediction models.
|
|
5
|
-
Author: Bytedance Inc.
|
|
6
|
-
Author-email: ai4s-bio@bytedance.com
|
|
7
|
-
License: Apache 2.0 License
|
|
8
|
-
Platform: manylinux1
|
|
9
|
-
Requires-Python: >=3.11
|
|
10
|
-
License-File: LICENSE
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|