def background(imageset, indx, n_bins): from dials.array_family import flex from libtbx.phil import parse from scitbx import matrix import math detector = imageset.get_detector() beam = imageset.get_beam() assert(len(detector) == 1) detector = detector[0] trusted = detector.get_trusted_range() n = matrix.col(detector.get_normal()).normalize() b = matrix.col(beam.get_s0()).normalize() wavelength = beam.get_wavelength() if math.fabs(b.dot(n)) < 0.95: from libtbx.utils import Sorry raise Sorry('Detector not perpendicular to beam') data = imageset.get_raw_data(indx) assert(len(data) == 1) data = data[0] negative = (data < 0) hot = (data > int(round(trusted[1]))) bad = negative | hot from dials.algorithms.spot_finding.factory import SpotFinderFactory from dials.algorithms.spot_finding.factory import phil_scope data = data.as_double() from dxtbx import datablock spot_params = phil_scope.fetch(source=parse("")).extract() threshold_function = SpotFinderFactory.configure_threshold( spot_params, datablock.DataBlock([imageset])) peak_pixels = threshold_function.compute_threshold(data, ~bad) signal = data.select(peak_pixels.iselection()) background = data.select((~bad & ~peak_pixels).iselection()) # print some summary information print 'Mean background: %.3f' % (flex.sum(background) / background.size()) print 'Max/total signal pixels: %.0f / %.0f' % (flex.max(signal), flex.sum(signal)) print 'Peak/background/hot pixels: %d / %d / %d' % (peak_pixels.count(True), background.size(), hot.count(True)) # compute histogram of two-theta values, then same weighted # by pixel values, finally divide latter by former to get # the radial profile out, need to set the number of bins # sensibly; flex.histogram does not allow weights so use # numpy.histogram to get the same effect... inspired by # method in PyFAI data = data.as_1d() two_theta_array = detector.get_two_theta_array(beam.get_s0()) two_theta_array.set_selected((bad | peak_pixels).iselection(), 0.0) data.set_selected((bad | peak_pixels).iselection(), 0.0) # new fangled flex.weighted_histogram :-) h0 = flex.weighted_histogram(two_theta_array, n_slots=n_bins) h1 = flex.weighted_histogram(two_theta_array, data, n_slots=n_bins) h2 = flex.weighted_histogram(two_theta_array, data * data, n_slots=n_bins) d0 = h0.slots() d1 = h1.slots() d2 = h2.slots() I = d1 / d0 I2 = d2 / d0 sig = flex.sqrt(I2 - flex.pow2(I)) tt = h0.slot_centers() d_spacings = wavelength / (2.0 * flex.sin(0.5 * tt)) return d_spacings, I, sig
def background(imageset, indx, n_bins, mask_params=None): from dials.array_family import flex from libtbx.phil import parse from scitbx import matrix if mask_params is None: # Default mask params for trusted range mask_params = phil_scope.fetch(parse("")).extract().masking from dials.util.masking import MaskGenerator mask_generator = MaskGenerator(mask_params) mask = mask_generator.generate(imageset) detector = imageset.get_detector() beam = imageset.get_beam() # Only working with single panel detector for now assert len(detector) == 1 panel = detector[0] mask = mask[0] n = matrix.col(panel.get_normal()).normalize() b = matrix.col(beam.get_s0()).normalize() wavelength = beam.get_wavelength() if math.fabs(b.dot(n)) < 0.95: raise Sorry("Detector not perpendicular to beam") data = imageset.get_raw_data(indx) assert len(data) == 1 data = data[0] data = data.as_double() spot_params = spot_phil.fetch(source=parse("")).extract() threshold_function = SpotFinderFactory.configure_threshold(spot_params) peak_pixels = threshold_function.compute_threshold(data, mask) signal = data.select(peak_pixels.iselection()) background_pixels = mask & ~peak_pixels background = data.select(background_pixels.iselection()) # print some summary information print("Mean background: %.3f" % (flex.sum(background) / background.size())) if len(signal) > 0: print("Max/total signal pixels: %.0f / %.0f" % (flex.max(signal), flex.sum(signal))) else: print("No signal pixels on this image") print("Peak/background/masked pixels: %d / %d / %d" % (peak_pixels.count(True), background.size(), mask.count(False))) # compute histogram of two-theta values, then same weighted # by pixel values, finally divide latter by former to get # the radial profile out, need to set the number of bins # sensibly; inspired by method in PyFAI two_theta_array = panel.get_two_theta_array(beam.get_s0()) two_theta_array = two_theta_array.as_1d().select( background_pixels.iselection()) # Use flex.weighted_histogram h0 = flex.weighted_histogram(two_theta_array, n_slots=n_bins) h1 = flex.weighted_histogram(two_theta_array, background, n_slots=n_bins) h2 = flex.weighted_histogram(two_theta_array, background * background, n_slots=n_bins) d0 = h0.slots() d1 = h1.slots() d2 = h2.slots() I = d1 / d0 I2 = d2 / d0 sig = flex.sqrt(I2 - flex.pow2(I)) tt = h0.slot_centers() d_spacings = wavelength / (2.0 * flex.sin(0.5 * tt)) return d_spacings, I, sig
def background(imageset, indx, n_bins): from dials.array_family import flex from libtbx.phil import parse from scitbx import matrix import math detector = imageset.get_detector() beam = imageset.get_beam() assert(len(detector) == 1) detector = detector[0] trusted = detector.get_trusted_range() n = matrix.col(detector.get_normal()).normalize() b = matrix.col(beam.get_s0()).normalize() wavelength = beam.get_wavelength() if math.fabs(b.dot(n)) < 0.95: from libtbx.utils import Sorry raise Sorry('Detector not perpendicular to beam') data = imageset.get_raw_data(indx) assert(len(data) == 1) data = data[0] negative = (data < 0) hot = (data > int(round(trusted[1]))) bad = negative | hot from dials.algorithms.spot_finding.factory import SpotFinderFactory from dials.algorithms.spot_finding.factory import phil_scope data = data.as_double() from dxtbx import datablock spot_params = phil_scope.fetch(source=parse("")).extract() threshold_function = SpotFinderFactory.configure_threshold( spot_params, datablock.DataBlock([imageset])) peak_pixels = threshold_function.compute_threshold(data, ~bad) signal = data.select(peak_pixels.iselection()) background = data.select((~bad & ~peak_pixels).iselection()) # print some summary information print('Mean background: %.3f' % (flex.sum(background) / background.size())) print('Max/total signal pixels: %.0f / %.0f' % (flex.max(signal), flex.sum(signal))) print('Peak/background/hot pixels: %d / %d / %d' % (peak_pixels.count(True), background.size(), hot.count(True))) # compute histogram of two-theta values, then same weighted # by pixel values, finally divide latter by former to get # the radial profile out, need to set the number of bins # sensibly; flex.histogram does not allow weights so use # numpy.histogram to get the same effect... inspired by # method in PyFAI data = data.as_1d() two_theta_array = detector.get_two_theta_array(beam.get_s0()) two_theta_array.set_selected((bad | peak_pixels).iselection(), 0.0) data.set_selected((bad | peak_pixels).iselection(), 0.0) # new fangled flex.weighted_histogram :-) h0 = flex.weighted_histogram(two_theta_array, n_slots=n_bins) h1 = flex.weighted_histogram(two_theta_array, data, n_slots=n_bins) h2 = flex.weighted_histogram(two_theta_array, data * data, n_slots=n_bins) d0 = h0.slots() d1 = h1.slots() d2 = h2.slots() I = d1 / d0 I2 = d2 / d0 sig = flex.sqrt(I2 - flex.pow2(I)) tt = h0.slot_centers() d_spacings = wavelength / (2.0 * flex.sin(0.5 * tt)) return d_spacings, I, sig