예제 #1
0
def test_smirff_energies_vs_parmatfrosst(verbose=False):
    """Test evaluation of energies from parm@frosst ffxml files versus energies of equivalent systems."""

    from openeye import oechem
    prefix = 'AlkEthOH_'
    molecules = [ 'r118', 'r12', 'c1161', 'r0', 'c100', 'c38', 'c1266' ]

    # Loop over molecules, load OEMols and prep for comparison/do comparison
    for molnm in molecules:
        f_prefix = os.path.join('molecules', prefix+molnm )
        mol2file = get_data_filename( f_prefix+'.mol2')
        prmtop = get_data_filename( f_prefix+'.top')
        crd = get_data_filename( f_prefix+'.crd')
        # Load special parm@frosst with parm99/parm@frosst bugs re-added for testing
        forcefield = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH_parmAtFrosst.ffxml') )

        # Load OEMol
        mol = oechem.OEGraphMol()
        ifs = oechem.oemolistream(mol2file)
        flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield
        ifs.SetFlavor( oechem.OEFormat_MOL2, flavor)
        oechem.OEReadMolecule(ifs, mol )
        oechem.OETriposAtomNames(mol)

        # Do comparison
        results = compare_molecule_energies( prmtop, crd, forcefield, mol, verbose = verbose )
