Anatomy of a Forcefield Plug-in#

Namespace#

Forcefields advertise themselves to SEAMM in the same way that other plug-ins do; however, the namespace is different – org.molssi.seamm.forcefields – as in this example:

entry_points={
    'org.molssi.seamm.forcefields': [
        'GAFF = seamm_antechamber:GAFFPlugin',
    ],
}

The namespace, or entry group in the parlance of the Python importlib are listed one or more forcefields, GAFF in this example, and a class to load to access the forcefield, which by convention is the name of the forcefield followed by Plugin.

Plug-in API#

This class is lightweight. It contains a description method to return metadata about the forcefield, and a factory method to create the object that handles the forcefield:

def description(self):
    """Return a description of the forcefield
    """
    return {
        name: "GAFF",
        versions: ["1.0"],
        description: (
            "GAFF is compatible with the AMBER force field and it has parameters "
            "for almost all the organic molecules made of C, N, O, H, S, P, F, Cl, "
            "Br and I. As a complete force field, GAFF is suitable for study of a "
            "great number of molecules (such as database searching) in an "
            "automatic fashion."
        ),
        elements: ["H", "C", "N", "P", "S", "F", "Cl", "Br", "I"],
        class: ["valence", "all-atom"]
    }

Todo

We need to flesh out the metadata. For instance, should it include the terms in the functional form?

The factory method is equally simple:

def create_atomtyper(self):
    """Create and return the new GAFF forcefield object.

    Parameters
    ----------
    None

    Returns
    -------
    GAFF object

    See Also
    --------
    Antechamber

    """
    return seamm_ff_gaff.GAFF()

The SEAMM cookiecutter will create skeletons of this file and the other files needed to implement a forcefield in SEAMM, so most of this work will be done for you. Of course you need to give the description of the forcefield.