Ejemplo n.º 1
0
def plot_scaling_models(scaling_model_dict):
    d = OrderedDict()
    if scaling_model_dict["__id__"] == "physical":
        model = PhysicalScalingModel.from_dict(scaling_model_dict)
        d.update(_plot_smooth_scales(model))
        if "absorption" in model.components:
            d.update(plot_absorption_parameters(model))
            d.update(plot_absorption_surface(model))
    return d
Ejemplo n.º 2
0
def test_plot_scaling_models():

    physical_dict = {
        "__id__": "physical",
        "is_scaled": True,
        "scale": {
            "n_parameters": 2,
            "parameters": [0.5, 1.0],
            "est_standard_devs": [0.05, 0.1],
        },
        "configuration_parameters": {
            "corrections": ["scale", "decay", "absorption"],
            "s_norm_fac": 0.1,
            "d_norm_fac": 0.1,
            "scale_rot_interval": 10.0,
            "decay_rot_interval": 10.0,
            "decay_restaint": 1e-1,
            "valid_osc_range": [0.0, 2.0],
        },
        "decay": {
            "n_parameters": 2,
            "parameters": [0.5, 1.0],
            "est_standard_devs": [0.05, 0.1],
        },
        "absorption": {
            "n_parameters": 4,
            "parameters": [0.1, -0.1, 0.05, -0.05],
            "est_standard_devs": [0.005, 0.005, 0.005, 0.005],
        },
    }
    d = plot_scaling_models(PhysicalScalingModel.from_dict(physical_dict))
    assert "smooth_scale_model" in d
    assert "absorption_surface" in d
    assert "absorption_parameters" in d
    assert d["smooth_scale_model"]["data"][0] != []
    assert d["absorption_parameters"]["data"][0] != []
