def test_generate_conformers(self): """Test OpenEyeToolkitWrapper generate_conformers()""" toolkit_wrapper = OpenEyeToolkitWrapper() smiles = '[H]C([H])([H])C([H])([H])[H]' molecule = toolkit_wrapper.from_smiles(smiles) molecule.generate_conformers() assert molecule.n_conformers != 0 assert not (molecule.conformers[0] == (0. * unit.angstrom)).all()
def test_compute_wiberg_bond_orders_charged(self): """Test OpenEyeToolkitWrapper compute_wiberg_bond_orders() on a molecule with net charge +1""" toolkit_wrapper = OpenEyeToolkitWrapper() smiles = '[H]C([H])([H])[N+]([H])([H])[H]' molecule = toolkit_wrapper.from_smiles(smiles) molecule.generate_conformers(toolkit_registry=toolkit_wrapper) for charge_model in ['am1', 'pm3']: molecule.compute_wiberg_bond_orders( toolkit_registry=toolkit_wrapper, charge_model=charge_model)
def test_compute_wiberg_bond_orders(self): """Test OpenEyeToolkitWrapper compute_wiberg_bond_orders()""" toolkit_wrapper = OpenEyeToolkitWrapper() smiles = '[H]C([H])([H])C([H])([H])[H]' molecule = toolkit_wrapper.from_smiles(smiles) molecule.generate_conformers(toolkit_registry=toolkit_wrapper) for charge_model in ['am1', 'pm3']: molecule.compute_wiberg_bond_orders( toolkit_registry=toolkit_wrapper, charge_model=charge_model) print([bond.fractional_bond_order for bond in molecule.bonds])
def test_compute_wiberg_bond_orders_double_bond(self): """Test OpenEyeToolkitWrapper compute_wiberg_bond_orders() on a molecule with a double bond""" toolkit_wrapper = OpenEyeToolkitWrapper() smiles = r'C\C(F)=C(/F)C[C@@](C)(Cl)Br' molecule = toolkit_wrapper.from_smiles(smiles) molecule.generate_conformers(toolkit_registry=toolkit_wrapper) for charge_model in ['am1', 'pm3']: molecule.compute_wiberg_bond_orders( toolkit_registry=toolkit_wrapper, charge_model=charge_model) # TODO: Add test for equivalent Wiberg orders for equivalent bonds double_bond_has_wbo_near_2 = False for bond in molecule.bonds: if bond.bond_order == 2: if 1.75 < bond.fractional_bond_order < 2.25: double_bond_has_wbo_near_2 = True assert double_bond_has_wbo_near_2
def test_compute_partial_charges(self): """Test OpenEyeToolkitWrapper compute_partial_charges()""" toolkit_wrapper = OpenEyeToolkitWrapper() smiles = '[H]C([H])([H])C([H])([H])[H]' molecule = toolkit_wrapper.from_smiles(smiles) # Ensure that an exception is raised if no conformers are provided with pytest.raises(Exception) as excinfo: molecule.compute_partial_charges(toolkit_registry=toolkit_wrapper) molecule.generate_conformers(toolkit_registry=toolkit_wrapper) # Ensure that an exception is raised if an invalid charge model is passed in with pytest.raises(Exception) as excinfo: charge_model = 'notARealChargeModel' molecule.compute_partial_charges(toolkit_registry=toolkit_wrapper, charge_model=charge_model) # TODO: Test all supported charge models # Note: "amber" and "amberff94" only work for a subset of residue types, so we'll need to find testing data for # those # charge_model = [,'amber','amberff94'] # TODO: 'mmff' and 'mmff94' often assign charges of 0, presumably if the molecule is unrecognized. # charge_model = ['mmff', 'mmff94'] for charge_model in [ 'noop', 'am1bcc', 'am1bccnosymspt', 'am1bccelf10' ]: with pytest.raises(NotImplementedError) as excinfo: molecule.compute_partial_charges( toolkit_registry=toolkit_wrapper ) # , charge_model=charge_model) charge_sum = 0 * unit.elementary_charge for pc in molecule._partial_charges: charge_sum += pc assert charge_sum < 0.001 * unit.elementary_charge # For now, just test AM1-BCC while the SMIRNOFF spec for other charge models gets worked out molecule.compute_partial_charges_am1bcc( toolkit_registry=toolkit_wrapper) # , charge_model=charge_model) charge_sum = 0 * unit.elementary_charge for pc in molecule._partial_charges: charge_sum += pc assert charge_sum < 0.001 * unit.elementary_charge
def test_compute_partial_charges_net_charge(self): """Test OpenEyeToolkitWrapper compute_partial_charges() on a molecule with a net +1 charge""" toolkit_wrapper = OpenEyeToolkitWrapper() smiles = '[H]C([H])([H])[N+]([H])([H])[H]' molecule = toolkit_wrapper.from_smiles(smiles) molecule.generate_conformers(toolkit_registry=toolkit_wrapper) with pytest.raises(NotImplementedError) as excinfo: charge_model = 'notARealChargeModel' molecule.compute_partial_charges(toolkit_registry=toolkit_wrapper ) #, charge_model=charge_model) # TODO: Test all supported charge models # TODO: "amber" and "amberff94" only work for a subset of residue types, so we'll need to find testing data for # those # charge_model = [,'amber','amberff94'] # The 'noop' charge model doesn't add up to the formal charge, so we shouldn't test it # charge_model = ['noop'] for charge_model in [ 'mmff', 'mmff94', 'am1bcc', 'am1bccnosymspt', 'am1bccelf10' ]: with pytest.raises(NotImplementedError) as excinfo: molecule.compute_partial_charges( toolkit_registry=toolkit_wrapper ) #, charge_model=charge_model) charge_sum = 0 * unit.elementary_charge for pc in molecule._partial_charges: charge_sum += pc assert 0.999 * unit.elementary_charge < charge_sum < 1.001 * unit.elementary_charge # For now, I'm just testing AM1-BCC (will test more when the SMIRNOFF spec for other charges is finalized) molecule.compute_partial_charges_am1bcc( toolkit_registry=toolkit_wrapper) charge_sum = 0 * unit.elementary_charge for pc in molecule._partial_charges: charge_sum += pc assert 0.999 * unit.elementary_charge < charge_sum < 1.001 * unit.elementary_charge