Source code for dpdata.plugins.rdkit
from dpdata.format import Format
try:
import rdkit.Chem
import dpdata.rdkit.utils
except ModuleNotFoundError:
pass
[docs]
@Format.register("mol")
@Format.register("mol_file")
class MolFormat(Format):
[docs]
def from_bond_order_system(self, file_name, **kwargs):
return rdkit.Chem.MolFromMolFile(file_name, sanitize=False, removeHs=False)
[docs]
def to_bond_order_system(self, data, mol, file_name, frame_idx=0, **kwargs):
assert frame_idx < mol.GetNumConformers()
rdkit.Chem.MolToMolFile(mol, file_name, confId=frame_idx)
[docs]
@Format.register("sdf")
@Format.register("sdf_file")
class SdfFormat(Format):
[docs]
def from_bond_order_system(self, file_name, **kwargs):
"""Note that it requires all molecules in .sdf file must be of the same topology."""
mols = [
m
for m in rdkit.Chem.SDMolSupplier(file_name, sanitize=False, removeHs=False)
]
if len(mols) > 1:
mol = dpdata.rdkit.utils.combine_molecules(mols)
else:
mol = mols[0]
return mol
[docs]
def to_bond_order_system(self, data, mol, file_name, frame_idx=-1, **kwargs):
sdf_writer = rdkit.Chem.SDWriter(file_name)
if frame_idx == -1:
for ii in range(mol.GetNumConformers()):
sdf_writer.write(mol, confId=ii)
else:
assert frame_idx < mol.GetNumConformers()
sdf_writer.write(mol, confId=frame_idx)
sdf_writer.close()