예제 #2
0
def test_merge_system():
    """Test merging of a system created from AMBER and another created from SMIRFF."""

    #Create System from AMBER
    prefix = os.path.join('systems', 'amber', 'cyclohexane_ethanol_0.4_0.6')
    prmtop = get_data_filename(prefix + '.prmtop')
    incrd = get_data_filename(prefix + '.inpcrd')

    topology0, system0, positions0 = create_system_from_amber(prmtop, incrd)

    from openeye import oechem
    # Load simple OEMol
    ifs = oechem.oemolistream(
        get_data_filename('molecules/AlkEthOH_c100.mol2'))
    mol = oechem.OEMol()
    flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield
    ifs.SetFlavor(oechem.OEFormat_MOL2, flavor)
    oechem.OEReadMolecule(ifs, mol)
    oechem.OETriposAtomNames(mol)

    # Load forcefield file
    forcefield = ForceField(
        get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
    topology1, system1, positions1 = create_system_from_molecule(
        forcefield, mol)

    merge_system(topology0,
                 topology1,
                 system0,
                 system1,
                 positions0,
                 positions1,
                 verbose=True)
예제 #3
0
def check_boxes(forcefield, description="", chargeMethod=None, verbose=False):
    """Test creation of System from boxes of mixed solvents.
    """
    # Read monomers
    mols = list()
    monomers = ['cyclohexane', 'ethanol', 'propane', 'methane', 'butanol']
    from openeye import oechem
    mol = oechem.OEGraphMol()
    for monomer in monomers:
        filename = get_data_filename(os.path.join('systems', 'monomers', monomer + '.sdf'))
        ifs = oechem.oemolistream(filename)
        while oechem.OEReadMolecule(ifs, mol):
            oechem.OETriposAtomNames(mol)
            mols.append( oechem.OEGraphMol(mol) )
    if verbose: print('%d reference molecules loaded' % len(mols))

    # Read systems.
    boxes = ['cyclohexane_ethanol_0.4_0.6.pdb', 'propane_methane_butanol_0.2_0.3_0.5.pdb']
    from simtk.openmm.app import PDBFile
    for box in boxes:
        filename = get_data_filename(os.path.join('systems', 'packmol_boxes', box))
        pdbfile = PDBFile(filename)
        f = partial(check_system_creation_from_topology, forcefield, pdbfile.topology, mols, pdbfile.positions, chargeMethod=chargeMethod, verbose=verbose)
        f.description = 'Test creation of System object from %s %s' % (box, description)
        yield f
예제 #4
0
 def test_read_typelist(self):
     atomtypes = AtomTyper.read_typelist(
         get_data_filename('atomtypes/basetypes.smarts'))
     decorators = AtomTyper.read_typelist(
         get_data_filename('atomtypes/decorators.smarts'))
     replacements = AtomTyper.read_typelist(
         get_data_filename('atomtypes/replacements.smarts'))
예제 #5
0
def test_smirff_energies_vs_parmatfrosst(verbose=False):
    """Test evaluation of energies from parm@frosst ffxml files versus energies of equivalent systems."""

    from openeye import oechem
    prefix = 'AlkEthOH_'
    molecules = ['r118', 'r12', 'c1161', 'r0', 'c100', 'c38', 'c1266']

    # Loop over molecules, load OEMols and prep for comparison/do comparison
    for molnm in molecules:
        f_prefix = os.path.join('molecules', prefix + molnm)
        mol2file = get_data_filename(f_prefix + '.mol2')
        prmtop = get_data_filename(f_prefix + '.top')
        crd = get_data_filename(f_prefix + '.crd')
        # Load special parm@frosst with parm99/parm@frosst bugs re-added for testing
        forcefield = ForceField(
            get_data_filename('forcefield/Frosst_AlkEtOH_parmAtFrosst.ffxml'))

        # Load OEMol
        mol = oechem.OEGraphMol()
        ifs = oechem.oemolistream(mol2file)
        flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield
        ifs.SetFlavor(oechem.OEFormat_MOL2, flavor)
        oechem.OEReadMolecule(ifs, mol)
        oechem.OETriposAtomNames(mol)

        # Do comparison
        results = compare_molecule_energies(prmtop,
                                            crd,
                                            forcefield,
                                            mol,
                                            verbose=verbose)
예제 #6
0
def test_improper(verbose=False):
    """Test implement of impropers on benzene."""
    from openeye import oechem
    # Load benzene
    ifs = oechem.oemolistream(get_data_filename('molecules/benzene.mol2'))
    mol = oechem.OEMol()
    flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield
    ifs.SetFlavor(oechem.OEFormat_MOL2, flavor)
    oechem.OEReadMolecule(ifs, mol)
    ifs.close()
    # Load forcefield
    ffxml = get_data_filename('forcefield/benzene_minimal.ffxml')
    ff = ForceField(ffxml)

    # Load AMBER files and compare
    crd = get_data_filename('molecules/benzene.crd')
    top = get_data_filename('molecules/benzene.top')
    g0, g1, e0, e1 = compare_molecule_energies(top,
                                               crd,
                                               ff,
                                               mol,
                                               skip_assert=True)

    # Check that torsional energies the same to 1 in 10^6
    rel_error = np.abs((g0['torsion'] - g1['torsion']) / g0['torsion'])
    if rel_error > 2e-5:  #Note that this will not be tiny because we use six-fold impropers and they use a single improper
        raise Exception(
            "Improper torsion energy for benzene differs too much (relative error %.4g) between AMBER and SMIRFF."
            % rel_error)
    def test_atomtyper(self):
        typetag = 'atomtype'
        atomtypes = AtomTyper.read_typelist(get_data_filename('atomtypes/basetypes.smarts'))
        replacements = AtomTyper.read_typelist(get_data_filename('atomtypes/replacements.smarts'))
        molecules = read_molecules('zinc-subset-tripos.mol2.gz', verbose=False)

        atomtyper = AtomTyper(atomtypes, typetag, replacements=replacements)
        for molecule in molecules:
            atomtyper.assignTypes(molecule)
예제 #8
0
    def __init__(self, *args, **kwargs):
        """
        Initialize TestCase including files used in all smarty tests
        """
        unittest.TestCase.__init__(self, *args, **kwargs)

        self.basetypes = get_data_filename('atomtypes/basetypes.smarts')
        self.alkethoh_answers = get_data_filename(
            'atomtypes/initial_AlkEthOH.smarts')
        self.simple_decs = get_data_filename('atomtypes/decorators.smarts')
        self.combine_decs = get_data_filename(
            'atomtypes/new-decorators.smarts')
        self.replacements = get_data_filename('atomtypes/replacements.smarts')

        # import molecules
        self.mols_zinc = smarty.utils.read_molecules(
            get_data_filename('molecules/zinc-subset-tripos.mol2.gz'),
            verbose=False)
        self.mols_zinc_ref = smarty.utils.read_molecules(
            get_data_filename('molecules/[email protected]'),
            verbose=False)

        self.mols_alkethoh = smarty.utils.read_molecules(
            get_data_filename('molecules/AlkEthOH_test_filt1_tripos.mol2'),
            verbose=False)
        self.mols_alkethoh_ref = smarty.utils.read_molecules(
            get_data_filename('molecules/AlkEthOH_test_filt1_ff.mol2'),
            verbose=False)
예제 #9
0
    def test_atomtyper(self):
        typetag = 'atomtype'
        atomtypes = AtomTyper.read_typelist(
            get_data_filename('atomtypes/basetypes.smarts'))
        replacements = AtomTyper.read_typelist(
            get_data_filename('atomtypes/replacements.smarts'))
        molecules = read_molecules('zinc-subset-tripos.mol2.gz', verbose=False)

        atomtyper = AtomTyper(atomtypes, typetag, replacements=replacements)
        for molecule in molecules:
            atomtyper.assignTypes(molecule)
예제 #10
0
def test_gromacs_roundtrip():
    """Save a System (a mixture) to GROMACS, read back in, verify yields same energy and force terms."""

    forcefield = ForceField(
        get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
    filename = get_data_filename(
        os.path.join('systems', 'packmol_boxes',
                     'cyclohexane_ethanol_0.4_0.6.pdb'))
    from simtk.openmm.app import PDBFile
    pdbfile = PDBFile(filename)
    mol2files = [
        get_data_filename(os.path.join('systems', 'monomers', 'ethanol.mol2')),
        get_data_filename(
            os.path.join('systems', 'monomers', 'cyclohexane.mol2'))
    ]

    flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield
    mols = []
    mol = oechem.OEMol()
    for mol2file in mol2files:
        ifs = oechem.oemolistream(mol2file)
        ifs.SetFlavor(oechem.OEFormat_MOL2, flavor)
        mol = oechem.OEGraphMol()
        while oechem.OEReadMolecule(ifs, mol):
            oechem.OETriposAtomNames(mol)
            mols.append(oechem.OEGraphMol(mol))

    # setup system
    system = forcefield.createSystem(pdbfile.topology, mols)

    # Create ParmEd structure, save to AMBER
    a, topfile = tempfile.mkstemp(suffix='.top')
    a, grofile = tempfile.mkstemp(suffix='.gro')
    save_system_to_gromacs(pdbfile.topology, system, pdbfile.positions,
                           topfile, grofile)

    # Read back in and cross-check energies
    top = parmed.load_file(topfile)
    gro = parmed.load_file(grofile)
    gromacssys = top.createSystem(nonbondedMethod=app.NoCutoff,
                                  constraints=None,
                                  implicitSolvent=None)

    groups0, groups1, energy0, energy1 = compare_system_energies(
        pdbfile.topology,
        pdbfile.topology,
        gromacssys,
        system,
        pdbfile.positions,
        verbose=False)

    # Remove temp files
    os.remove(topfile)
    os.remove(grofile)
예제 #11
0
def test_create_system_molecules_parmatfrosst_gbsa(verbose=False):
    """Test creation of a System object from small molecules to test parm@frosst forcefield with GBSA support.
    """
    forcefield = ForceField(
        get_data_filename('forcefield/Frosst_AlkEtOH_GBSA.ffxml'))
    for f in check_AlkEtOH(forcefield,
                           "to test Parm@Frosst parameters",
                           verbose=verbose):
        yield f
예제 #12
0
def test_create_system_boxes_parmatfrosst(verbose=False):
    """Test creation of a System object from some boxes of mixed solvents to test parm@frosst forcefield.
    """
    forcefield = ForceField(
        get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
    for f in check_boxes(forcefield,
                         description="to test Parm@frosst parameters",
                         verbose=verbose):
        yield f
예제 #13
0
    def test_parameter_completeness_check(self):
        """Test that proper exceptions are raised if a force field fails to assign parameters to valence terms in a molecule."""
        from openeye import oechem
        mol = oechem.OEMol()
        oechem.OEParseSmiles(mol, 'CCC')
        oechem.OEAddExplicitHydrogens(mol)
        oechem.OETriposAtomNames(mol)
        ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
        topology = generateTopologyFromOEMol(mol)

        # Test nonbonded error checking by wiping out required LJ parameter
        params = ff.getParameter(paramID='n0001')
        params['smirks'] = '[#136:1]'
        ff.setParameter(paramID='n0001', params=params)
        ff.setParameter(paramID='n0002', params=params)
        with self.assertRaises(Exception):
            system = ff.createSystem(topology, [mol])
        ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))

        # Test bond error checking by wiping out a required bond parameter
        params = ff.getParameter(paramID='b0001')
        params['smirks'] = '[#136:1]~[*:2]'
        ff.setParameter(paramID='b0001', params=params)
        with self.assertRaises(Exception):
            system = ff.createSystem(topology, [mol])
        ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))

        # Test angle error checking by wiping out a required angle parameter
        params = ff.getParameter(paramID='a0001')
        params['smirks'] = '[#136:1]~[*:2]~[*:3]'
        ff.setParameter(paramID='a0001', params=params)
        with self.assertRaises(Exception):
            system = ff.createSystem(topology, [mol])
        ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))

        # Test torsion error checking by wiping out a required torsion parameter
        params = ff.getParameter(paramID='t0001')
        params['smirks'] = '[#136:1]~[*:2]~[*:3]~[*:4]'
        ff.setParameter(paramID='t0001', params=params)
        ff.setParameter(paramID='t0004', params=params)
        with self.assertRaises(Exception):
            system = ff.createSystem(topology, [mol])
        ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
