Source code for cgsmiles.cgsmiles_utils
from collections import defaultdict
import networkx as nx
from .read_cgsmiles import read_cgsmiles
[docs]
def find_complementary_bonding_descriptor(bonding_descriptor, ellegible_descriptors=None):
"""
Given a bonding descriptor find the complementary match.
In the case of '$' prefixed descriptors this is just
the same and '>' or '<' get flipped to the other
symbol.
Parameters
----------
bonding_descriptor: str
ellegible_descriptors: list[str]
a list of allowed descriptors to match
Return
------
list[str]
"""
compl = []
if bonding_descriptor[0] == '$' and ellegible_descriptors:
for descriptor in ellegible_descriptors:
if descriptor[0] == '$' and descriptor[-1] == bonding_descriptor[-1]:
compl.append(descriptor)
return compl
if bonding_descriptor[0] == '<':
compl = '>' + bonding_descriptor[1:]
elif bonding_descriptor[0] == '>':
compl = '<' + bonding_descriptor[1:]
else:
compl = bonding_descriptor
if compl not in ellegible_descriptors:
msg = ("Bonding descriptor {compl} was not found in list of potential"
"matching descriptors.")
raise IOError(msg.format(compl=compl))
return [compl]
[docs]
def find_open_bonds(molecule, target_nodes=None):
"""
Collect all nodes which have an open bonding descriptor
and store them as keys with a list of nodes as values.
Parameters
----------
molecule: networkx.Graph
target_nodes: list[collections.abc.Hashable]
a list of node keys matching molecule
Return
------
dict
"""
if target_nodes is None:
target_nodes = molecule
open_bonds_by_descriptor = defaultdict(list)
open_bonds = nx.get_node_attributes(molecule, 'bonding')
for node, bonding_types in open_bonds.items():
if node in target_nodes:
for bonding_types in bonding_types:
open_bonds_by_descriptor[bonding_types].append(node)
return open_bonds_by_descriptor
[docs]
def read_fragment_cgsmiles(cgsmiles_str,
fragname,
bonding_descrpt={},
attributes={}):
"""
Read a smiles_str corresponding to a CGSmiles fragment and
annotate bonding descriptors, isomers, as well as any other
attributes.
Parameters
----------
smiles_str: str
string in CGSmiles format
fragname: str
the name of the fragment
attributes: dict
Returns
-------
networkx.Graph
the graph of the molecular fragment
"""
mol_graph = read_cgsmiles(cgsmiles_str)
fragnames = nx.get_node_attributes(mol_graph, 'fragname')
nx.set_node_attributes(mol_graph, fragnames, 'atomname')
nx.set_node_attributes(mol_graph, bonding_descrpt, 'bonding')
nx.set_node_attributes(mol_graph, fragname, 'fragname')
nx.set_node_attributes(mol_graph, 0, 'fragid')
nx.set_node_attributes(mol_graph, 1, 'w')
nx.set_node_attributes(mol_graph, attributes)
return mol_graph