Example #1
0
def test_scattering_info():
    miller_array = random_data(35.0, d_min=2.5)
    d_star_sq = miller_array.d_spacings().data()
    d_star_sq = 1.0 / (d_star_sq * d_star_sq)

    asu = {
        "H": 8.0 * 585.0,
        "C": 5.0 * 585.0,
        "N": 1.5 * 585.0,
        "O": 1.2 * 585.0
    }
    scat_info = absolute_scaling.scattering_information(asu_contents=asu,
                                                        fraction_protein=1.0,
                                                        fraction_nucleic=0.0)
    scat_info.scat_data(d_star_sq)

    scat_info2 = absolute_scaling.scattering_information(n_residues=585.0)
    scat_info2.scat_data(d_star_sq)

    sigma_prot = scaling.get_sigma_prot_sq(d_star_sq, 195.0 * 3.0)
    # Testing for consistency
    for ii in range(d_star_sq.size()):
        assert approx_equal(scat_info.sigma_tot_sq[ii],
                            scat_info2.sigma_tot_sq[ii],
                            eps=1e-03)
        assert approx_equal(scat_info.sigma_tot_sq[ii],
                            sigma_prot[ii],
                            eps=0.5)
Example #2
0
def test_scattering_info():
  miller_array = random_data(35.0, d_min=2.5 )
  d_star_sq = miller_array.d_spacings().data()
  d_star_sq = 1.0/(d_star_sq*d_star_sq)

  asu = {"H":8.0*585.0,"C":5.0*585.0,"N":1.5*585.0, "O":1.2*585.0}
  scat_info = absolute_scaling.scattering_information(
    asu_contents = asu,
    fraction_protein=1.0,
    fraction_nucleic=0.0)
  scat_info.scat_data(d_star_sq)

  scat_info2 = absolute_scaling.scattering_information(
    n_residues=585.0)
  scat_info2.scat_data(d_star_sq)

  sigma_prot = scaling.get_sigma_prot_sq(d_star_sq,195.0*3.0)
  # Testing for consistency
  for ii in range(d_star_sq.size()):
    assert approx_equal(scat_info.sigma_tot_sq[ii],
                        scat_info2.sigma_tot_sq[ii],
                        eps=1e-03)
    assert approx_equal(scat_info.sigma_tot_sq[ii],
                        sigma_prot[ii],
                        eps=0.5)
Example #3
0
def random_data(B_add=35,
                n_residues=585.0,
                d_min=3.5):
  unit_cell = uctbx.unit_cell( (81.0,  81.0,  61.0,  90.0,  90.0, 120.0) )
  xtal = crystal.symmetry(unit_cell, " P 3 ")
  ## In P3 I do not have to worry about centrics or reflections with different
  ## epsilons.
  miller_set = miller.build_set(
    crystal_symmetry = xtal,
    anomalous_flag = False,
    d_min = d_min)
  ## Now make an array with d_star_sq values
  d_star_sq = miller_set.d_spacings().data()
  d_star_sq = 1.0/(d_star_sq*d_star_sq)
  asu = {"H":8.0*n_residues*1.0,
         "C":5.0*n_residues*1.0,
         "N":1.5*n_residues*1.0,
         "O":1.2*n_residues*1.0}
  scat_info = absolute_scaling.scattering_information(
    asu_contents = asu,
    fraction_protein=1.0,
    fraction_nucleic=0.0)
  scat_info.scat_data(d_star_sq)
  gamma_prot = scat_info.gamma_tot
  sigma_prot = scat_info.sigma_tot_sq
  ## The number of residues is multriplied by the Z of the spacegroup
  protein_total = sigma_prot * (1.0+gamma_prot)
  ## add a B-value of 35 please
  protein_total = protein_total*flex.exp(-B_add*d_star_sq/2.0)
  ## Now that has been done,
  ## We can make random structure factors
  normalised_random_intensities = \
     random_transform.wilson_intensity_variate(protein_total.size())
  random_intensities = normalised_random_intensities*protein_total*math.exp(6)
  std_dev = random_intensities*5.0/100.0
  noise = random_transform.normal_variate(N=protein_total.size())
  noise = noise*std_dev
  random_intensities=noise+random_intensities
  ## STuff the arrays in the miller array
  miller_array = miller.array(miller_set,
                              data=random_intensities,
                              sigmas=std_dev)
  miller_array=miller_array.set_observation_type(
    xray.observation_types.intensity())
  miller_array = miller_array.f_sq_as_f()
  return (miller_array)
