2017 dials.stills process

From cctbx_xfel
Jump to: navigation, search

Here we give the commands for processing the example data from DLS (Credit: Danny Axford). These data are Pilatus data, 11000 images, but these commands are generally applicable for processing stills using dials.stills_process. For the sake of this example, we will be in a folder named $work, and the images are in a folder named $data

Remember, all these commands have help strings, use -h, or to see details for the parameters, use -c. If you want to see all the parameters, use -e 10. And if you want to see the descriptions of each parameters, use -a 2. Example:

 dials.import -c -a 2 -e 10 | less

Initial discovery

First, use the dials.image_viewer on 10 images to get a sense of the data

 dials.image_viewer $data/*.cbf.bz2

Next, verify beam center and diffraction extent using an average image.

 mkdir $work/averages
 cd $work/averages
 dxtbx.image_average -v -a avg.pickle -m max.pickle -s stddev.pickle -n 64 $data/*.cbf.bz2

Here, we specify output for the average, maximum and standard deviation images using -a, -m and -s. -v means verbose output, and we specify 64 cores for averaging using -n. The output images are in image pickle format, and can be displayed using the image viewer: dials.image_viewer *.pickle

Use the Actions->Show ring tool with the maximum projection image to verify the rings are circular around the beam center.

Also, in the average image, note the defects around the beam center and the 8 silicon reflections around the edges of the detector. These artifacts will need to be masked out. Hold down shift and left click to drag boxes onto the image. Click save mask to generate a mask.pickle file we will use during processing. If you want to verify the mask is good, restart the image viewer using mask=mask.pickle, then click the show mask checkbox in the settings panel. The mask will display in red.

Trial processing

We will use the following phil file to process the data. Note the use of $work to specify mask paths. Also note, this part I am currently editing, removing values here that are just defaults.

indexing {
  known_symmetry {
    space_group = P6
    unit_cell = 91.7 91.7 46 90 90 120
  refinement_protocol.n_macro_cycles = 1
  stills.method_list=fft1d real_space_grid_search
integration {
  background {
    simple {
      outlier {
        algorithm = null
profile {
  gaussian_rs {
    min_spots.overall = 0

refinement {
  parameterisation {
    auto_reduction {
  reflections {

With this phil file we can process the data:

 cd $work; mkdir -p results/000; cd results/000
 dials.stills_process $data/*.cbf.bz2 $work/process.phil mp.nproc=64

Here, we put the processed results in a results folder, in a subfolder labeled 000 that represents trial 0.

When complete, we can look at integration results:

 dials.image_viewer idx-zurich0038_00036.cbf_refined_experiments.json idx-zurich0038_00036.cbf_integrated.pickle

We can look at a graph showing hitfinding and indexing rates:

 cctbx.xfel.plot_run_stats_from_experiments . hit_cutoff=40

The hit_cutoff is adjusted up a bit to be above the background (see the top plot, how the images that are essentially blank and didn't index (gray dots) still show up with ~30 or so reflections).

We can also look at unit cell histograms to see if the results are isomorphous:

 cctbx.xfel.plot_uc_cloud_from_experiments *_refined_experiments.json

Here we see a slight asymmetry in the c axis which indicates the detector position might not be accurate.

Ensemble refinement of detector position

To get a more isomorphous distribution we will refine the detector model using many crystal models as input.

 cd $work; mkdir metrology; cd metrology
 dials.combine_experiments $work/results/000/*indexed.pickle $work/results/000/*_refined_experiments.json n_subset=2000 reference_from_experiment.detector=0

Here, since we fixed the detector position in place during indexing, we use reference_from_experiment.detector=0 so that each experiment in the output combined.json file points to the same detector. If you allow the detector to refine separately for each image, you will need to average the detector positions when running dials.combine_experiments, using the parameter reference_from_experiment.average_detector=True instead.

Now, we refine the detector and all 2000 crystals at once:

 dials.refine combined_experiments.json combined_reflections.pickle refine.phil

The phil file is here:

refinement {
  parameterisation {
    auto_reduction {
      min_nref_per_parameter = 3
      action = fail fix *remove
    beam {
      fix = *all in_spindle_plane out_spindle_plane wavelength
    detector {
      fix_list = Tau1
  refinery {
    engine = SimpleLBFGS LBFGScurvs GaussNewton LevMar *SparseLevMar
  reflections {
    outlier {
      algorithm = null auto mcd tukey *sauter_poon
      separate_experiments = False
      separate_panels = True

To compare the old to the new metrology:

 dxtbx.plot_detector_models combined_experiments.json refined_experiments.json

We can reprocess all the data using this updated geometry, adding this to the process.phil


Then create a new trial and reprocess the data.

 cd $work/results; mkdir 001; cd 001
 dials.stills_process $data/*.cbf.bz2 $work/process.phil mp.nproc=64

The results should be more isomorphous:

 cctbx.xfel.plot_uc_cloud_from_experiments *_refined_experiments.json

From here, proceed to merging: