def iter_atom_pairs(self, bound=True, unique=True, sort=True): """ Iterator iterating over all pairs of atoms in the molecule 'exp' :param bound: Boolean specifying whether all atom pairs are returned or only those with chemical bonds between them. """ blacklist = [] for atom1 in self.iter_atoms(sort=sort): # for atom2 in self.iter_atoms(sort=sort): if bound: for atom2 in atom1.partner: # if not atom1 == atom2: if not bound or is_bound(atom1.cart, atom1.element, atom2.cart, atom2.element): blackstring = '{}{}'.format(*sorted([atom1.name, atom2.name])) if unique and not blackstring in blacklist: yield atom1, atom2 blacklist.append(blackstring) elif not unique: yield atom1, atom2 else: break else: for atom2 in self.iter_atoms(sort=sort): if not atom1 == atom2: yield atom1, atom2
def find_rings(atoms): graph = Graph() for i, atom1 in enumerate(atoms): for atom2 in atoms[i+1:]: if is_bound(atom1.cart, atom1.element, atom2.cart, atom2.element): graph.add_edge(atom1.name, atom2.name) ring_list = cycle_basis(graph) return ring_list
def _get_bonds(self, unique=True, hydrogen=True): for atom1 in self.atom_dict.values(): for atom2 in self.atom_dict.values(): if not atom1 == atom2: if hydrogen == False and (atom1.get_element() == 'H' or atom2.get_element() == 'H'): continue if is_bound(atom1.get_cart(), atom1.get_element(), atom2.get_cart(), atom2.get_element()): bondatoms = [atom1.get_id(), atom2.get_id()] if unique: bondatoms = sorted(bondatoms) bondatoms = ':'.join(bondatoms) self.bonds[bondatoms] = [atom1, atom2]
def find_rings(atoms, bonds=None): graph = Graph() # bonds = None class DummyMolecule(object): pass mol = DummyMolecule() mol.atoms = atoms if bonds is None: for atom1, atom2 in iter_atom_pairs(): graph.add_edge(atom1.name, atom2.name) else: blacklist = [] for b in bonds: for atom2i in b[1:10]: string = ' : '.join(sorted([atoms[b[0]].name, atoms[atom2i].name])) if not string in blacklist: if is_bound(atoms[b[0]].cart, atoms[b[0]].element, atoms[atom2i].cart, atoms[atom2i].element): graph.add_edge(atoms[b[0]].name, atoms[atom2i].name) blacklist.append(string) ring_list = cycle_basis(graph) return ring_list