Source code for boltz_data.mol._to._to_bzcif
from itertools import groupby
import gemmi
import numpy as np
from boltz_data.mol._mol import BZMol
[docs]
def bzcif_from_bzmol(bzmol: BZMol, /) -> gemmi.cif.Block:
"""Convert a BZMol to a CIF block representation."""
bzmol_dict = bzmol.model_dump()
keys = sorted(bzmol_dict)
block = gemmi.cif.Block("test")
for prefix, subkeys in groupby(keys, lambda key: key.split("_")[0]):
columns = {}
for subkey in subkeys:
colname = subkey.split("_", 1)[1]
value = bzmol_dict[subkey]
if value is None:
continue
if len(value.shape) == 1:
if value.dtype == np.bool_:
columns[colname] = ["Y" if item else "N" for item in value]
else:
columns[colname] = value.tolist()
else:
for axis in range(value.shape[1]):
columns[f"{colname}[{axis}]"] = value[..., axis].tolist()
loop = block.init_loop(f"_{prefix}.", list(columns))
for row in zip(*columns.values(), strict=False):
loop.add_row([str(v) for v in row])
return block