我将带有 CSO3 基团的 PDB 读入 pybel(该示例在 Maestro Schrodinger 中进行了编辑,以掩盖原始化学成分)。请注意,由于我使用了大量非天然氨基酸和其他分子构建块,因此氨基酸名称不准确,但很容易被 Pymol 和 Schrodinger 读取。薛定谔还添加了隐式氢而没有错误!这是一个原始示例:
TITLE FullModel_2569-std-man
REMARK 4 COMPLIES WITH FORMAT V. 3.0, 1-DEC-2006
REMARK 888
REMARK 888 WRITTEN BY MAESTRO (A PRODUCT OF SCHRODINGER, LLC)
ATOM 1 N ALA X 1 17.799 25.136 52.626 1.00 16.34 N1+
ATOM 2 CA ALA X 1 16.591 25.195 51.764 1.00 16.34 C
ATOM 3 C ALA X 1 16.975 24.592 50.433 1.00 16.34 C
ATOM 4 O ALA X 1 17.063 23.378 50.330 1.00 16.34 O
ATOM 5 N ALA X 2 17.423 25.444 49.499 1.00 6.89 N
ATOM 6 CA ALA X 2 18.667 25.160 48.776 1.00 6.89 C
ATOM 7 C ALA X 2 19.807 25.237 49.806 1.00 6.89 C
ATOM 8 O ALA X 2 19.691 26.012 50.771 1.00 6.89 O
ATOM 9 N ALA X 3 20.783 24.323 49.735 1.00 10.36 N
ATOM 10 CA ALA X 3 21.710 24.047 50.849 1.00 10.36 C
ATOM 11 C ALA X 3 20.940 23.401 52.024 1.00 10.36 C
ATOM 12 O ALA X 3 19.722 23.200 51.950 1.00 10.36 O
ATOM 13 CB ALA X 3 22.871 23.144 50.393 1.00 10.36 C
ATOM 14 SG ALA X 3 24.414 23.586 51.244 1.00 20.00 S
ATOM 15 OD1 ALA X 3 24.591 24.986 50.847 1.00 20.00 O1-
ATOM 16 OD2 ALA X 3 24.087 23.405 52.666 1.00 20.00 O
ATOM 17 OD3 ALA X 3 25.366 22.624 50.685 1.00 20.00 O
ATOM 18 N ASP X 4 21.584 23.207 53.175 1.00 21.55 N
ATOM 19 CA ASP X 4 20.963 22.850 54.454 1.00 21.55 C
ATOM 20 C ASP X 4 19.873 23.860 54.847 1.00 21.55 C
ATOM 21 O ASP X 4 18.792 23.497 55.298 1.00 21.55 O
ATOM 22 N ARG X 5 20.063 25.132 54.464 1.00 29.63 N
ATOM 23 CA ARG X 5 19.068 26.199 54.538 1.00 29.63 C
ATOM 24 C ARG X 5 17.759 25.922 53.771 1.00 29.63 C
ATOM 25 O ARG X 5 16.712 26.441 54.157 1.00 29.63 O
TER 26 ARG X 5
CONECT 13 14
CONECT 14 13 15 16 17
CONECT 14 16 17
CONECT 15 14
CONECT 16 14
CONECT 16 14
CONECT 17 14
CONECT 17 14
END
我使用下面的函数摄取 PDB [它必须是 PDB 而不是 mol2 或 sdf,因为原始是 PDB]
def pep_to_formats(data_path, mol_name, add_hydrogen=True):
base = f"{data_path}/data/{mol_name}/{mol_name}"
pep_pdb = f"{base}.pdb"
std_pdb = f"{base}-std.pdb"
babel_pdbh = f"{base}-babelh.pdb"
babel_sdfh = f"{base}-babelh.sdf"
babel_mol2h = f"{base}-babelh.mol2"
babel_smileh = f"{base}-babelh.smile"
babel_smilesh = f"{base}-babelh.smiles"
##input pepticom chemical expansion pdb file output and output standard hydrogenated pdb file
babel_mol = pb.readfile(format="pdb", filename=std_pdb).__next__()
if add_hydrogen:
babel_mol.addh() # add Hs for 3D
# dd.make3D()
babel_mol.write(format='pdb', filename=babel_pdbh, overwrite=True)
babel_mol.write("sdf", babel_sdfh, True)
babel_mol.write("mol2", babel_mol2h, True)
babel_mol.write("smi", babel_smileh, True)
babel_mol.write("smiles", babel_smilesh, True)
return babel_mol, base
当我添加氢气时,输出 SDF 会将氢气添加到氧和硫之一中。显然是一个错误。
这是生成的 SDF
/Users/gideonbar/devel/pep-chem/md_python/data/FullModel_2569-std-man/FullModel_2569-std-man-std.pdb
OpenBabel02022411333D
43 43 0 0 1 0 0 0 0 0999 V2000
17.7990 25.1360 52.6260 N 0 0 0 0 0 0 0 0 0 0 0 0
16.5910 25.1950 51.7640 C 0 0 0 0 0 0 0 0 0 0 0 0
16.9750 24.5920 50.4330 C 0 0 0 0 0 0 0 0 0 0 0 0
17.0630 23.3780 50.3300 O 0 0 0 0 0 0 0 0 0 0 0 0
17.4230 25.4440 49.4990 N 0 0 0 0 0 0 0 0 0 0 0 0
18.6670 25.1600 48.7760 C 0 0 0 0 0 0 0 0 0 0 0 0
19.8070 25.2370 49.8060 C 0 0 0 0 0 0 0 0 0 0 0 0
19.6910 26.0120 50.7710 O 0 0 0 0 0 0 0 0 0 0 0 0
20.7830 24.3230 49.7350 N 0 0 0 0 0 0 0 0 0 0 0 0
21.7100 24.0470 50.8490 C 0 0 1 0 0 0 0 0 0 0 0 0
20.9400 23.4010 52.0240 C 0 0 0 0 0 0 0 0 0 0 0 0
19.7220 23.2000 51.9500 O 0 0 0 0 0 0 0 0 0 0 0 0
22.8710 23.1440 50.3930 C 0 0 0 0 0 0 0 0 0 0 0 0
24.4140 23.5860 51.2440 S 0 0 0 0 0 0 0 0 0 0 0 0
24.5910 24.9860 50.8470 O 0 0 0 0 0 0 0 0 0 0 0 0
24.0870 23.4050 52.6660 O 0 5 0 0 0 0 0 0 0 0 0 0
25.3660 22.6240 50.6850 O 0 0 0 0 0 0 0 0 0 0 0 0
21.5840 23.2070 53.1750 N 0 0 0 0 0 0 0 0 0 0 0 0
20.9630 22.8500 54.4540 C 0 0 0 0 0 0 0 0 0 0 0 0
19.8730 23.8600 54.8470 C 0 0 0 0 0 0 0 0 0 0 0 0
18.7920 23.4970 55.2980 O 0 0 0 0 0 0 0 0 0 0 0 0
20.0630 25.1320 54.4640 N 0 0 0 0 0 0 0 0 0 0 0 0
19.0680 26.1990 54.5380 C 0 0 0 0 0 0 0 0 0 0 0 0
17.7590 25.9220 53.7710 C 0 0 0 0 0 0 0 0 0 0 0 0
16.7120 26.4410 54.1570 O 0 0 0 0 0 0 0 0 0 0 0 0
18.5772 24.5766 52.4008 H 0 0 0 0 0 0 0 0 0 0 0 0
16.2814 26.2108 51.6327 H 0 0 0 0 0 0 0 0 0 0 0 0
15.7766 24.6608 52.2070 H 0 0 0 0 0 0 0 0 0 0 0 0
16.9149 26.2630 49.2980 H 0 0 0 0 0 0 0 0 0 0 0 0
18.8183 25.8854 48.0041 H 0 0 0 0 0 0 0 0 0 0 0 0
18.6312 24.1954 48.3143 H 0 0 0 0 0 0 0 0 0 0 0 0
20.8868 23.8113 48.9004 H 0 0 0 0 0 0 0 0 0 0 0 0
22.1321 24.9731 51.1792 H 0 0 0 0 0 0 0 0 0 0 0 0
23.0086 23.2573 49.3380 H 0 0 0 0 0 0 0 0 0 0 0 0
22.6282 22.1299 50.6330 H 0 0 0 0 0 0 0 0 0 0 0 0
24.6600 24.5520 50.3188 H 0 0 0 0 0 0 0 0 0 0 0 0
25.3568 21.8133 51.2175 H 0 0 0 0 0 0 0 0 0 0 0 0
22.5627 23.3128 53.1652 H 0 0 0 0 0 0 0 0 0 0 0 0
21.7153 22.8355 55.2147 H 0 0 0 0 0 0 0 0 0 0 0 0
20.5093 21.8863 54.3517 H 0 0 0 0 0 0 0 0 0 0 0 0
20.9483 25.3660 54.1024 H 0 0 0 0 0 0 0 0 0 0 0 0
19.5055 27.0896 54.1376 H 0 0 0 0 0 0 0 0 0 0 0 0
18.7981 26.2859 55.5697 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0 0 0 0
1 24 1 0 0 0 0
1 26 1 0 0 0 0
2 3 1 0 0 0 0
2 27 1 0 0 0 0
2 28 1 0 0 0 0
3 4 2 0 0 0 0
3 5 1 0 0 0 0
5 6 1 0 0 0 0
5 29 1 0 0 0 0
6 7 1 0 0 0 0
6 30 1 0 0 0 0
6 31 1 0 0 0 0
7 8 2 0 0 0 0
7 9 1 0 0 0 0
9 10 1 0 0 0 0
9 32 1 0 0 0 0
10 11 1 0 0 0 0
10 13 1 0 0 0 0
10 33 1 1 0 0 0
11 12 2 0 0 0 0
11 18 1 0 0 0 0
13 14 1 0 0 0 0
13 34 1 0 0 0 0
13 35 1 0 0 0 0
14 15 2 0 0 0 0
14 16 1 0 0 0 0
14 36 1 0 0 0 0
17 14 1 0 0 0 0
17 37 1 0 0 0 0
18 19 1 0 0 0 0
18 38 1 0 0 0 0
19 20 1 0 0 0 0
19 39 1 0 0 0 0
19 40 1 0 0 0 0
20 21 2 0 0 0 0
20 22 1 0 0 0 0
22 23 1 0 0 0 0
22 41 1 0 0 0 0
23 24 1 0 0 0 0
23 42 1 0 0 0 0
23 43 1 0 0 0 0
24 25 2 0 0 0 0
M CHG 1 16 -1
M END
$$$$
在我的代码中,我人为地向 PDB 中的两个硫氧键添加双键,因为 PDB 不会捕获共振。
我怎样才能防止这种情况发生,或者只是删除氢。我试过了
for neighbour_atom in ob.OBAtomAtomIter(at):
atom_type = neighbour_atom.GetType()
bond = at.GetBond(neighbour_atom)
neighbour_index = bond.GetNbrAtomIdx(at)
print(bond.GetLength())
# print(bond.GetBondOrder())
print(neighbour_index)
# print(bond.IsAromatic())
# print(bond.IsInRing())
# print(bond.IsRotor())
# print(bond.IsAmide())
print(atom_type)
if atom_type == 'H':
pass
# at.GetParent().DeleteAtom(neighbour_atom)
mol.OBMol.DeleteAtom(neighbour_atom)
代码冻结了
我将其转换为脚本并收到此错误:
Process finished with exit code 139 (interrupted by signal 11:SIGSEGV)
我找到了加氢后去除氢键的方法:
# mol = next(pb.readfile("sdf", babel_sdfh)) # (readfile is described below)
mol = next(pb.readfile("pdb", std_pdb)) # (readfile is described below)
print(mol.molwt)
print(len(mol.atoms))
#%%
# dir(mol.OBMol)
#%%
print(f'num atoms: {mol.OBMol.NumAtoms()}')
print(f'mol.molwt: {mol.molwt}')
#%%
mol.OBMol.AddHydrogens()
#%%
print(f'num atoms: {mol.OBMol.NumAtoms()}')
print(f'mol.molwt: {mol.molwt}')
#%%
sulfur_atom = mol.OBMol.GetAtom(23)
#%%
sulfur_atom.GetType()
#%%
def remove_atom_hydrogens(mol_to_sheer, atom_to_sheer, adjacent_atoms=None, adjacent_atom_types=None):
for neighbour_atom in ob.OBAtomAtomIter(atom_to_sheer):
atom_type = neighbour_atom.GetType()
bond = atom_to_sheer.GetBond(neighbour_atom)
neighbour_index = bond.GetNbrAtomIdx(atom_to_sheer)
bl = bond.GetLength()
# print(bond.GetBondOrder())
# print(bond.IsAromatic())
# print(bond.IsInRing())
# print(bond.IsRotor())
# print(bond.IsAmide())
print(f'neighbour_index: {neighbour_index} atom_type: {atom_type} bond length: {bl}')
if atom_type[0] == 'H':
# pass
# at.GetParent().DeleteAtom(neighbour_atom)
mol_to_sheer.OBMol.DeleteBond(bond)
mol_to_sheer.OBMol.DeleteAtom(neighbour_atom)
if adjacent_atoms is not None and adjacent_atom_types:
if atom_type[0] in adjacent_atom_types:
adjacent_atoms.append(neighbour_atom)
return adjacent_atoms
adjacent_oxygens = remove_atom_hydrogens(mol, sulfur_atom, [], ['O'])
print(f'mol.OBMol.NumAtoms(): {mol.OBMol.NumAtoms()}')
for oxy in adjacent_oxygens:
remove_atom_hydrogens(mol, oxy)
mol.OBMol.NumAtoms()
#%%
mol_name
#%%
mol
#%%
mol.OBMol.NumAtoms()
#%%
mol.write("sdf", babel_sdfh1, True)
我很高兴看到是否有一种方法可以更正确地设置输入 PDB 的 ip 或以更高的精度添加氢。