Пример #1
0
def test_adding_workflow_components(factory_type):
    """
    Test building workflows from a verity of workflow components.
    """

    factory = factory_type()

    # element filter
    efilter = workflow_components.ElementFilter()
    factory.add_workflow_component(efilter)

    assert len(factory.workflow) == 1

    # conformer generator
    conformer_gen = workflow_components.StandardConformerGenerator()
    conformer_gen.max_conformers = 200
    factory.add_workflow_component(conformer_gen)

    assert len(factory.workflow) == 2

    # add element filter again and make sure the component name has been incremented
    factory.add_workflow_component(efilter)
    assert len(factory.workflow) == 3
    assert efilter.component_name in factory.workflow

    # try to add a non component
    with pytest.raises(InvalidWorkflowComponentError):
        factory.add_workflow_component(3)

    with pytest.raises(ValidationError):
        factory.workflow = {"first component": 3}

    factory.workflow = {"test_conformer": conformer_gen}

    assert len(factory.workflow) == 1
def test_conformer_apply():
    """
    Test applying the standard conformer generator to a workflow.
    """

    conf_gen = workflow_components.StandardConformerGenerator()
    conf_gen.max_conformers = 1
    conf_gen.clear_existing = True

    mols = get_stereoisomers()
    # remove duplicates from the set
    molecule_container = get_container(mols)

    result = conf_gen.apply(molecule_container.molecules,
                            processors=1,
                            toolkit_registry=GLOBAL_TOOLKIT_REGISTRY)

    assert result.component_name == conf_gen.type
    assert result.component_description == conf_gen.dict()
    # make sure each molecule has a conformer that passed
    for molecule in result.molecules:
        assert molecule.n_conformers == 1, print(molecule.conformers)

    for molecule in result.filtered:
        assert molecule.n_conformers == 0
Пример #3
0
def test_create_dataset(factory_dataset_type):
    """
    Test making a the correct corresponding dataset type from a given factory type.
    """

    factory = factory_dataset_type[0]()
    element_filter = workflow_components.ElementFilter()
    element_filter.allowed_elements = [1, 6, 8, 7]
    factory.add_workflow_component(element_filter)
    conformer_generator = workflow_components.StandardConformerGenerator(max_conformers=1)
    factory.add_workflow_component(conformer_generator)

    mols = Molecule.from_file(get_data("tautomers_small.smi"), "smi", allow_undefined_stereo=True)

    # set some settings
    changed_attrs = {"compute_tag": "test tag",
                     "dataset_tags": ["openff", "test"],
                     "maxiter": 400}
    for attr, value in changed_attrs.items():
        setattr(factory, attr, value)

    dataset = factory.create_dataset(dataset_name="test name", molecules=mols, description="Force field test", tagline="A test dataset")

    # check the attributes were changed
    for attr, value in changed_attrs.items():
        assert getattr(dataset, attr) == value

    assert dataset.dataset_name == "test name"

    assert isinstance(dataset, factory_dataset_type[1]) is True

    # make sure molecules we filtered and passed
    assert dataset.dataset != {}
    assert dataset.filtered != {}
    assert element_filter.component_name in dataset.filtered_molecules
def test_create_torsiondrive_dataset():
    """
    Make sure we can correclt make a dataset using the scan enumerator.
    """
    factory = TorsiondriveDatasetFactory()
    scan_filter = workflow_components.ScanEnumerator()
    scan_filter.add_torsion_scan(smarts="[*:1]~[*:2]-[#8:3]-[#1:4]",
                                 scan_rage=(-90, 90),
                                 scan_increment=10)
    factory.add_workflow_components(scan_filter)
    conformer_generator = workflow_components.StandardConformerGenerator(
        max_conformers=1)
    factory.add_workflow_components(conformer_generator)
    mols = Molecule.from_file(get_data("tautomers_small.smi"),
                              "smi",
                              allow_undefined_stereo=True)
    dataset = factory.create_dataset(dataset_name="test name",
                                     molecules=mols,
                                     description="Force field test",
                                     tagline="A test dataset",
                                     processors=1)

    assert dataset.n_molecules > 0
    assert dataset.n_records > 0
    for entry in dataset.dataset.values():
        assert entry.keywords.dihedral_ranges == [(-90, 90)]
        assert entry.keywords.grid_spacing == [10]
Пример #5
0
def test_conformer_apply(toolkit):
    """
    Test applying the standard conformer generator to a workflow.
    """

    toolkit_name, toolkit_class = toolkit
    if toolkit_class.is_available():

        conf_gen = workflow_components.StandardConformerGenerator()
        conf_gen.toolkit = toolkit_name
        conf_gen.max_conformers = 1
        conf_gen.clear_existing = True

        mols = get_stereoisomers()
        # remove duplicates from the set
        molecule_container = get_container(mols)

        result = conf_gen.apply(molecule_container.molecules, processors=1)

        assert result.component_name == conf_gen.component_name
        assert result.component_description == conf_gen.dict()
        # make sure each molecule has a conformer that passed
        for molecule in result.molecules:
            assert molecule.n_conformers == 1, print(molecule.conformers)

        for molecule in result.filtered:
            assert molecule.n_conformers == 0

    else:
        pytest.skip(f"Toolkit {toolkit_name} not available.")
