def test_atoms(): assert atoms.get_maximal_valance(atom_label='C') == 4 assert atoms.get_maximal_valance(atom_label='Aa') == 6 assert atoms.get_atomic_weight(atom_label='C') == 12.01 assert atoms.get_atomic_weight(atom_label='Aa') == 70 assert 0.9 < atoms.get_vdw_radius(atom_label='H') < 1.2 assert 2 < atoms.get_vdw_radius(atom_label='Aa') < 3 assert atoms.is_pi_atom(atom_label='C', valency=3) is True assert atoms.is_pi_atom(atom_label='C', valency=4) is False assert atoms.is_pi_atom(atom_label='Aa', valency=9) is False
def remove_bonds_invalid_valancies(species): """ Remove invalid valencies for atoms that exceed their maximum valencies e.g. H should have no more than 1 'bond' Arguments: species (autode.species.Species): """ for i in species.graph.nodes: max_valance = get_maximal_valance(atom_label=species.atoms[i].label) neighbours = list(species.graph.neighbors(i)) if len(neighbours) <= max_valance: # All is well continue logger.warning(f'Atom {i} exceeds its maximal valence removing edges') # Get the atom indexes sorted by the closest to atom i closest_atoms = sorted(neighbours, key=lambda j: species.get_distance(i, j)) # Delete all the bonds to atom(s) j that are above the maximal valance for j in closest_atoms[max_valance:]: species.graph.remove_edge(i, j) return None
def add_bond_rearrangment(bond_rearrangs, reactant, product, fbonds, bbonds): """For a possible bond rearrangement, sees if the products are made, and adds it to the bond rearrang list if it does Arguments: bond_rearrangs (list(autode.bond_rearrangements.BondRearrangement)): list of working bond rearrangments reactant (molecule object): reactant complex product (molecule object): product complex fbonds (list(tuple)): list of bonds to be made bbonds (list(tuple)): list of bonds to be broken Returns: (list(autode.bond_rearrangements.BondRearrangement)): """ # Check that the bond rearrangement doesn't exceed standard atom valances bbond_atoms = [atom for bbond in bbonds for atom in bbond] for fbond in fbonds: for atom in fbond: atom_label = reactant.atoms[atom].label if (reactant.graph.degree(atom) == get_maximal_valance(atom_label) and atom not in bbond_atoms): # If we are here then there is at least one atom that will # exceed it's maximal valance, therefore # we don't need to run isomorphism return bond_rearrangs rearranged_graph = generate_rearranged_graph(reactant.graph, fbonds=fbonds, bbonds=bbonds) if is_isomorphic(rearranged_graph, product.graph): ordered_fbonds = [] ordered_bbonds = [] for fbond in fbonds: if fbond[0] < fbond[1]: ordered_fbonds.append((fbond[0], fbond[1])) else: ordered_fbonds.append((fbond[1], fbond[0])) for bbond in bbonds: if bbond[0] < bbond[1]: ordered_bbonds.append((bbond[0], bbond[1])) else: ordered_bbonds.append((bbond[1], bbond[0])) ordered_fbonds.sort() ordered_bbonds.sort() bond_rearrangs.append( BondRearrangement(forming_bonds=ordered_fbonds, breaking_bonds=ordered_bbonds)) return bond_rearrangs