예제 #14
0
def check_AlkEtOH(forcefield, description="", chargeMethod=None, verbose=False):
    """Test creation of System from AlkEtOH small molecules.
    """
    from openeye import oechem
    ifs = oechem.oemolistream(get_data_filename('molecules/AlkEtOH-tripos.mol2.gz'))
    mol = oechem.OEGraphMol()
    while oechem.OEReadMolecule(ifs, mol):
        args = { 'verbose' : verbose, 'chargeMethod' : chargeMethod }
        f = partial(check_system_creation_from_molecule, forcefield, mol, **args)
        f.description ='Testing creation of system object from small molecules (%s) %s' % (mol.GetTitle(), description)
        yield f
예제 #15
0
    def test_atomtyper_AlkEthOH(self):
        # Test to make sure that AlkEthOH gets 100% at T=0 starting from correct
        # types
        basetypes_filename = get_data_filename('atomtypes/basetypes.smarts')
        initialtypes_filename = get_data_filename(
            'atomtypes/initial_AlkEthOH.smarts')
        decorators_filename = get_data_filename(
            'atomtypes/new-decorators.smarts')
        replacements_filename = get_data_filename(
            'atomtypes/replacements.smarts')
        molecules = smarty.utils.read_molecules(
            get_data_filename('molecules/AlkEthOH_test_filt1_tripos.mol2'),
            verbose=False)
        reference_typed_molecules = smarty.utils.read_molecules(
            get_data_filename('molecules/AlkEthOH_test_filt1_ff.mol2'),
            verbose=False)

        # Construct atom type sampler.
        atomtype_sampler = smarty.AtomTypeSampler(
            molecules,
            basetypes_filename,
            initialtypes_filename,
            decorators_filename,
            replacements_filename=replacements_filename,
            reference_typed_molecules=reference_typed_molecules,
            verbose=False,
            temperature=0)

        # Start sampling atom types.
        fracfound = atomtype_sampler.run(2)

        # Ensure fraction found is 1.0
        if fracfound < 1.0:
            raise Exception("Not finding 100% of AlkEthOH when starting from"
                            " correct SMARTS.")
