def apply_gaussian_noise(image,params): from scitbx.random import variate,normal_distribution import numpy G = variate(normal_distribution(mean=2.0,sigma=0.5)) gaussian_noise = flex.double(G(image.linearintdata.size())) #image.linearintdata += flex.int(gaussian_noise.as_numpy_array().astype(numpy.int32)) image.linearintdata += gaussian_noise
def apply_gaussian_noise(image, params): from scitbx.random import variate, normal_distribution import numpy G = variate(normal_distribution(mean=2.0, sigma=0.5)) gaussian_noise = flex.double(G(image.linearintdata.size())) #image.linearintdata += flex.int(gaussian_noise.as_numpy_array().astype(numpy.int32)) image.linearintdata += gaussian_noise
def random_positions(n, amount): from scitbx.random import variate, normal_distribution from dials.array_family import flex g = variate(normal_distribution(mean=0, sigma=amount)) xy = flex.vec2_double(n) for j in range(n): xy[j] = (next(g), next(g)) return xy
def randomize(values, amount): from scitbx.random import variate, normal_distribution from dials.array_family import flex g = variate(normal_distribution(mean=0, sigma=amount)) shift = flex.double(values.size()) for j in range(values.size()): shift[j] = next(g) return values + shift
def exercise_variate_generators(): from scitbx.random \ import variate, normal_distribution, bernoulli_distribution, \ gamma_distribution, poisson_distribution for i in range(10): scitbx.random.set_random_seed(0) g = variate(normal_distribution()) assert approx_equal(g(), -0.917787219374) assert approx_equal( g(10), (1.21838707856, 1.732426915, 0.838038157555, -0.296895169923, 0.246451144946, -0.635474652255, -0.0980626986425, 0.36458295417, 0.534073780268, -0.665073136294)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 0, eps=0.005) assert approx_equal(stat.biased_variance, 1, eps=0.005) assert approx_equal(stat.skew, 0, eps=0.005) assert approx_equal(stat.kurtosis, 3, eps=0.005) bernoulli_seq = variate(bernoulli_distribution(0.1)) for b in itertools.islice(bernoulli_seq, 10): assert b in (True, False) bernoulli_sample = flex.bool(itertools.islice(bernoulli_seq, 10000)) assert approx_equal(bernoulli_sample.count(True) / len(bernoulli_sample), 0.1, eps=0.01) # Boost 1.64 changes the exponential distribution to use Ziggurat algorithm scitbx.random.set_random_seed(0) g = variate(gamma_distribution()) if (boost_version < 106400): assert approx_equal(g(), 0.79587450456577546) assert approx_equal(g(2), (0.89856038848394115, 1.2559307580473893)) else: assert approx_equal(g(), 0.864758191783) assert approx_equal(g(2), (1.36660841837, 2.26740986094)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 1, eps=0.005) assert approx_equal(stat.skew, 2, eps=0.01) assert approx_equal(stat.biased_variance, 1, eps=0.005) scitbx.random.set_random_seed(0) g = variate(gamma_distribution(alpha=2, beta=3)) assert approx_equal(g(), 16.670850592722729) assert approx_equal(g(2), (10.03662877519449, 3.9357158398972873)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 6, eps=0.005) assert approx_equal(stat.skew, 2 / math.sqrt(2), eps=0.05) assert approx_equal(stat.biased_variance, 18, eps=0.05) mean = 10.0 pv = variate(poisson_distribution(mean)) draws = pv(1000000).as_double() m = flex.mean(draws) v = flex.mean(draws * draws) - m * m assert approx_equal(m, mean, eps=0.05) assert approx_equal(v, mean, eps=0.05)
def prepare_simulation_with_noise(sim, transmittance, apply_noise, ordered_intensities=None, half_data_flag=0): result = intensity_data() result.frame = sim["frame_lookup"] result.miller = sim['miller_lookup'] raw_obs_no_noise = transmittance * sim['observed_intensity'] if apply_noise: import scitbx.random from scitbx.random import variate, normal_distribution # bernoulli_distribution, gamma_distribution, poisson_distribution scitbx.random.set_random_seed(321) g = variate(normal_distribution()) noise = flex.sqrt(raw_obs_no_noise) * g(len(raw_obs_no_noise)) # adds in Gauss noise to signal else: noise = flex.double(len(raw_obs_no_noise), 0.) raw_obs = raw_obs_no_noise + noise if half_data_flag in [ 1, 2 ]: # apply selection after random numbers have been applied half_data_selection = (sim["frame_lookup"] % 2) == (half_data_flag % 2) result.frame = sim["frame_lookup"].select(half_data_selection) result.miller = sim['miller_lookup'].select(half_data_selection) raw_obs = raw_obs.select(half_data_selection) mean_signal = flex.mean(raw_obs) sigma_obs = flex.sqrt(flex.abs(raw_obs)) mean_sigma = flex.mean(sigma_obs) print("<I> / <sigma>", (mean_signal / mean_sigma)) scale_factor = mean_signal / 10. print("Mean signal is", mean_signal, "Applying a constant scale factor of ", scale_factor) #most important line; puts input data on a numerically reasonable scale result.raw_obs = raw_obs / scale_factor scaled_sigma = sigma_obs / scale_factor result.exp_var = scaled_sigma * scaled_sigma #ordered intensities gets us the unit cell & miller indices to # gain a static array of (sin theta over lambda)**2 if ordered_intensities is not None: uc = ordered_intensities.unit_cell() stol_sq = flex.double() for i in range(len(result.miller)): this_hkl = ordered_intensities.indices()[result.miller[i]] stol_sq_item = uc.stol_sq(this_hkl) stol_sq.append(stol_sq_item) result.stol_sq = stol_sq return result
def __init__(self, space_group_info, **kwds): libtbx.adopt_optional_init_args(self, kwds) self.space_group_info = space_group_info self.structure = random_structure.xray_structure( space_group_info, elements=self.elements, volume_per_atom=20., min_distance=1.5, general_positions_only=True, use_u_aniso=False, u_iso=adptbx.b_as_u(10), ) self.structure.set_inelastic_form_factors(1.54, "sasaki") self.scale_factor = 0.05 + 10 * flex.random_double() fc = self.structure.structure_factors(anomalous_flag=True, d_min=self.d_min, algorithm="direct").f_calc() fo = fc.as_amplitude_array() fo.set_observation_type_xray_amplitude() if self.use_students_t_errors: nu = random.uniform(1, 10) normal_g = variate(normal_distribution()) gamma_g = variate(gamma_distribution(0.5 * nu, 2)) errors = normal_g(fc.size()) / flex.sqrt(2 * gamma_g(fc.size())) else: # use gaussian errors g = variate(normal_distribution()) errors = g(fc.size()) fo2 = fo.as_intensity_array() self.fo2 = fo2.customized_copy( data=(fo2.data() + errors) * self.scale_factor, sigmas=flex.double(fc.size(), 1), ) self.fc = fc xs_i = self.structure.inverse_hand() self.fc_i = xs_i.structure_factors(anomalous_flag=True, d_min=self.d_min, algorithm="direct").f_calc() fo2_twin = self.fc.customized_copy( data=self.fc.data() + self.fc_i.data()).as_intensity_array() self.fo2_twin = fo2_twin.customized_copy( data=(errors + fo2_twin.data()) * self.scale_factor, sigmas=self.fo2.sigmas())
def exercise_variate_generators(): from scitbx.random \ import variate, normal_distribution, bernoulli_distribution, \ gamma_distribution, poisson_distribution for i in xrange(10): scitbx.random.set_random_seed(0) g = variate(normal_distribution()) assert approx_equal(g(), -1.2780081289048213) assert approx_equal(g(10), (-0.40474189234755492, -0.41845505596083288, -1.8825790263067721, -1.5779112018107659, -1.1888174422378859, -1.8619619179878537, -0.53946818661388318, -1.2400941724410812, 0.64511959841907285, -0.59934120033270688)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 0, eps=0.005) assert approx_equal(stat.biased_variance, 1, eps=0.005) assert approx_equal(stat.skew, 0, eps=0.005) assert approx_equal(stat.kurtosis, 3, eps=0.005) bernoulli_seq = variate(bernoulli_distribution(0.1)) for b in itertools.islice(bernoulli_seq, 10): assert b in (True, False) bernoulli_sample = flex.bool(itertools.islice(bernoulli_seq, 10000)) assert approx_equal( bernoulli_sample.count(True)/len(bernoulli_sample), 0.1, eps = 0.01) scitbx.random.set_random_seed(0) g = variate(gamma_distribution()) assert approx_equal(g(), 0.79587450456577546) assert approx_equal(g(2), (0.89856038848394115, 1.2559307580473893)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 1, eps=0.005) assert approx_equal(stat.skew, 2, eps=0.005) assert approx_equal(stat.biased_variance, 1, eps=0.005) scitbx.random.set_random_seed(0) g = variate(gamma_distribution(alpha=2, beta=3)) assert approx_equal(g(), 16.670850592722729) assert approx_equal(g(2), (10.03662877519449, 3.9357158398972873)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 6, eps=0.005) assert approx_equal(stat.skew, 2/math.sqrt(2), eps=0.05) assert approx_equal(stat.biased_variance, 18, eps=0.05) mean = 10.0 pv = variate(poisson_distribution(mean)) draws = pv(1000000).as_double() m = flex.mean(draws) v = flex.mean(draws*draws) - m*m assert approx_equal(m,mean,eps=0.05) assert approx_equal(v,mean,eps=0.05)
def __init__(self, space_group_info, **kwds): libtbx.adopt_optional_init_args(self, kwds) self.space_group_info = space_group_info self.structure = random_structure.xray_structure( space_group_info, elements=self.elements, volume_per_atom=20., min_distance=1.5, general_positions_only=True, use_u_aniso=False, u_iso=adptbx.b_as_u(10), ) self.structure.set_inelastic_form_factors(1.54, "sasaki") self.scale_factor = 0.05 + 10 * flex.random_double() fc = self.structure.structure_factors( anomalous_flag=True, d_min=self.d_min, algorithm="direct").f_calc() fo = fc.as_amplitude_array() fo.set_observation_type_xray_amplitude() if self.use_students_t_errors: nu = random.uniform(1, 10) normal_g = variate(normal_distribution()) gamma_g = variate(gamma_distribution(0.5*nu, 2)) errors = normal_g(fc.size())/flex.sqrt(2*gamma_g(fc.size())) else: # use gaussian errors g = variate(normal_distribution()) errors = g(fc.size()) fo2 = fo.as_intensity_array() self.fo2 = fo2.customized_copy( data=(fo2.data()+errors)*self.scale_factor, sigmas=flex.double(fc.size(), 1), ) self.fc = fc xs_i = self.structure.inverse_hand() self.fc_i = xs_i.structure_factors( anomalous_flag=True, d_min=self.d_min, algorithm="direct").f_calc() fo2_twin = self.fc.customized_copy( data=self.fc.data()+self.fc_i.data()).as_intensity_array() self.fo2_twin = fo2_twin.customized_copy( data=(errors + fo2_twin.data()) * self.scale_factor, sigmas=self.fo2.sigmas())
def prepare_simulation_with_noise(sim, transmittance, apply_noise, ordered_intensities=None, half_data_flag = 0): result = intensity_data() result.frame = sim["frame_lookup"] result.miller= sim['miller_lookup'] raw_obs_no_noise = transmittance * sim['observed_intensity'] if apply_noise: import scitbx.random from scitbx.random import variate, normal_distribution # bernoulli_distribution, gamma_distribution, poisson_distribution scitbx.random.set_random_seed(321) g = variate(normal_distribution()) noise = flex.sqrt(raw_obs_no_noise) * g(len(raw_obs_no_noise)) # adds in Gauss noise to signal else: noise = flex.double(len(raw_obs_no_noise),0.) raw_obs = raw_obs_no_noise + noise if half_data_flag in [1,2]: # apply selection after random numbers have been applied half_data_selection = (sim["frame_lookup"]%2)==(half_data_flag%2) result.frame = sim["frame_lookup"].select(half_data_selection) result.miller = sim['miller_lookup'].select(half_data_selection) raw_obs = raw_obs.select(half_data_selection) mean_signal = flex.mean(raw_obs) sigma_obs = flex.sqrt(flex.abs(raw_obs)) mean_sigma = flex.mean(sigma_obs) print "<I> / <sigma>", (mean_signal/ mean_sigma) scale_factor = mean_signal/10. print "Mean signal is",mean_signal,"Applying a constant scale factor of ",scale_factor #most important line; puts input data on a numerically reasonable scale result.raw_obs = raw_obs / scale_factor scaled_sigma = sigma_obs / scale_factor result.exp_var = scaled_sigma * scaled_sigma #ordered intensities gets us the unit cell & miller indices to # gain a static array of (sin theta over lambda)**2 if ordered_intensities is not None: uc = ordered_intensities.unit_cell() stol_sq = flex.double() for i in xrange(len(result.miller)): this_hkl = ordered_intensities.indices()[result.miller[i]] stol_sq_item = uc.stol_sq(this_hkl) stol_sq.append(stol_sq_item) result.stol_sq = stol_sq return result
def exercise_variate_generators(): from scitbx.random \ import variate, normal_distribution, bernoulli_distribution, \ gamma_distribution, poisson_distribution for i in xrange(10): scitbx.random.set_random_seed(0) g = variate(normal_distribution()) assert approx_equal(g(), -1.2780081289048213) assert approx_equal( g(10), (-0.40474189234755492, -0.41845505596083288, -1.8825790263067721, -1.5779112018107659, -1.1888174422378859, -1.8619619179878537, -0.53946818661388318, -1.2400941724410812, 0.64511959841907285, -0.59934120033270688)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 0, eps=0.005) assert approx_equal(stat.biased_variance, 1, eps=0.005) assert approx_equal(stat.skew, 0, eps=0.005) assert approx_equal(stat.kurtosis, 3, eps=0.005) bernoulli_seq = variate(bernoulli_distribution(0.1)) for b in itertools.islice(bernoulli_seq, 10): assert b in (True, False) bernoulli_sample = flex.bool(itertools.islice(bernoulli_seq, 10000)) assert approx_equal(bernoulli_sample.count(True) / len(bernoulli_sample), 0.1, eps=0.01) scitbx.random.set_random_seed(0) g = variate(gamma_distribution()) assert approx_equal(g(), 0.79587450456577546) assert approx_equal(g(2), (0.89856038848394115, 1.2559307580473893)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 1, eps=0.005) assert approx_equal(stat.skew, 2, eps=0.005) assert approx_equal(stat.biased_variance, 1, eps=0.005) scitbx.random.set_random_seed(0) g = variate(gamma_distribution(alpha=2, beta=3)) assert approx_equal(g(), 16.670850592722729) assert approx_equal(g(2), (10.03662877519449, 3.9357158398972873)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 6, eps=0.005) assert approx_equal(stat.skew, 2 / math.sqrt(2), eps=0.05) assert approx_equal(stat.biased_variance, 18, eps=0.05) mean = 10.0 pv = variate(poisson_distribution(mean)) draws = pv(1000000).as_double() m = flex.mean(draws) v = flex.mean(draws * draws) - m * m assert approx_equal(m, mean, eps=0.05) assert approx_equal(v, mean, eps=0.05)
def centroidify(width, shift, count): g = variate(normal_distribution(mean=shift, sigma=width)) values = flex.double([next(g) for c in range(count)]) hist = flex.histogram(data=values, n_slots=20, data_min=-10, data_max=10) true_mean = flex.sum(values) / values.size() true_variance = sum([(v - true_mean)**2 for v in values]) / (values.size() - 1) total = 1.0 * flex.sum(hist.slots()) hist_mean = sum([c * v for c, v in zip(hist.slot_centers(), hist.slots()) ]) / total # equation 6 hist_var = sum([(v / total)**2 * (1.0 / 12.0) for v in hist.slots()]) # print input setings print("%8.5f %4.1f %4d" % (width**2 / count, shift, count), end=" ") # true variance / mean of distribution print("%6.3f %8.5f" % (true_mean, true_variance / values.size()), end=" ") # putative values of same derived from histogram print("%6.3f %8.5f" % (hist_mean, hist_var))
except KeyError, e: continue from dials.algorithms import shoebox shoebox.allocate(useful) from dials.util.command_line import ProgressBar p = ProgressBar(title = 'Generating shoeboxes') # now for each reflection perform the simulation for j, refl in enumerate(useful): p.update(j * 100.0 / len(useful)) d = d_matrices[j] from scitbx.random import variate, normal_distribution g = variate(normal_distribution(mean = 0, sigma = node_size)) counts = counts_database[refl.miller_index] dhs = g(counts) dks = g(counts) dls = g(counts) self.map_to_image_space(refl, d, dhs, dks, dls) p.finished('Generated %d shoeboxes' % len(useful)) # now for each reflection add background from dials.algorithms.simulation.generate_test_reflections import \ random_background_plane p = ProgressBar(title = 'Generating background') for j, refl in enumerate(useful): p.update(j * 100.0 / len(useful))
def exercise_distributions(): from scitbx.random import normal_distribution n = normal_distribution() assert (n.mean, n.sigma) == (0, 1) n = normal_distribution(mean=5, sigma=10) assert (n.mean, n.sigma) == (5, 10)
def main(self): # FIXME import simulation code import six.moves.cPickle as pickle import math from dials.util.command_line import Importer from dials.algorithms.integration import ReflectionPredictor from libtbx.utils import Sorry # Parse the command line params, options, args = self.parser.parse_args() importer = Importer(args) if len(importer.imagesets) == 0 and len(importer.crystals) == 0: self.config().print_help() return if len(importer.imagesets) != 1: raise Sorry('need 1 sweep: %d given' % len(importer.imagesets)) if len(importer.crystals) != 1: raise Sorry('need 1 crystal: %d given' % len(importer.crystals)) sweep = importer.imagesets[0] crystal = importer.crystals[0] # generate predictions for possible reflections => generate a # reflection list predict = ReflectionPredictor() predicted = predict(sweep, crystal) # sort with James's reflection table: should this not go somewhere central? from dials.scratch.jmp.container.reflection_table import ReflectionTable # calculate shoebox sizes: take parameters from params & transform # from reciprocal space to image space to decide how big a shoe box to use table = ReflectionTable() table['miller_index'] = predicted.miller_index() indexer = table.index_map('miller_index') candidates = [] unique = sorted(indexer) for h, k, l in unique: try: for _h in h - 1, h + 1: if not indexer[(_h, k, l)]: raise ValueError('missing') for _k in k - 1, k + 1: if not indexer[(h, _k, l)]: raise ValueError('missing') for _l in l - 1, l + 1: if not indexer[(h, k, _l)]: raise ValueError('missing') candidates.append((h, k, l)) except ValueError: continue from dials.algorithms.simulation.utils import build_prediction_matrix from dials.algorithms.simulation.generate_test_reflections import \ master_phil from libtbx.phil import command_line cmd = command_line.argument_interpreter(master_params=master_phil) working_phil = cmd.process_and_fetch(args=args[2:]) params = working_phil.extract() node_size = params.rs_node_size window_size = params.rs_window_size reference = params.integrated_data_file scale = params.integrated_data_file_scale if reference: counts_database = {} from iotbx import mtz m = mtz.object(reference) mi = m.extract_miller_indices() i = m.extract_reals('IMEAN').data s = m.space_group().build_derived_point_group() for j in range(len(mi)): for op in s.all_ops(): hkl = tuple(map(int, op * mi[j])) counts = max(0, int(math.floor(i[j] * scale))) counts_database[hkl] = counts counts_database[(-hkl[0], -hkl[1], -hkl[2])] = counts else: def constant_factory(value): import itertools return itertools.repeat(value).next from collections import defaultdict counts_database = defaultdict(constant_factory(params.counts)) from dials.model.data import ReflectionList useful = ReflectionList() d_matrices = [] for h, k, l in candidates: hkl = predicted[indexer[(h, k, l)][0]] _x = hkl.image_coord_px[0] _y = hkl.image_coord_px[1] _z = hkl.frame_number # build prediction matrix mhkl = predicted[indexer[(h - 1, k, l)][0]] phkl = predicted[indexer[(h + 1, k, l)][0]] hmkl = predicted[indexer[(h, k - 1, l)][0]] hpkl = predicted[indexer[(h, k + 1, l)][0]] hkml = predicted[indexer[(h, k, l - 1)][0]] hkpl = predicted[indexer[(h, k, l + 1)][0]] d = build_prediction_matrix(hkl, mhkl, phkl, hmkl, hpkl, hkml, hkpl) d_matrices.append(d) # construct the shoebox parameters: outline the ellipsoid x, y, z = [], [], [] for dh in (1, 0, 0), (0, 1, 0), (0, 0, 1): dxyz = -1 * window_size * d * dh x.append(dxyz[0] + _x) y.append(dxyz[1] + _y) z.append(dxyz[2] + _z) dxyz = window_size * d * dh x.append(dxyz[0] + _x) y.append(dxyz[1] + _y) z.append(dxyz[2] + _z) hkl.bounding_box = (int(math.floor(min(x))), int(math.floor(max(x)) + 1), int(math.floor(min(y))), int(math.floor(max(y)) + 1), int(math.floor(min(z))), int(math.floor(max(z)) + 1)) try: counts = counts_database[hkl.miller_index] useful.append(hkl) except KeyError: continue from dials.algorithms import shoebox shoebox.allocate(useful) from dials.util.command_line import ProgressBar p = ProgressBar(title='Generating shoeboxes') # now for each reflection perform the simulation for j, refl in enumerate(useful): p.update(j * 100.0 / len(useful)) d = d_matrices[j] from scitbx.random import variate, normal_distribution g = variate(normal_distribution(mean=0, sigma=node_size)) counts = counts_database[refl.miller_index] dhs = g(counts) dks = g(counts) dls = g(counts) self.map_to_image_space(refl, d, dhs, dks, dls) p.finished('Generated %d shoeboxes' % len(useful)) # now for each reflection add background from dials.algorithms.simulation.generate_test_reflections import \ random_background_plane p = ProgressBar(title='Generating background') for j, refl in enumerate(useful): p.update(j * 100.0 / len(useful)) if params.background: random_background_plane(refl.shoebox, params.background, 0.0, 0.0, 0.0) else: random_background_plane(refl.shoebox, params.background_a, params.background_b, params.background_c, params.background_d) p.finished('Generated %d backgrounds' % len(useful)) if params.output.all: with open(params.output.all, 'wb') as fh: pickle.dump(useful, fh, pickle.HIGHEST_PROTOCOL)