def insertion(xgr1, xgr2): """ find an insertion transformation """ assert xgr1 == _explicit(xgr1) and xgr2 == _explicit(xgr2) tra = None idxs = None xgrs1 = _connected_components(xgr1) xgrs2 = _connected_components(xgr2) if len(xgrs1) == 2 and len(xgrs2) == 1: xgra, xgrb = xgrs1 atmsa = atoms(xgra) atmsb = atoms(xgrb) neighsa = atom_neighbor_keys(xgra) neighsb = atom_neighbor_keys(xgrb) bndsa = bond_keys(xgra) bndsb = bond_keys(xgrb) tra = _insertion(atmsa, neighsa, bndsa, atmsb, neighsb, xgr1, xgr2) idxs = [0, 1] if not tra: tra = _insertion(atmsb, neighsb, bndsb, atmsa, neighsa, xgr1, xgr2) if tra: idxs = [1, 0] else: idxs = None elif len(xgrs1) == 1 and len(xgrs2) == 1: xgra = xgr1 idxs = [0] atmsa = atoms(xgra) neighsa = atom_neighbor_keys(xgra) bndsa = bond_keys(xgra) tra = _insertion(atmsa, neighsa, bndsa, atmsa, neighsa, xgr1, xgr2) return tra, idxs
def substitution(xgr1, xgr2): """identifies substitution reactions """ assert xgr1 == _explicit(xgr1) and xgr2 == _explicit(xgr2) tra = None idxs = None xgrs1 = _connected_components(xgr1) xgrs2 = _connected_components(xgr2) print('len xgrs test:', len(xgrs1), len(xgrs2)) print('xgrs test:', xgrs1, xgrs2) if len(xgrs1) == 2 and len(xgrs2) == 2: xgra, xgrb = xgrs1 xgrc, xgrd = xgrs2 atmsa = atoms(xgra) neighsa = atom_neighbor_keys(xgra) bndsa = bond_keys(xgra) atmsb = atoms(xgrb) neighsb = atom_neighbor_keys(xgrb) bndsb = bond_keys(xgrb) atmsc = atoms(xgrc) neighsc = atom_neighbor_keys(xgrc) bndsc = bond_keys(xgrc) atmsd = atoms(xgrd) neighsd = atom_neighbor_keys(xgrd) bndsd = bond_keys(xgrd) tra = _substitution(atmsa, neighsa, bndsa, atmsb, xgr1, xgr2) # tra = _substitution( # atmsa, neighsa, bndsa, atmsb, neighsb, xgr1, xgr2) idxs = [[0, 1], [0, 1]] if not tra: tra = _substitution(atmsb, neighsb, bndsb, atmsa, xgr1, xgr2) # atmsb, neighsb, bndsb, atmsa, neighsa, xgr1, xgr2) idxs = [[0, 1], [1, 0]] if not tra: tra = _substitution(atmsc, neighsc, bndsc, atmsd, xgr2, xgr1) # atmsc, neighsc, bndsc, atmsd, neighsd, xgr2, xgr1) idxs = [[1, 0], [0, 1]] if not tra: tra = _substitution(atmsd, neighsd, bndsd, atmsc, xgr2, xgr1) # atmsd, neighsd, bndsd, atmsc, neighsc, xgr2, xgr1) idxs = [[1, 0], [1, 0]] if not tra: idxs = None # return not substitution for radical + unsaturated reactions unsat_atm_keys = _unsaturated_atom_keys(xgra) # print('unsat test:', tra[0][0], unsat_atm_keys) tra_list = list(tra[0]) for key in unsat_atm_keys: if key in tra_list[0]: pass # tra = None # commented out the tra = None and added pass to run CO + HO2 return tra, idxs
def union(gra1, gra2, check=True): """ a union of two graphs """ if check: assert not atom_keys(gra1) & atom_keys(gra2) atm_dct = {} atm_dct.update(atoms(gra1)) atm_dct.update(atoms(gra2)) bnd_dct = {} bnd_dct.update(bonds(gra1)) bnd_dct.update(bonds(gra2)) return _create.graph.from_atoms_and_bonds(atm_dct, bnd_dct)
def atom_count(gra, 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 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 radical_group_dct(gra): """ return a dictionary of lists of groups attached each radical """ gra = without_fractional_bonds(gra) groups = {} rads = list(sing_res_dom_radical_atom_keys(gra)) atms = atoms(gra) for rad in rads: key = atms[rad][0] if key in groups: groups[atms[rad][0]] += atom_groups(gra, rad) else: groups[atms[rad][0]] = atom_groups(gra, rad) return groups
def frozen(gra): """ hashable, sortable, immutable container of graph data """ atm_keys = sorted(atom_keys(gra)) bnd_keys = sorted(bond_keys(gra), key=sorted) # make it sortable by replacing Nones with -infinity atm_vals = numpy.array(dict_.values_by_key(atoms(gra), atm_keys), dtype=numpy.object) bnd_vals = numpy.array(dict_.values_by_key(bonds(gra), bnd_keys), dtype=numpy.object) atm_vals[numpy.equal(atm_vals, None)] = -numpy.inf bnd_vals[numpy.equal(bnd_vals, None)] = -numpy.inf frz_atms = tuple(zip(atm_keys, map(tuple, atm_vals))) frz_bnds = tuple(zip(bnd_keys, map(tuple, bnd_vals))) return (frz_atms, frz_bnds)
def elimination(xgr1, xgr2): """identifies elimination reactions """ assert xgr1 == _explicit(xgr1) and xgr2 == _explicit(xgr2) tra = None xgrs1 = _connected_components(xgr1) xgrs2 = _connected_components(xgr2) tras = [] if len(xgrs1) == 1 and len(xgrs2) == 2: atms = atoms(xgr1) neighs = atom_neighbor_keys(xgr1) bnds = bond_keys(xgr1) radicals = _resonance_dominant_radical_atom_keys(xgr1) lonepairs = atom_lone_pair_counts(xgr1) for atmi in atms: i_neighs = neighs[atmi] for atmj in i_neighs: bnd_break_key_ij = _get_bnd_key(atmi, atmj, bnds) new_xgr = remove_bonds(xgr1, [bnd_break_key_ij]) new_xgrs = _connected_components(new_xgr) if len(new_xgrs) == 2: xgra, xgrb = new_xgrs atmsa = atoms(xgra) if atmi not in atmsa.keys(): xgrb, xgra = xgra, xgrb atmsa = atoms(xgra) neighsa = atom_neighbor_keys(xgra) atmsb = atoms(xgrb) neighs_i = neighsa[atmi] for atmk in atmsb: if atmk in radicals: for atml in neighs_i: neighs_l = neighsa[atml] if atml != atmj: bnd_break_key_il = _get_bnd_key( atmi, atml, bnds) bnd_form_key_kl = frozenset({atmk, atml}) newnew_xgr = remove_bonds( new_xgr, [bnd_break_key_il]) newnew_xgr = add_bonds( newnew_xgr, [bnd_form_key_kl]) atm_key_dct = _full_isomorphism( newnew_xgr, xgr2) if atm_key_dct: tra = [[bnd_form_key_kl], [ bnd_break_key_ij, bnd_break_key_il ]] return tra for atmm in neighs_l: if atmm != atmi: bnd_break_key_lm = _get_bnd_key( atml, atmm, bnds) bnd_form_key_km = frozenset( {atmk, atmm}) newnew_xgr = remove_bonds( new_xgr, [bnd_break_key_lm]) newnew_xgr = add_bonds( newnew_xgr, [bnd_form_key_km]) atm_key_dct = _full_isomorphism( newnew_xgr, xgr2) if atm_key_dct: tras.append([[bnd_form_key_km], [ bnd_break_key_ij, bnd_break_key_lm ]]) for atmi in atms: i_neighs = neighs[atmi] print('atmi test:', atmi) print('i_neighs test:', i_neighs) for atmj in i_neighs: bnd_break_key_ij = _get_bnd_key(atmi, atmj, bnds) new_xgr = remove_bonds(xgr1, [bnd_break_key_ij]) new_xgrs = _connected_components(new_xgr) if len(new_xgrs) == 2: xgra, xgrb = new_xgrs atmsa = atoms(xgra) if atmi not in atmsa.keys(): xgrb, xgra = xgra, xgrb atmsa = atoms(xgra) neighsa = atom_neighbor_keys(xgra) atmsb = atoms(xgrb) neighs_i = neighsa[atmi] print('len atmsb test:', len(atmsb)) for atmk in atmsb: if lonepairs[atmk] > 0 or len(atmsb) == 1: # if lonepairs[atmk] > 0: for atml in neighs_i: neighs_l = neighsa[atml] if atml != atmj: bnd_break_key_il = _get_bnd_key( atmi, atml, bnds) bnd_form_key_kl = frozenset({atmk, atml}) newnew_xgr = remove_bonds( new_xgr, [bnd_break_key_il]) newnew_xgr = add_bonds( newnew_xgr, [bnd_form_key_kl]) atm_key_dct = _full_isomorphism( newnew_xgr, xgr2) if atm_key_dct: tra = [[bnd_form_key_kl], [ bnd_break_key_ij, bnd_break_key_il ]] return tra for atmm in neighs_l: if atmm != atmi: bnd_break_key_lm = _get_bnd_key( atml, atmm, bnds) bnd_form_key_km = frozenset( {atmk, atmm}) newnew_xgr = remove_bonds( new_xgr, [bnd_break_key_lm]) newnew_xgr = add_bonds( newnew_xgr, [bnd_form_key_km]) atm_key_dct = _full_isomorphism( newnew_xgr, xgr2) if atm_key_dct: tras.append([[bnd_form_key_km], [ bnd_break_key_ij, bnd_break_key_lm ]]) if len(tras) < 1: tras = None return tras