Example #4
0
def random_data(B_add=35, n_residues=585.0, d_min=3.5):
    unit_cell = uctbx.unit_cell((81.0, 81.0, 61.0, 90.0, 90.0, 120.0))
    xtal = crystal.symmetry(unit_cell, " P 3 ")
    ## In P3 I do not have to worry about centrics or reflections with different
    ## epsilons.
    miller_set = miller.build_set(crystal_symmetry=xtal,
                                  anomalous_flag=False,
                                  d_min=d_min)
    ## Now make an array with d_star_sq values
    d_star_sq = miller_set.d_spacings().data()
    d_star_sq = 1.0 / (d_star_sq * d_star_sq)
    asu = {
        "H": 8.0 * n_residues * 1.0,
        "C": 5.0 * n_residues * 1.0,
        "N": 1.5 * n_residues * 1.0,
        "O": 1.2 * n_residues * 1.0
    }
    scat_info = absolute_scaling.scattering_information(asu_contents=asu,
                                                        fraction_protein=1.0,
                                                        fraction_nucleic=0.0)
    scat_info.scat_data(d_star_sq)
    gamma_prot = scat_info.gamma_tot
    sigma_prot = scat_info.sigma_tot_sq
    ## The number of residues is multriplied by the Z of the spacegroup
    protein_total = sigma_prot * (1.0 + gamma_prot)
    ## add a B-value of 35 please
    protein_total = protein_total * flex.exp(-B_add * d_star_sq / 2.0)
    ## Now that has been done,
    ## We can make random structure factors
    normalised_random_intensities = \
       random_transform.wilson_intensity_variate(protein_total.size())
    random_intensities = normalised_random_intensities * protein_total * math.exp(
        6)
    std_dev = random_intensities * 5.0 / 100.0
    noise = random_transform.normal_variate(N=protein_total.size())
    noise = noise * std_dev
    random_intensities = noise + random_intensities
    ## STuff the arrays in the miller array
    miller_array = miller.array(miller_set,
                                data=random_intensities,
                                sigmas=std_dev)
    miller_array = miller_array.set_observation_type(
        xray.observation_types.intensity())
    miller_array = miller_array.f_sq_as_f()
    return (miller_array)
Example #5
0
    def wilson_plot(self):
        if not self._xanalysis or not self._xanalysis.wilson_scaling:
            return {}

        dstarsq = self.wilson_plot_result.binner.bin_centers(2)
        observed = self.wilson_plot_result.data[1:-1]
        # The binning of the wilson plot can result in some bins with 'None' values
        if None in observed:
            observed = [i for i in observed if i is not None]
            dstarsq = flex.double(
                [i for i, j in zip(dstarsq, observed) if j is not None]
            )
        if not observed:
            return {}
        expected = expected_intensity(
            scattering_information(n_residues=self.n_residues),
            dstarsq,
            b_wilson=self._xanalysis.iso_b_wilson,
            p_scale=self._xanalysis.wilson_scaling.iso_p_scale,
        )

        x1 = observed
        x2 = expected.mean_intensity
        # ignore the start and end of the plot, which may be unreliable
        if len(x1) > 10:
            x1 = x1[1:-3]
            x2 = x2[1:-3]

        def residuals(k):
            """Calculate the residual for an overall scale factor"""
            return x1 - k * x2

        best = least_squares(residuals, 1.0)

        mean_I_obs_theory = expected.mean_intensity * best.x
        tickvals_wilson, ticktext_wilson = d_star_sq_to_d_ticks(dstarsq, nticks=5)

        return {
            "wilson_intensity_plot": {
                "data": (
                    [
                        {
                            "x": list(dstarsq),
                            "y": list(observed),
                            "type": "scatter",
                            "name": "Observed",
                        },
                        {
                            "x": list(dstarsq),
                            "y": list(mean_I_obs_theory),
                            "type": "scatter",
                            "name": "Expected",
                        },
                    ]
                ),
                "layout": {
                    "title": "Wilson intensity plot",
                    "xaxis": {
                        "title": "Resolution (Å)",
                        "tickvals": tickvals_wilson,
                        "ticktext": ticktext_wilson,
                    },
                    "yaxis": {"type": "log", "title": "Mean(I)", "rangemode": "tozero"},
                },
            }
        }