예제 #16
0
    def test_atomtyper(self):
        basetypes_filename = get_data_filename('atomtypes/basetypes.smarts')
        initialtypes_filename = get_data_filename('atomtypes/basetypes.smarts')
        decorators_filename = get_data_filename('atomtypes/decorators.smarts')
        replacements_filename = get_data_filename(
            'atomtypes/replacements.smarts')
        molecules = smarty.utils.read_molecules(
            get_data_filename('molecules/zinc-subset-tripos.mol2.gz'),
            verbose=False)
        reference_typed_molecules = smarty.utils.read_molecules(
            get_data_filename('molecules/[email protected]'),
            verbose=False)

        # Construct atom type sampler.
        atomtype_sampler = smarty.AtomTypeSampler(
            molecules,
            basetypes_filename,
            initialtypes_filename,
            decorators_filename,
            replacements_filename=replacements_filename,
            reference_typed_molecules=reference_typed_molecules,
            verbose=False,
            decorator_behavior='simple-decorators')

        # Start sampling atom types.
        atomtype_sampler.run(2)
예제 #17
0
def test_change_parameters(verbose=False):
    """Test modification of forcefield parameters."""
    from openeye import oechem
    # Load simple OEMol
    ifs = oechem.oemolistream(
        get_data_filename('molecules/AlkEthOH_c100.mol2'))
    mol = oechem.OEMol()
    flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield
    ifs.SetFlavor(oechem.OEFormat_MOL2, flavor)
    oechem.OEReadMolecule(ifs, mol)
    oechem.OETriposAtomNames(mol)

    # Load forcefield file
    ffxml = get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')
    ff = ForceField(ffxml)

    from smarty.forcefield import generateTopologyFromOEMol
    topology = generateTopologyFromOEMol(mol)
    # Create initial system
    system = ff.createSystem(topology, [mol], verbose=verbose)
    # Get initial energy before parameter modification
    positions = positions_from_oemol(mol)
    old_energy = get_energy(system, positions)

    # Get params for an angle
    params = ff.getParameter(smirks='[a,A:1]-[#6X4:2]-[a,A:3]')
    # Modify params
    params['k'] = '0.0'
    ff.setParameter(params, smirks='[a,A:1]-[#6X4:2]-[a,A:3]')
    # Write params
    ff.writeFile(tempfile.TemporaryFile(suffix='.ffxml'))
    # Make sure params changed energy! (Test whether they get rebuilt on system creation)
    system = ff.createSystem(topology, [mol], verbose=verbose)
    energy = get_energy(system, positions)
    if verbose:
        print("New energy/old energy:", energy, old_energy)
    if np.abs(energy - old_energy) < 0.1:
        raise Exception("Error: Parameter modification did not change energy.")
예제 #18
0
def test_change_parameters(verbose=False):
    """Test modification of forcefield parameters."""
    from openeye import oechem
    # Load simple OEMol
    ifs = oechem.oemolistream(get_data_filename('molecules/AlkEthOH_c100.mol2'))
    mol = oechem.OEMol()
    flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield
    ifs.SetFlavor( oechem.OEFormat_MOL2, flavor)
    oechem.OEReadMolecule(ifs, mol )
    oechem.OETriposAtomNames(mol)

    # Load forcefield file
    ffxml = get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')
    ff = ForceField(ffxml)

    from smarty.forcefield import generateTopologyFromOEMol
    topology = generateTopologyFromOEMol(mol)
    # Create initial system
    system = ff.createSystem(topology, [mol], verbose=verbose)
    # Get initial energy before parameter modification
    positions = positions_from_oemol(mol)
    old_energy=get_energy(system, positions)

    # Get params for an angle
    params = ff.getParameter(smirks='[a,A:1]-[#6X4:2]-[a,A:3]')
    # Modify params
    params['k']='0.0'
    ff.setParameter(params, smirks='[a,A:1]-[#6X4:2]-[a,A:3]')
    # Write params
    ff.writeFile( tempfile.TemporaryFile(suffix='.ffxml') )
    # Make sure params changed energy! (Test whether they get rebuilt on system creation)
    system=ff.createSystem(topology, [mol], verbose=verbose)
    energy=get_energy(system, positions)
    if verbose:
        print("New energy/old energy:", energy, old_energy)
    if np.abs(energy-old_energy)<0.1:
        raise Exception("Error: Parameter modification did not change energy.")
예제 #19
0
def check_boxes(forcefield, description="", chargeMethod=None, verbose=False):
    """Test creation of System from boxes of mixed solvents.
    """
    # Read monomers
    mols = list()
    monomers = ['cyclohexane', 'ethanol', 'propane', 'methane', 'butanol']
    from openeye import oechem
    mol = oechem.OEGraphMol()
    for monomer in monomers:
        filename = get_data_filename(
            os.path.join('systems', 'monomers', monomer + '.sdf'))
        ifs = oechem.oemolistream(filename)
        while oechem.OEReadMolecule(ifs, mol):
            oechem.OETriposAtomNames(mol)
            mols.append(oechem.OEGraphMol(mol))
    if verbose: print('%d reference molecules loaded' % len(mols))

    # Read systems.
    boxes = [
        'cyclohexane_ethanol_0.4_0.6.pdb',
        'propane_methane_butanol_0.2_0.3_0.5.pdb'
    ]
    from simtk.openmm.app import PDBFile
    for box in boxes:
        filename = get_data_filename(
            os.path.join('systems', 'packmol_boxes', box))
        pdbfile = PDBFile(filename)
        f = partial(check_system_creation_from_topology,
                    forcefield,
                    pdbfile.topology,
                    mols,
                    pdbfile.positions,
                    chargeMethod=chargeMethod,
                    verbose=verbose)
        f.description = 'Test creation of System object from %s %s' % (
            box, description)
        yield f
