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)
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)
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)
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)
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"}, }, } }