def test_stereochem(): parser = parse_smiles('N[C@](Br)(O)C') parser_coords = np.array([atom.coord for atom in parser.atoms][:5]) desired_coords = np.array([[1.26597, 0.60740, -0.09729], [-0.26307, 0.59858, -0.07141], [-0.91282, 2.25811, 0.01409], [-0.72365, -0.12709, 1.01313], [-0.64392, 0.13084, -1.00380]]) assert calc_rmsd(parser_coords, desired_coords) < 0.5 parser = parse_smiles('N[C@@H](Br)(O)') parser_coords = np.array([atom.coord for atom in parser.atoms][:4] + [parser.atoms[6].coord]) desired_coords = np.array([[1.26597, 0.60740, -0.09729], [-0.26307, 0.59858, -0.07141], [-0.72365, -0.12709, 1.01313], [-0.91282, 2.25811, 0.01409], [-0.64392, 0.13084, -1.00380]]) assert calc_rmsd(parser_coords, desired_coords) < 0.5 parser = parse_smiles('F/C=C/F') parser_coords = np.array([atom.coord for atom in parser.atoms]) desired_coords = np.array([[-4.14679, 1.36072, 0.92663], [-3.58807, 1.44785, -0.00000], [-2.26409, 1.31952, 0.00000], [-1.70538, 1.40665, -0.92663], [-4.11965, 1.64066, -0.92663], [-1.73251, 1.12671, 0.92663]]) assert calc_rmsd(parser_coords, desired_coords) < 0.5
def test_charge(): parser = parse_smiles('C[O-]') assert parser.charge == -1 parser = parse_smiles('[O-]S(=O)([O-])=O') assert parser.charge == -2 parser = parse_smiles('C[N-2]') assert parser.charge == -2
def test_parse_smiles(): parser = parse_smiles('CC') assert len(parser.atoms) == 8 assert len(parser.bonds) == 7 assert parser.stereocentres == [] assert parser.charge == 0 assert parser.n_radical_electrons == 0 with pytest.raises(InvalidSmilesString): _ = parse_smiles('CC1')
def init_smiles(molecule, smiles): """ Initialise a molecule from a SMILES string Arguments: molecule (autode.molecule.Molecule): smiles (str): SMILES string """ # Assume that the RDKit conformer generation algorithm is not okay for # metals molecule.rdkit_conf_gen_is_fine = False parser = parse_smiles(smiles) molecule.charge = parser.charge molecule.mult = calc_multiplicity( molecule=molecule, n_radical_electrons=parser.n_radical_electrons) molecule.set_atoms(atoms=parser.atoms) make_graph(molecule, bond_list=parser.bonds) for stereocentre in parser.stereocentres: molecule.graph.nodes[stereocentre]['stereo'] = True for bond_index in parser.bond_order_dict.keys(): bond = parser.bonds[bond_index] molecule.graph.edges[bond]['pi'] = True molecule.set_atoms(atoms=get_simanl_atoms(molecule)) check_bonds(molecule, bonds=parser.bonds) return None
def test_alt_ring_branch(): smiles = ('[H][Rh]12([C]=O)([P+](C3=CC=CC4=C3OC5=C([P+](C6=CC=CC=C6)2C7=' 'CC=CC=C7)C=CC=C5C4(C)C)(C8=CC=CC=C8)C9=CC=CC=C9)CC1') parser = parse_smiles(smiles) # Should be valid and not raise InvalidSmilesString assert len(parser.atoms) == 84
def test_alkene_stereochem(): parser = parse_smiles('C/C=C/C') assert len(parser.alkene_stero_dict.keys()) > 0 parser = parse_smiles('C/C=C/C#C') assert len(parser.alkene_stero_dict.keys()) > 0
def test_double_bonds_in_ring(): parser = parse_smiles('C1=C=C=1') assert len(parser.bonds) == 3 assert parser.charge == 0