def add_atoms(gra, sym_dct, imp_hyd_vlc_dct=None, ste_par_dct=None): """ add atoms to this molecular graph, setting their keys """ atm_keys = atom_keys(gra) atm_sym_dct = atom_symbols(gra) atm_imp_hyd_vlc_dct = atom_implicit_hydrogen_valences(gra) atm_ste_par_dct = atom_stereo_parities(gra) keys = set(sym_dct.keys()) imp_hyd_vlc_dct = {} if imp_hyd_vlc_dct is None else imp_hyd_vlc_dct ste_par_dct = {} if ste_par_dct is None else ste_par_dct assert not keys & atm_keys assert set(imp_hyd_vlc_dct.keys()) <= keys assert set(ste_par_dct.keys()) <= keys atm_sym_dct.update(sym_dct) atm_imp_hyd_vlc_dct.update(imp_hyd_vlc_dct) atm_ste_par_dct.update(ste_par_dct) atm_dct = _create.atoms_from_data( atom_symbols=atm_sym_dct, atom_implicit_hydrogen_valences=atm_imp_hyd_vlc_dct, atom_stereo_parities=atm_ste_par_dct) bnd_dct = bonds(gra) gra = _create.from_atoms_and_bonds(atoms=atm_dct, bonds=bnd_dct) return gra
def bond_symmetry_numbers(gra, frm_bnd_key=None, brk_bnd_key=None): """ symmetry numbers, by bond the (approximate) symmetry number of the torsional potential for this bond, based on the hydrogen counts for each atom It is reduced to 1 if one of the H atoms in the torsional bond is a neighbor to the special bonding atom (the atom that is being transferred) """ imp_gra = implicit(gra) atm_imp_hyd_vlc_dct = atom_implicit_hydrogen_valences(imp_gra) bnd_keys = bond_keys(imp_gra) tfr_atm = None if frm_bnd_key and brk_bnd_key: for atm_f in list(frm_bnd_key): for atm_b in list(brk_bnd_key): if atm_f == atm_b: tfr_atm = atm_f if tfr_atm: neighbor_dct = atom_neighbor_keys(gra) nei_tfr = neighbor_dct[tfr_atm] atms = gra[0] all_hyds = [] for atm in atms: if atms[atm][0] == 'H': all_hyds.append(atm) else: nei_tfr = {} bnd_sym_num_dct = {} bnd_sym_nums = [] for bnd_key in bnd_keys: bnd_sym = 1 vlc = max(map(atm_imp_hyd_vlc_dct.__getitem__, bnd_key)) if vlc == 3: bnd_sym = 3 if tfr_atm: for atm in nei_tfr: nei_s = neighbor_dct[atm] h_nei = 0 for nei in nei_s: if nei in all_hyds: h_nei += 1 if h_nei == 3: bnd_sym = 1 bnd_sym_nums.append(bnd_sym) bnd_sym_num_dct = dict(zip(bnd_keys, bnd_sym_nums)) # fill in the rest of the bonds for completeness bnd_sym_num_dct = dict_.by_key(bnd_sym_num_dct, bond_keys(gra), fill_val=1) return bnd_sym_num_dct
def atom_count(gra, with_dummy=False, with_implicit=True): """ count the number of atoms in this molecule by default, this includes implicit hydrogens and excludes dummy atoms """ if not with_dummy: gra = without_dummy_atoms(gra) natms = len(atoms(gra)) if with_implicit: atm_imp_hyd_vlc_dct = atom_implicit_hydrogen_valences(gra) natms += sum(atm_imp_hyd_vlc_dct.values()) return natms
def add_atom_implicit_hydrogen_valences(gra, inc_atm_imp_hyd_vlc_dct): """ add atom imlicit hydrogen valences (increments can be positive or negative) """ atm_keys = list(inc_atm_imp_hyd_vlc_dct.keys()) atm_imp_hyd_vlcs = numpy.add( dict_.values_by_key(atom_implicit_hydrogen_valences(gra), atm_keys), dict_.values_by_key(inc_atm_imp_hyd_vlc_dct, atm_keys)) assert all(atm_imp_hyd_vlc >= 0 for atm_imp_hyd_vlc in atm_imp_hyd_vlcs) atm_imp_hyd_vlc_dct = dict_.transform_values( dict(zip(atm_keys, atm_imp_hyd_vlcs)), int) return set_atom_implicit_hydrogen_valences(gra, atm_imp_hyd_vlc_dct)
def from_graph(gra): """ networkx graph object from a molecular graph """ nxg = networkx.Graph() nxg.add_nodes_from(atom_keys(gra)) nxg.add_edges_from(bond_keys(gra)) networkx.set_node_attributes(nxg, atom_symbols(gra), 'symbol') networkx.set_node_attributes(nxg, atom_implicit_hydrogen_valences(gra), 'implicit_hydrogen_valence') networkx.set_node_attributes(nxg, atom_stereo_parities(gra), 'stereo_parity') networkx.set_edge_attributes(nxg, bond_orders(gra), 'order') networkx.set_edge_attributes(nxg, bond_stereo_parities(gra), 'stereo_parity') return nxg
def explicit(gra, atm_keys=None): """ make the hydrogens at these atoms explicit """ atm_keys = backbone_keys(gra) if atm_keys is None else atm_keys atm_keys = sorted(atm_keys) atm_imp_hyd_vlc_dct = dict_.by_key(atom_implicit_hydrogen_valences(gra), atm_keys) atm_exp_hyd_keys_dct = {} next_atm_key = max(atom_keys(gra)) + 1 for atm_key in atm_keys: imp_hyd_vlc = atm_imp_hyd_vlc_dct[atm_key] atm_exp_hyd_keys_dct[atm_key] = set( range(next_atm_key, next_atm_key + imp_hyd_vlc)) next_atm_key += imp_hyd_vlc gra = set_atom_implicit_hydrogen_valences( gra, dict_.by_key({}, atm_keys, fill_val=0)) gra = add_atom_explicit_hydrogen_keys(gra, atm_exp_hyd_keys_dct) return gra