boltz-vsynthes 1.0.32__py3-none-any.whl → 1.0.34__py3-none-any.whl

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.
@@ -2,6 +2,7 @@ from collections.abc import Mapping
2
2
  from dataclasses import dataclass
3
3
  from pathlib import Path
4
4
  from typing import Optional
5
+ import json
5
6
 
6
7
  import click
7
8
  import numpy as np
@@ -1221,7 +1222,7 @@ def parse_boltz_schema( # noqa: C901, PLR0915, PLR0912
1221
1222
  )
1222
1223
 
1223
1224
  # Parse a non-polymer
1224
- elif (entity_type == "ligand") and "ccd" in (items[0][entity_type]):
1225
+ elif (entity_type == "ligand") and ("ccd" in items[0][entity_type]):
1225
1226
  seq = items[0][entity_type]["ccd"]
1226
1227
 
1227
1228
  if isinstance(seq, str):
@@ -1425,15 +1426,43 @@ def parse_boltz_schema( # noqa: C901, PLR0915, PLR0912
1425
1426
  protein_chains.add(chain_name)
1426
1427
 
1427
1428
  # Add affinity info
1428
- if chain.affinity and affinity_info is not None:
1429
- msg = "Cannot compute affinity for multiple ligands!"
1430
- raise ValueError(msg)
1431
-
1432
1429
  if chain.affinity:
1433
- affinity_info = AffinityInfo(
1434
- chain_id=asym_id,
1435
- mw=chain.affinity_mw,
1436
- )
1430
+ # If this is a protein binder, we need to create affinity info for each ligand
1431
+ if chain_name in affinity_proteins:
1432
+ # Find all ligand chains
1433
+ ligand_chains = [
1434
+ (name, c) for name, c in chains.items()
1435
+ if c.type == const.chain_type_ids["NONPOLYMER"]
1436
+ ]
1437
+ if not ligand_chains:
1438
+ msg = "No ligand chains found for protein binder!"
1439
+ raise ValueError(msg)
1440
+
1441
+ # Create affinity info for each ligand
1442
+ for ligand_name, ligand_chain in ligand_chains:
1443
+ affinity_info = AffinityInfo(
1444
+ chain_id=asym_id,
1445
+ mw=chain.affinity_mw,
1446
+ )
1447
+ # Save the affinity info in a subfolder named after the ligand
1448
+ output_dir = Path(f"output/{ligand_name}")
1449
+ output_dir.mkdir(parents=True, exist_ok=True)
1450
+ # Save the affinity info
1451
+ with open(output_dir / "affinity_info.json", "w") as f:
1452
+ json.dump({
1453
+ "chain_id": asym_id,
1454
+ "mw": chain.affinity_mw,
1455
+ "ligand_name": ligand_name
1456
+ }, f)
1457
+ else:
1458
+ # This is a ligand binder
1459
+ if affinity_info is not None:
1460
+ msg = "Cannot compute affinity for multiple ligands!"
1461
+ raise ValueError(msg)
1462
+ affinity_info = AffinityInfo(
1463
+ chain_id=asym_id,
1464
+ mw=chain.affinity_mw,
1465
+ )
1437
1466
 
1438
1467
  # Find all copies of this chain in the assembly
1439
1468
  entity_id = int(chain.entity)
boltz/main.py CHANGED
@@ -27,9 +27,6 @@ from boltz.data.msa.mmseqs2 import run_mmseqs2
27
27
  from boltz.data.parse.a3m import parse_a3m
28
28
  from boltz.data.parse.csv import parse_csv
29
29
  from boltz.data.parse.fasta import parse_fasta
30
- from boltz.data.parse.pdb import parse_pdb
31
- from boltz.data.parse.pdb_download import parse_pdb_id
32
- from boltz.data.parse.sdf import parse_sdf
33
30
  from boltz.data.parse.yaml import parse_yaml
34
31
  from boltz.data.types import MSA, Manifest, Record
35
32
  from boltz.data.write.writer import BoltzAffinityWriter, BoltzWriter
@@ -294,28 +291,20 @@ def check_inputs(data: Path) -> list[Path]:
294
291
  if data.is_dir():
295
292
  data: list[Path] = list(data.glob("*"))
296
293
 
297
- # Filter out non .fasta, .yaml, .pdb, or .sdf files, raise
294
+ # Filter out non .fasta or .yaml files, raise
298
295
  # an error on directory and other file types
299
296
  for d in data:
300
297
  if d.is_dir():
301
- msg = f"Found directory {d} instead of .fasta, .yaml, .pdb, or .sdf."
298
+ msg = f"Found directory {d} instead of .fasta or .yaml."
302
299
  raise RuntimeError(msg)
303
- if d.suffix not in (".fa", ".fas", ".fasta", ".yml", ".yaml", ".pdb", ".sdf"):
300
+ if d.suffix not in (".fa", ".fas", ".fasta", ".yml", ".yaml"):
304
301
  msg = (
305
302
  f"Unable to parse filetype {d.suffix}, "
306
- "please provide a .fasta, .yaml, .pdb, or .sdf file."
303
+ "please provide a .fasta or .yaml file."
307
304
  )
308
305
  raise RuntimeError(msg)
309
306
  else:
310
- # Check if input is a PDB ID (4 characters)
311
- if len(data.stem) == 4 and data.stem.isalnum():
312
- # Create a temporary file to store the PDB ID
313
- temp_file = data.parent / f"{data.stem}.pdb"
314
- with temp_file.open("w") as f:
315
- f.write(data.stem)
316
- data = [temp_file]
317
- else:
318
- data = [data]
307
+ data = [data]
319
308
 
320
309
  return data
321
310
 
@@ -508,23 +497,13 @@ def process_input( # noqa: C901, PLR0912, PLR0915, D103
508
497
  target = parse_fasta(path, ccd, mol_dir, boltz2)
509
498
  elif path.suffix in (".yml", ".yaml"):
510
499
  target = parse_yaml(path, ccd, mol_dir, boltz2)
511
- elif path.suffix == ".pdb":
512
- # Check if this is a PDB ID file
513
- if path.stat().st_size <= 4: # File only contains PDB ID
514
- with path.open("r") as f:
515
- pdb_id = f.read().strip()
516
- target = parse_pdb_id(pdb_id, ccd, mol_dir, path.parent, boltz2)
517
- else:
518
- target = parse_pdb(path, ccd, mol_dir, boltz2)
519
- elif path.suffix == ".sdf":
520
- target = parse_sdf(path, ccd, mol_dir, boltz2)
521
500
  elif path.is_dir():
522
- msg = f"Found directory {path} instead of .fasta, .yaml, .pdb, or .sdf, skipping."
501
+ msg = f"Found directory {path} instead of .fasta or .yaml, skipping."
523
502
  raise RuntimeError(msg) # noqa: TRY301
524
503
  else:
525
504
  msg = (
526
505
  f"Unable to parse filetype {path.suffix}, "
527
- "please provide a .fasta, .yaml, .pdb, or .sdf file."
506
+ "please provide a .fasta or .yaml file."
528
507
  )
529
508
  raise RuntimeError(msg) # noqa: TRY301
530
509
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boltz-vsynthes
3
- Version: 1.0.32
3
+ Version: 1.0.34
4
4
  Summary: Boltz for VSYNTHES
5
5
  Requires-Python: <3.13,>=3.10
6
6
  Description-Content-Type: text/markdown
@@ -1,5 +1,5 @@
1
1
  boltz/__init__.py,sha256=F_-so3S40iZrSZ89Ge4TS6aZqwWyZXq_H4AXGDlbA_g,187
2
- boltz/main.py,sha256=fFXeW6PmVsbZtx0EVGBiczf3ulncuheeai1wpRVEhOI,40803
2
+ boltz/main.py,sha256=AMYdcqTLOL5Mbo8P2ix1KeNwTijH5fWNzKUnLHBNtn0,39735
3
3
  boltz/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  boltz/data/const.py,sha256=1M-88Z6HkfKY6MkNtqcj3b9P-oX9xEXluh3qM_u8dNU,26779
5
5
  boltz/data/mol.py,sha256=maOpPHEGX1VVXCIFY6pQNGF7gUBZPAfgSvuPf2QO1yc,34268
@@ -40,7 +40,7 @@ boltz/data/parse/mmcif.py,sha256=25kEXCkx-OuaawAs7cdz0fxdRu5_CCO0AV00u84PrjQ,368
40
40
  boltz/data/parse/mmcif_with_constraints.py,sha256=WHYZckSqUwu-Nb9vmVmxHmC7uxwVrF7AVUeVKsc5wGQ,51473
41
41
  boltz/data/parse/pdb.py,sha256=iybk4p2UgUy_ABGprDq_xxyPSdm1HAZsGTM0lhxVEwM,1654
42
42
  boltz/data/parse/pdb_download.py,sha256=wge-scX-lOatX0q83W1wOsaql99rYp-6uGWSHEc995M,2718
43
- boltz/data/parse/schema.py,sha256=liL6Dl4P1bEq-nYwm8DOAXPfl32yYi84MgrcFXpR-0M,64220
43
+ boltz/data/parse/schema.py,sha256=1saQOFI15H6TqoEupjsjnbX77UQfuST174kIErThdwY,65676
44
44
  boltz/data/parse/sdf.py,sha256=fs3MQVClDcCzxJaeVYiDuoh-fUrYc8Tcd5Bz8ws3FKI,2052
45
45
  boltz/data/parse/yaml.py,sha256=GRFRMtDD4PQ4PIpA_S1jj0vRaEu2LlZd_g4rN1zUrNo,1505
46
46
  boltz/data/sample/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -107,9 +107,9 @@ boltz/model/optim/scheduler.py,sha256=nB4jz0CZ4pR4n08LQngExL_pNycIdYI8AXVoHPnZWQ
107
107
  boltz/model/potentials/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
108
  boltz/model/potentials/potentials.py,sha256=vev8Vjfs-ML1hyrdv_R8DynG4wSFahJ6nzPWp7CYQqw,17507
109
109
  boltz/model/potentials/schedules.py,sha256=m7XJjfuF9uTX3bR9VisXv1rvzJjxiD8PobXRpcBBu1c,968
110
- boltz_vsynthes-1.0.32.dist-info/licenses/LICENSE,sha256=8GZ_1eZsUeG6jdqgJJxtciWzADfgLEV4LY8sKUOsJhc,1102
111
- boltz_vsynthes-1.0.32.dist-info/METADATA,sha256=mGtHYvFndm8HdHsMfvXFMu5x4CwNVAAgdP5o_CVGBgU,7171
112
- boltz_vsynthes-1.0.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
113
- boltz_vsynthes-1.0.32.dist-info/entry_points.txt,sha256=n5a5I35ntu9lmyr16oZgHPFY0b0YxjiixY7m7nbMTLc,41
114
- boltz_vsynthes-1.0.32.dist-info/top_level.txt,sha256=MgU3Jfb-ctWm07YGMts68PMjSh9v26D0gfG3dFRmVFA,6
115
- boltz_vsynthes-1.0.32.dist-info/RECORD,,
110
+ boltz_vsynthes-1.0.34.dist-info/licenses/LICENSE,sha256=8GZ_1eZsUeG6jdqgJJxtciWzADfgLEV4LY8sKUOsJhc,1102
111
+ boltz_vsynthes-1.0.34.dist-info/METADATA,sha256=h-T8W9FPQG5hynUMxYWhnJN4Ztt1XWoX4LgorJCEEYY,7171
112
+ boltz_vsynthes-1.0.34.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
113
+ boltz_vsynthes-1.0.34.dist-info/entry_points.txt,sha256=n5a5I35ntu9lmyr16oZgHPFY0b0YxjiixY7m7nbMTLc,41
114
+ boltz_vsynthes-1.0.34.dist-info/top_level.txt,sha256=MgU3Jfb-ctWm07YGMts68PMjSh9v26D0gfG3dFRmVFA,6
115
+ boltz_vsynthes-1.0.34.dist-info/RECORD,,