예제 #20
0
    def read_typelist(cls, filename):
        """
        Read an atomtype or decorator list from a file.

        Parameters
        ----------
        filename : str
            The name of the file to be read

        Returns
        -------
        typelist : list of tuples
            Typelist[i] is element i of the typelist in format [smarts, typename]

        """
        if filename is None:
            return None

        if not os.path.exists(filename):
            built_in = utils.get_data_filename(filename)
            if not os.path.exists(built_in):
                raise Exception("File '%s' not found." % filename)
            filename = built_in

        typelist = list()
        ifs = open(filename)
        lines = ifs.readlines()
        used_typenames = list()
        for line in lines:
            # Strip trailing comments
            index = line.find('%')
            if index != -1:
                line = line[0:index]
            # Split into tokens.
            tokens = line.split()
            # Process if we have enough tokens
            if len(tokens) >= 2:
                smarts = tokens[0]
                typename = ' '.join(tokens[1:])
                if typename not in used_typenames:
                    typelist.append([smarts,typename])
                    used_typenames.append(typename)
                else:
                    raise Exception("Error in file '%s' -- each entry must "
                         "have a unique name." % filename )
        ifs.close()

        return typelist
예제 #21
0
def check_AlkEtOH(forcefield,
                  description="",
                  chargeMethod=None,
                  verbose=False):
    """Test creation of System from AlkEtOH small molecules.
    """
    from openeye import oechem
    ifs = oechem.oemolistream(
        get_data_filename('molecules/AlkEtOH-tripos.mol2.gz'))
    mol = oechem.OEGraphMol()
    while oechem.OEReadMolecule(ifs, mol):
        args = {'verbose': verbose, 'chargeMethod': chargeMethod}
        f = partial(check_system_creation_from_molecule, forcefield, mol,
                    **args)
        f.description = 'Testing creation of system object from small molecules (%s) %s' % (
            mol.GetTitle(), description)
        yield f
예제 #22
0
    def test_atomtyper(self):
        basetypes_filename = get_data_filename('atomtypes/basetypes.smarts')
        initialtypes_filename = get_data_filename('atomtypes/basetypes.smarts')
        decorators_filename = get_data_filename('atomtypes/decorators.smarts')
        replacements_filename = get_data_filename('atomtypes/replacements.smarts')
        molecules = smarty.utils.read_molecules(get_data_filename('molecules/zinc-subset-tripos.mol2.gz'), verbose=False)
        reference_typed_molecules = smarty.utils.read_molecules(get_data_filename('molecules/[email protected]'), verbose=False)

        # Construct atom type sampler.
        atomtype_sampler = smarty.AtomTypeSampler(molecules, basetypes_filename, initialtypes_filename, decorators_filename, replacements_filename=replacements_filename, reference_typed_molecules=reference_typed_molecules, verbose=False, decorator_behavior='simple-decorators')

        # Start sampling atom types.
        atomtype_sampler.run(2)
예제 #23
0
def test_molecule_labeling(verbose=False):
    """Test using labelMolecules to see which parameters applied to an oemol."""
    from openeye import oechem
    mol = oechem.OEMol()
    oechem.OEParseSmiles(mol, 'CCC')
    oechem.OEAddExplicitHydrogens(mol)
    ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
    labels = ff.labelMolecules([mol], verbose=verbose)

    # Check that force terms aren't empty
    print(labels[0].keys())
    if not 'HarmonicBondGenerator' in labels[0].keys():
        raise Exception("No force term assigned for harmonic bonds.")
    if not 'HarmonicAngleGenerator' in labels[0].keys():
        raise Exception("No force term assigned for harmonic angles.")
    if not 'PeriodicTorsionGenerator' in labels[0].keys():
        raise Exception("No force term assigned for periodic torsions.")
    if not 'NonbondedGenerator' in labels[0].keys():
        raise Exception("No nonbonded force term assigned.")
예제 #24
0
def test_molecule_labeling(verbose = False):
    """Test using labelMolecules to see which parameters applied to an oemol."""
    from openeye import oechem
    mol = oechem.OEMol()
    oechem.OEParseSmiles(mol, 'CCC')
    oechem.OEAddExplicitHydrogens(mol)
    ff = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
    labels = ff.labelMolecules( [mol], verbose = verbose)

    # Check that force terms aren't empty
    print(labels[0].keys())
    if not 'HarmonicBondGenerator' in labels[0].keys():
        raise Exception("No force term assigned for harmonic bonds.")
    if not 'HarmonicAngleGenerator' in labels[0].keys():
        raise Exception("No force term assigned for harmonic angles.")
    if not 'PeriodicTorsionGenerator' in labels[0].keys():
        raise Exception("No force term assigned for periodic torsions.")
    if not 'NonbondedGenerator' in labels[0].keys():
        raise Exception("No nonbonded force term assigned.")
