
=====================================================
 rsv_mapper.py
=====================================================
:Info: 
:Author: Jon Wright <wright@esrf.fr>
:Date: 26 June 2009
:Revision: $Revision:  $


Introduction
============
We wish to convert a series of diffraction images into
a 3D reciprocal space volume. The rsv_mapper.py script
which is in ImageD11 accomplishes this task.

The program reads the geometry and computes k vectors for
each pixel in the image and stores these in a cache. 
Then for each image, a rotation matrix is constructed representing
the rotation of the crystal axes compared to the laboratory axes.
This matrix includes the current rotation of the crystal due to 
the diffractometer and also the orientation matrix. 
By applying the matrix, we can get to hkl values, or reciprocal
space co-ordinates, to use directly as array indices.

The pixel values are accumulated in a 3D array and a second array
counts the number of contributing pixels. This volume is written 
out in hdf format. 

Running the program
===================

In common with many other scripts in ImageD11 you type::
   rsv_mapper.py --help 

 Usage: rsv_mapper.py [options]
 
 Options:
  -h, --help            show this help message and exit

The following options are all used to describe a series
of images corresponding to a rotation experiment. They are the same
for peaksearch.py::

  -5 HDF5, --hdf5=HDF5  hdf file containing input image series

This reads the series of images from an hdf file, in the event that
you have them in that format (it is currently unlikely for raw data)::

  -n STEM, --stem=STEM  stem name for input image series
  -f FIRST, --first=FIRST
                        first number for input image series
  -l LAST, --last=LAST  last number for input image series
  --ndigits=NDIGITS     Number of digits in file numbering [4]
  -P PADDING, --padding=PADDING
                        Is the image number to padded Y|N, e.g. should 1 be
                        0001 or just 1 in image name, default=Y
  -F FORMAT, --format=FORMAT
                        format [.edf] for input image series
  -O FLOOD, --flood=FLOOD
                        Flood
  -d DARK, --dark=DARK  Dark image
  -s SPLINE, --splinefile=SPLINE
                        Name of fit2d spline file for spatial dist
  -S OMEGASTEP, --step=OMEGASTEP
                        omega step size
  -T OMEGA, --start=OMEGA
                        start omega

Some particular points to note: the dark and flood and spline 
images are quite important at this stage for avoiding artifacts. 
If your images are not already corrected it is important to 
use the right ones.::

  -p PARS, --pars=PARS  ImageD11 parameter file for experiment

See the transform module documentation. You need good instrument 
parameters to map the pixels to correct positions in reciprocal space.
The program *does not* recompute k vectors based on the crystal
translation, so it is better to set this to zero and align your
crystal as well as you can.::


  -u UBIFILE, --ubifile=UBIFILE
                        Name of ubi file (first matrix is used)

An orientation matrix in ImageD11's format. This means the matrix
which is used to make scattering vectors onto crystal axes (the
axes you will use in reciprocal space)::
   hkl = (UBI).(g)

  -x NPIXELS, --npixels=NPIXELS
                        Number of pixels in reciprocal space map per integer
                        hkl [16]

  -i IMAGES, --images=IMAGES
                        Number of images to process [all]

This option removes a border around the images. Useful in the case that
the detector image does not go to the edge::
  -b BORDER, --border=BORDER
                        Border around images to allocate space, px [10]
FIXME: radius and mask

  -o OUTPUT, --output=OUTPUT
                        Name of hdf5 output file

How to get started
==================

You need to calibrate your experimental setup in terms of beam center
and sample to detector distance. Also determine the detector orientation.
This is outside the scope of this document, see the transform module.

Now you can choose

Things to do
============

+ Parallelise the code 
+ Allow the user to select a region of interest
+ Radius and mask active pixel selections?
+ Process only specific planes
+ Rebin the image before processing (an optimisation)
+ Split pixels in 3D (at least add in a couple of 
intermediate angular steps)
+ Apply a polarisation correction
+ Write directly a format which can be read by chimera




