def test_improper_torsion(): patterns = [ ['[*:1]~[#6X3:2](~[*:3])~[*:4]', 1.5341333333333333, 3.141592653589793, 2.0], ['[*:1]~[#6X3:2](~[#8X1:3])~[#8:4]', 99., 99., 99.], ['[*:1]~[#7X3$(*~[#15,#16](!-[*])):2](~[*:3])~[*:4]', 99., 99., 99.], ['[*:1]~[#7X3$(*~[#6X3]):2](~[*:3])~[*:4]', 1.3946666666666667, 3.141592653589793, 2.0], ['[*:1]~[#7X3$(*~[#7X2]):2](~[*:3])~[*:4]', 99., 99., 99.], ['[*:1]~[#7X3$(*@1-[*]=,:[*][*]=,:[*]@1):2](~[*:3])~[*:4]', 99., 99., 99.], ['[*:1]~[#6X3:2](=[#7X2,#7X3+1:3])~[#7:4]', 99., 99., 99.] ] smirks = [x[0] for x in patterns] params = np.array([[x[1], x[2], x[3]] for x in patterns]) imph = bonded.ImproperTorsionHandler(smirks, params, None) obj = imph.serialize() all_handlers = deserialize(bin_to_str(obj)) assert len(all_handlers) == 1 new_imph = all_handlers[0] np.testing.assert_equal(new_imph.smirks, imph.smirks) np.testing.assert_equal(new_imph.params, imph.params) assert new_imph.props == imph.props
def test_am1ccc(): patterns = [ ['[#6X4:1]-[#1:2]', 0.46323257920556493], ['[#6X3$(*=[#8,#16]):1]-[#6a:2]', 0.24281402370571598], ['[#6X3$(*=[#8,#16]):1]-[#8X1,#8X2:2]', 1.0620166764992722], ['[#6X3$(*=[#8,#16]):1]=[#8X1$(*=[#6X3]-[#8X2]):2]', 2.227759732057297], ['[#6X3$(*=[#8,#16]):1]=[#8X1,#8X2:2]', 2.8182928673804217], ['[#6a:1]-[#8X1,#8X2:2]', 0.5315976926761063], ['[#6a:1]-[#1:2]', 0.0], ['[#6a:1]:[#6a:2]', 0.0], ['[#6a:1]:[#6a:2]', 0.0], ['[#8X1,#8X2:1]-[#1:2]', -2.3692047944101415], ['[#16:1]-[#8:2]', 99.] ] smirks = [x[0] for x in patterns] params = np.array([x[1]*np.sqrt(138.935456) for x in patterns]) props = None am1h = nonbonded.AM1CCCHandler(smirks, params, props) obj = am1h.serialize() all_handlers = deserialize(bin_to_str(obj)) assert len(all_handlers) == 1 new_am1h = all_handlers[0] np.testing.assert_equal(new_am1h.smirks, am1h.smirks) np.testing.assert_equal(new_am1h.params, am1h.params) assert new_am1h.props == am1h.props
def test_proper_torsion(): # proper torsions have a variadic number of terms patterns = [ ['[*:1]-[#6X3:2]=[#6X3:3]-[*:4]', [[99., 99., 99.]]], ['[*:1]-[#6X3:2]=[#6X3:3]-[#35:4]', [[99., 99., 99.]]], ['[#9:1]-[#6X3:2]=[#6X3:3]-[#35:4]', [[1., 2., 3.], [4., 5., 6.]]], ['[#35:1]-[#6X3:2]=[#6X3:3]-[#35:4]', [[7., 8., 9.], [1., 3., 5.], [4., 4., 4.]]], ['[#9:1]-[#6X3:2]=[#6X3:3]-[#9:4]', [[7., 8., 9.]]], ] smirks = [x[0] for x in patterns] params = [x[1] for x in patterns] props = None ph = bonded.ProperTorsionHandler(smirks, params, None) obj = ph.serialize() all_handlers = deserialize(bin_to_str(obj)) assert len(all_handlers) == 1 new_ph = all_handlers[0] np.testing.assert_equal(new_ph.smirks, ph.smirks) np.testing.assert_equal(new_ph.params, ph.params) assert new_ph.props == ph.props
def test_simple_charge_handler(): patterns = [ ['[#1:1]', 99.], ['[#1:1]-[#6X4]', 99.], ['[#1:1]-[#6X4]-[#7,#8,#9,#16,#17,#35]', 99.], ['[#1:1]-[#6X4](-[#7,#8,#9,#16,#17,#35])-[#7,#8,#9,#16,#17,#35]', 99.], ['[#1:1]-[#6X4](-[#7,#8,#9,#16,#17,#35])(-[#7,#8,#9,#16,#17,#35])-[#7,#8,#9,#16,#17,#35]', 99.], ['[#1:1]-[#6X4]~[*+1,*+2]', 99.], ['[#1:1]-[#6X3]', 99.], ['[#1:1]-[#6X3]~[#7,#8,#9,#16,#17,#35]', 99.], ['[#1:1]-[#6X3](~[#7,#8,#9,#16,#17,#35])~[#7,#8,#9,#16,#17,#35]', 99.], ['[#1:1]-[#6X2]', 99.], ['[#1:1]-[#7]', 99.], ['[#1:1]-[#8]', 99.], ['[#1:1]-[#16]', 99.], ['[#6:1]', 0.7], ['[#6X2:1]', 99.], ['[#6X4:1]', 0.1], ['[#8:1]', 99.], ['[#8X2H0+0:1]', 0.5], ['[#8X2H1+0:1]', 99.], ['[#7:1]', 0.3], ['[#16:1]', 99.], ['[#15:1]', 99.], ['[#9:1]', 1.0], ['[#17:1]', 99.], ['[#35:1]', 99.], ['[#53:1]', 99.], ['[#3+1:1]', 99.], ['[#11+1:1]', 99.], ['[#19+1:1]', 99.], ['[#37+1:1]', 99.], ['[#55+1:1]', 99.], ['[#9X0-1:1]', 99.], ['[#17X0-1:1]', 99.], ['[#35X0-1:1]', 99.], ['[#53X0-1:1]', 99.], ] smirks = [x[0] for x in patterns] params = np.array([x[1] for x in patterns]) props = None sch = nonbonded.SimpleChargeHandler(smirks, params, props) obj = sch.serialize() all_handlers = deserialize(bin_to_str(obj)) assert len(all_handlers) == 1 new_sch = all_handlers[0] np.testing.assert_equal(new_sch.smirks, sch.smirks) np.testing.assert_equal(new_sch.params, sch.params) assert new_sch.props == sch.props
def test_lennard_jones_handler(): patterns = [ ['[#1:1]', 99., 999.], ['[#1:1]-[#6X4]', 99., 999.], ['[#1:1]-[#6X4]-[#7,#8,#9,#16,#17,#35]', 99., 999.], ['[#1:1]-[#6X4](-[#7,#8,#9,#16,#17,#35])-[#7,#8,#9,#16,#17,#35]', 99., 999.], ['[#1:1]-[#6X4](-[#7,#8,#9,#16,#17,#35])(-[#7,#8,#9,#16,#17,#35])-[#7,#8,#9,#16,#17,#35]', 99., 999.], ['[#1:1]-[#6X4]~[*+1,*+2]', 99., 999.], ['[#1:1]-[#6X3]', 99., 999.], ['[#1:1]-[#6X3]~[#7,#8,#9,#16,#17,#35]', 99., 999.], ['[#1:1]-[#6X3](~[#7,#8,#9,#16,#17,#35])~[#7,#8,#9,#16,#17,#35]', 99., 999.], ['[#1:1]-[#6X2]', 99., 999.], ['[#1:1]-[#7]', 99., 999.], ['[#1:1]-[#8]', 99., 999.], ['[#1:1]-[#16]', 99., 999.], ['[#6:1]', 0.7, 0.8], ['[#6X2:1]', 99., 999.], ['[#6X4:1]', 0.1, 0.2], ['[#8:1]', 99., 999.], ['[#8X2H0+0:1]', 0.5, 0.6], ['[#8X2H1+0:1]', 99., 999.], ['[#7:1]', 0.3, 0.4], ['[#16:1]', 99., 999.], ['[#15:1]', 99., 999.], ['[#9:1]', 1.0, 1.1], ['[#17:1]', 99., 999.], ['[#35:1]', 99., 999.], ['[#53:1]', 99., 999.], ['[#3+1:1]', 99., 999.], ['[#11+1:1]', 99., 999.], ['[#19+1:1]', 99., 999.], ['[#37+1:1]', 99., 999.], ['[#55+1:1]', 99., 999.], ['[#9X0-1:1]', 99., 999.], ['[#17X0-1:1]', 99., 999.], ['[#35X0-1:1]', 99., 999.], ['[#53X0-1:1]', 99., 999.], ] smirks = [x[0] for x in patterns] params = np.array([[x[1], x[2]] for x in patterns]) props = None ljh = nonbonded.LennardJonesHandler(smirks, params, props) obj = ljh.serialize() all_handlers = deserialize(bin_to_str(obj)) ljh = all_handlers[0] np.testing.assert_equal(ljh.smirks, ljh.smirks) np.testing.assert_equal(ljh.params, ljh.params) assert ljh.props == ljh.props
def test_am1bcc(): smirks = [] params = [] props = None am1 = nonbonded.AM1BCCHandler(smirks, params, props) obj = am1.serialize() all_handlers = deserialize(bin_to_str(obj)) am1 = all_handlers[0] np.testing.assert_equal(am1.smirks, am1.smirks) np.testing.assert_equal(am1.params, am1.params) assert am1.props == am1.props
def test_gbsa_handler(): patterns = [ ['[*:1]', 99., 99.], ['[#1:1]', 99., 99.], ['[#1:1]~[#7]', 99., 99.], ['[#6:1]', 0.1, 0.2], ['[#7:1]', 0.3, 0.4], ['[#8:1]', 0.5, 0.6], ['[#9:1]', 0.7, 0.8], ['[#14:1]', 99., 99.], ['[#15:1]', 99., 99.], ['[#16:1]', 99., 99.], ['[#17:1]', 99., 99.] ] props = { 'solvent_dielectric' : 78.3, # matches OBC2, 'solute_dielectric' : 1.0, 'probe_radius' : 0.14, 'surface_tension' : 28.3919551, 'dielectric_offset' : 0.009, # GBOBC1 'alpha' : 0.8, 'beta' : 0.0, 'gamma' : 2.909125 } smirks = [x[0] for x in patterns] params = np.array([[x[1], x[2]] for x in patterns]) gbh = nonbonded.GBSAHandler(smirks, params, props) obj = gbh.serialize() all_handlers = deserialize(bin_to_str(obj)) assert len(all_handlers) == 1 new_gbh = all_handlers[0] np.testing.assert_equal(new_gbh.smirks, gbh.smirks) np.testing.assert_equal(new_gbh.params, gbh.params) assert new_gbh.props == gbh.props
def test_am1_differences(): ff_raw = open("ff/params/smirnoff_1_1_0_ccc.py").read() ff_handlers = deserialize(ff_raw) for ccc in ff_handlers: if isinstance(ccc, nonbonded.AM1CCCHandler): break suppl = Chem.SDMolSupplier('tests/ligands_40.sdf', removeHs=False) am1 = nonbonded.AM1Handler([], [], None) bcc = nonbonded.AM1BCCHandler([], [], None) for mol in suppl: am1_params, vjp_fn = am1.parameterize(mol) ccc_params, vjp_fn = ccc.parameterize(mol) bcc_params, vjp_fn = bcc.parameterize(mol) if np.sum(np.abs(ccc_params - bcc_params)) > 0.1: print(mol.GetProp("_Name"), Chem.MolToSmiles(mol)) print(" AM1 CCC BCC S ?") for atom_idx, atom in enumerate(mol.GetAtoms()): a = am1_params[atom_idx] b = bcc_params[atom_idx] c = ccc_params[atom_idx] print("{:6.2f}".format(a), "{:6.2f}".format(c), "{:6.2f}".format(b), atom.GetSymbol(), end="") if np.abs(b - c) > 0.1: print(" *") else: print(" ") assert 0
suppl = Chem.SDMolSupplier("tests/data/ligands_40.sdf", removeHs=False) for guest_mol in suppl: break guest_masses = np.array([a.GetMass() for a in guest_mol.GetAtoms()], dtype=np.float64) host_pdbfile = "tests/data/hif2a_nowater_min.pdb" host_pdb = PDBFile(host_pdbfile) combined_pdb = Chem.CombineMols( Chem.MolFromPDBFile(host_pdbfile, removeHs=False), guest_mol) ff_handlers = deserialize(open('ff/params/smirnoff_1_1_0_ccc.py').read()) x0, combined_masses, final_gradients = dock_setup.create_system( guest_mol, host_pdb, ff_handlers) gradients = [] for grad_name, grad_args in final_gradients: op_fn = getattr(ops, grad_name) grad = op_fn(*grad_args, precision=np.float32) gradients.append(grad) print(gradients) n_steps = 20000
for guest_idx, mol in enumerate(suppl): mol_dG = -1 * convert_uIC50_to_kJ_per_mole( float(mol.GetProp(general_cfg['bind_prop']))) data.append((mol, mol_dG)) full_dataset = dataset.Dataset(data) train_frac = float(general_cfg['train_frac']) train_dataset, test_dataset = full_dataset.split(train_frac) # process the host first host_pdbfile = general_cfg['protein_pdb'] stage_dGs = [] ff_raw = open(general_cfg['forcefield'], "r").read() ff_handlers = deserialize(ff_raw) worker_address_list = [] for address in config['workers']['hosts'].split(','): worker_address_list.append(address) stubs = [] for address in worker_address_list: print("connecting to", address) channel = grpc.insecure_channel( address, options=[('grpc.max_send_message_length', 500 * 1024 * 1024), ('grpc.max_receive_message_length', 500 * 1024 * 1024)]) stub = service_pb2_grpc.WorkerStub(channel)
def test_harmonic_bond(): patterns = [ ['[#6X4:1]-[#6X4:2]', 0.1, 0.2], ['[#6X4:1]-[#6X3:2]', 99., 99.], ['[#6X4:1]-[#6X3:2]=[#8X1+0]', 99., 99.], ['[#6X3:1]-[#6X3:2]', 99., 99.], ['[#6X3:1]:[#6X3:2]', 99., 99.], ['[#6X3:1]=[#6X3:2]', 99., 99.], ['[#6:1]-[#7:2]',0.1, 0.2], ['[#6X3:1]-[#7X3:2]', 99., 99.], ['[#6X4:1]-[#7X3:2]-[#6X3]=[#8X1+0]', 99., 99.], ['[#6X3:1](=[#8X1+0])-[#7X3:2]', 99., 99.], ['[#6X3:1]-[#7X2:2]', 99., 99.], ['[#6X3:1]:[#7X2,#7X3+1:2]', 99., 99.], ['[#6X3:1]=[#7X2,#7X3+1:2]', 99., 99.], ['[#6:1]-[#8:2]', 99., 99.], ['[#6X3:1]-[#8X1-1:2]', 99., 99.], ['[#6X4:1]-[#8X2H0:2]', 0.3, 0.4], ['[#6X3:1]-[#8X2:2]', 99., 99.], ['[#6X3:1]-[#8X2H1:2]', 99., 99.], ['[#6X3a:1]-[#8X2H0:2]', 99., 99.], ['[#6X3:1](=[#8X1])-[#8X2H0:2]', 99., 99.], ['[#6:1]=[#8X1+0,#8X2+1:2]', 99., 99.], ['[#6X3:1](~[#8X1])~[#8X1:2]', 99., 99.], ['[#6X3:1]~[#8X2+1:2]~[#6X3]', 99., 99.], ['[#6X2:1]-[#6:2]', 99., 99.], ['[#6X2:1]-[#6X4:2]', 99., 99.], ['[#6X2:1]=[#6X3:2]', 99., 99.], ['[#6:1]#[#7:2]', 99., 99.], ['[#6X2:1]#[#6X2:2]', 99., 99.], ['[#6X2:1]-[#8X2:2]', 99., 99.], ['[#6X2:1]-[#7:2]', 99., 99.], ['[#6X2:1]=[#7:2]', 99., 99.], ['[#16:1]=[#6:2]', 99., 99.], ['[#6X2:1]=[#16:2]', 99., 99.], ['[#7:1]-[#7:2]', 99., 99.], ['[#7X3:1]-[#7X2:2]', 99., 99.], ['[#7X2:1]-[#7X2:2]', 99., 99.], ['[#7:1]:[#7:2]', 99., 99.], ['[#7:1]=[#7:2]', 99., 99.], ['[#7+1:1]=[#7-1:2]', 99., 99.], ['[#7:1]#[#7:2]', 99., 99.], ['[#7:1]-[#8X2:2]', 99., 99.], ['[#7:1]~[#8X1:2]', 99., 99.], ['[#8X2:1]-[#8X2:2]', 99., 99.], ['[#16:1]-[#6:2]', 99., 99.], ['[#16:1]-[#1:2]', 99., 99.], ['[#16:1]-[#16:2]', 99., 99.], ['[#16:1]-[#9:2]', 99., 99.], ['[#16:1]-[#17:2]', 99., 99.], ['[#16:1]-[#35:2]', 99., 99.], ['[#16:1]-[#53:2]', 99., 99.], ['[#16X2,#16X1-1,#16X3+1:1]-[#6X4:2]', 99., 99.], ['[#16X2,#16X1-1,#16X3+1:1]-[#6X3:2]', 99., 99.], ['[#16X2:1]-[#7:2]', 99., 99.], ['[#16X2:1]-[#8X2:2]', 99., 99.], ['[#16X2:1]=[#8X1,#7X2:2]', 99., 99.], ['[#16X4,#16X3!+1:1]-[#6:2]', 99., 99.], ['[#16X4,#16X3:1]~[#7:2]', 99., 99.], ['[#16X4,#16X3:1]-[#8X2:2]', 99., 99.], ['[#16X4,#16X3:1]~[#8X1:2]', 99., 99.], ['[#15:1]-[#1:2]', 99., 99.], ['[#15:1]~[#6:2]', 99., 99.], ['[#15:1]-[#7:2]', 99., 99.], ['[#15:1]=[#7:2]', 99., 99.], ['[#15:1]~[#8X2:2]', 99., 99.], ['[#15:1]~[#8X1:2]', 99., 99.], ['[#16:1]-[#15:2]', 99., 99.], ['[#15:1]=[#16X1:2]', 99., 99.], ['[#6:1]-[#9:2]', 99., 99.], ['[#6X4:1]-[#9:2]', 0.6, 0.7], ['[#6:1]-[#17:2]', 99., 99.], ['[#6X4:1]-[#17:2]', 99., 99.], ['[#6:1]-[#35:2]', 99., 99.], ['[#6X4:1]-[#35:2]', 99., 99.], ['[#6:1]-[#53:2]', 99., 99.], ['[#6X4:1]-[#53:2]', 99., 99.], ['[#7:1]-[#9:2]', 99., 99.], ['[#7:1]-[#17:2]', 99., 99.], ['[#7:1]-[#35:2]', 99., 99.], ['[#7:1]-[#53:2]', 99., 99.], ['[#15:1]-[#9:2]', 99., 99.], ['[#15:1]-[#17:2]', 99., 99.], ['[#15:1]-[#35:2]', 99., 99.], ['[#15:1]-[#53:2]', 99., 99.], ['[#6X4:1]-[#1:2]', 99., 99.], ['[#6X3:1]-[#1:2]', 99., 99.], ['[#6X2:1]-[#1:2]', 99., 99.], ['[#7:1]-[#1:2]', 99., 99.], ['[#8:1]-[#1:2]', 99., 99.1] ] smirks = [x[0] for x in patterns] params = np.array([[x[1], x[2]] for x in patterns]) props = None hbh = bonded.HarmonicBondHandler(smirks, params, None) obj = hbh.serialize() all_handlers = deserialize(bin_to_str(obj)) assert len(all_handlers) == 1 new_hbh = all_handlers[0] np.testing.assert_equal(new_hbh.smirks, hbh.smirks) np.testing.assert_equal(new_hbh.params, hbh.params) assert new_hbh.props == hbh.props