def get_canonical_smiles(x): mol = oechem.OEGraphMol() oechem.OESmilesToMol(mol, x) return oechem.OECreateCanSmiString(mol)修改代码不用oechem模块达到相同目的
时间: 2023-12-10 21:39:04 浏览: 139
可以使用rdkit模块来实现相同的功能。修改后的代码如下:
```
from rdkit import Chem
def get_canonical_smiles(x):
mol = Chem.MolFromSmiles(x)
return Chem.MolToSmiles(mol, isomericSmiles=False)
```
这里使用了rdkit中的MolFromSmiles和MolToSmiles函数来分别将SMILES字符串转化为分子对象和将分子对象转化为Canonical SMILES字符串。isomericSmiles参数用于控制是否保留立体信息。
相关问题
def fragment_score(mols, fragment_lib): fragments = Chem.MolFragmentToSmiles(mols, frags=None, maxResults=1000000, \ canonical=True, isomericSmiles=False, kekuleSmiles=False, \ allBondsExplicit=False, allHsExplicit=False, doRandom=False) score = 0 for f in fragments: if f in fragment_lib: score += fragment_lib[f] else: mol_frag = Chem.MolFromSmiles(f) score += Descriptors.MolWt(mol_frag) + \ rdMolDescriptors.CalcNumRotatableBonds(mol_frag) return score优化这段代码
这段代码的性能瓶颈在于循环遍历所有的分子片段并逐一计算分数。为了优化这段代码,可以考虑以下几点:
1. 避免重复计算分子片段:在循环遍历分子片段之前,可以先将所有的分子片段存储到一个集合(set)中,这样可以避免重复计算分子片段。
2. 使用字典(dict)存储分子片段得分:可以将分子片段和其得分存储到一个字典中,这样可以快速查找分子片段得分,而不需要每次都遍历整个字典。
3. 使用化学指纹(fingerprint)匹配分子片段:可以使用化学指纹来匹配分子片段,这样可以更快速地查找分子片段得分。
下面是优化后的代码:
```
from rdkit import Chem
from rdkit.Chem import Descriptors, rdMolDescriptors
def fragment_score(mols, fragment_lib):
fragments = set()
for mol in mols:
mol_fragments = Chem.GetMolFrags(mol, asMols=True)
for mol_frag in mol_fragments:
fragments.add(Chem.MolToSmiles(mol_frag, isomericSmiles=False))
fragment_scores = {}
for f in fragments:
if f in fragment_lib:
fragment_scores[f] = fragment_lib[f]
else:
mol_frag = Chem.MolFromSmiles(f)
fragment_scores[f] = Descriptors.MolWt(mol_frag) + rdMolDescriptors.CalcNumRotatableBonds(mol_frag)
score = sum(fragment_scores.values())
return score
```
这样优化后的代码可以更快速地计算分子片段的得分,提高了代码的性能。
def _inference_pose3d_can(self, keypoints_scoremap, hand_side, evaluation, train=False): """ Inference of canonical coordinates. """ with tf.variable_scope('PosePrior'): # use encoding to detect relative, normed 3d coords x = keypoints_scoremap # this is 28x28x21 s = x.get_shape().as_list() out_chan_list = [32, 64, 128] for i, out_chan in enumerate(out_chan_list): x = ops.conv_relu(x, 'conv_pose_%d_1' % i, kernel_size=3, stride=1, out_chan=out_chan, trainable=train) x = ops.conv_relu(x, 'conv_pose_%d_2' % i, kernel_size=3, stride=2, out_chan=out_chan, trainable=train) # in the end this will be 4x4xC注释
这段代码是一个用于推断3D姿态的函数,其输入为关键点的得分图、手的侧面信息以及是否为评估模式。在该函数中,使用编码信息来检测相对的规范化的3D坐标。具体地,首先将关键点得分图经过一系列卷积和ReLU激活函数操作后,得到一个形状为28x28x21的张量x。然后,将该张量x经过三个不同的卷积层,每个卷积层都包含两个卷积操作和ReLU激活函数,最终得到一个形状为4x4xC的张量x,其中C是输出通道数,表示规范化的3D坐标。该函数的输出是规范化的3D坐标。
阅读全文