laue_dials.integrate

Introduction

This script generates integrated MTZ files from refined data with predictions.

The program takes a refined geometry experiment file along with a predicted reflection table, and uses those to integrate intensities in the data set. The output is an MTZ file containing integrated intensities suitable for merging and scaling.

The algorithm applied here is a variable elliptical profile fitting algorithm inspired by the VariableElliptical mode in Precognition. Each predicted centroid is given a circular window of pixels, and the counts in that window are modeled as an elliptical two-dimensional Gaussian profile on a flat background, assuming Poisson noise.

Profile shapes are estimated jointly with the background and the intensities, over at most maxiter iterations. The shape for every reflection is pooled from the pixels of its knn nearest strong spots, so weak reflections inherit a well-determined profile from their neighbors rather than fitting noise. Intensities and their uncertainties are then obtained by profile fitting, weighting each pixel by its expected contribution, rather than by summing counts inside a mask.

Unless integration_radius is set, the window radius is estimated from the spacing of the predicted centroids. That same radius is used to dilate the detector mask, so predictions whose window would overlap a bad pixel are discarded before integration.

Examples:

laue.integrate [options] poly_refined.expt predicted.refl

Basic parameters

output {
  filename = 'integrated.mtz'
  reflections = None
  log = 'laue.integrate.log'
}
nproc = 1
isigi_cutoff = 3.0
integration_radius = None
knn = 5
maxiter = 2

Full parameter definitions

output {
  filename = 'integrated.mtz'
    .help = "The output MTZ filename."
    .type = str
  reflections = None
    .help = "The output reflection table filename. None will output no"
            "reflection table."
    .type = str
  log = 'laue.integrate.log'
    .help = "The log filename."
    .type = str
}
nproc = 1
  .help = "Number of parallel integrations to do"
  .type = int(allow_none=True)
isigi_cutoff = 3.0
  .help = "I/SIGI threshold to use for marking strong spots."
  .type = float(allow_none=True)
integration_radius = None
  .help = "Radius in pixels used both for the integration window around each"
          "predicted centroid and for dilating the detector mask when"
          "discarding predictions that fall in masked regions. Defaults to a"
          "dynamically-computed radius (0.5 * the 20th percentile of"
          "nearest-neighbor centroid distances)."
  .type = int(value_min=0, allow_none=True)
knn = 5
  .help = "Number of nearest strong spots whose pixels are pooled to estimate"
          "the elliptical profile of each reflection. Larger values give"
          "steadier profiles but blur genuine variation in spot shape across"
          "the detector. Reduced automatically if an image has fewer strong"
          "spots than this."
  .type = int(value_min=1, allow_none=True)
maxiter = 2
  .help = "Maximum number of profile-fitting iterations. Each iteration"
          "re-estimates the background, profiles, and intensities, then"
          "re-marks strong spots. Fitting stops early if the Poisson"
          "log-likelihood stops improving."
  .type = int(value_min=1, allow_none=True)