def _unique_atoms(gra): """ Determine the symbols of unique atom types. :param gra: molecular graph :type gra: molecular graph data structure :rtype: tuple(str) """ symb_idx_dct = atom_symbol_keys(gra) return tuple(symb_idx_dct.keys())
def chem_unique_atoms_of_type(gra, symb): """ For the given atom type, determine the idxs of all the chemically unique atoms. TODO: DEPRECATE this can be done with the more general atom_equivalence_class_reps function. This approach to determining equivalence seems risky, because deleting an atom also deletes its bonds. In particular, if this is a disconnected graph with multiple radical molecules, then this approach breaks down completely and will treat atoms as equivalent when they are not. The approach used above is robust in these cases. :param gra: molecular graph :type gra: molecular graph data structure :param symb: atomic symbol to determine symbols for :type symb: str :rtype: tuple(int) """ # Get the indices for the atom type symb_idx_dct = atom_symbol_keys(gra) atom_idxs = symb_idx_dct[symb] # Loop over each idx uni_idxs = tuple() uni_del_gras = [] for idx in atom_idxs: # Remove the atom from the graph del_gra = remove_atoms(gra, [idx]) # Test if the del_gra is isomorphic to any of the uni_del_gras new_uni = True for uni_del_gra in uni_del_gras: iso_dct = full_isomorphism(del_gra, uni_del_gra) if iso_dct: new_uni = False break # Add graph and idx to lst if del gra is unique if new_uni: uni_del_gras.append(del_gra) uni_idxs += (idx,) return uni_idxs
def halide_groups(gra): """ Determine the location of halide groups. The locations are specified as tuple-of-tuple of idxs indicating the C-X atoms of the group: (C-idx, X-idx). :param gra: molecular graph :type gra: molecular graph data structure :rtype: tuple(int) """ hal_grps = tuple() symb_idx_dct = atom_symbol_keys(gra) for symb in ('F', 'Cl', 'Br', 'I'): hal_idxs = symb_idx_dct.get(symb, ()) for hal_idx in hal_idxs: hal_neighs = neighbors_of_type(gra, hal_idx, symb='C') hal_grps += ((hal_neighs[0], hal_idx), ) return hal_grps
def two_bond_idxs(gra, symb1, cent, symb2): """ Determine the triplet of indices of atoms of specified types that are connected in a chain by two bonds: (symb1_idx, cent_idx, symb2_idx). :param gra: molecular graph :type gra: molecular graph data structure :param symb1: symbol of atom at one end of chain :type symb1: str :param cent: symbol of atom in the middle of a chain :type cent: str :param symb2: symbol of atom at other end of chain :type symb2: str """ grps = tuple() neigh_dct = atoms_neighbor_atom_keys(gra) idx_symb_dct = atom_symbols(gra) symb_idx_dct = atom_symbol_keys(gra) cent_idxs = symb_idx_dct.get(cent, tuple()) for cent_idx in cent_idxs: neighs = tuple(neigh_dct[cent_idx]) neigh_symbs = _atom_idx_to_symb(neighs, idx_symb_dct) if neigh_symbs == (symb1, symb2): grp_idxs = (neighs[0], cent_idx, neighs[1]) elif neigh_symbs == (symb2, symb1): grp_idxs = (neighs[1], cent_idx, neighs[0]) else: grp_idxs = () if grp_idxs: grps += ((grp_idxs), ) return grps