예제 #25
0
    def __init__(self, *args, **kwargs):
        """
        Initialize TestCase and then read in odds from files in smarty/data
        """
        unittest.TestCase.__init__(self,*args, **kwargs)

        self.atom_OR_bases = utils.parse_odds_file("odds_files/atom_OR_bases.smarts" , False)
        self.atom_OR_decors = utils.parse_odds_file("odds_files/atom_decorators.smarts", False)
        self.atom_AND_decors = utils.parse_odds_file("odds_files/atom_decorators.smarts", False)
        self.bond_OR_bases = utils.parse_odds_file("odds_files/bond_OR_bases.smarts", False)
        self.bond_AND_decors = utils.parse_odds_file("odds_files/bond_AND_decorators.smarts", False)
        self.atom_odds = utils.parse_odds_file("odds_files/atom_index_odds.smarts", False)
        self.bond_odds = utils.parse_odds_file("odds_files/bond_index_odds.smarts", False)
        self.molecules = utils.read_molecules("test_filt1_tripos.mol2", False)
        self.SMIRFF = "forcefield/Frosst_AlkEtOH.ffxml"
        self.outputFile = 'test_smirky'
        replacement_file = utils.get_data_filename("odds_files/substitutions.smarts")
        self.replacements = smarty.AtomTyper.read_typelist(replacement_file)
        self.replacements = [ [short, smarts] for [smarts, short] in self.replacements]

        self.correctDict = {'VdW': [ ["[#1:1]-[#6]", 'HC'], [ "[#1:1]-[#6]-[#7,#8,F,#16,Cl,Br]", 'H1'], [ "[#1:1]-[#6](-[#7,#8,F,#16,Cl,Br])-[#7,#8,F,#16,Cl,Br]", 'H2'], [ "[#1:1]-[#6](-[#7,#8,F,#16,Cl,Br])(-[#7,#8,F,#16,Cl,Br])-[#7,#8,F,#16,Cl,Br]", 'H3'], [ "[#1:1]-[#8]", 'HO'], [ "[#6X4:1]", 'CT'], [ "[#8X2:1]", 'OS'], [ "[#8X2+0:1]-[#1]", 'OH'] ],
                'Bond': [ ["[#6X4:1]-[#6X4:2]", 'CT-CT'], [ "[#6X4:1]-[#1:2]", 'CT-H'], [ "[#8:1]~[#1:2]", 'O~H'], [ "[#6X4:1]-[#8;X2;H1:2]", "CT-OH"], [ "[#6X4:1]-[#8;X2;H0:2]", "CT-OS"] ],
                'Angle': [ [ "[a,A:1]-[#6&X4:2]-[a,A:3]", 'any-CT-any'], [ "[#1:1]-[#6&X4:2]-[#1:3]", "H-CT-H"], [ "[#6&X4:1]-[#6&X4:2]-[#6&X4:3]", 'CT-CT-CT'], [ "[#8&X2:1]-[#6&X4:2]-[#8&X2:3]", 'O-CT-O'], [ "[#6&X4:1]-[#8&X2:2]-[#1:3]", 'CT-OH-HO'], [ "[#6X4:1]-[#8X2:2]-[#6X4:3]", 'CT-OS-CT'] ],
                'Torsion': [["[a,A:1]-[#6&X4:2]-[#6&X4:3]-[a,A:4]", 'any-CT-CT-any'], [ "[a,A:1]-[#6&X4:2]-[#8&X2:3]-[#1:4]", 'any-CT-OH-HO'], [ "[a,A:1]-[#6&X4:2]-[#8&X2:3]-[!#1:4]", 'any-CT-OS-!H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[#1:4]", 'H-CT-CT-H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[#6&X4:4]", 'H-CT-CT-CT'], [ "[#6&X4:1]-[#6&X4:2]-[#8&X2:3]-[#1:4]", 'CT-CT-OH-HO'], [ "[#6&X4:1]-[#6&X4:2]-[#6&X4:3]-[#6&X4:4]", 'CT-CT-CT-CT'], [ "[#6&X4:1]-[#6&X4:2]-[#8&X2:3]-[#6&X4:4]", 'CT-CT-OS-CT'], [ "[#6&X4:1]-[#8&X2:2]-[#6&X4:3]-[O&X2&H0:4]", 'CT-OS-CT-OS'], [ "[#8&X2:1]-[#6&X4:2]-[#6&X4:3]-[#8&X2:4]", 'O-CT-CT-O'], [ "[#8&X2:1]-[#6&X4:2]-[#6&X4:3]-[#1:4]", 'O-CT-CT-H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[O&X2:4]", 'H-CT-CT-O'] ]}
    def __init__(self, *args, **kwargs):
        """
        Initialize TestCase and then read in odds from files in smarty/data
        """
        unittest.TestCase.__init__(self,*args, **kwargs)

        self.atom_OR_bases = utils.parse_odds_file("odds_files/atom_OR_bases.smarts" , False)
        self.atom_OR_decors = utils.parse_odds_file("odds_files/atom_decorators.smarts", False)
        self.atom_AND_decors = utils.parse_odds_file("odds_files/atom_decorators.smarts", False)
        self.bond_OR_bases = utils.parse_odds_file("odds_files/bond_OR_bases.smarts", False)
        self.bond_AND_decors = utils.parse_odds_file("odds_files/bond_AND_decorators.smarts", False)
        self.atom_odds = utils.parse_odds_file("odds_files/atom_index_odds.smarts", False)
        self.bond_odds = utils.parse_odds_file("odds_files/bond_index_odds.smarts", False)
        self.molecules = read_molecules("test_filt1_tripos.mol2", False)
        self.SMIRFF = "forcefield/Frosst_AlkEthOH.ffxml"
        self.outputFile = 'test_smirky'
        replacement_file = utils.get_data_filename("odds_files/substitutions.smarts")
        self.replacements = smarty.AtomTyper.read_typelist(replacement_file)
        self.replacements = [ [short, smarts] for [smarts, short] in self.replacements]

        self.correctDict = {'VdW': [ ["[#1:1]-[#6]", 'HC'], [ "[#1:1]-[#6]-[#7,#8,F,#16,Cl,Br]", 'H1'], [ "[#1:1]-[#6](-[#7,#8,F,#16,Cl,Br])-[#7,#8,F,#16,Cl,Br]", 'H2'], [ "[#1:1]-[#6](-[#7,#8,F,#16,Cl,Br])(-[#7,#8,F,#16,Cl,Br])-[#7,#8,F,#16,Cl,Br]", 'H3'], [ "[#1:1]-[#8]", 'HO'], [ "[#6X4:1]", 'CT'], [ "[#8X2:1]", 'OS'], [ "[#8X2+0:1]-[#1]", 'OH'] ],
                'Bond': [ ["[#6X4:1]-[#6X4:2]", 'CT-CT'], [ "[#6X4:1]-[#1:2]", 'CT-H'], [ "[#8:1]~[#1:2]", 'O~H'], [ "[#6X4:1]-[#8;X2;H1:2]", "CT-OH"], [ "[#6X4:1]-[#8;X2;H0:2]", "CT-OS"] ],
                'Angle': [ [ "[a,A:1]-[#6&X4:2]-[a,A:3]", 'any-CT-any'], [ "[#1:1]-[#6&X4:2]-[#1:3]", "H-CT-H"], [ "[#6&X4:1]-[#6&X4:2]-[#6&X4:3]", 'CT-CT-CT'], [ "[#8&X2:1]-[#6&X4:2]-[#8&X2:3]", 'O-CT-O'], [ "[#6&X4:1]-[#8&X2:2]-[#1:3]", 'CT-OH-HO'], [ "[#6X4:1]-[#8X2:2]-[#6X4:3]", 'CT-OS-CT'] ],
                'Torsion': [["[a,A:1]-[#6&X4:2]-[#6&X4:3]-[a,A:4]", 'any-CT-CT-any'], [ "[a,A:1]-[#6&X4:2]-[#8&X2:3]-[#1:4]", 'any-CT-OH-HO'], [ "[a,A:1]-[#6&X4:2]-[#8&X2:3]-[!#1:4]", 'any-CT-OS-!H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[#1:4]", 'H-CT-CT-H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[#6&X4:4]", 'H-CT-CT-CT'], [ "[#6&X4:1]-[#6&X4:2]-[#8&X2:3]-[#1:4]", 'CT-CT-OH-HO'], [ "[#6&X4:1]-[#6&X4:2]-[#6&X4:3]-[#6&X4:4]", 'CT-CT-CT-CT'], [ "[#6&X4:1]-[#6&X4:2]-[#8&X2:3]-[#6&X4:4]", 'CT-CT-OS-CT'], [ "[#6&X4:1]-[#8&X2:2]-[#6&X4:3]-[O&X2&H0:4]", 'CT-OS-CT-OS'], [ "[#8&X2:1]-[#6&X4:2]-[#6&X4:3]-[#8&X2:4]", 'O-CT-CT-O'], [ "[#8&X2:1]-[#6&X4:2]-[#6&X4:3]-[#1:4]", 'O-CT-CT-H'], [ "[#1:1]-[#6&X4:2]-[#6&X4:3]-[O&X2:4]", 'H-CT-CT-O'] ]}
예제 #27
0
    def test_atomtyper_AlkEthOH(self):
        # Test to make sure that AlkEthOH gets 100% at T=0 starting from correct
        # types
        basetypes_filename = get_data_filename('atomtypes/basetypes.smarts')
        initialtypes_filename = get_data_filename('atomtypes/initial_AlkEthOH.smarts')
        decorators_filename = get_data_filename('atomtypes/new-decorators.smarts')
        replacements_filename = get_data_filename('atomtypes/replacements.smarts')
        molecules = smarty.utils.read_molecules(get_data_filename('molecules/AlkEthOH_test_filt1_tripos.mol2'), verbose=False)
        reference_typed_molecules = smarty.utils.read_molecules(get_data_filename('molecules/AlkEthOH_test_filt1_ff.mol2'), verbose=False)

        # Construct atom type sampler.
        atomtype_sampler = smarty.AtomTypeSampler(molecules, basetypes_filename, initialtypes_filename, decorators_filename, replacements_filename=replacements_filename, reference_typed_molecules=reference_typed_molecules, verbose=False, temperature = 0)

        # Start sampling atom types.
        fracfound = atomtype_sampler.run(2)

        # Ensure fraction found is 1.0
        if fracfound < 1.0:
            raise Exception("Not finding 100% of AlkEthOH when starting from"
                            " correct SMARTS.")
예제 #28
0
#!/bin/env python

from openeye.oechem import *
from smarty.utils import get_data_filename
from smarty.forcefield import *

# Create an oemol
mol = OEMol()
OEParseSmiles(mol, 'CCC')
OEAddExplicitHydrogens(mol)


ff = ForceField( get_data_filename('forcefield/Frosst_AlkEtOH.ffxml') )

labels= ff.labelMolecules( [mol], verbose = True )
print labels
for mol_entry in range(len(labels)):
    for force in labels[mol_entry].keys():
        print("\n%s:" % force)
        for (atom_indices, pid, smirks) in labels[mol_entry][force]:
            atomstr=''
            for idx in atom_indices:
                atomstr += '%6s' % idx
            print("%s : %s \t smirks %s" % (atomstr, pid, smirks) )
예제 #29
0
def test_read_ffxml_gbsa():
    """Test reading of ffxml files with GBSA support.
    """
    forcefield = ForceField(
        get_data_filename('forcefield/Frosst_AlkEtOH_GBSA.ffxml'))
예제 #30
0
def test_read_ffxml():
    """Test reading of ffxml files.
    """
    forcefield = ForceField(
        get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
예제 #31
0
def test_label_molecules(verbose=False):
    """Test labeling/getting stats on labeling molecules"""
    molecules = smarty.utils.read_molecules(
        get_data_filename('molecules/AlkEtOH-tripos.mol2.gz'), verbose=verbose)
    ffxml = get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')
    get_molecule_parameterIDs(molecules, ffxml)
예제 #32
0
def test_label_molecules(verbose=False):
    """Test labeling/getting stats on labeling molecules"""
    molecules = smarty.utils.read_molecules(get_data_filename('molecules/AlkEtOH-tripos.mol2.gz'), verbose=verbose)
    ffxml = get_data_filename('forcefield/Frosst_AlkEtOH.ffxml')
    get_molecule_parameterIDs( molecules, ffxml)
예제 #33
0
def test_component_combination():
    """Test that a system still yields the same energy after building it again out of its components."""

    # We've had issues where subsequent instances of a molecule might have zero charges
    # Here we'll try to catch this (and also explicitly check the charges) by re-building
    # a system out of its components

    forcefield = ForceField(
        get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
    filename = get_data_filename(
        os.path.join('systems', 'packmol_boxes',
                     'cyclohexane_ethanol_0.4_0.6.pdb'))
    from simtk.openmm.app import PDBFile
    pdbfile = PDBFile(filename)
    mol2files = [
        get_data_filename(os.path.join('systems', 'monomers', 'ethanol.mol2')),
        get_data_filename(
            os.path.join('systems', 'monomers', 'cyclohexane.mol2'))
    ]

    flavor = oechem.OEIFlavor_Generic_Default | oechem.OEIFlavor_MOL2_Default | oechem.OEIFlavor_MOL2_Forcefield
    mols = []
    mol = oechem.OEMol()
    for mol2file in mol2files:
        ifs = oechem.oemolistream(mol2file)
        ifs.SetFlavor(oechem.OEFormat_MOL2, flavor)
        mol = oechem.OEGraphMol()
        while oechem.OEReadMolecule(ifs, mol):
            oechem.OETriposAtomNames(mol)
            mols.append(oechem.OEGraphMol(mol))

    # setup system
    system = forcefield.createSystem(pdbfile.topology,
                                     mols,
                                     chargeMethod='OECharges_AM1BCCSym')

    # Make parmed structure
    structure = parmed.openmm.topsystem.load_topology(pdbfile.topology, system,
                                                      pdbfile.positions)

    # Split the system, then re-compose it out of its components
    tmp = structure.split()
    strs, nums = [], []
    for s, n in tmp:
        strs.append(s)
        nums.append(n)
    nums = [len(n) for n in nums]

    # Re-compose system from components
    new_structure = strs[0] * nums[0]
    for idx in range(1, len(nums)):
        new_structure += strs[idx] * nums[idx]
    # Swap in coordinates again
    new_structure.positions = structure.positions

    # Create System
    newsys = new_structure.createSystem(nonbondedMethod=app.NoCutoff,
                                        constraints=None,
                                        implicitSolvent=None)

    # Cross check energies
    groups0, groups1, energy0, energy1 = compare_system_energies(
        pdbfile.topology,
        pdbfile.topology,
        system,
        newsys,
        pdbfile.positions,
        verbose=False)

    # Also check that that the number of components is equal to the number I expect
    if not len(nums) == 2:
        print("Error: Test system has incorrect number of components.")
        raise Exception(
            'Incorrect number of components in cyclohexane/ethanol test system.'
        )

    # Also check that none of residues have zero charge
    for resnr in range(len(structure.residues)):
        abscharges = [
            abs(structure.residues[resnr].atoms[idx].charge)
            for idx in range(len(structure.residues[resnr].atoms))
        ]
        if sum(abscharges) == 0:
            raise Exception(
                'Error: Residue %s in cyclohexane-ethanol test system has a charge of zero, which is incorrect.'
                % resnr)
예제 #34
0
def test_create_system_boxes_parmatfrosst(verbose=False):
    """Test creation of a System object from some boxes of mixed solvents to test parm@frosst forcefield.
    """
    forcefield = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
    for f in check_boxes(forcefield, description="to test Parm@frosst parameters", verbose=verbose):
        yield f
예제 #35
0
def test_create_system_molecules_parmatfrosst(verbose=False):
    """Test creation of a System object from small molecules to test parm@frosst forcefield.
    """
    forcefield = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
    for f in check_AlkEtOH(forcefield, "to test Parm@Frosst parameters", verbose=verbose):
        yield f
예제 #36
0
 def test_read_molecules(self):
     molecules = smarty.utils.read_molecules(get_data_filename('molecules/zinc-subset-tripos.mol2.gz'), verbose=False)
예제 #37
0
def test_read_ffxml():
    """Test reading of ffxml files.
    """
    forcefield = ForceField(get_data_filename('forcefield/Frosst_AlkEtOH.ffxml'))
예제 #38
0
 def test_read_typelist(self):
     atomtypes = AtomTyper.read_typelist(get_data_filename('atomtypes/basetypes.smarts'))
     decorators = AtomTyper.read_typelist(get_data_filename('atomtypes/decorators.smarts'))
     replacements = AtomTyper.read_typelist(get_data_filename('atomtypes/replacements.smarts'))
예제 #39
0
 def test_read_molecules(self):
     molecules = smarty.utils.read_molecules(
         get_data_filename('molecules/zinc-subset-tripos.mol2.gz'),
         verbose=False)