Пример #6
0
def test_standardconformer_generator_validators(toolkit):
    """
    Test the standard conformer generator which calls the OFFTK.
    """

    toolkit_name, toolkit_class = toolkit
    if toolkit_class.is_available():

        conf_gen = workflow_components.StandardConformerGenerator()

        # make sure we are casting to ints
        conf_gen.max_conformers = 1.02
        assert conf_gen.max_conformers == 1

        # test the toolkit validator
        with pytest.raises(ValueError):
            conf_gen.toolkit = "ambertools"
        conf_gen.toolkit = toolkit_name
        assert toolkit_name in conf_gen.provenance()

        conf_gen.clear_existing = "no"
        assert conf_gen.clear_existing is False

        assert "openff-toolkit" in conf_gen.provenance()

    else:
        pytest.skip(f"Toolkit {toolkit} not available.")
Пример #7
0
def test_get_component():
    """
    Make sure the correct component is returned when requested.
    """
    gen = get_component("standardconformergenerator")

    assert gen == workflow_components.StandardConformerGenerator()
Пример #8
0
def test_register_component_replace():
    """
    Test registering a component that is already registered with and without using replace.
    """
    # get the standard conformer generator
    gen = workflow_components.StandardConformerGenerator(max_conformers=1)

    with pytest.raises(ComponentRegisterError):
        register_component(component=gen, replace=False)

    # now register using replace with a new default
    register_component(component=gen, replace=True)

    gen2 = get_component(gen.component_name)
    assert gen2.max_conformers == gen.max_conformers

    # now return th list back to normal
    register_component(component=workflow_components.StandardConformerGenerator(), replace=True)
def test_standardconformer_generator_validators():
    """
    Test the standard conformer generator which calls the OFFTK.
    """

    conf_gen = workflow_components.StandardConformerGenerator()

    # make sure we are casting to ints
    conf_gen.max_conformers = 1.02
    assert conf_gen.max_conformers == 1

    conf_gen.clear_existing = "no"
    assert conf_gen.clear_existing is False

    assert "openff-toolkit" in conf_gen.provenance(GLOBAL_TOOLKIT_REGISTRY)
def test_factory_round_trip(file_type, tmpdir):
    """
    Test round tripping a factory to file with a workflow.
    """
    with tmpdir.as_cwd():
        factory = BasicDatasetFactory(driver="energy", maxiter=1)
        efilter = workflow_components.ElementFilter()
        weight = workflow_components.MolecularWeightFilter()
        conformer = workflow_components.StandardConformerGenerator()
        factory.add_workflow_components(efilter, weight, conformer)
        file_name = "test." + file_type
        factory.export(file_name)

        factory2 = BasicDatasetFactory.from_file(file_name)
        assert factory2.driver == factory.driver
        assert factory2.workflow == factory.workflow
Пример #11
0
def test_get_wrokflow_component(factory_type):
    """
    Test retrieving a workflow component.
    """

    factory = factory_type()

    efilter = workflow_components.ElementFilter()
    weight = workflow_components.MolecularWeightFilter()
    conformer = workflow_components.StandardConformerGenerator()

    components = [efilter, weight, conformer]

    factory.add_workflow_component(components)

    for component in components:
        assert factory.get_workflow_component(component.component_name) == component
Пример #12
0
def test_adding_multipule_workflow_components(factory_type):
    """
    Test adding a list of workflow components.
    """

    factory = factory_type()

    efilter = workflow_components.ElementFilter()
    weight = workflow_components.MolecularWeightFilter()
    conformer = workflow_components.StandardConformerGenerator()

    components = [efilter, weight, conformer]

    factory.add_workflow_component(components)

    assert len(factory.workflow) == 3
    for component in components:
        assert component.component_name in factory.workflow
Пример #13
0
def test_remove_workflow_componet(factory_type):
    """
    Test removing a workflow component through the API.
    """

    factory = factory_type()
    efilter = workflow_components.ElementFilter()
    weight = workflow_components.MolecularWeightFilter()
    conformer = workflow_components.StandardConformerGenerator()

    components = [efilter, weight, conformer]

    factory.add_workflow_component(components)

    assert len(factory.workflow) == 3

    for component in components:
        factory.remove_workflow_component(component.component_name)

    assert factory.workflow == {}
Пример #14
0
def test_export_workflow_only(file_type, factory_type):
    """
    Test exporting the workflow only from the factory.
    """

    with temp_directory():
        factory = factory_type()

        conformer_gen = workflow_components.StandardConformerGenerator()
        conformer_gen.max_conformers = 100

        factory.add_workflow_component(conformer_gen)

        file_name = "workflow." + file_type
        factory.export_workflow(file_name)

        with open(file_name) as workflow:
            data = workflow.read()
            assert "method" not in data
            assert "basis" not in data
            assert "tag" not in data
Пример #15
0
def test_exporting_settings_workflow(file_type, factory_type):
    """
    Test exporting the settings and a workflow to the different file types.
    """

    with temp_directory():

        factory = factory_type()
        changed_attrs = {"maxiter": 400, "priority":  "super_high", "compute_tag": "test tag"}
        for attr, value in changed_attrs.items():
            setattr(factory, attr, value)

        conformer_gen = workflow_components.StandardConformerGenerator()
        conformer_gen.max_conformers = 100
        factory.add_workflow_component(conformer_gen)

        file_name = "test." + file_type

        factory.export_settings(file_name=file_name)

        with open(file_name) as f:
            data = f.read()
            assert conformer_gen.component_name in data
            assert str(conformer_gen.max_conformers) in data
Пример #16
0
def test_clear_workflow(factory_type):
    """
    Test clearing out the workflow.
    """

    factory = factory_type()

    efilter = workflow_components.ElementFilter()
    weight = workflow_components.MolecularWeightFilter()
    conformer = workflow_components.StandardConformerGenerator()

    components = [efilter, weight, conformer]

    factory.add_workflow_component(components)

    factory.clear_workflow()

    assert factory.workflow == {}

    factory.add_workflow_component(components)

    factory.workflow = {}

    assert factory.workflow == {}