Ejemplo n.º 3
0
def test_PhysicalScalingModel(test_reflections, mock_exp):
    """Test the PhysicalScalingModel class."""
    configdict = {
        "corrections": ["scale", "decay", "absorption"],
        "s_norm_fac": 1.0,
        "scale_rot_interval": 2.0,
        "d_norm_fac": 1.0,
        "decay_rot_interval": 2.0,
        "lmax": 1,
        "abs_surface_weight": 1e6,
    }

    parameters_dict = {
        "scale": {
            "parameters": flex.double([1.2, 1.1]),
            "parameter_esds": None
        },
        "decay": {
            "parameters": flex.double([0.1, 0.2]),
            "parameter_esds": None
        },
        "absorption": {
            "parameters": flex.double([0.01, 0.01, 0.01]),
            "parameter_esds": None,
        },
    }

    # Test standard factory initialisation
    physicalmodel = PhysicalScalingModel(parameters_dict, configdict)
    assert physicalmodel.id_ == "physical"
    assert "Absorption component" in str(physicalmodel)
    comps = physicalmodel.components
    assert "scale" in comps
    assert "absorption" in comps
    assert "decay" in comps
    assert list(comps["scale"].parameters) == [1.2, 1.1]
    assert list(comps["decay"].parameters) == [0.1, 0.2]
    assert list(comps["absorption"].parameters) == [0.01, 0.01, 0.01]

    # Test configure reflection table
    mock_params = Mock()
    mock_params.physical.decay_restraint = 0.0
    physicalmodel.configure_components(test_reflections, mock_exp, mock_params)

    # Test from_dict initialisation method.
    physical_dict = {
        "__id__": "physical",
        "is_scaled": True,
        "scale": {
            "n_parameters": 2,
            "parameters": [0.5, 1.0],
            "est_standard_devs": [0.05, 0.1],
            "null_parameter_value": 1,
        },
        "configuration_parameters": {
            "corrections": ["scale"],
            "s_norm_fac": 0.1,
            "scale_rot_interval": 10.0,
            "decay_restaint": 1e-1,
        },
    }
    physicalmodel = PhysicalScalingModel.from_dict(physical_dict)
    assert physicalmodel.id_ == "physical"
    assert "scale" in physicalmodel.components
    assert "absorption" not in physicalmodel.components
    assert "decay" not in physicalmodel.components
    assert list(physicalmodel.components["scale"].parameters) == [0.5, 1.0]
    assert list(
        physicalmodel.components["scale"].parameter_esds) == [0.05, 0.1]

    new_dict = physicalmodel.to_dict()
    assert new_dict == physical_dict

    # Test from_dict initialisation method for all components.
    physical_dict = {
        "__id__": "physical",
        "is_scaled": True,
        "scale": {
            "n_parameters": 2,
            "parameters": [0.5, 1.0],
            "est_standard_devs": [0.05, 0.1],
            "null_parameter_value": 1,
        },
        "decay": {
            "n_parameters": 2,
            "parameters": [0.1, 0.2],
            "est_standard_devs": [0.01, 0.01],
            "null_parameter_value": 0,
        },
        "absorption": {
            "n_parameters": 3,
            "parameters": [0.0, 0.1, 0.2],
            "est_standard_devs": [0.01, 0.02, 0.03],
            "null_parameter_value": 0,
        },
        "configuration_parameters": {
            "corrections": ["scale", "decay", "absorption"],
            "s_norm_fac": 0.1,
            "scale_rot_interval": 10.0,
            "d_norm_fac": 0.2,
            "decay_rot_interval": 20.0,
            "lmax": 1,
            "abs_surface_weight": 1e6,
        },
    }
    physicalmodel = PhysicalScalingModel.from_dict(physical_dict)
    assert physicalmodel.id_ == "physical"
    assert "scale" in physicalmodel.components
    assert "absorption" in physicalmodel.components
    assert "decay" in physicalmodel.components
    assert list(physicalmodel.components["scale"].parameters) == [0.5, 1.0]
    assert list(
        physicalmodel.components["scale"].parameter_esds) == [0.05, 0.1]
    assert list(physicalmodel.components["decay"].parameters) == [0.1, 0.2]
    assert list(
        physicalmodel.components["decay"].parameter_esds) == [0.01, 0.01]
    assert list(
        physicalmodel.components["absorption"].parameters) == [0.0, 0.1, 0.2]
    assert list(physicalmodel.components["absorption"].parameter_esds) == [
        0.01,
        0.02,
        0.03,
    ]

    new_dict = physicalmodel.to_dict()
    assert new_dict == physical_dict

    with pytest.raises(RuntimeError):
        physical_dict["__id__"] = "array"
        physicalmodel = PhysicalScalingModel.from_dict(physical_dict)

    assert len(physicalmodel.consecutive_refinement_order) == 2
    assert "Absorption component:" in str(physicalmodel)

    # test limit batch range
    parameters_dict = {
        "scale": {
            "n_parameters": 11,
            "parameters":
            [0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5],
            "parameter_esds": None,
        },
        "decay": {
            "n_parameters": 11,
            "parameters":
            [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1],
            "parameter_esds": None,
        },
    }
    configdict = {
        "corrections": ["scale", "decay"],
        "s_norm_fac": 0.1,
        "scale_rot_interval": 10.0,
        "d_norm_fac": 0.1,
        "decay_rot_interval": 10.0,
        "valid_image_range": (1, 90),
        "valid_osc_range": (0, 90),
    }
    physical = PhysicalScalingModel(parameters_dict, configdict)
    physical.limit_image_range((1, 50))
    assert list(physical.components["scale"].parameters) == [
        0.5,
        1.0,
        1.5,
        2.0,
        2.5,
        3.0,
        3.5,
    ]
    assert list(physical.components["decay"].parameters) == [
        0.1,
        0.2,
        0.3,
        0.4,
        0.5,
        0.6,
        0.7,
    ]
    assert physical.configdict["valid_osc_range"] == (0, 50)
    assert physical.configdict["valid_image_range"] == (1, 50)

    # try edge cases
    # if restricted by > rot int, then reduce number of params and shift offset
    # if necessary
    physical = PhysicalScalingModel(copy.deepcopy(parameters_dict),
                                    copy.deepcopy(configdict))
    physical.limit_image_range((7, 45))
    assert list(physical.components["scale"].parameters) == [
        1.0,
        1.5,
        2.0,
        2.5,
        3.0,
        3.5,
    ]
    assert list(physical.components["decay"].parameters) == [
        0.2,
        0.3,
        0.4,
        0.5,
        0.6,
        0.7,
    ]
    assert physical.configdict["valid_osc_range"] == (6, 45)
    assert physical.configdict["valid_image_range"] == (7, 45)

    # if not restricted by > rot int, then should 'squeeze' the parameters closer
    # in rotation angle, leaving the same number of params (as reducing number of
    # params would give parameter spacing greater than initially specified rot int)
    physical = PhysicalScalingModel(copy.deepcopy(parameters_dict),
                                    copy.deepcopy(configdict))
    physical.limit_image_range((5, 45))
    assert list(physical.components["scale"].parameters) == [
        0.5,
        1.0,
        1.5,
        2.0,
        2.5,
        3.0,
        3.5,
    ]
    assert list(physical.components["decay"].parameters) == [
        0.1,
        0.2,
        0.3,
        0.4,
        0.5,
        0.6,
        0.7,
    ]
    assert physical.configdict["valid_osc_range"] == (4, 45)
    assert physical.configdict["valid_image_range"] == (5, 45)
Ejemplo n.º 4
0
    def from_dict(d):
        """creates a scaling model from a dict"""
        from dials.algorithms.scaling.model.model import PhysicalScalingModel

        return PhysicalScalingModel.from_dict(d)